Imported Upstream version 0.160 upstream/0.160
authorChanho Park <chanho61.park@samsung.com>
Wed, 26 Nov 2014 14:32:42 +0000 (23:32 +0900)
committerChanho Park <chanho61.park@samsung.com>
Wed, 26 Nov 2014 14:32:42 +0000 (23:32 +0900)
470 files changed:
CONTRIBUTING
ChangeLog
INSTALL
Makefile.am
Makefile.in
NEWS
README
aclocal.m4
backends/ChangeLog
backends/Makefile.am
backends/Makefile.in
backends/aarch64_cfi.c [new file with mode: 0644]
backends/aarch64_corenote.c [new file with mode: 0644]
backends/aarch64_init.c [new file with mode: 0644]
backends/aarch64_initreg.c [new file with mode: 0644]
backends/aarch64_regs.c [new file with mode: 0644]
backends/aarch64_reloc.def [new file with mode: 0644]
backends/aarch64_retval.c [new file with mode: 0644]
backends/aarch64_symbol.c [new file with mode: 0644]
backends/alpha_retval.c
backends/arm_cfi.c [new file with mode: 0644]
backends/arm_corenote.c
backends/arm_init.c
backends/arm_initreg.c [new file with mode: 0644]
backends/arm_regs.c
backends/arm_reloc.def
backends/arm_retval.c
backends/arm_symbol.c
backends/i386_init.c
backends/i386_initreg.c [new file with mode: 0644]
backends/i386_retval.c
backends/ia64_init.c
backends/ia64_retval.c
backends/ia64_symbol.c
backends/libebl_CPU.h
backends/linux-core-note.c
backends/ppc64_init.c
backends/ppc64_reloc.def
backends/ppc64_resolve_sym.c [new file with mode: 0644]
backends/ppc64_retval.c
backends/ppc64_symbol.c
backends/ppc_cfi.c [new file with mode: 0644]
backends/ppc_corenote.c
backends/ppc_init.c
backends/ppc_initreg.c [new file with mode: 0644]
backends/ppc_regs.c
backends/ppc_retval.c
backends/s390_cfi.c [new file with mode: 0644]
backends/s390_corenote.c [new file with mode: 0644]
backends/s390_init.c
backends/s390_initreg.c [new file with mode: 0644]
backends/s390_retval.c
backends/s390_unwind.c [new file with mode: 0644]
backends/s390x_corenote.c [new file with mode: 0644]
backends/sh_regs.c
backends/sh_retval.c
backends/sparc_retval.c
backends/tilegx_retval.c
backends/x86_64_init.c
backends/x86_64_initreg.c [new file with mode: 0644]
backends/x86_64_retval.c
config.h.in
config/ChangeLog
config/Makefile.in
config/ar-lib [new file with mode: 0755]
config/config.guess
config/config.sub
config/depcomp
config/elfutils.spec.in
config/eu.am
config/install-sh
config/missing
config/test-driver [new file with mode: 0755]
config/ylwrap
configure
configure.ac
elfutils.spec
lib/ChangeLog
lib/Makefile.am
lib/Makefile.in
lib/crc32_file.c
lib/dynamicsizehash.c
lib/eu-config.h
lib/system.h
libasm/ChangeLog
libasm/Makefile.am
libasm/Makefile.in
libcpu/ChangeLog
libcpu/Makefile.am
libcpu/Makefile.in
libcpu/i386_lex.c
libcpu/i386_parse.c
libcpu/i386_parse.h
libdw/ChangeLog
libdw/Makefile.am
libdw/Makefile.in
libdw/cfi.c
libdw/cfi.h
libdw/dwarf.h
libdw/dwarf_begin_elf.c
libdw/dwarf_cu_die.c [new file with mode: 0644]
libdw/dwarf_cu_getdwarf.c [moved from libdw/memory-access.c with 68% similarity]
libdw/dwarf_decl_file.c
libdw/dwarf_decl_line.c
libdw/dwarf_end.c
libdw/dwarf_formref_die.c
libdw/dwarf_formstring.c
libdw/dwarf_getalt.c [new file with mode: 0644]
libdw/dwarf_getaranges.c
libdw/dwarf_getcfi_elf.c
libdw/dwarf_getfuncs.c
libdw/dwarf_getlocation.c
libdw/dwarf_getlocation_attr.c [new file with mode: 0644]
libdw/dwarf_getlocation_die.c [new file with mode: 0644]
libdw/dwarf_getlocation_implicit_pointer.c
libdw/dwarf_getsrcfiles.c
libdw/dwarf_getsrclines.c
libdw/dwarf_setalt.c [new file with mode: 0644]
libdw/fde.c
libdw/known-dwarf.h
libdw/libdw.h
libdw/libdw.map
libdw/libdwP.h
libdw/libdw_findcu.c
libdw/libdw_form.c
libdw/libdw_visit_scopes.c
libdw/memory-access.h
libdwelf/ChangeLog [new file with mode: 0644]
libdwelf/Makefile.am [new file with mode: 0644]
libdwelf/Makefile.in [new file with mode: 0644]
libdwelf/dwelf_dwarf_gnu_debugaltlink.c [new file with mode: 0644]
libdwelf/dwelf_elf_gnu_build_id.c [new file with mode: 0644]
libdwelf/dwelf_elf_gnu_debuglink.c [new file with mode: 0644]
libdwelf/libdwelf.h [new file with mode: 0644]
libdwelf/libdwelfP.h [new file with mode: 0644]
libdwfl/ChangeLog
libdwfl/Makefile.am
libdwfl/Makefile.in
libdwfl/argp-std.c
libdwfl/core-file.c
libdwfl/cu.c
libdwfl/derelocate.c
libdwfl/dwfl_build_id_find_debuginfo.c
libdwfl/dwfl_build_id_find_elf.c
libdwfl/dwfl_end.c
libdwfl/dwfl_frame.c [new file with mode: 0644]
libdwfl/dwfl_frame_pc.c [new file with mode: 0644]
libdwfl/dwfl_frame_regs.c [new file with mode: 0644]
libdwfl/dwfl_getsrclines.c
libdwfl/dwfl_module.c
libdwfl/dwfl_module_addrname.c
libdwfl/dwfl_module_addrsym.c
libdwfl/dwfl_module_build_id.c
libdwfl/dwfl_module_getdwarf.c
libdwfl/dwfl_module_getsym.c
libdwfl/dwfl_module_info.c
libdwfl/dwfl_report_elf.c
libdwfl/dwfl_segment_report_module.c
libdwfl/elf-from-memory.c
libdwfl/find-debuginfo.c
libdwfl/frame_unwind.c [new file with mode: 0644]
libdwfl/libdwfl.h
libdwfl/libdwflP.h
libdwfl/link_map.c
libdwfl/linux-core-attach.c [new file with mode: 0644]
libdwfl/linux-kernel-modules.c
libdwfl/linux-pid-attach.c [new file with mode: 0644]
libdwfl/linux-proc-maps.c
libdwfl/offline.c
libdwfl/open.c
libdwfl/relocate.c
libdwfl/segment.c
libebl/ChangeLog
libebl/Makefile.am
libebl/Makefile.in
libebl/ebl-hooks.h
libebl/eblcheckreloctargettype.c [new file with mode: 0644]
libebl/eblcorenotetypename.c
libebl/ebldwarftoregno.c [new file with mode: 0644]
libebl/eblinitreg.c [new file with mode: 0644]
libebl/eblnormalizepc.c [new file with mode: 0644]
libebl/eblopenbackend.c
libebl/eblresolvesym.c [new file with mode: 0644]
libebl/eblsectionstripp.c
libebl/eblunwind.c [new file with mode: 0644]
libebl/libebl.h
libebl/libeblP.h
libelf/ChangeLog
libelf/Makefile.am
libelf/Makefile.in
libelf/elf.h
libelf/elf32_getphdr.c
libelf/elf32_getshdr.c
libelf/elf32_newphdr.c
libelf/elf32_updatefile.c
libelf/elf_begin.c
libelf/elf_getarsym.c
libelf/elf_getshdrstrndx.c
libelf/elf_newscn.c
libelf/elf_update.c
libelf/gelf.h
libelf/gelf_getauxv.c
libelf/gelf_getdyn.c
libelf/gelf_getlib.c
libelf/gelf_getmove.c
libelf/gelf_getrel.c
libelf/gelf_getrela.c
libelf/gelf_getsym.c
libelf/gelf_getsyminfo.c
libelf/gelf_getsymshndx.c
libelf/gelf_getversym.c
libelf/gelf_update_dyn.c
libelf/gelf_update_lib.c
libelf/gelf_update_move.c
libelf/gelf_update_rel.c
libelf/gelf_update_rela.c
libelf/gelf_update_sym.c
libelf/gelf_update_syminfo.c
libelf/gelf_update_symshndx.c
libelf/gelf_update_versym.c
libelf/libelfP.h
m4/ChangeLog
m4/Makefile.in
m4/biarch.m4 [new file with mode: 0644]
m4/gettext.m4
m4/iconv.m4
m4/po.m4
po/ChangeLog
po/Makefile.in.in
po/de.gmo
po/de.po
po/elfutils.pot
po/en@boldquot.gmo
po/en@boldquot.po
po/en@quot.gmo
po/en@quot.po
po/es.gmo
po/es.po
po/ja.gmo
po/ja.po
po/pl.gmo
po/pl.po
po/uk.gmo
po/uk.po
src/ChangeLog
src/Makefile.am
src/Makefile.in
src/addr2line.c
src/ar.c
src/arlib.c
src/elflint.c
src/findtextrel.c
src/ldlex.c
src/ldscript.c
src/ldscript.h
src/nm.c
src/readelf.c
src/size.c
src/stack.c [new file with mode: 0644]
src/strings.c
src/strip.c
src/unstrip.c
tests/ChangeLog
tests/Makefile.am
tests/Makefile.in
tests/addrcfi.c
tests/allfcts.c
tests/backtrace-child.c [new file with mode: 0644]
tests/backtrace-data.c [new file with mode: 0644]
tests/backtrace-dwarf.c [new file with mode: 0644]
tests/backtrace-subr.sh [new file with mode: 0644]
tests/backtrace.aarch64.core.bz2 [new file with mode: 0644]
tests/backtrace.aarch64.exec.bz2 [new file with mode: 0755]
tests/backtrace.c [new file with mode: 0644]
tests/backtrace.i386.core.bz2 [new file with mode: 0644]
tests/backtrace.i386.exec.bz2 [new file with mode: 0644]
tests/backtrace.ppc.core.bz2 [new file with mode: 0644]
tests/backtrace.ppc.exec.bz2 [new file with mode: 0644]
tests/backtrace.s390.core.bz2 [new file with mode: 0644]
tests/backtrace.s390.exec.bz2 [new file with mode: 0644]
tests/backtrace.s390x.core.bz2 [new file with mode: 0644]
tests/backtrace.s390x.exec.bz2 [new file with mode: 0644]
tests/backtrace.x86_64.core.bz2 [new file with mode: 0644]
tests/backtrace.x86_64.exec.bz2 [new file with mode: 0644]
tests/buildid.c [new file with mode: 0644]
tests/cleanup-13.c [new file with mode: 0644]
tests/debugaltlink.c [new file with mode: 0644]
tests/debuglink.c [new file with mode: 0644]
tests/dwfl-report-elf-align.c [new file with mode: 0644]
tests/dwfllines.c [new file with mode: 0644]
tests/dwflsyms.c [new file with mode: 0644]
tests/funcretval_test.c [new file with mode: 0644]
tests/funcretval_test_aarch64.bz2 [new file with mode: 0755]
tests/hello_aarch64.ko.bz2 [new file with mode: 0644]
tests/run-addr2line-i-test.sh [new file with mode: 0755]
tests/run-addr2line-test.sh [new file with mode: 0755]
tests/run-addrcfi.sh [new file with mode: 0755]
tests/run-addrname-test.sh
tests/run-addrscopes.sh
tests/run-alldts.sh
tests/run-allfcts-multi.sh [new file with mode: 0755]
tests/run-allfcts.sh
tests/run-allregs.sh
tests/run-arextract.sh
tests/run-arsymtest.sh
tests/run-backtrace-core-aarch64.sh [new file with mode: 0755]
tests/run-backtrace-core-i386.sh [new file with mode: 0755]
tests/run-backtrace-core-ppc.sh [new file with mode: 0755]
tests/run-backtrace-core-s390.sh [new file with mode: 0755]
tests/run-backtrace-core-s390x.sh [new file with mode: 0755]
tests/run-backtrace-core-x86_64.sh [new file with mode: 0755]
tests/run-backtrace-data.sh [new file with mode: 0755]
tests/run-backtrace-demangle.sh [new file with mode: 0755]
tests/run-backtrace-dwarf.sh [new file with mode: 0755]
tests/run-backtrace-native-biarch.sh [new file with mode: 0755]
tests/run-backtrace-native-core-biarch.sh [new file with mode: 0755]
tests/run-backtrace-native-core.sh [new file with mode: 0755]
tests/run-backtrace-native.sh [new file with mode: 0755]
tests/run-bug1-test.sh
tests/run-buildid.sh [new file with mode: 0755]
tests/run-debugaltlink.sh [new file with mode: 0755]
tests/run-debuglink.sh [new file with mode: 0755]
tests/run-disasm-x86-64.sh
tests/run-disasm-x86.sh
tests/run-dwarf-getmacros.sh
tests/run-dwarf-getstring.sh
tests/run-dwfl-addr-sect.sh
tests/run-dwfl-bug-offline-rel.sh
tests/run-dwfl-report-elf-align.sh [new file with mode: 0755]
tests/run-dwfllines.sh [new file with mode: 0755]
tests/run-dwflsyms.sh [new file with mode: 0755]
tests/run-early-offscn.sh
tests/run-ecp-test.sh
tests/run-ecp-test2.sh
tests/run-elf_cntl_gelf_getshdr.sh
tests/run-elflint-self.sh
tests/run-elflint-test.sh
tests/run-find-prologues.sh
tests/run-funcretval.sh [new file with mode: 0755]
tests/run-funcscopes.sh
tests/run-get-aranges.sh
tests/run-get-files.sh
tests/run-get-lines.sh
tests/run-get-pubnames.sh
tests/run-line2addr.sh
tests/run-low_high_pc.sh
tests/run-macro-test.sh
tests/run-native-test.sh
tests/run-nm-self.sh
tests/run-prelink-addr-test.sh
tests/run-ranlib-test.sh
tests/run-ranlib-test2.sh
tests/run-readelf-aranges.sh [new file with mode: 0755]
tests/run-readelf-d.sh
tests/run-readelf-dwz-multi.sh
tests/run-readelf-gdb_index.sh
tests/run-readelf-line.sh [new file with mode: 0755]
tests/run-readelf-loc.sh [new file with mode: 0755]
tests/run-readelf-macro.sh
tests/run-readelf-mixed-corenote.sh [new file with mode: 0755]
tests/run-readelf-s.sh [new file with mode: 0755]
tests/run-readelf-self.sh
tests/run-readelf-test1.sh
tests/run-readelf-test2.sh
tests/run-readelf-test3.sh
tests/run-readelf-test4.sh
tests/run-readelf-twofiles.sh
tests/run-readelf-vmcoreinfo.sh [new file with mode: 0755]
tests/run-readelf-zdebug.sh [new file with mode: 0755]
tests/run-rerequest_tag.sh
tests/run-show-abbrev.sh
tests/run-show-die-info.sh
tests/run-stack-d-test.sh [new file with mode: 0755]
tests/run-stack-i-test.sh [new file with mode: 0755]
tests/run-strings-test.sh
tests/run-strip-groups.sh
tests/run-strip-reloc.sh
tests/run-strip-test.sh
tests/run-test-archive64.sh
tests/run-test-flag-nobits.sh
tests/run-typeiter.sh
tests/run-unstrip-M.sh [new file with mode: 0755]
tests/run-unstrip-n.sh
tests/run-unstrip-test.sh
tests/run-varlocs.sh [new file with mode: 0755]
tests/test-core-lib.so.bz2 [new file with mode: 0755]
tests/test-core.core.bz2 [new file with mode: 0644]
tests/test-core.exec.bz2 [new file with mode: 0755]
tests/test-offset-loop.alt.bz2 [new file with mode: 0644]
tests/test-offset-loop.bz2 [new file with mode: 0755]
tests/test-subr.sh
tests/test-wrapper.sh
tests/testfile-backtrace-demangle.bz2 [new file with mode: 0755]
tests/testfile-backtrace-demangle.cc [new file with mode: 0644]
tests/testfile-backtrace-demangle.core.bz2 [new file with mode: 0644]
tests/testfile-debug.bz2 [new file with mode: 0755]
tests/testfile-dwfl-report-elf-align-shlib.so.bz2 [new file with mode: 0755]
tests/testfile-dwzstr.bz2 [new file with mode: 0755]
tests/testfile-dwzstr.multi.bz2 [new file with mode: 0644]
tests/testfile-inlines.bz2 [new file with mode: 0755]
tests/testfile-zdebug.bz2 [new file with mode: 0755]
tests/testfile42_noshdrs.bz2 [new file with mode: 0644]
tests/testfile61.bz2 [new file with mode: 0644]
tests/testfile62.bz2 [new file with mode: 0644]
tests/testfile63.bz2 [new file with mode: 0644]
tests/testfile64.bz2 [new file with mode: 0644]
tests/testfile65.bz2 [new file with mode: 0644]
tests/testfile66.bz2 [new file with mode: 0755]
tests/testfile66.core.bz2 [new file with mode: 0644]
tests/testfile67.bz2 [new file with mode: 0644]
tests/testfile68.bz2 [new file with mode: 0644]
tests/testfile69.core.bz2 [new file with mode: 0644]
tests/testfile69.so.bz2 [new file with mode: 0755]
tests/testfile70.core.bz2 [new file with mode: 0644]
tests/testfile70.exec.bz2 [new file with mode: 0644]
tests/testfile71.bz2 [new file with mode: 0644]
tests/testfile_aarch64_core.bz2 [new file with mode: 0644]
tests/testfile_class_func.bz2 [new file with mode: 0755]
tests/testfile_const_type.bz2 [new file with mode: 0755]
tests/testfile_const_type.c [new file with mode: 0644]
tests/testfile_entry_value.bz2 [new file with mode: 0755]
tests/testfile_entry_value.c [new file with mode: 0644]
tests/testfile_i686_core.bz2 [new file with mode: 0644]
tests/testfile_implicit_pointer.bz2 [new file with mode: 0755]
tests/testfile_implicit_pointer.c [new file with mode: 0644]
tests/testfile_implicit_value.bz2 [new file with mode: 0755]
tests/testfile_implicit_value.c [new file with mode: 0644]
tests/testfile_nested_funcs.bz2 [new file with mode: 0755]
tests/testfile_parameter_ref.bz2 [new file with mode: 0755]
tests/testfile_parameter_ref.c [new file with mode: 0644]
tests/testfileaarch64.bz2 [new file with mode: 0755]
tests/testfilearm.bz2 [new file with mode: 0755]
tests/testfilebasmin.bz2 [new file with mode: 0755]
tests/testfilebaxmin.bz2 [new file with mode: 0755]
tests/testfilebazdbg.bz2 [new file with mode: 0755]
tests/testfilebazdbg.debug.bz2 [new file with mode: 0755]
tests/testfilebazdbg_pl.bz2 [new file with mode: 0755]
tests/testfilebazdbg_plr.bz2 [new file with mode: 0755]
tests/testfilebazdbgppc64.bz2 [new file with mode: 0755]
tests/testfilebazdbgppc64.debug.bz2 [new file with mode: 0755]
tests/testfilebazdbgppc64_pl.bz2 [new file with mode: 0755]
tests/testfilebazdbgppc64_plr.bz2 [new file with mode: 0755]
tests/testfilebazdyn.bz2 [new file with mode: 0755]
tests/testfilebazdynppc64.bz2 [new file with mode: 0755]
tests/testfilebazmdb.bz2 [new file with mode: 0755]
tests/testfilebazmdbppc64.bz2 [new file with mode: 0755]
tests/testfilebazmin.bz2 [new file with mode: 0755]
tests/testfilebazmin_pl.bz2 [new file with mode: 0755]
tests/testfilebazmin_plr.bz2 [new file with mode: 0755]
tests/testfilebazminppc64.bz2 [new file with mode: 0755]
tests/testfilebazminppc64_pl.bz2 [new file with mode: 0755]
tests/testfilebazminppc64_plr.bz2 [new file with mode: 0755]
tests/testfilebaztab.bz2 [new file with mode: 0755]
tests/testfilebaztabppc64.bz2 [new file with mode: 0755]
tests/testfiledwarfinlines.bz2 [new file with mode: 0755]
tests/testfiledwarfinlines.core.bz2 [new file with mode: 0644]
tests/testfilefoobarbaz.bz2 [new file with mode: 0755]
tests/testfileloc.bz2 [new file with mode: 0755]
tests/testfilenolines.bz2 [new file with mode: 0755]
tests/testfileppc32.bz2 [new file with mode: 0755]
tests/testfileppc64.bz2 [new file with mode: 0755]
tests/testfiles390.bz2 [new file with mode: 0755]
tests/testfiles390x.bz2 [new file with mode: 0755]
tests/typeiter2.c [new file with mode: 0644]
tests/update1.c
tests/update2.c
tests/update3.c
tests/update4.c
tests/varlocs.c [new file with mode: 0644]
version.h

index 2a3859a..3f5e5aa 100644 (file)
@@ -44,5 +44,5 @@ Signed-off-by: Random J Developer <random@developer.example.org>
 
 using your real name (sorry, no pseudonyms or anonymous contributions.)
 
-git commit --signoff will add such a Signed-off-by line by at the end of
+git commit --signoff will add such a Signed-off-by line at the end of
 the commit log message for you.
index 208e425..8277932 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,157 @@
+2014-08-25  Mark Wielaard  <mjw@redhat.com>
+
+       * configure.ac: Set version to 0.160.
+       * NEWS: Add removal of DW_TAG_mutable_type, LZMA .ko.xz kernel
+       module support, ARM THUMB functions and ppc64le ELFv2 abi backends.
+
+2014-08-15  Mark Wielaard  <mjw@redhat.com>
+
+       * NEWS: Add dwarf_cu_die.
+
+2014-08-15  Mark Wielaard  <mjw@redhat.com>
+
+       * NEWS: Add dwarf_cu_getdwarf.
+
+2014-07-18  Mark Wielaard  <mjw@redhat.com>
+
+       * configure.ac (AC_CHECK_TYPE): Test for struct user_regs_struct.
+
+2014-05-26  Mark Wielaard  <mjw@redhat.com>
+
+       * NEWS: New section 0.160. Add unstrip --force.
+
+2014-05-17  Mark Wielaard  <mjw@redhat.com>
+
+       * configure.ac: Set version to 0.159.
+       * NEWS: Add entries for version 0.159.
+
+2014-05-02  Mark Wielaard  <mjw@redhat.com>
+
+       * NEWS: Add note about dwz support no longer being experimental and
+       new helper functions.
+       * configure.ac: Remove --enable-dwz.
+       * Makefile.am (DISTCHECK_CONFIGURE_FLAGS): Remove --enable-dwz.
+
+2014-04-11  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (SUBDIRS): Add libdwelf.
+       * configure.ac (AC_CONFIG_FILES): Add libdwelf/Makefile.
+       * NEWS: Add note about libdwelf.
+
+2014-04-13  Mark Wielaard  <mjw@redhat.com>
+
+       * configure.ac: Remove mudflap enable arg and MUDFLAP conditional.
+
+2014-01-21  Mark Wielaard  <mjw@redhat.com>
+
+       * NEWS (Version 0.159): Add stack -i.
+
+2014-01-20  Mark Wielaard  <mjw@redhat.com>
+
+       * NEWS (Version 0.159): New. Add stack -d.
+
+2014-01-03  Mark Wielaard  <mjw@redhat.com>
+
+       * configure.ac: Set version to 0.158.
+       * NEWS: Add entries for version 0.158.
+
+2013-12-20  Mark Wielaard  <mjw@redhat.com>
+
+       * NEWS (libdwfl): Add dwfl_getthread_frames.
+       (stack): New entry.
+
+2013-12-18  Mark Wielaard  <mjw@redhat.com>
+
+       * NEWS (libdwfl): Add dwfl_module_getsym_info and
+       dwfl_module_addrinfo.
+       (addr2line): Add -x option.
+
+2013-12-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * NEWS (Version 0.158) (libdwfl): Added Dwfl_Thread_Callbacks,
+       Dwfl_Thread, Dwfl_Frame, dwfl_attach_state, dwfl_pid, dwfl_thread_dwfl,
+       dwfl_thread_tid, dwfl_frame_thread, dwfl_thread_state_registers,
+       dwfl_thread_state_register_pc, dwfl_getthreads, dwfl_thread_getframes
+       and dwfl_frame_pc.
+
+2013-12-16  Mark Wielaard  <mjw@redhat.com>
+
+       * NEWS (libdwfl): Add dwfl_module_getsymtab_first_global.
+
+2013-12-09  Josh Stone  <jistone@redhat.com>
+
+       * .gitignore: Add config/ar-lib, installed due to AM_PROG_AR.
+
+2013-12-02  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * configure.ac (CC_BIARCH): Remove AS_IF for it.
+
+2013-11-07  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * configure.ac: New AC_CHECK_SIZEOF for long.  Call utrace_BIARCH, new
+       AC_SUBST for CC_BIARCH.
+
+2013-11-06  Mark Wielaard  <mjw@redhat.com>
+
+       * configure.ac (--enable-dwz): Add AC_MSG_WARN when disabled but
+       local system does have /usr/lib/debug/.dwz.
+
+2013-11-06  Mark Wielaard  <mjw@redhat.com>
+
+       * configure.ac (--enable-thread-safety): Add AC_MSG_WARN experimental
+       option.
+
+2013-11-01  Michael Forney  <mforney@mforney.org>
+
+       * configure.ac: Call AM_PROG_AR and AC_CHECK_TOOL for readelf and nm.
+
+2013-10-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * NEWS (Version 0.158): New.
+
+2013-09-30  Mark Wielaard  <mjw@redhat.com>
+
+       * NEWS: Update for readelf NT_SIGINFO and NT_FILE core notes.
+
+2013-09-27  Mark Wielaard  <mjw@redhat.com>
+
+       * configure.ac: Set version to 0.157.
+       * NEWS: Add entries for version 0.157.
+
+2013-09-20  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (DISTCHECK_CONFIGURE_FLAGS): Add --enable-dwz.
+
+2013-07-25  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * configure.ac: Set version to 0.156.
+
+2013-07-19  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * NEWS: Remove bugfix only entries from Version 0.156.
+
+2013-07-18  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * NEWS: Add entries for Version 0.156.
+
+2013-04-28  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * NEWS (Version 0.156): New.
+
+2013-04-26  Mark Wielaard  <mjw@redhat.com>
+
+       * configure.ac (AM_INIT_AUTOMAKE): Request parallel-tests.
+
+2013-04-25  Mark Wielaard  <mjw@redhat.com>
+
+       * .gitignore: Add config/test-driver as installed by automake 1.13.
+       * configure.ac (AM_INIT_AUTOMAKE): Require at least automake 1.11.
+
+2012-10-01  Mark Wielaard  <mjw@redhat.com>
+
+       * configure.ac: Add --enable-valgrind check.
+       * Makefile.am (DISTCHECK_CONFIGURE_FLAGS): Add --enable-valgrind.
+
 2012-08-27  Mark Wielaard  <mjw@redhat.com>
 
        * configure.ac: Set version to 0.155.
diff --git a/INSTALL b/INSTALL
index a1e89e1..007e939 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -1,7 +1,7 @@
 Installation Instructions
 *************************
 
-Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation,
+Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
 Inc.
 
    Copying and distribution of this file, with or without modification,
@@ -309,9 +309,10 @@ causes the specified `gcc' to be used as the C compiler (unless it is
 overridden in the site shell script).
 
 Unfortunately, this technique does not work for `CONFIG_SHELL' due to
-an Autoconf bug.  Until the bug is fixed you can use this workaround:
+an Autoconf limitation.  Until the limitation is lifted, you can use
+this workaround:
 
-     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+     CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
 
 `configure' Invocation
 ======================
@@ -367,4 +368,3 @@ operates.
 
 `configure' also accepts some other, not widely useful, options.  Run
 `configure --help' for more details.
-
index 305bbfc..d044a7c 100644 (file)
@@ -23,8 +23,8 @@ ACLOCAL_AMFLAGS = -I m4
 pkginclude_HEADERS = version.h
 
 # Add doc back when we have some real content.
-SUBDIRS = config m4 lib libelf libebl libdwfl libdw libcpu libasm backends \
-         src po tests
+SUBDIRS = config m4 lib libelf libebl libdwelf libdwfl libdw libcpu libasm \
+         backends src po tests
 
 EXTRA_DIST = elfutils.spec GPG-KEY NOTES CONTRIBUTING \
             COPYING COPYING-GPLV2 COPYING-LGPLV3
@@ -32,8 +32,10 @@ EXTRA_DIST = elfutils.spec GPG-KEY NOTES CONTRIBUTING \
 # Make sure the test install uses lib64 when $LIB will yield lib64.
 # Make sure the test build uses the same compiler, which on e.g. ppc64
 # determines which platform we are actually testing.
+# Run all tests under valgrind.
 DISTCHECK_CONFIGURE_FLAGS = \
        --libdir=`echo $(libdir) | sed "s,^$(exec_prefix),$$dc_install_base,"`\
+       --enable-valgrind \
        CC="$(CC)"
 
 distcheck-hook:
index 519bd73..ea448e1 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 @SET_MAKE@
 
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -35,13 +79,18 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 subdir = .
-DIST_COMMON = README $(am__configure_deps) $(pkginclude_HEADERS) \
-       $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog THANKS \
+       $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+       $(top_srcdir)/configure $(am__configure_deps) \
        $(srcdir)/config.h.in $(top_srcdir)/config/elfutils.spec.in \
-       $(top_srcdir)/config/version.h.in $(top_srcdir)/configure \
-       ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL NEWS THANKS TODO
+       $(top_srcdir)/config/version.h.in $(pkginclude_HEADERS) \
+       ABOUT-NLS COPYING TODO $(top_srcdir)/config/ar-lib \
+       $(top_srcdir)/config/config.guess \
+       $(top_srcdir)/config/config.sub \
+       $(top_srcdir)/config/install-sh $(top_srcdir)/config/missing
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
        $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/zip.m4 \
        $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
@@ -52,15 +101,33 @@ mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = config.h
 CONFIG_CLEAN_FILES = elfutils.spec version.h
 CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 SOURCES =
 DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-       html-recursive info-recursive install-data-recursive \
-       install-dvi-recursive install-exec-recursive \
-       install-html-recursive install-info-recursive \
-       install-pdf-recursive install-ps-recursive install-recursive \
-       installcheck-recursive installdirs-recursive pdf-recursive \
-       ps-recursive uninstall-recursive
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+       ctags-recursive dvi-recursive html-recursive info-recursive \
+       install-data-recursive install-dvi-recursive \
+       install-exec-recursive install-html-recursive \
+       install-info-recursive install-pdf-recursive \
+       install-ps-recursive install-recursive installcheck-recursive \
+       installdirs-recursive pdf-recursive ps-recursive \
+       tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -92,11 +159,33 @@ am__installdirs = "$(DESTDIR)$(pkgincludedir)"
 HEADERS = $(pkginclude_HEADERS)
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
   distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-       $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-       distdir dist dist-all distcheck
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+       cscope distdir dist dist-all distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+       $(LISP)config.h.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
+CSCOPE = cscope
 DIST_SUBDIRS = $(SUBDIRS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
@@ -107,6 +196,7 @@ am__remove_distdir = \
       && rm -rf "$(distdir)" \
       || { sleep 5 && rm -rf "$(distdir)"; }; \
   else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
 am__relativize = \
   dir0=`pwd`; \
   sed_first='s,^\([^/]*\)/.*$$,\1,'; \
@@ -134,19 +224,24 @@ am__relativize = \
   reldir="$$dir2"
 GZIP_ENV = --best
 DIST_ARCHIVES = $(distdir).tar.bz2
+DIST_TARGETS = dist-bzip2
 distuninstallcheck_listfiles = find . -type f -print
 am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
   | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
 distcleancheck_listfiles = find . -type f -print
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
+CC_BIARCH = @CC_BIARCH@
 CFLAGS = @CFLAGS@
+CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEBUGPRED = @DEBUGPRED@
@@ -155,10 +250,13 @@ DEPDIR = @DEPDIR@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_VALGRIND = @HAVE_VALGRIND@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -179,6 +277,7 @@ MODVERSION = @MODVERSION@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
+NM = @NM@
 OBJEXT = @OBJEXT@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -189,6 +288,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+READELF = @READELF@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
@@ -203,6 +303,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -256,8 +357,8 @@ ACLOCAL_AMFLAGS = -I m4
 pkginclude_HEADERS = version.h
 
 # Add doc back when we have some real content.
-SUBDIRS = config m4 lib libelf libebl libdwfl libdw libcpu libasm backends \
-         src po tests
+SUBDIRS = config m4 lib libelf libebl libdwelf libdwfl libdw libcpu libasm \
+         backends src po tests
 
 EXTRA_DIST = elfutils.spec GPG-KEY NOTES CONTRIBUTING \
             COPYING COPYING-GPLV2 COPYING-LGPLV3
@@ -266,8 +367,10 @@ EXTRA_DIST = elfutils.spec GPG-KEY NOTES CONTRIBUTING \
 # Make sure the test install uses lib64 when $LIB will yield lib64.
 # Make sure the test build uses the same compiler, which on e.g. ppc64
 # determines which platform we are actually testing.
+# Run all tests under valgrind.
 DISTCHECK_CONFIGURE_FLAGS = \
        --libdir=`echo $(libdir) | sed "s,^$(exec_prefix),$$dc_install_base,"`\
+       --enable-valgrind \
        CC="$(CC)"
 
 all: config.h
@@ -329,8 +432,11 @@ version.h: $(top_builddir)/config.status $(top_srcdir)/config/version.h.in
        cd $(top_builddir) && $(SHELL) ./config.status $@
 install-pkgincludeHEADERS: $(pkginclude_HEADERS)
        @$(NORMAL_INSTALL)
-       test -z "$(pkgincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)"
        @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -347,22 +453,25 @@ uninstall-pkgincludeHEADERS:
        dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
 
 # This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-       @fail= failcom='exit 1'; \
-       for f in x $$MAKEFLAGS; do \
-         case $$f in \
-           *=* | --[!k]*);; \
-           *k*) failcom='fail=yes';; \
-         esac; \
-       done; \
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+       @fail=; \
+       if $(am__make_keepgoing); then \
+         failcom='fail=yes'; \
+       else \
+         failcom='exit 1'; \
+       fi; \
        dot_seen=no; \
        target=`echo $@ | sed s/-recursive//`; \
-       list='$(SUBDIRS)'; for subdir in $$list; do \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       for subdir in $$list; do \
          echo "Making $$target in $$subdir"; \
          if test "$$subdir" = "."; then \
            dot_seen=yes; \
@@ -377,57 +486,12 @@ $(RECURSIVE_TARGETS):
          $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
        fi; test -z "$$fail"
 
-$(RECURSIVE_CLEAN_TARGETS):
-       @fail= failcom='exit 1'; \
-       for f in x $$MAKEFLAGS; do \
-         case $$f in \
-           *=* | --[!k]*);; \
-           *k*) failcom='fail=yes';; \
-         esac; \
-       done; \
-       dot_seen=no; \
-       case "$@" in \
-         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-         *) list='$(SUBDIRS)' ;; \
-       esac; \
-       rev=''; for subdir in $$list; do \
-         if test "$$subdir" = "."; then :; else \
-           rev="$$subdir $$rev"; \
-         fi; \
-       done; \
-       rev="$$rev ."; \
-       target=`echo $@ | sed s/-recursive//`; \
-       for subdir in $$rev; do \
-         echo "Making $$target in $$subdir"; \
-         if test "$$subdir" = "."; then \
-           local_target="$$target-am"; \
-         else \
-           local_target="$$target"; \
-         fi; \
-         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-         || eval $$failcom; \
-       done && test -z "$$fail"
-tags-recursive:
-       list='$(SUBDIRS)'; for subdir in $$list; do \
-         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-       done
-ctags-recursive:
-       list='$(SUBDIRS)'; for subdir in $$list; do \
-         test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-       done
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
 
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
        if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
@@ -443,12 +507,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
              set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
          fi; \
        done; \
-       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -460,15 +519,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -477,9 +532,31 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+       test ! -s cscope.files \
+         || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+       -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+       -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
 
 distdir: $(DISTFILES)
        @case `sed 15q $(srcdir)/NEWS` in \
@@ -521,13 +598,10 @@ distdir: $(DISTFILES)
        done
        @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
          if test "$$subdir" = .; then :; else \
-           test -d "$(distdir)/$$subdir" \
-           || $(MKDIR_P) "$(distdir)/$$subdir" \
-           || exit 1; \
-         fi; \
-       done
-       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
            dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
            $(am__relativize); \
            new_distdir=$$reldir; \
@@ -556,39 +630,35 @@ distdir: $(DISTFILES)
        || chmod -R a+r "$(distdir)"
 dist-gzip: distdir
        tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
 dist-bzip2: distdir
        tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
 
 dist-lzip: distdir
        tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
-       $(am__remove_distdir)
-
-dist-lzma: distdir
-       tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
 
 dist-xz: distdir
        tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
 
 dist-tarZ: distdir
        tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
 
 dist-shar: distdir
        shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
 
 dist-zip: distdir
        -rm -f $(distdir).zip
        zip -rq $(distdir).zip $(distdir)
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
 
-dist dist-all: distdir
-       tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
-       $(am__remove_distdir)
+dist dist-all:
+       $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+       $(am__post_remove_distdir)
 
 # This target untars the dist file and tries a VPATH configuration.  Then
 # it guarantees that the distribution is self-contained by making another
@@ -599,8 +669,6 @@ distcheck: dist
          GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
        *.tar.bz2*) \
          bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
-       *.tar.lzma*) \
-         lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
        *.tar.lz*) \
          lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
        *.tar.xz*) \
@@ -612,9 +680,9 @@ distcheck: dist
        *.zip*) \
          unzip $(distdir).zip ;;\
        esac
-       chmod -R a-w $(distdir); chmod a+w $(distdir)
-       mkdir $(distdir)/_build
-       mkdir $(distdir)/_inst
+       chmod -R a-w $(distdir)
+       chmod u+w $(distdir)
+       mkdir $(distdir)/_build $(distdir)/_inst
        chmod a-w $(distdir)
        test -d $(distdir)/_build || exit 0; \
        dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
@@ -647,7 +715,7 @@ distcheck: dist
          && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
          && cd "$$am__cwd" \
          || exit 1
-       $(am__remove_distdir)
+       $(am__post_remove_distdir)
        @(echo "$(distdir) archives ready for distribution: "; \
          list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
          sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
@@ -784,13 +852,12 @@ ps-am:
 
 uninstall-am: uninstall-pkgincludeHEADERS
 
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
-       ctags-recursive install-am install-strip tags-recursive
+.MAKE: $(am__recursive_targets) all install-am install-strip
 
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-       all all-am am--refresh check check-am clean clean-generic \
-       ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
-       dist-lzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+       am--refresh check check-am clean clean-cscope clean-generic \
+       cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
+       dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
        distcheck distclean distclean-generic distclean-hdr \
        distclean-tags distcleancheck distdir distuninstallcheck dvi \
        dvi-am html html-am info info-am install install-am \
@@ -801,7 +868,7 @@ uninstall-am: uninstall-pkgincludeHEADERS
        install-ps-am install-strip installcheck installcheck-am \
        installdirs installdirs-am maintainer-clean \
        maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
-       pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
+       pdf-am ps ps-am tags tags-am uninstall uninstall-am \
        uninstall-pkgincludeHEADERS
 
 
diff --git a/NEWS b/NEWS
index e38e60c..aceb3e3 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,105 @@
+Version 0.160
+
+libdw: New functions dwarf_cu_getdwarf, dwarf_cu_die.
+       dwarf.h remove non-existing DW_TAG_mutable_type.
+
+libdwfl: Handle LZMA .ko.xz compressed kernel modules.
+
+unstrip: New option -F, --force to combining files even if some ELF headers
+         don't seem to match.
+
+backends: Handle ARM THUMB functions. Add support for ppc64le ELFv2 abi.
+
+Version 0.159
+
+stack: New option -d, --debugname to lookup DWARF debuginfo name for frame.
+       New option -i, --inlines to show inlined frames using DWARF debuginfo.
+
+libdwelf: New libdwelf.h header for libdw.so DWARF ELF Low-level Functions.
+          New function dwelf_elf_gnu_debuglink, dwelf_dwarf_gnu_debugaltlink,
+         and dwelf_elf_gnu_build_id.
+
+libdw: Support for DWZ multifile forms DW_FORM_GNU_ref_alt and
+       DW_FORM_GNU_strp_alt is now enabled by default and no longer
+       experimental. Added new functions dwarf_getalt and dwarf_setalt
+       to get or set the alternative debug file used for the alt FORMs.
+       The dwfl_linux_proc_find_elf callback will now find ELF from
+       process memory for (deleted) files if the Dwfl has process state
+       attached.
+
+libdwfl: The dwfl_build_id_find_debuginfo and dwfl_standard_find_debuginfo
+         functions will now try to resolve and set the alternative debug file.
+
+backends: Add CFI unwinding for arm. Relies on .debug_frame.
+          Add arm process initial register state compatible mode to AARCH64.
+          Add aarch64 native and core unwind support.
+
+other: All separate elfutils-robustify patches have been merged.
+       CVE-2014-0172 Check overflow before calling malloc to uncompress data.
+
+Version 0.158
+
+libdwfl: dwfl_core_file_report has new parameter executable.
+         New functions dwfl_module_getsymtab_first_global,
+         dwfl_module_getsym_info and dwfl_module_addrinfo.
+         Added unwinder with type Dwfl_Thread_Callbacks, opaque types
+         Dwfl_Thread and Dwfl_Frame and functions dwfl_attach_state,
+         dwfl_pid, dwfl_thread_dwfl, dwfl_thread_tid, dwfl_frame_thread,
+         dwfl_thread_state_registers, dwfl_thread_state_register_pc,
+         dwfl_getthread_frames, dwfl_getthreads, dwfl_thread_getframes
+         and dwfl_frame_pc.
+
+addr2line: New option -x to show the section an address was found in.
+
+stack: New utility that uses the new unwinder for processes and cores.
+
+backends: Unwinder support for i386, x86_64, s390, s390x, ppc and ppc64.
+          aarch64 support.
+
+Version 0.157
+
+libdw: Add new functions dwarf_getlocations, dwarf_getlocation_attr
+       and dwarf_getlocation_die.
+
+readelf: Show contents of NT_SIGINFO and NT_FILE core notes.
+
+addr2line: Support -i, --inlines output option.
+
+backends: abi_cfi hook for arm, ppc and s390.
+
+Version 0.156
+
+lib: New macro COMPAT_VERSION_NEWPROTO.
+
+libdw: Handle GNU extension opcodes in dwarf_getlocation.
+
+libdwfl: Fix STB_GLOBAL over STB_WEAK preference in dwfl_module_addrsym.
+         Add minisymtab support.
+         Add parameter add_p_vaddr to dwfl_report_elf.
+         Use DT_DEBUG library search first.
+
+libebl: Handle new core note types in EBL.
+
+backends: Interpret NT_ARM_VFP.
+          Implement core file registers parsing for s390/s390x.
+
+readelf: Add --elf-section input option to inspect an embedded ELF file.
+         Add -U, --unresolved-address-offsets output control.
+         Add --debug-dump=decodedline support.
+         Accept version 8 .gdb_index section format.
+         Adjust output formatting width.
+         When highpc is in constant form print it also as address.
+         Display raw .debug_aranges. Use libdw only for decodedaranges.
+
+elflint: Add __bss_start__ to the list of allowed symbols.
+
+tests: Add configure --enable-valgrind option to run all tests under valgrind.
+       Enable automake parallel-tests for make check.
+
+translations: Updated Polish translation.
+
+Updates for Automake 1.13.
+
 Version 0.155
 
 libelf: elf*_xlatetomd now works for cross-endian ELF note data.
diff --git a/README b/README
index 33cac74..f7e4b61 100644 (file)
--- a/README
+++ b/README
@@ -10,3 +10,10 @@ Fundamental design decision:
   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.
+
+- although the public libraries (libasm, libdw) have a stable API and are
+  backwards ABI compatible they, and the elfutils tools, do depend on each
+  others internals, and on internals of libelf to provide their interfaces.
+  So they should always be upgraded in lockstep when packaging the tools
+  and libraries separately. For one example of how to do that, see the
+  config/elfutils.spec.
index 5e11db7..451a3ff 100644 (file)
@@ -1,8 +1,7 @@
-# generated automatically by aclocal 1.11.3 -*- Autoconf -*-
+# generated automatically by aclocal 1.13.4 -*- Autoconf -*-
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
-# Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 # PARTICULAR PURPOSE.
 
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
-[m4_warning([this file was generated for autoconf 2.68.
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
 You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
 
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 2002-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 1
-
 # AM_AUTOMAKE_VERSION(VERSION)
 # ----------------------------
 # Automake X.Y traces this macro to ensure aclocal.m4 has been
 # generated from the m4 files accompanying Automake X.Y.
 # (This private macro should not be called outside this file.)
 AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
+[am__api_version='1.13'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.3], [],
+m4_if([$1], [1.13.4], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -54,24 +51,81 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.3])dnl
+[AM_AUTOMAKE_VERSION([1.13.4])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
+# Copyright (C) 2011-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_AR([ACT-IF-FAIL])
+# -------------------------
+# Try to determine the archiver interface, and trigger the ar-lib wrapper
+# if it is needed.  If the detection of archiver interface fails, run
+# ACT-IF-FAIL (default is to abort configure with a proper error message).
+AC_DEFUN([AM_PROG_AR],
+[AC_BEFORE([$0], [LT_INIT])dnl
+AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl
+AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([ar-lib])dnl
+AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false])
+: ${AR=ar}
+
+AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface],
+  [am_cv_ar_interface=ar
+   AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])],
+     [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([am_ar_try])
+      if test "$ac_status" -eq 0; then
+        am_cv_ar_interface=ar
+      else
+        am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD'
+        AC_TRY_EVAL([am_ar_try])
+        if test "$ac_status" -eq 0; then
+          am_cv_ar_interface=lib
+        else
+          am_cv_ar_interface=unknown
+        fi
+      fi
+      rm -f conftest.lib libconftest.a
+     ])
+   ])
+
+case $am_cv_ar_interface in
+ar)
+  ;;
+lib)
+  # Microsoft lib, so override with the ar-lib wrapper script.
+  # FIXME: It is wrong to rewrite AR.
+  # But if we don't then we get into trouble of one sort or another.
+  # A longer-term fix would be to have automake use am__AR in this case,
+  # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something
+  # similar.
+  AR="$am_aux_dir/ar-lib $AR"
+  ;;
+unknown)
+  m4_default([$1],
+             [AC_MSG_ERROR([could not determine $AR interface])])
+  ;;
+esac
+AC_SUBST([AR])dnl
+])
+
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 1
-
 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
 #
 # Of course, Automake must honor this variable whenever it calls a
 # tool from the auxiliary directory.  The problem is that $srcdir (and
@@ -90,7 +144,7 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 #
 # The reason of the latter failure is that $top_srcdir and $ac_aux_dir
 # are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
+# harmless because $srcdir is '.', but things will broke when you
 # start a VPATH build or use an absolute $srcdir.
 #
 # So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
@@ -116,22 +170,19 @@ am_aux_dir=`cd $ac_aux_dir && pwd`
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1997-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 9
-
 # AM_CONDITIONAL(NAME, SHELL-CONDITION)
 # -------------------------------------
 # Define a conditional.
 AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+[AC_PREREQ([2.52])dnl
m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
 AC_SUBST([$1_TRUE])dnl
 AC_SUBST([$1_FALSE])dnl
 _AM_SUBST_NOTMAKE([$1_TRUE])dnl
@@ -150,16 +201,14 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
-# 2010, 2011 Free Software Foundation, Inc.
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 12
 
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
 # written in clear, in which case automake, when reading aclocal.m4,
 # will think it sees a *use*, and therefore will trigger all it's
 # C support machinery.  Also note that it means that autoscan, seeing
@@ -169,7 +218,7 @@ fi])])
 # _AM_DEPENDENCIES(NAME)
 # ----------------------
 # See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
 # We try a few techniques and use that to set a single cache variable.
 #
 # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
@@ -182,12 +231,13 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
 AC_REQUIRE([AM_MAKE_INCLUDE])dnl
 AC_REQUIRE([AM_DEP_TRACK])dnl
 
-ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
-       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
-       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
-       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                   [depcc="$$1"   am_compiler_list=])
+m4_if([$1], [CC],   [depcc="$CC"   am_compiler_list=],
+      [$1], [CXX],  [depcc="$CXX"  am_compiler_list=],
+      [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+      [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+      [$1], [UPC],  [depcc="$UPC"  am_compiler_list=],
+      [$1], [GCJ],  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                    [depcc="$$1"   am_compiler_list=])
 
 AC_CACHE_CHECK([dependency style of $depcc],
                [am_cv_$1_dependencies_compiler_type],
@@ -195,8 +245,8 @@ AC_CACHE_CHECK([dependency style of $depcc],
   # We make a subdir and do the tests there.  Otherwise we can end up
   # making bogus files that we don't know about and never remove.  For
   # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
   rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
@@ -236,16 +286,16 @@ AC_CACHE_CHECK([dependency style of $depcc],
     : > sub/conftest.c
     for i in 1 2 3 4 5 6; do
       echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
     # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
     am__obj=sub/conftest.${OBJEXT-o}
     am__minus_obj="-o $am__obj"
     case $depmode in
@@ -254,8 +304,8 @@ AC_CACHE_CHECK([dependency style of $depcc],
       test "$am__universal" = false || continue
       ;;
     nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
       if test "x$enable_dependency_tracking" = xyes; then
        continue
       else
@@ -263,7 +313,7 @@ AC_CACHE_CHECK([dependency style of $depcc],
       fi
       ;;
     msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
+      # This compiler won't grok '-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
       am__obj=conftest.${OBJEXT-o}
@@ -311,7 +361,7 @@ AM_CONDITIONAL([am__fastdep$1], [
 # AM_SET_DEPDIR
 # -------------
 # Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
 AC_DEFUN([AM_SET_DEPDIR],
 [AC_REQUIRE([AM_SET_LEADING_DOT])dnl
 AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
@@ -321,9 +371,13 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
 # AM_DEP_TRACK
 # ------------
 AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors])
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+  [--enable-dependency-tracking],
+  [do not reject slow dependency extractors])
+AS_HELP_STRING(
+  [--disable-dependency-tracking],
+  [speeds up one-time build])])
 if test "x$enable_dependency_tracking" != xno; then
   am_depcomp="$ac_aux_dir/depcomp"
   AMDEPBACKSLASH='\'
@@ -338,20 +392,18 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-#serial 5
 
 # _AM_OUTPUT_DEPENDENCY_COMMANDS
 # ------------------------------
 AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
 [{
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # Older Autoconf quotes --file arguments for eval, but not when files
   # are listed without --file.  Let's play safe and only enable the eval
   # if we detect the quoting.
   case $CONFIG_FILES in
@@ -364,7 +416,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
     # Strip MF so we end up with the name of the file.
     mf=`echo "$mf" | sed -e 's/:.*$//'`
     # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
+    # We used to match only the files named 'Makefile.in', but
     # some people rename them; so instead we look at the file content.
     # Grep'ing the first line is not enough: some people post-process
     # each Makefile.in and add a new line on top of each file to say so.
@@ -376,21 +428,19 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
       continue
     fi
     # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
+    # from the Makefile without running 'make'.
     DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
     test -z "$DEPDIR" && continue
     am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
+    test -z "$am__include" && continue
     am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
     # Find all dependency output files, they are included files with
     # $(DEPDIR) in their names.  We invoke sed twice because it is the
     # simplest approach to changing $(DEPDIR) to its actual value in the
     # expansion.
     for file in `sed -n "
       s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
       # Make sure the directory exists.
       test -f "$dirpart/$file" && continue
       fdir=`AS_DIRNAME(["$file"])`
@@ -408,7 +458,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
 # This macro should only be invoked once -- use via AC_REQUIRE.
 #
 # This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each `.P' file that we will
+# is enabled.  FIXME.  This creates each '.P' file that we will
 # need in order to bootstrap the dependency handling code.
 AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 [AC_CONFIG_COMMANDS([depfiles],
@@ -418,15 +468,12 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 16
-
 # This macro actually does too much.  Some checks are only needed if
 # your package does certain things.  But this isn't really a big deal.
 
@@ -442,7 +489,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 # arguments mandatory, and then we can depend on a new Autoconf
 # release and drop the old call support.
 AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
+[AC_PREREQ([2.65])dnl
 dnl Autoconf wants to disallow AM_ names.  We explicitly allow
 dnl the ones we care about.
 m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
@@ -471,31 +518,40 @@ AC_SUBST([CYGPATH_W])
 # Define the identity of the package.
 dnl Distinguish between old-style and new-style calls.
 m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+[AC_DIAGNOSE([obsolete],
+             [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
  AC_SUBST([PACKAGE], [$1])dnl
  AC_SUBST([VERSION], [$2])],
 [_AM_SET_OPTIONS([$1])dnl
 dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+m4_if(
+  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+  [ok:ok],,
   [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
  AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
  AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
 
 _AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
 
 # Some tools Automake needs.
 AC_REQUIRE([AM_SANITY_CHECK])dnl
 AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
 AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
 AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
 # We need awk for the "check" target.  The system "awk" is bad on
 # some platforms.
 AC_REQUIRE([AC_PROG_AWK])dnl
@@ -506,28 +562,32 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
                             [_AM_PROG_TAR([v7])])])
 _AM_IF_OPTION([no-dependencies],,
 [AC_PROVIDE_IFELSE([AC_PROG_CC],
-                 [_AM_DEPENDENCIES(CC)],
-                 [define([AC_PROG_CC],
-                         defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+                 [_AM_DEPENDENCIES([CC])],
+                 [m4_define([AC_PROG_CC],
+                            m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
 AC_PROVIDE_IFELSE([AC_PROG_CXX],
-                 [_AM_DEPENDENCIES(CXX)],
-                 [define([AC_PROG_CXX],
-                         defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+                 [_AM_DEPENDENCIES([CXX])],
+                 [m4_define([AC_PROG_CXX],
+                            m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
 AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-                 [_AM_DEPENDENCIES(OBJC)],
-                 [define([AC_PROG_OBJC],
-                         defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+                 [_AM_DEPENDENCIES([OBJC])],
+                 [m4_define([AC_PROG_OBJC],
+                            m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+                 [_AM_DEPENDENCIES([OBJCXX])],
+                 [m4_define([AC_PROG_OBJCXX],
+                            m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
 ])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
 AC_CONFIG_COMMANDS_PRE(dnl
 [m4_provide_if([_AM_COMPILER_EXEEXT],
   [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
 ])
 
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
 dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
 dnl mangled by Autoconf and run in a shell conditional statement.
 m4_define([_AC_COMPILER_EXEEXT],
@@ -555,15 +615,12 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
-# Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 1
-
 # AM_PROG_INSTALL_SH
 # ------------------
 # Define $install_sh.
@@ -577,16 +634,14 @@ if test x"${install_sh}" != xset; then
     install_sh="\${SHELL} $am_aux_dir/install-sh"
   esac
 fi
-AC_SUBST(install_sh)])
+AC_SUBST([install_sh])])
 
-# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2003-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 2
-
 # Check whether the underlying file-system supports filenames
 # with a leading dot.  For instance MS-DOS doesn't.
 AC_DEFUN([AM_SET_LEADING_DOT],
@@ -600,21 +655,18 @@ fi
 rmdir .tst 2>/dev/null
 AC_SUBST([am__leading_dot])])
 
-# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005
-# Free Software Foundation, Inc.
+# Copyright (C) 1998-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 5
-
 # AM_PROG_LEX
 # -----------
 # Autoconf leaves LEX=: if lex or flex can't be found.  Change that to a
 # "missing" invocation, for better error output.
 AC_DEFUN([AM_PROG_LEX],
-[AC_PREREQ(2.50)dnl
+[AC_PREREQ([2.50])dnl
 AC_REQUIRE([AM_MISSING_HAS_RUN])dnl
 AC_REQUIRE([AC_PROG_LEX])dnl
 if test "$LEX" = :; then
@@ -624,20 +676,17 @@ fi])
 # Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
 # From Jim Meyering
 
-# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
-# 2011 Free Software Foundation, Inc.
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 5
-
 # AM_MAINTAINER_MODE([DEFAULT-MODE])
 # ----------------------------------
 # Control maintainer-specific portions of Makefiles.
-# Default is to disable them, unless `enable' is passed literally.
-# For symmetry, `disable' may be passed as well.  Anyway, the user
+# Default is to disable them, unless 'enable' is passed literally.
+# For symmetry, 'disable' may be passed as well.  Anyway, the user
 # can override the default with the --enable/--disable switch.
 AC_DEFUN([AM_MAINTAINER_MODE],
 [m4_case(m4_default([$1], [disable]),
@@ -648,10 +697,11 @@ AC_DEFUN([AM_MAINTAINER_MODE],
 AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
   dnl maintainer-mode's default is 'disable' unless 'enable' is passed
   AC_ARG_ENABLE([maintainer-mode],
-[  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
-                         (and sometimes confusing) to the casual installer],
-      [USE_MAINTAINER_MODE=$enableval],
-      [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+    [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
+      am_maintainer_other[ make rules and dependencies not useful
+      (and sometimes confusing) to the casual installer])],
+    [USE_MAINTAINER_MODE=$enableval],
+    [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
   AC_MSG_RESULT([$USE_MAINTAINER_MODE])
   AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
   MAINT=$MAINTAINER_MODE_TRUE
@@ -659,18 +709,14 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
 ]
 )
 
-AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
-
 # Check to see how 'make' treats includes.                 -*- Autoconf -*-
 
-# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 4
-
 # AM_MAKE_INCLUDE()
 # -----------------
 # Check to see how make treats includes.
@@ -688,7 +734,7 @@ am__quote=
 _am_result=none
 # First try GNU make style include.
 echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
+# Ignore all kinds of additional output from 'make'.
 case `$am_make -s -f confmf 2> /dev/null` in #(
 *the\ am__doit\ target*)
   am__include=include
@@ -715,15 +761,12 @@ rm -f confinc confmf
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1997-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 6
-
 # AM_MISSING_PROG(NAME, PROGRAM)
 # ------------------------------
 AC_DEFUN([AM_MISSING_PROG],
@@ -731,11 +774,10 @@ AC_DEFUN([AM_MISSING_PROG],
 $1=${$1-"${am_missing_run}$2"}
 AC_SUBST($1)])
 
-
 # AM_MISSING_HAS_RUN
 # ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
 AC_DEFUN([AM_MISSING_HAS_RUN],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
 AC_REQUIRE_AUX_FILE([missing])dnl
@@ -748,54 +790,22 @@ if test x"${MISSING+set}" != xset; then
   esac
 fi
 # Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
 else
   am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
+  AC_MSG_WARN(['missing' script is too old or missing])
 fi
 ])
 
-# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
-# Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
-  [[\\/$]]* | ?:[[\\/]]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
-# Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 5
-
 # _AM_MANGLE_OPTION(NAME)
 # -----------------------
 AC_DEFUN([_AM_MANGLE_OPTION],
@@ -805,7 +815,7 @@ AC_DEFUN([_AM_MANGLE_OPTION],
 # --------------------
 # Set option NAME.  Presently that only means defining a flag for this option.
 AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
 
 # _AM_SET_OPTIONS(OPTIONS)
 # ------------------------
@@ -821,22 +831,16 @@ AC_DEFUN([_AM_IF_OPTION],
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 5
-
 # AM_SANITY_CHECK
 # ---------------
 AC_DEFUN([AM_SANITY_CHECK],
 [AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
 # Reject unsafe characters in $srcdir or the absolute working directory
 # name.  Accept space and tab only in the latter.
 am_lf='
@@ -847,32 +851,40 @@ case `pwd` in
 esac
 case $srcdir in
   *[[\\\"\#\$\&\'\`$am_lf\ \   ]]*)
-    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
 esac
 
-# Do `set' in a subshell so we don't clobber the current shell's
+# Do 'set' in a subshell so we don't clobber the current shell's
 # arguments.  Must try -L first in case configure is actually a
 # symlink; some systems play weird games with the mod time of symlinks
 # (eg FreeBSD returns the mod time of the symlink's containing
 # directory).
 if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$[*]" = "X"; then
+       # -L didn't work.
+       set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$[*]" != "X $srcdir/configure conftest.file" \
+       && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+       # If neither matched, then we have a broken ls.  This can happen
+       # if, for instance, CONFIG_SHELL is bash and it inherits a
+       # broken ls alias from the environment.  This has actually
+       # happened.  Such a system could not be considered "sane".
+       AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment])
+     fi
+     if test "$[2]" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
    test "$[2]" = conftest.file
    )
 then
@@ -882,46 +894,118 @@ else
    AC_MSG_ERROR([newly created file is older than distributed files!
 Check your system clock])
 fi
-AC_MSG_RESULT(yes)])
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+  [AC_MSG_CHECKING([that generated files are newer than configure])
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
 
-# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+# Copyright (C) 2009-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 1
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+  [--enable-silent-rules],
+  [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+  [--disable-silent-rules],
+  [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+   [am_cv_make_support_nested_variables],
+   [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+       @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+  dnl Using '$V' instead of '$(V)' breaks IRIX make.
+  AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
 
 # AM_PROG_INSTALL_STRIP
 # ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
+# One issue with vendor 'install' (even GNU) is that you can't
 # specify the program used to strip binaries.  This is especially
 # annoying in cross-compiling environments, where the build's strip
 # is unlikely to handle the host's binaries.
 # Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
+# always use install-sh in "make install-strip", and initialize
 # STRIPPROG with the value of the STRIP variable (set by the user).
 AC_DEFUN([AM_PROG_INSTALL_STRIP],
 [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
 # tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
 if test "$cross_compiling" != no; then
   AC_CHECK_TOOL([STRIP], [strip], :)
 fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
+# Copyright (C) 2006-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 3
-
 # _AM_SUBST_NOTMAKE(VARIABLE)
 # ---------------------------
 # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
@@ -935,18 +1019,16 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
+# Copyright (C) 2004-2013 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 2
-
 # _AM_PROG_TAR(FORMAT)
 # --------------------
 # Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
 #
 # Substitute a variable $(am__tar) that is a command
 # writing to stdout a FORMAT-tarball containing the directory
@@ -956,80 +1038,119 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 # Substitute a variable $(am__untar) that extract such
 # a tarball read from stdin.
 #     $(am__untar) < result.tar
+#
 AC_DEFUN([_AM_PROG_TAR],
 [# Always define AMTAR for backward compatibility.  Yes, it's still used
 # in the wild :-(  We should find a proper way to deprecate it ...
 AC_SUBST([AMTAR], ['$${TAR-tar}'])
-m4_if([$1], [v7],
-     [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
-     [m4_case([$1], [ustar],, [pax],,
-              [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
+
+# We'll loop over all known methods to create a tar archive until one works.
 _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      AM_RUN_LOG([$_am_tar --version]) && break
-    done
-    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x $1 -w "$$tardir"'
-    am__tar_='pax -L -x $1 -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
-    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
-    am__untar='cpio -i -H $1 -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
 
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_$1}" && break
+m4_if([$1], [v7],
+  [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+  [m4_case([$1],
+    [ustar],
+     [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+      # There is notably a 21 bits limit for the UID and the GID.  In fact,
+      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+      # and bug#13588).
+      am_max_uid=2097151 # 2^21 - 1
+      am_max_gid=$am_max_uid
+      # The $UID and $GID variables are not portable, so we need to resort
+      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
+      # below are definitely unexpected, so allow the users to see them
+      # (that is, avoid stderr redirection).
+      am_uid=`id -u || echo unknown`
+      am_gid=`id -g || echo unknown`
+      AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+      if test $am_uid -le $am_max_uid; then
+         AC_MSG_RESULT([yes])
+      else
+         AC_MSG_RESULT([no])
+         _am_tools=none
+      fi
+      AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+      if test $am_gid -le $am_max_gid; then
+         AC_MSG_RESULT([yes])
+      else
+        AC_MSG_RESULT([no])
+        _am_tools=none
+      fi],
+
+  [pax],
+    [],
+
+  [m4_fatal([Unknown tar format])])
+
+  AC_MSG_CHECKING([how to create a $1 tar archive])
+
+  # Go ahead even if we have the value already cached.  We do so because we
+  # need to set the values for the 'am__tar' and 'am__untar' variables.
+  _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+  for _am_tool in $_am_tools; do
+    case $_am_tool in
+    gnutar)
+      for _am_tar in tar gnutar gtar; do
+        AM_RUN_LOG([$_am_tar --version]) && break
+      done
+      am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+      am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+      am__untar="$_am_tar -xf -"
+      ;;
+    plaintar)
+      # Must skip GNU tar: if it does not support --format= it doesn't create
+      # ustar tarball either.
+      (tar --version) >/dev/null 2>&1 && continue
+      am__tar='tar chf - "$$tardir"'
+      am__tar_='tar chf - "$tardir"'
+      am__untar='tar xf -'
+      ;;
+    pax)
+      am__tar='pax -L -x $1 -w "$$tardir"'
+      am__tar_='pax -L -x $1 -w "$tardir"'
+      am__untar='pax -r'
+      ;;
+    cpio)
+      am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+      am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+      am__untar='cpio -i -H $1 -d'
+      ;;
+    none)
+      am__tar=false
+      am__tar_=false
+      am__untar=false
+      ;;
+    esac
 
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+    # If the value was cached, stop now.  We just wanted to have am__tar
+    # and am__untar set.
+    test -n "${am_cv_prog_tar_$1}" && break
+
+    # tar/untar a dummy directory, and stop if the command works.
+    rm -rf conftest.dir
+    mkdir conftest.dir
+    echo GrepMe > conftest.dir/file
+    AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+    rm -rf conftest.dir
+    if test -s conftest.tar; then
+      AM_RUN_LOG([$am__untar <conftest.tar])
+      AM_RUN_LOG([cat conftest.dir/file])
+      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+    fi
+  done
   rm -rf conftest.dir
-  if test -s conftest.tar; then
-    AM_RUN_LOG([$am__untar <conftest.tar])
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
 
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+  AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+  AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
 AC_SUBST([am__tar])
 AC_SUBST([am__untar])
 ]) # _AM_PROG_TAR
 
+m4_include([m4/biarch.m4])
 m4_include([m4/nls.m4])
 m4_include([m4/po.m4])
 m4_include([m4/progtest.m4])
index 0d51e73..a335b20 100644 (file)
@@ -1,3 +1,281 @@
+2014-07-18  Kyle McMartin  <kyle@redhat.com>
+           Mark Wielaard  <mjw@redhat.com>
+
+       * aarch64_initreg.c: Check HAVE_SYS_USER_REGS.
+       (aarch64_set_initial_registers_tid): Use user_regs_struct and
+       user_fpsimd_struct.
+       * arm_initreg.c: Check HAVE_SYS_USER_REGS.
+       (arm_set_initial_registers_tid): Use user_regs_struct in compat mode.
+
+2014-07-04  Menanteau Guy  <menantea@linux.vnet.ibm.com>
+           Mark Wielaard  <mjw@redhat.com>
+
+       * ppc64_init.c (ppc64_init): Hook check_st_other_bits.
+       * ppc64_reloc.def: TLSGD, TLSLD, TOCSAVE, ADDR16_HIGH, ADDR16_HIGHA,
+       TPREL16_HIGH, TPREL16_HIGHA, DTPREL16_HIGH, DTPREL16_HIGHA, JMP_IREL,
+       IRELATIVE, REL16, REL16_LO, REL16_HI and REL16_HA.
+       * ppc64_symbol.c (ppc64_dynamic_tag_name): Recognize DT_PPC64_OPT.
+       (ppc64_dynamic_tag_check): Likewise.
+       (ppc64_check_st_other_bits): New function.
+
+2014-07-04  Mark Wielaard  <mjw@redhat.com>
+
+       * aarch64_retval.c (aarch64_return_value_location): Handle
+       DW_ATE_boolean.
+
+2014-06-18  Mark Wielaard  <mjw@redhat.com>
+
+       * libebl_CPU.h (dwarf_peel_type): Remove DW_TAG_mutable_type
+       handling.
+
+2014-06-17  Mark Wielaard  <mjw@redhat.com>
+
+       * arm_init.c (arm_init): Set func_addr_mask.
+
+2014-06-20  Petr Machata  <pmachata@redhat.com>
+
+       * alpha_retval.c (alpha_return_value_location): Call
+       dwarf_peeled_die_type instead of inlining equivalent code.
+       * arm_retval.c (arm_return_value_location): Likewise.
+       * i386_retval.c (i386_return_value_location): Likewise.
+       * ia64_retval.c (ia64_return_value_location): Likewise.
+       * ppc64_retval.c (ppc64_return_value_location): Likewise.
+       * ppc_retval.c (ppc_return_value_location): Likewise.
+       * s390_retval.c (s390_return_value_location): Likewise.
+       * sh_retval.c (sh_return_value_location): Likewise.
+       * sparc_retval.c (sparc_return_value_location): Likewise.
+       * tilegx_retval.c (tilegx_return_value_location): Likewise.
+       * x86_64_retval.c (x86_64_return_value_location): Likewise.
+
+2014-05-19  Mark Wielaard  <mjw@redhat.com>
+
+       * arm_init.c (arm_init): Hook check_reloc_target_type.
+       * arm_symbol.c (arm_check_reloc_target_type): New function.
+       * ia64_init.c (ia64_init): Hook check_reloc_target_type.
+       * ia64_symbol.c (ia64_check_reloc_target_type): New function.
+
+2014-04-22  Kurt Roeckx  <kurt@roeckx.be>
+
+       * i386_initreg.c: Make Linux only.
+       * x86_64_initreg.c: Make Linux only.
+
+2014-04-13  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: Remove libelf and libdw definitions when MUDFLAP
+       is defined. Remove libmudflap from LINK line.
+
+2014-04-09  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (aarch64_SRCS): Add aarch64_initreg.c.
+       * aarch64_corenote.c (prstatus_regs): Mark pc_register.
+       * aarch64_init.c: Assign frame_nregs. Hook set_initial_registers_tid.
+       * aarch64_initreg: New file.
+
+2014-03-28  Jean Pihet  <jean.pihet@linaro.org>
+
+       * arm_initreg.c (arm_set_initial_registers_tid): Handle compat mode.
+       ARM compatible code running on AARCH64.
+
+2014-03-19  Mark Wielaard  <mjw@redhat.com>
+
+       * aarch64_reloc.def: AARCH64_ABS32 and AARCH64_ABS64 are also valid
+       in ET_REL.
+
+2014-01-30  Petr Machata  <pmachata@redhat.com>
+
+       * aarch64_regs.c (aarch64_register_info.regtype): Make this
+       variadic printf-like function.  Call one vsnprintf instead of two
+       snprintf's.
+       (regtyper, regtypen): Drop.
+       (aarch64_register_info): Adjust callers.
+
+2014-01-26  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (arm_SRCS): Add arm_initreg.c.
+       * arm_init.c (arm_init): Define frame_nregs and hook
+       set_initial_registers_tid.
+       * arm_initreg.c: New file.
+
+2014-01-25  Mark Wielaard  <mjw@redhat.com>
+
+       * arm_cfi.c (arm_abi_cfi): Restore SP (r13) from CFA.
+
+2014-01-24  Mark Wielaard  <mjw@redhat.com>
+
+       * arm_reloc.def: Update list.
+
+2014-01-22  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (aarch64_regs_no_Wformat): Removed.
+       * aarch64_regs.c (regtype): Add bool nr argument. snprintf arg
+       when nr is true.
+       (regtyper): New function.
+       (regtypen): Likewise.
+       (aarch64_register_info): Call either regtyper or regtypen not
+       regtype directly.
+
+2014-01-14  Mark Wielaard  <mjw@redhat.com>
+
+       * aarch64_symbol.c (aarch64_check_special_symbol): Check shdr is
+       not NULL before usage.
+
+2014-01-04  Mark Wielaard  <mjw@redhat.com>
+
+       * ppc64_symbol.c (ppc64_machine_flag_check): New function.
+       * ppc64_init.c (ppc64_init): Hook machine_flag_check.
+
+2014-01-03  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (aarch64_SRCS): Add aarch64_cfi.c.
+       * aarch64_cfi.c: New file.
+       * aarch64_init.c (aarch64_init): Hook abi_cfi.
+       * aarch64_regs.c (aarch64_register_info): Set *prefix to "".
+
+2013-12-19  Mark Wielaard  <mjw@redhat.com>
+
+       * aarch64_init.c (aarch64_init): Hook check_special_symbol.
+       * aarch64_symbol.c (aarch64_check_special_symbol): New function.
+
+2013-12-18  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (ppc64_SRCS): Add ppc64_resolve_sym.c.
+       * ppc64_resolve_sym.c: New file.
+       * ppc64_init.c: Hook resolve_sym_value and find function descriptor
+       table.
+
+2013-12-18  Mark Wielaard  <mjw@redhat.com>
+
+       * s390_initreg.c (s390_set_initial_registers_tid): Use union
+       to avoid type-punning when assigning a double to a Dwarf_Word.
+
+2013-12-18  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       unwinder: s390 and s390x
+       * Makefile.am (s390_SRCS): Add s390_initreg.c and s390_unwind.c.
+       * s390_corenote.c (prstatus_regs): Set PC_REGISTER.  Reindent all the
+       entries.
+       * s390_init.c (s390_init): Initialize frame_nregs,
+       set_initial_registers_tid, normalize_pc and unwind.
+       * s390_initreg.c: New file.
+       * s390_unwind.c: New file.
+
+2013-12-15  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       unwinder: ppc and ppc64
+       * Makefile.am (ppc_SRCS, ppc64_SRCS): Add ppc_initreg.c.
+       * ppc64_init.c (ppc64_init): Initialize also frame_nregs,
+       set_initial_registers_tid and dwarf_to_regno.
+       * ppc_corenote.c (PRSTATUS_REGSET_ITEMS) <nip>: Set PC_REGISTER.
+       * ppc_init.c (ppc64_init): Initialize also frame_nregs,
+       set_initial_registers_tid and dwarf_to_regno.
+       * ppc_initreg.c: New file.
+
+2013-11-25  Petr Machata  <pmachata@redhat.com>
+
+       * Makefile.am (modules): Add aarch64.
+       (libebl_pic): Add libebl_aarch64_pic.a.
+       (aarch64_SRCS): New variable.
+       (libebl_aarch64_pic_a_SOURCES): Likewise.
+       (am_libebl_aarch64_pic_a_OBJECTS): Likewise.
+       (aarch64_regs_no_Wformat): Likewise.
+       * aarch64_corenote.c, aarch64_init.c: New files.
+       * aarch64_regs.c, aarch64_reloc.def: Likewise.
+       * aarch64_retval.c, aarch64_symbol.c: Likewise.
+       * libebl_CPU.h (dwarf_peel_type): New function.
+       (dwarf_peeled_die_type): Likewise.
+
+2013-11-07  Jan Kratochvil  <jan.kratochvil@redhat.com>
+           Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (i386_SRCS): Add i386_initreg.c.
+       (x86_64_SRCS): Add x86_64_initreg.c.
+       * i386_initreg.c: New file.
+       * i386_init.c (i386_init): Initialize frame_nregs and
+       set_initial_registers_tid.
+       * x86_64_initreg.c: New file.
+       * x86_64_init.c (x86_64_init): Initialize frame_nregs and
+       set_initial_registers_tid.
+
+2013-10-06  Mark Wielaard  <mjw@redhat.com>
+
+       * ppc_cfi.c (ppc_abi_cfi): Use DW_CFA_val_offset for reg1, not
+       DW_CFA_val_expression.
+
+2013-08-29  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (arm_SRCS): Add arm_cfi.c.
+       * arm_cfi.c: New file.
+       * arm_init.c (arm_init): Initialize abi_cfi.
+
+2013-08-27  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * Makefile.am (ppc_SRCS, ppc64_SRCS): Add ppc_cfi.c.
+       (s390_SRCS): Add s390_cfi.c.
+       * ppc64_init.c (ppc64_init): Initialize abi_cfi.
+       * ppc_cfi.c: New file.
+       * ppc_init.c (ppc_init): Initialize abi_cfi.
+       * s390_cfi.c: New file.
+       * s390_init.c (s390_init): Initialize abi_cfi.
+
+2013-08-28  Mark Wielaard  <mjw@redhat.com>
+
+       * arm_regs.c (arm_register_info): Set *prefix to "".
+       * ppc_regs.c (ppc_register_info): Likewise.
+       * sh_regs.c (sh_register_info): Likewise.
+
+2013-04-24  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: Use AM_CPPFLAGS instead of INCLUDES.
+
+2013-02-06  Mark Wielaard  <mjw@redhat.com>
+
+       * libebl_CPU.h (DWARF_TAG_OR_RETURN): New macro.
+       * backends/alpha_retval.c (alpha_return_value_location): Use new
+       DWARF_TAG_OR_RETURN macro instead of dwarf_tag ().
+       * backends/arm_retval.c (arm_return_value_location): Likewise.
+       * backends/i386_retval.c (i386_return_value_location): Likewise.
+       * backends/ia64_retval.c (hfa_type): Likewise.
+       (ia64_return_value_location): Likewise.
+       * backends/ppc64_retval.c (ppc64_return_value_location): Likewise.
+       * backends/ppc_retval.c (ppc_return_value_location): Likewise.
+       * backends/s390_retval.c (s390_return_value_location): Likewise.
+       * backends/sh_retval.c (sh_return_value_location): Likewise.
+       * backends/sparc_retval.c (sparc_return_value_location): Likewise.
+       * backends/tilegx_retval.c (tilegx_return_value_location): Likewise.
+       * backends/x86_64_retval.c (x86_64_return_value_location): Likewise.
+
+2013-01-29  Jan Kratochvil  <jan.kratochvil@redhat.com>
+           Roland McGrath <roland@hack.frob.com>
+
+       * Makefile.am (s390_SRCS): Add s390_corenote.c and s390x_corenote.c.
+       * linux-core-note.c (ALIGN_PR_REG): New definitions.
+       (struct EBLHOOK(prstatus)): Change field pr_reg to anonymous struct with
+       ALIGN_PR_REG.
+       (EXTRA_ITEMS): New macro.
+       * s390_corenote.c: New file.
+       * s390_init.c (s390x_core_note): New declaration.
+       (s390_init): Install s390x_core_note and s390_core_note.
+       * s390x_corenote.c: New file.
+
+2013-01-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * arm_corenote.c (vfp_items): Remove zero COUNT initializer.
+
+2012-10-12  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * linux-core-note.c (prstatus_items): Rename groups of sigpend and
+       sighold to signal2 and signal3.
+
+2012-09-24  Petr Machata  <pmachata@redhat.com>
+
+       * arm_corenote.c (vfp_items, vfp_regs): New const variables.
+       (EXTRA_NOTES): Use it for NT_ARM_VFP.
+       * linux-core-note.c (EXTRA_REGSET_ITEMS): New macro.
+
+2012-09-17  Petr Machata  <pmachata@redhat.com>
+
+       * arm_corenote.c (FPREGSET_SIZE): Change to 116.
+
 2012-08-22  Jeff Kenton  <jkenton@tilera.com>
 
        * Makefile.am (modules): Add tilegx.
index 982ff2a..e06841c 100644 (file)
@@ -1,6 +1,6 @@
 ## Process this file with automake to create Makefile.in
 ##
-## Copyright (C) 2000-2010 Red Hat, Inc.
+## Copyright (C) 2000-2010, 2013, 2014 Red Hat, Inc.
 ## Copyright (C) 2012 Tilera Corporation
 ## This file is part of elfutils.
 ##
 ## the GNU Lesser General Public License along with this program.  If
 ## not, see <http://www.gnu.org/licenses/>.
 include $(top_srcdir)/config/eu.am
-INCLUDES += -I$(top_srcdir)/libebl -I$(top_srcdir)/libasm \
+AM_CPPFLAGS += -I$(top_srcdir)/libebl -I$(top_srcdir)/libasm \
           -I$(top_srcdir)/libelf -I$(top_srcdir)/libdw
 
 
-modules = i386 sh x86_64 ia64 alpha arm sparc ppc ppc64 s390 tilegx
-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_sparc_pic.a libebl_ppc_pic.a libebl_ppc64_pic.a \
-            libebl_s390_pic.a libebl_tilegx_pic.a
+modules = i386 sh x86_64 ia64 alpha arm aarch64 sparc ppc ppc64 s390 \
+         tilegx
+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
 noinst_LIBRARIES = $(libebl_pic)
 noinst_DATA = $(libebl_pic:_pic.a=.so)
 
 
-if MUDFLAP
-libelf = ../libelf/libelf.a
-libdw = ../libdw/libdw.a
-else
 libelf = ../libelf/libelf.so
 libdw = ../libdw/libdw.so
-endif
 
 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_retval.c i386_regs.c i386_auxv.c i386_syscall.c \
+           i386_initreg.c
 cpu_i386 = ../libcpu/libcpu_i386.a
 libebl_i386_pic_a_SOURCES = $(i386_SRCS)
 am_libebl_i386_pic_a_OBJECTS = $(i386_SRCS:.c=.os)
@@ -60,7 +57,8 @@ 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_retval.c x86_64_regs.c i386_auxv.c x86_64_syscall.c \
+             x86_64_initreg.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)
@@ -75,26 +73,36 @@ 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_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
+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
 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_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
+            ppc64_corenote.c ppc_regs.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \
+            ppc_cfi.c ppc_initreg.c ppc64_resolve_sym.c
 libebl_ppc64_pic_a_SOURCES = $(ppc64_SRCS)
 am_libebl_ppc64_pic_a_OBJECTS = $(ppc64_SRCS:.c=.os)
 
-s390_SRCS = s390_init.c s390_symbol.c s390_regs.c s390_retval.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)
 
@@ -111,7 +119,7 @@ libebl_%.so libebl_%.map: libebl_%_pic.a $(libelf) $(libdw)
        $(LINK) -shared -o $(@:.map=.so) \
                -Wl,--whole-archive $< $(cpu_$*) -Wl,--no-whole-archive \
                -Wl,--version-script,$(@:.so=.map) \
-               -Wl,-z,defs -Wl,--as-needed $(libelf) $(libdw) $(libmudflap)
+               -Wl,-z,defs -Wl,--as-needed $(libelf) $(libdw)
        $(textrel_check)
 
 libebl_i386.so: $(cpu_i386)
index d4bdb9d..9e678b0 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -36,12 +80,13 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
-       $(srcdir)/Makefile.in $(top_srcdir)/config/eu.am ChangeLog
-@MUDFLAP_TRUE@am__append_1 = -fmudflap
+DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \
+       $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \
+       $(noinst_HEADERS) ChangeLog
 subdir = backends
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
        $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/zip.m4 \
        $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
@@ -51,109 +96,174 @@ CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 LIBRARIES = $(noinst_LIBRARIES)
-AR = ar
 ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
+libebl_aarch64_pic_a_AR = $(AR) $(ARFLAGS)
+libebl_aarch64_pic_a_LIBADD =
+am__objects_1 = aarch64_init.$(OBJEXT) aarch64_regs.$(OBJEXT) \
+       aarch64_symbol.$(OBJEXT) aarch64_corenote.$(OBJEXT) \
+       aarch64_retval.$(OBJEXT) aarch64_cfi.$(OBJEXT) \
+       aarch64_initreg.$(OBJEXT)
+libebl_aarch64_pic_a_OBJECTS = $(am_libebl_aarch64_pic_a_OBJECTS)
 libebl_alpha_pic_a_AR = $(AR) $(ARFLAGS)
 libebl_alpha_pic_a_LIBADD =
-am__objects_1 = alpha_init.$(OBJEXT) alpha_symbol.$(OBJEXT) \
+am__objects_2 = alpha_init.$(OBJEXT) alpha_symbol.$(OBJEXT) \
        alpha_retval.$(OBJEXT) alpha_regs.$(OBJEXT) \
        alpha_corenote.$(OBJEXT) alpha_auxv.$(OBJEXT)
 libebl_alpha_pic_a_OBJECTS = $(am_libebl_alpha_pic_a_OBJECTS)
 libebl_arm_pic_a_AR = $(AR) $(ARFLAGS)
 libebl_arm_pic_a_LIBADD =
-am__objects_2 = arm_init.$(OBJEXT) arm_symbol.$(OBJEXT) \
+am__objects_3 = arm_init.$(OBJEXT) arm_symbol.$(OBJEXT) \
        arm_regs.$(OBJEXT) arm_corenote.$(OBJEXT) arm_auxv.$(OBJEXT) \
-       arm_attrs.$(OBJEXT) arm_retval.$(OBJEXT)
+       arm_attrs.$(OBJEXT) arm_retval.$(OBJEXT) arm_cfi.$(OBJEXT) \
+       arm_initreg.$(OBJEXT)
 libebl_arm_pic_a_OBJECTS = $(am_libebl_arm_pic_a_OBJECTS)
 libebl_i386_pic_a_AR = $(AR) $(ARFLAGS)
 libebl_i386_pic_a_LIBADD =
-am__objects_3 = i386_init.$(OBJEXT) i386_symbol.$(OBJEXT) \
+am__objects_4 = i386_init.$(OBJEXT) i386_symbol.$(OBJEXT) \
        i386_corenote.$(OBJEXT) i386_cfi.$(OBJEXT) \
        i386_retval.$(OBJEXT) i386_regs.$(OBJEXT) i386_auxv.$(OBJEXT) \
-       i386_syscall.$(OBJEXT)
+       i386_syscall.$(OBJEXT) i386_initreg.$(OBJEXT)
 libebl_i386_pic_a_OBJECTS = $(am_libebl_i386_pic_a_OBJECTS)
 libebl_ia64_pic_a_AR = $(AR) $(ARFLAGS)
 libebl_ia64_pic_a_LIBADD =
-am__objects_4 = ia64_init.$(OBJEXT) ia64_symbol.$(OBJEXT) \
+am__objects_5 = ia64_init.$(OBJEXT) ia64_symbol.$(OBJEXT) \
        ia64_regs.$(OBJEXT) ia64_retval.$(OBJEXT)
 libebl_ia64_pic_a_OBJECTS = $(am_libebl_ia64_pic_a_OBJECTS)
 libebl_ppc64_pic_a_AR = $(AR) $(ARFLAGS)
 libebl_ppc64_pic_a_LIBADD =
-am__objects_5 = ppc64_init.$(OBJEXT) ppc64_symbol.$(OBJEXT) \
+am__objects_6 = ppc64_init.$(OBJEXT) ppc64_symbol.$(OBJEXT) \
        ppc64_retval.$(OBJEXT) ppc64_corenote.$(OBJEXT) \
        ppc_regs.$(OBJEXT) ppc_auxv.$(OBJEXT) ppc_attrs.$(OBJEXT) \
-       ppc_syscall.$(OBJEXT)
+       ppc_syscall.$(OBJEXT) ppc_cfi.$(OBJEXT) ppc_initreg.$(OBJEXT) \
+       ppc64_resolve_sym.$(OBJEXT)
 libebl_ppc64_pic_a_OBJECTS = $(am_libebl_ppc64_pic_a_OBJECTS)
 libebl_ppc_pic_a_AR = $(AR) $(ARFLAGS)
 libebl_ppc_pic_a_LIBADD =
-am__objects_6 = ppc_init.$(OBJEXT) ppc_symbol.$(OBJEXT) \
+am__objects_7 = ppc_init.$(OBJEXT) ppc_symbol.$(OBJEXT) \
        ppc_retval.$(OBJEXT) ppc_regs.$(OBJEXT) ppc_corenote.$(OBJEXT) \
-       ppc_auxv.$(OBJEXT) ppc_attrs.$(OBJEXT) ppc_syscall.$(OBJEXT)
+       ppc_auxv.$(OBJEXT) ppc_attrs.$(OBJEXT) ppc_syscall.$(OBJEXT) \
+       ppc_cfi.$(OBJEXT) ppc_initreg.$(OBJEXT)
 libebl_ppc_pic_a_OBJECTS = $(am_libebl_ppc_pic_a_OBJECTS)
 libebl_s390_pic_a_AR = $(AR) $(ARFLAGS)
 libebl_s390_pic_a_LIBADD =
-am__objects_7 = s390_init.$(OBJEXT) s390_symbol.$(OBJEXT) \
-       s390_regs.$(OBJEXT) s390_retval.$(OBJEXT)
+am__objects_8 = s390_init.$(OBJEXT) s390_symbol.$(OBJEXT) \
+       s390_regs.$(OBJEXT) s390_retval.$(OBJEXT) \
+       s390_corenote.$(OBJEXT) s390x_corenote.$(OBJEXT) \
+       s390_cfi.$(OBJEXT) s390_initreg.$(OBJEXT) \
+       s390_unwind.$(OBJEXT)
 libebl_s390_pic_a_OBJECTS = $(am_libebl_s390_pic_a_OBJECTS)
 libebl_sh_pic_a_AR = $(AR) $(ARFLAGS)
 libebl_sh_pic_a_LIBADD =
-am__objects_8 = sh_init.$(OBJEXT) sh_symbol.$(OBJEXT) \
+am__objects_9 = sh_init.$(OBJEXT) sh_symbol.$(OBJEXT) \
        sh_corenote.$(OBJEXT) sh_regs.$(OBJEXT) sh_retval.$(OBJEXT)
 libebl_sh_pic_a_OBJECTS = $(am_libebl_sh_pic_a_OBJECTS)
 libebl_sparc_pic_a_AR = $(AR) $(ARFLAGS)
 libebl_sparc_pic_a_LIBADD =
-am__objects_9 = sparc_init.$(OBJEXT) sparc_symbol.$(OBJEXT) \
+am__objects_10 = sparc_init.$(OBJEXT) sparc_symbol.$(OBJEXT) \
        sparc_regs.$(OBJEXT) sparc_retval.$(OBJEXT) \
        sparc_corenote.$(OBJEXT) sparc64_corenote.$(OBJEXT) \
        sparc_auxv.$(OBJEXT)
 libebl_sparc_pic_a_OBJECTS = $(am_libebl_sparc_pic_a_OBJECTS)
 libebl_tilegx_pic_a_AR = $(AR) $(ARFLAGS)
 libebl_tilegx_pic_a_LIBADD =
-am__objects_10 = tilegx_init.$(OBJEXT) tilegx_symbol.$(OBJEXT) \
+am__objects_11 = tilegx_init.$(OBJEXT) tilegx_symbol.$(OBJEXT) \
        tilegx_regs.$(OBJEXT) tilegx_retval.$(OBJEXT) \
        tilegx_corenote.$(OBJEXT)
 libebl_tilegx_pic_a_OBJECTS = $(am_libebl_tilegx_pic_a_OBJECTS)
 libebl_x86_64_pic_a_AR = $(AR) $(ARFLAGS)
 libebl_x86_64_pic_a_LIBADD =
-am__objects_11 = x86_64_init.$(OBJEXT) x86_64_symbol.$(OBJEXT) \
+am__objects_12 = x86_64_init.$(OBJEXT) x86_64_symbol.$(OBJEXT) \
        x86_64_corenote.$(OBJEXT) x86_64_cfi.$(OBJEXT) \
        x86_64_retval.$(OBJEXT) x86_64_regs.$(OBJEXT) \
-       i386_auxv.$(OBJEXT) x86_64_syscall.$(OBJEXT)
+       i386_auxv.$(OBJEXT) x86_64_syscall.$(OBJEXT) \
+       x86_64_initreg.$(OBJEXT)
 libebl_x86_64_pic_a_OBJECTS = $(am_libebl_x86_64_pic_a_OBJECTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/config/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = $(libebl_alpha_pic_a_SOURCES) $(libebl_arm_pic_a_SOURCES) \
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libebl_aarch64_pic_a_SOURCES) \
+       $(libebl_alpha_pic_a_SOURCES) $(libebl_arm_pic_a_SOURCES) \
        $(libebl_i386_pic_a_SOURCES) $(libebl_ia64_pic_a_SOURCES) \
        $(libebl_ppc64_pic_a_SOURCES) $(libebl_ppc_pic_a_SOURCES) \
        $(libebl_s390_pic_a_SOURCES) $(libebl_sh_pic_a_SOURCES) \
        $(libebl_sparc_pic_a_SOURCES) $(libebl_tilegx_pic_a_SOURCES) \
        $(libebl_x86_64_pic_a_SOURCES)
-DIST_SOURCES = $(libebl_alpha_pic_a_SOURCES) \
-       $(libebl_arm_pic_a_SOURCES) $(libebl_i386_pic_a_SOURCES) \
-       $(libebl_ia64_pic_a_SOURCES) $(libebl_ppc64_pic_a_SOURCES) \
-       $(libebl_ppc_pic_a_SOURCES) $(libebl_s390_pic_a_SOURCES) \
-       $(libebl_sh_pic_a_SOURCES) $(libebl_sparc_pic_a_SOURCES) \
-       $(libebl_tilegx_pic_a_SOURCES) $(libebl_x86_64_pic_a_SOURCES)
+DIST_SOURCES = $(libebl_aarch64_pic_a_SOURCES) \
+       $(libebl_alpha_pic_a_SOURCES) $(libebl_arm_pic_a_SOURCES) \
+       $(libebl_i386_pic_a_SOURCES) $(libebl_ia64_pic_a_SOURCES) \
+       $(libebl_ppc64_pic_a_SOURCES) $(libebl_ppc_pic_a_SOURCES) \
+       $(libebl_s390_pic_a_SOURCES) $(libebl_sh_pic_a_SOURCES) \
+       $(libebl_sparc_pic_a_SOURCES) $(libebl_tilegx_pic_a_SOURCES) \
+       $(libebl_x86_64_pic_a_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 DATA = $(noinst_DATA)
 HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
+CC_BIARCH = @CC_BIARCH@
 CFLAGS = @CFLAGS@
+CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEBUGPRED = @DEBUGPRED@
@@ -162,10 +272,13 @@ DEPDIR = @DEPDIR@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_VALGRIND = @HAVE_VALGRIND@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -186,6 +299,7 @@ MODVERSION = @MODVERSION@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
+NM = @NM@
 OBJEXT = @OBJEXT@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -196,6 +310,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+READELF = @READELF@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
@@ -210,6 +325,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -259,36 +375,33 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 zip_LIBS = @zip_LIBS@
-INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \
+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \
        -I$(top_srcdir)/libebl -I$(top_srcdir)/libasm \
        -I$(top_srcdir)/libelf -I$(top_srcdir)/libdw
-AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \
-       $($(*F)_no_Werror),,-Werror) $(if \
-       $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \
-       $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \
-       $(am__append_1)
-@MUDFLAP_FALSE@libmudflap = 
-@MUDFLAP_TRUE@libmudflap = -lmudflap
-COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\
-                         $(COMPILE))
+AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \
+           $(if $($(*F)_no_Werror),,-Werror) \
+           $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \
+           $($(*F)_CFLAGS)
 
+COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE))
 CLEANFILES = *.gcno *.gcda $(foreach m,$(modules), libebl_$(m).map \
        libebl_$(m).so $(am_libebl_$(m)_pic_a_OBJECTS))
-textrel_check = if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
-modules = i386 sh x86_64 ia64 alpha arm sparc ppc ppc64 s390 tilegx
-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_sparc_pic.a libebl_ppc_pic.a libebl_ppc64_pic.a \
-            libebl_s390_pic.a libebl_tilegx_pic.a
+textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
+modules = i386 sh x86_64 ia64 alpha arm aarch64 sparc ppc ppc64 s390 \
+         tilegx
+
+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
 
 noinst_LIBRARIES = $(libebl_pic)
 noinst_DATA = $(libebl_pic:_pic.a=.so)
-@MUDFLAP_FALSE@libelf = ../libelf/libelf.so
-@MUDFLAP_TRUE@libelf = ../libelf/libelf.a
-@MUDFLAP_FALSE@libdw = ../libdw/libdw.so
-@MUDFLAP_TRUE@libdw = ../libdw/libdw.a
+libelf = ../libelf/libelf.so
+libdw = ../libdw/libdw.so
 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_retval.c i386_regs.c i386_auxv.c i386_syscall.c \
+           i386_initreg.c
 
 cpu_i386 = ../libcpu/libcpu_i386.a
 libebl_i386_pic_a_SOURCES = $(i386_SRCS)
@@ -297,7 +410,8 @@ 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_retval.c x86_64_regs.c i386_auxv.c x86_64_syscall.c \
+             x86_64_initreg.c
 
 cpu_x86_64 = ../libcpu/libcpu_x86_64.a
 libebl_x86_64_pic_a_SOURCES = $(x86_64_SRCS)
@@ -311,26 +425,37 @@ alpha_SRCS = alpha_init.c alpha_symbol.c alpha_retval.c alpha_regs.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_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
+
+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
 
 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_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
+            ppc64_corenote.c ppc_regs.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \
+            ppc_cfi.c ppc_initreg.c ppc64_resolve_sym.c
 
 libebl_ppc64_pic_a_SOURCES = $(ppc64_SRCS)
 am_libebl_ppc64_pic_a_OBJECTS = $(ppc64_SRCS:.c=.os)
-s390_SRCS = s390_init.c s390_symbol.c s390_regs.c s390_retval.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 \
@@ -378,50 +503,66 @@ $(am__aclocal_m4_deps):
 
 clean-noinstLIBRARIES:
        -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+libebl_aarch64_pic.a: $(libebl_aarch64_pic_a_OBJECTS) $(libebl_aarch64_pic_a_DEPENDENCIES) $(EXTRA_libebl_aarch64_pic_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libebl_aarch64_pic.a
+       $(AM_V_AR)$(libebl_aarch64_pic_a_AR) libebl_aarch64_pic.a $(libebl_aarch64_pic_a_OBJECTS) $(libebl_aarch64_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libebl_aarch64_pic.a
+
 libebl_alpha_pic.a: $(libebl_alpha_pic_a_OBJECTS) $(libebl_alpha_pic_a_DEPENDENCIES) $(EXTRA_libebl_alpha_pic_a_DEPENDENCIES) 
-       -rm -f libebl_alpha_pic.a
-       $(libebl_alpha_pic_a_AR) libebl_alpha_pic.a $(libebl_alpha_pic_a_OBJECTS) $(libebl_alpha_pic_a_LIBADD)
-       $(RANLIB) libebl_alpha_pic.a
+       $(AM_V_at)-rm -f libebl_alpha_pic.a
+       $(AM_V_AR)$(libebl_alpha_pic_a_AR) libebl_alpha_pic.a $(libebl_alpha_pic_a_OBJECTS) $(libebl_alpha_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libebl_alpha_pic.a
+
 libebl_arm_pic.a: $(libebl_arm_pic_a_OBJECTS) $(libebl_arm_pic_a_DEPENDENCIES) $(EXTRA_libebl_arm_pic_a_DEPENDENCIES) 
-       -rm -f libebl_arm_pic.a
-       $(libebl_arm_pic_a_AR) libebl_arm_pic.a $(libebl_arm_pic_a_OBJECTS) $(libebl_arm_pic_a_LIBADD)
-       $(RANLIB) libebl_arm_pic.a
+       $(AM_V_at)-rm -f libebl_arm_pic.a
+       $(AM_V_AR)$(libebl_arm_pic_a_AR) libebl_arm_pic.a $(libebl_arm_pic_a_OBJECTS) $(libebl_arm_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libebl_arm_pic.a
+
 libebl_i386_pic.a: $(libebl_i386_pic_a_OBJECTS) $(libebl_i386_pic_a_DEPENDENCIES) $(EXTRA_libebl_i386_pic_a_DEPENDENCIES) 
-       -rm -f libebl_i386_pic.a
-       $(libebl_i386_pic_a_AR) libebl_i386_pic.a $(libebl_i386_pic_a_OBJECTS) $(libebl_i386_pic_a_LIBADD)
-       $(RANLIB) libebl_i386_pic.a
+       $(AM_V_at)-rm -f libebl_i386_pic.a
+       $(AM_V_AR)$(libebl_i386_pic_a_AR) libebl_i386_pic.a $(libebl_i386_pic_a_OBJECTS) $(libebl_i386_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libebl_i386_pic.a
+
 libebl_ia64_pic.a: $(libebl_ia64_pic_a_OBJECTS) $(libebl_ia64_pic_a_DEPENDENCIES) $(EXTRA_libebl_ia64_pic_a_DEPENDENCIES) 
-       -rm -f libebl_ia64_pic.a
-       $(libebl_ia64_pic_a_AR) libebl_ia64_pic.a $(libebl_ia64_pic_a_OBJECTS) $(libebl_ia64_pic_a_LIBADD)
-       $(RANLIB) libebl_ia64_pic.a
+       $(AM_V_at)-rm -f libebl_ia64_pic.a
+       $(AM_V_AR)$(libebl_ia64_pic_a_AR) libebl_ia64_pic.a $(libebl_ia64_pic_a_OBJECTS) $(libebl_ia64_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libebl_ia64_pic.a
+
 libebl_ppc64_pic.a: $(libebl_ppc64_pic_a_OBJECTS) $(libebl_ppc64_pic_a_DEPENDENCIES) $(EXTRA_libebl_ppc64_pic_a_DEPENDENCIES) 
-       -rm -f libebl_ppc64_pic.a
-       $(libebl_ppc64_pic_a_AR) libebl_ppc64_pic.a $(libebl_ppc64_pic_a_OBJECTS) $(libebl_ppc64_pic_a_LIBADD)
-       $(RANLIB) libebl_ppc64_pic.a
+       $(AM_V_at)-rm -f libebl_ppc64_pic.a
+       $(AM_V_AR)$(libebl_ppc64_pic_a_AR) libebl_ppc64_pic.a $(libebl_ppc64_pic_a_OBJECTS) $(libebl_ppc64_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libebl_ppc64_pic.a
+
 libebl_ppc_pic.a: $(libebl_ppc_pic_a_OBJECTS) $(libebl_ppc_pic_a_DEPENDENCIES) $(EXTRA_libebl_ppc_pic_a_DEPENDENCIES) 
-       -rm -f libebl_ppc_pic.a
-       $(libebl_ppc_pic_a_AR) libebl_ppc_pic.a $(libebl_ppc_pic_a_OBJECTS) $(libebl_ppc_pic_a_LIBADD)
-       $(RANLIB) libebl_ppc_pic.a
+       $(AM_V_at)-rm -f libebl_ppc_pic.a
+       $(AM_V_AR)$(libebl_ppc_pic_a_AR) libebl_ppc_pic.a $(libebl_ppc_pic_a_OBJECTS) $(libebl_ppc_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libebl_ppc_pic.a
+
 libebl_s390_pic.a: $(libebl_s390_pic_a_OBJECTS) $(libebl_s390_pic_a_DEPENDENCIES) $(EXTRA_libebl_s390_pic_a_DEPENDENCIES) 
-       -rm -f libebl_s390_pic.a
-       $(libebl_s390_pic_a_AR) libebl_s390_pic.a $(libebl_s390_pic_a_OBJECTS) $(libebl_s390_pic_a_LIBADD)
-       $(RANLIB) libebl_s390_pic.a
+       $(AM_V_at)-rm -f libebl_s390_pic.a
+       $(AM_V_AR)$(libebl_s390_pic_a_AR) libebl_s390_pic.a $(libebl_s390_pic_a_OBJECTS) $(libebl_s390_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libebl_s390_pic.a
+
 libebl_sh_pic.a: $(libebl_sh_pic_a_OBJECTS) $(libebl_sh_pic_a_DEPENDENCIES) $(EXTRA_libebl_sh_pic_a_DEPENDENCIES) 
-       -rm -f libebl_sh_pic.a
-       $(libebl_sh_pic_a_AR) libebl_sh_pic.a $(libebl_sh_pic_a_OBJECTS) $(libebl_sh_pic_a_LIBADD)
-       $(RANLIB) libebl_sh_pic.a
+       $(AM_V_at)-rm -f libebl_sh_pic.a
+       $(AM_V_AR)$(libebl_sh_pic_a_AR) libebl_sh_pic.a $(libebl_sh_pic_a_OBJECTS) $(libebl_sh_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libebl_sh_pic.a
+
 libebl_sparc_pic.a: $(libebl_sparc_pic_a_OBJECTS) $(libebl_sparc_pic_a_DEPENDENCIES) $(EXTRA_libebl_sparc_pic_a_DEPENDENCIES) 
-       -rm -f libebl_sparc_pic.a
-       $(libebl_sparc_pic_a_AR) libebl_sparc_pic.a $(libebl_sparc_pic_a_OBJECTS) $(libebl_sparc_pic_a_LIBADD)
-       $(RANLIB) libebl_sparc_pic.a
+       $(AM_V_at)-rm -f libebl_sparc_pic.a
+       $(AM_V_AR)$(libebl_sparc_pic_a_AR) libebl_sparc_pic.a $(libebl_sparc_pic_a_OBJECTS) $(libebl_sparc_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libebl_sparc_pic.a
+
 libebl_tilegx_pic.a: $(libebl_tilegx_pic_a_OBJECTS) $(libebl_tilegx_pic_a_DEPENDENCIES) $(EXTRA_libebl_tilegx_pic_a_DEPENDENCIES) 
-       -rm -f libebl_tilegx_pic.a
-       $(libebl_tilegx_pic_a_AR) libebl_tilegx_pic.a $(libebl_tilegx_pic_a_OBJECTS) $(libebl_tilegx_pic_a_LIBADD)
-       $(RANLIB) libebl_tilegx_pic.a
+       $(AM_V_at)-rm -f libebl_tilegx_pic.a
+       $(AM_V_AR)$(libebl_tilegx_pic_a_AR) libebl_tilegx_pic.a $(libebl_tilegx_pic_a_OBJECTS) $(libebl_tilegx_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libebl_tilegx_pic.a
+
 libebl_x86_64_pic.a: $(libebl_x86_64_pic_a_OBJECTS) $(libebl_x86_64_pic_a_DEPENDENCIES) $(EXTRA_libebl_x86_64_pic_a_DEPENDENCIES) 
-       -rm -f libebl_x86_64_pic.a
-       $(libebl_x86_64_pic_a_AR) libebl_x86_64_pic.a $(libebl_x86_64_pic_a_OBJECTS) $(libebl_x86_64_pic_a_LIBADD)
-       $(RANLIB) libebl_x86_64_pic.a
+       $(AM_V_at)-rm -f libebl_x86_64_pic.a
+       $(AM_V_AR)$(libebl_x86_64_pic_a_AR) libebl_x86_64_pic.a $(libebl_x86_64_pic_a_OBJECTS) $(libebl_x86_64_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libebl_x86_64_pic.a
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -429,6 +570,13 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aarch64_cfi.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aarch64_corenote.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aarch64_init.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aarch64_initreg.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aarch64_regs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aarch64_retval.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aarch64_symbol.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alpha_auxv.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alpha_corenote.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alpha_init.Po@am__quote@
@@ -437,8 +585,10 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alpha_symbol.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arm_attrs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arm_auxv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arm_cfi.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arm_corenote.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arm_init.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arm_initreg.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arm_regs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arm_retval.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arm_symbol.Po@am__quote@
@@ -446,6 +596,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/i386_cfi.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/i386_corenote.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/i386_init.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/i386_initreg.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/i386_regs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/i386_retval.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/i386_symbol.Po@am__quote@
@@ -456,20 +607,28 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ia64_symbol.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc64_corenote.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc64_init.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc64_resolve_sym.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc64_retval.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc64_symbol.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc_attrs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc_auxv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc_cfi.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc_corenote.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc_init.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc_initreg.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc_regs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc_retval.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc_symbol.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppc_syscall.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s390_cfi.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s390_corenote.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s390_init.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s390_initreg.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s390_regs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s390_retval.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s390_symbol.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s390_unwind.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s390x_corenote.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sh_corenote.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sh_init.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sh_regs.Po@am__quote@
@@ -490,45 +649,35 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86_64_cfi.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86_64_corenote.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86_64_init.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86_64_initreg.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86_64_regs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86_64_retval.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86_64_symbol.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86_64_syscall.Po@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
 
 .c.obj:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -540,15 +689,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -557,6 +702,21 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -695,17 +855,17 @@ uninstall-am:
 
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-       clean-noinstLIBRARIES ctags distclean distclean-compile \
-       distclean-generic distclean-tags distdir dvi dvi-am html \
-       html-am info info-am install install-am install-data \
-       install-data-am install-dvi install-dvi-am install-exec \
-       install-exec-am install-html install-html-am install-info \
-       install-info-am install-man install-pdf install-pdf-am \
-       install-ps install-ps-am install-strip installcheck \
-       installcheck-am installdirs maintainer-clean \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+       clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \
+       distclean-compile distclean-generic distclean-tags distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
+       install-info install-info-am install-man install-pdf \
+       install-pdf-am install-ps install-ps-am install-strip \
+       installcheck installcheck-am installdirs maintainer-clean \
        maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
        uninstall-am
 
 
@@ -725,7 +885,7 @@ libebl_%.so libebl_%.map: libebl_%_pic.a $(libelf) $(libdw)
        $(LINK) -shared -o $(@:.map=.so) \
                -Wl,--whole-archive $< $(cpu_$*) -Wl,--no-whole-archive \
                -Wl,--version-script,$(@:.so=.map) \
-               -Wl,-z,defs -Wl,--as-needed $(libelf) $(libdw) $(libmudflap)
+               -Wl,-z,defs -Wl,--as-needed $(libelf) $(libdw)
        $(textrel_check)
 
 libebl_i386.so: $(cpu_i386)
diff --git a/backends/aarch64_cfi.c b/backends/aarch64_cfi.c
new file mode 100644 (file)
index 0000000..acbb9b6
--- /dev/null
@@ -0,0 +1,82 @@
+/* arm ABI-specified defaults for DWARF CFI.
+   Copyright (C) 2013 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 <dwarf.h>
+
+#define BACKEND aarch64_
+#include "libebl_CPU.h"
+
+
+/* ABI-specified state of DWARF CFI based on:
+
+   "DWARF for the ARM 64 bit architecture (AArch64) 1.0"
+http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf
+
+   "Procedure Call Standard for the ARM 64 bit Architecture 1.0"
+http://infocenter.arm.com/help/topic/com.arm.doc.ihi0055b/IHI0055B_aapcs64.pdf
+*/
+
+int
+aarch64_abi_cfi (Ebl *ebl __attribute__ ((unused)), Dwarf_CIE *abi_info)
+{
+  static const uint8_t abi_cfi[] =
+    {
+      /* The initial Canonical Frame Address is the value of the
+         Stack Pointer (r31) as setup in the previous frame. */
+      DW_CFA_def_cfa, ULEB128_7 (30), ULEB128_7 (0),
+
+#define SV(n) DW_CFA_same_value, ULEB128_7 (n)
+      /* Callee-saved regs r19-r28.  */
+      SV (19), SV (20), SV (21), SV (22), SV (23),
+      SV (24), SV (25), SV (26), SV (27), SV (28),
+
+      /* The Frame Pointer (FP, r29) and Link Register (LR, r30).  */
+      SV (29), SV (30),
+
+      /* Callee-saved fpregs v8-v15.  v0 == 64.  */
+      SV (72), SV (73), SV (74), SV (75),
+      SV (76), SV (77), SV (78), SV (79),
+#undef SV
+
+      /* XXX Note: registers intentionally unused by the program,
+        for example as a consequence of the procedure call standard
+        should be initialized as if by DW_CFA_same_value.  */
+    };
+
+  abi_info->initial_instructions = abi_cfi;
+  abi_info->initial_instructions_end = &abi_cfi[sizeof abi_cfi];
+  abi_info->data_alignment_factor = -4;
+
+  abi_info->return_address_register = 30; /* lr.  */
+
+  return 0;
+}
diff --git a/backends/aarch64_corenote.c b/backends/aarch64_corenote.c
new file mode 100644 (file)
index 0000000..9b42485
--- /dev/null
@@ -0,0 +1,163 @@
+/* AArch64 specific core note handling.
+   Copyright (C) 2013 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 <elf.h>
+#include <inttypes.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <sys/time.h>
+
+#define BACKEND aarch64_
+#include "libebl_CPU.h"
+
+#define        ULONG                   uint64_t
+#define PID_T                  int32_t
+#define        UID_T                   uint32_t
+#define        GID_T                   uint32_t
+#define ALIGN_ULONG            8
+#define ALIGN_PID_T            4
+#define ALIGN_UID_T            4
+#define ALIGN_GID_T            4
+#define TYPE_ULONG             ELF_T_XWORD
+#define TYPE_PID_T             ELF_T_SWORD
+#define TYPE_UID_T             ELF_T_WORD
+#define TYPE_GID_T             ELF_T_WORD
+
+#define PRSTATUS_REGS_SIZE     (34 * 8)
+
+static const Ebl_Register_Location prstatus_regs[] =
+  {
+    { .offset = 0, .regno = 0, .count = 32, .bits = 64 }, /* x0..x30, sp */
+  };
+
+#define PRSTATUS_REGSET_ITEMS                                          \
+  {                                                                    \
+    .name = "pc", .type = ELF_T_XWORD, .format = 'x',                  \
+    .offset = (offsetof (struct EBLHOOK(prstatus), pr_reg)             \
+              + PRSTATUS_REGS_SIZE - 16),                              \
+    .group = "register",                                               \
+    .pc_register = true                                                        \
+  },                                                                   \
+  {                                                                    \
+    .name = "pstate", .type = ELF_T_XWORD, .format = 'x',              \
+    .offset = (offsetof (struct EBLHOOK(prstatus), pr_reg)             \
+              + PRSTATUS_REGS_SIZE - 8),                               \
+    .group = "register"                                                        \
+  }
+
+static const Ebl_Register_Location aarch64_fpregset_regs[] =
+  {
+    { .offset = 0, .regno = 64, .count = 32, .bits = 128 }, /* v0..v31 */
+  };
+
+static const Ebl_Core_Item aarch64_fpregset_items[] =
+  {
+    {
+      .name = "fpsr", .type = ELF_T_WORD, .format = 'x',
+      .offset = 512, .group = "register"
+    },
+    {
+      .name = "fpcr", .type = ELF_T_WORD, .format = 'x',
+      .offset = 516, .group = "register"
+    }
+  };
+
+static const Ebl_Core_Item aarch64_tls_items[] =
+  {
+    {
+      .name = "tls", .type = ELF_T_XWORD, .format = 'x',
+      .offset = 0, .group = "register"
+    }
+  };
+
+#define AARCH64_HWBP_REG(KIND, N)                                      \
+    {                                                                  \
+      .name = "DBG" KIND "VR" #N "_EL1", .type = ELF_T_XWORD, .format = 'x', \
+      .offset = 8 + N * 16, .group = "register"                                \
+    },                                                                 \
+    {                                                                  \
+      .name = "DBG" KIND "CR" #N "_EL1", .type = ELF_T_WORD, .format = 'x', \
+      .offset = 16 + N * 16, .group = "register"                       \
+    }
+
+#define AARCH64_BP_WP_GROUP(KIND, NAME)                                        \
+  static const Ebl_Core_Item NAME[] =                                  \
+    {                                                                  \
+      {                                                                        \
+       .name = "dbg_info", .type = ELF_T_WORD, .format = 'x',          \
+       .offset = 0, .group = "control"                                 \
+      },                                                               \
+      /* N.B.: 4 bytes of padding here.  */                            \
+                                                                       \
+      AARCH64_HWBP_REG(KIND, 0),                                       \
+      AARCH64_HWBP_REG(KIND, 1),                                       \
+      AARCH64_HWBP_REG(KIND, 2),                                       \
+      AARCH64_HWBP_REG(KIND, 3),                                       \
+      AARCH64_HWBP_REG(KIND, 4),                                       \
+      AARCH64_HWBP_REG(KIND, 5),                                       \
+      AARCH64_HWBP_REG(KIND, 6),                                       \
+      AARCH64_HWBP_REG(KIND, 7),                                       \
+      AARCH64_HWBP_REG(KIND, 8),                                       \
+      AARCH64_HWBP_REG(KIND, 9),                                       \
+      AARCH64_HWBP_REG(KIND, 10),                                      \
+      AARCH64_HWBP_REG(KIND, 11),                                      \
+      AARCH64_HWBP_REG(KIND, 12),                                      \
+      AARCH64_HWBP_REG(KIND, 13),                                      \
+      AARCH64_HWBP_REG(KIND, 14),                                      \
+      AARCH64_HWBP_REG(KIND, 15),                                      \
+                                                                       \
+      /* The DBGBVR+DBGBCR pair only takes 12 bytes.  There are 4 bytes        \
+        of padding at the end of each pair.  The item formatter in     \
+        readelf can skip those, but the missing 4 bytes at the end of  \
+        the whole block cause it to assume the whole item bunch        \
+        repeats, so it loops around to read more.  Insert an explicit  \
+        (but invisible) padding word.  */                              \
+      {                                                                        \
+       .name = "", .type = ELF_T_WORD, .format = 'h',                  \
+       .offset = 260, .group = "register"                              \
+      }                                                                        \
+    }
+
+AARCH64_BP_WP_GROUP ("B", aarch64_hw_bp_items);
+AARCH64_BP_WP_GROUP ("W", aarch64_hw_wp_items);
+
+#undef AARCH64_BP_WP_GROUP
+#undef AARCH64_HWBP_REG
+
+#define EXTRA_NOTES                                                    \
+  EXTRA_REGSET_ITEMS (NT_FPREGSET, 528,                                        \
+                     aarch64_fpregset_regs, aarch64_fpregset_items)    \
+  EXTRA_ITEMS (NT_ARM_TLS, 8, aarch64_tls_items)                       \
+  EXTRA_ITEMS (NT_ARM_HW_BREAK, 264, aarch64_hw_bp_items)              \
+  EXTRA_ITEMS (NT_ARM_HW_WATCH, 264, aarch64_hw_wp_items)
+
+#include "linux-core-note.c"
diff --git a/backends/aarch64_init.c b/backends/aarch64_init.c
new file mode 100644 (file)
index 0000000..b0fd17a
--- /dev/null
@@ -0,0 +1,69 @@
+/* Initialization of AArch64 specific backend library.
+   Copyright (C) 2013 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
+
+#define BACKEND                aarch64_
+#define RELOC_PREFIX   R_AARCH64_
+#include "libebl_CPU.h"
+
+/* This defines the common reloc hooks based on aarch64_reloc.def.  */
+#include "common-reloc.c"
+
+
+const char *
+aarch64_init (elf, machine, eh, ehlen)
+     Elf *elf __attribute__ ((unused));
+     GElf_Half machine __attribute__ ((unused));
+     Ebl *eh;
+     size_t ehlen;
+{
+  /* Check whether the Elf_BH object has a sufficent size.  */
+  if (ehlen < sizeof (Ebl))
+    return NULL;
+
+  /* We handle it.  */
+  eh->name = "AARCH64";
+  aarch64_init_reloc (eh);
+  HOOK (eh, register_info);
+  HOOK (eh, core_note);
+  HOOK (eh, reloc_simple_type);
+  HOOK (eh, return_value_location);
+  HOOK (eh, check_special_symbol);
+  HOOK (eh, abi_cfi);
+
+  /* X0-X30 (31 regs) + SP + 1 Reserved + ELR, 30 Reserved regs (34-43)
+     + V0-V31 (32 regs, least significant 64 bits only)
+     + ALT_FRAME_RETURN_COLUMN (used when LR isn't used) = 97 DWARF regs. */
+  eh->frame_nregs = 97;
+  HOOK (eh, set_initial_registers_tid);
+
+  return MODVERSION;
+}
diff --git a/backends/aarch64_initreg.c b/backends/aarch64_initreg.c
new file mode 100644 (file)
index 0000000..9706205
--- /dev/null
@@ -0,0 +1,92 @@
+/* Fetch live process registers from TID.
+   Copyright (C) 2013, 2014 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 "system.h"
+#include <assert.h>
+#ifdef __aarch64__
+# include <linux/uio.h>
+# include <sys/user.h>
+# include <sys/ptrace.h>
+/* Deal with old glibc defining user_pt_regs instead of user_regs_struct.  */
+# ifndef HAVE_SYS_USER_REGS
+#  define user_regs_struct user_pt_regs
+#  define user_fpsimd_struct user_fpsimd_state
+# endif
+#endif
+
+#define BACKEND aarch64_
+#include "libebl_CPU.h"
+
+bool
+aarch64_set_initial_registers_tid (pid_t tid __attribute__ ((unused)),
+                         ebl_tid_registers_t *setfunc __attribute__ ((unused)),
+                               void *arg __attribute__ ((unused)))
+{
+#ifndef __aarch64__
+  return false;
+#else /* __aarch64__ */
+
+  /* General registers.  */
+  struct user_regs_struct gregs;
+  struct iovec iovec;
+  iovec.iov_base = &gregs;
+  iovec.iov_len = sizeof (gregs);
+  if (ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iovec) != 0)
+    return false;
+
+  /* X0..X30 plus SP.  */
+  if (! setfunc (0, 32, (Dwarf_Word *) &gregs.regs[0], arg))
+    return false;
+
+  /* PC.  */
+  if (! setfunc (-1, 1, (Dwarf_Word *) &gregs.pc, arg))
+    return false;
+
+  /* ELR cannot be found.  */
+
+  /* FP registers (only 64bits are used).  */
+  struct user_fpsimd_struct fregs;
+  iovec.iov_base = &fregs;
+  iovec.iov_len = sizeof (fregs);
+  if (ptrace (PTRACE_GETREGSET, tid, NT_FPREGSET, &iovec) != 0)
+    return false;
+
+  Dwarf_Word dwarf_fregs[32];
+  for (int r = 0; r < 32; r++)
+    dwarf_fregs[r] = fregs.vregs[r] & 0xFFFFFFFF;
+
+  if (! setfunc (64, 32, dwarf_fregs, arg))
+    return false;
+
+  return true;
+#endif /* __aarch64__ */
+}
diff --git a/backends/aarch64_regs.c b/backends/aarch64_regs.c
new file mode 100644 (file)
index 0000000..7a8a678
--- /dev/null
@@ -0,0 +1,102 @@
+/* Register names and numbers for AArch64 DWARF.
+   Copyright (C) 2013, 2014 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 <stdio.h>
+#include <string.h>
+#include <dwarf.h>
+#include <stdarg.h>
+
+#define BACKEND aarch64_
+#include "libebl_CPU.h"
+
+ssize_t
+aarch64_register_info (Ebl *ebl __attribute__ ((unused)),
+                      int regno, char *name, size_t namelen,
+                      const char **prefix, const char **setnamep,
+                      int *bits, int *typep)
+{
+  if (name == NULL)
+    return 128;
+
+  __attribute__ ((format (printf, 3, 4)))
+  ssize_t
+  regtype (const char *setname, int type, const char *fmt, ...)
+  {
+    *setnamep = setname;
+    *typep = type;
+
+    va_list ap;
+    va_start (ap, fmt);
+    int s = vsnprintf (name, namelen, fmt, ap);
+    va_end(ap);
+
+    if (s < 0 || (unsigned) s >= namelen)
+      return -1;
+    return s + 1;
+  }
+
+  *prefix = "";
+  *bits = 64;
+
+  switch (regno)
+    {
+    case 0 ... 30:
+      return regtype ("integer", DW_ATE_signed, "x%d", regno);
+
+    case 31:
+      return regtype ("integer", DW_ATE_address, "sp");
+
+    case 32:
+      return 0;
+
+    case 33:
+      return regtype ("integer", DW_ATE_address, "elr");
+
+    case 34 ... 63:
+      return 0;
+
+    case 64 ... 95:
+      /* FP/SIMD register file supports a variety of data types--it
+        can be thought of as a register holding a single integer or
+        floating-point value, or a vector of 8-, 16-, 32- or 64-bit
+        integers.  128-bit quad-word is the only singular value that
+        covers the whole register, so mark the register thus.  */
+      *bits = 128;
+      return regtype ("FP/SIMD", DW_ATE_unsigned, "v%d", regno - 64);
+
+    case 96 ... 127:
+      return 0;
+
+    default:
+      return -1;
+    }
+}
diff --git a/backends/aarch64_reloc.def b/backends/aarch64_reloc.def
new file mode 100644 (file)
index 0000000..36d29e6
--- /dev/null
@@ -0,0 +1,157 @@
+/* List the relocation types for AArch64.  -*- C -*-
+   Copyright (C) 2013, 2014 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/>.  */
+
+/*         NAME,               REL|EXEC|DYN    */
+
+RELOC_TYPE (ABS64,             REL|EXEC|DYN)
+RELOC_TYPE (ABS32,             REL|EXEC|DYN)
+RELOC_TYPE (COPY,              EXEC)
+RELOC_TYPE (GLOB_DAT,          EXEC|DYN)
+RELOC_TYPE (JUMP_SLOT,         EXEC|DYN)
+RELOC_TYPE (RELATIVE,          EXEC|DYN)
+RELOC_TYPE (TLS_DTPMOD64,      EXEC|DYN)
+RELOC_TYPE (TLS_DTPREL64,      EXEC|DYN)
+RELOC_TYPE (TLS_TPREL64,       EXEC|DYN)
+RELOC_TYPE (TLSDESC,           EXEC|DYN)
+
+/* R_AARCH64_NONE records that the section containing the place to be
+   relocated depends on the section defining the symbol mentioned in
+   the relocation directive[.]  (ARM IHI 0056B).  */
+RELOC_TYPE (NONE,              REL)
+
+RELOC_TYPE (ABS16,             REL)
+RELOC_TYPE (PREL64,            REL)
+RELOC_TYPE (PREL32,            REL)
+RELOC_TYPE (PREL16,            REL)
+RELOC_TYPE (MOVW_UABS_G0,      REL)
+RELOC_TYPE (MOVW_UABS_G0_NC,   REL)
+RELOC_TYPE (MOVW_UABS_G1,      REL)
+RELOC_TYPE (MOVW_UABS_G1_NC,   REL)
+RELOC_TYPE (MOVW_UABS_G2,      REL)
+RELOC_TYPE (MOVW_UABS_G2_NC,   REL)
+RELOC_TYPE (MOVW_UABS_G3,      REL)
+RELOC_TYPE (MOVW_SABS_G0,      REL)
+RELOC_TYPE (MOVW_SABS_G1,      REL)
+RELOC_TYPE (MOVW_SABS_G2,      REL)
+RELOC_TYPE (LD_PREL_LO19,      REL)
+RELOC_TYPE (ADR_PREL_LO21,     REL)
+RELOC_TYPE (ADR_PREL_PG_HI21,  REL)
+RELOC_TYPE (ADR_PREL_PG_HI21_NC, REL)
+RELOC_TYPE (ADD_ABS_LO12_NC,   REL)
+RELOC_TYPE (LDST8_ABS_LO12_NC, REL)
+RELOC_TYPE (LDST16_ABS_LO12_NC,        REL)
+RELOC_TYPE (LDST32_ABS_LO12_NC,        REL)
+RELOC_TYPE (LDST64_ABS_LO12_NC,        REL)
+RELOC_TYPE (LDST128_ABS_LO12_NC, REL)
+RELOC_TYPE (TSTBR14,           REL)
+RELOC_TYPE (CONDBR19,          REL)
+RELOC_TYPE (JUMP26,            REL)
+RELOC_TYPE (CALL26,            REL)
+RELOC_TYPE (MOVW_PREL_G0,      REL)
+RELOC_TYPE (MOVW_PREL_G0_NC,   REL)
+RELOC_TYPE (MOVW_PREL_G1,      REL)
+RELOC_TYPE (MOVW_PREL_G1_NC,   REL)
+RELOC_TYPE (MOVW_PREL_G2,      REL)
+RELOC_TYPE (MOVW_PREL_G2_NC,   REL)
+RELOC_TYPE (MOVW_PREL_G3,      REL)
+RELOC_TYPE (MOVW_GOTOFF_G0,    REL)
+RELOC_TYPE (MOVW_GOTOFF_G0_NC, REL)
+RELOC_TYPE (MOVW_GOTOFF_G1,    REL)
+RELOC_TYPE (MOVW_GOTOFF_G1_NC, REL)
+RELOC_TYPE (MOVW_GOTOFF_G2,    REL)
+RELOC_TYPE (MOVW_GOTOFF_G2_NC, REL)
+RELOC_TYPE (MOVW_GOTOFF_G3,    REL)
+RELOC_TYPE (GOTREL64,          REL)
+RELOC_TYPE (GOTREL32,          REL)
+RELOC_TYPE (GOT_LD_PREL19,     REL)
+RELOC_TYPE (LD64_GOTOFF_LO15,  REL)
+RELOC_TYPE (ADR_GOT_PAGE,      REL)
+RELOC_TYPE (LD64_GOT_LO12_NC,  REL)
+RELOC_TYPE (LD64_GOTPAGE_LO15, REL)
+RELOC_TYPE (TLSGD_ADR_PREL21,  REL)
+RELOC_TYPE (TLSGD_ADR_PAGE21,  REL)
+RELOC_TYPE (TLSGD_ADD_LO12_NC, REL)
+RELOC_TYPE (TLSGD_MOVW_G1,     REL)
+RELOC_TYPE (TLSGD_MOVW_G0_NC,  REL)
+RELOC_TYPE (TLSLD_ADR_PREL21,  REL)
+RELOC_TYPE (TLSLD_ADR_PAGE21,  REL)
+RELOC_TYPE (TLSLD_ADD_LO12_NC, REL)
+RELOC_TYPE (TLSLD_MOVW_G1,     REL)
+RELOC_TYPE (TLSLD_MOVW_G0_NC,  REL)
+RELOC_TYPE (TLSLD_LD_PREL19,   REL)
+RELOC_TYPE (TLSLD_MOVW_DTPREL_G2,      REL)
+RELOC_TYPE (TLSLD_MOVW_DTPREL_G1,      REL)
+RELOC_TYPE (TLSLD_MOVW_DTPREL_G1_NC,   REL)
+RELOC_TYPE (TLSLD_MOVW_DTPREL_G0,      REL)
+RELOC_TYPE (TLSLD_MOVW_DTPREL_G0_NC,   REL)
+RELOC_TYPE (TLSLD_ADD_DTPREL_HI12,     REL)
+RELOC_TYPE (TLSLD_ADD_DTPREL_LO12,     REL)
+RELOC_TYPE (TLSLD_ADD_DTPREL_LO12_NC,  REL)
+RELOC_TYPE (TLSLD_LDST8_DTPREL_LO12,   REL)
+RELOC_TYPE (TLSLD_LDST8_DTPREL_LO12_NC,        REL)
+RELOC_TYPE (TLSLD_LDST16_DTPREL_LO12,  REL)
+RELOC_TYPE (TLSLD_LDST16_DTPREL_LO12_NC, REL)
+RELOC_TYPE (TLSLD_LDST32_DTPREL_LO12,  REL)
+RELOC_TYPE (TLSLD_LDST32_DTPREL_LO12_NC, REL)
+RELOC_TYPE (TLSLD_LDST64_DTPREL_LO12,  REL)
+RELOC_TYPE (TLSLD_LDST64_DTPREL_LO12_NC, REL)
+RELOC_TYPE (TLSLD_LDST128_DTPREL_LO12, REL)
+RELOC_TYPE (TLSLD_LDST128_DTPREL_LO12_NC, REL)
+RELOC_TYPE (TLSIE_MOVW_GOTTPREL_G1,    REL)
+RELOC_TYPE (TLSIE_MOVW_GOTTPREL_G0_NC, REL)
+RELOC_TYPE (TLSIE_ADR_GOTTPREL_PAGE21, REL)
+RELOC_TYPE (TLSIE_LD64_GOTTPREL_LO12_NC, REL)
+RELOC_TYPE (TLSIE_LD_GOTTPREL_PREL19,  REL)
+RELOC_TYPE (TLSLE_MOVW_TPREL_G2,       REL)
+RELOC_TYPE (TLSLE_MOVW_TPREL_G1,       REL)
+RELOC_TYPE (TLSLE_MOVW_TPREL_G1_NC,    REL)
+RELOC_TYPE (TLSLE_MOVW_TPREL_G0,       REL)
+RELOC_TYPE (TLSLE_MOVW_TPREL_G0_NC,    REL)
+RELOC_TYPE (TLSLE_ADD_TPREL_HI12,      REL)
+RELOC_TYPE (TLSLE_ADD_TPREL_LO12,      REL)
+RELOC_TYPE (TLSLE_ADD_TPREL_LO12_NC,   REL)
+RELOC_TYPE (TLSLE_LDST8_TPREL_LO12,    REL)
+RELOC_TYPE (TLSLE_LDST8_TPREL_LO12_NC, REL)
+RELOC_TYPE (TLSLE_LDST16_TPREL_LO12,   REL)
+RELOC_TYPE (TLSLE_LDST16_TPREL_LO12_NC,        REL)
+RELOC_TYPE (TLSLE_LDST32_TPREL_LO12,   REL)
+RELOC_TYPE (TLSLE_LDST32_TPREL_LO12_NC,        REL)
+RELOC_TYPE (TLSLE_LDST64_TPREL_LO12,   REL)
+RELOC_TYPE (TLSLE_LDST64_TPREL_LO12_NC,        REL)
+RELOC_TYPE (TLSLE_LDST128_TPREL_LO12,  REL)
+RELOC_TYPE (TLSLE_LDST128_TPREL_LO12_NC, REL)
+RELOC_TYPE (TLSDESC_LD_PREL19,         REL)
+RELOC_TYPE (TLSDESC_ADR_PREL21,                REL)
+RELOC_TYPE (TLSDESC_ADR_PAGE21,                REL)
+RELOC_TYPE (TLSDESC_LD64_LO12,         REL)
+RELOC_TYPE (TLSDESC_ADD_LO12,          REL)
+RELOC_TYPE (TLSDESC_OFF_G1,            REL)
+RELOC_TYPE (TLSDESC_OFF_G0_NC,         REL)
+RELOC_TYPE (TLSDESC_LDR,               REL)
+RELOC_TYPE (TLSDESC_ADD,               REL)
+RELOC_TYPE (TLSDESC_CALL,              REL)
diff --git a/backends/aarch64_retval.c b/backends/aarch64_retval.c
new file mode 100644 (file)
index 0000000..68de307
--- /dev/null
@@ -0,0 +1,376 @@
+/* Function return value location for Linux/AArch64 ABI.
+   Copyright (C) 2013 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 <stdio.h>
+#include <inttypes.h>
+
+#include <assert.h>
+#include <dwarf.h>
+
+#define BACKEND aarch64_
+#include "libebl_CPU.h"
+
+static int
+skip_until (Dwarf_Die *child, int tag)
+{
+  int i;
+  while (DWARF_TAG_OR_RETURN (child) != tag)
+    if ((i = dwarf_siblingof (child, child)) != 0)
+      /* If there are no members, then this is not a HFA.  Errors
+        are propagated.  */
+      return i;
+  return 0;
+}
+
+static int
+dwarf_bytesize_aux (Dwarf_Die *die, Dwarf_Word *sizep)
+{
+  int bits;
+  if (((bits = 8 * dwarf_bytesize (die)) < 0
+       && (bits = dwarf_bitsize (die)) < 0)
+      || bits % 8 != 0)
+    return -1;
+
+  *sizep = bits / 8;
+  return 0;
+}
+
+/* HFA (Homogeneous Floating-point Aggregate) is an aggregate type
+   whose members are all of the same floating-point type, which is
+   then base type of this HFA.  Instead of being floating-point types
+   directly, members can instead themselves be HFA.  Such HFA fields
+   are handled as if their type were HFA base type.
+
+   This function returns 0 if TYPEDIE is HFA, 1 if it is not, or -1 if
+   there were errors.  In the former case, *SIZEP contains byte size
+   of the base type (e.g. 8 for IEEE double).  *COUNT is set to the
+   number of leaf members of the HFA.  */
+static int hfa_type (Dwarf_Die *ftypedie, int tag,
+                    Dwarf_Word *sizep, Dwarf_Word *countp);
+
+/* Return 0 if MEMBDIE refers to a member with a floating-point or HFA
+   type, or 1 if it's not.  Return -1 for errors.  The meaning of the
+   remaining arguments is as documented at hfa_type.  */
+static int
+member_is_fp (Dwarf_Die *membdie, Dwarf_Word *sizep, Dwarf_Word *countp)
+{
+  Dwarf_Die typedie;
+  int tag = dwarf_peeled_die_type (membdie, &typedie);
+  switch (tag)
+    {
+    case DW_TAG_base_type:;
+      Dwarf_Word encoding;
+      Dwarf_Attribute attr_mem;
+      if (dwarf_attr_integrate (&typedie, DW_AT_encoding, &attr_mem) == NULL
+         || dwarf_formudata (&attr_mem, &encoding) != 0)
+       return -1;
+
+      switch (encoding)
+       {
+       case DW_ATE_complex_float:
+         *countp = 2;
+         break;
+
+       case DW_ATE_float:
+         *countp = 1;
+         break;
+
+       default:
+         return 1;
+       }
+
+      if (dwarf_bytesize_aux (&typedie, sizep) < 0)
+       return -1;
+
+      *sizep /= *countp;
+      return 0;
+
+    case DW_TAG_structure_type:
+    case DW_TAG_union_type:
+    case DW_TAG_array_type:
+      return hfa_type (&typedie, tag, sizep, countp);
+    }
+
+  return 1;
+}
+
+static int
+hfa_type (Dwarf_Die *ftypedie, int tag, Dwarf_Word *sizep, Dwarf_Word *countp)
+{
+  assert (tag == DW_TAG_structure_type || tag == DW_TAG_class_type
+         || tag == DW_TAG_union_type || tag == DW_TAG_array_type);
+
+  int i;
+  if (tag == DW_TAG_array_type)
+    {
+      Dwarf_Word tot_size;
+      if (dwarf_aggregate_size (ftypedie, &tot_size) < 0)
+       return -1;
+
+      /* For vector types, we don't care about the underlying
+        type, but only about the vector type itself.  */
+      bool vec;
+      Dwarf_Attribute attr_mem;
+      if (dwarf_formflag (dwarf_attr_integrate (ftypedie, DW_AT_GNU_vector,
+                                               &attr_mem), &vec) == 0
+         && vec)
+       {
+         *sizep = tot_size;
+         *countp = 1;
+
+         return 0;
+       }
+
+      if ((i = member_is_fp (ftypedie, sizep, countp)) == 0)
+       {
+         *countp = tot_size / *sizep;
+         return 0;
+       }
+
+      return i;
+    }
+
+  /* Find first DW_TAG_member and determine its type.  */
+  Dwarf_Die member;
+  if ((i = dwarf_child (ftypedie, &member) != 0))
+    return i;
+
+  if ((i = skip_until (&member, DW_TAG_member)) != 0)
+    return i;
+
+  *countp = 0;
+  if ((i = member_is_fp (&member, sizep, countp)) != 0)
+    return i;
+
+  while ((i = dwarf_siblingof (&member, &member)) == 0
+        && (i = skip_until (&member, DW_TAG_member)) == 0)
+    {
+      Dwarf_Word size, count;
+      if ((i = member_is_fp (&member, &size, &count)) != 0)
+       return i;
+
+      if (*sizep != size)
+       return 1;
+
+      *countp += count;
+    }
+
+  /* At this point we already have at least one FP member, which means
+     FTYPEDIE is an HFA.  So either return 0, or propagate error.  */
+  return i < 0 ? i : 0;
+}
+
+static int
+pass_in_gpr (const Dwarf_Op **locp, Dwarf_Word size)
+{
+  static const Dwarf_Op loc[] =
+    {
+      { .atom = DW_OP_reg0 }, { .atom = DW_OP_piece, .number = 8 },
+      { .atom = DW_OP_reg1 }, { .atom = DW_OP_piece, .number = 8 }
+    };
+
+  *locp = loc;
+  return size <= 8 ? 1 : 4;
+}
+
+static int
+pass_by_ref (const Dwarf_Op **locp)
+{
+  static const Dwarf_Op loc[] = { { .atom = DW_OP_breg0 } };
+
+  *locp = loc;
+  return 1;
+}
+
+static int
+pass_hfa (const Dwarf_Op **locp, Dwarf_Word size, Dwarf_Word count)
+{
+  assert (count >= 1 && count <= 4);
+  assert (size == 2 || size == 4 || size == 8 || size == 16);
+
+#define DEFINE_FPREG(NAME, SIZE)               \
+  static const Dwarf_Op NAME[] = {             \
+    { .atom = DW_OP_regx, .number = 64 },      \
+    { .atom = DW_OP_piece, .number = SIZE },   \
+    { .atom = DW_OP_regx, .number = 65 },      \
+    { .atom = DW_OP_piece, .number = SIZE },   \
+    { .atom = DW_OP_regx, .number = 66 },      \
+    { .atom = DW_OP_piece, .number = SIZE },   \
+    { .atom = DW_OP_regx, .number = 67 },      \
+    { .atom = DW_OP_piece, .number = SIZE }    \
+  }
+
+  switch (size)
+    {
+    case 2:;
+      DEFINE_FPREG (loc_hfa_2, 2);
+      *locp = loc_hfa_2;
+      break;
+
+    case 4:;
+      DEFINE_FPREG (loc_hfa_4, 4);
+      *locp = loc_hfa_4;
+      break;
+
+    case 8:;
+      DEFINE_FPREG (loc_hfa_8, 8);
+      *locp = loc_hfa_8;
+      break;
+
+    case 16:;
+      DEFINE_FPREG (loc_hfa_16, 16);
+      *locp = loc_hfa_16;
+      break;
+    }
+#undef DEFINE_FPREG
+
+  return count == 1 ? 1 : 2 * count;
+}
+
+static int
+pass_in_simd (const Dwarf_Op **locp)
+{
+  /* This is like passing single-element HFA.  Size doesn't matter, so
+     pretend it's for example double.  */
+  return pass_hfa (locp, 8, 1);
+}
+
+int
+aarch64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
+{
+  /* Start with the function's type, and get the DW_AT_type attribute,
+     which is the type of the return value.  */
+  Dwarf_Die typedie;
+  int tag = dwarf_peeled_die_type (functypedie, &typedie);
+  if (tag <= 0)
+    return tag;
+
+  Dwarf_Word size = (Dwarf_Word)-1;
+
+  /* If the argument type is a Composite Type that is larger than 16
+     bytes, then the argument is copied to memory allocated by the
+     caller and the argument is replaced by a pointer to the copy.  */
+  if (tag == DW_TAG_structure_type || tag == DW_TAG_union_type
+      || tag == DW_TAG_class_type || tag == DW_TAG_array_type)
+    {
+      Dwarf_Word base_size, count;
+      switch (hfa_type (&typedie, tag, &base_size, &count))
+       {
+       default:
+         return -1;
+
+       case 0:
+         assert (count > 0);
+         if (count <= 4)
+           return pass_hfa (locp, base_size, count);
+         /* Fall through.  */
+
+       case 1:
+         /* Not a HFA.  */
+         if (dwarf_aggregate_size (&typedie, &size) < 0)
+           return -1;
+         if (size > 16)
+           return pass_by_ref (locp);
+       }
+    }
+
+  if (tag == DW_TAG_base_type
+      || tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
+    {
+      if (dwarf_bytesize_aux (&typedie, &size) < 0)
+       {
+         if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
+           size = 8;
+         else
+           return -1;
+       }
+
+      Dwarf_Attribute attr_mem;
+      if (tag == DW_TAG_base_type)
+       {
+         Dwarf_Word encoding;
+         if (dwarf_formudata (dwarf_attr_integrate (&typedie, DW_AT_encoding,
+                                                    &attr_mem),
+                              &encoding) != 0)
+           return -1;
+
+         switch (encoding)
+           {
+             /* If the argument is a Half-, Single-, Double- or Quad-
+                precision Floating-point [...] the argument is allocated
+                to the least significant bits of register v[NSRN].  */
+           case DW_ATE_float:
+             switch (size)
+               {
+               case 2: /* half */
+               case 4: /* sigle */
+               case 8: /* double */
+               case 16: /* quad */
+                 return pass_in_simd (locp);
+
+               default:
+                 return -2;
+               }
+
+           case DW_ATE_complex_float:
+             switch (size)
+               {
+               case 8: /* float _Complex */
+               case 16: /* double _Complex */
+               case 32: /* long double _Complex */
+                 return pass_hfa (locp, size / 2, 2);
+
+               default:
+                 return -2;
+               }
+
+             /* If the argument is an Integral or Pointer Type, the
+                size of the argument is less than or equal to 8 bytes
+                [...] the argument is copied to the least significant
+                bits in x[NGRN].  */
+           case DW_ATE_boolean:
+           case DW_ATE_signed:
+           case DW_ATE_unsigned:
+           case DW_ATE_unsigned_char:
+           case DW_ATE_signed_char:
+             return pass_in_gpr (locp, size);
+           }
+
+         return -2;
+       }
+      else
+       return pass_in_gpr (locp, size);
+    }
+
+  *locp = NULL;
+  return 0;
+}
diff --git a/backends/aarch64_symbol.c b/backends/aarch64_symbol.c
new file mode 100644 (file)
index 0000000..3fdc9cf
--- /dev/null
@@ -0,0 +1,87 @@
+/* AArch64 specific symbolic name handling.
+   Copyright (C) 2013 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 <elf.h>
+#include <stddef.h>
+#include <string.h>
+
+#define BACKEND                aarch64_
+#include "libebl_CPU.h"
+
+
+/* Check for the simple reloc types.  */
+Elf_Type
+aarch64_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type)
+{
+  switch (type)
+    {
+    case R_AARCH64_ABS64:
+      return ELF_T_XWORD;
+    case R_AARCH64_ABS32:
+      return ELF_T_WORD;
+    case R_AARCH64_ABS16:
+      return ELF_T_HALF;
+
+    default:
+      return ELF_T_NUM;
+    }
+}
+
+/* If this is the _GLOBAL_OFFSET_TABLE_ symbol, then it should point to
+   .got[0] even if there is a .got.plt section.  */
+bool
+aarch64_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr, const GElf_Sym *sym,
+                              const char *name, const GElf_Shdr *destshdr)
+{
+  if (name != NULL
+      && strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
+    {
+      const char *sname = elf_strptr (elf, ehdr->e_shstrndx, destshdr->sh_name);
+      if (sname != NULL && strcmp (sname, ".got.plt") == 0)
+       {
+         Elf_Scn *scn = NULL;
+         while ((scn = elf_nextscn (elf, scn)) != NULL)
+           {
+             GElf_Shdr shdr_mem;
+             GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+             if (shdr != NULL)
+               {
+                 sname = elf_strptr (elf, ehdr->e_shstrndx, shdr->sh_name);
+                 if (sname != NULL && strcmp (sname, ".got") == 0)
+                   return sym->st_value == shdr->sh_addr;
+               }
+           }
+       }
+    }
+
+  return false;
+}
index 62cbfc7..53dbfa4 100644 (file)
@@ -1,5 +1,5 @@
 /* Function return value location for Alpha ELF ABI.
-   Copyright (C) 2005, 2007 Red Hat, Inc.
+   Copyright (C) 2005, 2007, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -67,27 +67,10 @@ alpha_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
 {
   /* Start with the function's type, and get the DW_AT_type attribute,
      which is the type of the return value.  */
-
-  Dwarf_Attribute attr_mem;
-  Dwarf_Attribute *attr = dwarf_attr_integrate (functypedie, DW_AT_type,
-                                               &attr_mem);
-  if (attr == NULL)
-    /* The function has no return value, like a `void' function in C.  */
-    return 0;
-
-  Dwarf_Die die_mem;
-  Dwarf_Die *typedie = dwarf_formref_die (attr, &die_mem);
-  int tag = dwarf_tag (typedie);
-
-  /* Follow typedefs and qualifiers to get to the actual type.  */
-  while (tag == DW_TAG_typedef
-        || tag == DW_TAG_const_type || tag == DW_TAG_volatile_type
-        || tag == DW_TAG_restrict_type || tag == DW_TAG_mutable_type)
-    {
-      attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
-      typedie = dwarf_formref_die (attr, &die_mem);
-      tag = dwarf_tag (typedie);
-    }
+  Dwarf_Die die_mem, *typedie = &die_mem;
+  int tag = dwarf_peeled_die_type (functypedie, typedie);
+  if (tag <= 0)
+    return tag;
 
   switch (tag)
     {
@@ -97,9 +80,10 @@ alpha_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_subrange_type:
       if (! dwarf_hasattr_integrate (typedie, DW_AT_byte_size))
        {
+         Dwarf_Attribute attr_mem, *attr;
          attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
          typedie = dwarf_formref_die (attr, &die_mem);
-         tag = dwarf_tag (typedie);
+         tag = DWARF_TAG_OR_RETURN (typedie);
        }
       /* Fall through.  */
 
@@ -108,6 +92,7 @@ alpha_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_pointer_type:
     case DW_TAG_ptr_to_member_type:
       {
+       Dwarf_Attribute attr_mem;
        Dwarf_Word size;
        if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
                                                   &attr_mem), &size) != 0)
diff --git a/backends/arm_cfi.c b/backends/arm_cfi.c
new file mode 100644 (file)
index 0000000..971a1fc
--- /dev/null
@@ -0,0 +1,90 @@
+/* arm ABI-specified defaults for DWARF CFI.
+   Copyright (C) 2013 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 <dwarf.h>
+
+#define BACKEND arm_
+#include "libebl_CPU.h"
+
+
+/* ABI-specified state of DWARF CFI based on:
+
+   "DWARF for the ARM Architecture ABI r2.09"
+http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040b/IHI0040B_aadwarf.pdf
+
+   "Procedure Call Standard for the ARM Architecture ABI r2.09"
+http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf
+*/
+
+int
+arm_abi_cfi (Ebl *ebl __attribute__ ((unused)), Dwarf_CIE *abi_info)
+{
+  static const uint8_t abi_cfi[] =
+    {
+      /* The initial Canonical Frame Address is the value of the
+         Stack Pointer (r13) as setup in the previous frame. */
+      DW_CFA_def_cfa, ULEB128_7 (13), ULEB128_7 (0),
+
+      /* The Stack Pointer (r13) is restored from CFA address by default.  */
+      DW_CFA_val_offset, ULEB128_7 (13), ULEB128_7 (0),
+
+#define SV(n) DW_CFA_same_value, ULEB128_7 (n)
+      /* Callee-saved regs r4-r8, r10, r11.  */
+      SV (4), SV (5), SV (6), SV (7), SV (8), SV (10), SV (11),
+
+      /* The link register contains the return address setup by caller.  */
+      SV (14),
+      DW_CFA_register, ULEB128_7 (15), ULEB128_7 (14), /* pc = lr */
+#undef SV
+
+      /* VFP S16-S31/D8-D15/Q4-Q7 are callee saved.
+         And uleb128 encoded with two bytes.  */
+#define ULEB128_8_2(x) ((x & 0x7f) | 0x80), 0x02
+#define SV(n) DW_CFA_same_value, ULEB128_8_2 (n)
+      SV (264), SV (265), SV (266), SV (267),
+      SV (268), SV (269), SV (270), SV (271),
+
+      /* XXX Note: registers intentionally unused by the program,
+        for example as a consequence of the procedure call standard
+        should be initialized as if by DW_CFA_same_value.  */
+    };
+#undef ULEB128_8_2
+#undef SV
+
+  abi_info->initial_instructions = abi_cfi;
+  abi_info->initial_instructions_end = &abi_cfi[sizeof abi_cfi];
+  abi_info->data_alignment_factor = 4;
+
+  abi_info->return_address_register = 15; /* pc.  */
+
+  return 0;
+}
index f73ab89..c5d8d88 100644 (file)
@@ -1,5 +1,5 @@
 /* ARM specific core note handling.
-   Copyright (C) 2009 Red Hat, Inc.
+   Copyright (C) 2009, 2012 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -58,7 +58,7 @@ static const Ebl_Register_Location fpregset_regs[] =
   {
     { .offset = 0, .regno = 96, .count = 8, .bits = 96 }, /* f0..f7 */
   };
-#define FPREGSET_SIZE  140
+#define FPREGSET_SIZE  116
 
 #define        ULONG                   uint32_t
 #define PID_T                  int32_t
@@ -73,4 +73,22 @@ static const Ebl_Register_Location fpregset_regs[] =
 #define TYPE_UID_T             ELF_T_HALF
 #define TYPE_GID_T             ELF_T_HALF
 
+#define ARM_VFPREGS_SIZE ( 32 * 8 /*fpregs*/ + 4 /*fpscr*/ )
+static const Ebl_Register_Location vfp_regs[] =
+  {
+    { .offset = 0, .regno = 256, .count = 32, .bits = 64 }, /* fpregs */
+  };
+
+static const Ebl_Core_Item vfp_items[] =
+  {
+    {
+      .name = "fpscr", .group = "register",
+      .offset = 0,
+      .type = ELF_T_WORD, .format = 'x',
+    },
+  };
+
+#define        EXTRA_NOTES \
+  EXTRA_REGSET_ITEMS (NT_ARM_VFP, ARM_VFPREGS_SIZE, vfp_regs, vfp_items)
+
 #include "linux-core-note.c"
index 38bd4eb..3283c97 100644 (file)
@@ -1,5 +1,5 @@
 /* Initialization of Arm specific backend library.
-   Copyright (C) 2002, 2005, 2009 Red Hat, Inc.
+   Copyright (C) 2002, 2005, 2009, 2013, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -62,6 +62,15 @@ arm_init (elf, machine, eh, ehlen)
   HOOK (eh, auxv_info);
   HOOK (eh, check_object_attribute);
   HOOK (eh, return_value_location);
+  HOOK (eh, abi_cfi);
+  HOOK (eh, check_reloc_target_type);
+
+  /* We only unwind the core integer registers.  */
+  eh->frame_nregs = 16;
+  HOOK (eh, set_initial_registers_tid);
+
+  /* Bit zero encodes whether an function address is THUMB or ARM. */
+  eh->func_addr_mask = ~(GElf_Addr)1;
 
   return MODVERSION;
 }
diff --git a/backends/arm_initreg.c b/backends/arm_initreg.c
new file mode 100644 (file)
index 0000000..a0a9be9
--- /dev/null
@@ -0,0 +1,92 @@
+/* Fetch live process registers from TID.
+   Copyright (C) 2014 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
+
+#if defined __arm__
+# include <sys/types.h>
+# include <sys/user.h>
+# include <sys/ptrace.h>
+#endif
+
+#ifdef __aarch64__
+# include <linux/uio.h>
+# include <sys/user.h>
+# include <sys/ptrace.h>
+/* Deal with old glibc defining user_pt_regs instead of user_regs_struct.  */
+# ifndef HAVE_SYS_USER_REGS
+#  define user_regs_struct user_pt_regs
+# endif
+#endif
+
+#define BACKEND arm_
+#include "libebl_CPU.h"
+
+bool
+arm_set_initial_registers_tid (pid_t tid __attribute__ ((unused)),
+                         ebl_tid_registers_t *setfunc __attribute__ ((unused)),
+                              void *arg __attribute__ ((unused)))
+{
+#if !defined __arm__ && !defined __aarch64__
+  return false;
+#else  /* __arm__ || __aarch64__ */
+#if defined __arm__
+  struct user_regs user_regs;
+  if (ptrace (PTRACE_GETREGS, tid, NULL, &user_regs) != 0)
+    return false;
+
+  Dwarf_Word dwarf_regs[16];
+  /* R0..R12 SP LR PC */
+  for (int i = 0; i < 16; i++)
+    dwarf_regs[i] = user_regs.uregs[i];
+
+  return setfunc (0, 16, dwarf_regs, arg);
+#elif defined __aarch64__
+  /* Compat mode: arm compatible code running on aarch64 */
+  int i;
+  struct user_regs_struct gregs;
+  struct iovec iovec;
+  iovec.iov_base = &gregs;
+  iovec.iov_len = sizeof (gregs);
+  if (ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iovec) != 0)
+    return false;
+
+  Dwarf_Word dwarf_regs[16];
+  /* R0..R12 SP LR PC, encoded as 32 bit quantities */
+  uint32_t *u32_ptr = (uint32_t *) &gregs.regs[0];
+  for (i = 0; i < 16; i++)
+    dwarf_regs[i] = u32_ptr[i];
+
+  return setfunc (0, 16, dwarf_regs, arg);
+#else
+# error "source file error, it cannot happen"
+#endif
+#endif
+}
index 0155149..21c5ad3 100644 (file)
@@ -48,7 +48,7 @@ arm_register_info (Ebl *ebl __attribute__ ((unused)),
   if (regno < 0 || regno > 320 || namelen < 5)
     return -1;
 
-  *prefix = NULL;
+  *prefix = "";
   *bits = 32;
   *type = DW_ATE_signed;
   *setname = "integer";
index eeb2160..4b7894b 100644 (file)
@@ -1,5 +1,5 @@
 /* List the relocation types for arm.  -*- C -*-
-   Copyright (C) 2005-2010 Red Hat, Inc.
+   Copyright (C) 2005-2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -41,7 +41,7 @@ RELOC_TYPE (SBREL32,          REL)
 RELOC_TYPE (THM_PC22,          REL)
 RELOC_TYPE (THM_PC8,           REL)
 RELOC_TYPE (AMP_VCALL9,                REL)
-RELOC_TYPE (SWI24,             REL)
+RELOC_TYPE (TLS_DESC,          EXEC|DYN)
 RELOC_TYPE (THM_SWI8,          REL)
 RELOC_TYPE (XPC25,             REL)
 RELOC_TYPE (THM_XPC22,         REL)
@@ -56,12 +56,78 @@ RELOC_TYPE (GOTOFF,         REL)
 RELOC_TYPE (GOTPC,             REL)
 RELOC_TYPE (GOT32,             REL)
 RELOC_TYPE (PLT32,             REL)
+RELOC_TYPE (CALL,              REL)
+RELOC_TYPE (JUMP24,            REL)
+RELOC_TYPE (THM_JUMP24,                REL)
+RELOC_TYPE (BASE_ABS,          REL)
 RELOC_TYPE (ALU_PCREL_7_0,     REL)
 RELOC_TYPE (ALU_PCREL_15_8,    REL)
 RELOC_TYPE (ALU_PCREL_23_15,   REL)
 RELOC_TYPE (LDR_SBREL_11_0,    REL)
 RELOC_TYPE (ALU_SBREL_19_12,   REL)
 RELOC_TYPE (ALU_SBREL_27_20,   REL)
+RELOC_TYPE (TARGET1,           REL)
+RELOC_TYPE (SBREL31,           REL)
+RELOC_TYPE (V4BX,              REL)
+RELOC_TYPE (TARGET2,           REL)
+RELOC_TYPE (PREL31,            REL)
+RELOC_TYPE (MOVW_ABS_NC,       REL)
+RELOC_TYPE (MOVT_ABS,          REL)
+RELOC_TYPE (MOVW_PREL_NC,      REL)
+RELOC_TYPE (MOVT_PREL,         REL)
+RELOC_TYPE (THM_MOVW_ABS_NC,   REL)
+RELOC_TYPE (THM_MOVT_ABS,      REL)
+RELOC_TYPE (THM_MOVW_PREL_NC,  REL)
+RELOC_TYPE (THM_MOVT_PREL,     REL)
+RELOC_TYPE (THM_JUMP19,                REL)
+RELOC_TYPE (THM_JUMP6,         REL)
+RELOC_TYPE (THM_ALU_PREL_11_0, REL)
+RELOC_TYPE (THM_PC12,          REL)
+RELOC_TYPE (ABS32_NOI,         REL)
+RELOC_TYPE (REL32_NOI,         REL)
+RELOC_TYPE (ALU_PC_G0_NC,      REL)
+RELOC_TYPE (ALU_PC_G0,         REL)
+RELOC_TYPE (ALU_PC_G1_NC,      REL)
+RELOC_TYPE (ALU_PC_G1,         REL)
+RELOC_TYPE (ALU_PC_G2,         REL)
+RELOC_TYPE (LDR_PC_G1,         REL)
+RELOC_TYPE (LDR_PC_G2,         REL)
+RELOC_TYPE (LDRS_PC_G0,                REL)
+RELOC_TYPE (LDRS_PC_G1,                REL)
+RELOC_TYPE (LDRS_PC_G2,                REL)
+RELOC_TYPE (LDC_PC_G0,         REL)
+RELOC_TYPE (LDC_PC_G1,         REL)
+RELOC_TYPE (LDC_PC_G2,         REL)
+RELOC_TYPE (ALU_SB_G0_NC,      REL)
+RELOC_TYPE (ALU_SB_G0,         REL)
+RELOC_TYPE (ALU_SB_G1_NC,      REL)
+RELOC_TYPE (ALU_SB_G1,         REL)
+RELOC_TYPE (ALU_SB_G2,         REL)
+RELOC_TYPE (LDR_SB_G0,         REL)
+RELOC_TYPE (LDR_SB_G1,         REL)
+RELOC_TYPE (LDR_SB_G2,         REL)
+RELOC_TYPE (LDRS_SB_G0,                REL)
+RELOC_TYPE (LDRS_SB_G1,                REL)
+RELOC_TYPE (LDRS_SB_G2,                REL)
+RELOC_TYPE (LDC_SB_G0,         REL)
+RELOC_TYPE (LDC_SB_G1,         REL)
+RELOC_TYPE (LDC_SB_G2,         REL)
+RELOC_TYPE (MOVW_BREL_NC,      REL)
+RELOC_TYPE (MOVT_BREL,         REL)
+RELOC_TYPE (MOVW_BREL,         REL)
+RELOC_TYPE (THM_MOVW_BREL_NC,  REL)
+RELOC_TYPE (THM_MOVT_BREL,     REL)
+RELOC_TYPE (THM_MOVW_BREL,     REL)
+RELOC_TYPE (TLS_GOTDESC,       REL)
+RELOC_TYPE (TLS_CALL,          REL)
+RELOC_TYPE (TLS_DESCSEQ,       REL)
+RELOC_TYPE (THM_TLS_CALL,      REL)
+RELOC_TYPE (PLT32_ABS,         REL)
+RELOC_TYPE (GOT_ABS,           REL)
+RELOC_TYPE (GOT_PREL,          REL)
+RELOC_TYPE (GOT_BREL12,                REL)
+RELOC_TYPE (GOTOFF12,          REL)
+RELOC_TYPE (GOTRELAX,          REL)
 RELOC_TYPE (GNU_VTENTRY,       REL)
 RELOC_TYPE (GNU_VTINHERIT,     REL)
 RELOC_TYPE (THM_PC11,          REL)
@@ -71,6 +137,17 @@ RELOC_TYPE (TLS_LDM32,              REL)
 RELOC_TYPE (TLS_LDO32,         REL)
 RELOC_TYPE (TLS_IE32,          REL)
 RELOC_TYPE (TLS_LE32,          REL)
+RELOC_TYPE (TLS_LDO12,         REL)
+RELOC_TYPE (TLS_LE12,          REL)
+RELOC_TYPE (TLS_IE12GP,                REL)
+
+RELOC_TYPE (ME_TOO,            REL)
+RELOC_TYPE (THM_TLS_DESCSEQ16, REL)
+RELOC_TYPE (THM_TLS_DESCSEQ32, REL)
+RELOC_TYPE (THM_GOT_BREL12,    REL)
+
+RELOC_TYPE (IRELATIVE,         EXEC|DYN)
+
 RELOC_TYPE (RXPC25,            REL)
 RELOC_TYPE (RSBREL32,          REL)
 RELOC_TYPE (THM_RPC22,         REL)
index 0c33c5b..7aced74 100644 (file)
@@ -1,5 +1,5 @@
 /* Function return value location for ARM EABI.
-   Copyright (C) 2009-2010 Red Hat, Inc.
+   Copyright (C) 2009-2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -63,27 +63,10 @@ arm_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
 {
   /* Start with the function's type, and get the DW_AT_type attribute,
      which is the type of the return value.  */
-
-  Dwarf_Attribute attr_mem;
-  Dwarf_Attribute *attr = dwarf_attr_integrate (functypedie, DW_AT_type,
-                                               &attr_mem);
-  if (attr == NULL)
-    /* The function has no return value, like a `void' function in C.  */
-    return 0;
-
-  Dwarf_Die die_mem;
-  Dwarf_Die *typedie = dwarf_formref_die (attr, &die_mem);
-  int tag = dwarf_tag (typedie);
-
-  /* Follow typedefs and qualifiers to get to the actual type.  */
-  while (tag == DW_TAG_typedef
-        || tag == DW_TAG_const_type || tag == DW_TAG_volatile_type
-        || tag == DW_TAG_restrict_type || tag == DW_TAG_mutable_type)
-    {
-      attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
-      typedie = dwarf_formref_die (attr, &die_mem);
-      tag = dwarf_tag (typedie);
-    }
+  Dwarf_Die die_mem, *typedie = &die_mem;
+  int tag = dwarf_peeled_die_type (functypedie, typedie);
+  if (tag <= 0)
+    return tag;
 
   Dwarf_Word size;
   switch (tag)
@@ -94,9 +77,10 @@ arm_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_subrange_type:
       if (! dwarf_hasattr_integrate (typedie, DW_AT_byte_size))
        {
+         Dwarf_Attribute attr_mem, *attr;
          attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
          typedie = dwarf_formref_die (attr, &die_mem);
-         tag = dwarf_tag (typedie);
+         tag = DWARF_TAG_OR_RETURN (typedie);
        }
       /* Fall through.  */
 
@@ -104,24 +88,27 @@ arm_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_enumeration_type:
     case DW_TAG_pointer_type:
     case DW_TAG_ptr_to_member_type:
-      if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
-                                                &attr_mem), &size) != 0)
-       {
-         if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
-           size = 4;
-         else
-           return -1;
-       }
-      if (size <= 16)
-       {
-       intreg:
-         *locp = loc_intreg;
-         return size <= 4 ? nloc_intreg : nloc_intregs ((size + 3) / 4);
-       }
-
-    aggregate:
-      *locp = loc_aggregate;
-      return nloc_aggregate;
+      {
+       Dwarf_Attribute attr_mem;
+       if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
+                                                  &attr_mem), &size) != 0)
+         {
+           if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
+             size = 4;
+           else
+             return -1;
+         }
+       if (size <= 16)
+         {
+         intreg:
+           *locp = loc_intreg;
+           return size <= 4 ? nloc_intreg : nloc_intregs ((size + 3) / 4);
+         }
+
+      aggregate:
+       *locp = loc_aggregate;
+       return nloc_aggregate;
+      }
 
     case DW_TAG_structure_type:
     case DW_TAG_class_type:
index e41ce34..cd467ff 100644 (file)
@@ -1,5 +1,5 @@
 /* Arm specific symbolic name handling.
-   Copyright (C) 2002-2009 Red Hat, Inc.
+   Copyright (C) 2002-2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -122,3 +122,10 @@ arm_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type)
       return ELF_T_NUM;
     }
 }
+
+/* The SHT_ARM_EXIDX section type is a valid target for relocation.  */
+bool
+arm_check_reloc_target_type (Ebl *ebl __attribute__ ((unused)), Elf64_Word sh_type)
+{
+  return sh_type == SHT_ARM_EXIDX;
+}
index cc9b2d7..1e0b486 100644 (file)
@@ -1,5 +1,5 @@
 /* Initialization of i386 specific backend library.
-   Copyright (C) 2000-2009 Red Hat, Inc.
+   Copyright (C) 2000-2009, 2013 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -63,6 +63,9 @@ i386_init (elf, machine, eh, ehlen)
   HOOK (eh, auxv_info);
   HOOK (eh, disasm);
   HOOK (eh, abi_cfi);
+  /* gcc/config/ #define DWARF_FRAME_REGISTERS.  For i386 it is 17, why?  */
+  eh->frame_nregs = 9;
+  HOOK (eh, set_initial_registers_tid);
 
   return MODVERSION;
 }
diff --git a/backends/i386_initreg.c b/backends/i386_initreg.c
new file mode 100644 (file)
index 0000000..51fd9ea
--- /dev/null
@@ -0,0 +1,79 @@
+/* Fetch live process registers from TID.
+   Copyright (C) 2013 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
+
+#if defined __i386__ || defined __x86_64__
+# include <sys/types.h>
+# include <sys/user.h>
+# include <sys/ptrace.h>
+#endif
+
+#define BACKEND i386_
+#include "libebl_CPU.h"
+
+bool
+i386_set_initial_registers_tid (pid_t tid __attribute__ ((unused)),
+                         ebl_tid_registers_t *setfunc __attribute__ ((unused)),
+                               void *arg __attribute__ ((unused)))
+{
+#if (!defined __i386__ && !defined __x86_64__) || !defined(__linux__)
+  return false;
+#else /* __i386__ || __x86_64__ */
+  struct user_regs_struct user_regs;
+  if (ptrace (PTRACE_GETREGS, tid, NULL, &user_regs) != 0)
+    return false;
+  Dwarf_Word dwarf_regs[9];
+# if defined __i386__
+  dwarf_regs[0] = user_regs.eax;
+  dwarf_regs[1] = user_regs.ecx;
+  dwarf_regs[2] = user_regs.edx;
+  dwarf_regs[3] = user_regs.ebx;
+  dwarf_regs[4] = user_regs.esp;
+  dwarf_regs[5] = user_regs.ebp;
+  dwarf_regs[6] = user_regs.esi;
+  dwarf_regs[7] = user_regs.edi;
+  dwarf_regs[8] = user_regs.eip;
+# elif defined __x86_64__
+  dwarf_regs[0] = user_regs.rax;
+  dwarf_regs[1] = user_regs.rcx;
+  dwarf_regs[2] = user_regs.rdx;
+  dwarf_regs[3] = user_regs.rbx;
+  dwarf_regs[4] = user_regs.rsp;
+  dwarf_regs[5] = user_regs.rbp;
+  dwarf_regs[6] = user_regs.rsi;
+  dwarf_regs[7] = user_regs.rdi;
+  dwarf_regs[8] = user_regs.rip;
+# else /* (__i386__ || __x86_64__) && (!__i386__ && !__x86_64__) */
+#  error "source file error, it cannot happen"
+# endif /* (__i386__ || __x86_64__) && (!__i386__ && !__x86_64__) */
+  return setfunc (0, 9, dwarf_regs, arg);
+#endif /* __i386__ || __x86_64__ */
+}
index 95f5b92..9da797d 100644 (file)
@@ -1,5 +1,5 @@
 /* Function return value location for Linux/i386 ABI.
-   Copyright (C) 2005-2010 Red Hat, Inc.
+   Copyright (C) 2005-2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -67,27 +67,10 @@ i386_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
 {
   /* Start with the function's type, and get the DW_AT_type attribute,
      which is the type of the return value.  */
-
-  Dwarf_Attribute attr_mem;
-  Dwarf_Attribute *attr = dwarf_attr_integrate (functypedie, DW_AT_type,
-                                               &attr_mem);
-  if (attr == NULL)
-    /* The function has no return value, like a `void' function in C.  */
-    return 0;
-
-  Dwarf_Die die_mem;
-  Dwarf_Die *typedie = dwarf_formref_die (attr, &die_mem);
-  int tag = dwarf_tag (typedie);
-
-  /* Follow typedefs and qualifiers to get to the actual type.  */
-  while (tag == DW_TAG_typedef
-        || tag == DW_TAG_const_type || tag == DW_TAG_volatile_type
-        || tag == DW_TAG_restrict_type || tag == DW_TAG_mutable_type)
-    {
-      attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
-      typedie = dwarf_formref_die (attr, &die_mem);
-      tag = dwarf_tag (typedie);
-    }
+  Dwarf_Die die_mem, *typedie = &die_mem;
+  int tag = dwarf_peeled_die_type (functypedie, typedie);
+  if (tag <= 0)
+    return tag;
 
   switch (tag)
     {
@@ -97,9 +80,10 @@ i386_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_subrange_type:
       if (! dwarf_hasattr_integrate (typedie, DW_AT_byte_size))
        {
+         Dwarf_Attribute attr_mem, *attr;
          attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
          typedie = dwarf_formref_die (attr, &die_mem);
-         tag = dwarf_tag (typedie);
+         tag = DWARF_TAG_OR_RETURN (typedie);
        }
       /* Fall through.  */
 
@@ -109,6 +93,7 @@ i386_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_ptr_to_member_type:
       {
        Dwarf_Word size;
+       Dwarf_Attribute attr_mem;
        if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
                                                   &attr_mem), &size) != 0)
          {
index ed56efa..91da748 100644 (file)
@@ -1,5 +1,5 @@
 /* Initialization of IA-64 specific backend library.
-   Copyright (C) 2002, 2003, 2005, 2006, 2007 Red Hat, Inc.
+   Copyright (C) 2002, 2003, 2005, 2006, 2007, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -61,6 +61,7 @@ ia64_init (elf, machine, eh, ehlen)
   HOOK (eh, machine_section_flag_check);
   HOOK (eh, register_info);
   HOOK (eh, return_value_location);
+  HOOK (eh, check_reloc_target_type);
 
   return MODVERSION;
 }
index 644359b..b5928c5 100644 (file)
@@ -1,5 +1,5 @@
 /* Function return value location for IA64 ABI.
-   Copyright (C) 2006-2010 Red Hat, Inc.
+   Copyright (C) 2006-2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -109,7 +109,7 @@ hfa_type (Dwarf_Die *typedie, Dwarf_Word size,
       return fpregs_used + nregs;
     }
 
-  int tag = dwarf_tag (typedie);
+  int tag = DWARF_TAG_OR_RETURN (typedie);
   switch (tag)
     {
       Dwarf_Attribute attr_mem;
@@ -238,27 +238,10 @@ ia64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
 {
   /* Start with the function's type, and get the DW_AT_type attribute,
      which is the type of the return value.  */
-
-  Dwarf_Attribute attr_mem;
-  Dwarf_Attribute *attr = dwarf_attr_integrate (functypedie, DW_AT_type,
-                                               &attr_mem);
-  if (attr == NULL)
-    /* The function has no return value, like a `void' function in C.  */
-    return 0;
-
-  Dwarf_Die die_mem;
-  Dwarf_Die *typedie = dwarf_formref_die (attr, &die_mem);
-  int tag = dwarf_tag (typedie);
-
-  /* Follow typedefs and qualifiers to get to the actual type.  */
-  while (tag == DW_TAG_typedef
-        || tag == DW_TAG_const_type || tag == DW_TAG_volatile_type
-        || tag == DW_TAG_restrict_type || tag == DW_TAG_mutable_type)
-    {
-      attr = dwarf_attr (typedie, DW_AT_type, &attr_mem);
-      typedie = dwarf_formref_die (attr, &die_mem);
-      tag = dwarf_tag (typedie);
-    }
+  Dwarf_Die die_mem, *typedie = &die_mem;
+  int tag = dwarf_peeled_die_type (functypedie, typedie);
+  if (tag <= 0)
+    return tag;
 
   Dwarf_Word size;
   switch (tag)
@@ -269,9 +252,10 @@ ia64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_subrange_type:
       if (! dwarf_hasattr_integrate (typedie, DW_AT_byte_size))
        {
+         Dwarf_Attribute attr_mem, *attr;
          attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
          typedie = dwarf_formref_die (attr, &die_mem);
-         tag = dwarf_tag (typedie);
+         tag = DWARF_TAG_OR_RETURN (typedie);
        }
       /* Fall through.  */
 
@@ -279,16 +263,21 @@ ia64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_enumeration_type:
     case DW_TAG_pointer_type:
     case DW_TAG_ptr_to_member_type:
-      if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
-                                                &attr_mem), &size) != 0)
-       {
-         if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
-           size = 8;
-         else
-           return -1;
-       }
+      {
+       Dwarf_Attribute attr_mem;
+       if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
+                                                  &attr_mem), &size) != 0)
+         {
+           if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
+             size = 8;
+           else
+             return -1;
+         }
+      }
+
       if (tag == DW_TAG_base_type)
        {
+         Dwarf_Attribute attr_mem;
          Dwarf_Word encoding;
          if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_encoding,
                                                     &attr_mem),
index 8d806b0..f928b0b 100644 (file)
@@ -1,5 +1,5 @@
 /* IA-64 specific symbolic name handling.
-   Copyright (C) 2002-2009 Red Hat, Inc.
+   Copyright (C) 2002-2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -148,3 +148,10 @@ ia64_reloc_simple_type (Ebl *ebl, int type)
 
   return ELF_T_NUM;
 }
+
+/* The SHT_IA_64_UNWIND section type is a valid target for relocation.  */
+bool
+ia64_check_reloc_target_type (Ebl *ebl __attribute__ ((unused)), Elf64_Word sh_type)
+{
+  return sh_type == SHT_IA_64_UNWIND;
+}
index 36b3a4a..fa0d4f2 100644 (file)
@@ -1,5 +1,5 @@
 /* Common interface for libebl modules.
-   Copyright (C) 2000, 2001, 2002, 2003, 2005 Red Hat, Inc.
+   Copyright (C) 2000, 2001, 2002, 2003, 2005, 2013, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -29,6 +29,7 @@
 #ifndef _LIBEBL_CPU_H
 #define _LIBEBL_CPU_H 1
 
+#include <dwarf.h>
 #include <libeblP.h>
 
 #define EBLHOOK(name)  EBLHOOK_1(BACKEND, name)
@@ -45,5 +46,45 @@ extern const char *EBLHOOK(init) (Elf *elf, GElf_Half machine,
 
 extern bool (*generic_debugscn_p) (const char *) attribute_hidden;
 
+/* Helper for retval.  Return dwarf_tag (die), but calls return -1
+   if there where previous errors that leave die NULL.  */
+#define DWARF_TAG_OR_RETURN(die)  \
+  ({ Dwarf_Die *_die = (die);    \
+     if (_die == NULL) return -1; \
+     dwarf_tag (_die); })
+
+/* Follow typedefs and qualifiers to get to the actual type.  */
+static inline int
+dwarf_peel_type (Dwarf_Die *typediep, Dwarf_Attribute *attrp)
+{
+  int tag = DWARF_TAG_OR_RETURN (typediep);
+  while (tag == DW_TAG_typedef
+        || tag == DW_TAG_const_type || tag == DW_TAG_volatile_type
+        || tag == DW_TAG_restrict_type)
+    {
+      attrp = dwarf_attr_integrate (typediep, DW_AT_type, attrp);
+      typediep = dwarf_formref_die (attrp, typediep);
+      tag = DWARF_TAG_OR_RETURN (typediep);
+    }
+
+  return tag;
+}
+
+/* Get a type die corresponding to DIE.  Peel CV qualifiers off
+   it.  */
+static inline int
+dwarf_peeled_die_type (Dwarf_Die *die, Dwarf_Die *result)
+{
+  Dwarf_Attribute attr_mem;
+  Dwarf_Attribute *attr = dwarf_attr_integrate (die, DW_AT_type, &attr_mem);
+  if (attr == NULL)
+    /* The function has no return value, like a `void' function in C.  */
+    return 0;
+
+  if (dwarf_formref_die (attr, result) == NULL)
+    return -1;
+
+  return dwarf_peel_type (result, attr);
+}
 
 #endif /* libebl_CPU.h */
index be27468..e3c0109 100644 (file)
@@ -42,6 +42,9 @@
 #define        INT                     int32_t
 #define ALIGN_INT              4
 #define TYPE_INT               ELF_T_SWORD
+#ifndef ALIGN_PR_REG
+# define ALIGN_PR_REG          ALIGN_ULONG
+#endif
 
 #define FIELD(type, name) type name __attribute__ ((aligned (ALIGN_##type)))
 
@@ -81,7 +84,14 @@ struct EBLHOOK(prstatus)
   struct EBLHOOK(timeval) pr_stime;
   struct EBLHOOK(timeval) pr_cutime;
   struct EBLHOOK(timeval) pr_cstime;
-  FIELD (ULONG, pr_reg[PRSTATUS_REGS_SIZE / sizeof (ULONG)]);
+  struct
+  {
+    FIELD (ULONG, pr_reg[PRSTATUS_REGS_SIZE / sizeof (ULONG)]);
+  }
+#ifdef ALIGN_PR_REG
+    __attribute__ ((aligned (ALIGN_PR_REG)))
+#endif
+    ;
   FIELD (INT, pr_fpvalid);
 };
 
@@ -123,8 +133,10 @@ static const Ebl_Core_Item prstatus_items[] =
     FIELD (signal, INT, info.si_code, 'd'),
     FIELD (signal, INT, info.si_errno, 'd'),
     FIELD (signal, SHORT, cursig, 'd'),
-    FIELD (signal, ULONG, sigpend, 'B'),
-    FIELD (signal, ULONG, sighold, 'B'),
+
+    /* Use different group name for a newline delimiter.  */
+    FIELD (signal2, ULONG, sigpend, 'B'),
+    FIELD (signal3, ULONG, sighold, 'B'),
     FIELD (identity, PID_T, pid, 'd', .thread_identifier = true),
     FIELD (identity, PID_T, ppid, 'd'),
     FIELD (identity, PID_T, pgrp, 'd'),
@@ -252,6 +264,28 @@ EBLHOOK(core_note) (nhdr, name, regs_offset, nregloc, reglocs, nitems, items)
       *items = NULL;                                                         \
       return 1;
 
+#define EXTRA_REGSET_ITEMS(type, size, table, extra_items)                   \
+    case type:                                                               \
+      if (nhdr->n_descsz != size)                                            \
+       return 0;                                                             \
+      *regs_offset = 0;                                                              \
+      *nregloc = sizeof table / sizeof table[0];                             \
+      *reglocs = table;                                                              \
+      *nitems = sizeof extra_items / sizeof extra_items[0];                  \
+      *items = extra_items;                                                  \
+      return 1;
+
+#define EXTRA_ITEMS(type, size, extra_items)                                 \
+    case type:                                                               \
+      if (nhdr->n_descsz != size)                                            \
+       return 0;                                                             \
+      *regs_offset = 0;                                                              \
+      *nregloc = 0;                                                          \
+      *reglocs = NULL;                                                       \
+      *nitems = sizeof extra_items / sizeof extra_items[0];                  \
+      *items = extra_items;                                                  \
+      return 1;
+
 #ifdef FPREGSET_SIZE
     EXTRA_REGSET (NT_FPREGSET, FPREGSET_SIZE, fpregset_regs)
 #endif
index 90d4f2b..7ea2b23 100644 (file)
@@ -1,5 +1,5 @@
 /* Initialization of PPC64 specific backend library.
-   Copyright (C) 2004, 2005, 2006, 2007, 2008 Red Hat, Inc.
+   Copyright (C) 2004, 2005, 2006, 2007, 2008, 2013, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2004.
 
@@ -31,6 +31,8 @@
 # include <config.h>
 #endif
 
+#include <string.h>
+
 #define BACKEND                ppc64_
 #define RELOC_PREFIX   R_PPC64_
 #include "libebl_CPU.h"
@@ -56,14 +58,49 @@ ppc64_init (elf, machine, eh, ehlen)
   HOOK (eh, reloc_simple_type);
   HOOK (eh, dynamic_tag_name);
   HOOK (eh, dynamic_tag_check);
+  HOOK (eh, machine_flag_check);
   HOOK (eh, copy_reloc_p);
   HOOK (eh, check_special_symbol);
+  HOOK (eh, check_st_other_bits);
   HOOK (eh, bss_plt_p);
   HOOK (eh, return_value_location);
   HOOK (eh, register_info);
   HOOK (eh, syscall_abi);
   HOOK (eh, core_note);
   HOOK (eh, auxv_info);
+  HOOK (eh, abi_cfi);
+  /* gcc/config/ #define DWARF_FRAME_REGISTERS.  */
+  eh->frame_nregs = (114 - 1) + 32;
+  HOOK (eh, set_initial_registers_tid);
+  HOOK (eh, dwarf_to_regno);
+  HOOK (eh, resolve_sym_value);
+
+  /* Find the function descriptor .opd table for resolve_sym_value.  */
+  if (elf != NULL)
+    {
+      GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (elf, &ehdr_mem);
+      if (ehdr != NULL && ehdr->e_type != ET_REL)
+       {
+         /* We could also try through DT_PPC64_OPD and DT_PPC64_OPDSZ. */
+         GElf_Shdr opd_shdr_mem, *opd_shdr;
+         Elf_Scn *scn = NULL;
+         while ((scn = elf_nextscn (elf, scn)) != NULL)
+           {
+             opd_shdr = gelf_getshdr (scn, &opd_shdr_mem);
+             if (opd_shdr != NULL
+                 && (opd_shdr->sh_flags & SHF_ALLOC) != 0
+                 && opd_shdr->sh_type == SHT_PROGBITS
+                 && opd_shdr->sh_size > 0
+                 && strcmp (elf_strptr (elf, ehdr->e_shstrndx,
+                                        opd_shdr->sh_name), ".opd") == 0)
+               {
+                 eh->fd_addr = opd_shdr->sh_addr;
+                 eh->fd_data = elf_getdata (scn, NULL);
+                 break;
+               }
+           }
+       }
+    }
 
   return MODVERSION;
 }
index 6366f46..3a693cf 100644 (file)
@@ -132,6 +132,21 @@ RELOC_TYPE (DTPREL16_HIGHER,       REL)
 RELOC_TYPE (DTPREL16_HIGHERA,  REL)
 RELOC_TYPE (DTPREL16_HIGHEST,  REL)
 RELOC_TYPE (DTPREL16_HIGHESTA, REL)
+RELOC_TYPE (TLSGD,             REL)
+RELOC_TYPE (TLSLD,             REL)
+RELOC_TYPE (TOCSAVE,           REL)
+RELOC_TYPE (ADDR16_HIGH,       REL)
+RELOC_TYPE (ADDR16_HIGHA,      REL)
+RELOC_TYPE (TPREL16_HIGH,      REL)
+RELOC_TYPE (TPREL16_HIGHA,     REL)
+RELOC_TYPE (DTPREL16_HIGH,     REL)
+RELOC_TYPE (DTPREL16_HIGHA,    REL)
+RELOC_TYPE (JMP_IREL,          REL)
+RELOC_TYPE (IRELATIVE,         REL)
+RELOC_TYPE (REL16,             REL)
+RELOC_TYPE (REL16_LO,          REL)
+RELOC_TYPE (REL16_HI,          REL)
+RELOC_TYPE (REL16_HA,          REL)
 
 /* Notes from Alan Modra:
 
diff --git a/backends/ppc64_resolve_sym.c b/backends/ppc64_resolve_sym.c
new file mode 100644 (file)
index 0000000..03f6558
--- /dev/null
@@ -0,0 +1,63 @@
+/* Resolve symbol values through .opd function descriptors.
+   Copyright (C) 2013 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
+
+#define BACKEND ppc64_
+#include "libebl_CPU.h"
+
+/* Resolve a function descriptor if addr points into the .opd section.
+   The .opd section contains function descriptors consisting of 3 addresses.
+   function, toc and chain. We are just interested in the first.
+   http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html#FUNC-DES
+
+   Returns true if the given address could be resolved, false otherwise.
+*/
+bool
+ppc64_resolve_sym_value (Ebl *ebl, GElf_Addr *addr)
+{
+  if (ebl->fd_data != NULL && *addr >= ebl->fd_addr
+      && *addr + sizeof (Elf64_Addr) <= ebl->fd_addr + ebl->fd_data->d_size)
+    {
+      GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (ebl->elf, &ehdr_mem);
+      if (ehdr != NULL)
+       {
+         Elf_Data opd_in, opd_out;
+         opd_in.d_buf = ebl->fd_data->d_buf + (*addr - ebl->fd_addr);
+         opd_out.d_buf = addr;
+         opd_out.d_size = opd_in.d_size = sizeof (Elf64_Addr);
+         opd_out.d_type = opd_in.d_type = ELF_T_ADDR;
+         if (elf64_xlatetom (&opd_out, &opd_in,
+                             ehdr->e_ident[EI_DATA]) != NULL)
+           return true;
+       }
+    }
+  return false;
+}
index b26bb1e..a251983 100644 (file)
@@ -1,5 +1,5 @@
 /* Function return value location for Linux/PPC64 ABI.
-   Copyright (C) 2005-2010 Red Hat, Inc.
+   Copyright (C) 2005-2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -77,27 +77,10 @@ ppc64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
 {
   /* Start with the function's type, and get the DW_AT_type attribute,
      which is the type of the return value.  */
-
-  Dwarf_Attribute attr_mem;
-  Dwarf_Attribute *attr = dwarf_attr_integrate (functypedie, DW_AT_type,
-                                               &attr_mem);
-  if (attr == NULL)
-    /* The function has no return value, like a `void' function in C.  */
-    return 0;
-
-  Dwarf_Die die_mem;
-  Dwarf_Die *typedie = dwarf_formref_die (attr, &die_mem);
-  int tag = dwarf_tag (typedie);
-
-  /* Follow typedefs and qualifiers to get to the actual type.  */
-  while (tag == DW_TAG_typedef
-        || tag == DW_TAG_const_type || tag == DW_TAG_volatile_type
-        || tag == DW_TAG_restrict_type || tag == DW_TAG_mutable_type)
-    {
-      attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
-      typedie = dwarf_formref_die (attr, &die_mem);
-      tag = dwarf_tag (typedie);
-    }
+  Dwarf_Die die_mem, *typedie = &die_mem;
+  int tag = dwarf_peeled_die_type (functypedie, typedie);
+  if (tag <= 0)
+    return tag;
 
   Dwarf_Word size;
   switch (tag)
@@ -108,9 +91,10 @@ ppc64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_subrange_type:
       if (! dwarf_hasattr_integrate (typedie, DW_AT_byte_size))
        {
+         Dwarf_Attribute attr_mem, *attr;
          attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
          typedie = dwarf_formref_die (attr, &die_mem);
-         tag = dwarf_tag (typedie);
+         tag = DWARF_TAG_OR_RETURN (typedie);
        }
       /* Fall through.  */
 
@@ -118,16 +102,21 @@ ppc64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_enumeration_type:
     case DW_TAG_pointer_type:
     case DW_TAG_ptr_to_member_type:
-      if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
-                                                &attr_mem), &size) != 0)
-       {
-         if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
-           size = 8;
-         else
-           return -1;
+      {
+       Dwarf_Attribute attr_mem;
+       if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
+                                                  &attr_mem), &size) != 0)
+         {
+           if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
+             size = 8;
+           else
+             return -1;
        }
+      }
+
       if (tag == DW_TAG_base_type)
        {
+         Dwarf_Attribute attr_mem;
          Dwarf_Word encoding;
          if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_encoding,
                                                     &attr_mem),
@@ -162,6 +151,7 @@ ppc64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
 
     case DW_TAG_array_type:
       {
+       Dwarf_Attribute attr_mem;
        bool is_vector;
        if (dwarf_formflag (dwarf_attr_integrate (typedie, DW_AT_GNU_vector,
                                                  &attr_mem), &is_vector) == 0
@@ -179,9 +169,10 @@ ppc64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
          if (tag == DW_TAG_array_type)
            {
              /* Check if it's a character array.  */
+             Dwarf_Attribute attr_mem, *attr;
              attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
              typedie = dwarf_formref_die (attr, &die_mem);
-             tag = dwarf_tag (typedie);
+             tag = DWARF_TAG_OR_RETURN (typedie);
              if (tag != DW_TAG_base_type)
                goto aggregate;
              if (dwarf_formudata (dwarf_attr_integrate (typedie,
index 244e40f..5a020d8 100644 (file)
@@ -1,5 +1,5 @@
 /* PPC64 specific symbolic name handling.
-   Copyright (C) 2004, 2005 Red Hat, Inc.
+   Copyright (C) 2004, 2005, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2004.
 
@@ -72,6 +72,8 @@ ppc64_dynamic_tag_name (int64_t tag, char *buf __attribute__ ((unused)),
       return "PPC64_OPD";
     case DT_PPC64_OPDSZ:
       return "PPC64_OPDSZ";
+    case DT_PPC64_OPT:
+      return "PPC64_OPT";
     default:
       break;
     }
@@ -84,7 +86,8 @@ ppc64_dynamic_tag_check (int64_t tag)
 {
   return (tag == DT_PPC64_GLINK
          || tag == DT_PPC64_OPD
-         || tag == DT_PPC64_OPDSZ);
+         || tag == DT_PPC64_OPDSZ
+         || tag == DT_PPC64_OPT);
 }
 
 
@@ -110,3 +113,19 @@ ppc64_bss_plt_p (Elf *elf __attribute__ ((unused)),
 {
   return true;
 }
+
+/* Check whether machine flags are valid.  PPC64 has three possible values:
+   0 - for unspecified ABI, or not using any specific ABI features.
+   1 - for the original ELF PPC64 ABI using function descriptors.
+   2 - for the revised ELFv2 PPC64 ABI without function descriptors.  */
+bool
+ppc64_machine_flag_check (GElf_Word flags)
+{
+  return flags == 0 || flags == 1 || flags == 2;
+}
+
+bool
+ppc64_check_st_other_bits (unsigned char st_other)
+{
+  return (PPC64_LOCAL_ENTRY_OFFSET (st_other) != 0);
+}
diff --git a/backends/ppc_cfi.c b/backends/ppc_cfi.c
new file mode 100644 (file)
index 0000000..55169ae
--- /dev/null
@@ -0,0 +1,77 @@
+/* ppc ABI-specified defaults for DWARF CFI.
+   Copyright (C) 2012, 2013 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 <dwarf.h>
+
+#define BACKEND ppc_
+#include "libebl_CPU.h"
+
+int
+ppc_abi_cfi (Ebl *ebl __attribute__ ((unused)), Dwarf_CIE *abi_info)
+{
+  static const uint8_t abi_cfi[] =
+    {
+      /* This instruction is provided in every CIE.  It is not repeated here:
+        DW_CFA_def_cfa, ULEB128_7 (1), ULEB128_7 (0)  */
+      /* r1 is assumed to be restored from cfa adress,
+        r1 acts as a stack frame pointer.  */
+      DW_CFA_val_offset, ULEB128_7 (1), ULEB128_7 (0),
+      /* lr is not callee-saved but it needs to be preserved as it is pre-set
+        by the caller.  */
+      DW_CFA_same_value, ULEB128_7 (65), /* lr */
+
+      /* Callee-saved regs.  */
+#define SV(n) DW_CFA_same_value, ULEB128_7 (n)
+      SV (2),                  /* r2 is TOC pointer.  */
+      SV (13),                 /* Reserved as system thread id (is it for CFI?).  */
+      /* r14-r31 are non-volatile registers.  */
+      SV (14), SV (15), SV (16), SV (17), SV (18), SV (19), SV (20), SV (21),
+      SV (22), SV (23), SV (24), SV (25), SV (26), SV (27), SV (28), SV (29),
+      SV (30), SV (31)
+      /* VMX registers v20-v31 and vrsave are non-volatile but they are
+        assigned DWARF registers 1144-1156 (v20-v31) which is outside of the
+        CFI supported range.  */
+#undef SV
+    };
+
+  abi_info->initial_instructions = abi_cfi;
+  abi_info->initial_instructions_end = &abi_cfi[sizeof abi_cfi];
+  abi_info->data_alignment_factor = ebl->class == ELFCLASS64 ? 8 : 4;
+
+  abi_info->return_address_register = 65;
+
+  return 0;
+}
+
+__typeof (ppc_abi_cfi)
+     ppc64_abi_cfi
+     __attribute__ ((alias ("ppc_abi_cfi")));
index 707a395..9ac8871 100644 (file)
@@ -123,7 +123,7 @@ static const Ebl_Register_Location spe_regs[] =
   {                                                                          \
     .name = "nip", .type = ELF_T_ADDR, .format = 'x',                        \
     .offset = offsetof (struct EBLHOOK(prstatus), pr_reg[32]),               \
-    .group = "register"                                                              \
+    .group = "register", .pc_register = true                                 \
   },                                                                         \
   {                                                                          \
     .name = "orig_gpr3", .type = TYPE_LONG, .format = 'd',                   \
index 6054007..ad92765 100644 (file)
@@ -1,5 +1,5 @@
 /* Initialization of PPC specific backend library.
-   Copyright (C) 2004, 2005, 2006, 2007, 2008 Red Hat, Inc.
+   Copyright (C) 2004, 2005, 2006, 2007, 2008, 2013 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2004.
 
@@ -64,6 +64,11 @@ ppc_init (elf, machine, eh, ehlen)
   HOOK (eh, core_note);
   HOOK (eh, auxv_info);
   HOOK (eh, check_object_attribute);
+  HOOK (eh, abi_cfi);
+  /* gcc/config/ #define DWARF_FRAME_REGISTERS.  */
+  eh->frame_nregs = (114 - 1) + 32;
+  HOOK (eh, set_initial_registers_tid);
+  HOOK (eh, dwarf_to_regno);
 
   return MODVERSION;
 }
diff --git a/backends/ppc_initreg.c b/backends/ppc_initreg.c
new file mode 100644 (file)
index 0000000..64f5379
--- /dev/null
@@ -0,0 +1,114 @@
+/* Fetch live process registers from TID.
+   Copyright (C) 2013 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 "system.h"
+#include <stdlib.h>
+#ifdef __powerpc__
+# include <sys/user.h>
+# include <sys/ptrace.h>
+#endif
+
+#define BACKEND ppc_
+#include "libebl_CPU.h"
+
+bool
+ppc_dwarf_to_regno (Ebl *ebl __attribute__ ((unused)), unsigned *regno)
+{
+  switch (*regno)
+  {
+    case 108:
+      // LR uses both 65 and 108 numbers, there is no consistency for it.
+      *regno = 65;
+      return true;
+    case 0 ... 107:
+    case 109 ... (114 - 1) -1:
+      return true;
+    case 1200 ... 1231:
+      *regno = *regno - 1200 + (114 - 1);
+      return true;
+    default:
+      return false;
+  }
+  abort ();
+}
+
+__typeof (ppc_dwarf_to_regno)
+     ppc64_dwarf_to_regno
+     __attribute__ ((alias ("ppc_dwarf_to_regno")));
+
+bool
+ppc_set_initial_registers_tid (pid_t tid __attribute__ ((unused)),
+                         ebl_tid_registers_t *setfunc __attribute__ ((unused)),
+                              void *arg __attribute__ ((unused)))
+{
+#ifndef __powerpc__
+  return false;
+#else /* __powerpc__ */
+  union
+    {
+      struct pt_regs r;
+      long l[sizeof (struct pt_regs) / sizeof (long)];
+    }
+  user_regs;
+  eu_static_assert (sizeof (struct pt_regs) % sizeof (long) == 0);
+  /* PTRACE_GETREGS is EIO on kernel-2.6.18-308.el5.ppc64.  */
+  errno = 0;
+  for (unsigned regno = 0; regno < sizeof (user_regs) / sizeof (long);
+       regno++)
+    {
+      user_regs.l[regno] = ptrace (PTRACE_PEEKUSER, tid,
+                                  (void *) (uintptr_t) (regno
+                                                        * sizeof (long)),
+                                  NULL);
+      if (errno != 0)
+       return false;
+    }
+  const size_t gprs = sizeof (user_regs.r.gpr) / sizeof (*user_regs.r.gpr);
+  Dwarf_Word dwarf_regs[gprs];
+  for (unsigned gpr = 0; gpr < gprs; gpr++)
+    dwarf_regs[gpr] = user_regs.r.gpr[gpr];
+  if (! setfunc (0, gprs, dwarf_regs, arg))
+    return false;
+  dwarf_regs[0] = user_regs.r.link;
+  // LR uses both 65 and 108 numbers, there is no consistency for it.
+  if (! setfunc (65, 1, dwarf_regs, arg))
+    return false;
+  /* Registers like msr, ctr, xer, dar, dsisr etc. are probably irrelevant
+     for CFI.  */
+  dwarf_regs[0] = user_regs.r.nip;
+  return setfunc (-1, 1, dwarf_regs, arg);
+#endif /* __powerpc__ */
+}
+
+__typeof (ppc_set_initial_registers_tid)
+     ppc64_set_initial_registers_tid
+     __attribute__ ((alias ("ppc_set_initial_registers_tid")));
index 9c2d7e8..4b92a9a 100644 (file)
@@ -48,7 +48,7 @@ ppc_register_info (Ebl *ebl __attribute__ ((unused)),
   if (regno < 0 || regno > 1155 || namelen < 8)
     return -1;
 
-  *prefix = NULL;
+  *prefix = "";
   *bits = ebl->machine == EM_PPC64 ? 64 : 32;
   *type = (regno < 32 ? DW_ATE_signed
           : regno < 64 ? DW_ATE_float : DW_ATE_unsigned);
index 29f5a23..b14a99f 100644 (file)
@@ -1,5 +1,5 @@
 /* Function return value location for Linux/PPC ABI.
-   Copyright (C) 2005, 2006, 2007, 2010 Red Hat, Inc.
+   Copyright (C) 2005, 2006, 2007, 2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -89,27 +89,10 @@ ppc_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
 {
   /* Start with the function's type, and get the DW_AT_type attribute,
      which is the type of the return value.  */
-
-  Dwarf_Attribute attr_mem;
-  Dwarf_Attribute *attr = dwarf_attr_integrate (functypedie, DW_AT_type,
-                                               &attr_mem);
-  if (attr == NULL)
-    /* The function has no return value, like a `void' function in C.  */
-    return 0;
-
-  Dwarf_Die die_mem;
-  Dwarf_Die *typedie = dwarf_formref_die (attr, &die_mem);
-  int tag = dwarf_tag (typedie);
-
-  /* Follow typedefs and qualifiers to get to the actual type.  */
-  while (tag == DW_TAG_typedef
-        || tag == DW_TAG_const_type || tag == DW_TAG_volatile_type
-        || tag == DW_TAG_restrict_type || tag == DW_TAG_mutable_type)
-    {
-      attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
-      typedie = dwarf_formref_die (attr, &die_mem);
-      tag = dwarf_tag (typedie);
-    }
+  Dwarf_Die die_mem, *typedie = &die_mem;
+  int tag = dwarf_peeled_die_type (functypedie, typedie);
+  if (tag <= 0)
+    return tag;
 
   Dwarf_Word size;
   switch (tag)
@@ -120,9 +103,10 @@ ppc_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_subrange_type:
       if (! dwarf_hasattr_integrate (typedie, DW_AT_byte_size))
        {
+         Dwarf_Attribute attr_mem, *attr;
          attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
          typedie = dwarf_formref_die (attr, &die_mem);
-         tag = dwarf_tag (typedie);
+         tag = DWARF_TAG_OR_RETURN (typedie);
        }
       /* Fall through.  */
 
@@ -130,18 +114,23 @@ ppc_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_enumeration_type:
     case DW_TAG_pointer_type:
     case DW_TAG_ptr_to_member_type:
-      if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
-                                                &attr_mem), &size) != 0)
-       {
-         if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
-           size = 4;
-         else
-           return -1;
-       }
+      {
+       Dwarf_Attribute attr_mem;
+       if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
+                                                  &attr_mem), &size) != 0)
+         {
+           if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
+             size = 4;
+           else
+             return -1;
+         }
+      }
+
       if (size <= 8)
        {
          if (tag == DW_TAG_base_type)
            {
+             Dwarf_Attribute attr_mem;
              Dwarf_Word encoding;
              if (dwarf_formudata (dwarf_attr_integrate (typedie,
                                                         DW_AT_encoding,
@@ -165,6 +154,7 @@ ppc_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
 
     case DW_TAG_array_type:
       {
+       Dwarf_Attribute attr_mem;
        bool is_vector;
        if (dwarf_formflag (dwarf_attr_integrate (typedie, DW_AT_GNU_vector,
                                                  &attr_mem), &is_vector) == 0
diff --git a/backends/s390_cfi.c b/backends/s390_cfi.c
new file mode 100644 (file)
index 0000000..cb49486
--- /dev/null
@@ -0,0 +1,65 @@
+/* s390 ABI-specified defaults for DWARF CFI.
+   Copyright (C) 2012, 2013 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 <dwarf.h>
+
+#define BACKEND s390_
+#include "libebl_CPU.h"
+
+int
+s390_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info)
+{
+  static const uint8_t abi_cfi[] =
+    {
+      /* This instruction is provided in every CIE.  It is not repeated here:
+        DW_CFA_def_cfa, ULEB128_7 (15), ULEB128_7 (96)  */
+      /* r14 is not callee-saved but it needs to be preserved as it is pre-set
+        by the caller.  */
+      DW_CFA_same_value, ULEB128_7 (14), /* r14 */
+
+      /* Callee-saved regs.  */
+#define SV(n) DW_CFA_same_value, ULEB128_7 (n)
+      SV (6), SV (7), SV (8), SV (9), SV (10),                /* r6-r13, r15 */
+      SV (11), SV (12), SV (13), SV (15),
+      SV (16 + 8), SV (16 + 9), SV (16 + 10), SV (16 + 11),    /* f8-f15 */
+      SV (16 + 12), SV (16 + 13), SV (16 + 14), SV (16 + 15)
+#undef SV
+    };
+
+  abi_info->initial_instructions = abi_cfi;
+  abi_info->initial_instructions_end = &abi_cfi[sizeof abi_cfi];
+  abi_info->data_alignment_factor = ebl->class == ELFCLASS64 ? 8 : 4;
+
+  abi_info->return_address_register = 14;
+
+  return 0;
+}
diff --git a/backends/s390_corenote.c b/backends/s390_corenote.c
new file mode 100644 (file)
index 0000000..7ca3516
--- /dev/null
@@ -0,0 +1,189 @@
+/* S390-specific core note handling.
+   Copyright (C) 2012 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 <elf.h>
+#include <inttypes.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <sys/time.h>
+
+#ifndef BITS
+# define BITS          32
+# define BACKEND       s390_
+#else
+# define BITS          64
+# define BACKEND       s390x_
+#endif
+#include "libebl_CPU.h"
+
+static const Ebl_Register_Location prstatus_regs[] =
+  {
+#define GR(at, n, dwreg, b...)                                         \
+    { .offset = at * BITS/8, .regno = dwreg, .count = n, .bits = b }
+
+    GR ( 0,  1, 64, BITS),                             /* pswm */
+    GR ( 1,  1, 65, BITS, .pc_register = true ),       /* pswa */
+    GR ( 2, 16,  0, BITS),                             /* r0-r15 */
+    GR (18, 16, 48,   32),                             /* ar0-ar15 */
+
+#undef GR
+  };
+
+  /* orig_r2 is at offset (BITS == 32 ? 34 * 4 : 26 * 8).  */
+#define PRSTATUS_REGS_SIZE     (BITS / 8 * (BITS == 32 ? 35 : 27))
+
+static const Ebl_Register_Location fpregset_regs[] =
+  {
+#define FPR(at, n, dwreg)                                              \
+    { .offset = at * 64/8, .regno = dwreg, .count = n, .bits = 64 }
+
+    /* fpc is at offset 0, see fpregset_items, it has no assigned DWARF regno.
+       Bytes at offsets 4 to 7 are unused.  */
+    FPR (1 +  0, 1, 16),       /* f0 */
+    FPR (1 +  1, 1, 20),       /* f1 */
+    FPR (1 +  2, 1, 17),       /* f2 */
+    FPR (1 +  3, 1, 21),       /* f3 */
+    FPR (1 +  4, 1, 18),       /* f4 */
+    FPR (1 +  5, 1, 22),       /* f5 */
+    FPR (1 +  6, 1, 19),       /* f6 */
+    FPR (1 +  7, 1, 23),       /* f7 */
+    FPR (1 +  8, 1, 24),       /* f8 */
+    FPR (1 +  9, 1, 28),       /* f9 */
+    FPR (1 + 10, 1, 25),       /* f10 */
+    FPR (1 + 11, 1, 29),       /* f11 */
+    FPR (1 + 12, 1, 26),       /* f12 */
+    FPR (1 + 13, 1, 30),       /* f13 */
+    FPR (1 + 14, 1, 27),       /* f14 */
+    FPR (1 + 15, 1, 31),       /* f15 */
+
+#undef FPR
+  };
+
+static const Ebl_Core_Item fpregset_items[] =
+  {
+    {
+      .name = "fpc", .group = "register", .offset = 0, .type = ELF_T_WORD,
+      .format = 'x',
+    },
+  };
+
+/* Do not set FPREGSET_SIZE so that we can supply fpregset_items.  */
+#define EXTRA_NOTES_FPREGSET \
+    EXTRA_REGSET_ITEMS (NT_FPREGSET, 17 * 8, fpregset_regs, fpregset_items)
+
+#if BITS == 32
+# define ULONG                 uint32_t
+# define ALIGN_ULONG           4
+# define TYPE_ULONG            ELF_T_WORD
+# define TYPE_LONG             ELF_T_SWORD
+# define UID_T                 uint16_t
+# define GID_T                 uint16_t
+# define ALIGN_UID_T           2
+# define ALIGN_GID_T           2
+# define TYPE_UID_T            ELF_T_HALF
+# define TYPE_GID_T            ELF_T_HALF
+#else
+# define ULONG                 uint64_t
+# define ALIGN_ULONG           8
+# define TYPE_ULONG            ELF_T_XWORD
+# define TYPE_LONG             ELF_T_SXWORD
+# define UID_T                 uint32_t
+# define GID_T                 uint32_t
+# define ALIGN_UID_T           4
+# define ALIGN_GID_T           4
+# define TYPE_UID_T            ELF_T_WORD
+# define TYPE_GID_T            ELF_T_WORD
+#endif
+#define PID_T                  int32_t
+#define ALIGN_PID_T            4
+#define TYPE_PID_T             ELF_T_SWORD
+/* s390 psw_compat_t has alignment 8 bytes where it is inherited from.  */
+#define ALIGN_PR_REG           8
+
+#define PRSTATUS_REGSET_ITEMS                                  \
+  {                                                            \
+    .name = "orig_r2", .type = TYPE_LONG, .format = 'd',       \
+    .offset = offsetof (struct EBLHOOK(prstatus),              \
+                       pr_reg[BITS == 32 ? 34 : 26]),          \
+    .group = "register"                                                \
+  }
+
+#if BITS == 32
+
+static const Ebl_Core_Item high_regs_items[] =
+  {
+#define HR(n)                                                          \
+    {                                                                  \
+      .name = "high_r" #n , .group = "register", .offset = (n) * 4,    \
+      .type = ELF_T_WORD, .format = 'x',                               \
+    }
+
+    /* Upper halves of r0-r15 are stored here.
+       FIXME: They are currently not combined with the r0-r15 lower halves.  */
+    HR (0), HR (1), HR (2), HR (3), HR (4), HR (5), HR (6), HR (7),
+    HR (8), HR (9), HR (10), HR (11), HR (12), HR (13), HR (14), HR (15)
+
+#undef HR
+  };
+
+#define EXTRA_NOTES_HIGH_GPRS \
+  EXTRA_ITEMS (NT_S390_HIGH_GPRS, 16 * 4, high_regs_items)
+
+#else /* BITS == 64 */
+
+#define EXTRA_NOTES_HIGH_GPRS
+
+#endif /* BITS == 64 */
+
+static const Ebl_Core_Item last_break_items[] =
+  {
+    {
+      .name = "last_break", .group = "system", .offset = BITS == 32 ? 4 : 0,
+      .type = BITS == 32 ? ELF_T_WORD : ELF_T_XWORD, .format = 'x',
+    },
+  };
+
+static const Ebl_Core_Item system_call_items[] =
+  {
+    {
+      .name = "system_call", .group = "system", .offset = 0, .type = ELF_T_WORD,
+      .format = 'd',
+    },
+  };
+
+#define        EXTRA_NOTES                                                       \
+  EXTRA_NOTES_FPREGSET                                                   \
+  EXTRA_NOTES_HIGH_GPRS                                                          \
+  EXTRA_ITEMS (NT_S390_LAST_BREAK, 8, last_break_items)          \
+  EXTRA_ITEMS (NT_S390_SYSTEM_CALL, 4, system_call_items)
+
+#include "linux-core-note.c"
index 528e357..26b20b4 100644 (file)
@@ -1,5 +1,5 @@
 /* Initialization of S/390 specific backend library.
-   Copyright (C) 2005, 2006 Red Hat, Inc.
+   Copyright (C) 2005, 2006, 2013 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -37,6 +37,8 @@
 /* This defines the common reloc hooks based on arm_reloc.def.  */
 #include "common-reloc.c"
 
+extern __typeof (s390_core_note) s390x_core_note;
+
 
 const char *
 s390_init (elf, machine, eh, ehlen)
@@ -55,6 +57,20 @@ s390_init (elf, machine, eh, ehlen)
   HOOK (eh, reloc_simple_type);
   HOOK (eh, register_info);
   HOOK (eh, return_value_location);
+  if (eh->class == ELFCLASS64)
+    eh->core_note = s390x_core_note;
+  else
+    HOOK (eh, core_note);
+  HOOK (eh, abi_cfi);
+  /* gcc/config/ #define DWARF_FRAME_REGISTERS 34.
+     But from the gcc/config/s390/s390.h "Register usage." comment it looks as
+     if #32 (Argument pointer) and #33 (Condition code) are not used for
+     unwinding.  */
+  eh->frame_nregs = 32;
+  HOOK (eh, set_initial_registers_tid);
+  if (eh->class == ELFCLASS32)
+    HOOK (eh, normalize_pc);
+  HOOK (eh, unwind);
 
   /* Only the 64-bit format uses the incorrect hash table entry size.  */
   if (eh->class == ELFCLASS64)
diff --git a/backends/s390_initreg.c b/backends/s390_initreg.c
new file mode 100644 (file)
index 0000000..b4c4b67
--- /dev/null
@@ -0,0 +1,95 @@
+/* Fetch live process registers from TID.
+   Copyright (C) 2013 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 "system.h"
+#include <assert.h>
+#ifdef __s390__
+# include <sys/user.h>
+# include <asm/ptrace.h>
+# include <sys/ptrace.h>
+#endif
+
+#define BACKEND s390_
+#include "libebl_CPU.h"
+
+bool
+s390_set_initial_registers_tid (pid_t tid __attribute__ ((unused)),
+                         ebl_tid_registers_t *setfunc __attribute__ ((unused)),
+                               void *arg __attribute__ ((unused)))
+{
+#ifndef __s390__
+  return false;
+#else /* __s390__ */
+  struct user user_regs;
+  ptrace_area parea;
+  parea.process_addr = (uintptr_t) &user_regs;
+  parea.kernel_addr = 0;
+  parea.len = sizeof (user_regs);
+  if (ptrace (PTRACE_PEEKUSR_AREA, tid, &parea, NULL) != 0)
+    return false;
+  /* If we run as s390x we get the 64-bit registers of tid.
+     But -m31 executable seems to use only the 32-bit parts of its
+     registers so we ignore the upper half.  */
+  Dwarf_Word dwarf_regs[16];
+  for (unsigned u = 0; u < 16; u++)
+    dwarf_regs[u] = user_regs.regs.gprs[u];
+  if (! setfunc (0, 16, dwarf_regs, arg))
+    return false;
+  /* Avoid conversion double -> integer.  */
+  eu_static_assert (sizeof user_regs.regs.fp_regs.fprs[0]
+                   == sizeof dwarf_regs[0]);
+  for (unsigned u = 0; u < 16; u++)
+    {
+      // Store the double bits as is in the Dwarf_Word without conversion.
+      union
+       {
+         double d;
+         Dwarf_Word w;
+       } fpr = { .d = user_regs.regs.fp_regs.fprs[u] };
+      dwarf_regs[u] = fpr.w;
+    }
+
+  if (! setfunc (16, 16, dwarf_regs, arg))
+    return false;
+  dwarf_regs[0] = user_regs.regs.psw.addr;
+  return setfunc (-1, 1, dwarf_regs, arg);
+#endif /* __s390__ */
+}
+
+void
+s390_normalize_pc (Ebl *ebl __attribute__ ((unused)), Dwarf_Addr *pc)
+{
+  assert (ebl->class == ELFCLASS32);
+
+  /* Clear S390 bit 31.  */
+  *pc &= (1U << 31) - 1;
+}
index 4cebe45..a927d46 100644 (file)
@@ -1,5 +1,5 @@
 /* Function return value location for S/390 ABI.
-   Copyright (C) 2006, 2007 Red Hat, Inc.
+   Copyright (C) 2006, 2007, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -68,27 +68,10 @@ s390_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
 {
   /* Start with the function's type, and get the DW_AT_type attribute,
      which is the type of the return value.  */
-
-  Dwarf_Attribute attr_mem;
-  Dwarf_Attribute *attr = dwarf_attr_integrate (functypedie, DW_AT_type,
-                                               &attr_mem);
-  if (attr == NULL)
-    /* The function has no return value, like a `void' function in C.  */
-    return 0;
-
-  Dwarf_Die die_mem;
-  Dwarf_Die *typedie = dwarf_formref_die (attr, &die_mem);
-  int tag = dwarf_tag (typedie);
-
-  /* Follow typedefs and qualifiers to get to the actual type.  */
-  while (tag == DW_TAG_typedef
-        || tag == DW_TAG_const_type || tag == DW_TAG_volatile_type
-        || tag == DW_TAG_restrict_type || tag == DW_TAG_mutable_type)
-    {
-      attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
-      typedie = dwarf_formref_die (attr, &die_mem);
-      tag = dwarf_tag (typedie);
-    }
+  Dwarf_Die die_mem, *typedie = &die_mem;
+  int tag = dwarf_peeled_die_type (functypedie, typedie);
+  if (tag <= 0)
+    return tag;
 
   Dwarf_Word size;
   switch (tag)
@@ -99,9 +82,10 @@ s390_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_subrange_type:
       if (! dwarf_hasattr_integrate (typedie, DW_AT_byte_size))
        {
+         Dwarf_Attribute attr_mem, *attr;
          attr = dwarf_attr (typedie, DW_AT_type, &attr_mem);
          typedie = dwarf_formref_die (attr, &die_mem);
-         tag = dwarf_tag (typedie);
+         tag = DWARF_TAG_OR_RETURN (typedie);
        }
       /* Fall through.  */
 
@@ -115,6 +99,7 @@ s390_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
        if (dwarf_diecu (typedie, &cudie, &asize, NULL) == NULL)
          return -1;
 
+       Dwarf_Attribute attr_mem;
        if (dwarf_formudata (dwarf_attr (typedie, DW_AT_byte_size,
                                         &attr_mem), &size) != 0)
          {
diff --git a/backends/s390_unwind.c b/backends/s390_unwind.c
new file mode 100644 (file)
index 0000000..752bc28
--- /dev/null
@@ -0,0 +1,139 @@
+/* Get previous frame state for an existing frame state.
+   Copyright (C) 2013 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 <stdlib.h>
+#include <assert.h>
+
+#define BACKEND s390_
+#include "libebl_CPU.h"
+
+/* s390/s390x do not annotate signal handler frame by CFI.  It would be also
+   difficult as PC points into a stub built on stack.  Function below is called
+   only if unwinder could not find CFI.  Function then verifies the register
+   state for this frame really belongs to a signal frame.  In such case it
+   fetches original registers saved by the signal frame.  */
+
+bool
+s390_unwind (Ebl *ebl, Dwarf_Addr pc, ebl_tid_registers_t *setfunc,
+            ebl_tid_registers_get_t *getfunc, ebl_pid_memory_read_t *readfunc,
+            void *arg, bool *signal_framep)
+{
+  /* Caller already assumed caller adjustment but S390 instructions are 4 bytes
+     long.  Undo it.  */
+  if ((pc & 0x3) != 0x3)
+    return false;
+  pc++;
+  /* We can assume big-endian read here.  */
+  Dwarf_Word instr;
+  if (! readfunc (pc, &instr, arg))
+    return false;
+  /* Fetch only the very first two bytes.  */
+  instr = (instr >> (ebl->class == ELFCLASS64 ? 48 : 16)) & 0xffff;
+  /* See GDB s390_sigtramp_frame_sniffer.  */
+  /* Check for 'svc' as the first instruction.  */
+  if (((instr >> 8) & 0xff) != 0x0a)
+    return false;
+  /* Check for 'sigreturn' or 'rt_sigreturn' as the second instruction.  */
+  if ((instr & 0xff) != 119 && (instr & 0xff) != 173)
+    return false;
+  /* See GDB s390_sigtramp_frame_unwind_cache.  */
+  Dwarf_Word this_sp;
+  if (! getfunc (0 + 15, 1, &this_sp, arg))
+    return false;
+  unsigned word_size = ebl->class == ELFCLASS64 ? 8 : 4;
+  Dwarf_Addr next_cfa = this_sp + 16 * word_size + 32;
+  /* "New-style RT frame" is not supported,
+     assuming "Old-style RT frame and all non-RT frames".
+     Pointer to the array of saved registers is at NEXT_CFA + 8.  */
+  Dwarf_Word sigreg_ptr;
+  if (! readfunc (next_cfa + 8, &sigreg_ptr, arg))
+    return false;
+  /* Skip PSW mask.  */
+  sigreg_ptr += word_size;
+  /* Read PSW address.  */
+  Dwarf_Word val;
+  if (! readfunc (sigreg_ptr, &val, arg))
+    return false;
+  if (! setfunc (-1, 1, &val, arg))
+    return false;
+  sigreg_ptr += word_size;
+  /* Then the GPRs.  */
+  Dwarf_Word gprs[16];
+  for (int i = 0; i < 16; i++)
+    {
+      if (! readfunc (sigreg_ptr, &gprs[i], arg))
+       return false;
+      sigreg_ptr += word_size;
+    }
+  /* Then the ACRs.  Skip them, they are not used in CFI.  */
+  for (int i = 0; i < 16; i++)
+    sigreg_ptr += 4;
+  /* The floating-point control word.  */
+  sigreg_ptr += 8;
+  /* And finally the FPRs.  */
+  Dwarf_Word fprs[16];
+  for (int i = 0; i < 16; i++)
+    {
+      if (! readfunc (sigreg_ptr, &val, arg))
+       return false;
+      if (ebl->class == ELFCLASS32)
+       {
+         Dwarf_Addr val_low;
+         if (! readfunc (sigreg_ptr + 4, &val_low, arg))
+           return false;
+         val = (val << 32) | val_low;
+       }
+      fprs[i] = val;
+      sigreg_ptr += 8;
+    }
+  /* If we have them, the GPR upper halves are appended at the end.  */
+  if (ebl->class == ELFCLASS32)
+    {
+      /* Skip signal number.  */
+      sigreg_ptr += 4;
+      for (int i = 0; i < 16; i++)
+       {
+         if (! readfunc (sigreg_ptr, &val, arg))
+           return false;
+         Dwarf_Word val_low = gprs[i];
+         val = (val << 32) | val_low;
+         gprs[i] = val;
+         sigreg_ptr += 4;
+       }
+    }
+  if (! setfunc (0, 16, gprs, arg))
+    return false;
+  if (! setfunc (16, 16, fprs, arg))
+    return false;
+  *signal_framep = true;
+  return true;
+}
diff --git a/backends/s390x_corenote.c b/backends/s390x_corenote.c
new file mode 100644 (file)
index 0000000..427bf7d
--- /dev/null
@@ -0,0 +1,2 @@
+#define BITS 64
+#include "s390_corenote.c"
index 3d323a9..d433236 100644 (file)
@@ -50,7 +50,7 @@ sh_register_info (Ebl *ebl __attribute__ ((unused)),
   if (regno < 0 || regno > 103 || namelen < 6)
     return -1;
 
-  *prefix = NULL;
+  *prefix = "";
   *bits = 32;
   *type = DW_ATE_signed;
 
index 4692d35..d44f260 100644 (file)
@@ -1,5 +1,5 @@
 /* Function return value location for Linux/SH ABI.
-   Copyright (C) 2010 Red Hat, Inc.
+   Copyright (C) 2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Contributed by Matt Fleming <matt@console-pimps.org>.
 
@@ -65,27 +65,10 @@ sh_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
 {
   /* Start with the function's type, and get the DW_AT_type attribute,
      which is the type of the return value.  */
-
-  Dwarf_Attribute attr_mem;
-  Dwarf_Attribute *attr = dwarf_attr_integrate (functypedie, DW_AT_type,
-                                               &attr_mem);
-  if (attr == NULL)
-    /* The function has no return value, like a `void' function in C.  */
-    return 0;
-
-  Dwarf_Die die_mem;
-  Dwarf_Die *typedie = dwarf_formref_die (attr, &die_mem);
-  int tag = dwarf_tag (typedie);
-
-  /* Follow typedefs and qualifiers to get to the actual type.  */
-  while (tag == DW_TAG_typedef
-        || tag == DW_TAG_const_type || tag == DW_TAG_volatile_type
-        || tag == DW_TAG_restrict_type || tag == DW_TAG_mutable_type)
-    {
-      attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
-      typedie = dwarf_formref_die (attr, &die_mem);
-      tag = dwarf_tag (typedie);
-    }
+  Dwarf_Die die_mem, *typedie = &die_mem;
+  int tag = dwarf_peeled_die_type (functypedie, typedie);
+  if (tag <= 0)
+    return tag;
 
   Dwarf_Word size;
   switch (tag)
@@ -96,9 +79,10 @@ sh_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_subrange_type:
       if (! dwarf_hasattr_integrate (typedie, DW_AT_byte_size))
        {
+         Dwarf_Attribute attr_mem, *attr;
          attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
          typedie = dwarf_formref_die (attr, &die_mem);
-         tag = dwarf_tag (typedie);
+         tag = DWARF_TAG_OR_RETURN (typedie);
        }
       /* Fall through.  */
 
@@ -106,18 +90,23 @@ sh_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_enumeration_type:
     case DW_TAG_pointer_type:
     case DW_TAG_ptr_to_member_type:
-      if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
-                                                &attr_mem), &size) != 0)
-       {
-         if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
-           size = 4;
-         else
-           return -1;
-       }
+      {
+       Dwarf_Attribute attr_mem;
+       if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
+                                                  &attr_mem), &size) != 0)
+         {
+           if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
+             size = 4;
+           else
+             return -1;
+         }
+      }
+
       if (size <= 8)
        {
          if (tag == DW_TAG_base_type)
            {
+             Dwarf_Attribute attr_mem;
              Dwarf_Word encoding;
              if (dwarf_formudata (dwarf_attr_integrate (typedie,
                                                         DW_AT_encoding,
index 2c2728c..e1b1775 100644 (file)
@@ -1,5 +1,5 @@
 /* Function return value location for SPARC.
-   Copyright (C) 2006-2010 Red Hat, Inc.
+   Copyright (C) 2006-2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -72,27 +72,10 @@ sparc_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
 {
   /* Start with the function's type, and get the DW_AT_type attribute,
      which is the type of the return value.  */
-
-  Dwarf_Attribute attr_mem;
-  Dwarf_Attribute *attr = dwarf_attr_integrate (functypedie, DW_AT_type,
-                                               &attr_mem);
-  if (attr == NULL)
-    /* The function has no return value, like a `void' function in C.  */
-    return 0;
-
-  Dwarf_Die die_mem;
-  Dwarf_Die *typedie = dwarf_formref_die (attr, &die_mem);
-  int tag = dwarf_tag (typedie);
-
-  /* Follow typedefs and qualifiers to get to the actual type.  */
-  while (tag == DW_TAG_typedef
-        || tag == DW_TAG_const_type || tag == DW_TAG_volatile_type
-        || tag == DW_TAG_restrict_type || tag == DW_TAG_mutable_type)
-    {
-      attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
-      typedie = dwarf_formref_die (attr, &die_mem);
-      tag = dwarf_tag (typedie);
-    }
+  Dwarf_Die die_mem, *typedie = &die_mem;
+  int tag = dwarf_peeled_die_type (functypedie, typedie);
+  if (tag <= 0)
+    return tag;
 
   Dwarf_Word size;
   switch (tag)
@@ -103,9 +86,10 @@ sparc_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_subrange_type:
       if (! dwarf_hasattr_integrate (typedie, DW_AT_byte_size))
        {
+         Dwarf_Attribute attr_mem, *attr;
          attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
          typedie = dwarf_formref_die (attr, &die_mem);
-         tag = dwarf_tag (typedie);
+         tag = DWARF_TAG_OR_RETURN (typedie);
        }
       /* Fall through.  */
 
@@ -113,19 +97,24 @@ sparc_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_enumeration_type:
     case DW_TAG_pointer_type:
     case DW_TAG_ptr_to_member_type:
-      if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
-                                                &attr_mem), &size) != 0)
-       {
-         uint8_t asize;
-         Dwarf_Die cudie;
-         if ((tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
-             && dwarf_diecu (typedie, &cudie, &asize, NULL) != NULL)
-           size = asize;
-         else
-           return -1;
-       }
+      {
+       Dwarf_Attribute attr_mem;
+       if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
+                                                  &attr_mem), &size) != 0)
+         {
+           uint8_t asize;
+           Dwarf_Die cudie;
+           if ((tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
+               && dwarf_diecu (typedie, &cudie, &asize, NULL) != NULL)
+             size = asize;
+           else
+             return -1;
+         }
+      }
+
       if (tag == DW_TAG_base_type)
        {
+         Dwarf_Attribute attr_mem;
          Dwarf_Word encoding;
          if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_encoding,
                                                     &attr_mem),
index fd4feef..db81a20 100644 (file)
@@ -1,5 +1,6 @@
 /* Function return value location for Linux/TILE-Gx ABI.
    Copyright (C) 2012 Tilera Corporation
+   Copyright (C) 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -59,27 +60,10 @@ tilegx_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
 {
   /* Start with the function's type, and get the DW_AT_type attribute,
      which is the type of the return value.  */
-
-  Dwarf_Attribute attr_mem;
-  Dwarf_Attribute *attr = dwarf_attr_integrate (functypedie, DW_AT_type,
-                                               &attr_mem);
-  if (attr == NULL)
-    /* The function has no return value, like a `void' function in C.  */
-    return 0;
-
-  Dwarf_Die die_mem;
-  Dwarf_Die *typedie = dwarf_formref_die (attr, &die_mem);
-  int tag = dwarf_tag (typedie);
-
-  /* Follow typedefs and qualifiers to get to the actual type.  */
-  while (tag == DW_TAG_typedef
-        || tag == DW_TAG_const_type || tag == DW_TAG_volatile_type
-        || tag == DW_TAG_restrict_type || tag == DW_TAG_mutable_type)
-    {
-      attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
-      typedie = dwarf_formref_die (attr, &die_mem);
-      tag = dwarf_tag (typedie);
-    }
+  Dwarf_Die die_mem, *typedie = &die_mem;
+  int tag = dwarf_peeled_die_type (functypedie, typedie);
+  if (tag <= 0)
+    return tag;
 
   Dwarf_Word size;
   switch (tag)
@@ -90,9 +74,10 @@ tilegx_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_subrange_type:
       if (! dwarf_hasattr_integrate (typedie, DW_AT_byte_size))
        {
+         Dwarf_Attribute attr_mem, *attr;
          attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
          typedie = dwarf_formref_die (attr, &die_mem);
-         tag = dwarf_tag (typedie);
+         tag = DWARF_TAG_OR_RETURN (typedie);
        }
       /* Fall through.  */
 
@@ -100,22 +85,25 @@ tilegx_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_enumeration_type:
     case DW_TAG_pointer_type:
     case DW_TAG_ptr_to_member_type:
-      if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
-                                                &attr_mem), &size) != 0)
-       {
-         if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
-           size = 8;
-         else
-           return -1;
-       }
-      if (tag == DW_TAG_base_type)
-       {
-         Dwarf_Word encoding;
-         if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_encoding,
-                                                    &attr_mem),
-                              &encoding) != 0)
-           return -1;
-        }
+      {
+       Dwarf_Attribute attr_mem;
+       if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
+                                                  &attr_mem), &size) != 0)
+         {
+           if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
+             size = 8;
+           else
+             return -1;
+         }
+       if (tag == DW_TAG_base_type)
+         {
+           Dwarf_Word encoding;
+           if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_encoding,
+                                                      &attr_mem),
+                                &encoding) != 0)
+             return -1;
+         }
+      }
 
       /* Small enough structs are passed directly in registers R0 ... R7.  */
       if (size <= 8)
@@ -139,10 +127,11 @@ tilegx_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
        {
          if (tag == DW_TAG_array_type)
            {
+             Dwarf_Attribute attr_mem, *attr;
              /* Check if it's a character array.  */
              attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
              typedie = dwarf_formref_die (attr, &die_mem);
-             tag = dwarf_tag (typedie);
+             tag = DWARF_TAG_OR_RETURN (typedie);
              if (tag != DW_TAG_base_type)
                goto aggregate;
              if (dwarf_formudata (dwarf_attr_integrate (typedie,
index 67a5880..b885558 100644 (file)
@@ -1,5 +1,5 @@
 /* Initialization of x86-64 specific backend library.
-   Copyright (C) 2002-2009 Red Hat, Inc.
+   Copyright (C) 2002-2009, 2013 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -60,6 +60,9 @@ x86_64_init (elf, machine, eh, ehlen)
   HOOK (eh, auxv_info);
   HOOK (eh, disasm);
   HOOK (eh, abi_cfi);
+  /* gcc/config/ #define DWARF_FRAME_REGISTERS.  */
+  eh->frame_nregs = 17;
+  HOOK (eh, set_initial_registers_tid);
 
   return MODVERSION;
 }
diff --git a/backends/x86_64_initreg.c b/backends/x86_64_initreg.c
new file mode 100644 (file)
index 0000000..db9216e
--- /dev/null
@@ -0,0 +1,73 @@
+/* Fetch live process registers from TID.
+   Copyright (C) 2013 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 <stdlib.h>
+#ifdef __x86_64__
+# include <sys/user.h>
+# include <sys/ptrace.h>
+#endif
+
+#define BACKEND x86_64_
+#include "libebl_CPU.h"
+
+bool
+x86_64_set_initial_registers_tid (pid_t tid __attribute__ ((unused)),
+                         ebl_tid_registers_t *setfunc __attribute__ ((unused)),
+                                 void *arg __attribute__ ((unused)))
+{
+#if !defined(__x86_64__) || !defined(__linux__)
+  return false;
+#else /* __x86_64__ */
+  struct user_regs_struct user_regs;
+  if (ptrace (PTRACE_GETREGS, tid, NULL, &user_regs) != 0)
+    return false;
+  Dwarf_Word dwarf_regs[17];
+  dwarf_regs[0] = user_regs.rax;
+  dwarf_regs[1] = user_regs.rdx;
+  dwarf_regs[2] = user_regs.rcx;
+  dwarf_regs[3] = user_regs.rbx;
+  dwarf_regs[4] = user_regs.rsi;
+  dwarf_regs[5] = user_regs.rdi;
+  dwarf_regs[6] = user_regs.rbp;
+  dwarf_regs[7] = user_regs.rsp;
+  dwarf_regs[8] = user_regs.r8;
+  dwarf_regs[9] = user_regs.r9;
+  dwarf_regs[10] = user_regs.r10;
+  dwarf_regs[11] = user_regs.r11;
+  dwarf_regs[12] = user_regs.r12;
+  dwarf_regs[13] = user_regs.r13;
+  dwarf_regs[14] = user_regs.r14;
+  dwarf_regs[15] = user_regs.r15;
+  dwarf_regs[16] = user_regs.rip;
+  return setfunc (0, 17, dwarf_regs, arg);
+#endif /* __x86_64__ */
+}
index d67b05f..b3799ae 100644 (file)
@@ -1,5 +1,5 @@
 /* Function return value location for Linux/x86-64 ABI.
-   Copyright (C) 2005-2010 Red Hat, Inc.
+   Copyright (C) 2005-2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -81,27 +81,10 @@ x86_64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
 {
   /* Start with the function's type, and get the DW_AT_type attribute,
      which is the type of the return value.  */
-
-  Dwarf_Attribute attr_mem;
-  Dwarf_Attribute *attr = dwarf_attr_integrate (functypedie, DW_AT_type,
-                                               &attr_mem);
-  if (attr == NULL)
-    /* The function has no return value, like a `void' function in C.  */
-    return 0;
-
-  Dwarf_Die die_mem;
-  Dwarf_Die *typedie = dwarf_formref_die (attr, &die_mem);
-  int tag = dwarf_tag (typedie);
-
-  /* Follow typedefs and qualifiers to get to the actual type.  */
-  while (tag == DW_TAG_typedef
-        || tag == DW_TAG_const_type || tag == DW_TAG_volatile_type
-        || tag == DW_TAG_restrict_type || tag == DW_TAG_mutable_type)
-    {
-      attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
-      typedie = dwarf_formref_die (attr, &die_mem);
-      tag = dwarf_tag (typedie);
-    }
+  Dwarf_Die die_mem, *typedie = &die_mem;
+  int tag = dwarf_peeled_die_type (functypedie, typedie);
+  if (tag <= 0)
+    return tag;
 
   Dwarf_Word size;
   switch (tag)
@@ -112,9 +95,10 @@ x86_64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_subrange_type:
       if (! dwarf_hasattr_integrate (typedie, DW_AT_byte_size))
        {
+         Dwarf_Attribute attr_mem, *attr;
          attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
          typedie = dwarf_formref_die (attr, &die_mem);
-         tag = dwarf_tag (typedie);
+         tag = DWARF_TAG_OR_RETURN (typedie);
        }
       /* Fall through.  */
 
@@ -122,16 +106,21 @@ x86_64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
     case DW_TAG_enumeration_type:
     case DW_TAG_pointer_type:
     case DW_TAG_ptr_to_member_type:
-      if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
-                                                &attr_mem), &size) != 0)
-       {
-         if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
-           size = 8;
-         else
-           return -1;
-       }
+      {
+       Dwarf_Attribute attr_mem;
+       if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
+                                                  &attr_mem), &size) != 0)
+         {
+           if (tag == DW_TAG_pointer_type || tag == DW_TAG_ptr_to_member_type)
+             size = 8;
+           else
+             return -1;
+         }
+      }
+
       if (tag == DW_TAG_base_type)
        {
+         Dwarf_Attribute attr_mem;
          Dwarf_Word encoding;
          if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_encoding,
                                                     &attr_mem),
index e3ca087..8ceb0f9 100644 (file)
@@ -3,8 +3,35 @@
 /* Should ar and ranlib use -D behavior by default? */
 #undef DEFAULT_AR_DETERMINISTIC
 
-/* Defined if libdw should support GNU ref_alt FORM, dwz multi files. */
-#undef ENABLE_DWZ
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if <sys/user.h> defines struct user_regs_struct */
+#undef HAVE_SYS_USER_REGS
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
 
 /* $libdir subdirectory containing libebl modules. */
 #undef LIBEBL_SUBDIR
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
 
+/* The size of `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
 /* Support bzip2 decompression via -lbz2. */
 #undef USE_BZLIB
 
    `char[]'. */
 #undef YYTEXT_POINTER
 
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
 /* Number of bits in a file offset, on hosts where this is settable. */
 #undef _FILE_OFFSET_BITS
 
index 02ecd97..9ebf14f 100644 (file)
@@ -1,3 +1,46 @@
+2014-08-25  Mark Wielaard  <mjw@redhat.com>
+
+       * elfutils.spec.in: Update for 0.160.
+
+2014-05-17  Mark Wielaard  <mjw@redhat.com>
+
+       * elfutils.spec.in: Update for 0.159.
+       (%files devel): Add libdwelf.h.
+
+2014-04-13  Mark Wielaard  <mjw@redhat.com>
+
+       * eu.am (AM_CFLAGS): Don't add -fmudflap.
+       (COMPILE.os): Don't remove no_mudflap.os.
+
+2014-01-22  Mark Wielaard  <mjw@redhat.com>
+
+       * eu.am (AM_CFLAGS): Unconditionally add -Wformat=2.
+
+2014-01-03  Mark Wielaard  <mjw@redhat.com>
+
+       * elfutils.spec.in: Update for 0.158.
+
+2013-11-01  Michael Forney  <mforney@mforney.org>
+
+       * eu.am: Use READELF.
+
+2013-09-30  Mark Wielaard  <mjw@redhat.com>
+
+       * elfutils.spec.in: Update for readelf NT_SIGINFO and NT_FILE
+       core notes.
+
+2013-09-27  Mark Wielaard  <mjw@redhat.com>
+
+       * config/elfutils.spec.in: Update for 0.157.
+
+2013-07-25  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * config/elfutils.spec.in: Update for 0.156.
+
+2013-04-24  Mark Wielaard  <mjw@redhat.com>
+
+       * eu.am: Use AM_CPPFLAGS instead of INCLUDES.
+
 2012-08-27  Mark Wielaard  <mjw@redhat.com>
 
        * config/elfutils.spec.in: Update for 0.155.
index 1e6dae7..186fe08 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 @SET_MAKE@
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -34,10 +78,11 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 subdir = config
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog \
-       config.guess config.sub depcomp install-sh missing ylwrap
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ChangeLog \
+       ar-lib config.guess config.sub depcomp install-sh missing
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
        $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/zip.m4 \
        $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
@@ -46,18 +91,40 @@ mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 SOURCES =
 DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
+CC_BIARCH = @CC_BIARCH@
 CFLAGS = @CFLAGS@
+CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEBUGPRED = @DEBUGPRED@
@@ -66,10 +133,13 @@ DEPDIR = @DEPDIR@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_VALGRIND = @HAVE_VALGRIND@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -90,6 +160,7 @@ MODVERSION = @MODVERSION@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
+NM = @NM@
 OBJEXT = @OBJEXT@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -100,6 +171,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+READELF = @READELF@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
@@ -114,6 +186,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -197,11 +270,11 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
-tags: TAGS
-TAGS:
+tags TAGS:
+
+ctags CTAGS:
 
-ctags: CTAGS
-CTAGS:
+cscope cscopelist:
 
 
 distdir: $(DISTFILES)
@@ -336,15 +409,16 @@ uninstall-am:
 
 .MAKE: install-am install-strip
 
-.PHONY: all all-am check check-am clean clean-generic distclean \
-       distclean-generic distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
-       mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am
+.PHONY: all all-am check check-am clean clean-generic cscopelist-am \
+       ctags-am distclean distclean-generic distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+       pdf-am ps ps-am tags-am uninstall uninstall-am
 
 
 @MAINTAINER_MODE_TRUE@$(srcdir)/elfutils.spec.in: $(top_srcdir)/NEWS
diff --git a/config/ar-lib b/config/ar-lib
new file mode 100755 (executable)
index 0000000..fe2301e
--- /dev/null
@@ -0,0 +1,270 @@
+#! /bin/sh
+# Wrapper for Microsoft lib.exe
+
+me=ar-lib
+scriptversion=2012-03-01.08; # UTC
+
+# Copyright (C) 2010-2013 Free Software Foundation, Inc.
+# Written by Peter Rosin <peda@lysator.liu.se>.
+#
+# 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 2, 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 to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+
+# func_error message
+func_error ()
+{
+  echo "$me: $1" 1>&2
+  exit 1
+}
+
+file_conv=
+
+# func_file_conv build_file
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+       # lazily determine how to convert abs files
+       case `uname -s` in
+         MINGW*)
+           file_conv=mingw
+           ;;
+         CYGWIN*)
+           file_conv=cygwin
+           ;;
+         *)
+           file_conv=wine
+           ;;
+       esac
+      fi
+      case $file_conv in
+       mingw)
+         file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+         ;;
+       cygwin)
+         file=`cygpath -m "$file" || echo "$file"`
+         ;;
+       wine)
+         file=`winepath -w "$file" || echo "$file"`
+         ;;
+      esac
+      ;;
+  esac
+}
+
+# func_at_file at_file operation archive
+# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE
+# for each of them.
+# When interpreting the content of the @FILE, do NOT use func_file_conv,
+# since the user would need to supply preconverted file names to
+# binutils ar, at least for MinGW.
+func_at_file ()
+{
+  operation=$2
+  archive=$3
+  at_file_contents=`cat "$1"`
+  eval set x "$at_file_contents"
+  shift
+
+  for member
+  do
+    $AR -NOLOGO $operation:"$member" "$archive" || exit $?
+  done
+}
+
+case $1 in
+  '')
+     func_error "no command.  Try '$0 --help' for more information."
+     ;;
+  -h | --h*)
+    cat <<EOF
+Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...]
+
+Members may be specified in a file named with @FILE.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "$me, version $scriptversion"
+    exit $?
+    ;;
+esac
+
+if test $# -lt 3; then
+  func_error "you must specify a program, an action and an archive"
+fi
+
+AR=$1
+shift
+while :
+do
+  if test $# -lt 2; then
+    func_error "you must specify a program, an action and an archive"
+  fi
+  case $1 in
+    -lib | -LIB \
+    | -ltcg | -LTCG \
+    | -machine* | -MACHINE* \
+    | -subsystem* | -SUBSYSTEM* \
+    | -verbose | -VERBOSE \
+    | -wx* | -WX* )
+      AR="$AR $1"
+      shift
+      ;;
+    *)
+      action=$1
+      shift
+      break
+      ;;
+  esac
+done
+orig_archive=$1
+shift
+func_file_conv "$orig_archive"
+archive=$file
+
+# strip leading dash in $action
+action=${action#-}
+
+delete=
+extract=
+list=
+quick=
+replace=
+index=
+create=
+
+while test -n "$action"
+do
+  case $action in
+    d*) delete=yes  ;;
+    x*) extract=yes ;;
+    t*) list=yes    ;;
+    q*) quick=yes   ;;
+    r*) replace=yes ;;
+    s*) index=yes   ;;
+    S*)             ;; # the index is always updated implicitly
+    c*) create=yes  ;;
+    u*)             ;; # TODO: don't ignore the update modifier
+    v*)             ;; # TODO: don't ignore the verbose modifier
+    *)
+      func_error "unknown action specified"
+      ;;
+  esac
+  action=${action#?}
+done
+
+case $delete$extract$list$quick$replace,$index in
+  yes,* | ,yes)
+    ;;
+  yesyes*)
+    func_error "more than one action specified"
+    ;;
+  *)
+    func_error "no action specified"
+    ;;
+esac
+
+if test -n "$delete"; then
+  if test ! -f "$orig_archive"; then
+    func_error "archive not found"
+  fi
+  for member
+  do
+    case $1 in
+      @*)
+        func_at_file "${1#@}" -REMOVE "$archive"
+        ;;
+      *)
+        func_file_conv "$1"
+        $AR -NOLOGO -REMOVE:"$file" "$archive" || exit $?
+        ;;
+    esac
+  done
+
+elif test -n "$extract"; then
+  if test ! -f "$orig_archive"; then
+    func_error "archive not found"
+  fi
+  if test $# -gt 0; then
+    for member
+    do
+      case $1 in
+        @*)
+          func_at_file "${1#@}" -EXTRACT "$archive"
+          ;;
+        *)
+          func_file_conv "$1"
+          $AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $?
+          ;;
+      esac
+    done
+  else
+    $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member
+    do
+      $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
+    done
+  fi
+
+elif test -n "$quick$replace"; then
+  if test ! -f "$orig_archive"; then
+    if test -z "$create"; then
+      echo "$me: creating $orig_archive"
+    fi
+    orig_archive=
+  else
+    orig_archive=$archive
+  fi
+
+  for member
+  do
+    case $1 in
+    @*)
+      func_file_conv "${1#@}"
+      set x "$@" "@$file"
+      ;;
+    *)
+      func_file_conv "$1"
+      set x "$@" "$file"
+      ;;
+    esac
+    shift
+    shift
+  done
+
+  if test -n "$orig_archive"; then
+    $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $?
+  else
+    $AR -NOLOGO -OUT:"$archive" "$@" || exit $?
+  fi
+
+elif test -n "$list"; then
+  if test ! -f "$orig_archive"; then
+    func_error "archive not found"
+  fi
+  $AR -NOLOGO -LIST "$archive" || exit $?
+fi
index 49ba16f..1804e9f 100755 (executable)
@@ -2,13 +2,13 @@
 # Attempt to guess a canonical system name.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
 #   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-#   2011, 2012 Free Software Foundation, Inc.
+#   2011, 2012, 2013 Free Software Foundation, Inc.
 
-timestamp='2012-01-01'
+timestamp='2012-12-29'
 
 # 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 2 of the License, or
+# 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
@@ -17,26 +17,22 @@ timestamp='2012-01-01'
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner.  Please send patches (context
-# diff format) to <config-patches@gnu.org> and include a ChangeLog
-# entry.
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
 #
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
+# Originally written by Per Bothner. 
 #
 # You can get the latest version of this script from:
 # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+#
+# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+
 
 me=`echo "$0" | sed -e 's,.*/,,'`
 
@@ -57,8 +53,8 @@ GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-Free Software Foundation, Inc.
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
+2012, 2013 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -202,6 +198,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
        # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
        echo "${machine}-${os}${release}"
        exit ;;
+    *:Bitrig:*:*)
+       UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+       echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
+       exit ;;
     *:OpenBSD:*:*)
        UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
        echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
@@ -304,7 +304,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
        echo arm-acorn-riscix${UNAME_RELEASE}
        exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
        echo arm-unknown-riscos
        exit ;;
     SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
@@ -803,6 +803,9 @@ EOF
     i*:CYGWIN*:*)
        echo ${UNAME_MACHINE}-pc-cygwin
        exit ;;
+    *:MINGW64*:*)
+       echo ${UNAME_MACHINE}-pc-mingw64
+       exit ;;
     *:MINGW*:*)
        echo ${UNAME_MACHINE}-pc-mingw32
        exit ;;
@@ -863,6 +866,13 @@ EOF
     i*86:Minix:*:*)
        echo ${UNAME_MACHINE}-pc-minix
        exit ;;
+    aarch64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    aarch64_be:Linux:*:*)
+       UNAME_MACHINE=aarch64_be
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
     alpha:Linux:*:*)
        case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
          EV5)   UNAME_MACHINE=alphaev5 ;;
@@ -1196,6 +1206,9 @@ EOF
     BePC:Haiku:*:*)    # Haiku running on Intel PC compatible.
        echo i586-pc-haiku
        exit ;;
+    x86_64:Haiku:*:*)
+       echo x86_64-unknown-haiku
+       exit ;;
     SX-4:SUPER-UX:*:*)
        echo sx4-nec-superux${UNAME_RELEASE}
        exit ;;
@@ -1251,7 +1264,7 @@ EOF
     NEO-?:NONSTOP_KERNEL:*:*)
        echo neo-tandem-nsk${UNAME_RELEASE}
        exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
+    NSE-*:NONSTOP_KERNEL:*:*)
        echo nse-tandem-nsk${UNAME_RELEASE}
        exit ;;
     NSR-?:NONSTOP_KERNEL:*:*)
@@ -1320,11 +1333,11 @@ EOF
     i*86:AROS:*:*)
        echo ${UNAME_MACHINE}-pc-aros
        exit ;;
+    x86_64:VMkernel:*:*)
+       echo ${UNAME_MACHINE}-unknown-esx
+       exit ;;
 esac
 
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
 eval $set_cc_for_build
 cat >$dummy.c <<EOF
 #ifdef _SEQUENT_
index d6b6b3c..52f04bc 100755 (executable)
@@ -2,37 +2,32 @@
 # Configuration validation subroutine script.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
 #   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-#   2011, 2012 Free Software Foundation, Inc.
+#   2011, 2012, 2013 Free Software Foundation, Inc.
 
-timestamp='2012-01-01'
+timestamp='2012-12-29'
 
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# 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 2 of the License, or
+# 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.
 #
-# 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.
+# 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, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
 
 
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
+# Please send patches with a ChangeLog entry to config-patches@gnu.org.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
@@ -76,8 +71,8 @@ version="\
 GNU config.sub ($timestamp)
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-Free Software Foundation, Inc.
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
+2012, 2013 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -125,13 +120,17 @@ esac
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
-  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
   knetbsd*-gnu* | netbsd*-gnu* | \
   kopensolaris*-gnu* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
     ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
   *)
     basic_machine=`echo $1 | sed 's/-[^-]*$//'`
     if [ $basic_machine != $1 ]
@@ -154,7 +153,7 @@ case $os in
        -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
        -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
        -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-       -apple | -axis | -knuth | -cray | -microblaze)
+       -apple | -axis | -knuth | -cray | -microblaze*)
                os=
                basic_machine=$1
                ;;
@@ -223,6 +222,12 @@ case $os in
        -isc*)
                basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
                ;;
+       -lynx*178)
+               os=-lynxos178
+               ;;
+       -lynx*5)
+               os=-lynxos5
+               ;;
        -lynx*)
                os=-lynxos
                ;;
@@ -247,11 +252,14 @@ case $basic_machine in
        # Some are omitted here because they have special meanings below.
        1750a | 580 \
        | a29k \
+       | aarch64 | aarch64_be \
        | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
        | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
        | am33_2.0 \
-       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
-        | be32 | be64 \
+       | arc \
+       | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+       | avr | avr32 \
+       | be32 | be64 \
        | bfin \
        | c4x | clipper \
        | d10v | d30v | dlx | dsp16xx \
@@ -264,7 +272,7 @@ case $basic_machine in
        | le32 | le64 \
        | lm32 \
        | m32c | m32r | m32rle | m68000 | m68k | m88k \
-       | maxq | mb | microblaze | mcore | mep | metag \
+       | maxq | mb | microblaze | microblazeel | mcore | mep | metag \
        | mips | mipsbe | mipseb | mipsel | mipsle \
        | mips16 \
        | mips64 | mips64el \
@@ -319,7 +327,7 @@ case $basic_machine in
        c6x)
                basic_machine=tic6x-unknown
                ;;
-       m6811 | m68hc11 | m6812 | m68hc12 | picochip)
+       m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
                basic_machine=$basic_machine-unknown
                os=-none
                ;;
@@ -332,7 +340,10 @@ case $basic_machine in
        strongarm | thumb | xscale)
                basic_machine=arm-unknown
                ;;
-
+       xgate)
+               basic_machine=$basic_machine-unknown
+               os=-none
+               ;;
        xscaleeb)
                basic_machine=armeb-unknown
                ;;
@@ -355,6 +366,7 @@ case $basic_machine in
        # Recognize the basic CPU types with company name.
        580-* \
        | a29k-* \
+       | aarch64-* | aarch64_be-* \
        | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
        | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
        | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
@@ -376,7 +388,8 @@ case $basic_machine in
        | lm32-* \
        | m32c-* | m32r-* | m32rle-* \
        | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-       | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+       | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+       | microblaze-* | microblazeel-* \
        | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
        | mips16-* \
        | mips64-* | mips64el-* \
@@ -775,9 +788,13 @@ case $basic_machine in
                basic_machine=ns32k-utek
                os=-sysv
                ;;
-       microblaze)
+       microblaze*)
                basic_machine=microblaze-xilinx
                ;;
+       mingw64)
+               basic_machine=x86_64-pc
+               os=-mingw64
+               ;;
        mingw32)
                basic_machine=i386-pc
                os=-mingw32
@@ -991,7 +1008,7 @@ case $basic_machine in
                ;;
        ppc64)  basic_machine=powerpc64-unknown
                ;;
-       ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+       ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
                ;;
        ppc64le | powerpc64little | ppc64-le | powerpc64-little)
                basic_machine=powerpc64le-unknown
@@ -1006,7 +1023,11 @@ case $basic_machine in
                basic_machine=i586-unknown
                os=-pw32
                ;;
-       rdos)
+       rdos | rdos64)
+               basic_machine=x86_64-pc
+               os=-rdos
+               ;;
+       rdos32)
                basic_machine=i386-pc
                os=-rdos
                ;;
@@ -1339,15 +1360,15 @@ case $os in
              | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
              | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
              | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-             | -openbsd* | -solidbsd* \
+             | -bitrig* | -openbsd* | -solidbsd* \
              | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
              | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
              | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
              | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
              | -chorusos* | -chorusrdb* | -cegcc* \
              | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-             | -mingw32* | -linux-gnu* | -linux-android* \
-             | -linux-newlib* | -linux-uclibc* \
+             | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+             | -linux-newlib* | -linux-musl* | -linux-uclibc* \
              | -uxpv* | -beos* | -mpeix* | -udk* \
              | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
              | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
@@ -1530,6 +1551,9 @@ case $basic_machine in
        c4x-* | tic4x-*)
                os=-coff
                ;;
+       hexagon-*)
+               os=-elf
+               ;;
        tic54x-*)
                os=-coff
                ;;
index bd0ac08..4ebd5b3 100755 (executable)
@@ -1,10 +1,9 @@
 #! /bin/sh
 # depcomp - compile a program generating dependencies as side-effects
 
-scriptversion=2011-12-04.11; # UTC
+scriptversion=2013-05-30.07; # UTC
 
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
-# 2011 Free Software Foundation, Inc.
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
 
 # 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
@@ -28,9 +27,9 @@ scriptversion=2011-12-04.11; # UTC
 
 case $1 in
   '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
+    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+    exit 1;
+    ;;
   -h | --h*)
     cat <<\EOF
 Usage: depcomp [--help] [--version] PROGRAM [ARGS]
@@ -40,8 +39,8 @@ as side-effects.
 
 Environment variables:
   depmode     Dependency tracking mode.
-  source      Source file read by `PROGRAMS ARGS'.
-  object      Object file output by `PROGRAMS ARGS'.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
   DEPDIR      directory where to store dependencies.
   depfile     Dependency file to output.
   tmpdepfile  Temporary file to use when outputting dependencies.
@@ -57,6 +56,66 @@ EOF
     ;;
 esac
 
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'.  Note that this directory component will
+# be either empty or ending with a '/' character.  This is deliberate.
+set_dir_from ()
+{
+  case $1 in
+    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+      *) dir=;;
+  esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+  echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+  # If the compiler actually managed to produce a dependency file,
+  # post-process it.
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form 'foo.o: dependency.h'.
+    # Do two passes, one to just change these to
+    #   $object: dependency.h
+    # and one to simply output
+    #   dependency.h:
+    # which is needed to avoid the deleted-header problem.
+    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+    } > "$depfile"
+    rm -f "$tmpdepfile"
+  else
+    make_dummy_depfile
+  fi
+}
+
+# A tabulation character.
+tab='  '
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
 if test -z "$depmode" || test -z "$source" || test -z "$object"; then
   echo "depcomp: Variables source, object and depmode must be set" 1>&2
   exit 1
@@ -69,6 +128,9 @@ tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
 
 rm -f "$tmpdepfile"
 
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
 # Some modes work just like other modes, but use different flags.  We
 # parameterize here, but still list the modes in the big case below,
 # to make depend.m4 easier to write.  Note that we *cannot* use a case
@@ -80,26 +142,32 @@ if test "$depmode" = hp; then
 fi
 
 if test "$depmode" = dashXmstdout; then
-   # This is just like dashmstdout with a different argument.
-   dashmflag=-xM
-   depmode=dashmstdout
+  # This is just like dashmstdout with a different argument.
+  dashmflag=-xM
+  depmode=dashmstdout
 fi
 
 cygpath_u="cygpath -u -f -"
 if test "$depmode" = msvcmsys; then
-   # This is just like msvisualcpp but w/o cygpath translation.
-   # Just convert the backslash-escaped backslashes to single forward
-   # slashes to satisfy depend.m4
-   cygpath_u='sed s,\\\\,/,g'
-   depmode=msvisualcpp
+  # This is just like msvisualcpp but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvisualcpp
 fi
 
 if test "$depmode" = msvc7msys; then
-   # This is just like msvc7 but w/o cygpath translation.
-   # Just convert the backslash-escaped backslashes to single forward
-   # slashes to satisfy depend.m4
-   cygpath_u='sed s,\\\\,/,g'
-   depmode=msvc7
+  # This is just like msvc7 but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+  gccflag=-qmakedep=gcc,-MF
+  depmode=gcc
 fi
 
 case "$depmode" in
@@ -122,8 +190,7 @@ gcc3)
   done
   "$@"
   stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
@@ -131,13 +198,17 @@ gcc3)
   ;;
 
 gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
 ## There are various ways to get dependency output from gcc.  Here's
 ## why we pick this rather obscure method:
 ## - Don't want to use -MD because we'd like the dependencies to end
 ##   up in a subdir.  Having to rename by hand is ugly.
 ##   (We might end up doing this anyway to support other compilers.)
 ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-##   -MM, not -M (despite what the docs say).
+##   -MM, not -M (despite what the docs say).  Also, it might not be
+##   supported by the other compilers which use the 'gcc' depmode.
 ## - Using -M directly means running the compiler twice (even worse
 ##   than renaming).
   if test -z "$gccflag"; then
@@ -145,33 +216,31 @@ gcc)
   fi
   "$@" -Wp,"$gccflag$tmpdepfile"
   stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
-  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
+  # The second -e expression handles DOS-style file names with drive
+  # letters.
   sed -e 's/^[^:]*: / /' \
       -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
+## This next piece of magic avoids the "deleted header file" problem.
 ## The problem is that when a header file which appears in a .P file
 ## is deleted, the dependency causes make to die (because there is
 ## typically no way to rebuild the header).  We avoid this by adding
 ## dummy dependencies for each header file.  Too bad gcc doesn't do
 ## this for us directly.
-  tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'.  On the theory
+## Some versions of gcc put a space before the ':'.  On the theory
 ## that the space means something, we add a space to the output as
 ## well.  hp depmode also adds that space, but also prefixes the VPATH
 ## to the object.  Take care to not repeat it in the output.
 ## Some versions of the HPUX 10.20 sed can't process this invocation
 ## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
-      | sed -e 's/$/ :/' >> "$depfile"
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
@@ -189,8 +258,7 @@ sgi)
     "$@" -MDupdate "$tmpdepfile"
   fi
   stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
@@ -198,43 +266,41 @@ sgi)
 
   if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
     echo "$object : \\" > "$depfile"
-
     # Clip off the initial element (the dependent).  Don't try to be
     # clever and replace this with sed code, as IRIX sed won't handle
     # lines with more than a fixed number of characters (4096 in
     # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like `#:fec' to the end of the
+    # the IRIX cc adds comments like '#:fec' to the end of the
     # dependency line.
-    tr ' ' '
-' < "$tmpdepfile" \
-    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr '
-' ' ' >> "$depfile"
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+      | tr "$nl" ' ' >> "$depfile"
     echo >> "$depfile"
-
     # The second pass generates a dummy entry for each header file.
-    tr ' ' '
-' < "$tmpdepfile" \
-   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
-   >> "$depfile"
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+      >> "$depfile"
   else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
+    make_dummy_depfile
   fi
   rm -f "$tmpdepfile"
   ;;
 
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
 aix)
   # The C for AIX Compiler uses -M and outputs the dependencies
   # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
   # start of each line; $object doesn't have directory information.
   # Version 6 uses the directory in both cases.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  set_dir_from "$object"
+  set_base_from "$object"
   if test "$libtool" = yes; then
     tmpdepfile1=$dir$base.u
     tmpdepfile2=$base.u
@@ -247,9 +313,7 @@ aix)
     "$@" -M
   fi
   stat=$?
-
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
     exit $stat
   fi
@@ -258,44 +322,100 @@ aix)
   do
     test -f "$tmpdepfile" && break
   done
-  if test -f "$tmpdepfile"; then
-    # Each line is of the form `foo.o: dependent.h'.
-    # Do two passes, one to just change these to
-    # `$object: dependent.h' and one to simply `dependent.h:'.
-    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-    # That's a tab and a space in the [].
-    sed -e 's,^.*\.[a-z]*:[     ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
+  aix_post_process_depfile
+  ;;
+
+tcc)
+  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+  # FIXME: That version still under development at the moment of writing.
+  #        Make that this statement remains true also for stable, released
+  #        versions.
+  # It will wrap lines (doesn't matter whether long or short) with a
+  # trailing '\', as in:
+  #
+  #   foo.o : \
+  #    foo.c \
+  #    foo.h \
+  #
+  # It will put a trailing '\' even on the last line, and will use leading
+  # spaces rather than leading tabs (at least since its commit 0394caf7
+  # "Emit spaces for -MD").
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
   fi
+  rm -f "$depfile"
+  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+  # We have to change lines of the first kind to '$object: \'.
+  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+  # And for each line of the second kind, we have to emit a 'dep.h:'
+  # dummy dependency, to avoid the deleted-header problem.
+  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
-icc)
-  # Intel's C compiler understands `-MD -MF file'.  However on
-  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
-  # ICC 7.0 will fill foo.d with something like
-  #    foo.o: sub/foo.c
-  #    foo.o: sub/foo.h
-  # which is wrong.  We want:
-  #    sub/foo.o: sub/foo.c
-  #    sub/foo.o: sub/foo.h
-  #    sub/foo.c:
-  #    sub/foo.h:
-  # ICC 7.1 will output
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file.  A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+  # Portland's C compiler understands '-MD'.
+  # Will always output deps to 'file.d' where file is the root name of the
+  # source file under compilation, even if file resides in a subdirectory.
+  # The object file name does not affect the name of the '.d' file.
+  # pgcc 10.2 will output
   #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using \ :
+  # and will wrap long lines using '\' :
   #    foo.o: sub/foo.c ... \
   #     sub/foo.h ... \
   #     ...
+  set_dir_from "$object"
+  # Use the source, not the object, to determine the base name, since
+  # that's sadly what pgcc will do too.
+  set_base_from "$source"
+  tmpdepfile=$base.d
+
+  # For projects that build the same source file twice into different object
+  # files, the pgcc approach of using the *source* file root name can cause
+  # problems in parallel builds.  Use a locking strategy to avoid stomping on
+  # the same $tmpdepfile.
+  lockdir=$base.d-lock
+  trap "
+    echo '$0: caught signal, cleaning up...' >&2
+    rmdir '$lockdir'
+    exit 1
+  " 1 2 13 15
+  numtries=100
+  i=$numtries
+  while test $i -gt 0; do
+    # mkdir is a portable test-and-set.
+    if mkdir "$lockdir" 2>/dev/null; then
+      # This process acquired the lock.
+      "$@" -MD
+      stat=$?
+      # Release the lock.
+      rmdir "$lockdir"
+      break
+    else
+      # If the lock is being held by a different process, wait
+      # until the winning process is done or we timeout.
+      while test -d "$lockdir" && test $i -gt 0; do
+        sleep 1
+        i=`expr $i - 1`
+      done
+    fi
+    i=`expr $i - 1`
+  done
+  trap - 1 2 13 15
+  if test $i -le 0; then
+    echo "$0: failed to acquire lock after $numtries attempts" >&2
+    echo "$0: check lockdir '$lockdir'" >&2
+    exit 1
+  fi
 
-  "$@" -MD -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
@@ -307,8 +427,8 @@ icc)
   sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
   # Some versions of the HPUX 10.20 sed can't process this invocation
   # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
-    sed -e 's/$/ :/' >> "$depfile"
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+    sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
@@ -319,9 +439,8 @@ hp2)
   # 'foo.d', which lands next to the object file, wherever that
   # happens to be.
   # Much of this is similar to the tru64 case; see comments there.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  set_dir_from  "$object"
+  set_base_from "$object"
   if test "$libtool" = yes; then
     tmpdepfile1=$dir$base.d
     tmpdepfile2=$dir.libs/$base.d
@@ -332,8 +451,7 @@ hp2)
     "$@" +Maked
   fi
   stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
      rm -f "$tmpdepfile1" "$tmpdepfile2"
      exit $stat
   fi
@@ -343,77 +461,61 @@ hp2)
     test -f "$tmpdepfile" && break
   done
   if test -f "$tmpdepfile"; then
-    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
-    # Add `dependent.h:' lines.
+    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add 'dependent.h:' lines.
     sed -ne '2,${
-              s/^ *//
-              s/ \\*$//
-              s/$/:/
-              p
-            }' "$tmpdepfile" >> "$depfile"
+               s/^ *//
+               s/ \\*$//
+               s/$/:/
+               p
+             }' "$tmpdepfile" >> "$depfile"
   else
-    echo "#dummy" > "$depfile"
+    make_dummy_depfile
   fi
   rm -f "$tmpdepfile" "$tmpdepfile2"
   ;;
 
 tru64)
-   # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
-   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in `foo.d' instead, so we check for that too.
-   # Subdirectories are respected.
-   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-   test "x$dir" = "x$object" && dir=
-   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
-   if test "$libtool" = yes; then
-      # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mechanism is used in libtool 1.4 series to
-      # handle both shared and static libraries in a single compilation.
-      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
-      #
-      # With libtool 1.5 this exception was removed, and libtool now
-      # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in $dir.libs/$base.o.d and
-      # in $dir$base.o.d.  We have to check for both files, because
-      # one of the two compilations can be disabled.  We should prefer
-      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
-      # automatically cleaned when .libs/ is deleted, while ignoring
-      # the former would cause a distcleancheck panic.
-      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
-      tmpdepfile2=$dir$base.o.d          # libtool 1.5
-      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
-      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
-      "$@" -Wc,-MD
-   else
-      tmpdepfile1=$dir$base.o.d
-      tmpdepfile2=$dir$base.d
-      tmpdepfile3=$dir$base.d
-      tmpdepfile4=$dir$base.d
-      "$@" -MD
-   fi
-
-   stat=$?
-   if test $stat -eq 0; then :
-   else
-      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-      exit $stat
-   fi
-
-   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-   do
-     test -f "$tmpdepfile" && break
-   done
-   if test -f "$tmpdepfile"; then
-      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      # That's a tab and a space in the [].
-      sed -e 's,^.*\.[a-z]*:[   ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-   else
-      echo "#dummy" > "$depfile"
-   fi
-   rm -f "$tmpdepfile"
-   ;;
+  # The Tru64 compiler uses -MD to generate dependencies as a side
+  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+  # dependencies in 'foo.d' instead, so we check for that too.
+  # Subdirectories are respected.
+  set_dir_from  "$object"
+  set_base_from "$object"
+
+  if test "$libtool" = yes; then
+    # Libtool generates 2 separate objects for the 2 libraries.  These
+    # two compilations output dependencies in $dir.libs/$base.o.d and
+    # in $dir$base.o.d.  We have to check for both files, because
+    # one of the two compilations can be disabled.  We should prefer
+    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+    # automatically cleaned when .libs/ is deleted, while ignoring
+    # the former would cause a distcleancheck panic.
+    tmpdepfile1=$dir$base.o.d          # libtool 1.5
+    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
+    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
+    "$@" -Wc,-MD
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    tmpdepfile3=$dir$base.d
+    "$@" -MD
+  fi
+
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  # Same post-processing that is required for AIX mode.
+  aix_post_process_depfile
+  ;;
 
 msvc7)
   if test "$libtool" = yes; then
@@ -424,8 +526,7 @@ msvc7)
   "$@" $showIncludes > "$tmpdepfile"
   stat=$?
   grep -v '^Note: including file: ' "$tmpdepfile"
-  if test "$stat" = 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
@@ -443,14 +544,15 @@ msvc7)
   p
 }' | $cygpath_u | sort -u | sed -n '
 s/ /\\ /g
-s/\(.*\)/      \1 \\/p
+s/\(.*\)/'"$tab"'\1 \\/p
 s/.\(.*\) \\/\1:/
 H
 $ {
-  s/.*/        /
+  s/.*/'"$tab"'/
   G
   p
 }' >> "$depfile"
+  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
   rm -f "$tmpdepfile"
   ;;
 
@@ -478,7 +580,7 @@ dashmstdout)
     shift
   fi
 
-  # Remove `-o $object'.
+  # Remove '-o $object'.
   IFS=" "
   for arg
   do
@@ -498,18 +600,18 @@ dashmstdout)
   done
 
   test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for `:'
+  # Require at least two characters before searching for ':'
   # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
   "$@" $dashmflag |
-    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
   rm -f "$depfile"
   cat < "$tmpdepfile" > "$depfile"
-  tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this sed invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
@@ -562,11 +664,12 @@ makedepend)
   # makedepend may prepend the VPATH from the source file name to the object.
   # No need to regex-escape $object, excess matching of '.' is harmless.
   sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process the last invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed '1,2d' "$tmpdepfile" \
+    | tr ' ' "$nl" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile" "$tmpdepfile".bak
   ;;
 
@@ -583,7 +686,7 @@ cpp)
     shift
   fi
 
-  # Remove `-o $object'.
+  # Remove '-o $object'.
   IFS=" "
   for arg
   do
@@ -602,10 +705,10 @@ cpp)
     esac
   done
 
-  "$@" -E |
-    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
-    sed '$ s: \\$::' > "$tmpdepfile"
+  "$@" -E \
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+    sed '$ s: \\$::' > "$tmpdepfile"
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
   cat < "$tmpdepfile" >> "$depfile"
@@ -637,23 +740,23 @@ msvisualcpp)
       shift
       ;;
     "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
-       set fnord "$@"
-       shift
-       shift
-       ;;
+        set fnord "$@"
+        shift
+        shift
+        ;;
     *)
-       set fnord "$@" "$arg"
-       shift
-       shift
-       ;;
+        set fnord "$@" "$arg"
+        shift
+        shift
+        ;;
     esac
   done
   "$@" -E 2>/dev/null |
   sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::     \1 \\:p' >> "$depfile"
-  echo "       " >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
   sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
index 4d1bd76..912f237 100644 (file)
@@ -169,6 +169,7 @@ rm -rf ${RPM_BUILD_ROOT}
 %{_includedir}/elfutils/libebl.h
 %{_includedir}/elfutils/libdw.h
 %{_includedir}/elfutils/libdwfl.h
+%{_includedir}/elfutils/libdwelf.h
 %{_libdir}/libebl.a
 #%{_libdir}/libasm.so
 %{_libdir}/libdw.so
@@ -195,6 +196,82 @@ rm -rf ${RPM_BUILD_ROOT}
 %{_libdir}/libelf.a
 
 %changelog
+* Mon Aug 25 2014 Mark Wielaard <mjw@redhat.com> 0.160-1
+- libdw: New functions dwarf_cu_getdwarf, dwarf_cu_die.
+  dwarf.h remove non-existing DW_TAG_mutable_type.
+- libdwfl: Handle LZMA .ko.xz compressed kernel modules.
+- unstrip: New option -F, --force to combining files even if some ELF
+  headers don't seem to match.
+- backends: Handle ARM THUMB functions. Add support for ppc64le ELFv2 abi.
+
+* Sat May 17 2014 Mark Wielaard <mjw@redhat.com> 0.159-1
+- stack: New option -d, --debugname to lookup DWARF debuginfo name 
+  for frame.  New option -i, --inlines to show inlined frames 
+  using DWARF debuginfo.
+- libdwelf: New libdwelf.h header for libdw.so DWARF ELF Low-level 
+  Functions.  New function dwelf_elf_gnu_debuglink, 
+  dwelf_dwarf_gnu_debugaltlink, and dwelf_elf_gnu_build_id.
+- libdw: Support for DWZ multifile forms DW_FORM_GNU_ref_alt and      
+  DW_FORM_GNU_strp_alt is now enabled by default and no longer        
+  experimental. Added new functions dwarf_getalt and dwarf_setalt       
+  to get or set the alternative debug file used for the alt FORMs.     
+  The dwfl_linux_proc_find_elf callback will now find ELF from       
+  process memory for (deleted) files if the Dwfl has process state     
+  attached.
+- libdwfl: The dwfl_build_id_find_debuginfo and 
+  dwfl_standard_find_debuginfo functions will now try to 
+  resolve and set the alternative debug file.
+- backends: Add CFI unwinding for arm. Relies on .debug_frame.        
+  Add arm process initial register state compatible mode to AARCH64. 
+  Add aarch64 native and core unwind support.
+- other: All separate elfutils-robustify patches have been merged.    
+  CVE-2014-0172 Check overflow before calling malloc to uncompress 
+  data.
+
+* Fri Jan  3 2014 Mark Wielaard <mjw@redhat.com> 0.158-1
+- libdwfl: dwfl_core_file_report has new parameter executable.
+  New functions dwfl_module_getsymtab_first_global,
+  dwfl_module_getsym_info and dwfl_module_addrinfo.
+  Added unwinder with type Dwfl_Thread_Callbacks, opaque types
+  Dwfl_Thread and Dwfl_Frame and functions dwfl_attach_state,
+  dwfl_pid, dwfl_thread_dwfl, dwfl_thread_tid, dwfl_frame_thread,
+  dwfl_thread_state_registers, dwfl_thread_state_register_pc,
+  dwfl_getthread_frames, dwfl_getthreads, dwfl_thread_getframes
+  and dwfl_frame_pc.
+- addr2line: New option -x to show the section an address was found in.
+- stack: New utility that uses the new unwinder for processes and cores.
+- backends: Unwinder support for i386, x86_64, s390, s390x, ppc and ppc64.
+  aarch64 support.
+
+* Mon Sep 30 2013 Mark Wielaard <mjw@redhat.com> 0.157-1
+- libdw: Add new functions dwarf_getlocations, dwarf_getlocation_attr 
+         and dwarf_getlocation_die.
+- readelf: Show contents of NT_SIGINFO and NT_FILE core notes.
+- addr2line: Support -i, --inlines output option.
+- backends: abi_cfi hook for arm, ppc and s390.
+
+* Thu Jul 25 2013 Jan Kratochvil <jan.kratochvil@redhat.com> 0.156-1
+- lib: New macro COMPAT_VERSION_NEWPROTO.
+- libdw: Handle GNU extension opcodes in dwarf_getlocation.
+- libdwfl: Fix STB_GLOBAL over STB_WEAK preference in 
+  dwfl_module_addrsym.          Add minisymtab support.          Add 
+  parameter add_p_vaddr to dwfl_report_elf.          Use DT_DEBUG 
+  library search first.
+- libebl: Handle new core note types in EBL.
+- backends: Interpret NT_ARM_VFP.           Implement core file 
+  registers parsing for s390/s390x.
+- readelf: Add --elf-section input option to inspect an embedded ELF 
+  file.          Add -U, --unresolved-address-offsets output control.   
+         Add --debug-dump=decodedline support.          Accept version 
+  8 .gdb_index section format.          Adjust output formatting width. 
+           When highpc is in constant form print it also as address.    
+        Display raw .debug_aranges. Use libdw only for decodedaranges.
+- elflint: Add __bss_start__ to the list of allowed symbols.
+- tests: Add configure --enable-valgrind option to run all tests 
+  under valgrind.        Enable automake parallel-tests for make check.
+- translations: Updated Polish translation.
+- Updates for Automake 1.13.
+
 * Fri Aug 24 2012 Mark Wielaard <mjw@redhat.com> 0.155-1
 - libelf: elf*_xlatetomd now works for cross-endian ELF note data.    
        elf_getshdr now works consistently on non-mmaped ELF files after 
index 95e6520..c3b00e0 100644 (file)
@@ -1,6 +1,6 @@
 ## Common automake fragments for elfutils subdirectory makefiles.
 ##
-## Copyright (C) 2010 Red Hat, Inc.
+## Copyright (C) 2010, 2014 Red Hat, Inc.
 ##
 ## This file is part of elfutils.
 ##
 ##
 
 DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DLOCALEDIR='"${localedir}"'
-INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I..
-AM_CFLAGS = -std=gnu99 -Wall -Wshadow \
+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I..
+AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \
            $(if $($(*F)_no_Werror),,-Werror) \
            $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \
-           $(if $($(*F)_no_Wformat),-Wno-format,-Wformat=2) \
            $($(*F)_CFLAGS)
 
-if MUDFLAP
-AM_CFLAGS += -fmudflap
-libmudflap = -lmudflap
-else
-libmudflap =
-endif
-
-COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\
-                         $(COMPILE))
+COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE))
 
 %.os: %.c %.o
 if AMDEP
@@ -61,4 +52,4 @@ endif
 
 CLEANFILES = *.gcno *.gcda
 
-textrel_check = if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
+textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
index a9244eb..377bb86 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2011-01-19.21; # UTC
+scriptversion=2011-11-20.07; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -35,7 +35,7 @@ scriptversion=2011-01-19.21; # UTC
 # FSF changes to this file are in the public domain.
 #
 # Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
+# 'make' implicit rules from creating a file called install from it
 # when there is no Makefile.
 #
 # This script is compatible with the BSD install script, but was written
@@ -156,7 +156,7 @@ while test $# -ne 0; do
     -s) stripcmd=$stripprog;;
 
     -t) dst_arg=$2
-       # Protect names problematic for `test' and other utilities.
+       # Protect names problematic for 'test' and other utilities.
        case $dst_arg in
          -* | [=\(\)!]) dst_arg=./$dst_arg;;
        esac
@@ -190,7 +190,7 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
     fi
     shift # arg
     dst_arg=$arg
-    # Protect names problematic for `test' and other utilities.
+    # Protect names problematic for 'test' and other utilities.
     case $dst_arg in
       -* | [=\(\)!]) dst_arg=./$dst_arg;;
     esac
@@ -202,7 +202,7 @@ if test $# -eq 0; then
     echo "$0: no input file specified." >&2
     exit 1
   fi
-  # It's OK to call `install-sh -d' without argument.
+  # It's OK to call 'install-sh -d' without argument.
   # This can happen when creating conditional directories.
   exit 0
 fi
@@ -240,7 +240,7 @@ fi
 
 for src
 do
-  # Protect names problematic for `test' and other utilities.
+  # Protect names problematic for 'test' and other utilities.
   case $src in
     -* | [=\(\)!]) src=./$src;;
   esac
@@ -354,7 +354,7 @@ do
              if test -z "$dir_arg" || {
                   # Check for POSIX incompatibilities with -m.
                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-                  # other-writeable bit of parent directory when it shouldn't.
+                  # other-writable bit of parent directory when it shouldn't.
                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
                   ls_ld_tmpdir=`ls -ld "$tmpdir"`
                   case $ls_ld_tmpdir in
index 86a8fc3..cdea514 100755 (executable)
@@ -1,11 +1,10 @@
 #! /bin/sh
-# Common stub for a few missing GNU programs while installing.
+# Common wrapper for a few potentially missing GNU programs.
 
-scriptversion=2012-01-06.13; # UTC
+scriptversion=2012-06-26.16; # UTC
 
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
-# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
 
 # 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
@@ -26,68 +25,40 @@ scriptversion=2012-01-06.13; # UTC
 # the same distribution terms that you use for the rest of that program.
 
 if test $# -eq 0; then
-  echo 1>&2 "Try \`$0 --help' for more information"
+  echo 1>&2 "Try '$0 --help' for more information"
   exit 1
 fi
 
-run=:
-sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
-sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
-  configure_ac=configure.ac
-else
-  configure_ac=configure.in
-fi
+case $1 in
 
-msg="missing on your system"
+  --is-lightweight)
+    # Used by our autoconf macros to check whether the available missing
+    # script is modern enough.
+    exit 0
+    ;;
 
-case $1 in
---run)
-  # Try to run requested program, and just exit if it succeeds.
-  run=
-  shift
-  "$@" && exit 0
-  # Exit code 63 means version mismatch.  This often happens
-  # when the user try to use an ancient version of a tool on
-  # a file that requires a minimum version.  In this case we
-  # we should proceed has if the program had been absent, or
-  # if --run hadn't been passed.
-  if test $? = 63; then
-    run=:
-    msg="probably too old"
-  fi
-  ;;
+  --run)
+    # Back-compat with the calling convention used by older automake.
+    shift
+    ;;
 
   -h|--h|--he|--hel|--help)
     echo "\
 $0 [OPTION]... PROGRAM [ARGUMENT]...
 
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
 
 Options:
   -h, --help      display this help and exit
   -v, --version   output version information and exit
-  --run           try to run the given command, and emulate it if it fails
 
 Supported PROGRAM values:
-  aclocal      touch file \`aclocal.m4'
-  autoconf     touch file \`configure'
-  autoheader   touch file \`config.h.in'
-  autom4te     touch the output file, or create a stub one
-  automake     touch all \`Makefile.in' files
-  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
-  flex         create \`lex.yy.c', if possible, from existing .c
-  help2man     touch the output file
-  lex          create \`lex.yy.c', if possible, from existing .c
-  makeinfo     touch the output file
-  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+  aclocal   autoconf  autoheader   autom4te  automake  makeinfo
+  bison     yacc      flex         lex       help2man
 
-Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
-\`g' are ignored when checking the name.
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
 
 Send bug reports to <bug-automake@gnu.org>."
     exit $?
@@ -99,228 +70,141 @@ Send bug reports to <bug-automake@gnu.org>."
     ;;
 
   -*)
-    echo 1>&2 "$0: Unknown \`$1' option"
-    echo 1>&2 "Try \`$0 --help' for more information"
+    echo 1>&2 "$0: unknown '$1' option"
+    echo 1>&2 "Try '$0 --help' for more information"
     exit 1
     ;;
 
 esac
 
-# normalize program name to check for.
-program=`echo "$1" | sed '
-  s/^gnu-//; t
-  s/^gnu//; t
-  s/^g//; t'`
-
-# Now exit if we have it, but it failed.  Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program).  This is about non-GNU programs, so use $1 not
-# $program.
-case $1 in
-  lex*|yacc*)
-    # Not GNU programs, they don't have --version.
-    ;;
-
-  *)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       # Could not run --version or --help.  This is probably someone
-       # running `$TOOL --version' or `$TOOL --help' to check whether
-       # $TOOL exists and not knowing $TOOL uses missing.
-       exit 1
-    fi
-    ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case $program in
-  aclocal*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
-         to install the \`Automake' and \`Perl' packages.  Grab them from
-         any GNU archive site."
-    touch aclocal.m4
-    ;;
-
-  autoconf*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`${configure_ac}'.  You might want to install the
-         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
-         archive site."
-    touch configure
-    ;;
-
-  autoheader*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
-         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
-         from any GNU archive site."
-    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
-    test -z "$files" && files="config.h"
-    touch_files=
-    for f in $files; do
-      case $f in
-      *:*) touch_files="$touch_files "`echo "$f" |
-                                      sed -e 's/^[^:]*://' -e 's/:.*//'`;;
-      *) touch_files="$touch_files $f.in";;
-      esac
-    done
-    touch $touch_files
-    ;;
-
-  automake*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
-         You might want to install the \`Automake' and \`Perl' packages.
-         Grab them from any GNU archive site."
-    find . -type f -name Makefile.am -print |
-          sed 's/\.am$/.in/' |
-          while read f; do touch "$f"; done
-    ;;
-
-  autom4te*)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.
-         You can get \`$1' as part of \`Autoconf' from any GNU
-         archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-       touch $file
-    else
-       test -z "$file" || exec >$file
-       echo "#! /bin/sh"
-       echo "# Created by GNU Automake missing as a replacement of"
-       echo "#  $ $@"
-       echo "exit 0"
-       chmod +x $file
-       exit 1
-    fi
-    ;;
-
-  bison*|yacc*)
-    echo 1>&2 "\
-WARNING: \`$1' $msg.  You should only need it if
-         you modified a \`.y' file.  You may need the \`Bison' package
-         in order for those modifications to take effect.  You can get
-         \`Bison' from any GNU archive site."
-    rm -f y.tab.c y.tab.h
-    if test $# -ne 1; then
-        eval LASTARG=\${$#}
-       case $LASTARG in
-       *.y)
-           SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-           if test -f "$SRCFILE"; then
-                cp "$SRCFILE" y.tab.c
-           fi
-           SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-           if test -f "$SRCFILE"; then
-                cp "$SRCFILE" y.tab.h
-           fi
-         ;;
-       esac
-    fi
-    if test ! -f y.tab.h; then
-       echo >y.tab.h
-    fi
-    if test ! -f y.tab.c; then
-       echo 'main() { return 0; }' >y.tab.c
-    fi
-    ;;
-
-  lex*|flex*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.l' file.  You may need the \`Flex' package
-         in order for those modifications to take effect.  You can get
-         \`Flex' from any GNU archive site."
-    rm -f lex.yy.c
-    if test $# -ne 1; then
-        eval LASTARG=\${$#}
-       case $LASTARG in
-       *.l)
-           SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-           if test -f "$SRCFILE"; then
-                cp "$SRCFILE" lex.yy.c
-           fi
-         ;;
-       esac
-    fi
-    if test ! -f lex.yy.c; then
-       echo 'main() { return 0; }' >lex.yy.c
-    fi
-    ;;
-
-  help2man*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-        you modified a dependency of a manual page.  You may need the
-        \`Help2man' package in order for those modifications to take
-        effect.  You can get \`Help2man' from any GNU archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-       touch $file
-    else
-       test -z "$file" || exec >$file
-       echo ".ab help2man is required to generate this page"
-       exit $?
-    fi
-    ;;
-
-  makeinfo*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.texi' or \`.texinfo' file, or any other file
-         indirectly affecting the aspect of the manual.  The spurious
-         call might also be the consequence of using a buggy \`make' (AIX,
-         DU, IRIX).  You might want to install the \`Texinfo' package or
-         the \`GNU make' package.  Grab either from any GNU archive site."
-    # The file to touch is that specified with -o ...
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -z "$file"; then
-      # ... or it is the one specified with @setfilename ...
-      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '
-       /^@setfilename/{
-         s/.* \([^ ]*\) *$/\1/
-         p
-         q
-       }' $infile`
-      # ... or it is derived from the source name (dir/f.texi becomes f.info)
-      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
-    fi
-    # If the file does not exist, the user really needs makeinfo;
-    # let's fail without touching anything.
-    test -f $file || exit 1
-    touch $file
-    ;;
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch.  This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+  msg="probably too old"
+elif test $st -eq 127; then
+  # Program was missing.
+  msg="missing on your system"
+else
+  # Program was found and executed, but failed.  Give up.
+  exit $st
+fi
 
-  *)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.  Check the \`README' file,
-         it often tells you about the needed prerequisites for installing
-         this package.  You may also peek at any GNU archive site, in case
-         some other package would contain this missing \`$1' program."
-    exit 1
+perl_URL=http://www.perl.org/
+flex_URL=http://flex.sourceforge.net/
+gnu_software_URL=http://www.gnu.org/software
+
+program_details ()
+{
+  case $1 in
+    aclocal|automake)
+      echo "The '$1' program is part of the GNU Automake package:"
+      echo "<$gnu_software_URL/automake>"
+      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/autoconf>"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+    autoconf|autom4te|autoheader)
+      echo "The '$1' program is part of the GNU Autoconf package:"
+      echo "<$gnu_software_URL/autoconf/>"
+      echo "It also requires GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+  esac
+}
+
+give_advice ()
+{
+  # Normalize program name to check for.
+  normalized_program=`echo "$1" | sed '
+    s/^gnu-//; t
+    s/^gnu//; t
+    s/^g//; t'`
+
+  printf '%s\n' "'$1' is $msg."
+
+  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+  case $normalized_program in
+    autoconf*)
+      echo "You should only need it if you modified 'configure.ac',"
+      echo "or m4 files included by it."
+      program_details 'autoconf'
+      ;;
+    autoheader*)
+      echo "You should only need it if you modified 'acconfig.h' or"
+      echo "$configure_deps."
+      program_details 'autoheader'
+      ;;
+    automake*)
+      echo "You should only need it if you modified 'Makefile.am' or"
+      echo "$configure_deps."
+      program_details 'automake'
+      ;;
+    aclocal*)
+      echo "You should only need it if you modified 'acinclude.m4' or"
+      echo "$configure_deps."
+      program_details 'aclocal'
+      ;;
+   autom4te*)
+      echo "You might have modified some maintainer files that require"
+      echo "the 'automa4te' program to be rebuilt."
+      program_details 'autom4te'
+      ;;
+    bison*|yacc*)
+      echo "You should only need it if you modified a '.y' file."
+      echo "You may want to install the GNU Bison package:"
+      echo "<$gnu_software_URL/bison/>"
+      ;;
+    lex*|flex*)
+      echo "You should only need it if you modified a '.l' file."
+      echo "You may want to install the Fast Lexical Analyzer package:"
+      echo "<$flex_URL>"
+      ;;
+    help2man*)
+      echo "You should only need it if you modified a dependency" \
+           "of a man page."
+      echo "You may want to install the GNU Help2man package:"
+      echo "<$gnu_software_URL/help2man/>"
     ;;
-esac
-
-exit 0
+    makeinfo*)
+      echo "You should only need it if you modified a '.texi' file, or"
+      echo "any other file indirectly affecting the aspect of the manual."
+      echo "You might want to install the Texinfo package:"
+      echo "<$gnu_software_URL/texinfo/>"
+      echo "The spurious makeinfo call might also be the consequence of"
+      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+      echo "want to install GNU make:"
+      echo "<$gnu_software_URL/make/>"
+      ;;
+    *)
+      echo "You might have modified some files without having the proper"
+      echo "tools for further handling them.  Check the 'README' file, it"
+      echo "often tells you about the needed prerequisites for installing"
+      echo "this package.  You may also peek at any GNU archive site, in"
+      echo "case some other package contains this missing '$1' program."
+      ;;
+  esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+                       -e '2,$s/^/         /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
 
 # Local variables:
 # eval: (add-hook 'write-file-hooks 'time-stamp)
diff --git a/config/test-driver b/config/test-driver
new file mode 100755 (executable)
index 0000000..32bf39e
--- /dev/null
@@ -0,0 +1,127 @@
+#! /bin/sh
+# test-driver - basic testsuite driver script.
+
+scriptversion=2012-06-27.10; # UTC
+
+# Copyright (C) 2011-2013 Free Software Foundation, Inc.
+#
+# 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 2, 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 to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+# Make unconditional expansion of undefined variables an error.  This
+# helps a lot in preventing typo-related bugs.
+set -u
+
+usage_error ()
+{
+  echo "$0: $*" >&2
+  print_usage >&2
+  exit 2
+}
+
+print_usage ()
+{
+  cat <<END
+Usage:
+  test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
+              [--expect-failure={yes|no}] [--color-tests={yes|no}]
+              [--enable-hard-errors={yes|no}] [--] TEST-SCRIPT
+The '--test-name', '--log-file' and '--trs-file' options are mandatory.
+END
+}
+
+# TODO: better error handling in option parsing (in particular, ensure
+# TODO: $log_file, $trs_file and $test_name are defined).
+test_name= # Used for reporting.
+log_file=  # Where to save the output of the test script.
+trs_file=  # Where to save the metadata of the test run.
+expect_failure=no
+color_tests=no
+enable_hard_errors=yes
+while test $# -gt 0; do
+  case $1 in
+  --help) print_usage; exit $?;;
+  --version) echo "test-driver $scriptversion"; exit $?;;
+  --test-name) test_name=$2; shift;;
+  --log-file) log_file=$2; shift;;
+  --trs-file) trs_file=$2; shift;;
+  --color-tests) color_tests=$2; shift;;
+  --expect-failure) expect_failure=$2; shift;;
+  --enable-hard-errors) enable_hard_errors=$2; shift;;
+  --) shift; break;;
+  -*) usage_error "invalid option: '$1'";;
+  esac
+  shift
+done
+
+if test $color_tests = yes; then
+  # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
+  red='\e[0;31m' # Red.
+  grn='\e[0;32m' # Green.
+  lgn='\e[1;32m' # Light green.
+  blu='\e[1;34m' # Blue.
+  mgn='\e[0;35m' # Magenta.
+  std='\e[m'     # No color.
+else
+  red= grn= lgn= blu= mgn= std=
+fi
+
+do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
+trap "st=129; $do_exit" 1
+trap "st=130; $do_exit" 2
+trap "st=141; $do_exit" 13
+trap "st=143; $do_exit" 15
+
+# Test script is run here.
+"$@" >$log_file 2>&1
+estatus=$?
+if test $enable_hard_errors = no && test $estatus -eq 99; then
+  estatus=1
+fi
+
+case $estatus:$expect_failure in
+  0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
+  0:*)   col=$grn res=PASS  recheck=no  gcopy=no;;
+  77:*)  col=$blu res=SKIP  recheck=no  gcopy=yes;;
+  99:*)  col=$mgn res=ERROR recheck=yes gcopy=yes;;
+  *:yes) col=$lgn res=XFAIL recheck=no  gcopy=yes;;
+  *:*)   col=$red res=FAIL  recheck=yes gcopy=yes;;
+esac
+
+# Report outcome to console.
+echo "${col}${res}${std}: $test_name"
+
+# Register the test result, and other relevant metadata.
+echo ":test-result: $res" > $trs_file
+echo ":global-test-result: $res" >> $trs_file
+echo ":recheck: $recheck" >> $trs_file
+echo ":copy-in-global-log: $gcopy" >> $trs_file
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
index 9253635..1c4d776 100755 (executable)
@@ -1,10 +1,9 @@
 #! /bin/sh
 # ylwrap - wrapper for lex/yacc invocations.
 
-scriptversion=2011-08-25.18; # UTC
+scriptversion=2012-12-21.17; # UTC
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005,
-# 2007, 2009, 2010, 2011 Free Software Foundation, Inc.
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
 #
 # Written by Tom Tromey <tromey@cygnus.com>.
 #
@@ -30,9 +29,41 @@ scriptversion=2011-08-25.18; # UTC
 # bugs to <bug-automake@gnu.org> or send patches to
 # <automake-patches@gnu.org>.
 
+get_dirname ()
+{
+  case $1 in
+    */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';;
+    # Otherwise,  we want the empty string (not ".").
+  esac
+}
+
+# guard FILE
+# ----------
+# The CPP macro used to guard inclusion of FILE.
+guard()
+{
+  printf '%s\n' "$1"                                                    \
+    | sed                                                               \
+        -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'   \
+        -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'                        \
+        -e 's/__*/_/g'
+}
+
+# quote_for_sed [STRING]
+# ----------------------
+# Return STRING (or stdin) quoted to be used as a sed pattern.
+quote_for_sed ()
+{
+  case $# in
+    0) cat;;
+    1) printf '%s\n' "$1";;
+  esac \
+    | sed -e 's|[][\\.*]|\\&|g'
+}
+
 case "$1" in
   '')
-    echo "$0: No files given.  Try \`$0 --help' for more information." 1>&2
+    echo "$0: No files given.  Try '$0 --help' for more information." 1>&2
     exit 1
     ;;
   --basedir)
@@ -67,6 +98,8 @@ esac
 # The input.
 input="$1"
 shift
+# We'll later need for a correct munging of "#line" directives.
+input_sub_rx=`get_dirname "$input" | quote_for_sed`
 case "$input" in
   [\\/]* | ?:[\\/]*)
     # Absolute path; do nothing.
@@ -76,15 +109,47 @@ case "$input" in
     input="`pwd`/$input"
     ;;
 esac
+input_rx=`get_dirname "$input" | quote_for_sed`
+
+# Since DOS filename conventions don't allow two dots,
+# the DOS version of Bison writes out y_tab.c instead of y.tab.c
+# and y_tab.h instead of y.tab.h. Test to see if this is the case.
+y_tab_nodot=false
+if test -f y_tab.c || test -f y_tab.h; then
+  y_tab_nodot=true
+fi
+
+# The parser itself, the first file, is the destination of the .y.c
+# rule in the Makefile.
+parser=$1
+
+# A sed program to s/FROM/TO/g for all the FROM/TO so that, for
+# instance, we rename #include "y.tab.h" into #include "parse.h"
+# during the conversion from y.tab.c to parse.c.
+sed_fix_filenames=
+
+# Also rename header guards, as Bison 2.7 for instance uses its header
+# guard in its implementation file.
+sed_fix_header_guards=
 
-pairlist=
 while test "$#" -ne 0; do
   if test "$1" = "--"; then
     shift
     break
   fi
-  pairlist="$pairlist $1"
+  from=$1
+  # Handle y_tab.c and y_tab.h output by DOS
+  if $y_tab_nodot; then
+    case $from in
+      "y.tab.c") from=y_tab.c;;
+      "y.tab.h") from=y_tab.h;;
+    esac
+  fi
   shift
+  to=$1
+  shift
+  sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;"
+  sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;"
 done
 
 # The program to run.
@@ -115,98 +180,56 @@ esac
 ret=$?
 
 if test $ret -eq 0; then
-  set X $pairlist
-  shift
-  first=yes
-  # Since DOS filename conventions don't allow two dots,
-  # the DOS version of Bison writes out y_tab.c instead of y.tab.c
-  # and y_tab.h instead of y.tab.h. Test to see if this is the case.
-  y_tab_nodot="no"
-  if test -f y_tab.c || test -f y_tab.h; then
-    y_tab_nodot="yes"
-  fi
-
-  # The directory holding the input.
-  input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'`
-  # Quote $INPUT_DIR so we can use it in a regexp.
-  # FIXME: really we should care about more than `.' and `\'.
-  input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'`
-
-  while test "$#" -ne 0; do
-    from="$1"
-    # Handle y_tab.c and y_tab.h output by DOS
-    if test $y_tab_nodot = "yes"; then
-      if test $from = "y.tab.c"; then
-        from="y_tab.c"
-      else
-        if test $from = "y.tab.h"; then
-          from="y_tab.h"
-        fi
-      fi
-    fi
+  for from in *
+  do
+    to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"`
     if test -f "$from"; then
       # If $2 is an absolute path name, then just use that,
-      # otherwise prepend `../'.
-      case "$2" in
-        [\\/]* | ?:[\\/]*) target="$2";;
-        *) target="../$2";;
+      # otherwise prepend '../'.
+      case $to in
+        [\\/]* | ?:[\\/]*) target=$to;;
+        *) target="../$to";;
       esac
 
-      # We do not want to overwrite a header file if it hasn't
-      # changed.  This avoid useless recompilations.  However the
-      # parser itself (the first file) should always be updated,
-      # because it is the destination of the .y.c rule in the
-      # Makefile.  Divert the output of all other files to a temporary
-      # file so we can compare them to existing versions.
-      if test $first = no; then
+      # Do not overwrite unchanged header files to avoid useless
+      # recompilations.  Always update the parser itself: it is the
+      # destination of the .y.c rule in the Makefile.  Divert the
+      # output of all other files to a temporary file so we can
+      # compare them to existing versions.
+      if test $from != $parser; then
         realtarget="$target"
-        target="tmp-`echo $target | sed s/.*[\\/]//g`"
+        target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'`
       fi
-      # Edit out `#line' or `#' directives.
-      #
-      # We don't want the resulting debug information to point at
-      # an absolute srcdir; it is better for it to just mention the
-      # .y file with no path.
-      #
-      # We want to use the real output file name, not yy.lex.c for
-      # instance.
-      #
-      # We want the include guards to be adjusted too.
-      FROM=`echo "$from" | sed \
-            -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
-            -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
-      TARGET=`echo "$2" | sed \
-            -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\
-            -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
-
-      sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \
-          -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$?
-
-      # Check whether header files must be updated.
-      if test $first = no; then
+
+      # Munge "#line" or "#" directives.  Don't let the resulting
+      # debug information point at an absolute srcdir.  Use the real
+      # output file name, not yy.lex.c for instance.  Adjust the
+      # include guards too.
+      sed -e "/^#/!b"                           \
+          -e "s|$input_rx|$input_sub_rx|"       \
+          -e "$sed_fix_filenames"               \
+          -e "$sed_fix_header_guards"           \
+        "$from" >"$target" || ret=$?
+
+      # Check whether files must be updated.
+      if test "$from" != "$parser"; then
         if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
-          echo "$2" is unchanged
+          echo "$to is unchanged"
           rm -f "$target"
         else
-          echo updating "$2"
+          echo "updating $to"
           mv -f "$target" "$realtarget"
         fi
       fi
     else
-      # A missing file is only an error for the first file.  This
-      # is a blatant hack to let us support using "yacc -d".  If -d
-      # is not specified, we don't want an error when the header
-      # file is "missing".
-      if test $first = yes; then
+      # A missing file is only an error for the parser.  This is a
+      # blatant hack to let us support using "yacc -d".  If -d is not
+      # specified, don't fail when the header file is "missing".
+      if test "$from" = "$parser"; then
         ret=1
       fi
     fi
-    shift
-    shift
-    first=no
   done
-else
-  ret=$?
 fi
 
 # Remove the directory.
index 30a4cc6..447015e 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,19 +1,17 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for elfutils 0.155.
+# Generated by GNU Autoconf 2.69 for elfutils 0.160.
 #
 # Report bugs to <https://bugzilla.redhat.com/>.
 #
 #
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
-# Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
 #
 #
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
 #
-# Copyright (C) 1996-2012 Red Hat, Inc.
+# Copyright (C) 1996-2014 Red Hat, Inc.
 ## -------------------- ##
 ## M4sh Initialization. ##
 ## -------------------- ##
@@ -138,6 +136,31 @@ export LANGUAGE
 # CDPATH.
 (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
 if test "x$CONFIG_SHELL" = x; then
   as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
@@ -171,11 +194,13 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
 else
   exitcode=1; echo positional parameters were not saved.
 fi
-test x\$exitcode = x0 || exit 1"
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
   as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
   as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
   eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
-  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
   if (eval "$as_required") 2>/dev/null; then :
   as_have_required=yes
 else
@@ -215,21 +240,25 @@ IFS=$as_save_IFS
 
 
       if test "x$CONFIG_SHELL" != x; then :
-  # We cannot yet assume a decent shell, so we have to provide a
-       # neutralization value for shells without unset; and this also
-       # works around shells that cannot unset nonexistent variables.
-       # Preserve -v and -x to the replacement shell.
-       BASH_ENV=/dev/null
-       ENV=/dev/null
-       (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-       export CONFIG_SHELL
-       case $- in # ((((
-         *v*x* | *x*v* ) as_opts=-vx ;;
-         *v* ) as_opts=-v ;;
-         *x* ) as_opts=-x ;;
-         * ) as_opts= ;;
-       esac
-       exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
 fi
 
     if test x$as_have_required = xno; then :
@@ -332,6 +361,14 @@ $as_echo X"$as_dir" |
 
 
 } # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
 # as_fn_append VAR VALUE
 # ----------------------
 # Append the text in VALUE to the end of the definition contained in VAR. Take
@@ -453,6 +490,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
   chmod +x "$as_me.lineno" ||
     { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
 
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
   # original and so on.  Autoconf is especially sensitive to this).
@@ -487,16 +528,16 @@ if (echo >conf$$.file) 2>/dev/null; then
     # ... but there are two gotchas:
     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
+    # In both cases, we have to default to `cp -pR'.
     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
+      as_ln_s='cp -pR'
   elif ln conf$$.file conf$$ 2>/dev/null; then
     as_ln_s=ln
   else
-    as_ln_s='cp -p'
+    as_ln_s='cp -pR'
   fi
 else
-  as_ln_s='cp -p'
+  as_ln_s='cp -pR'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
@@ -508,28 +549,8 @@ else
   as_mkdir_p=false
 fi
 
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-       test -d "$1/.";
-      else
-       case $1 in #(
-       -*)set "./$1";;
-       esac;
-       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-       ???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -561,16 +582,58 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='elfutils'
 PACKAGE_TARNAME='elfutils'
-PACKAGE_VERSION='0.155'
-PACKAGE_STRING='elfutils 0.155'
+PACKAGE_VERSION='0.160'
+PACKAGE_STRING='elfutils 0.160'
 PACKAGE_BUGREPORT='https://bugzilla.redhat.com/'
 PACKAGE_URL=''
 
 ac_unique_file="libelf/libelf.h"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
 ac_subst_vars='am__EXEEXT_FALSE
 am__EXEEXT_TRUE
 LTLIBOBJS
 LIBOBJS
+CC_BIARCH
+BIARCH_FALSE
+BIARCH_TRUE
+EGREP
+GREP
+CPP
 eu_version
 XGETTEXT_EXTRA_OPTIONS
 MSGMERGE
@@ -600,18 +663,23 @@ TESTS_RPATH_FALSE
 TESTS_RPATH_TRUE
 BUILD_STATIC_FALSE
 BUILD_STATIC_TRUE
+USE_VALGRIND_FALSE
+USE_VALGRIND_TRUE
+HAVE_VALGRIND
 GCOV_FALSE
 GCOV_TRUE
 GPROF_FALSE
 GPROF_TRUE
 DEBUGPRED
-MUDFLAP_FALSE
-MUDFLAP_TRUE
 NEVER_FALSE
 NEVER_TRUE
 base_cpu
 NATIVE_LD_FALSE
 NATIVE_LD_TRUE
+NM
+READELF
+ac_ct_AR
+AR
 LEXLIB
 LEX_OUTPUT_ROOT
 LEX
@@ -635,8 +703,6 @@ CPPFLAGS
 LDFLAGS
 CFLAGS
 CC
-ENABLE_DWZ_FALSE
-ENABLE_DWZ_TRUE
 USE_LOCKS_FALSE
 USE_LOCKS_TRUE
 host_os
@@ -651,6 +717,10 @@ MODVERSION
 MAINT
 MAINTAINER_MODE_FALSE
 MAINTAINER_MODE_TRUE
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
 am__untar
 am__tar
 AMTAR
@@ -715,23 +785,24 @@ SHELL'
 ac_subst_files=''
 ac_user_opts='
 enable_option_checking
+enable_silent_rules
 enable_maintainer_mode
 enable_deterministic_archives
 enable_thread_safety
-enable_dwz
 enable_dependency_tracking
 enable_largefile
 enable_generic
-enable_mudflap
 enable_debugpred
 enable_gprof
 enable_gcov
+enable_valgrind
 enable_tests_rpath
 enable_libebl_subdir
 with_zlib
 with_bzlib
 with_lzma
 enable_nls
+with_biarch
 '
       ac_precious_vars='build_alias
 host_alias
@@ -742,7 +813,8 @@ LDFLAGS
 LIBS
 CPPFLAGS
 YACC
-YFLAGS'
+YFLAGS
+CPP'
 
 
 # Initialize some variables set by options.
@@ -1198,8 +1270,6 @@ target=$target_alias
 if test "x$host_alias" != x; then
   if test "x$build_alias" = x; then
     cross_compiling=maybe
-    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used" >&2
   elif test "x$build_alias" != "x$host_alias"; then
     cross_compiling=yes
   fi
@@ -1285,7 +1355,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures elfutils 0.155 to adapt to many kinds of systems.
+\`configure' configures elfutils 0.160 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1355,7 +1425,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of elfutils 0.155:";;
+     short | recursive ) echo "Configuration of elfutils 0.160:";;
    esac
   cat <<\_ACEOF
 
@@ -1363,22 +1433,25 @@ Optional Features:
   --disable-option-checking  ignore unrecognized --enable/--with options
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-maintainer-mode  enable make rules and dependencies not useful
-                         (and sometimes confusing) to the casual installer
+  --enable-silent-rules   less verbose build output (undo: "make V=1")
+  --disable-silent-rules  verbose build output (undo: "make V=0")
+  --enable-maintainer-mode
+                          enable make rules and dependencies not useful (and
+                          sometimes confusing) to the casual installer
   --enable-deterministic-archives
                           ar and ranlib default to -D behavior
-  --enable-thread-safety  enable thread safety of libraries
-  --enable-dwz            enable experimental GNU ref_alt FORM, dwz multi file
-                          support in libdw
-  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors
+  --enable-thread-safety  enable thread safety of libraries EXPERIMENTAL
+  --enable-dependency-tracking
+                          do not reject slow dependency extractors
+  --disable-dependency-tracking
+                          speeds up one-time build
   --disable-largefile     omit support for large files
   --disable-generic       do not build generic linker
-  --enable-mudflap        build binaries with mudflap instrumentation
   --enable-debugpred      build binaries with support to debug branch
                           prediction
   --enable-gprof          build binaries with gprof support
   --enable-gcov           build binaries with gcov support
+  --enable-valgrind       run all tests under valgrind
   --enable-tests-rpath    build $ORIGIN-using rpath into tests
   --enable-libebl-subdir=DIR
                           install libebl_CPU modules in $(libdir)/DIR
@@ -1390,6 +1463,7 @@ Optional Packages:
   --with-zlib             support [zlib] compression in libdwfl
   --with-bzlib            support [bzlib] compression in libdwfl
   --with-lzma             support [lzma] compression in libdwfl
+  --with-biarch           enable biarch tests despite build problems
 
 Some influential environment variables:
   CC          C compiler command
@@ -1405,6 +1479,7 @@ Some influential environment variables:
   YFLAGS      The list of arguments that will be passed by default to $YACC.
               This script will default YFLAGS to the empty string to avoid a
               default value of `-d' given by some make applications.
+  CPP         C preprocessor
 
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
@@ -1472,14 +1547,14 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-elfutils configure 0.155
-generated by GNU Autoconf 2.68
+elfutils configure 0.160
+generated by GNU Autoconf 2.69
 
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 
-Copyright (C) 1996-2012 Red Hat, Inc.
+Copyright (C) 1996-2014 Red Hat, Inc.
 _ACEOF
   exit
 fi
@@ -1553,7 +1628,7 @@ $as_echo "$ac_try_echo"; } >&5
         test ! -s conftest.err
        } && test -s conftest$ac_exeext && {
         test "$cross_compiling" = yes ||
-        $as_test_x conftest$ac_exeext
+        test -x conftest$ac_exeext
        }; then :
   ac_retval=0
 else
   as_fn_set_status $ac_retval
 
 } # ac_fn_c_try_link
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if test "$cross_compiling" = yes; then
+    # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid; break
+else
+  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+                       if test $ac_lo -le $ac_mid; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=$ac_mid; break
+else
+  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+                       if test $ac_mid -le $ac_hi; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid
+else
+  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+  else
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (($2) < 0)
+    {
+      long int i = longval ();
+      if (i != ($2))
+       return 1;
+      fprintf (f, "%ld", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ($2))
+       return 1;
+      fprintf (f, "%lu", i);
+    }
+  /* Do not output a trailing newline, as this causes \r\n confusion
+     on some platforms.  */
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else
+  ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+  fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_compute_int
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+        test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=no"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+        return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+           return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
 cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by elfutils $as_me 0.155, which was
-generated by GNU Autoconf 2.68.  Invocation command line was
+It was created by elfutils $as_me 0.160, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
 
@@ -1958,7 +2380,7 @@ ac_config_files="$ac_config_files config/Makefile"
 
 
 
-am__api_version='1.11'
+am__api_version='1.13'
 
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
@@ -1997,7 +2419,7 @@ case $as_dir/ in #((
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+       if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
          if test $ac_prog = install &&
            grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
            # AIX install.  It has an incompatible calling convention.
@@ -2055,9 +2477,6 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
 $as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
 # Reject unsafe characters in $srcdir or the absolute working directory
 # name.  Accept space and tab only in the latter.
 am_lf='
@@ -2068,32 +2487,40 @@ case `pwd` in
 esac
 case $srcdir in
   *[\\\"\#\$\&\'\`$am_lf\ \    ]*)
-    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+    as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
 esac
 
-# Do `set' in a subshell so we don't clobber the current shell's
+# Do 'set' in a subshell so we don't clobber the current shell's
 # arguments.  Must try -L first in case configure is actually a
 # symlink; some systems play weird games with the mod time of symlinks
 # (eg FreeBSD returns the mod time of the symlink's containing
 # directory).
 if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$*" != "X $srcdir/configure conftest.file" \
-      && test "$*" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" "$LINENO" 5
-   fi
-
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$*" = "X"; then
+       # -L didn't work.
+       set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$*" != "X $srcdir/configure conftest.file" \
+       && test "$*" != "X conftest.file $srcdir/configure"; then
+
+       # If neither matched, then we have a broken ls.  This can happen
+       # if, for instance, CONFIG_SHELL is bash and it inherits a
+       # broken ls alias from the environment.  This has actually
+       # happened.  Such a system could not be considered "sane".
+       as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment" "$LINENO" 5
+     fi
+     if test "$2" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
    test "$2" = conftest.file
    )
 then
@@ -2105,6 +2532,16 @@ Check your system clock" "$LINENO" 5
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
 test "$program_prefix" != NONE &&
   program_transform_name="s&^&$program_prefix&;$program_transform_name"
 # Use a double $ so make ignores it.
@@ -2127,12 +2564,12 @@ if test x"${MISSING+set}" != xset; then
   esac
 fi
 # Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
 else
   am_missing_run=
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
 fi
 
 if test x"${install_sh}" != xset; then
@@ -2144,10 +2581,10 @@ if test x"${install_sh}" != xset; then
   esac
 fi
 
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
 # tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
+# will honor the 'STRIP' environment variable to overrule this program.
 if test "$cross_compiling" != no; then
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
@@ -2166,7 +2603,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2206,7 +2643,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_STRIP="strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2257,7 +2694,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_prog in mkdir gmkdir; do
         for ac_exec_ext in '' $ac_executable_extensions; do
-          { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+          as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
           case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
             'mkdir (GNU coreutils) '* | \
             'mkdir (coreutils) '* | \
@@ -2286,12 +2723,6 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
 $as_echo "$MKDIR_P" >&6; }
 
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
-  [\\/$]* | ?:[\\/]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
 for ac_prog in gawk mawk nawk awk
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
@@ -2310,7 +2741,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_AWK="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2374,20 +2805,59 @@ else
 fi
 rmdir .tst 2>/dev/null
 
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  am__isrc=' -I$(srcdir)'
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
-  fi
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
 fi
 
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
+case $enable_silent_rules in # (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+       @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
   else
     CYGPATH_W=echo
   fi
@@ -2396,7 +2866,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='elfutils'
- VERSION='0.155'
+ VERSION='0.160'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -2424,12 +2894,22 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
 
 MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
 # We need awk for the "check" target.  The system "awk" is bad on
 # some platforms.
 # Always define AMTAR for backward compatibility.  Yes, it's still used
 # in the wild :-(  We should find a proper way to deprecate it ...
 AMTAR='$${TAR-tar}'
 
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar  pax cpio none'
+
 am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
 
 
@@ -2437,6 +2917,7 @@ am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
 
 
 
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
     # Check whether --enable-maintainer-mode was given.
@@ -2591,27 +3072,9 @@ if test "$use_locks" = yes; then :
   $as_echo "#define USE_LOCKS 1" >>confdefs.h
 
 fi
-
-
-
-# Check whether --enable-dwz was given.
-if test "${enable_dwz+set}" = set; then :
-  enableval=$enable_dwz; enable_dwz=$enableval
-else
-  enable_dwz=no
-fi
-
- if test "$enable_dwz" = yes; then
-  ENABLE_DWZ_TRUE=
-  ENABLE_DWZ_FALSE='#'
-else
-  ENABLE_DWZ_TRUE='#'
-  ENABLE_DWZ_FALSE=
-fi
-
-if test "$enable_dwz" = yes; then :
-  $as_echo "#define ENABLE_DWZ 1" >>confdefs.h
-
+if test "$use_locks" = yes; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: thread-safety is EXPERIMENTAL tests might fail." >&5
+$as_echo "$as_me: WARNING: thread-safety is EXPERIMENTAL tests might fail." >&2;}
 fi
 
 
@@ -2638,7 +3101,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2678,7 +3141,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CC="gcc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2731,7 +3194,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2772,7 +3235,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
        continue
@@ -2830,7 +3293,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2874,7 +3337,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3320,8 +3783,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <stdarg.h>
 #include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
+struct stat;
 /* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
 struct buf { int x; };
 FILE * (*rcsopen) (struct buf *, struct stat *, int);
@@ -3424,7 +3886,7 @@ am__quote=
 _am_result=none
 # First try GNU make style include.
 echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
+# Ignore all kinds of additional output from 'make'.
 case `$am_make -s -f confmf 2> /dev/null` in #(
 *the\ am__doit\ target*)
   am__include=include
@@ -3480,8 +3942,8 @@ else
   # We make a subdir and do the tests there.  Otherwise we can end up
   # making bogus files that we don't know about and never remove.  For
   # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
   rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
@@ -3516,16 +3978,16 @@ else
     : > sub/conftest.c
     for i in 1 2 3 4 5 6; do
       echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
     done
     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
     # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
     am__obj=sub/conftest.${OBJEXT-o}
     am__minus_obj="-o $am__obj"
     case $depmode in
@@ -3534,8 +3996,8 @@ else
       test "$am__universal" = false || continue
       ;;
     nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
       if test "x$enable_dependency_tracking" = xyes; then
        continue
       else
@@ -3543,7 +4005,7 @@ else
       fi
       ;;
     msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
+      # This compiler won't grok '-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
       am__obj=conftest.${OBJEXT-o}
@@ -3614,7 +4076,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3654,7 +4116,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_RANLIB="ranlib"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3707,7 +4169,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_YACC="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3751,7 +4213,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_LEX="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3783,7 +4245,8 @@ a { ECHO; }
 b { REJECT; }
 c { yymore (); }
 d { yyless (1); }
-e { yyless (input () != 0); }
+e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument.  */
+    yyless ((input () != 0)); }
 f { unput (yytext[0]); }
 . { BEGIN INITIAL; }
 %%
 if test "$LEX" = :; then
   LEX=${am_missing_run}flex
 fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc with C99 support" >&5
-$as_echo_n "checking for gcc with C99 support... " >&6; }
-if ${ac_cv_c99+:} false; then :
+# Only available since automake 1.12
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar lib "link -lib"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  old_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -std=gnu99"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int foo (int a) { for (int i = 0; i < a; ++i) if (i % 4) break; int s = a; }
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c99=yes
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
 else
-  ac_cv_c99=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-CFLAGS="$old_CFLAGS"
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c99" >&5
-$as_echo "$ac_cv_c99" >&6; }
-if test "x$ac_cv_c99" != xyes; then :
-  as_fn_error $? "gcc with C99 support required" "$LINENO" 5
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __thread support" >&5
-$as_echo_n "checking for __thread support... " >&6; }
-if ${ac_cv_tls+:} false; then :
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar lib "link -lib"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  # Use the same flags that we use for our DSOs, so the test is representative.
-# Some old compiler/linker/libc combinations fail some ways and not others.
-save_CFLAGS="$CFLAGS"
-save_LDFLAGS="$LDFLAGS"
-CFLAGS="-fpic $CFLAGS"
-LDFLAGS="-shared -Wl,-z,defs,-z,relro $LDFLAGS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#undef __thread
-static __thread int a; int foo (int b) { return a + b; }
-int
-main ()
-{
-exit (foo (0));
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_tls=yes
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
 else
-  ac_cv_tls=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-CFLAGS="$save_CFLAGS"
-LDFLAGS="$save_LDFLAGS"
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5
-$as_echo "$ac_cv_tls" >&6; }
-if test "x$ac_cv_tls" != xyes; then :
-  as_fn_error $? "__thread support required" "$LINENO" 5
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
-# Check whether --enable-largefile was given.
-if test "${enable_largefile+set}" = set; then :
-  enableval=$enable_largefile;
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
 fi
 
-if test "$enable_largefile" != no; then
+: ${AR=ar}
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
-$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
-if ${ac_cv_sys_largefile_CC+:} false; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5
+$as_echo_n "checking the archiver ($AR) interface... " >&6; }
+if ${am_cv_ar_interface+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_cv_sys_largefile_CC=no
-     if test "$GCC" != yes; then
-       ac_save_CC=$CC
-       while :; do
-        # IRIX 6.2 and later do not support large files by default,
-        # so use the C compiler's -n32 option if that helps.
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  am_cv_ar_interface=ar
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
-    We can't simply define LARGE_OFF_T to be 9223372036854775807,
-    since some C++ compilers masquerading as C compilers
-    incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
-  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
-                      && LARGE_OFF_T % 2147483647 == 1)
-                     ? 1 : -1];
-int
-main ()
-{
-
-  ;
-  return 0;
-}
+int some_variable = 0;
 _ACEOF
-        if ac_fn_c_try_compile "$LINENO"; then :
-  break
-fi
-rm -f core conftest.err conftest.$ac_objext
-        CC="$CC -n32"
-        if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_sys_largefile_CC=' -n32'; break
+if ac_fn_c_try_compile "$LINENO"; then :
+  am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5
+  (eval $am_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test "$ac_status" -eq 0; then
+        am_cv_ar_interface=ar
+      else
+        am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5'
+        { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5
+  (eval $am_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+        if test "$ac_status" -eq 0; then
+          am_cv_ar_interface=lib
+        else
+          am_cv_ar_interface=unknown
+        fi
+      fi
+      rm -f conftest.lib libconftest.a
+
 fi
-rm -f core conftest.err conftest.$ac_objext
-        break
-       done
-       CC=$ac_save_CC
-       rm -f conftest.$ac_ext
-    fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
-$as_echo "$ac_cv_sys_largefile_CC" >&6; }
-  if test "$ac_cv_sys_largefile_CC" != no; then
-    CC=$CC$ac_cv_sys_largefile_CC
-  fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5
+$as_echo "$am_cv_ar_interface" >&6; }
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
-$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
-if ${ac_cv_sys_file_offset_bits+:} false; then :
+case $am_cv_ar_interface in
+ar)
+  ;;
+lib)
+  # Microsoft lib, so override with the ar-lib wrapper script.
+  # FIXME: It is wrong to rewrite AR.
+  # But if we don't then we get into trouble of one sort or another.
+  # A longer-term fix would be to have automake use am__AR in this case,
+  # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something
+  # similar.
+  AR="$am_aux_dir/ar-lib $AR"
+  ;;
+unknown)
+  as_fn_error $? "could not determine $AR interface" "$LINENO" 5
+  ;;
+esac
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}readelf", so it can be a program name with args.
+set dummy ${ac_tool_prefix}readelf; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_READELF+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  while :; do
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
-    We can't simply define LARGE_OFF_T to be 9223372036854775807,
-    since some C++ compilers masquerading as C compilers
-    incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
-  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
-                      && LARGE_OFF_T % 2147483647 == 1)
-                     ? 1 : -1];
-int
-main ()
-{
+  if test -n "$READELF"; then
+  ac_cv_prog_READELF="$READELF" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_READELF="${ac_tool_prefix}readelf"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_sys_file_offset_bits=no; break
+fi
+fi
+READELF=$ac_cv_prog_READELF
+if test -n "$READELF"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READELF" >&5
+$as_echo "$READELF" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_READELF"; then
+  ac_ct_READELF=$READELF
+  # Extract the first word of "readelf", so it can be a program name with args.
+set dummy readelf; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_READELF+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_READELF"; then
+  ac_cv_prog_ac_ct_READELF="$ac_ct_READELF" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_READELF="readelf"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_READELF=$ac_cv_prog_ac_ct_READELF
+if test -n "$ac_ct_READELF"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_READELF" >&5
+$as_echo "$ac_ct_READELF" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_READELF" = x; then
+    READELF=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    READELF=$ac_ct_READELF
+  fi
+else
+  READELF="$ac_cv_prog_READELF"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nm; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  ac_cv_prog_NM="$NM" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_NM="${ac_tool_prefix}nm"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NM=$ac_cv_prog_NM
+if test -n "$NM"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NM" >&5
+$as_echo "$NM" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NM"; then
+  ac_ct_NM=$NM
+  # Extract the first word of "nm", so it can be a program name with args.
+set dummy nm; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NM"; then
+  ac_cv_prog_ac_ct_NM="$ac_ct_NM" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_NM="nm"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NM=$ac_cv_prog_ac_ct_NM
+if test -n "$ac_ct_NM"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NM" >&5
+$as_echo "$ac_ct_NM" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NM" = x; then
+    NM=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NM=$ac_ct_NM
+  fi
+else
+  NM="$ac_cv_prog_NM"
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc with C99 support" >&5
+$as_echo_n "checking for gcc with C99 support... " >&6; }
+if ${ac_cv_c99+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -std=gnu99"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (int a) { for (int i = 0; i < a; ++i) if (i % 4) break; int s = a; }
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c99=yes
+else
+  ac_cv_c99=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+CFLAGS="$old_CFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c99" >&5
+$as_echo "$ac_cv_c99" >&6; }
+if test "x$ac_cv_c99" != xyes; then :
+  as_fn_error $? "gcc with C99 support required" "$LINENO" 5
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __thread support" >&5
+$as_echo_n "checking for __thread support... " >&6; }
+if ${ac_cv_tls+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # Use the same flags that we use for our DSOs, so the test is representative.
+# Some old compiler/linker/libc combinations fail some ways and not others.
+save_CFLAGS="$CFLAGS"
+save_LDFLAGS="$LDFLAGS"
+CFLAGS="-fpic $CFLAGS"
+LDFLAGS="-shared -Wl,-z,defs,-z,relro $LDFLAGS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#undef __thread
+static __thread int a; int foo (int b) { return a + b; }
+int
+main ()
+{
+exit (foo (0));
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_tls=yes
+else
+  ac_cv_tls=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+CFLAGS="$save_CFLAGS"
+LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5
+$as_echo "$ac_cv_tls" >&6; }
+if test "x$ac_cv_tls" != xyes; then :
+  as_fn_error $? "__thread support required" "$LINENO" 5
+fi
+
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+  enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+        # IRIX 6.2 and later do not support large files by default,
+        # so use the C compiler's -n32 option if that helps.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#define _FILE_OFFSET_BITS 64
 #include <sys/types.h>
  /* Check that off_t can represent 2**63 - 1 correctly.
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
@@ -4066,29 +4804,30 @@ main ()
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_sys_file_offset_bits=64; break
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  ac_cv_sys_file_offset_bits=unknown
+        if ac_fn_c_try_compile "$LINENO"; then :
   break
-done
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
-$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
-case $ac_cv_sys_file_offset_bits in #(
-  no | unknown) ;;
-  *)
-cat >>confdefs.h <<_ACEOF
-#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
-_ACEOF
-;;
-esac
-rm -rf conftest*
-  if test $ac_cv_sys_file_offset_bits = unknown; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
-$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
-if ${ac_cv_sys_large_files+:} false; then :
+rm -f core conftest.err conftest.$ac_objext
+        CC="$CC -n32"
+        if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+        break
+       done
+       CC=$ac_save_CC
+       rm -f conftest.$ac_ext
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   while :; do
@@ -4112,12 +4851,12 @@ main ()
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_sys_large_files=no; break
+  ac_cv_sys_file_offset_bits=no; break
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#define _LARGE_FILES 1
+#define _FILE_OFFSET_BITS 64
 #include <sys/types.h>
  /* Check that off_t can represent 2**63 - 1 correctly.
     We can't simply define LARGE_OFF_T to be 9223372036854775807,
@@ -4136,28 +4875,99 @@ main ()
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_sys_large_files=1; break
+  ac_cv_sys_file_offset_bits=64; break
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  ac_cv_sys_large_files=unknown
+  ac_cv_sys_file_offset_bits=unknown
   break
 done
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
-$as_echo "$ac_cv_sys_large_files" >&6; }
-case $ac_cv_sys_large_files in #(
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
   no | unknown) ;;
   *)
 cat >>confdefs.h <<_ACEOF
-#define _LARGE_FILES $ac_cv_sys_large_files
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
 _ACEOF
 ;;
 esac
 rm -rf conftest*
-  fi
-fi
-
-
+  if test $ac_cv_sys_file_offset_bits = unknown; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_large_files=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  fi
+
+
+fi
+
+
 native_ld=no
 # Check whether --enable-generic was given.
 if test "${enable_generic+set}" = set; then :
@@ -4198,49 +5008,6 @@ else
 fi
 
 
-use_mudflap=no
-# Check whether --enable-mudflap was given.
-if test "${enable_mudflap+set}" = set; then :
-  enableval=$enable_mudflap; if test "x$enable_mudflap" = xyes; then
-  # Check whether the compiler support -fmudflap.
-  old_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -fmudflap"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  use_mudflap=yes
-else
-  use_mudflap=fail
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CFLAGS="$old_CFLAGS"
-fi
-fi
-
-if test "$use_mudflap" = fail; then
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "--enable-mudflap requires a compiler which understands this option
-See \`config.log' for more details" "$LINENO" 5; }
-fi
- if test "$use_mudflap" = yes; then
-  MUDFLAP_TRUE=
-  MUDFLAP_FALSE='#'
-else
-  MUDFLAP_TRUE='#'
-  MUDFLAP_FALSE=
-fi
-
-
 # Check whether --enable-debugpred was given.
 if test "${enable_debugpred+set}" = set; then :
   enableval=$enable_debugpred; use_debugpred=$enableval
@@ -4296,7 +5063,66 @@ else
 fi
 
 
- if test "$use_mudflap" = yes -o "$use_gprof" = yes -o "$use_gcov" = yes; then
+# Check whether --enable-valgrind was given.
+if test "${enable_valgrind+set}" = set; then :
+  enableval=$enable_valgrind; use_valgrind=$enableval
+else
+  use_valgrind=no
+fi
+
+if test "$use_valgrind" = yes; then
+  # Extract the first word of "valgrind", so it can be a program name with args.
+set dummy valgrind; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_HAVE_VALGRIND+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$HAVE_VALGRIND"; then
+  ac_cv_prog_HAVE_VALGRIND="$HAVE_VALGRIND" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_HAVE_VALGRIND="yes"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_prog_HAVE_VALGRIND" && ac_cv_prog_HAVE_VALGRIND="no"
+fi
+fi
+HAVE_VALGRIND=$ac_cv_prog_HAVE_VALGRIND
+if test -n "$HAVE_VALGRIND"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_VALGRIND" >&5
+$as_echo "$HAVE_VALGRIND" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  if test "$HAVE_VALGRIND" = "no"; then
+    as_fn_error $? "valgrind not found" "$LINENO" 5
+  fi
+fi
+ if test "$use_valgrind" = yes; then
+  USE_VALGRIND_TRUE=
+  USE_VALGRIND_FALSE='#'
+else
+  USE_VALGRIND_TRUE='#'
+  USE_VALGRIND_FALSE=
+fi
+
+
+ if test "$use_gprof" = yes -o "$use_gcov" = yes; then
   BUILD_STATIC_TRUE=
   BUILD_STATIC_FALSE='#'
 else
@@ -4648,6 +5474,9 @@ ac_config_files="$ac_config_files libelf/Makefile"
 ac_config_files="$ac_config_files libebl/Makefile"
 
 
+ac_config_files="$ac_config_files libdwelf/Makefile"
+
+
 ac_config_files="$ac_config_files libdw/Makefile"
 
 
@@ -4703,7 +5532,7 @@ $as_echo "$USE_NLS" >&6; }
 
 
 
-      GETTEXT_MACRO_VERSION=0.17
+      GETTEXT_MACRO_VERSION=0.18
 
 
 
@@ -4795,7 +5624,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -4813,219 +5642,798 @@ if test -n "$GMSGFMT"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
 $as_echo "$GMSGFMT" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+    case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
+    *) MSGFMT_015=$MSGFMT ;;
+  esac
+
+  case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
+    *) GMSGFMT_015=$GMSGFMT ;;
+  esac
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_XGETTEXT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case "$XGETTEXT" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&5
+          if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 &&
+     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+            ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+    ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
+$as_echo "$XGETTEXT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+    rm -f messages.po
+
+    case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
+    *) XGETTEXT_015=$XGETTEXT ;;
+  esac
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MSGMERGE+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case "$MSGMERGE" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&5
+          if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then
+            ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
+    ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test "$MSGMERGE" != ":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
+$as_echo "$MSGMERGE" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+        test -n "$localedir" || localedir='${datadir}/locale'
+
+
+    test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+
+
+  ac_config_commands="$ac_config_commands po-directories"
+
+
+
+
+
+ac_config_files="$ac_config_files version.h:config/version.h.in"
+
+
+
+# 1.234<whatever> -> 1234<whatever>
+case "$PACKAGE_VERSION" in
+[0-9].*) eu_version=`echo "$PACKAGE_VERSION" | sed 's@\.@@'` ;;
+*)                as_fn_error $? "confused by version number '$PACKAGE_VERSION'" "$LINENO" 5 ;;
+esac
+case "$eu_version" in
+*.*)
+  # 1234.567 -> "1234", "567"
+  eu_extra_version="${eu_version#*.}"
+  eu_version="${eu_version%%.*}"
+  case "$eu_extra_version" in
+  [0-9][0-9][0-9]) ;;
+  [0-9][0-9])  eu_extra_version="${eu_extra_version}0" ;;
+  [0-9])               eu_extra_version="${eu_extra_version}00" ;;
+  *) as_fn_error $? "confused by version number '$PACKAGE_VERSION'" "$LINENO" 5 ;;
+  esac
+  ;;
+*)
+  eu_extra_version=000
+  ;;
+esac
+
+case "$eu_version" in
+      0[0-9][0-9][0-9]) eu_version="${eu_version#0}$eu_extra_version" ;;
+[0-9][0-9][0-9][0-9]) eu_version="${eu_version}$eu_extra_version" ;;
+[0-9][0-9][0-9])             eu_version="${eu_version}0$eu_extra_version" ;;
+[0-9][0-9])                  eu_version="${eu_version}00$eu_extra_version";;
+*) as_fn_error $? "confused by version number '$PACKAGE_VERSION'" "$LINENO" 5 ;;
+esac
+
+# Round up to the next release API (x.y) version.
+eu_version=$(( (eu_version + 999) / 1000 ))
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
 
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
 
-    case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
-    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
-    *) MSGFMT_015=$MSGFMT ;;
-  esac
+fi
 
-  case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
-    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
-    *) GMSGFMT_015=$GMSGFMT ;;
-  esac
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                 inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
 
+fi
 
+done
 
-# Prepare PATH_SEPARATOR.
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
-fi
 
-# Find out how to test for executable files. Don't use a zero-byte file,
-# as systems may use methods other than mode bits to determine executability.
-cat >conf$$.file <<_ASEOF
-#! /bin/sh
-exit 0
-_ASEOF
-chmod +x conf$$.file
-if test -x conf$$.file >/dev/null 2>&1; then
-  ac_executable_p="test -x"
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
+$as_echo_n "checking size of long... " >&6; }
+if ${ac_cv_sizeof_long+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  ac_executable_p="test -f"
-fi
-rm -f conf$$.file
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long"        "$ac_includes_default"; then :
 
-# Extract the first word of "xgettext", so it can be a program name with args.
-set dummy xgettext; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_XGETTEXT+:} false; then :
-  $as_echo_n "(cached) " >&6
 else
-  case "$XGETTEXT" in
-  [\\/]* | ?:[\\/]*)
-    ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
-    ;;
-  *)
-    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH; do
-      IFS="$ac_save_IFS"
-      test -z "$ac_dir" && ac_dir=.
-      for ac_exec_ext in '' $ac_executable_extensions; do
-        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
-          echo "$as_me: trying $ac_dir/$ac_word..." >&5
-          if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 &&
-     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
-            ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
-            break 2
-          fi
-        fi
-      done
-    done
-    IFS="$ac_save_IFS"
-  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
-    ;;
-esac
+  if test "$ac_cv_type_long" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (long)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_long=0
+   fi
 fi
-XGETTEXT="$ac_cv_path_XGETTEXT"
-if test "$XGETTEXT" != ":"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
-$as_echo "$XGETTEXT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
+$as_echo "$ac_cv_sizeof_long" >&6; }
 
-    rm -f messages.po
 
-    case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
-    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
-    *) XGETTEXT_015=$XGETTEXT ;;
-  esac
 
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+_ACEOF
 
 
-# Prepare PATH_SEPARATOR.
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
-fi
 
-# Find out how to test for executable files. Don't use a zero-byte file,
-# as systems may use methods other than mode bits to determine executability.
-cat >conf$$.file <<_ASEOF
-#! /bin/sh
-exit 0
-_ASEOF
-chmod +x conf$$.file
-if test -x conf$$.file >/dev/null 2>&1; then
-  ac_executable_p="test -x"
+# On aarch64 before glibc 2.20 we would get the kernel user_pt_regs instead
+# of the user_regs_struct from sys/user.h. They are structurally the same
+# but we get either one or the other.
+ac_fn_c_check_type "$LINENO" "struct user_regs_struct" "ac_cv_type_struct_user_regs_struct" "#include <sys/ptrace.h>
+               #include <sys/time.h>
+               #include <sys/user.h>
+"
+if test "x$ac_cv_type_struct_user_regs_struct" = xyes; then :
+  sys_user_has_user_regs=yes
 else
-  ac_executable_p="test -f"
+  sys_user_has_user_regs=no
 fi
-rm -f conf$$.file
 
-# Extract the first word of "msgmerge", so it can be a program name with args.
-set dummy msgmerge; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_MSGMERGE+:} false; then :
+if test "$sys_user_has_user_regs" = "yes"; then
+
+$as_echo "#define HAVE_SYS_USER_REGS 1" >>confdefs.h
+
+fi
+
+# On a 64-bit host where can can use $CC -m32, we'll run two sets of tests.
+# Likewise in a 32-bit build on a host where $CC -m64 works.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $CC option for 32-bit word size" >&5
+$as_echo_n "checking $CC option for 32-bit word size... " >&6; }
+if ${utrace_cv_CC_m32+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  case "$MSGMERGE" in
-  [\\/]* | ?:[\\/]*)
-    ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
-    ;;
-  *)
-    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH; do
-      IFS="$ac_save_IFS"
-      test -z "$ac_dir" && ac_dir=.
-      for ac_exec_ext in '' $ac_executable_extensions; do
-        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
-          echo "$as_me: trying $ac_dir/$ac_word..." >&5
-          if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then
-            ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
-            break 2
-          fi
-        fi
-      done
-    done
-    IFS="$ac_save_IFS"
-  test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
-    ;;
-esac
+  save_CC="$CC"
+utrace_cv_CC_m32=none
+for ut_try in -m32 -m31; do
+  CC=`echo "$save_CC" | sed 's/ -m[36][241]//'`" $ut_try"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (void) { return 1; }
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  utrace_cv_CC_m32=$ut_try
 fi
-MSGMERGE="$ac_cv_path_MSGMERGE"
-if test "$MSGMERGE" != ":"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
-$as_echo "$MSGMERGE" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  test x$utrace_cv_CC_m32 = xnone || break
+done
+CC="$save_CC"
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $utrace_cv_CC_m32" >&5
+$as_echo "$utrace_cv_CC_m32" >&6; }
 
+if test x$utrace_cv_CC_m32 != xnone; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5
+$as_echo_n "checking for 64-bit host... " >&6; }
+if ${utrace_cv_host64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdint.h>
+#if (UINTPTR_MAX > 0xffffffffUL)
+@utrace_host64@
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "@utrace_host64@" >/dev/null 2>&1; then :
+  utrace_cv_host64=yes
+else
+  utrace_cv_host64=no
+fi
+rm -f conftest*
 
-        test -n "$localedir" || localedir='${datadir}/locale'
-
-
-    test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
-
-
-  ac_config_commands="$ac_config_commands po-directories"
-
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $utrace_cv_host64" >&5
+$as_echo "$utrace_cv_host64" >&6; }
+if test $utrace_cv_host64 = no; then :
+  utrace_biarch=-m64 utrace_thisarch=$utrace_cv_CC_m32
+else
+  utrace_biarch=$utrace_cv_CC_m32 utrace_thisarch=-m64
+fi
 
+biarch_CC=`echo "$CC" | sed "s/ *${utrace_thisarch}//"`
+biarch_CC="$biarch_CC $utrace_biarch"
+fi
 
+utrace_biarch_forced=no
 
+# Check whether --with-biarch was given.
+if test "${with_biarch+set}" = set; then :
+  withval=$with_biarch; if test "x$with_biarch" != xno; then :
+  utrace_biarch_forced=yes
+fi
+fi
 
-ac_config_files="$ac_config_files version.h:config/version.h.in"
+if test $utrace_biarch_forced = yes; then :
+  utrace_cv_cc_biarch=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: enabling biarch tests regardless using $biarch_CC" >&5
+$as_echo "$as_me: enabling biarch tests regardless using $biarch_CC" >&6;}
+else
+  if test x$utrace_cv_CC_m32 != xnone; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $biarch_CC makes executables we can run" >&5
+$as_echo_n "checking whether $biarch_CC makes executables we can run... " >&6; }
+if ${utrace_cv_cc_biarch+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_CC="$CC"
+CC="$biarch_CC"
+if test "$cross_compiling" = yes; then :
+  utrace_cv_cc_biarch=no
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
+int
+main ()
+{
 
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  utrace_cv_cc_biarch=yes
+else
+  utrace_cv_cc_biarch=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
 
-# 1.234<whatever> -> 1234<whatever>
-case "$PACKAGE_VERSION" in
-[0-9].*) eu_version=`echo "$PACKAGE_VERSION" | sed 's@\.@@'` ;;
-*)                as_fn_error $? "confused by version number '$PACKAGE_VERSION'" "$LINENO" 5 ;;
-esac
-case "$eu_version" in
-*.*)
-  # 1234.567 -> "1234", "567"
-  eu_extra_version="${eu_version#*.}"
-  eu_version="${eu_version%%.*}"
-  case "$eu_extra_version" in
-  [0-9][0-9][0-9]) ;;
-  [0-9][0-9])  eu_extra_version="${eu_extra_version}0" ;;
-  [0-9])               eu_extra_version="${eu_extra_version}00" ;;
-  *) as_fn_error $? "confused by version number '$PACKAGE_VERSION'" "$LINENO" 5 ;;
-  esac
-  ;;
-*)
-  eu_extra_version=000
-  ;;
-esac
+CC="$save_CC"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $utrace_cv_cc_biarch" >&5
+$as_echo "$utrace_cv_cc_biarch" >&6; }
+else
+  utrace_cv_cc_biarch=no
+fi
+if test $utrace_cv_cc_biarch != yes; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: not running biarch tests, $biarch_CC does not work" >&5
+$as_echo "$as_me: WARNING: not running biarch tests, $biarch_CC does not work" >&2;}
+fi
+fi
+ if test $utrace_cv_cc_biarch = yes; then
+  BIARCH_TRUE=
+  BIARCH_FALSE='#'
+else
+  BIARCH_TRUE='#'
+  BIARCH_FALSE=
+fi
 
-case "$eu_version" in
-      0[0-9][0-9][0-9]) eu_version="${eu_version#0}$eu_extra_version" ;;
-[0-9][0-9][0-9][0-9]) eu_version="${eu_version}$eu_extra_version" ;;
-[0-9][0-9][0-9])             eu_version="${eu_version}0$eu_extra_version" ;;
-[0-9][0-9])                  eu_version="${eu_version}00$eu_extra_version";;
-*) as_fn_error $? "confused by version number '$PACKAGE_VERSION'" "$LINENO" 5 ;;
-esac
+# `$utrace_biarch' will be `-m64' even on an uniarch i386 machine.
+CC_BIARCH="$CC $utrace_biarch"
 
-# Round up to the next release API (x.y) version.
-eu_version=$(( (eu_version + 999) / 1000 ))
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -5136,6 +6544,14 @@ LIBOBJS=$ac_libobjs
 LTLIBOBJS=$ac_ltlibobjs
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
  if test -n "$EXEEXT"; then
   am__EXEEXT_TRUE=
   am__EXEEXT_FALSE='#'
@@ -5152,10 +6568,6 @@ if test -z "${USE_LOCKS_TRUE}" && test -z "${USE_LOCKS_FALSE}"; then
   as_fn_error $? "conditional \"USE_LOCKS\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${ENABLE_DWZ_TRUE}" && test -z "${ENABLE_DWZ_FALSE}"; then
-  as_fn_error $? "conditional \"ENABLE_DWZ\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
 if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
   as_fn_error $? "conditional \"AMDEP\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -5172,10 +6584,6 @@ if test -z "${NEVER_TRUE}" && test -z "${NEVER_FALSE}"; then
   as_fn_error $? "conditional \"NEVER\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${MUDFLAP_TRUE}" && test -z "${MUDFLAP_FALSE}"; then
-  as_fn_error $? "conditional \"MUDFLAP\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
 if test -z "${GPROF_TRUE}" && test -z "${GPROF_FALSE}"; then
   as_fn_error $? "conditional \"GPROF\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -5184,6 +6592,10 @@ if test -z "${GCOV_TRUE}" && test -z "${GCOV_FALSE}"; then
   as_fn_error $? "conditional \"GCOV\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${USE_VALGRIND_TRUE}" && test -z "${USE_VALGRIND_FALSE}"; then
+  as_fn_error $? "conditional \"USE_VALGRIND\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${BUILD_STATIC_TRUE}" && test -z "${BUILD_STATIC_FALSE}"; then
   as_fn_error $? "conditional \"BUILD_STATIC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -5216,6 +6628,10 @@ if test -z "${STANDALONE_TRUE}" && test -z "${STANDALONE_FALSE}"; then
   as_fn_error $? "conditional \"STANDALONE\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${BIARCH_TRUE}" && test -z "${BIARCH_FALSE}"; then
+  as_fn_error $? "conditional \"BIARCH\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 
 : "${CONFIG_STATUS=./config.status}"
 ac_write_fail=0
@@ -5514,16 +6930,16 @@ if (echo >conf$$.file) 2>/dev/null; then
     # ... but there are two gotchas:
     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
+    # In both cases, we have to default to `cp -pR'.
     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
+      as_ln_s='cp -pR'
   elif ln conf$$.file conf$$ 2>/dev/null; then
     as_ln_s=ln
   else
-    as_ln_s='cp -p'
+    as_ln_s='cp -pR'
   fi
 else
-  as_ln_s='cp -p'
+  as_ln_s='cp -pR'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
@@ -5583,28 +6999,16 @@ else
   as_mkdir_p=false
 fi
 
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-       test -d "$1/.";
-      else
-       case $1 in #(
-       -*)set "./$1";;
-       esac;
-       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-       ???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -5625,8 +7029,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by elfutils $as_me 0.155, which was
-generated by GNU Autoconf 2.68.  Invocation command line was
+This file was extended by elfutils $as_me 0.160, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -5691,11 +7095,11 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-elfutils config.status 0.155
-configured by $0, generated by GNU Autoconf 2.68,
+elfutils config.status 0.160
+configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
 
@@ -5786,7 +7190,7 @@ fi
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 if \$ac_cs_recheck; then
-  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
   shift
   \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
   CONFIG_SHELL='$SHELL'
@@ -5836,6 +7240,7 @@ do
     "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;;
     "libelf/Makefile") CONFIG_FILES="$CONFIG_FILES libelf/Makefile" ;;
     "libebl/Makefile") CONFIG_FILES="$CONFIG_FILES libebl/Makefile" ;;
+    "libdwelf/Makefile") CONFIG_FILES="$CONFIG_FILES libdwelf/Makefile" ;;
     "libdw/Makefile") CONFIG_FILES="$CONFIG_FILES libdw/Makefile" ;;
     "libdwfl/Makefile") CONFIG_FILES="$CONFIG_FILES libdwfl/Makefile" ;;
     "libcpu/Makefile") CONFIG_FILES="$CONFIG_FILES libcpu/Makefile" ;;
@@ -6442,7 +7847,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
 
   case $ac_file$ac_mode in
     "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # Older Autoconf quotes --file arguments for eval, but not when files
   # are listed without --file.  Let's play safe and only enable the eval
   # if we detect the quoting.
   case $CONFIG_FILES in
@@ -6455,7 +7860,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
     # Strip MF so we end up with the name of the file.
     mf=`echo "$mf" | sed -e 's/:.*$//'`
     # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
+    # We used to match only the files named 'Makefile.in', but
     # some people rename them; so instead we look at the file content.
     # Grep'ing the first line is not enough: some people post-process
     # each Makefile.in and add a new line on top of each file to say so.
@@ -6489,21 +7894,19 @@ $as_echo X"$mf" |
       continue
     fi
     # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
+    # from the Makefile without running 'make'.
     DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
     test -z "$DEPDIR" && continue
     am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
+    test -z "$am__include" && continue
     am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
     # Find all dependency output files, they are included files with
     # $(DEPDIR) in their names.  We invoke sed twice because it is the
     # simplest approach to changing $(DEPDIR) to its actual value in the
     # expansion.
     for file in `sed -n "
       s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
       # Make sure the directory exists.
       test -f "$dirpart/$file" && continue
       fdir=`$as_dirname -- "$file" ||
@@ -6546,7 +7949,7 @@ $as_echo X"$file" |
       case "$ac_file" in */Makefile.in)
         # Adjust a relative srcdir.
         ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
-        ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+        ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
         ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
         # In autoconf-2.13 it is called $ac_given_srcdir.
         # In autoconf-2.50 it is called $srcdir.
@@ -6562,7 +7965,8 @@ $as_echo X"$file" |
         if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
           rm -f "$ac_dir/POTFILES"
           test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
-          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[  ]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+          gt_tab=`printf '\t'`
+          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
           POMAKEFILEDEPS="POTFILES.in"
           # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
           # on $ac_dir but don't depend on user-specified configuration
@@ -6573,12 +7977,12 @@ $as_echo X"$file" |
               test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
             fi
             ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
-            # Hide the ALL_LINGUAS assigment from automake < 1.5.
+            # Hide the ALL_LINGUAS assignment from automake < 1.5.
             eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
             POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
           else
             # The set of available languages was given in configure.in.
-            # Hide the ALL_LINGUAS assigment from automake < 1.5.
+            # Hide the ALL_LINGUAS assignment from automake < 1.5.
             eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
           fi
           # Compute POFILES
index adec1c1..76a172d 100644 (file)
@@ -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-2012 Red Hat, Inc.
+dnl Copyright (C) 1996-2014 Red Hat, Inc.
 dnl
 dnl This file is part of elfutils.
 dnl
@@ -17,16 +17,16 @@ 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.155],[https://bugzilla.redhat.com/],[elfutils])
+AC_INIT([elfutils],[0.160],[https://bugzilla.redhat.com/],[elfutils])
 
 AC_CONFIG_AUX_DIR([config])
 AC_CONFIG_FILES([config/Makefile])
 
-AC_COPYRIGHT([Copyright (C) 1996-2012 Red Hat, Inc.])
+AC_COPYRIGHT([Copyright (C) 1996-2014 Red Hat, Inc.])
 AC_PREREQ(2.63)                        dnl Minimum Autoconf version required.
 
 dnl We use GNU make extensions; automake 1.10 defaults to -Wportability.
-AM_INIT_AUTOMAKE([gnits 1.8 -Wno-portability dist-bzip2 no-dist-gzip])
+AM_INIT_AUTOMAKE([gnits 1.11 -Wno-portability dist-bzip2 no-dist-gzip parallel-tests])
 AM_MAINTAINER_MODE
 
 dnl Unique ID for this build.
@@ -60,25 +60,24 @@ AC_DEFINE_UNQUOTED(DEFAULT_AR_DETERMINISTIC, $default_ar_deterministic,
                   [Should ar and ranlib use -D behavior by default?])
 
 AC_ARG_ENABLE([thread-safety],
-AS_HELP_STRING([--enable-thread-safety], [enable thread safety of libraries]),
-use_locks=$enableval, use_locks=no)
+AS_HELP_STRING([--enable-thread-safety],
+               [enable thread safety of libraries EXPERIMENTAL]),
+               use_locks=$enableval, use_locks=no)
 AM_CONDITIONAL(USE_LOCKS, test "$use_locks" = yes)
 AS_IF([test "$use_locks" = yes], [AC_DEFINE(USE_LOCKS)])
+AS_IF([test "$use_locks" = yes],
+      [AC_MSG_WARN([thread-safety is EXPERIMENTAL tests might fail.])])
 
 AH_TEMPLATE([USE_LOCKS], [Defined if libraries should be thread-safe.])
 
-AC_ARG_ENABLE([dwz],
-AS_HELP_STRING([--enable-dwz], [enable experimental GNU ref_alt FORM, dwz multi file support in libdw]),
-enable_dwz=$enableval, enable_dwz=no)
-AM_CONDITIONAL(ENABLE_DWZ, test "$enable_dwz" = yes)
-AS_IF([test "$enable_dwz" = yes], [AC_DEFINE(ENABLE_DWZ)])
-
-AH_TEMPLATE([ENABLE_DWZ], [Defined if libdw should support GNU ref_alt FORM, dwz multi files.])
-
 AC_PROG_CC
 AC_PROG_RANLIB
 AC_PROG_YACC
 AM_PROG_LEX
+# Only available since automake 1.12
+m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
+AC_CHECK_TOOL([READELF], [readelf])
+AC_CHECK_TOOL([NM], [nm])
 
 AC_CACHE_CHECK([for gcc with C99 support], ac_cv_c99, [dnl
 old_CFLAGS="$CFLAGS"
@@ -142,26 +141,6 @@ dnl Support to work around automake's inflexible dependency generation.
 dnl See src/Makefile.am for more information.
 AM_CONDITIONAL(NEVER, false)
 
-dnl Enable debugging via mudflap.  This option will cause most libraries
-dnl to be built as archives which are statically linked into the applications.
-dnl All code, as far as possible, is compiled instrumented to catch all
-dnl the bugs valgrind is able to catch.
-use_mudflap=no
-AC_ARG_ENABLE([mudflap],
-AS_HELP_STRING([--enable-mudflap],
-[build binaries with mudflap instrumentation]), [dnl
-if test "x$enable_mudflap" = xyes; then
-  # Check whether the compiler support -fmudflap.
-  old_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -fmudflap"
-  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[use_mudflap=yes],[use_mudflap=fail])
-  CFLAGS="$old_CFLAGS"
-fi])
-if test "$use_mudflap" = fail; then
-  AC_MSG_FAILURE([--enable-mudflap requires a compiler which understands this option])
-fi
-AM_CONDITIONAL(MUDFLAP, test "$use_mudflap" = yes)
-
 dnl enable debugging of branch prediction.
 AC_ARG_ENABLE([debugpred],
 AS_HELP_STRING([--enable-debugpred],[build binaries with support to debug branch prediction]),
@@ -190,8 +169,19 @@ if test "$use_gcov" = yes; then
 fi
 AM_CONDITIONAL(GCOV, test "$use_gcov" = yes)
 
+AC_ARG_ENABLE([valgrind],
+AS_HELP_STRING([--enable-valgrind],[run all tests under valgrind]),
+[use_valgrind=$enableval], [use_valgrind=no])
+if test "$use_valgrind" = yes; then
+  AC_CHECK_PROG(HAVE_VALGRIND, valgrind, yes, no)
+  if test "$HAVE_VALGRIND" = "no"; then
+    AC_MSG_ERROR([valgrind not found])
+  fi
+fi
+AM_CONDITIONAL(USE_VALGRIND, test "$use_valgrind" = yes)
+
 AM_CONDITIONAL(BUILD_STATIC, [dnl
-test "$use_mudflap" = yes -o "$use_gprof" = yes -o "$use_gcov" = yes])
+test "$use_gprof" = yes -o "$use_gcov" = yes])
 
 AC_ARG_ENABLE([tests-rpath],
 AS_HELP_STRING([--enable-tests-rpath],[build $ORIGIN-using rpath into tests]),
@@ -237,6 +227,9 @@ AC_CONFIG_FILES([libelf/Makefile])
 dnl Higher-level ELF support library.
 AC_CONFIG_FILES([libebl/Makefile])
 
+dnl DWARF-ELF Lower-level Functions support library.
+AC_CONFIG_FILES([libdwelf/Makefile])
+
 dnl DWARF library.
 AC_CONFIG_FILES([libdw/Makefile])
 
@@ -306,4 +299,26 @@ esac
 # Round up to the next release API (x.y) version.
 eu_version=$(( (eu_version + 999) / 1000 ))
 
+AC_CHECK_SIZEOF(long)
+
+# On aarch64 before glibc 2.20 we would get the kernel user_pt_regs instead
+# of the user_regs_struct from sys/user.h. They are structurally the same
+# but we get either one or the other.
+AC_CHECK_TYPE([struct user_regs_struct],
+              [sys_user_has_user_regs=yes], [sys_user_has_user_regs=no],
+              [[#include <sys/ptrace.h>]
+               [#include <sys/time.h>]
+               [#include <sys/user.h>]])
+if test "$sys_user_has_user_regs" = "yes"; then
+  AC_DEFINE(HAVE_SYS_USER_REGS, 1,
+            [Define to 1 if <sys/user.h> defines struct user_regs_struct])
+fi
+
+# On a 64-bit host where can can use $CC -m32, we'll run two sets of tests.
+# Likewise in a 32-bit build on a host where $CC -m64 works.
+utrace_BIARCH
+# `$utrace_biarch' will be `-m64' even on an uniarch i386 machine.
+CC_BIARCH="$CC $utrace_biarch"
+AC_SUBST([CC_BIARCH])
+
 AC_OUTPUT
index c680bc9..79d7830 100644 (file)
@@ -1,7 +1,7 @@
 # -*- rpm-spec-*-
 Summary: A collection of utilities and DSOs to handle compiled objects
 Name: elfutils
-Version: 0.155
+Version: 0.160
 Release: 1
 License: GPLv3+ and (GPLv2+ or LGPLv3+)
 Group: Development/Tools
@@ -169,6 +169,7 @@ rm -rf ${RPM_BUILD_ROOT}
 %{_includedir}/elfutils/libebl.h
 %{_includedir}/elfutils/libdw.h
 %{_includedir}/elfutils/libdwfl.h
+%{_includedir}/elfutils/libdwelf.h
 %{_libdir}/libebl.a
 #%{_libdir}/libasm.so
 %{_libdir}/libdw.so
@@ -195,6 +196,82 @@ rm -rf ${RPM_BUILD_ROOT}
 %{_libdir}/libelf.a
 
 %changelog
+* Mon Aug 25 2014 Mark Wielaard <mjw@redhat.com> 0.160-1
+- libdw: New functions dwarf_cu_getdwarf, dwarf_cu_die.
+  dwarf.h remove non-existing DW_TAG_mutable_type.
+- libdwfl: Handle LZMA .ko.xz compressed kernel modules.
+- unstrip: New option -F, --force to combining files even if some ELF
+  headers don't seem to match.
+- backends: Handle ARM THUMB functions. Add support for ppc64le ELFv2 abi.
+
+* Sat May 17 2014 Mark Wielaard <mjw@redhat.com> 0.159-1
+- stack: New option -d, --debugname to lookup DWARF debuginfo name 
+  for frame.  New option -i, --inlines to show inlined frames 
+  using DWARF debuginfo.
+- libdwelf: New libdwelf.h header for libdw.so DWARF ELF Low-level 
+  Functions.  New function dwelf_elf_gnu_debuglink, 
+  dwelf_dwarf_gnu_debugaltlink, and dwelf_elf_gnu_build_id.
+- libdw: Support for DWZ multifile forms DW_FORM_GNU_ref_alt and      
+  DW_FORM_GNU_strp_alt is now enabled by default and no longer        
+  experimental. Added new functions dwarf_getalt and dwarf_setalt       
+  to get or set the alternative debug file used for the alt FORMs.     
+  The dwfl_linux_proc_find_elf callback will now find ELF from       
+  process memory for (deleted) files if the Dwfl has process state     
+  attached.
+- libdwfl: The dwfl_build_id_find_debuginfo and 
+  dwfl_standard_find_debuginfo functions will now try to 
+  resolve and set the alternative debug file.
+- backends: Add CFI unwinding for arm. Relies on .debug_frame.        
+  Add arm process initial register state compatible mode to AARCH64. 
+  Add aarch64 native and core unwind support.
+- other: All separate elfutils-robustify patches have been merged.    
+  CVE-2014-0172 Check overflow before calling malloc to uncompress 
+  data.
+
+* Fri Jan  3 2014 Mark Wielaard <mjw@redhat.com> 0.158-1
+- libdwfl: dwfl_core_file_report has new parameter executable.
+  New functions dwfl_module_getsymtab_first_global,
+  dwfl_module_getsym_info and dwfl_module_addrinfo.
+  Added unwinder with type Dwfl_Thread_Callbacks, opaque types
+  Dwfl_Thread and Dwfl_Frame and functions dwfl_attach_state,
+  dwfl_pid, dwfl_thread_dwfl, dwfl_thread_tid, dwfl_frame_thread,
+  dwfl_thread_state_registers, dwfl_thread_state_register_pc,
+  dwfl_getthread_frames, dwfl_getthreads, dwfl_thread_getframes
+  and dwfl_frame_pc.
+- addr2line: New option -x to show the section an address was found in.
+- stack: New utility that uses the new unwinder for processes and cores.
+- backends: Unwinder support for i386, x86_64, s390, s390x, ppc and ppc64.
+  aarch64 support.
+
+* Mon Sep 30 2013 Mark Wielaard <mjw@redhat.com> 0.157-1
+- libdw: Add new functions dwarf_getlocations, dwarf_getlocation_attr 
+         and dwarf_getlocation_die.
+- readelf: Show contents of NT_SIGINFO and NT_FILE core notes.
+- addr2line: Support -i, --inlines output option.
+- backends: abi_cfi hook for arm, ppc and s390.
+
+* Thu Jul 25 2013 Jan Kratochvil <jan.kratochvil@redhat.com> 0.156-1
+- lib: New macro COMPAT_VERSION_NEWPROTO.
+- libdw: Handle GNU extension opcodes in dwarf_getlocation.
+- libdwfl: Fix STB_GLOBAL over STB_WEAK preference in 
+  dwfl_module_addrsym.          Add minisymtab support.          Add 
+  parameter add_p_vaddr to dwfl_report_elf.          Use DT_DEBUG 
+  library search first.
+- libebl: Handle new core note types in EBL.
+- backends: Interpret NT_ARM_VFP.           Implement core file 
+  registers parsing for s390/s390x.
+- readelf: Add --elf-section input option to inspect an embedded ELF 
+  file.          Add -U, --unresolved-address-offsets output control.   
+         Add --debug-dump=decodedline support.          Accept version 
+  8 .gdb_index section format.          Adjust output formatting width. 
+           When highpc is in constant form print it also as address.    
+        Display raw .debug_aranges. Use libdw only for decodedaranges.
+- elflint: Add __bss_start__ to the list of allowed symbols.
+- tests: Add configure --enable-valgrind option to run all tests 
+  under valgrind.        Enable automake parallel-tests for make check.
+- translations: Updated Polish translation.
+- Updates for Automake 1.13.
+
 * Fri Aug 24 2012 Mark Wielaard <mjw@redhat.com> 0.155-1
 - libelf: elf*_xlatetomd now works for cross-endian ELF note data.    
        elf_getshdr now works consistently on non-mmaped ELF files after 
index 47e831e..4415213 100644 (file)
@@ -1,3 +1,33 @@
+2014-01-17  Lei Zhang  <thestig@google.com>
+
+       * crc32_file.c: Include config.h.
+
+2013-12-12  Josh Stone  <jistone@redhat.com>
+
+       * dynamicsizehash.c (lookup): Add a shortcut around division.
+
+2013-04-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * eu-config.h (COMPAT_VERSION_NEWPROTO): New.  Twice.
+
+2013-04-26  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * system.h (LE64, BE64): Move here the definitions from
+       libdwfl/link_map.c.
+
+2013-04-24  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: Use AM_CPPFLAGS instead of INCLUDES.
+
+2012-10-09  Adam Markey  <adam@etinternational.com>
+
+       * system.h: Changed pwrite_retry, write_retry, and pread_retry to
+       handle case where not all data was read/written.
+
+2012-10-08  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * system.h (eu_static_assert): New macro.
+
 2012-01-21  Ulrich Drepper  <drepper@gmail.com>
 
        * Makefile.am (libeu_a_SOURCES): Add color.c.
index 740dd0f..97f295e 100644 (file)
@@ -29,7 +29,7 @@
 ##
 include $(top_srcdir)/config/eu.am
 AM_CFLAGS += -fpic
-INCLUDES += -I$(srcdir)/../libelf
+AM_CPPFLAGS += -I$(srcdir)/../libelf
 
 noinst_LIBRARIES = libeu.a
 
index 34eb05e..7e21563 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -35,12 +79,13 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
-       $(srcdir)/Makefile.in $(top_srcdir)/config/eu.am ChangeLog
-@MUDFLAP_TRUE@am__append_1 = -fmudflap
+DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \
+       $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \
+       $(noinst_HEADERS) ChangeLog
 subdir = lib
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
        $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/zip.m4 \
        $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
@@ -50,8 +95,11 @@ CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 LIBRARIES = $(noinst_LIBRARIES)
-AR = ar
 ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
 libeu_a_AR = $(AR) $(ARFLAGS)
 libeu_a_LIBADD =
 am_libeu_a_OBJECTS = xstrdup.$(OBJEXT) xstrndup.$(OBJEXT) \
@@ -59,29 +107,75 @@ am_libeu_a_OBJECTS = xstrdup.$(OBJEXT) xstrndup.$(OBJEXT) \
        crc32_file.$(OBJEXT) md5.$(OBJEXT) sha1.$(OBJEXT) \
        color.$(OBJEXT)
 libeu_a_OBJECTS = $(am_libeu_a_OBJECTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/config/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
 SOURCES = $(libeu_a_SOURCES)
 DIST_SOURCES = $(libeu_a_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
+CC_BIARCH = @CC_BIARCH@
 CFLAGS = @CFLAGS@
+CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEBUGPRED = @DEBUGPRED@
@@ -90,10 +184,13 @@ DEPDIR = @DEPDIR@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_VALGRIND = @HAVE_VALGRIND@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -114,6 +211,7 @@ MODVERSION = @MODVERSION@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
+NM = @NM@
 OBJEXT = @OBJEXT@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -124,6 +222,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+READELF = @READELF@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
@@ -138,6 +237,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -187,20 +287,14 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 zip_LIBS = @zip_LIBS@
-INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \
+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \
        -I$(srcdir)/../libelf
-AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \
+AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 $(if \
        $($(*F)_no_Werror),,-Werror) $(if \
-       $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \
-       $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \
-       $(am__append_1) -fpic
-@MUDFLAP_FALSE@libmudflap = 
-@MUDFLAP_TRUE@libmudflap = -lmudflap
-COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\
-                         $(COMPILE))
-
+       $($(*F)_no_Wunused),,-Wunused -Wextra) $($(*F)_CFLAGS) -fpic
+COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE))
 CLEANFILES = *.gcno *.gcda
-textrel_check = if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
+textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
 noinst_LIBRARIES = libeu.a
 libeu_a_SOURCES = xstrdup.c xstrndup.c xmalloc.c next_prime.c \
                  crc32.c crc32_file.c md5.c sha1.c \
@@ -249,10 +343,11 @@ $(am__aclocal_m4_deps):
 
 clean-noinstLIBRARIES:
        -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
 libeu.a: $(libeu_a_OBJECTS) $(libeu_a_DEPENDENCIES) $(EXTRA_libeu_a_DEPENDENCIES) 
-       -rm -f libeu.a
-       $(libeu_a_AR) libeu.a $(libeu_a_OBJECTS) $(libeu_a_LIBADD)
-       $(RANLIB) libeu.a
+       $(AM_V_at)-rm -f libeu.a
+       $(AM_V_AR)$(libeu_a_AR) libeu.a $(libeu_a_OBJECTS) $(libeu_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libeu.a
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -271,39 +366,28 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstrndup.Po@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
 
 .c.obj:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -315,15 +399,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -332,6 +412,21 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -472,17 +567,17 @@ uninstall-am:
 
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-       clean-noinstLIBRARIES ctags distclean distclean-compile \
-       distclean-generic distclean-tags distdir dvi dvi-am html \
-       html-am info info-am install install-am install-data \
-       install-data-am install-dvi install-dvi-am install-exec \
-       install-exec-am install-html install-html-am install-info \
-       install-info-am install-man install-pdf install-pdf-am \
-       install-ps install-ps-am install-strip installcheck \
-       installcheck-am installdirs maintainer-clean \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+       clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \
+       distclean-compile distclean-generic distclean-tags distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
+       install-info install-info-am install-man install-pdf \
+       install-pdf-am install-ps install-ps-am install-strip \
+       installcheck installcheck-am installdirs maintainer-clean \
        maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
        uninstall-am
 
 
index 9a168f6..c0b18e9 100644 (file)
    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 "system.h"
 #include <errno.h>
 #include <unistd.h>
index 40f48d5..1fdff1b 100644 (file)
@@ -49,8 +49,9 @@ lookup (htab, hval, val)
      HASHTYPE hval;
      TYPE val __attribute__ ((unused));
 {
-  /* First hash function: simply take the modul but prevent zero.  */
-  size_t idx = 1 + hval % htab->size;
+  /* 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);
 
   if (htab->table[idx].hashval != 0)
     {
index 68efb82..3afff26 100644 (file)
@@ -170,12 +170,18 @@ asm (".section predict_data, \"aw\"; .previous\n"
        ".symver _compat." #version "." #name "," #name "@" #version);
 # define NEW_VERSION(name, version) \
   asm (".symver " #name "," #name "@@@" #version);
+# define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
+  asm (".symver _compat." #version "." #name "," #name "@" #version); \
+  __typeof (_compat_##prefix##_##name) _compat_##prefix##_##name \
+    asm ("_compat." #version "." #name);
 # define COMPAT_VERSION(name, version, prefix) \
   asm (".symver _compat." #version "." #name "," #name "@" #version); \
   __typeof (name) _compat_##prefix##_##name asm ("_compat." #version "." #name);
 #else
 # define OLD_VERSION(name, version) /* Nothing for static linking.  */
 # define NEW_VERSION(name, version) /* Nothing for static linking.  */
+# define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
+  error "should use #ifdef SHARED"
 # define COMPAT_VERSION(name, version, prefix) error "should use #ifdef SHARED"
 #endif
 
index 9ac01f8..f31cfd0 100644 (file)
 #include <stdint.h>
 #include <endian.h>
 #include <byteswap.h>
+#include <unistd.h>
 
 #if __BYTE_ORDER == __LITTLE_ENDIAN
 # define LE32(n)       (n)
+# define LE64(n)       (n)
 # define BE32(n)       bswap_32 (n)
+# define BE64(n)       bswap_64 (n)
 #elif __BYTE_ORDER == __BIG_ENDIAN
 # define BE32(n)       (n)
+# define BE64(n)       (n)
 # define LE32(n)       bswap_32 (n)
+# define LE64(n)       bswap_64 (n)
 #else
 # error "Unknown byte order"
 #endif
@@ -64,12 +69,61 @@ extern int crc32_file (int fd, uint32_t *resp);
 #define gettext_noop(Str) Str
 
 
-#define pwrite_retry(fd, buf,  len, off) \
-  TEMP_FAILURE_RETRY (pwrite (fd, buf, len, off))
-#define write_retry(fd, buf, n) \
-     TEMP_FAILURE_RETRY (write (fd, buf, n))
-#define pread_retry(fd, buf,  len, off) \
-  TEMP_FAILURE_RETRY (pread (fd, buf, len, off))
+static inline ssize_t __attribute__ ((unused))
+pwrite_retry (int fd, const void *buf, size_t len, off_t off)
+{
+  ssize_t recvd = 0;
+
+  do
+    {
+      ssize_t ret = TEMP_FAILURE_RETRY (pwrite (fd, buf + recvd, len - recvd,
+                                               off + recvd));
+      if (ret <= 0)
+       return ret < 0 ? ret : recvd;
+
+      recvd += ret;
+    }
+  while ((size_t) recvd < len);
+
+  return recvd;
+}
+
+static inline ssize_t __attribute__ ((unused))
+write_retry (int fd, const void *buf, size_t len)
+{
+  ssize_t recvd = 0;
+
+  do
+    {
+      ssize_t ret = TEMP_FAILURE_RETRY (write (fd, buf + recvd, len - recvd));
+      if (ret <= 0)
+       return ret < 0 ? ret : recvd;
+
+      recvd += ret;
+    }
+  while ((size_t) recvd < len);
+
+  return recvd;
+}
+
+static inline ssize_t __attribute__ ((unused))
+pread_retry (int fd, void *buf, size_t len, off_t off)
+{
+  ssize_t recvd = 0;
+
+  do
+    {
+      ssize_t ret = TEMP_FAILURE_RETRY (pread (fd, buf + recvd, len - recvd,
+                                              off + recvd));
+      if (ret <= 0)
+       return ret < 0 ? ret : recvd;
+
+      recvd += ret;
+    }
+  while ((size_t) recvd < len);
+
+  return recvd;
+}
 
 
 /* We need define two variables, argp_program_version_hook and
@@ -121,4 +175,11 @@ extern char *color_weak;
 
 extern const char color_off[];
 
+/* A static assertion.  This will cause a compile-time error if EXPR,
+   which must be a compile-time constant, is false.  */
+
+#define eu_static_assert(expr)                                         \
+  extern int never_defined_just_used_for_checking[(expr) ? 1 : -1]     \
+    __attribute__ ((unused))
+
 #endif /* system.h */
index f9a863d..2613610 100644 (file)
@@ -1,3 +1,11 @@
+2014-04-13  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: Remove !MUDFLAP conditions.
+
+2013-04-24  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: Use AM_CPPFLAGS instead of INCLUDES.
+
 2011-02-08  Roland McGrath  <roland@redhat.com>
 
        * asm_newscn.c (asm_newscn): Remove unused variable.
index abe5468..3d6a2e5 100644 (file)
 ## not, see <http://www.gnu.org/licenses/>.
 ##
 include $(top_srcdir)/config/eu.am
-INCLUDES += -I$(top_srcdir)/libelf -I$(top_srcdir)/libebl -I$(top_srcdir)/libdw
+AM_CPPFLAGS += -I$(top_srcdir)/libelf -I$(top_srcdir)/libebl -I$(top_srcdir)/libdw
 
 GCC_INCLUDE = -I$(shell $(CC) -print-file-name=include)
 VERSION = 1
 
 lib_LIBRARIES = libasm.a
-if !MUDFLAP
 noinst_LIBRARIES = libasm_pic.a
 noinst_PROGRAMS = $(noinst_LIBRARIES:_pic.a=.so)
-endif
 pkginclude_HEADERS = libasm.h
 
 libasm_a_SOURCES = asm_begin.c asm_abort.c asm_end.c asm_error.c \
@@ -54,7 +52,6 @@ libasm_a_SOURCES = asm_begin.c asm_abort.c asm_end.c asm_error.c \
                   disasm_begin.c disasm_cb.c disasm_end.c disasm_str.c \
                   symbolhash.c
 
-if !MUDFLAP
 libasm_pic_a_SOURCES =
 am_libasm_pic_a_OBJECTS = $(libasm_a_SOURCES:.c=.os)
 
@@ -64,12 +61,12 @@ libasm_so_LDLIBS += -lpthread
 endif
 
 libasm_so_SOURCES =
-libasm.so: libasm_pic.a libasm.map
+libasm.so$(EXEEXT): libasm_pic.a libasm.map
        $(LINK) -shared -o $@ -Wl,--whole-archive,$<,--no-whole-archive \
                -Wl,--version-script,$(srcdir)/libasm.map,--no-undefined \
                -Wl,--soname,$@.$(VERSION) \
                ../libebl/libebl.a ../libelf/libelf.so  $(libasm_so_LDLIBS)
-       if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
+       if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
        ln -fs $@ $@.$(VERSION)
 
 install: install-am libasm.so
@@ -83,7 +80,6 @@ uninstall: uninstall-am
        rm -f $(DESTDIR)$(libdir)/libasm.so.$(VERSION)
        rm -f $(DESTDIR)$(libdir)/libasm.so
        rmdir --ignore-fail-on-non-empty $(DESTDIR)$(includedir)/elfutils
-endif
 
 noinst_HEADERS = libasmP.h symbolhash.h
 EXTRA_DIST = libasm.map
index b20ae8f..37dbd9c 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -36,16 +80,15 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
-       $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-       $(top_srcdir)/config/eu.am ChangeLog
-@MUDFLAP_TRUE@am__append_1 = -fmudflap
-@MUDFLAP_FALSE@noinst_PROGRAMS = $(am__EXEEXT_1)
-@MUDFLAP_TRUE@am_libasm_pic_a_OBJECTS =
-@MUDFLAP_FALSE@@USE_LOCKS_TRUE@am__append_2 = -lpthread
+DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \
+       $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \
+       $(noinst_HEADERS) $(pkginclude_HEADERS) ChangeLog
+noinst_PROGRAMS = $(am__EXEEXT_1)
+@USE_LOCKS_TRUE@am__append_1 = -lpthread
 subdir = libasm
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
        $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/zip.m4 \
        $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
@@ -83,8 +126,11 @@ am__uninstall_files_from_dir = { \
   }
 am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"
 LIBRARIES = $(lib_LIBRARIES) $(noinst_LIBRARIES)
-AR = ar
 ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
 libasm_a_AR = $(AR) $(ARFLAGS)
 libasm_a_LIBADD =
 am_libasm_a_OBJECTS = asm_begin.$(OBJEXT) asm_abort.$(OBJEXT) \
@@ -105,36 +151,82 @@ libasm_a_OBJECTS = $(am_libasm_a_OBJECTS)
 libasm_pic_a_AR = $(AR) $(ARFLAGS)
 libasm_pic_a_LIBADD =
 libasm_pic_a_OBJECTS = $(am_libasm_pic_a_OBJECTS)
-@MUDFLAP_FALSE@am__EXEEXT_1 = libasm.so$(EXEEXT)
+am__EXEEXT_1 = libasm.so$(EXEEXT)
 PROGRAMS = $(noinst_PROGRAMS)
 am_libasm_so_OBJECTS =
 libasm_so_OBJECTS = $(am_libasm_so_OBJECTS)
 libasm_so_LDADD = $(LDADD)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/config/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
 SOURCES = $(libasm_a_SOURCES) $(libasm_pic_a_SOURCES) \
        $(libasm_so_SOURCES)
 DIST_SOURCES = $(libasm_a_SOURCES) $(libasm_pic_a_SOURCES) \
        $(libasm_so_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
+CC_BIARCH = @CC_BIARCH@
 CFLAGS = @CFLAGS@
+CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEBUGPRED = @DEBUGPRED@
@@ -143,10 +235,13 @@ DEPDIR = @DEPDIR@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_VALGRIND = @HAVE_VALGRIND@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -167,6 +262,7 @@ MODVERSION = @MODVERSION@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
+NM = @NM@
 OBJEXT = @OBJEXT@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -177,6 +273,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+READELF = @READELF@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
@@ -191,6 +288,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -240,25 +338,21 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 zip_LIBS = @zip_LIBS@
-INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \
+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \
        -I$(top_srcdir)/libelf -I$(top_srcdir)/libebl \
        -I$(top_srcdir)/libdw
-AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \
-       $($(*F)_no_Werror),,-Werror) $(if \
-       $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \
-       $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \
-       $(am__append_1)
-@MUDFLAP_FALSE@libmudflap = 
-@MUDFLAP_TRUE@libmudflap = -lmudflap
-COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\
-                         $(COMPILE))
+AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \
+           $(if $($(*F)_no_Werror),,-Werror) \
+           $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \
+           $($(*F)_CFLAGS)
 
+COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE))
 CLEANFILES = *.gcno *.gcda $(am_libasm_pic_a_OBJECTS) \
        libasm.so.$(VERSION)
-textrel_check = if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
+textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
 GCC_INCLUDE = -I$(shell $(CC) -print-file-name=include)
 lib_LIBRARIES = libasm.a
-@MUDFLAP_FALSE@noinst_LIBRARIES = libasm_pic.a
+noinst_LIBRARIES = libasm_pic.a
 pkginclude_HEADERS = libasm.h
 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 \
@@ -274,10 +368,10 @@ libasm_a_SOURCES = asm_begin.c asm_abort.c asm_end.c asm_error.c \
                   disasm_begin.c disasm_cb.c disasm_end.c disasm_str.c \
                   symbolhash.c
 
-@MUDFLAP_FALSE@libasm_pic_a_SOURCES = 
-@MUDFLAP_FALSE@am_libasm_pic_a_OBJECTS = $(libasm_a_SOURCES:.c=.os)
-@MUDFLAP_FALSE@libasm_so_LDLIBS = $(am__append_2)
-@MUDFLAP_FALSE@libasm_so_SOURCES = 
+libasm_pic_a_SOURCES = 
+am_libasm_pic_a_OBJECTS = $(libasm_a_SOURCES:.c=.os)
+libasm_so_LDLIBS = $(am__append_1)
+libasm_so_SOURCES = 
 noinst_HEADERS = libasmP.h symbolhash.h
 EXTRA_DIST = libasm.map
 all: all-am
@@ -317,7 +411,6 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 install-libLIBRARIES: $(lib_LIBRARIES)
        @$(NORMAL_INSTALL)
-       test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
        @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \
        list2=; for p in $$list; do \
          if test -f $$p; then \
@@ -325,6 +418,8 @@ install-libLIBRARIES: $(lib_LIBRARIES)
          else :; fi; \
        done; \
        test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
          echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \
          $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; }
        @$(POST_INSTALL)
@@ -348,20 +443,19 @@ clean-libLIBRARIES:
 
 clean-noinstLIBRARIES:
        -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
 libasm.a: $(libasm_a_OBJECTS) $(libasm_a_DEPENDENCIES) $(EXTRA_libasm_a_DEPENDENCIES) 
-       -rm -f libasm.a
-       $(libasm_a_AR) libasm.a $(libasm_a_OBJECTS) $(libasm_a_LIBADD)
-       $(RANLIB) libasm.a
+       $(AM_V_at)-rm -f libasm.a
+       $(AM_V_AR)$(libasm_a_AR) libasm.a $(libasm_a_OBJECTS) $(libasm_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libasm.a
+
 libasm_pic.a: $(libasm_pic_a_OBJECTS) $(libasm_pic_a_DEPENDENCIES) $(EXTRA_libasm_pic_a_DEPENDENCIES) 
-       -rm -f libasm_pic.a
-       $(libasm_pic_a_AR) libasm_pic.a $(libasm_pic_a_OBJECTS) $(libasm_pic_a_LIBADD)
-       $(RANLIB) libasm_pic.a
+       $(AM_V_at)-rm -f libasm_pic.a
+       $(AM_V_AR)$(libasm_pic_a_AR) libasm_pic.a $(libasm_pic_a_OBJECTS) $(libasm_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libasm_pic.a
 
 clean-noinstPROGRAMS:
        -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
-@MUDFLAP_TRUE@libasm.so$(EXEEXT): $(libasm_so_OBJECTS) $(libasm_so_DEPENDENCIES) $(EXTRA_libasm_so_DEPENDENCIES) 
-@MUDFLAP_TRUE@ @rm -f libasm.so$(EXEEXT)
-@MUDFLAP_TRUE@ $(LINK) $(libasm_so_OBJECTS) $(libasm_so_LDADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -402,22 +496,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symbolhash.Po@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
 
 .c.obj:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
 install-pkgincludeHEADERS: $(pkginclude_HEADERS)
        @$(NORMAL_INSTALL)
-       test -z "$(pkgincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)"
        @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -433,26 +530,15 @@ uninstall-pkgincludeHEADERS:
        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
        dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
 
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -464,15 +550,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -481,6 +563,21 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -522,10 +619,8 @@ installdirs:
        for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"; do \
          test -z "$$dir" || $(MKDIR_P) "$$dir"; \
        done
-@MUDFLAP_TRUE@install: install-am
 install-exec: install-exec-am
 install-data: install-data-am
-@MUDFLAP_TRUE@uninstall: uninstall-am
 
 install-am: all-am
        @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
@@ -625,20 +720,20 @@ uninstall-am: uninstall-libLIBRARIES uninstall-pkgincludeHEADERS
 
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
        clean-libLIBRARIES clean-noinstLIBRARIES clean-noinstPROGRAMS \
-       ctags distclean distclean-compile distclean-generic \
-       distclean-tags distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am \
-       install-libLIBRARIES install-man install-pdf install-pdf-am \
-       install-pkgincludeHEADERS install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
-       mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
-       tags uninstall uninstall-am uninstall-libLIBRARIES \
-       uninstall-pkgincludeHEADERS
+       cscopelist-am ctags ctags-am distclean distclean-compile \
+       distclean-generic distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-libLIBRARIES install-man install-pdf \
+       install-pdf-am install-pkgincludeHEADERS install-ps \
+       install-ps-am install-strip installcheck installcheck-am \
+       installdirs maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
+       ps ps-am tags tags-am uninstall uninstall-am \
+       uninstall-libLIBRARIES uninstall-pkgincludeHEADERS
 
 
 %.os: %.c %.o
@@ -649,25 +744,25 @@ uninstall-am: uninstall-libLIBRARIES uninstall-pkgincludeHEADERS
 @AMDEP_TRUE@   else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
 @AMDEP_TRUE@   fi
 @AMDEP_FALSE@  $(COMPILE.os) -c -o $@ -fpic -DPIC -DSHARED $<
-@MUDFLAP_FALSE@libasm.so: libasm_pic.a libasm.map
-@MUDFLAP_FALSE@        $(LINK) -shared -o $@ -Wl,--whole-archive,$<,--no-whole-archive \
-@MUDFLAP_FALSE@                -Wl,--version-script,$(srcdir)/libasm.map,--no-undefined \
-@MUDFLAP_FALSE@                -Wl,--soname,$@.$(VERSION) \
-@MUDFLAP_FALSE@                ../libebl/libebl.a ../libelf/libelf.so  $(libasm_so_LDLIBS)
-@MUDFLAP_FALSE@        if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
-@MUDFLAP_FALSE@        ln -fs $@ $@.$(VERSION)
-
-@MUDFLAP_FALSE@install: install-am libasm.so
-@MUDFLAP_FALSE@        $(mkinstalldirs) $(DESTDIR)$(libdir)
-@MUDFLAP_FALSE@        $(INSTALL_PROGRAM) libasm.so $(DESTDIR)$(libdir)/libasm-$(PACKAGE_VERSION).so
-@MUDFLAP_FALSE@        ln -fs libasm-$(PACKAGE_VERSION).so $(DESTDIR)$(libdir)/libasm.so.$(VERSION)
-@MUDFLAP_FALSE@        ln -fs libasm.so.$(VERSION) $(DESTDIR)$(libdir)/libasm.so
-
-@MUDFLAP_FALSE@uninstall: uninstall-am
-@MUDFLAP_FALSE@        rm -f $(DESTDIR)$(libdir)/libasm-$(PACKAGE_VERSION).so
-@MUDFLAP_FALSE@        rm -f $(DESTDIR)$(libdir)/libasm.so.$(VERSION)
-@MUDFLAP_FALSE@        rm -f $(DESTDIR)$(libdir)/libasm.so
-@MUDFLAP_FALSE@        rmdir --ignore-fail-on-non-empty $(DESTDIR)$(includedir)/elfutils
+libasm.so$(EXEEXT): libasm_pic.a libasm.map
+       $(LINK) -shared -o $@ -Wl,--whole-archive,$<,--no-whole-archive \
+               -Wl,--version-script,$(srcdir)/libasm.map,--no-undefined \
+               -Wl,--soname,$@.$(VERSION) \
+               ../libebl/libebl.a ../libelf/libelf.so  $(libasm_so_LDLIBS)
+       if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
+       ln -fs $@ $@.$(VERSION)
+
+install: install-am libasm.so
+       $(mkinstalldirs) $(DESTDIR)$(libdir)
+       $(INSTALL_PROGRAM) libasm.so $(DESTDIR)$(libdir)/libasm-$(PACKAGE_VERSION).so
+       ln -fs libasm-$(PACKAGE_VERSION).so $(DESTDIR)$(libdir)/libasm.so.$(VERSION)
+       ln -fs libasm.so.$(VERSION) $(DESTDIR)$(libdir)/libasm.so
+
+uninstall: uninstall-am
+       rm -f $(DESTDIR)$(libdir)/libasm-$(PACKAGE_VERSION).so
+       rm -f $(DESTDIR)$(libdir)/libasm.so.$(VERSION)
+       rm -f $(DESTDIR)$(libdir)/libasm.so
+       rmdir --ignore-fail-on-non-empty $(DESTDIR)$(includedir)/elfutils
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
index b1d79a9..a20f440 100644 (file)
@@ -1,3 +1,16 @@
+2014-04-13  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (i386_gendis_LDADD): Remove libmudflap.
+
+2013-04-24  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: Use AM_CPPFLAGS instead of INCLUDES.
+
+2012-10-10  Roland McGrath  <roland@hack.frob.com>
+
+       * Makefile.am (%_defs, $(srcdir)/%_dis.h): Redirect to temp file,
+       mv into place with separate command.
+
 2012-06-26  Roland McGrath  <roland@hack.frob.com>
 
        * Makefile.am [!MAINTAINER_MODE] ($(srcdir)/%_dis.h): New rule.
index 8f62be2..3beccf3 100644 (file)
@@ -28,7 +28,7 @@
 ## not, see <http://www.gnu.org/licenses/>.
 ##
 include $(top_srcdir)/config/eu.am
-INCLUDES += -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
+AM_CPPFLAGS += -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
            -I$(srcdir)/../libdw -I$(srcdir)/../libasm
 AM_CFLAGS += -fpic -fdollars-in-identifiers
 LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) -P$(<F:lex.l=)
@@ -46,7 +46,8 @@ i386_disasm.o: i386.mnemonics $(srcdir)/i386_dis.h
 x86_64_disasm.o: x86_64.mnemonics $(srcdir)/x86_64_dis.h
 
 %_defs: $(srcdir)/defs/i386
-       m4 -D$* -DDISASSEMBLER $< > $@
+       m4 -D$* -DDISASSEMBLER $< > $@T
+       mv -f $@T $@
 
 if MAINTAINER_MODE
 noinst_HEADERS = memory-access.h i386_parse.h i386_data.h
@@ -54,7 +55,8 @@ noinst_HEADERS = memory-access.h i386_parse.h i386_data.h
 noinst_PROGRAMS = i386_gendis
 
 $(srcdir)/%_dis.h: %_defs i386_gendis
-       ./i386_gendis $< > $@
+       ./i386_gendis $< > $@T
+       mv -f $@T $@
 
 else
 
@@ -76,7 +78,7 @@ i386_lex_CFLAGS = -Wno-unused-label -Wno-unused-function -Wno-sign-compare
 i386_parse.o: i386_parse.c i386.mnemonics
 i386_parse_CFLAGS = -DNMNES="`wc -l < i386.mnemonics`"
 i386_lex.o: i386_parse.h
-i386_gendis_LDADD = $(libeu) -lm $(libmudflap)
+i386_gendis_LDADD = $(libeu) -lm
 
 i386_parse.h: i386_parse.c ;
 
index 427fe97..1cd457b 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -36,14 +80,15 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(am__noinst_HEADERS_DIST) $(srcdir)/Makefile.am \
-       $(srcdir)/Makefile.in $(top_srcdir)/config/eu.am ChangeLog \
-       i386_lex.c i386_parse.c
-@MUDFLAP_TRUE@am__append_1 = -fmudflap
+DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \
+       $(srcdir)/Makefile.am i386_lex.c i386_parse.c \
+       $(top_srcdir)/config/depcomp $(top_srcdir)/config/ylwrap \
+       $(am__noinst_HEADERS_DIST) ChangeLog
 @MAINTAINER_MODE_TRUE@noinst_PROGRAMS = i386_gendis$(EXEEXT)
 subdir = libcpu
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
        $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/zip.m4 \
        $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
@@ -53,8 +98,11 @@ CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 LIBRARIES = $(noinst_LIBRARIES)
-AR = ar
 ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
 libcpu_i386_a_AR = $(AR) $(ARFLAGS)
 libcpu_i386_a_LIBADD =
 am_libcpu_i386_a_OBJECTS = i386_disasm.$(OBJEXT)
@@ -67,38 +115,93 @@ PROGRAMS = $(noinst_PROGRAMS)
 am_i386_gendis_OBJECTS = i386_gendis.$(OBJEXT) i386_lex.$(OBJEXT) \
        i386_parse.$(OBJEXT)
 i386_gendis_OBJECTS = $(am_i386_gendis_OBJECTS)
-am__DEPENDENCIES_1 =
-i386_gendis_DEPENDENCIES = $(libeu) $(am__DEPENDENCIES_1)
+i386_gendis_DEPENDENCIES = $(libeu)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/config/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
 @MAINTAINER_MODE_FALSE@am__skiplex = test -f $@ ||
+AM_V_LEX = $(am__v_LEX_@AM_V@)
+am__v_LEX_ = $(am__v_LEX_@AM_DEFAULT_V@)
+am__v_LEX_0 = @echo "  LEX     " $@;
+am__v_LEX_1 = 
 YLWRAP = $(top_srcdir)/config/ylwrap
 @MAINTAINER_MODE_FALSE@am__skipyacc = test -f $@ ||
+am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \
+                  -e s/c++$$/h++/ -e s/c$$/h/
 YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS)
+AM_V_YACC = $(am__v_YACC_@AM_V@)
+am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@)
+am__v_YACC_0 = @echo "  YACC    " $@;
+am__v_YACC_1 = 
 SOURCES = $(libcpu_i386_a_SOURCES) $(libcpu_x86_64_a_SOURCES) \
        $(i386_gendis_SOURCES)
 DIST_SOURCES = $(libcpu_i386_a_SOURCES) $(libcpu_x86_64_a_SOURCES) \
        $(i386_gendis_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 am__noinst_HEADERS_DIST = memory-access.h i386_parse.h i386_data.h
 HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
+CC_BIARCH = @CC_BIARCH@
 CFLAGS = @CFLAGS@
+CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEBUGPRED = @DEBUGPRED@
@@ -107,10 +210,13 @@ DEPDIR = @DEPDIR@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_VALGRIND = @HAVE_VALGRIND@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -131,6 +237,7 @@ MODVERSION = @MODVERSION@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
+NM = @NM@
 OBJEXT = @OBJEXT@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -141,6 +248,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+READELF = @READELF@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
@@ -155,6 +263,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -204,22 +313,17 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 zip_LIBS = @zip_LIBS@
-INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \
+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \
        -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
        -I$(srcdir)/../libdw -I$(srcdir)/../libasm
-AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \
+AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 $(if \
        $($(*F)_no_Werror),,-Werror) $(if \
-       $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \
-       $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \
-       $(am__append_1) -fpic -fdollars-in-identifiers
-@MUDFLAP_FALSE@libmudflap = 
-@MUDFLAP_TRUE@libmudflap = -lmudflap
-COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\
-                         $(COMPILE))
-
+       $($(*F)_no_Wunused),,-Wunused -Wextra) $($(*F)_CFLAGS) -fpic \
+       -fdollars-in-identifiers
+COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE))
 CLEANFILES = *.gcno *.gcda $(foreach P,i386 x86_64,$P_defs \
        $P.mnemonics)
-textrel_check = if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
+textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
 LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) -P$(<F:lex.l=)
 AM_YFLAGS = -p$(<F:parse.y=)
 noinst_LIBRARIES = libcpu_i386.a libcpu_x86_64.a
@@ -231,7 +335,7 @@ i386_lex_no_Werror = yes
 libeu = ../lib/libeu.a
 i386_lex_CFLAGS = -Wno-unused-label -Wno-unused-function -Wno-sign-compare
 i386_parse_CFLAGS = -DNMNES="`wc -l < i386.mnemonics`"
-i386_gendis_LDADD = $(libeu) -lm $(libmudflap)
+i386_gendis_LDADD = $(libeu) -lm
 EXTRA_DIST = defs/i386
 MAINTAINERCLEANFILES = $(foreach P,i386 x86_64, $P_dis.h)
 all: all-am
@@ -272,20 +376,23 @@ $(am__aclocal_m4_deps):
 
 clean-noinstLIBRARIES:
        -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
 libcpu_i386.a: $(libcpu_i386_a_OBJECTS) $(libcpu_i386_a_DEPENDENCIES) $(EXTRA_libcpu_i386_a_DEPENDENCIES) 
-       -rm -f libcpu_i386.a
-       $(libcpu_i386_a_AR) libcpu_i386.a $(libcpu_i386_a_OBJECTS) $(libcpu_i386_a_LIBADD)
-       $(RANLIB) libcpu_i386.a
+       $(AM_V_at)-rm -f libcpu_i386.a
+       $(AM_V_AR)$(libcpu_i386_a_AR) libcpu_i386.a $(libcpu_i386_a_OBJECTS) $(libcpu_i386_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libcpu_i386.a
+
 libcpu_x86_64.a: $(libcpu_x86_64_a_OBJECTS) $(libcpu_x86_64_a_DEPENDENCIES) $(EXTRA_libcpu_x86_64_a_DEPENDENCIES) 
-       -rm -f libcpu_x86_64.a
-       $(libcpu_x86_64_a_AR) libcpu_x86_64.a $(libcpu_x86_64_a_OBJECTS) $(libcpu_x86_64_a_LIBADD)
-       $(RANLIB) libcpu_x86_64.a
+       $(AM_V_at)-rm -f libcpu_x86_64.a
+       $(AM_V_AR)$(libcpu_x86_64_a_AR) libcpu_x86_64.a $(libcpu_x86_64_a_OBJECTS) $(libcpu_x86_64_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libcpu_x86_64.a
 
 clean-noinstPROGRAMS:
        -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+
 i386_gendis$(EXEEXT): $(i386_gendis_OBJECTS) $(i386_gendis_DEPENDENCIES) $(EXTRA_i386_gendis_DEPENDENCIES) 
        @rm -f i386_gendis$(EXEEXT)
-       $(LINK) $(i386_gendis_OBJECTS) $(i386_gendis_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(i386_gendis_OBJECTS) $(i386_gendis_LDADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -300,45 +407,34 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x86_64_disasm.Po@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
 
 .c.obj:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
 
 .l.c:
-       $(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE)
+       $(AM_V_LEX)$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE)
 
 .y.c:
-       $(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+       $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE)
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -350,15 +446,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -367,6 +459,21 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -511,18 +618,18 @@ uninstall-am:
 
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-       clean-noinstLIBRARIES clean-noinstPROGRAMS ctags distclean \
-       distclean-compile distclean-generic distclean-tags distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-html install-html-am \
-       install-info install-info-am install-man install-pdf \
-       install-pdf-am install-ps install-ps-am install-strip \
-       installcheck installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
-       uninstall-am
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+       clean-noinstLIBRARIES clean-noinstPROGRAMS cscopelist-am ctags \
+       ctags-am distclean distclean-compile distclean-generic \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+       tags tags-am uninstall uninstall-am
 
 
 %.os: %.c %.o
@@ -538,10 +645,12 @@ i386_disasm.o: i386.mnemonics $(srcdir)/i386_dis.h
 x86_64_disasm.o: x86_64.mnemonics $(srcdir)/x86_64_dis.h
 
 %_defs: $(srcdir)/defs/i386
-       m4 -D$* -DDISASSEMBLER $< > $@
+       m4 -D$* -DDISASSEMBLER $< > $@T
+       mv -f $@T $@
 
 @MAINTAINER_MODE_TRUE@$(srcdir)/%_dis.h: %_defs i386_gendis
-@MAINTAINER_MODE_TRUE@ ./i386_gendis $< > $@
+@MAINTAINER_MODE_TRUE@ ./i386_gendis $< > $@T
+@MAINTAINER_MODE_TRUE@ mv -f $@T $@
 
 @MAINTAINER_MODE_FALSE@$(srcdir)/%_dis.h:
 @MAINTAINER_MODE_FALSE@        @echo '*** missing $@; configure with --enable-maintainer-mode'
index 5700712..d1a730d 100644 (file)
@@ -27,7 +27,7 @@
 #define FLEX_SCANNER
 #define YY_FLEX_MAJOR_VERSION 2
 #define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 35
+#define YY_FLEX_SUBMINOR_VERSION 37
 #if YY_FLEX_SUBMINOR_VERSION > 0
 #define FLEX_BETA
 #endif
@@ -72,7 +72,6 @@ typedef int flex_int32_t;
 typedef unsigned char flex_uint8_t; 
 typedef unsigned short int flex_uint16_t;
 typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
 
 /* Limits of integral types. */
 #ifndef INT8_MIN
@@ -103,6 +102,8 @@ typedef unsigned int flex_uint32_t;
 #define UINT32_MAX             (4294967295U)
 #endif
 
+#endif /* ! C99 */
+
 #endif /* ! FLEXINT_H */
 
 #ifdef __cplusplus
@@ -171,7 +172,12 @@ typedef unsigned int flex_uint32_t;
 typedef struct yy_buffer_state *YY_BUFFER_STATE;
 #endif
 
-extern int i386_leng;
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t i386_leng;
 
 extern FILE *i386_in, *i386_out;
 
@@ -210,11 +216,6 @@ extern FILE *i386_in, *i386_out;
 
 #define unput(c) yyunput( c, (yytext_ptr)  )
 
-#ifndef YY_TYPEDEF_YY_SIZE_T
-#define YY_TYPEDEF_YY_SIZE_T
-typedef size_t yy_size_t;
-#endif
-
 #ifndef YY_STRUCT_YY_BUFFER_STATE
 #define YY_STRUCT_YY_BUFFER_STATE
 struct yy_buffer_state
@@ -232,7 +233,7 @@ struct yy_buffer_state
        /* Number of characters read into yy_ch_buf, not including EOB
         * characters.
         */
-       int yy_n_chars;
+       yy_size_t yy_n_chars;
 
        /* Whether we "own" the buffer - i.e., we know we created it,
         * and can realloc() it to grow it, and should free() it to
@@ -302,8 +303,8 @@ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
 
 /* yy_hold_char holds the character lost when i386_text is formed. */
 static char yy_hold_char;
-static int yy_n_chars;         /* number of characters read into yy_ch_buf */
-int i386_leng;
+static yy_size_t yy_n_chars;           /* number of characters read into yy_ch_buf */
+yy_size_t i386_leng;
 
 /* Points to current character in buffer. */
 static char *yy_c_buf_p = (char *) 0;
@@ -331,7 +332,7 @@ static void i386__init_buffer (YY_BUFFER_STATE b,FILE *file  );
 
 YY_BUFFER_STATE i386__scan_buffer (char *base,yy_size_t size  );
 YY_BUFFER_STATE i386__scan_string (yyconst char *yy_str  );
-YY_BUFFER_STATE i386__scan_bytes (yyconst char *bytes,int len  );
+YY_BUFFER_STATE i386__scan_bytes (yyconst char *bytes,yy_size_t len  );
 
 void *i386_alloc (yy_size_t  );
 void *i386_realloc (void *,yy_size_t  );
@@ -363,7 +364,7 @@ void i386_free (void *  );
 
 /* Begin user sect3 */
 
-#define i386_wrap(n) 1
+#define i386_wrap() 1
 #define YY_SKIP_YYWRAP
 
 typedef unsigned char YY_CHAR;
@@ -580,7 +581,7 @@ char *i386_text;
 static void eat_to_eol (void);
 static void invalid_char (int ch);
 
-#line 584 "i386_lex.c"
+#line 585 "i386_lex.c"
 
 #define INITIAL 0
 #define MAIN 1
@@ -620,7 +621,7 @@ FILE *i386_get_out (void );
 
 void i386_set_out  (FILE * out_str  );
 
-int i386_get_leng (void );
+yy_size_t i386_get_leng (void );
 
 char *i386_get_text (void );
 
@@ -681,7 +682,7 @@ static int input (void );
        if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
                { \
                int c = '*'; \
-               unsigned n; \
+               size_t n; \
                for ( n = 0; n < max_size && \
                             (c = getc( i386_in )) != EOF && c != '\n'; ++n ) \
                        buf[n] = (char) c; \
@@ -769,7 +770,7 @@ YY_DECL
 #line 57 "i386_lex.l"
 
 
-#line 773 "i386_lex.c"
+#line 774 "i386_lex.c"
 
        if ( !(yy_init) )
                {
@@ -840,7 +841,7 @@ yy_find_action:
 
                if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
                        {
-                       int yyl;
+                       yy_size_t yyl;
                        for ( yyl = 0; yyl < i386_leng; ++yyl )
                                if ( i386_text[yyl] == '\n' )
                                           
@@ -973,7 +974,7 @@ YY_RULE_SETUP
 #line 104 "i386_lex.l"
 ECHO;
        YY_BREAK
-#line 977 "i386_lex.c"
+#line 978 "i386_lex.c"
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(MAIN):
        yyterminate();
@@ -1161,21 +1162,21 @@ static int yy_get_next_buffer (void)
 
        else
                {
-                       int num_to_read =
+                       yy_size_t num_to_read =
                        YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
 
                while ( num_to_read <= 0 )
                        { /* Not enough room in the buffer - grow it. */
 
                        /* just a shorter name for the current buffer */
-                       YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+                       YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
 
                        int yy_c_buf_p_offset =
                                (int) ((yy_c_buf_p) - b->yy_ch_buf);
 
                        if ( b->yy_is_our_buffer )
                                {
-                               int new_size = b->yy_buf_size * 2;
+                               yy_size_t new_size = b->yy_buf_size * 2;
 
                                if ( new_size <= 0 )
                                        b->yy_buf_size += b->yy_buf_size / 8;
@@ -1206,7 +1207,7 @@ static int yy_get_next_buffer (void)
 
                /* Read in more data. */
                YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
-                       (yy_n_chars), (size_t) num_to_read );
+                       (yy_n_chars), num_to_read );
 
                YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
                }
@@ -1302,7 +1303,7 @@ static int yy_get_next_buffer (void)
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
        yy_is_jam = (yy_current_state == 61);
 
-       return yy_is_jam ? 0 : yy_current_state;
+               return yy_is_jam ? 0 : yy_current_state;
 }
 
     static void yyunput (int c, register char * yy_bp )
@@ -1317,7 +1318,7 @@ static int yy_get_next_buffer (void)
        if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
                { /* need to shift things up to make room */
                /* +2 for EOB chars. */
-               register int number_to_move = (yy_n_chars) + 2;
+               register yy_size_t number_to_move = (yy_n_chars) + 2;
                register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
                                        YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
                register char *source =
@@ -1370,7 +1371,7 @@ static int yy_get_next_buffer (void)
 
                else
                        { /* need more input */
-                       int offset = (yy_c_buf_p) - (yytext_ptr);
+                       yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
                        ++(yy_c_buf_p);
 
                        switch ( yy_get_next_buffer(  ) )
@@ -1648,7 +1649,7 @@ void i386_pop_buffer_state (void)
  */
 static void i386_ensure_buffer_stack (void)
 {
-       int num_to_alloc;
+       yy_size_t num_to_alloc;
     
        if (!(yy_buffer_stack)) {
 
@@ -1740,17 +1741,17 @@ YY_BUFFER_STATE i386__scan_string (yyconst char * yystr )
 
 /** Setup the input buffer state to scan the given bytes. The next call to i386_lex() will
  * scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
  * 
  * @return the newly allocated buffer state object.
  */
-YY_BUFFER_STATE i386__scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
+YY_BUFFER_STATE i386__scan_bytes  (yyconst char * yybytes, yy_size_t  _yybytes_len )
 {
        YY_BUFFER_STATE b;
        char *buf;
        yy_size_t n;
-       int i;
+       yy_size_t i;
     
        /* Get memory for full buffer, including space for trailing EOB's. */
        n = _yybytes_len + 2;
@@ -1832,7 +1833,7 @@ FILE *i386_get_out  (void)
 /** Get the length of the current token.
  * 
  */
-int i386_get_leng  (void)
+yy_size_t i386_get_leng  (void)
 {
         return i386_leng;
 }
index ad065c6..d6bcf8d 100644 (file)
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 2.5.  */
+/* A Bison parser, made by GNU Bison 2.7.  */
 
 /* Bison implementation for Yacc-like parsers in C
    
-      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+      Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc.
    
    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
@@ -44,7 +44,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "2.5"
+#define YYBISON_VERSION "2.7"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -58,8 +58,6 @@
 /* Pull parsers.  */
 #define YYPULL 1
 
-/* Using locations.  */
-#define YYLSP_NEEDED 0
 
 /* Substitute the variable and function names.  */
 #define yyparse         i386_parse
 #define yydebug         i386_debug
 #define yynerrs         i386_nerrs
 
-
 /* Copy the first part of user declarations.  */
-
-/* Line 268 of yacc.c  */
+/* Line 371 of yacc.c  */
 #line 1 "i386_parse.y"
 
 /* Parser for i386 CPU description.
@@ -290,14 +286,16 @@ extern FILE *outfile;
 static size_t best_mnemonic_bits;
 #endif
 
+/* Line 371 of yacc.c  */
+#line 291 "i386_parse.c"
 
-/* Line 268 of yacc.c  */
-#line 296 "i386_parse.c"
-
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
+# ifndef YY_NULL
+#  if defined __cplusplus && 201103L <= __cplusplus
+#   define YY_NULL nullptr
+#  else
+#   define YY_NULL 0
+#  endif
+# endif
 
 /* Enabling verbose error messages.  */
 #ifdef YYERROR_VERBOSE
@@ -307,11 +305,17 @@ static size_t best_mnemonic_bits;
 # define YYERROR_VERBOSE 0
 #endif
 
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
+/* In a future release of Bison, this section will be replaced
+   by #include "y.tab.h".  */
+#ifndef YY_I386_I_PARSE_H_INCLUDED
+# define YY_I386_I_PARSE_H_INCLUDED
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int i386_debug;
 #endif
-
 
 /* Tokens.  */
 #ifndef YYTOKENTYPE
@@ -345,12 +349,10 @@ static size_t best_mnemonic_bits;
 
 
 
-
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
 {
-
-/* Line 293 of yacc.c  */
+/* Line 387 of yacc.c  */
 #line 217 "i386_parse.y"
 
   unsigned long int num;
@@ -362,21 +364,36 @@ typedef union YYSTYPE
   struct argument *arg;
 
 
-
-/* Line 293 of yacc.c  */
-#line 368 "i386_parse.c"
+/* Line 387 of yacc.c  */
+#line 369 "i386_parse.c"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 #endif
 
+extern YYSTYPE i386_lval;
 
-/* Copy the second part of user declarations.  */
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int i386_parse (void *YYPARSE_PARAM);
+#else
+int i386_parse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int i386_parse (void);
+#else
+int i386_parse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+#endif /* !YY_I386_I_PARSE_H_INCLUDED  */
 
+/* Copy the second part of user declarations.  */
 
-/* Line 343 of yacc.c  */
-#line 380 "i386_parse.c"
+/* Line 390 of yacc.c  */
+#line 397 "i386_parse.c"
 
 #ifdef short
 # undef short
@@ -429,24 +446,24 @@ typedef short int yytype_int16;
 # if defined YYENABLE_NLS && YYENABLE_NLS
 #  if ENABLE_NLS
 #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
-#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+#   define YY_(Msgid) dgettext ("bison-runtime", Msgid)
 #  endif
 # endif
 # ifndef YY_
-#  define YY_(msgid) msgid
+#  define YY_(Msgid) Msgid
 # endif
 #endif
 
 /* Suppress unused-variable warnings by "using" E.  */
 #if ! defined lint || defined __GNUC__
-# define YYUSE(e) ((void) (e))
+# define YYUSE(E) ((void) (E))
 #else
-# define YYUSE(e) /* empty */
+# define YYUSE(E) /* empty */
 #endif
 
 /* Identity function, used to suppress warnings about constant conditions.  */
 #ifndef lint
-# define YYID(n) (n)
+# define YYID(N) (N)
 #else
 #if (defined __STDC__ || defined __C99__FUNC__ \
      || defined __cplusplus || defined _MSC_VER)
@@ -482,6 +499,7 @@ YYID (yyi)
 #    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
      || defined __cplusplus || defined _MSC_VER)
 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+      /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
 #     ifndef EXIT_SUCCESS
 #      define EXIT_SUCCESS 0
 #     endif
@@ -573,20 +591,20 @@ union yyalloc
 #endif
 
 #if defined YYCOPY_NEEDED && YYCOPY_NEEDED
-/* Copy COUNT objects from FROM to TO.  The source and destination do
+/* Copy COUNT objects from SRC to DST.  The source and destination do
    not overlap.  */
 # ifndef YYCOPY
 #  if defined __GNUC__ && 1 < __GNUC__
-#   define YYCOPY(To, From, Count) \
-      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#   define YYCOPY(Dst, Src, Count) \
+      __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
 #  else
-#   define YYCOPY(To, From, Count)             \
-      do                                       \
-       {                                       \
-         YYSIZE_T yyi;                         \
-         for (yyi = 0; yyi < (Count); yyi++)   \
-           (To)[yyi] = (From)[yyi];            \
-       }                                       \
+#   define YYCOPY(Dst, Src, Count)              \
+      do                                        \
+        {                                       \
+          YYSIZE_T yyi;                         \
+          for (yyi = 0; yyi < (Count); yyi++)   \
+            (Dst)[yyi] = (Src)[yyi];            \
+        }                                       \
       while (YYID (0))
 #  endif
 # endif
@@ -680,7 +698,7 @@ static const yytype_uint16 yyrline[] =
 };
 #endif
 
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+#if YYDEBUG || YYERROR_VERBOSE || 0
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
@@ -689,7 +707,7 @@ static const char *const yytname[] =
   "kSYNONYM", "kID", "kNUMBER", "kPERCPERC", "kBITFIELD", "kCHAR",
   "kSPACE", "'\\n'", "':'", "','", "'0'", "'1'", "$accept", "spec",
   "masks", "mask", "instrs", "instr", "bitfieldopt", "bytes", "byte",
-  "bit", "optargs", "args", "arg", "argcomp", 0
+  "bit", "optargs", "args", "arg", "argcomp", YY_NULL
 };
 #endif
 
@@ -771,10 +789,10 @@ static const yytype_uint8 yytable[] =
       27,    48,    37,    34,    36,     0,    46,    18
 };
 
-#define yypact_value_is_default(yystate) \
-  ((yystate) == (-35))
+#define yypact_value_is_default(Yystate) \
+  (!!((Yystate) == (-35)))
 
-#define yytable_value_is_error(yytable_value) \
+#define yytable_value_is_error(Yytable_value) \
   YYID (0)
 
 static const yytype_int8 yycheck[] =
@@ -823,62 +841,35 @@ static const yytype_uint8 yystos[] =
 
 #define YYRECOVERING()  (!!yyerrstatus)
 
-#define YYBACKUP(Token, Value)                                 \
-do                                                             \
-  if (yychar == YYEMPTY && yylen == 1)                         \
-    {                                                          \
-      yychar = (Token);                                                \
-      yylval = (Value);                                                \
-      YYPOPSTACK (1);                                          \
-      goto yybackup;                                           \
-    }                                                          \
-  else                                                         \
-    {                                                          \
+#define YYBACKUP(Token, Value)                                  \
+do                                                              \
+  if (yychar == YYEMPTY)                                        \
+    {                                                           \
+      yychar = (Token);                                         \
+      yylval = (Value);                                         \
+      YYPOPSTACK (yylen);                                       \
+      yystate = *yyssp;                                         \
+      goto yybackup;                                            \
+    }                                                           \
+  else                                                          \
+    {                                                           \
       yyerror (YY_("syntax error: cannot back up")); \
       YYERROR;                                                 \
     }                                                          \
 while (YYID (0))
 
-
+/* Error token number */
 #define YYTERROR       1
 #define YYERRCODE      256
 
 
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-   If N is 0, then set CURRENT to the empty location which ends
-   the previous symbol: RHS[0] (always defined).  */
-
-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N)                               \
-    do                                                                 \
-      if (YYID (N))                                                    \
-       {                                                               \
-         (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
-         (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
-         (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
-         (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
-       }                                                               \
-      else                                                             \
-       {                                                               \
-         (Current).first_line   = (Current).last_line   =              \
-           YYRHSLOC (Rhs, 0).last_line;                                \
-         (Current).first_column = (Current).last_column =              \
-           YYRHSLOC (Rhs, 0).last_column;                              \
-       }                                                               \
-    while (YYID (0))
-#endif
-
-
 /* This macro is provided for backward compatibility. */
-
 #ifndef YY_LOCATION_PRINT
 # define YY_LOCATION_PRINT(File, Loc) ((void) 0)
 #endif
 
 
 /* YYLEX -- calling `yylex' with the right arguments.  */
-
 #ifdef YYLEX_PARAM
 # define YYLEX yylex (YYLEX_PARAM)
 #else
@@ -928,6 +919,8 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep)
     YYSTYPE const * const yyvaluep;
 #endif
 {
+  FILE *yyo = yyoutput;
+  YYUSE (yyo);
   if (!yyvaluep)
     return;
 # ifdef YYPRINT
@@ -939,7 +932,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep)
   switch (yytype)
     {
       default:
-       break;
+        break;
     }
 }
 
@@ -1179,12 +1172,11 @@ static int
 yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                 yytype_int16 *yyssp, int yytoken)
 {
-  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]);
+  YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]);
   YYSIZE_T yysize = yysize0;
-  YYSIZE_T yysize1;
   enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
   /* Internationalized format string. */
-  const char *yyformat = 0;
+  const char *yyformat = YY_NULL;
   /* Arguments of yyformat. */
   char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
   /* Number of reported tokens (one for the "unexpected", one per
@@ -1244,11 +1236,13 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                     break;
                   }
                 yyarg[yycount++] = yytname[yyx];
-                yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-                if (! (yysize <= yysize1
-                       && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-                  return 2;
-                yysize = yysize1;
+                {
+                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]);
+                  if (! (yysize <= yysize1
+                         && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+                    return 2;
+                  yysize = yysize1;
+                }
               }
         }
     }
@@ -1268,10 +1262,12 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
 # undef YYCASE_
     }
 
-  yysize1 = yysize + yystrlen (yyformat);
-  if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-    return 2;
-  yysize = yysize1;
+  {
+    YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
+    if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+      return 2;
+    yysize = yysize1;
+  }
 
   if (*yymsg_alloc < yysize)
     {
@@ -1331,32 +1327,27 @@ yydestruct (yymsg, yytype, yyvaluep)
     {
 
       default:
-       break;
+        break;
     }
 }
 
 
-/* Prevent warnings from -Wmissing-prototypes.  */
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void *YYPARSE_PARAM);
-#else
-int yyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void);
-#else
-int yyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
 
 
 /* The lookahead symbol.  */
 int yychar;
 
+
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
 /* The semantic value of the lookahead symbol.  */
-YYSTYPE yylval;
+YYSTYPE yylval YY_INITIAL_VALUE(yyval_default);
 
 /* Number of syntax errors so far.  */
 int yynerrs;
@@ -1396,7 +1387,7 @@ yyparse ()
        `yyss': related to states.
        `yyvs': related to semantic values.
 
-       Refer to the stacks thru separate pointers, to allow yyoverflow
+       Refer to the stacks through separate pointers, to allow yyoverflow
        to reallocate them elsewhere.  */
 
     /* The state stack.  */
@@ -1414,7 +1405,7 @@ yyparse ()
   int yyn;
   int yyresult;
   /* Lookahead token as an internal (translated) token number.  */
-  int yytoken;
+  int yytoken = 0;
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;
@@ -1432,9 +1423,8 @@ yyparse ()
      Keep to zero when no symbol should be popped.  */
   int yylen = 0;
 
-  yytoken = 0;
-  yyss = yyssa;
-  yyvs = yyvsa;
+  yyssp = yyss = yyssa;
+  yyvsp = yyvs = yyvsa;
   yystacksize = YYINITDEPTH;
 
   YYDPRINTF ((stderr, "Starting parse\n"));
@@ -1443,14 +1433,6 @@ yyparse ()
   yyerrstatus = 0;
   yynerrs = 0;
   yychar = YYEMPTY; /* Cause a token to be read.  */
-
-  /* Initialize stack pointers.
-     Waste one element of value and location stack
-     so that they stay on the same level as the state stack.
-     The wasted elements are never initialized.  */
-  yyssp = yyss;
-  yyvsp = yyvs;
-
   goto yysetstate;
 
 /*------------------------------------------------------------.
@@ -1591,7 +1573,9 @@ yybackup:
   yychar = YYEMPTY;
 
   yystate = yyn;
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   *++yyvsp = yylval;
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
 
   goto yynewstate;
 
@@ -1628,8 +1612,7 @@ yyreduce:
   switch (yyn)
     {
         case 2:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 248 "i386_parse.y"
     {
                      if (error_message_count != 0)
@@ -1641,29 +1624,25 @@ yyreduce:
     break;
 
   case 5:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 262 "i386_parse.y"
     { new_bitfield ((yyvsp[(2) - (3)].str), (yyvsp[(3) - (3)].num)); }
     break;
 
   case 6:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 264 "i386_parse.y"
     { new_bitfield ((yyvsp[(2) - (2)].str), -1); }
     break;
 
   case 7:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 266 "i386_parse.y"
     { new_bitfield ((yyvsp[(2) - (2)].str), -2); }
     break;
 
   case 8:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 268 "i386_parse.y"
     {
                      struct synonym *newp = xmalloc (sizeof (*newp));
@@ -1679,8 +1658,7 @@ yyreduce:
     break;
 
   case 12:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 287 "i386_parse.y"
     {
                      if ((yyvsp[(3) - (6)].field) != NULL && strcmp ((yyvsp[(3) - (6)].field)->name, "RE") != 0
@@ -1767,8 +1745,7 @@ yyreduce:
     break;
 
   case 14:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 373 "i386_parse.y"
     {
                      struct known_bitfield search;
@@ -1787,15 +1764,13 @@ yyreduce:
     break;
 
   case 15:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 388 "i386_parse.y"
     { (yyval.field) = NULL; }
     break;
 
   case 16:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 392 "i386_parse.y"
     {
                      check_bits ((yyvsp[(3) - (3)].bit));
@@ -1809,8 +1784,7 @@ yyreduce:
     break;
 
   case 17:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 402 "i386_parse.y"
     {
                      check_bits ((yyvsp[(1) - (1)].bit));
@@ -1819,8 +1793,7 @@ yyreduce:
     break;
 
   case 18:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 409 "i386_parse.y"
     {
                      struct bitvalue *runp = (yyvsp[(1) - (2)].bit);
@@ -1832,15 +1805,13 @@ yyreduce:
     break;
 
   case 19:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 417 "i386_parse.y"
     { (yyval.bit) = (yyvsp[(1) - (1)].bit); }
     break;
 
   case 20:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 421 "i386_parse.y"
     {
                      (yyval.bit) = xmalloc (sizeof (struct bitvalue));
@@ -1851,8 +1822,7 @@ yyreduce:
     break;
 
   case 21:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 428 "i386_parse.y"
     {
                      (yyval.bit) = xmalloc (sizeof (struct bitvalue));
@@ -1863,8 +1833,7 @@ yyreduce:
     break;
 
   case 22:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 435 "i386_parse.y"
     {
                      (yyval.bit) = xmalloc (sizeof (struct bitvalue));
@@ -1888,22 +1857,19 @@ yyreduce:
     break;
 
   case 23:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 457 "i386_parse.y"
     { (yyval.arg) = (yyvsp[(2) - (2)].arg); }
     break;
 
   case 24:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 459 "i386_parse.y"
     { (yyval.arg) = NULL; }
     break;
 
   case 25:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 463 "i386_parse.y"
     {
                      struct argument *runp = (yyvsp[(1) - (3)].arg);
@@ -1917,8 +1883,7 @@ yyreduce:
     break;
 
   case 26:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 473 "i386_parse.y"
     {
                      (yyval.arg) = xmalloc (sizeof (struct argument));
@@ -1928,8 +1893,7 @@ yyreduce:
     break;
 
   case 27:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 481 "i386_parse.y"
     {
                      struct argname *runp = (yyvsp[(1) - (2)].name);
@@ -1941,15 +1905,13 @@ yyreduce:
     break;
 
   case 28:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 489 "i386_parse.y"
     { (yyval.name) = (yyvsp[(1) - (1)].name); }
     break;
 
   case 29:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 492 "i386_parse.y"
     {
                      (yyval.name) = xmalloc (sizeof (struct argname));
@@ -1985,8 +1947,7 @@ yyreduce:
     break;
 
   case 30:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 524 "i386_parse.y"
     {
                      (yyval.name) = xmalloc (sizeof (struct argname));
@@ -1999,8 +1960,7 @@ yyreduce:
     break;
 
   case 31:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 533 "i386_parse.y"
     {
                      (yyval.name) = xmalloc (sizeof (struct argname));
@@ -2011,8 +1971,7 @@ yyreduce:
     break;
 
   case 32:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 540 "i386_parse.y"
     {
                      (yyval.name) = xmalloc (sizeof (struct argname));
@@ -2025,9 +1984,8 @@ yyreduce:
     break;
 
 
-
-/* Line 1806 of yacc.c  */
-#line 2031 "i386_parse.c"
+/* Line 1792 of yacc.c  */
+#line 1989 "i386_parse.c"
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -2190,7 +2148,9 @@ yyerrlab1:
       YY_STACK_PRINT (yyss, yyssp);
     }
 
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   *++yyvsp = yylval;
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
 
 
   /* Shift the error token.  */
@@ -2214,7 +2174,7 @@ yyabortlab:
   yyresult = 1;
   goto yyreturn;
 
-#if !defined(yyoverflow) || YYERROR_VERBOSE
+#if !defined yyoverflow || YYERROR_VERBOSE
 /*-------------------------------------------------.
 | yyexhaustedlab -- memory exhaustion comes here.  |
 `-------------------------------------------------*/
@@ -2256,8 +2216,7 @@ yyreturn:
 }
 
 
-
-/* Line 2067 of yacc.c  */
+/* Line 2055 of yacc.c  */
 #line 550 "i386_parse.y"
 
 
@@ -3397,4 +3356,3 @@ create_mnemonic_table (void)
     }
 }
 #endif
-
index 9f7a3d2..9689c32 100644 (file)
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 2.5.  */
+/* A Bison parser, made by GNU Bison 2.7.  */
 
 /* Bison interface for Yacc-like parsers in C
    
-      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+      Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc.
    
    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
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
+#ifndef YY_I386_I_PARSE_H_INCLUDED
+# define YY_I386_I_PARSE_H_INCLUDED
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int i386_debug;
+#endif
 
 /* Tokens.  */
 #ifndef YYTOKENTYPE
 
 
 
-
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
 {
-
-/* Line 2068 of yacc.c  */
+/* Line 2058 of yacc.c  */
 #line 217 "i386_parse.y"
 
   unsigned long int num;
@@ -80,9 +87,8 @@ typedef union YYSTYPE
   struct argument *arg;
 
 
-
-/* Line 2068 of yacc.c  */
-#line 86 "i386_parse.h"
+/* Line 2058 of yacc.c  */
+#line 92 "i386_parse.h"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
@@ -91,4 +97,18 @@ typedef union YYSTYPE
 
 extern YYSTYPE i386_lval;
 
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int i386_parse (void *YYPARSE_PARAM);
+#else
+int i386_parse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int i386_parse (void);
+#else
+int i386_parse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
 
+#endif /* !YY_I386_I_PARSE_H_INCLUDED  */
index 416a16f..5f9b097 100644 (file)
@@ -1,3 +1,360 @@
+2014-08-15  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_cu_die.c: New file.
+       * Makefile.am (libdw_a_SOURCES): Add dwarf_cu_die.c.
+       * libdw.h (dwarf_cu_die): New function declaration.
+       * libdw.map (ELFUTILS_0.160): Add dwarf_cu_die.
+
+2014-08-15  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_cu_getdwarf.c: New file.
+       * Makefile.am (libdw_a_SOURCES): Add dwarf_cu_getdwarf.c.
+       * libdw.h (Dwarf_CU): New typedef.
+       (dwarf_cu_getdwarf): New function declaration.
+       * libdw.map (ELFUTILS_0.160): New. Add dwarf_cu_getdwarf.
+
+2014-06-18  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf.h: Remove DW_TAG_mutable_type.
+
+2014-05-02  Mark Wielaard  <mjw@redhat.com>
+
+       * libdwP.h (__check_build_id): Removed now unused.
+
+2014-05-01  Mark Wielaard  <mjw@redhat.com>
+
+       * libdwP.h (struct Dwarf): Remove free_alt.
+       * dwarf_end.c (dwarf_end): Don't check free_alt, don't end alt_dwarf.
+       * dwarf_setalt.c (dwarf_setalt): Don't check or set free_alt.
+
+2014-04-30  Mark Wielaard  <mjw@redhat.com>
+
+       * libdw.map (ELFUTILS_0.159): Add dwelf_elf_gnu_build_id.
+
+2014-04-15  Florian Weimer  <fweimer@redhat.com>
+
+       * dwarf_begin_elf.c (__check_build_id, try_debugaltlink)
+       (open_debugaltlink): Move to libdwfl.
+       (check_section): Do not locate alternate debuginfo.
+
+2014-04-24  Florian Weimer  <fweimer@redhat.com>
+
+       * libdw.map (ELFUTILS_0.159): Export dwelf_dwarf_gnu_debugaltlink.
+
+2014-04-22  Florian Weimer  <fweimer@redhat.com>
+
+       * dwarf_getalt.c, dwarf_setalt.c: New files.
+       * Makefile.am (libdw_a_SOURCES): Add them.
+       * libdw.h (dwarf_getalt, dwarf_setalt): Add function declarations.
+       * libdwP.h (dwarf_getalt, dwarf_setalt): Add internal function
+       declarations.
+       * libdw.map (ELFUTILS_0.159): Export the two new functions.
+
+2014-04-15  Florian Weimer  <fweimer@redhat.com>
+
+       * libdwP.h (enum IDX_gnu_debugaltlink): New.
+       * dwarf_begin_elf.c (dwarf_scnnames): Increase string size and add
+       .gnu_debugaltlink.
+       (check_section): Obtain .gnu_debugaltlink section from the
+       setiondata array.
+
+2014-04-11  Mark Wielaard  <mjw@redhat.com>
+
+       * libdw.map (ELFUTILS_0.159): New. Add dwelf_elf_gnu_debuglink.
+       * Makefile.am (libdw.so): Depend on libdwelf_pic.a.
+       (libdwelf_objects): New variable.
+       (libdw_a_LIBADD): Add libdwelf objects.
+
+2014-04-22  Mark Wielaard  <mjw@redhat.com>
+
+       * memory-access.h (get_sleb128_step): Remove undefined behavior
+       of left shifting a signed value. Replace it with a multiplication.
+
+2014-04-13  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: Remove !MUDFLAP conditions.
+
+2014-04-09  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_begin_elf.c (check_section): Check for unsigned overflow
+       before calling malloc to uncompress data.
+
+2014-03-03  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Fix abort() on missing section headers.
+       * dwarf_begin_elf.c (check_section): Replace abort call by goto err.
+       New label err to return NULL.
+
+2014-02-05  Josh Stone  <jistone@redhat.com>
+
+       * dwarf_decl_file.c (dwarf_decl_file): Read the idx as unsigned.
+       * dwarf_decl_line.c (__libdw_attr_intval): Read the line/column as
+       unsigned.  Change the range assert to DWARF_E_INVALID_DWARF.
+
+2013-12-30  Mark Wielaard  <mjw@redhat.com>
+
+       * libdw.map (ELFUTILS_0.158): Add dwfl_core_file_attach and
+       dwfl_linux_proc_attach.
+
+2013-12-20  Mark Wielaard  <mjw@redhat.com>
+
+       * libdw.map (ELFUTILS_0.158): Add dwfl_getthread_frames.
+
+2013-12-18  Mark Wielaard  <mjw@redhat.com>
+
+       * libdw.map (ELFUTILS_0.158): Remove dwfl_module_addrsym_elf and
+       dwfl_module_getsym_elf. Add dwfl_module_addrinfo and
+       dwfl_module_getsym_info.
+
+2013-12-16  Mark Wielaard  <mjw@redhat.com>
+
+       * libdw.map (ELFUTILS_0.158): Add dwfl_module_getsymtab_first_global.
+
+2013-12-10  Josh Stone  <jistone@redhat.com>
+
+       * memory-access.h (get_uleb128_rest_return): Removed.
+       (get_sleb128_rest_return): Removed.
+       (get_uleb128_step): Make this a self-contained block.
+       (get_sleb128_step): Ditto, and use a bitfield to extend signs.
+       (get_uleb128): Make this wholly implemented by __libdw_get_uleb128.
+       (get_sleb128): Make this wholly implemented by __libdw_get_sleb128.
+       (__libdw_get_uleb128): Simplify and inline for all callers.
+       (__libdw_get_sleb128): Ditto.
+       * dwarf_getlocation.c (store_implicit_value): Void the unused uleb128.
+       * memory-access.c: Delete file.
+       * Makefile.am (libdw_a_SOURCES): Remove it.
+       (DEFS): Remove the now unused -DIS_LIBDW.
+
+2013-12-09  Josh Stone  <jistone@redhat.com>
+
+       * libdw_form.c (__libdw_form_val_compute_len): Renamed function from
+       __libdw_form_val_len, now handling only non-constant form lengths.
+       * libdwP.h (__libdw_form_val_len): New inlined function.
+
+2013-12-09  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_getlocation.c (__libdw_intern_expression): Handle empty
+       location expressions.
+       * dwarf_getlocation_attr.c (dwarf_getlocation_attr): When no
+       location found, return empty location expression.
+       * dwarf_getlocation_implicit_pointer.c
+       (dwarf_getlocation_implicit_pointer): Likewise.
+       (__libdw_empty_loc_attr): New internal function.
+       * libdwP.h (__libdw_empty_loc_attr): Define.
+
+2013-11-27  Mark Wielaard  <mjw@redhat.com>
+
+       * libdw.map (ELFUTILS_0.158): Add dwfl_module_addrsym_elf and
+       dwfl_module_getsym_elf.
+
+2013-11-26  Mark Wielaard  <mjw@redhat.com>
+
+       * libdw.map (ELFUTILS_0.156): Move dwfl_attach_state, dwfl_pid,
+       dwfl_thread_dwfl, dwfl_thread_tid, dwfl_frame_thread,
+       dwfl_thread_state_registers, dwfl_thread_state_register_pc,
+       dwfl_getthreads, dwfl_thread_getframes and dwfl_frame_pc to ...
+       (ELFUTILS_0.158): ... here.
+
+2013-11-09  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_getaranges.c (dwarf_getaranges): Read segment_size and
+       check that it is zero.
+
+2013-11-07  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * cfi.h (struct Dwarf_Frame_s): Make the comment more specific.
+       * libdw.map (ELFUTILS_0.156): Add dwfl_attach_state, dwfl_pid,
+       dwfl_thread_dwfl, dwfl_thread_tid, dwfl_frame_thread,
+       dwfl_thread_state_registers, dwfl_thread_state_register_pc,
+       dwfl_getthreads, dwfl_thread_getframes and dwfl_frame_pc.
+
+2013-11-01  Michael Forney  <mforney@mforney.org>
+
+       * Makefile.am (libdwfl_objects): New definition.
+       (libdw_a_LIBADD): Use libdwfl_objects.
+
+2013-11-01  Michael Forney  <mforney@mforney.org>
+
+       * Makefile.am: Use READELF.
+
+2013-10-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * libdw.map (ELFUTILS_0.158): New.
+
+2013-10-10  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_getfuncs.c (struct visitor_info): Rename start_offset to
+       start_addr and rename last_offset to last_addr. Now both void *.
+       (tree_visitor): Use start_add and die_addr instead of start_offset
+       and die_offset.
+       (dwarf_getfuncs): Use last_addr instead of last_offset.
+
+2013-10-06  Mark Wielaard  <mjw@redhat.com>
+
+       * cfi.c (execute_cfi): Make sure DW_CFA_expression and
+       DW_CFA_val_expression are not used with abi_cfi.
+
+2013-10-03  Josh Stone  <jistone@redhat.com>
+
+       * dwarf_formref_die.c (dwarf_formref_die): Don't hash the sig8 here.
+       * libdw_findcu.c (__libdw_intern_next_unit): Since this never revisits
+       a unit, make sure to always hash the sig8 here, so none are missed.
+
+2013-09-29  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_getlocation.c (store_implicit_value): Cast op->number2 to
+       uintptr_t before casting to char *.
+       (__libdw_intern_expression): Cast data to uintptr_t before casting
+       to Dwarf_Word.
+       * dwarf_getlocation_attr.c (dwarf_getlocation_attr): Cast
+       op->number2 to uintptr_t before casting to char *.
+
+2013-09-24  Josh Stone  <jistone@redhat.com>
+
+       * libdw_visit_scopes.c (classify_die): Removed.
+       (may_have_scopes): New function to replace classify_die.  There's no
+       need for full classification; just find tags that may contain scopes.
+       (__libdw_visit_scopes): Use a direct tag comparison for imported
+       units, and use may_have_scopes to test if recursion is needed.
+
+2013-09-20  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_getfuncs.c (visitor_info): New struct.
+       (tree_visitor): New function.
+       (dwarf_getfuncs): Use __libdw_visit_scopes with tree_visitor.
+       * libdw.h (dwarf_getfuncs): Expand function documentation.
+
+2013-09-12  Mark Wielaard  <mjw@redhat.com>
+
+       * fde.c (intern_fde): Free fde and set libdw errno when start
+       or end could not be read.
+
+2013-08-24  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_getlocation.c (store_implicit_value): Don't take data
+       as argument, get block data from op number2. Return false when
+       block data length and op number don't match up.
+       (__libdw_intern_expression): Store start of block for
+       DW_OP_implicit_value and DW_OP_GNU_entry_value instead of
+       relative data offset. Also store block start (including length)
+       for DW_OP_GNU_const_type. Don't pass data to store_implicit_value.
+       * dwarf_getlocation_attr.c: New file.
+       * dwarf_getlocation_die.c: Likewise.
+       * libdw.h (dwarf_getlocation_die): New function definition.
+       (dwarf_getlocation_attr): Likewise.
+       * libdwP.h: Declare internal dwarf_getlocation_die.
+       * libdw.map (ELFUTILS_0.157): Add dwarf_getlocation_die and
+       dwarf_getlocation_attr.
+       * Makefile.am (libdw_a_SOURCES): Add dwarf_getlocation_die.c and
+       dwarf_getlocation_attr.c.
+
+2013-08-23  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_getlocation.c (attr_ok): Also accept DW_AT_segment.
+       (attr_base_address): New function.
+       (initial_offset_base): New function.
+       (getlocations_addr): New function. Taken from...
+       (dwarf_getlocation_addr): here. Use new initial_offset_base and
+       getlocations_addr.
+       (dwarf_getlocations): New function.
+       * libdw.h (dwarf_getlocations): New function definition.
+       * libdw.map (ELFUTILS_0.157): New.
+
+2013-07-02  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_getsrclines.c (dwarf_getsrclines): Add new stack allocation
+       limit MAX_STACK_ALLOC.  After MAX_STACK_ALLOC lines use malloc in
+       NEW_LINE macro.  Free malloced line records if any at the end.
+
+2013-07-02  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_getcfi_elf.c (getcfi_shdr): Check sh_type == SHT_PROGBITS.
+
+2013-06-26  Mark Wielaard  <mjw@redhat.com>
+
+       * libdw_visit_scopes.c (__libdw_visit_scopes): Don't reject root
+       DIEs without children. Return an error whenever dwarf_child or
+       dwarf_siblingof return an error. Don't call recurse and increase
+       the depth for an imported unit. Walk the children of an imported
+       unit as if they are logical children of the parent root DIE.
+
+2013-05-03  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_getsrclines.c (dwarf_getsrclines): Only set end_sequence
+       when nlinelist > 0.
+
+2013-04-28  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * libdw.map (ELFUTILS_0.156): New.
+
+2013-04-24  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: Use AM_CPPFLAGS instead of INCLUDES.
+
+2013-04-10  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_formref_die.c (dwarf_formref_die): Reference size is only
+       equal to address size when we have a DW_FORM_ref_addr for DWARF
+       version 2.
+
+2013-03-25  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_getsrclines.c (dwarf_getsrclines): Mark highest address as
+       end_sequence.
+
+2013-03-12  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_getsrcfiles.c (dwarf_getsrcfiles): Allow DW_TAG_partial_unit.
+       * dwarf_getsrclines.c (dwarf_getsrclines): Likewise.
+
+2013-02-15  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_formstring.c (dwarf_formstring): Check dbg_ret->sectiondata,
+       not dbg->sectiondata.
+
+2013-01-07  Roland McGrath  <roland@hack.frob.com>
+
+       * memory-access.h
+       [ALLOW_UNALIGNED] (read_8ubyte_unaligned_noncvt): New macro.
+       [!ALLOW_UNALIGNED] (read_8ubyte_unaligned_noncvt): New inline function.
+
+2012-12-18  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf_begin_elf.c (valid_p): Call Dwarf_Sig8_Hash_free if invalid.
+       (check_section): Likewise on error.
+       (scngrp_read): Likewise.
+       (dwarf_begin_elf): Likewise.
+
+2012-10-09  Petr Machata  <pmachata@redhat.com>
+
+       * dwarf_getlocation.c (__libdw_intern_expression): Handle
+       DW_OP_GNU_parameter_ref, DW_OP_GNU_convert, DW_OP_GNU_reinterpret,
+       DW_OP_GNU_regval_type, DW_OP_GNU_entry_value,
+       DW_OP_GNU_deref_type, DW_OP_GNU_const_type.
+
+2012-10-08  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * cfi.c: New include system.h.
+       (execute_cfi) (enough_registers): Clear new memory after realloc.
+
+2012-10-08  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * fde.c (__libdw_find_fde): Change <fde != NULL> to likely.  Return
+       DWARF_E_NO_MATCH if .eh_frame_hdr points to FDE which is too short for
+       searched PC.
+
+2012-10-08  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * dwarf_getlocation.c (__libdw_intern_expression) <cfap>: Make new
+       loclist element DW_OP_call_frame_cfa before decoding the opcodes.
+       Remove the later DW_OP_call_frame_cfa push to RESULT.
+
+2012-10-08  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Code cleanup.
+       * fde.c (binary_search_fde): Remove always true <address >= start>
+       conditional.  Move L initialization upwards.
+
 2012-08-24  Mark Wielaard  <mjw@redhat.com>
 
        * dwarf_begin_elf.c (check_section): Only probe for dwz multi files
index c6ac264..2e42a37 100644 (file)
@@ -1,6 +1,6 @@
 ## Process this file with automake to create Makefile.in
 ##
-## Copyright (C) 2002-2010, 2012 Red Hat, Inc.
+## Copyright (C) 2002-2010, 2012, 2014 Red Hat, Inc.
 ## This file is part of elfutils.
 ##
 ## This file is free software; you can redistribute it and/or modify
 ## not, see <http://www.gnu.org/licenses/>.
 ##
 include $(top_srcdir)/config/eu.am
-DEFS += -DIS_LIBDW
 if BUILD_STATIC
 AM_CFLAGS += -fpic
 endif
-INCLUDES += -I$(srcdir)/../libelf
+AM_CPPFLAGS += -I$(srcdir)/../libelf
 VERSION = 1
 
 lib_LIBRARIES = libdw.a
-if !MUDFLAP
 noinst_LIBRARIES = libdw_pic.a
 noinst_PROGRAMS = $(noinst_LIBRARIES:_pic.a=.so)
-endif
 
 include_HEADERS = dwarf.h
 pkginclude_HEADERS = libdw.h
@@ -79,7 +76,7 @@ libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \
                  dwarf_getfuncs.c  \
                  dwarf_decl_file.c dwarf_decl_line.c dwarf_decl_column.c \
                  dwarf_func_inline.c dwarf_getsrc_file.c \
-                 libdw_findcu.c libdw_form.c libdw_alloc.c memory-access.c \
+                 libdw_findcu.c libdw_form.c libdw_alloc.c \
                  libdw_visit_scopes.c \
                  dwarf_entry_breakpoints.c \
                  dwarf_next_cfi.c \
@@ -87,7 +84,10 @@ libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \
                  dwarf_frame_info.c dwarf_frame_cfa.c dwarf_frame_register.c \
                  dwarf_cfi_addrframe.c \
                  dwarf_getcfi.c dwarf_getcfi_elf.c dwarf_cfi_end.c \
-                 dwarf_aggregate_size.c dwarf_getlocation_implicit_pointer.c
+                 dwarf_aggregate_size.c dwarf_getlocation_implicit_pointer.c \
+                 dwarf_getlocation_die.c dwarf_getlocation_attr.c \
+                 dwarf_getalt.c dwarf_setalt.c dwarf_cu_getdwarf.c \
+                 dwarf_cu_die.c
 
 if MAINTAINER_MODE
 BUILT_SOURCES = $(srcdir)/known-dwarf.h
@@ -97,12 +97,11 @@ $(srcdir)/known-dwarf.h: $(top_srcdir)/config/known-dwarf.awk $(srcdir)/dwarf.h
        mv -f $@.new $@
 endif
 
-if !MUDFLAP
 libdw_pic_a_SOURCES =
 am_libdw_pic_a_OBJECTS = $(libdw_a_SOURCES:.c=.os)
 
 libdw_so_SOURCES =
-libdw.so: $(srcdir)/libdw.map libdw_pic.a \
+libdw.so$(EXEEXT): $(srcdir)/libdw.map libdw_pic.a ../libdwelf/libdwelf_pic.a \
          ../libdwfl/libdwfl_pic.a ../libebl/libebl.a \
          ../libelf/libelf.so
 # The rpath is necessary for libebl because its $ORIGIN use will
@@ -112,7 +111,7 @@ libdw.so: $(srcdir)/libdw.map libdw_pic.a \
                -Wl,--version-script,$<,--no-undefined \
                -Wl,--whole-archive $(filter-out $<,$^) -Wl,--no-whole-archive\
                -ldl $(zip_LIBS)
-       if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
+       if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
        ln -fs $@ $@.$(VERSION)
 
 install: install-am libdw.so
@@ -126,9 +125,12 @@ uninstall: uninstall-am
        rm -f $(DESTDIR)$(libdir)/libdw.so.$(VERSION)
        rm -f $(DESTDIR)$(libdir)/libdw.so
        rmdir --ignore-fail-on-non-empty $(DESTDIR)$(includedir)/elfutils
-endif
 
-libdw_a_LIBADD = $(addprefix ../libdwfl/,$(shell $(AR) t ../libdwfl/libdwfl.a))
+libdwfl_objects = $(shell $(AR) t ../libdwfl/libdwfl.a)
+libdw_a_LIBADD = $(addprefix ../libdwfl/,$(libdwfl_objects))
+
+libdwelf_objects = $(shell $(AR) t ../libdwelf/libdwelf.a)
+libdw_a_LIBADD += $(addprefix ../libdwelf/,$(libdwelf_objects))
 
 noinst_HEADERS = libdwP.h memory-access.h dwarf_abbrev_hash.h \
                 dwarf_sig8_hash.h cfi.h encoded-value.h
index 0a0da22..fdf02fb 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -36,16 +80,16 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(include_HEADERS) $(noinst_HEADERS) \
-       $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
-       $(srcdir)/Makefile.in $(top_srcdir)/config/eu.am ChangeLog
-@MUDFLAP_TRUE@am__append_1 = -fmudflap
-@BUILD_STATIC_TRUE@am__append_2 = -fpic
-@MUDFLAP_FALSE@noinst_PROGRAMS = $(am__EXEEXT_1)
-@MUDFLAP_TRUE@am_libdw_pic_a_OBJECTS =
+DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \
+       $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \
+       $(include_HEADERS) $(noinst_HEADERS) $(pkginclude_HEADERS) \
+       ChangeLog
+@BUILD_STATIC_TRUE@am__append_1 = -fpic
+noinst_PROGRAMS = $(am__EXEEXT_1)
 subdir = libdw
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
        $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/zip.m4 \
        $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
@@ -84,11 +128,14 @@ am__uninstall_files_from_dir = { \
 am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" \
        "$(DESTDIR)$(pkgincludedir)"
 LIBRARIES = $(lib_LIBRARIES) $(noinst_LIBRARIES)
-AR = ar
 ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
 libdw_a_AR = $(AR) $(ARFLAGS)
-libdw_a_DEPENDENCIES = $(addprefix ../libdwfl/,$(shell $(AR) t \
-       ../libdwfl/libdwfl.a))
+libdw_a_DEPENDENCIES = $(addprefix ../libdwfl/,$(libdwfl_objects)) \
+       $(addprefix ../libdwelf/,$(libdwelf_objects))
 am_libdw_a_OBJECTS = dwarf_begin.$(OBJEXT) dwarf_begin_elf.$(OBJEXT) \
        dwarf_end.$(OBJEXT) dwarf_getelf.$(OBJEXT) \
        dwarf_getpubnames.$(OBJEXT) dwarf_getabbrev.$(OBJEXT) \
@@ -136,62 +183,113 @@ am_libdw_a_OBJECTS = dwarf_begin.$(OBJEXT) dwarf_begin_elf.$(OBJEXT) \
        dwarf_decl_column.$(OBJEXT) dwarf_func_inline.$(OBJEXT) \
        dwarf_getsrc_file.$(OBJEXT) libdw_findcu.$(OBJEXT) \
        libdw_form.$(OBJEXT) libdw_alloc.$(OBJEXT) \
-       memory-access.$(OBJEXT) libdw_visit_scopes.$(OBJEXT) \
-       dwarf_entry_breakpoints.$(OBJEXT) dwarf_next_cfi.$(OBJEXT) \
-       cie.$(OBJEXT) fde.$(OBJEXT) cfi.$(OBJEXT) \
-       frame-cache.$(OBJEXT) dwarf_frame_info.$(OBJEXT) \
+       libdw_visit_scopes.$(OBJEXT) dwarf_entry_breakpoints.$(OBJEXT) \
+       dwarf_next_cfi.$(OBJEXT) cie.$(OBJEXT) fde.$(OBJEXT) \
+       cfi.$(OBJEXT) frame-cache.$(OBJEXT) dwarf_frame_info.$(OBJEXT) \
        dwarf_frame_cfa.$(OBJEXT) dwarf_frame_register.$(OBJEXT) \
        dwarf_cfi_addrframe.$(OBJEXT) dwarf_getcfi.$(OBJEXT) \
        dwarf_getcfi_elf.$(OBJEXT) dwarf_cfi_end.$(OBJEXT) \
        dwarf_aggregate_size.$(OBJEXT) \
-       dwarf_getlocation_implicit_pointer.$(OBJEXT)
+       dwarf_getlocation_implicit_pointer.$(OBJEXT) \
+       dwarf_getlocation_die.$(OBJEXT) \
+       dwarf_getlocation_attr.$(OBJEXT) dwarf_getalt.$(OBJEXT) \
+       dwarf_setalt.$(OBJEXT) dwarf_cu_getdwarf.$(OBJEXT) \
+       dwarf_cu_die.$(OBJEXT)
 libdw_a_OBJECTS = $(am_libdw_a_OBJECTS)
 libdw_pic_a_AR = $(AR) $(ARFLAGS)
 libdw_pic_a_LIBADD =
 libdw_pic_a_OBJECTS = $(am_libdw_pic_a_OBJECTS)
-@MUDFLAP_FALSE@am__EXEEXT_1 = libdw.so$(EXEEXT)
+am__EXEEXT_1 = libdw.so$(EXEEXT)
 PROGRAMS = $(noinst_PROGRAMS)
 am_libdw_so_OBJECTS =
 libdw_so_OBJECTS = $(am_libdw_so_OBJECTS)
 libdw_so_LDADD = $(LDADD)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/config/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
 SOURCES = $(libdw_a_SOURCES) $(libdw_pic_a_SOURCES) \
        $(libdw_so_SOURCES)
 DIST_SOURCES = $(libdw_a_SOURCES) $(libdw_pic_a_SOURCES) \
        $(libdw_so_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 HEADERS = $(include_HEADERS) $(noinst_HEADERS) $(pkginclude_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
+CC_BIARCH = @CC_BIARCH@
 CFLAGS = @CFLAGS@
+CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEBUGPRED = @DEBUGPRED@
-DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DLOCALEDIR='"${localedir}"' \
-       -DIS_LIBDW
+DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DLOCALEDIR='"${localedir}"'
 DEPDIR = @DEPDIR@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_VALGRIND = @HAVE_VALGRIND@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -212,6 +310,7 @@ MODVERSION = @MODVERSION@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
+NM = @NM@
 OBJEXT = @OBJEXT@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -222,6 +321,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+READELF = @READELF@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
@@ -236,6 +336,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -285,22 +386,17 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 zip_LIBS = @zip_LIBS@
-INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \
+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \
        -I$(srcdir)/../libelf
-AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \
+AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 $(if \
        $($(*F)_no_Werror),,-Werror) $(if \
-       $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \
-       $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \
-       $(am__append_1) $(am__append_2)
-@MUDFLAP_FALSE@libmudflap = 
-@MUDFLAP_TRUE@libmudflap = -lmudflap
-COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\
-                         $(COMPILE))
-
+       $($(*F)_no_Wunused),,-Wunused -Wextra) $($(*F)_CFLAGS) \
+       $(am__append_1)
+COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE))
 CLEANFILES = *.gcno *.gcda
-textrel_check = if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
+textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
 lib_LIBRARIES = libdw.a
-@MUDFLAP_FALSE@noinst_LIBRARIES = libdw_pic.a
+noinst_LIBRARIES = libdw_pic.a
 include_HEADERS = dwarf.h
 pkginclude_HEADERS = libdw.h
 libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \
@@ -338,7 +434,7 @@ libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \
                  dwarf_getfuncs.c  \
                  dwarf_decl_file.c dwarf_decl_line.c dwarf_decl_column.c \
                  dwarf_func_inline.c dwarf_getsrc_file.c \
-                 libdw_findcu.c libdw_form.c libdw_alloc.c memory-access.c \
+                 libdw_findcu.c libdw_form.c libdw_alloc.c \
                  libdw_visit_scopes.c \
                  dwarf_entry_breakpoints.c \
                  dwarf_next_cfi.c \
@@ -346,14 +442,20 @@ libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \
                  dwarf_frame_info.c dwarf_frame_cfa.c dwarf_frame_register.c \
                  dwarf_cfi_addrframe.c \
                  dwarf_getcfi.c dwarf_getcfi_elf.c dwarf_cfi_end.c \
-                 dwarf_aggregate_size.c dwarf_getlocation_implicit_pointer.c
+                 dwarf_aggregate_size.c dwarf_getlocation_implicit_pointer.c \
+                 dwarf_getlocation_die.c dwarf_getlocation_attr.c \
+                 dwarf_getalt.c dwarf_setalt.c dwarf_cu_getdwarf.c \
+                 dwarf_cu_die.c
 
 @MAINTAINER_MODE_TRUE@BUILT_SOURCES = $(srcdir)/known-dwarf.h
 @MAINTAINER_MODE_TRUE@MAINTAINERCLEANFILES = $(srcdir)/known-dwarf.h
-@MUDFLAP_FALSE@libdw_pic_a_SOURCES = 
-@MUDFLAP_FALSE@am_libdw_pic_a_OBJECTS = $(libdw_a_SOURCES:.c=.os)
-@MUDFLAP_FALSE@libdw_so_SOURCES = 
-libdw_a_LIBADD = $(addprefix ../libdwfl/,$(shell $(AR) t ../libdwfl/libdwfl.a))
+libdw_pic_a_SOURCES = 
+am_libdw_pic_a_OBJECTS = $(libdw_a_SOURCES:.c=.os)
+libdw_so_SOURCES = 
+libdwfl_objects = $(shell $(AR) t ../libdwfl/libdwfl.a)
+libdw_a_LIBADD = $(addprefix ../libdwfl/,$(libdwfl_objects)) \
+       $(addprefix ../libdwelf/,$(libdwelf_objects))
+libdwelf_objects = $(shell $(AR) t ../libdwelf/libdwelf.a)
 noinst_HEADERS = libdwP.h memory-access.h dwarf_abbrev_hash.h \
                 dwarf_sig8_hash.h cfi.h encoded-value.h
 
@@ -397,7 +499,6 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 install-libLIBRARIES: $(lib_LIBRARIES)
        @$(NORMAL_INSTALL)
-       test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
        @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \
        list2=; for p in $$list; do \
          if test -f $$p; then \
@@ -405,6 +506,8 @@ install-libLIBRARIES: $(lib_LIBRARIES)
          else :; fi; \
        done; \
        test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
          echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \
          $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; }
        @$(POST_INSTALL)
@@ -428,20 +531,19 @@ clean-libLIBRARIES:
 
 clean-noinstLIBRARIES:
        -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
 libdw.a: $(libdw_a_OBJECTS) $(libdw_a_DEPENDENCIES) $(EXTRA_libdw_a_DEPENDENCIES) 
-       -rm -f libdw.a
-       $(libdw_a_AR) libdw.a $(libdw_a_OBJECTS) $(libdw_a_LIBADD)
-       $(RANLIB) libdw.a
+       $(AM_V_at)-rm -f libdw.a
+       $(AM_V_AR)$(libdw_a_AR) libdw.a $(libdw_a_OBJECTS) $(libdw_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libdw.a
+
 libdw_pic.a: $(libdw_pic_a_OBJECTS) $(libdw_pic_a_DEPENDENCIES) $(EXTRA_libdw_pic_a_DEPENDENCIES) 
-       -rm -f libdw_pic.a
-       $(libdw_pic_a_AR) libdw_pic.a $(libdw_pic_a_OBJECTS) $(libdw_pic_a_LIBADD)
-       $(RANLIB) libdw_pic.a
+       $(AM_V_at)-rm -f libdw_pic.a
+       $(AM_V_AR)$(libdw_pic_a_AR) libdw_pic.a $(libdw_pic_a_OBJECTS) $(libdw_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libdw_pic.a
 
 clean-noinstPROGRAMS:
        -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
-@MUDFLAP_TRUE@libdw.so$(EXEEXT): $(libdw_so_OBJECTS) $(libdw_so_DEPENDENCIES) $(EXTRA_libdw_so_DEPENDENCIES) 
-@MUDFLAP_TRUE@ @rm -f libdw.so$(EXEEXT)
-@MUDFLAP_TRUE@ $(LINK) $(libdw_so_OBJECTS) $(libdw_so_LDADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -466,6 +568,8 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_cfi_addrframe.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_cfi_end.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_child.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_cu_die.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_cu_getdwarf.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_cuoffset.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_decl_column.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_decl_file.Po@am__quote@
@@ -494,6 +598,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_getabbrevattr.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_getabbrevcode.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_getabbrevtag.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_getalt.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_getarange_addr.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_getarangeinfo.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_getaranges.Po@am__quote@
@@ -504,6 +609,8 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_getelf.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_getfuncs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_getlocation.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_getlocation_attr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_getlocation_die.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_getlocation_implicit_pointer.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_getmacros.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_getpubnames.Po@am__quote@
@@ -545,6 +652,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_onearange.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_onesrcline.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_ranges.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_setalt.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_siblingof.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_sig8_hash.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf_srclang.Po@am__quote@
@@ -557,25 +665,27 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdw_findcu.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdw_form.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdw_visit_scopes.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memory-access.Po@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
 
 .c.obj:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
 install-includeHEADERS: $(include_HEADERS)
        @$(NORMAL_INSTALL)
-       test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
        @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -592,8 +702,11 @@ uninstall-includeHEADERS:
        dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
 install-pkgincludeHEADERS: $(pkginclude_HEADERS)
        @$(NORMAL_INSTALL)
-       test -z "$(pkgincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)"
        @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -609,26 +722,15 @@ uninstall-pkgincludeHEADERS:
        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
        dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
 
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -640,15 +742,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -657,6 +755,21 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -699,11 +812,8 @@ installdirs:
        for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(pkgincludedir)"; do \
          test -z "$$dir" || $(MKDIR_P) "$$dir"; \
        done
-@MUDFLAP_TRUE@install: $(BUILT_SOURCES)
-@MUDFLAP_TRUE@ $(MAKE) $(AM_MAKEFLAGS) install-am
 install-exec: install-exec-am
 install-data: install-data-am
-@MUDFLAP_TRUE@uninstall: uninstall-am
 
 install-am: all-am
        @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
@@ -807,19 +917,20 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLIBRARIES \
 
 .MAKE: all check install install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
        clean-libLIBRARIES clean-noinstLIBRARIES clean-noinstPROGRAMS \
-       ctags distclean distclean-compile distclean-generic \
-       distclean-tags distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-includeHEADERS install-info \
-       install-info-am install-libLIBRARIES install-man install-pdf \
-       install-pdf-am install-pkgincludeHEADERS install-ps \
-       install-ps-am install-strip installcheck installcheck-am \
-       installdirs maintainer-clean maintainer-clean-generic \
-       mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
-       ps ps-am tags uninstall uninstall-am uninstall-includeHEADERS \
+       cscopelist-am ctags ctags-am distclean distclean-compile \
+       distclean-generic distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am \
+       install-includeHEADERS install-info install-info-am \
+       install-libLIBRARIES install-man install-pdf install-pdf-am \
+       install-pkgincludeHEADERS install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+       tags tags-am uninstall uninstall-am uninstall-includeHEADERS \
        uninstall-libLIBRARIES uninstall-pkgincludeHEADERS
 
 
@@ -834,30 +945,30 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLIBRARIES \
 @MAINTAINER_MODE_TRUE@$(srcdir)/known-dwarf.h: $(top_srcdir)/config/known-dwarf.awk $(srcdir)/dwarf.h
 @MAINTAINER_MODE_TRUE@ gawk -f $^ > $@.new
 @MAINTAINER_MODE_TRUE@ mv -f $@.new $@
-@MUDFLAP_FALSE@libdw.so: $(srcdir)/libdw.map libdw_pic.a \
-@MUDFLAP_FALSE@          ../libdwfl/libdwfl_pic.a ../libebl/libebl.a \
-@MUDFLAP_FALSE@          ../libelf/libelf.so
+libdw.so$(EXEEXT): $(srcdir)/libdw.map libdw_pic.a ../libdwelf/libdwelf_pic.a \
+         ../libdwfl/libdwfl_pic.a ../libebl/libebl.a \
+         ../libelf/libelf.so
 # The rpath is necessary for libebl because its $ORIGIN use will
 # not fly in a setuid executable that links in libdw.
-@MUDFLAP_FALSE@        $(LINK) -shared -o $@ -Wl,--soname,$@.$(VERSION),-z,defs \
-@MUDFLAP_FALSE@                -Wl,--enable-new-dtags,-rpath,$(pkglibdir) \
-@MUDFLAP_FALSE@                -Wl,--version-script,$<,--no-undefined \
-@MUDFLAP_FALSE@                -Wl,--whole-archive $(filter-out $<,$^) -Wl,--no-whole-archive\
-@MUDFLAP_FALSE@                -ldl $(zip_LIBS)
-@MUDFLAP_FALSE@        if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
-@MUDFLAP_FALSE@        ln -fs $@ $@.$(VERSION)
-
-@MUDFLAP_FALSE@install: install-am libdw.so
-@MUDFLAP_FALSE@        $(mkinstalldirs) $(DESTDIR)$(libdir)
-@MUDFLAP_FALSE@        $(INSTALL_PROGRAM) libdw.so $(DESTDIR)$(libdir)/libdw-$(PACKAGE_VERSION).so
-@MUDFLAP_FALSE@        ln -fs libdw-$(PACKAGE_VERSION).so $(DESTDIR)$(libdir)/libdw.so.$(VERSION)
-@MUDFLAP_FALSE@        ln -fs libdw.so.$(VERSION) $(DESTDIR)$(libdir)/libdw.so
-
-@MUDFLAP_FALSE@uninstall: uninstall-am
-@MUDFLAP_FALSE@        rm -f $(DESTDIR)$(libdir)/libdw-$(PACKAGE_VERSION).so
-@MUDFLAP_FALSE@        rm -f $(DESTDIR)$(libdir)/libdw.so.$(VERSION)
-@MUDFLAP_FALSE@        rm -f $(DESTDIR)$(libdir)/libdw.so
-@MUDFLAP_FALSE@        rmdir --ignore-fail-on-non-empty $(DESTDIR)$(includedir)/elfutils
+       $(LINK) -shared -o $@ -Wl,--soname,$@.$(VERSION),-z,defs \
+               -Wl,--enable-new-dtags,-rpath,$(pkglibdir) \
+               -Wl,--version-script,$<,--no-undefined \
+               -Wl,--whole-archive $(filter-out $<,$^) -Wl,--no-whole-archive\
+               -ldl $(zip_LIBS)
+       if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
+       ln -fs $@ $@.$(VERSION)
+
+install: install-am libdw.so
+       $(mkinstalldirs) $(DESTDIR)$(libdir)
+       $(INSTALL_PROGRAM) libdw.so $(DESTDIR)$(libdir)/libdw-$(PACKAGE_VERSION).so
+       ln -fs libdw-$(PACKAGE_VERSION).so $(DESTDIR)$(libdir)/libdw.so.$(VERSION)
+       ln -fs libdw.so.$(VERSION) $(DESTDIR)$(libdir)/libdw.so
+
+uninstall: uninstall-am
+       rm -f $(DESTDIR)$(libdir)/libdw-$(PACKAGE_VERSION).so
+       rm -f $(DESTDIR)$(libdir)/libdw.so.$(VERSION)
+       rm -f $(DESTDIR)$(libdir)/libdw.so
+       rmdir --ignore-fail-on-non-empty $(DESTDIR)$(includedir)/elfutils
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
index f59f17d..a146f12 100644 (file)
@@ -35,6 +35,7 @@
 #include "cfi.h"
 #include "memory-access.h"
 #include "encoded-value.h"
+#include "system.h"
 #include <assert.h>
 #include <stdlib.h>
 #include <string.h>
@@ -89,6 +90,9 @@ execute_cfi (Dwarf_CFI *cache,
            }
          else
            {
+             eu_static_assert (reg_unspecified == 0);
+             memset (bigger->regs + bigger->nregs, 0,
+                     (reg + 1 - bigger->nregs) * sizeof bigger->regs[0]);
              bigger->nregs = reg + 1;
              fs = bigger;
            }
@@ -248,6 +252,8 @@ execute_cfi (Dwarf_CFI *cache,
          continue;
 
        case DW_CFA_expression:
+         /* Expression rule relies on section data, abi_cfi cannot use it.  */
+         assert (! abi_cfi);
          get_uleb128 (regno, program);
          offset = program - (const uint8_t *) cache->data->d.d_buf;
          /* DW_FORM_block is a ULEB128 length followed by that many bytes.  */
@@ -258,6 +264,8 @@ execute_cfi (Dwarf_CFI *cache,
          continue;
 
        case DW_CFA_val_expression:
+         /* Expression rule relies on section data, abi_cfi cannot use it.  */
+         assert (! abi_cfi);
          get_uleb128 (regno, program);
          /* DW_FORM_block is a ULEB128 length followed by that many bytes.  */
          offset = program - (const uint8_t *) cache->data->d.d_buf;
index 8949833..98ac6cf 100644 (file)
@@ -1,5 +1,5 @@
 /* Internal definitions for libdw CFI interpreter.
-   Copyright (C) 2009-2010 Red Hat, Inc.
+   Copyright (C) 2009-2010, 2013 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -150,8 +150,8 @@ struct dwarf_frame_register
   Dwarf_Sword value:(sizeof (Dwarf_Sword) * 8 - 3);
 };
 
-/* This holds everything we know about the state of the frame
-   at a particular PC location described by an FDE.  */
+/* This holds instructions for unwinding frame at a particular PC location
+   described by an FDE.  */
 struct Dwarf_Frame_s
 {
   /* This frame description covers PC values in [start, end).  */
index 41cae5b..d98a4bd 100644 (file)
@@ -1,5 +1,5 @@
 /* This file defines standard DWARF types, structures, and macros.
-   Copyright (C) 2000-2011 Red Hat, Inc.
+   Copyright (C) 2000-2011, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -87,7 +87,7 @@ enum
     DW_TAG_unspecified_type = 0x3b,
     DW_TAG_partial_unit = 0x3c,
     DW_TAG_imported_unit = 0x3d,
-    DW_TAG_mutable_type = 0x3e,
+    /* 0x3e reserved.  */
     DW_TAG_condition = 0x3f,
     DW_TAG_shared_type = 0x40,
     DW_TAG_type_unit = 0x41,
index a9c826c..4c6346a 100644 (file)
@@ -1,5 +1,5 @@
 /* Create descriptor from ELF descriptor for processing file.
-   Copyright (C) 2002-2011 Red Hat, Inc.
+   Copyright (C) 2002-2011, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -32,7 +32,6 @@
 #endif
 
 #include <assert.h>
-#include <inttypes.h>
 #include <stdbool.h>
 #include <stddef.h>
 #include <stdlib.h>
@@ -54,7 +53,7 @@
 
 
 /* Section names.  */
-static const char dwarf_scnnames[IDX_last][17] =
+static const char dwarf_scnnames[IDX_last][18] =
 {
   [IDX_debug_info] = ".debug_info",
   [IDX_debug_types] = ".debug_types",
@@ -67,117 +66,11 @@ static const char dwarf_scnnames[IDX_last][17] =
   [IDX_debug_str] = ".debug_str",
   [IDX_debug_macinfo] = ".debug_macinfo",
   [IDX_debug_macro] = ".debug_macro",
-  [IDX_debug_ranges] = ".debug_ranges"
+  [IDX_debug_ranges] = ".debug_ranges",
+  [IDX_gnu_debugaltlink] = ".gnu_debugaltlink"
 };
 #define ndwarf_scnnames (sizeof (dwarf_scnnames) / sizeof (dwarf_scnnames[0]))
 
-#ifdef ENABLE_DWZ
-internal_function int
-__check_build_id (Dwarf *dw, const uint8_t *build_id, const size_t id_len)
-{
-  if (dw == NULL)
-    return -1;
-
-  Elf *elf = dw->elf;
-  Elf_Scn *scn = elf_nextscn (elf, NULL);
-  if (scn == NULL)
-    return -1;
-
-  do
-    {
-      GElf_Shdr shdr_mem;
-      GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
-      if (likely (shdr != NULL) && shdr->sh_type == SHT_NOTE)
-       {
-         size_t pos = 0;
-         GElf_Nhdr nhdr;
-         size_t name_pos;
-         size_t desc_pos;
-         Elf_Data *data = elf_getdata (scn, NULL);
-         while ((pos = gelf_getnote (data, pos, &nhdr, &name_pos,
-                                     &desc_pos)) > 0)
-           if (nhdr.n_type == NT_GNU_BUILD_ID
-               && nhdr.n_namesz == sizeof "GNU"
-               && ! memcmp (data->d_buf + name_pos, "GNU", sizeof "GNU"))
-             return (nhdr.n_descsz == id_len
-                     && ! memcmp (data->d_buf + desc_pos,
-                                  build_id, id_len)) ? 0 : 1;
-        }
-      }
-    while ((scn = elf_nextscn (elf, scn)) != NULL);
-
-  return -1;
-}
-
-/* Try to open an debug alt link by name, checking build_id.
-   Marks free_alt on success, return NULL on failure.  */
-static Dwarf *
-try_debugaltlink (Dwarf *result, const char *try_name,
-                  const uint8_t *build_id, const size_t id_len)
-{
-  int fd = open (try_name, O_RDONLY);
-  if (fd > 0)
-    {
-      result->alt_dwarf = INTUSE (dwarf_begin) (fd, DWARF_C_READ);
-      if (result->alt_dwarf != NULL)
-       {
-         Elf *elf = result->alt_dwarf->elf;
-         if (__check_build_id (result->alt_dwarf, build_id, id_len) == 0
-             && elf_cntl (elf, ELF_C_FDREAD) == 0)
-           {
-             close (fd);
-             result->free_alt = 1;
-             return result;
-           }
-         INTUSE (dwarf_end) (result->alt_dwarf);
-       }
-      close (fd);
-    }
-  return NULL;
-}
-
-/* For dwz multifile support, ignore if it looks wrong.  */
-static Dwarf *
-open_debugaltlink (Dwarf *result, const char *alt_name,
-                  const uint8_t *build_id, const size_t id_len)
-{
-  /* First try the name itself, it is either an absolute path or
-     a relative one.  Sadly we don't know relative from where at
-     this point.  */
-  if (try_debugaltlink (result, alt_name, build_id, id_len) != NULL)
-    return result;
-
-  /* Lets try based on the build-id.  This is somewhat distro specific,
-     we are following the Fedora implementation described at
-  https://fedoraproject.org/wiki/Releases/FeatureBuildId#Find_files_by_build_ID
-   */
-#define DEBUG_PREFIX "/usr/lib/debug/.build-id/"
-#define PREFIX_LEN sizeof (DEBUG_PREFIX)
-  char id_name[PREFIX_LEN + 1 + id_len * 2 + sizeof ".debug" - 1];
-  strcpy (id_name, DEBUG_PREFIX);
-  int n = snprintf (&id_name[PREFIX_LEN  - 1],
-                   4, "%02" PRIx8 "/", (uint8_t) build_id[0]);
-  assert (n == 3);
-  for (size_t i = 1; i < id_len; ++i)
-    {
-      n = snprintf (&id_name[PREFIX_LEN - 1 + 3 + (i - 1) * 2],
-                   3, "%02" PRIx8, (uint8_t) build_id[i]);
-      assert (n == 2);
-    }
-  strcpy (&id_name[PREFIX_LEN - 1 + 3 + (id_len - 1) * 2],
-         ".debug");
-
-  if (try_debugaltlink (result, id_name, build_id, id_len))
-    return result;
-
-  /* Everything failed, mark this Dwarf as not having an alternate,
-     but don't fail the load.  The user may want to set it by hand
-     before usage.  */
-  result->alt_dwarf = NULL;
-  return result;
-}
-#endif /* ENABLE_DWZ */
-
 static Dwarf *
 check_section (Dwarf *result, GElf_Ehdr *ehdr, Elf_Scn *scn, bool inscngrp)
 {
@@ -187,9 +80,9 @@ check_section (Dwarf *result, GElf_Ehdr *ehdr, Elf_Scn *scn, bool inscngrp)
   /* Get the section header data.  */
   shdr = gelf_getshdr (scn, &shdr_mem);
   if (shdr == NULL)
-    /* This should never happen.  If it does something is
-       wrong in the libelf library.  */
-    abort ();
+    /* We may read /proc/PID/mem with only program headers mapped and section
+       headers out of the mapped pages.  */
+    goto err;
 
   /* Ignore any SHT_NOBITS sections.  Debugging sections should not
      have been stripped, but in case of a corrupt file we won't try
@@ -215,28 +108,14 @@ check_section (Dwarf *result, GElf_Ehdr *ehdr, Elf_Scn *scn, bool inscngrp)
     {
       /* The section name must be valid.  Otherwise is the ELF file
         invalid.  */
+    err:
       __libdw_free_zdata (result);
+      Dwarf_Sig8_Hash_free (&result->sig8_hash);
       __libdw_seterrno (DWARF_E_INVALID_ELF);
       free (result);
       return NULL;
     }
 
-#ifdef ENABLE_DWZ
-  /* For dwz multifile support, ignore if it looks wrong.  */
-  if (strcmp (scnname, ".gnu_debugaltlink") == 0)
-    {
-      Elf_Data *data = elf_getdata (scn, NULL);
-      if (data != NULL && data->d_size != 0)
-       {
-         const char *alt_name = data->d_buf;
-         const void *build_id = memchr (data->d_buf, '\0', data->d_size);
-         const int id_len = data->d_size - (build_id - data->d_buf + 1);
-         if (alt_name && build_id && id_len > 0)
-           return open_debugaltlink (result, alt_name, build_id + 1, id_len);
-       }
-    }
-#endif /* ENABLE_DWZ */
-
   /* Recognize the various sections.  Most names start with .debug_.  */
   size_t cnt;
   for (cnt = 0; cnt < ndwarf_scnnames; ++cnt)
@@ -280,6 +159,12 @@ check_section (Dwarf *result, GElf_Ehdr *ehdr, Elf_Scn *scn, bool inscngrp)
            memcpy (&size, data->d_buf + 4, sizeof size);
            size = be64toh (size);
 
+           /* Check for unsigned overflow so malloc always allocated
+              enough memory for both the Elf_Data header and the
+              uncompressed section data.  */
+           if (unlikely (sizeof (Elf_Data) + size < size))
+             break;
+
            Elf_Data *zdata = malloc (sizeof (Elf_Data) + size);
            if (unlikely (zdata == NULL))
              break;
@@ -344,6 +229,7 @@ valid_p (Dwarf *result)
       && unlikely (result->sectiondata[IDX_debug_info] == NULL))
     {
       __libdw_free_zdata (result);
+      Dwarf_Sig8_Hash_free (&result->sig8_hash);
       __libdw_seterrno (DWARF_E_NO_DWARF);
       free (result);
       result = NULL;
@@ -375,6 +261,7 @@ scngrp_read (Dwarf *result, Elf *elf, GElf_Ehdr *ehdr, Elf_Scn *scngrp)
     {
       /* We cannot read the section content.  Fail!  */
       __libdw_free_zdata (result);
+      Dwarf_Sig8_Hash_free (&result->sig8_hash);
       free (result);
       return NULL;
     }
@@ -391,6 +278,7 @@ scngrp_read (Dwarf *result, Elf *elf, GElf_Ehdr *ehdr, Elf_Scn *scngrp)
          /* A section group refers to a non-existing section.  Should
             never happen.  */
          __libdw_free_zdata (result);
+         Dwarf_Sig8_Hash_free (&result->sig8_hash);
          __libdw_seterrno (DWARF_E_INVALID_ELF);
          free (result);
          return NULL;
@@ -471,11 +359,13 @@ dwarf_begin_elf (elf, cmd, scngrp)
     }
   else if (cmd == DWARF_C_WRITE)
     {
+      Dwarf_Sig8_Hash_free (&result->sig8_hash);
       __libdw_seterrno (DWARF_E_UNIMPL);
       free (result);
       return NULL;
     }
 
+  Dwarf_Sig8_Hash_free (&result->sig8_hash);
   __libdw_seterrno (DWARF_E_INVALID_CMD);
   free (result);
   return NULL;
diff --git a/libdw/dwarf_cu_die.c b/libdw/dwarf_cu_die.c
new file mode 100644 (file)
index 0000000..48f4176
--- /dev/null
@@ -0,0 +1,68 @@
+/* Internal definitions for libdwarf.
+   Copyright (C) 2014 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 <stddef.h>
+#include "libdwP.h"
+
+
+Dwarf_Die *
+dwarf_cu_die (cu, result, versionp, abbrev_offsetp, address_sizep,
+             offset_sizep, type_signaturep, type_offsetp)
+    Dwarf_CU *cu;
+    Dwarf_Die *result;
+    Dwarf_Half *versionp;
+    Dwarf_Off *abbrev_offsetp;
+    uint8_t *address_sizep;
+    uint8_t *offset_sizep;
+    uint64_t *type_signaturep;
+    Dwarf_Off *type_offsetp;
+{
+  if (cu == NULL)
+    return NULL;
+
+  *result = CUDIE (cu);
+
+  if (versionp != NULL)
+    *versionp = cu->version;
+  if (abbrev_offsetp != NULL)
+    *abbrev_offsetp = cu->orig_abbrev_offset;
+  if (address_sizep != NULL)
+    *address_sizep = cu->address_size;
+  if (offset_sizep != NULL)
+    *offset_sizep = cu->offset_size;
+  if (type_signaturep != NULL)
+    *type_signaturep = cu->type_sig8;
+  if (type_offsetp != NULL)
+    *type_offsetp = cu->type_offset;
+
+  return result;
+}
similarity index 68%
rename from libdw/memory-access.c
rename to libdw/dwarf_cu_getdwarf.c
index 7666fb6..f8a2e9b 100644 (file)
@@ -1,5 +1,5 @@
-/* Out of line functions for memory-access.h macros.
-   Copyright (C) 2005, 2006 Red Hat, Inc.
+/* Retrieve Dwarf descriptor underlying a Dwarf_CU.
+   Copyright (C) 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
+
+#include <stddef.h>
+
 #include "libdwP.h"
-#include "memory-access.h"
 
-uint64_t
-internal_function
-__libdw_get_uleb128 (uint64_t acc, unsigned int i, const unsigned char **addrp)
-{
-  unsigned char __b;
-  get_uleb128_rest_return (acc, i, addrp);
-}
 
-int64_t
-internal_function
-__libdw_get_sleb128 (int64_t acc, unsigned int i, const unsigned char **addrp)
+Dwarf *
+dwarf_cu_getdwarf (cu)
+     Dwarf_CU *cu;
 {
-  unsigned char __b;
-  int64_t _v = acc;
-  get_sleb128_rest_return (acc, i, addrp);
+  if (cu == NULL)
+    /* Some error occurred before.  */
+    return NULL;
+
+  return cu->dbg;
 }
index c18aceb..5657132 100644 (file)
@@ -40,9 +40,9 @@ const char *
 dwarf_decl_file (Dwarf_Die *die)
 {
   Dwarf_Attribute attr_mem;
-  Dwarf_Sword idx = 0;
+  Dwarf_Word idx = 0;
 
-  if (INTUSE(dwarf_formsdata) (INTUSE(dwarf_attr_integrate)
+  if (INTUSE(dwarf_formudata) (INTUSE(dwarf_attr_integrate)
                               (die, DW_AT_decl_file, &attr_mem),
                               &idx) != 0)
     return NULL;
index 5b6db5f..80fae6c 100644 (file)
@@ -50,15 +50,20 @@ int internal_function
 __libdw_attr_intval (Dwarf_Die *die, int *linep, int attval)
 {
   Dwarf_Attribute attr_mem;
-  Dwarf_Sword line;
+  Dwarf_Word line;
 
-  int res = INTUSE(dwarf_formsdata) (INTUSE(dwarf_attr_integrate)
+  int res = INTUSE(dwarf_formudata) (INTUSE(dwarf_attr_integrate)
                                     (die, attval, &attr_mem),
                                     &line);
   if (res == 0)
     {
-      assert (line >= 0 && line <= INT_MAX);
-      *linep = line;
+      if (line > INT_MAX)
+       {
+         __libdw_seterrno (DWARF_E_INVALID_DWARF);
+         res = -1;
+       }
+      else
+       *linep = line;
     }
 
   return res;
index e65314a..241a257 100644 (file)
@@ -1,5 +1,5 @@
 /* Release debugging handling context.
-   Copyright (C) 2002-2011 Red Hat, Inc.
+   Copyright (C) 2002-2011, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -111,10 +111,6 @@ dwarf_end (dwarf)
       if (dwarf->free_elf)
        elf_end (dwarf->elf);
 
-      /* Free the alternative Dwarf descriptor if necessary.  */
-      if (dwarf->free_alt)
-       INTUSE (dwarf_end) (dwarf->alt_dwarf);
-
       /* Free the context descriptor.  */
       free (dwarf);
     }
index f070127..b54e216 100644 (file)
@@ -50,7 +50,7 @@ dwarf_formref_die (attr, result)
     {
       /* This has an absolute offset.  */
 
-      uint8_t ref_size = (cu->version == 2
+      uint8_t ref_size = (cu->version == 2 && attr->form == DW_FORM_ref_addr
                          ? cu->address_size
                          : cu->offset_size);
 
@@ -89,7 +89,6 @@ dwarf_formref_die (attr, result)
                                  ?: DWARF_E_INVALID_REFERENCE);
                return NULL;
              }
-           Dwarf_Sig8_Hash_insert (&cu->dbg->sig8_hash, cu->type_sig8, cu);
          }
        while (cu->type_sig8 != sig);
 
index c66454e..02b56d4 100644 (file)
@@ -1,5 +1,5 @@
 /* Return string associated with given attribute.
-   Copyright (C) 2003-2010 Red Hat, Inc.
+   Copyright (C) 2003-2010, 2013 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2003.
 
@@ -60,7 +60,7 @@ dwarf_formstring (attrp)
 
   if (unlikely (attrp->form != DW_FORM_strp
                   && attrp->form != DW_FORM_GNU_strp_alt)
-      || dbg->sectiondata[IDX_debug_str] == NULL)
+      || dbg_ret->sectiondata[IDX_debug_str] == NULL)
     {
       __libdw_seterrno (DWARF_E_NO_STRING);
       return NULL;
diff --git a/libdw/dwarf_getalt.c b/libdw/dwarf_getalt.c
new file mode 100644 (file)
index 0000000..cc434f0
--- /dev/null
@@ -0,0 +1,42 @@
+/* Retrieves the DWARF descriptor for debugaltlink data.
+   Copyright (C) 2014 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 "libdwP.h"
+
+Dwarf *
+dwarf_getalt (Dwarf *main)
+{
+  if (main == NULL)
+    return NULL;
+  return main->alt_dwarf;
+}
+INTDEF (dwarf_getalt)
index cc70cb2..20ac7ec 100644 (file)
@@ -144,9 +144,10 @@ dwarf_getaranges (dbg, aranges, naranges)
       if (address_size != 4 && address_size != 8)
        goto invalid;
 
-      /* Ignore the segment size value.  */
-      // XXX Really?
-      (void) *readp++;
+      /* We don't actually support segment selectors.  */
+      unsigned int segment_size = *readp++;
+      if (segment_size != 0)
+       goto invalid;
 
       /* Round the address to the next multiple of 2*address_size.  */
       readp += ((2 * address_size - ((readp - hdrstart) % (2 * address_size)))
index ba00e05..a423ef3 100644 (file)
@@ -280,8 +280,13 @@ getcfi_shdr (Elf *elf, const GElf_Ehdr *ehdr)
              hdr_vaddr = shdr->sh_addr;
            }
          else if (!strcmp (name, ".eh_frame"))
-           return getcfi_scn_eh_frame (elf, ehdr, scn, shdr,
-                                       hdr_scn, hdr_vaddr);
+           {
+             if (shdr->sh_type == SHT_PROGBITS)
+               return getcfi_scn_eh_frame (elf, ehdr, scn, shdr,
+                                           hdr_scn, hdr_vaddr);
+             else
+               return NULL;
+           }
        }
     }
 
index afc5b6e..82894c9 100644 (file)
@@ -1,5 +1,5 @@
 /* Get function information.
-   Copyright (C) 2005 Red Hat, Inc.
+   Copyright (C) 2005, 2013 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2005.
 
 #include "libdwP.h"
 
 
+struct visitor_info
+{
+  /* The user callback of dwarf_getfuncs.  */
+  int (*callback) (Dwarf_Die *, void *);
+
+  /* The user arg value to dwarf_getfuncs.  */
+  void *arg;
+
+  /* Addr of the DIE offset where to (re)start the search.  Zero for all.  */
+  void *start_addr;
+
+  /* Last subprogram DIE addr seen.  */
+  void *last_addr;
+
+  /* The CU only contains C functions.  Allows pruning of most subtrees.  */
+  bool c_cu;
+};
+
+static int
+tree_visitor (unsigned int depth __attribute__ ((unused)),
+             struct Dwarf_Die_Chain *chain, void *arg)
+{
+  struct visitor_info *const v = arg;
+  Dwarf_Die *die = &chain->die;
+  void *start_addr = v->start_addr;
+  void *die_addr = die->addr;
+
+  /* Pure C CUs can only contain defining subprogram DIEs as direct
+     children of the CU DIE or as nested function inside a normal C
+     code constructs.  */
+  int tag = INTUSE(dwarf_tag) (die);
+  if (v->c_cu
+      && tag != DW_TAG_subprogram
+      && tag != DW_TAG_lexical_block
+      && tag != DW_TAG_inlined_subroutine)
+    {
+      chain->prune = true;
+      return DWARF_CB_OK;
+    }
+
+  /* Skip all DIEs till we found the (re)start addr.  */
+  if (start_addr != NULL)
+    {
+      if (die_addr == start_addr)
+       v->start_addr = NULL;
+      return DWARF_CB_OK;
+    }
+
+  /* If this isn't a (defining) subprogram entity, skip DIE.  */
+  if (tag != DW_TAG_subprogram
+      || INTUSE(dwarf_hasattr) (die, DW_AT_declaration))
+    return DWARF_CB_OK;
+
+  v->last_addr = die_addr;
+  return (*v->callback) (die, v->arg);
+}
+
 ptrdiff_t
 dwarf_getfuncs (Dwarf_Die *cudie, int (*callback) (Dwarf_Die *, void *),
                void *arg, ptrdiff_t offset)
@@ -43,31 +100,18 @@ dwarf_getfuncs (Dwarf_Die *cudie, int (*callback) (Dwarf_Die *, void *),
                || INTUSE(dwarf_tag) (cudie) != DW_TAG_compile_unit))
     return -1;
 
-  Dwarf_Die die_mem;
-  Dwarf_Die *die;
+  int lang = INTUSE(dwarf_srclang) (cudie);
+  bool c_cu = (lang == DW_LANG_C89
+              || lang == DW_LANG_C
+              || lang == DW_LANG_C99);
 
-  int res;
-  if (offset == 0)
-    res = INTUSE(dwarf_child) (cudie, &die_mem);
-  else
-    {
-      die = INTUSE(dwarf_offdie) (cudie->cu->dbg, offset, &die_mem);
-      res = INTUSE(dwarf_siblingof) (die, &die_mem);
-    }
-  die = res != 0 ? NULL : &die_mem;
+  struct visitor_info v = { callback, arg, (void *) offset, NULL, c_cu };
+  struct Dwarf_Die_Chain chain = { .die = CUDIE (cudie->cu),
+                                  .parent = NULL };
+  int res = __libdw_visit_scopes (0, &chain, &tree_visitor, NULL, &v);
 
-  while (die != NULL)
-    {
-      if (INTUSE(dwarf_tag) (die) == DW_TAG_subprogram)
-       {
-         if (callback (die, arg) != DWARF_CB_OK)
-           return INTUSE(dwarf_dieoffset) (die);
-       }
-
-      if (INTUSE(dwarf_siblingof) (die, &die_mem) != 0)
-       break;
-    }
-
-  /* That's all.  */
-  return 0;
+  if (res == DWARF_CB_ABORT)
+    return (ptrdiff_t) v.last_addr;
+  else
+    return res;
 }
index dfaa742..8dffb83 100644 (file)
@@ -1,5 +1,5 @@
 /* Return location expression list.
-   Copyright (C) 2000-2010 Red Hat, Inc.
+   Copyright (C) 2000-2010, 2013 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -56,6 +56,7 @@ attr_ok (Dwarf_Attribute *attr)
     case DW_AT_frame_base:
     case DW_AT_return_addr:
     case DW_AT_static_link:
+    case DW_AT_segment:
       break;
 
     default:
@@ -94,13 +95,14 @@ loc_compare (const void *p1, const void *p2)
 /* For each DW_OP_implicit_value, we store a special entry in the cache.
    This points us directly to the block data for later fetching.  */
 static void
-store_implicit_value (Dwarf *dbg, void **cache, Dwarf_Op *op,
-                     unsigned char *data)
+store_implicit_value (Dwarf *dbg, void **cache, Dwarf_Op *op)
 {
   struct loc_block_s *block = libdw_alloc (dbg, struct loc_block_s,
                                           sizeof (struct loc_block_s), 1);
+  const unsigned char *data = (const unsigned char *) (uintptr_t) op->number2;
+  (void) __libdw_get_uleb128 (&data); // Ignored, equal to op->number.
   block->addr = op;
-  block->data = data + op->number2;
+  block->data = (unsigned char *) data;
   block->length = op->number;
   (void) tsearch (block, cache, loc_compare);
 }
@@ -199,6 +201,13 @@ __libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
                           bool cfap, bool valuep,
                           Dwarf_Op **llbuf, size_t *listlen, int sec_index)
 {
+  /* Empty location expressions don't have any ops to intern.  */
+  if (block->length == 0)
+    {
+      *listlen = 0;
+      return 0;
+    }
+
   /* Check whether we already looked at this list.  */
   struct loc_s fake = { .addr = block->data };
   struct loc_s **found = tfind (&fake, cache, loc_compare);
@@ -224,6 +233,21 @@ __libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
 
   struct loclist *loclist = NULL;
   unsigned int n = 0;
+
+  if (cfap)
+    {
+      /* Synthesize the operation to push the CFA before the expression.  */
+      struct loclist *newloc;
+      newloc = (struct loclist *) alloca (sizeof (struct loclist));
+      newloc->atom = DW_OP_call_frame_cfa;
+      newloc->number = 0;
+      newloc->number2 = 0;
+      newloc->offset = -1;
+      newloc->next = loclist;
+      loclist = newloc;
+      ++n;
+    }
+
   /* Decode the opcodes.  It is possible in some situations to have a
      block of size zero.  */
   while (data < end_data)
@@ -339,6 +363,7 @@ __libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
 
        case DW_OP_const4s:
        case DW_OP_call4:
+       case DW_OP_GNU_parameter_ref:
          if (unlikely (data + 4 > end_data))
            goto invalid;
 
@@ -363,6 +388,8 @@ __libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
        case DW_OP_plus_uconst:
        case DW_OP_regx:
        case DW_OP_piece:
+       case DW_OP_GNU_convert:
+       case DW_OP_GNU_reinterpret:
          /* XXX Check size.  */
          get_uleb128 (newloc->number, data);
          break;
@@ -381,21 +408,24 @@ __libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
          break;
 
        case DW_OP_bit_piece:
+       case DW_OP_GNU_regval_type:
          /* XXX Check size.  */
          get_uleb128 (newloc->number, data);
          get_uleb128 (newloc->number2, data);
          break;
 
        case DW_OP_implicit_value:
+       case DW_OP_GNU_entry_value:
          /* This cannot be used in a CFI expression.  */
          if (unlikely (dbg == NULL))
            goto invalid;
 
+         /* start of block inc. len.  */
+         newloc->number2 = (Dwarf_Word) (uintptr_t) data;
          /* XXX Check size.  */
          get_uleb128 (newloc->number, data); /* Block length.  */
          if (unlikely ((Dwarf_Word) (end_data - data) < newloc->number))
            goto invalid;
-         newloc->number2 = data - block->data; /* Relative block offset.  */
          data += newloc->number;               /* Skip the block.  */
          break;
 
@@ -408,6 +438,31 @@ __libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
          get_uleb128 (newloc->number2, data); /* Byte offset.  */
          break;
 
+       case DW_OP_GNU_deref_type:
+         if (unlikely (data >= end_data))
+           goto invalid;
+         newloc->number = *data++;
+         get_uleb128 (newloc->number2, data);
+         break;
+
+       case DW_OP_GNU_const_type:
+         {
+           size_t size;
+
+           /* XXX Check size.  */
+           get_uleb128 (newloc->number, data);
+           if (unlikely (data >= end_data))
+             goto invalid;
+
+           /* start of block inc. len.  */
+           newloc->number2 = (Dwarf_Word) (uintptr_t) data;
+           size = *data++;
+           if (unlikely ((Dwarf_Word) (end_data - data) < size))
+             goto invalid;
+           data += size;               /* Skip the block.  */
+         }
+         break;
+
        default:
          goto invalid;
        }
@@ -416,8 +471,8 @@ __libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
   if (unlikely (n == 0))
     {
       /* This is not allowed.
-
-        XXX Is it?  */
+        It would mean an empty location expression, which we handled
+        already as a special case above.  */
       goto invalid;
     }
 
@@ -434,9 +489,6 @@ __libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
       ++n;
     }
 
-  if (cfap)
-    ++n;
-
   /* Allocate the array.  */
   Dwarf_Op *result;
   if (dbg != NULL)
@@ -456,16 +508,6 @@ __libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
   *llbuf = result;
   *listlen = n;
 
-  if (cfap)
-    {
-      /* Synthesize the operation to push the CFA before the expression.  */
-      --n;
-      result[0].atom = DW_OP_call_frame_cfa;
-      result[0].number = 0;
-      result[0].number2 = 0;
-      result[0].offset = -1;
-    }
-
   do
     {
       /* We populate the array from the back since the list is backwards.  */
@@ -476,7 +518,7 @@ __libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
       result[n].offset = loclist->offset;
 
       if (result[n].atom == DW_OP_implicit_value)
-       store_implicit_value (dbg, cache, &result[n], block->data);
+       store_implicit_value (dbg, cache, &result[n]);
 
       loclist = loclist->next;
     }
@@ -539,6 +581,121 @@ dwarf_getlocation (attr, llbuf, listlen)
   return getlocation (attr->cu, &block, llbuf, listlen, cu_sec_idx (attr->cu));
 }
 
+static int
+attr_base_address (attr, basep)
+     Dwarf_Attribute *attr;
+     Dwarf_Addr *basep;
+{
+  /* Fetch the CU's base address.  */
+  Dwarf_Die cudie = CUDIE (attr->cu);
+
+  /* Find the base address of the compilation unit.  It will
+     normally be specified by DW_AT_low_pc.  In DWARF-3 draft 4,
+     the base address could be overridden by DW_AT_entry_pc.  It's
+     been removed, but GCC emits DW_AT_entry_pc and not DW_AT_lowpc
+     for compilation units with discontinuous ranges.  */
+  Dwarf_Attribute attr_mem;
+  if (unlikely (INTUSE(dwarf_lowpc) (&cudie, basep) != 0)
+      && INTUSE(dwarf_formaddr) (INTUSE(dwarf_attr) (&cudie,
+                                                    DW_AT_entry_pc,
+                                                    &attr_mem),
+                                basep) != 0)
+    {
+      if (INTUSE(dwarf_errno) () != 0)
+       return -1;
+
+      /* The compiler provided no base address when it should
+        have.  Buggy GCC does this when it used absolute
+        addresses in the location list and no DW_AT_ranges.  */
+      *basep = 0;
+    }
+  return 0;
+}
+
+static int
+initial_offset_base (attr, offset, basep)
+     Dwarf_Attribute *attr;
+     ptrdiff_t *offset;
+     Dwarf_Addr *basep;
+{
+  if (attr_base_address (attr, basep) != 0)
+    return -1;
+
+  Dwarf_Word start_offset;
+  if (__libdw_formptr (attr, IDX_debug_loc,
+                      DWARF_E_NO_LOCLIST,
+                      NULL, &start_offset) == NULL)
+    return -1;
+
+  *offset = start_offset;
+  return 0;
+}
+
+static ptrdiff_t
+getlocations_addr (attr, offset, basep, startp, endp, address,
+                  locs, expr, exprlen)
+     Dwarf_Attribute *attr;
+     ptrdiff_t offset;
+     Dwarf_Addr *basep;
+     Dwarf_Addr *startp;
+     Dwarf_Addr *endp;
+     Dwarf_Addr address;
+     Elf_Data *locs;
+     Dwarf_Op **expr;
+     size_t *exprlen;
+{
+  unsigned char *readp = locs->d_buf + offset;
+  unsigned char *readendp = locs->d_buf + locs->d_size;
+
+ next:
+  if (readendp - readp < attr->cu->address_size * 2)
+    {
+    invalid:
+      __libdw_seterrno (DWARF_E_INVALID_DWARF);
+      return -1;
+    }
+
+  Dwarf_Addr begin;
+  Dwarf_Addr end;
+
+  switch (__libdw_read_begin_end_pair_inc (attr->cu->dbg, IDX_debug_loc,
+                                          &readp, attr->cu->address_size,
+                                          &begin, &end, basep))
+    {
+    case 0: /* got location range. */
+      break;
+    case 1: /* base address setup. */
+      goto next;
+    case 2: /* end of loclist */
+      return 0;
+    default: /* error */
+      return -1;
+    }
+
+  if (readendp - readp < 2)
+    goto invalid;
+
+  /* We have a location expression.  */
+  Dwarf_Block block;
+  block.length = read_2ubyte_unaligned_inc (attr->cu->dbg, readp);
+  block.data = readp;
+  if (readendp - readp < (ptrdiff_t) block.length)
+    goto invalid;
+  readp += block.length;
+
+  *startp = *basep + begin;
+  *endp = *basep + end;
+
+  /* If address is minus one we want them all, otherwise only matching.  */
+  if (address != (Dwarf_Word) -1 && (address < *startp || address >= *endp))
+    goto next;
+
+  if (getlocation (attr->cu, &block, expr, exprlen, IDX_debug_loc) != 0)
+    return -1;
+
+  return readp - (unsigned char *) locs->d_buf;
+}
+
 int
 dwarf_getlocation_addr (attr, address, llbufs, listlens, maxlocs)
      Dwarf_Attribute *attr;
@@ -577,85 +734,109 @@ dwarf_getlocation_addr (attr, address, llbufs, listlens, maxlocs)
   if (result != 1)
     return result ?: 1;
 
-  unsigned char *endp;
-  unsigned char *readp = __libdw_formptr (attr, IDX_debug_loc,
-                                         DWARF_E_NO_LOCLIST, &endp, NULL);
-  if (readp == NULL)
+  Dwarf_Addr base, start, end;
+  Dwarf_Op *expr;
+  size_t expr_len;
+  ptrdiff_t off = 0;
+  size_t got = 0;
+
+  /* This is a true loclistptr, fetch the initial base address and offset.  */
+  if (initial_offset_base (attr, &off, &base) != 0)
     return -1;
 
-  Dwarf_Addr base = (Dwarf_Addr) -1;
-  size_t got = 0;
-  while (got < maxlocs)
+  const Elf_Data *d = attr->cu->dbg->sectiondata[IDX_debug_loc];
+  if (d == NULL)
     {
-      if (endp - readp < attr->cu->address_size * 2)
+      __libdw_seterrno (DWARF_E_NO_LOCLIST);
+      return -1;
+    }
+
+  while (got < maxlocs
+         && (off = getlocations_addr (attr, off, &base, &start, &end,
+                                  address, d, &expr, &expr_len)) > 0)
+    {
+      /* This one matches the address.  */
+      if (llbufs != NULL)
        {
-       invalid:
-         __libdw_seterrno (DWARF_E_INVALID_DWARF);
-         return -1;
+         llbufs[got] = expr;
+         listlens[got] = expr_len;
        }
+      ++got;
+    }
 
-      Dwarf_Addr begin;
-      Dwarf_Addr end;
+  /* We might stop early, so off can be zero or positive on success.  */
+  if (off < 0)
+    return -1;
 
-      int status
-       = __libdw_read_begin_end_pair_inc (attr->cu->dbg, IDX_debug_loc,
-                                          &readp, attr->cu->address_size,
-                                          &begin, &end, &base);
-      if (status == 2) /* End of list entry.  */
-       break;
-      else if (status == 1) /* Base address selected.  */
-       continue;
-      else if (status < 0)
-       return status;
-
-      if (endp - readp < 2)
-       goto invalid;
-
-      /* We have a location expression.  */
-      block.length = read_2ubyte_unaligned_inc (attr->cu->dbg, readp);
-      block.data = readp;
-      if (endp - readp < (ptrdiff_t) block.length)
-       goto invalid;
-      readp += block.length;
-
-      if (base == (Dwarf_Addr) -1)
+  return got;
+}
+
+ptrdiff_t
+dwarf_getlocations (attr, offset, basep, startp, endp, expr, exprlen)
+     Dwarf_Attribute *attr;
+     ptrdiff_t offset;
+     Dwarf_Addr *basep;
+     Dwarf_Addr *startp;
+     Dwarf_Addr *endp;
+     Dwarf_Op **expr;
+     size_t *exprlen;
+{
+  if (! attr_ok (attr))
+    return -1;
+
+  /* 1 is an invalid offset, meaning no more locations. */
+  if (offset == 1)
+    return 0;
+
+  if (offset == 0)
+    {
+      /* If it has a block form, it's a single location expression.  */
+      Dwarf_Block block;
+      if (INTUSE(dwarf_formblock) (attr, &block) == 0)
        {
-         /* Fetch the CU's base address.  */
-         Dwarf_Die cudie = CUDIE (attr->cu);
-
-         /* Find the base address of the compilation unit.  It will
-            normally be specified by DW_AT_low_pc.  In DWARF-3 draft 4,
-            the base address could be overridden by DW_AT_entry_pc.  It's
-            been removed, but GCC emits DW_AT_entry_pc and not DW_AT_lowpc
-            for compilation units with discontinuous ranges.  */
-         Dwarf_Attribute attr_mem;
-         if (unlikely (INTUSE(dwarf_lowpc) (&cudie, &base) != 0)
-             && INTUSE(dwarf_formaddr) (INTUSE(dwarf_attr) (&cudie,
-                                                            DW_AT_entry_pc,
-                                                            &attr_mem),
-                                        &base) != 0)
-           {
-             if (INTUSE(dwarf_errno) () != 0)
-               return -1;
+         if (getlocation (attr->cu, &block, expr, exprlen,
+                          cu_sec_idx (attr->cu)) != 0)
+           return -1;
 
-             /* The compiler provided no base address when it should
-                have.  Buggy GCC does this when it used absolute
-                addresses in the location list and no DW_AT_ranges.  */
-             base = 0;
-           }
+         /* This is the one and only location covering everything. */
+         *startp = 0;
+         *endp = -1;
+         return 1;
        }
 
-      if (address >= base + begin && address < base + end)
+      int error = INTUSE(dwarf_errno) ();
+      if (unlikely (error != DWARF_E_NO_BLOCK))
        {
-         /* This one matches the address.  */
-         if (llbufs != NULL
-             && unlikely (getlocation (attr->cu, &block,
-                                       &llbufs[got], &listlens[got],
-                                       IDX_debug_loc) != 0))
-           return -1;
-         ++got;
+         __libdw_seterrno (error);
+         return -1;
        }
+
+      int result = check_constant_offset (attr, expr, exprlen);
+      if (result != 1)
+       {
+         if (result == 0)
+           {
+             /* This is the one and only location covering everything. */
+             *startp = 0;
+             *endp = -1;
+             return 1;
+           }
+         return result;
+       }
+
+      /* We must be looking at a true loclistptr, fetch the initial
+        base address and offset.  */
+      if (initial_offset_base (attr, &offset, basep) != 0)
+       return -1;
     }
 
-  return got;
+  const Elf_Data *d = attr->cu->dbg->sectiondata[IDX_debug_loc];
+  if (d == NULL)
+    {
+      __libdw_seterrno (DWARF_E_NO_LOCLIST);
+      return -1;
+    }
+
+  return getlocations_addr (attr, offset, basep, startp, endp,
+                           (Dwarf_Word) -1, d, expr, exprlen);
 }
diff --git a/libdw/dwarf_getlocation_attr.c b/libdw/dwarf_getlocation_attr.c
new file mode 100644 (file)
index 0000000..cb29045
--- /dev/null
@@ -0,0 +1,103 @@
+/* Return DWARF attribute associated with a location expression op.
+   Copyright (C) 2013 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 <dwarf.h>
+#include <libdwP.h>
+
+
+int
+dwarf_getlocation_attr (attr, op, result)
+     Dwarf_Attribute *attr;
+     const Dwarf_Op *op;
+     Dwarf_Attribute *result;
+{
+  if (attr == NULL)
+    return -1;
+
+  result->cu = attr->cu;
+
+  switch (op->atom)
+    {
+      case DW_OP_implicit_value:
+       result->code = DW_AT_const_value;
+       result->form = DW_FORM_block;
+       result->valp = (unsigned char *) (uintptr_t) op->number2;
+       break;
+
+      case DW_OP_GNU_entry_value:
+       result->code = DW_AT_location;
+       result->form = DW_FORM_exprloc;
+       result->valp = (unsigned char *) (uintptr_t) op->number2;
+       break;
+
+      case DW_OP_GNU_const_type:
+       result->code = DW_AT_const_value;
+       result->form = DW_FORM_block1;
+       result->valp = (unsigned char *) (uintptr_t) op->number2;
+       break;
+
+      case DW_OP_call2:
+      case DW_OP_call4:
+      case DW_OP_call_ref:
+       {
+         Dwarf_Die die;
+         if (INTUSE(dwarf_getlocation_die) (attr, op, &die) != 0)
+           return -1;
+         if (INTUSE(dwarf_attr) (&die, DW_AT_location, result) == NULL)
+           {
+             __libdw_empty_loc_attr (result, attr->cu);
+             return 0;
+           }
+       }
+       break;
+
+      case DW_OP_GNU_implicit_pointer:
+       {
+         Dwarf_Die die;
+         if (INTUSE(dwarf_getlocation_die) (attr, op, &die) != 0)
+           return -1;
+         if (INTUSE(dwarf_attr) (&die, DW_AT_location, result) == NULL
+             && INTUSE(dwarf_attr) (&die, DW_AT_const_value, result) == NULL)
+           {
+             __libdw_empty_loc_attr (result, attr->cu);
+             return 0;
+           }
+       }
+       break;
+
+      default:
+       __libdw_seterrno (DWARF_E_INVALID_ACCESS);
+       return -1;
+    }
+
+  return 0;
+}
diff --git a/libdw/dwarf_getlocation_die.c b/libdw/dwarf_getlocation_die.c
new file mode 100644 (file)
index 0000000..fa03aac
--- /dev/null
@@ -0,0 +1,78 @@
+/* Return DIE associated with a location expression op.
+   Copyright (C) 2013 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 <dwarf.h>
+#include <libdwP.h>
+
+int
+dwarf_getlocation_die (attr, op, result)
+     Dwarf_Attribute *attr;
+     const Dwarf_Op *op;
+     Dwarf_Die *result;
+{
+  if (attr == NULL)
+    return -1;
+
+  Dwarf_Off dieoff;
+  switch (op->atom)
+    {
+    case DW_OP_GNU_implicit_pointer:
+    case DW_OP_call_ref:
+      dieoff = op->number;
+      break;
+
+    case DW_OP_GNU_parameter_ref:
+    case DW_OP_GNU_convert:
+    case DW_OP_GNU_reinterpret:
+    case DW_OP_GNU_const_type:
+    case DW_OP_call2:
+    case DW_OP_call4:
+      dieoff = attr->cu->start + op->number;
+      break;
+
+    case DW_OP_GNU_regval_type:
+    case DW_OP_GNU_deref_type:
+      dieoff = attr->cu->start + op->number2;
+      break;
+
+    default:
+      __libdw_seterrno (DWARF_E_INVALID_ACCESS);
+      return -1;
+    }
+
+  if (__libdw_offdie (attr->cu->dbg, dieoff, result,
+                     attr->cu->type_offset != 0) == NULL)
+    return -1;
+
+  return 0;
+}
+INTDEF(dwarf_getlocation_die);
index 322fdb8..f93d17e 100644 (file)
 #include <dwarf.h>
 
 
+static unsigned char empty_exprloc = 0;
+
+void
+internal_function
+__libdw_empty_loc_attr (Dwarf_Attribute *attr, struct Dwarf_CU *cu )
+{
+  attr->code = DW_AT_location;
+  attr->form = DW_FORM_exprloc;
+  attr->valp = &empty_exprloc;
+  attr->cu = cu;
+}
+
 int
 dwarf_getlocation_implicit_pointer (attr, op, result)
      Dwarf_Attribute *attr;
@@ -57,8 +69,8 @@ dwarf_getlocation_implicit_pointer (attr, op, result)
   if (INTUSE(dwarf_attr) (&die, DW_AT_location, result) == NULL
       && INTUSE(dwarf_attr) (&die, DW_AT_const_value, result) == NULL)
     {
-      __libdw_seterrno (DWARF_E_INVALID_DWARF);
-      return -1;
+      __libdw_empty_loc_attr (result, attr->cu);
+      return 0;
     }
 
   return 0;
index d026820..4bfc34b 100644 (file)
@@ -1,5 +1,5 @@
 /* Return source file information of CU.
-   Copyright (C) 2004, 2005 Red Hat, Inc.
+   Copyright (C) 2004, 2005, 2013 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2004.
 
@@ -40,7 +40,8 @@ int
 dwarf_getsrcfiles (Dwarf_Die *cudie, Dwarf_Files **files, size_t *nfiles)
 {
   if (unlikely (cudie == NULL
-               || INTUSE(dwarf_tag) (cudie) != DW_TAG_compile_unit))
+               || (INTUSE(dwarf_tag) (cudie) != DW_TAG_compile_unit
+                   && INTUSE(dwarf_tag) (cudie) != DW_TAG_partial_unit)))
     return -1;
 
   int res = -1;
index 0758023..7b174cf 100644 (file)
@@ -1,5 +1,5 @@
 /* Return line number information of CU.
-   Copyright (C) 2004-2010 Red Hat, Inc.
+   Copyright (C) 2004-2010, 2013 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2004.
 
@@ -69,11 +69,21 @@ int
 dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines, size_t *nlines)
 {
   if (unlikely (cudie == NULL
-               || INTUSE(dwarf_tag) (cudie) != DW_TAG_compile_unit))
+               || (INTUSE(dwarf_tag) (cudie) != DW_TAG_compile_unit
+                   && INTUSE(dwarf_tag) (cudie) != DW_TAG_partial_unit)))
     return -1;
 
   int res = -1;
 
+  struct linelist *linelist = NULL;
+  unsigned int nlinelist = 0;
+
+  /* If there are a large number of lines don't blow up the stack.
+     Keep track of the last malloced linelist record and free them
+     through the next pointer at the end.  */
+#define MAX_STACK_ALLOC 4096
+  struct linelist *malloc_linelist = NULL;
+
   /* Get the information if it is not already known.  */
   struct Dwarf_CU *const cu = cudie->cu;
   if (cu->lines == NULL)
@@ -324,20 +334,26 @@ dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines, size_t *nlines)
       }
 
       /* Process the instructions.  */
-      struct linelist *linelist = NULL;
-      unsigned int nlinelist = 0;
 
       /* Adds a new line to the matrix.
         We cannot simply define a function because we want to use alloca.  */
 #define NEW_LINE(end_seq)                                              \
       do {                                                             \
-       if (unlikely (add_new_line (alloca (sizeof (struct linelist)),  \
-                                   end_seq)))                          \
+       struct linelist *ll = (nlinelist < MAX_STACK_ALLOC              \
+                              ? alloca (sizeof (struct linelist))      \
+                              : malloc (sizeof (struct linelist)));    \
+       if (nlinelist >= MAX_STACK_ALLOC)                               \
+         malloc_linelist = ll;                                         \
+       if (unlikely (add_new_line (ll, end_seq)))                      \
          goto invalid_data;                                            \
       } while (0)
 
       inline bool add_new_line (struct linelist *new_line, bool end_sequence)
       {
+       new_line->next = linelist;
+       linelist = new_line;
+       ++nlinelist;
+
        /* Set the line information.  For some fields we use bitfields,
           so we would lose information if the encoded values are too large.
           Check just for paranoia, and call the data "invalid" if it
@@ -364,10 +380,6 @@ dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines, size_t *nlines)
 
 #undef SET
 
-       new_line->next = linelist;
-       linelist = new_line;
-       ++nlinelist;
-
        return false;
       }
 
@@ -711,6 +723,12 @@ dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines, size_t *nlines)
          cu->lines->info[i].files = files;
        }
 
+      /* Make sure the highest address for the CU is marked as end_sequence.
+        This is required by the DWARF spec, but some compilers forget and
+        dwfl_module_getsrc depends on it.  */
+      if (nlinelist > 0)
+       cu->lines->info[nlinelist - 1].end_sequence = 1;
+
       /* Success.  */
       res = 0;
     }
@@ -725,6 +743,14 @@ dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines, size_t *nlines)
     }
  out:
 
+  /* Free malloced line records, if any.  */
+  for (unsigned int i = MAX_STACK_ALLOC; i < nlinelist; i++)
+    {
+      struct linelist *ll = malloc_linelist->next;
+      free (malloc_linelist);
+      malloc_linelist = ll;
+    }
+
   // XXX Eventually: unlocking here.
 
   return res;
diff --git a/libdw/dwarf_setalt.c b/libdw/dwarf_setalt.c
new file mode 100644 (file)
index 0000000..9bd566f
--- /dev/null
@@ -0,0 +1,40 @@
+/* Provides the data referenced by the .gnu_debugaltlink section.
+   Copyright (C) 2014 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 "libdwP.h"
+
+void
+dwarf_setalt (Dwarf *main, Dwarf *alt)
+{
+  main->alt_dwarf = alt;
+}
+INTDEF (dwarf_setalt)
index d366768..91ce732 100644 (file)
@@ -83,7 +83,11 @@ intern_fde (Dwarf_CFI *cache, const Dwarf_FDE *entry)
                                    &fde->instructions, &fde->start))
       || unlikely (read_encoded_value (cache, cie->fde_encoding & 0x0f,
                                       &fde->instructions, &fde->end)))
-    return NULL;
+    {
+      free (fde);
+      __libdw_seterrno (DWARF_E_INVALID_DWARF);
+      return NULL;
+    }
   fde->end += fde->start;
 
   fde->cie = cie;
@@ -181,32 +185,30 @@ binary_search_fde (Dwarf_CFI *cache, Dwarf_Addr address)
        u = idx;
       else
        {
+         l = idx + 1;
+
          Dwarf_Addr fde;
          if (unlikely (read_encoded_value (&dummy_cfi,
                                            cache->search_table_encoding, &p,
                                            &fde)))
            break;
-         if (address >= start)
+
+         /* If this is the last entry, its upper bound is assumed to be
+            the end of the module.
+            XXX really should be end of containing PT_LOAD segment */
+         if (l < cache->search_table_entries)
            {
-             l = idx + 1;
-
-             /* If this is the last entry, its upper bound is assumed to be
-                the end of the module.
-                XXX really should be end of containing PT_LOAD segment */
-             if (l < cache->search_table_entries)
-               {
-                 /* Look at the start address in the following entry.  */
-                 Dwarf_Addr end;
-                 if (unlikely (read_encoded_value
-                               (&dummy_cfi, cache->search_table_encoding, &p,
-                                &end)))
-                   break;
-                 if (address >= end)
-                   continue;
-               }
-
-             return fde - cache->frame_vaddr;
+             /* Look at the start address in the following entry.  */
+             Dwarf_Addr end;
+             if (unlikely (read_encoded_value
+                           (&dummy_cfi, cache->search_table_encoding, &p,
+                            &end)))
+               break;
+             if (address >= end)
+               continue;
            }
+
+         return fde - cache->frame_vaddr;
        }
     }
 
@@ -231,12 +233,17 @@ __libdw_find_fde (Dwarf_CFI *cache, Dwarf_Addr address)
       if (offset == (Dwarf_Off) -1l)
        goto no_match;
       struct dwarf_fde *fde = __libdw_fde_by_offset (cache, offset);
-      if (unlikely (fde != NULL)
-         /* Sanity check the address range.  */
-         && unlikely (address < fde->start || address >= fde->end))
+      if (likely (fde != NULL))
        {
-         __libdw_seterrno (DWARF_E_INVALID_DWARF);
-         return NULL;
+         /* Sanity check the address range.  */
+         if (unlikely (address < fde->start))
+           {
+             __libdw_seterrno (DWARF_E_INVALID_DWARF);
+             return NULL;
+           }
+         /* .eh_frame_hdr does not indicate length covered by FDE.  */
+         if (unlikely (address >= fde->end))
+           goto no_match;
        }
       return fde;
     }
index 8109b59..6228de6 100644 (file)
   ONE_KNOWN_DW_TAG (lexical_block, DW_TAG_lexical_block) \
   ONE_KNOWN_DW_TAG (member, DW_TAG_member) \
   ONE_KNOWN_DW_TAG (module, DW_TAG_module) \
-  ONE_KNOWN_DW_TAG (mutable_type, DW_TAG_mutable_type) \
   ONE_KNOWN_DW_TAG (namelist, DW_TAG_namelist) \
   ONE_KNOWN_DW_TAG (namelist_item, DW_TAG_namelist_item) \
   ONE_KNOWN_DW_TAG (namespace, DW_TAG_namespace) \
index f5fc4e2..196d54a 100644 (file)
@@ -1,5 +1,5 @@
 /* Interfaces for libdw.
-   Copyright (C) 2002-2010 Red Hat, Inc.
+   Copyright (C) 2002-2010, 2013, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -112,6 +112,7 @@ typedef struct Dwarf_Aranges_s Dwarf_Aranges;
 
 /* CU representation.  */
 struct Dwarf_CU;
+typedef struct Dwarf_CU Dwarf_CU;
 
 /* Macro information.  */
 typedef struct Dwarf_Macro_s Dwarf_Macro;
@@ -260,6 +261,24 @@ extern Dwarf *dwarf_begin_elf (Elf *elf, Dwarf_Cmd cmd, Elf_Scn *scngrp);
 /* Retrieve ELF descriptor used for DWARF access.  */
 extern Elf *dwarf_getelf (Dwarf *dwarf);
 
+/* Retieve DWARF descriptor used for a Dwarf_Die or Dwarf_Attribute.
+   A Dwarf_Die or a Dwarf_Attribute is associated with a particular
+   Dwarf_CU handle.  This function returns the DWARF descriptor for
+   that Dwarf_CU.  */
+extern Dwarf *dwarf_cu_getdwarf (Dwarf_CU *cu);
+
+/* Retrieves the DWARF descriptor for debugaltlink data.  Returns NULL
+   if no alternate debug data has been supplied.  */
+extern Dwarf *dwarf_getalt (Dwarf *main);
+
+/* Provides the data referenced by the .gnu_debugaltlink section.  The
+   caller should check that MAIN and ALT match (i.e., they have the
+   same build ID).  It is the responsibility of the caller to ensure
+   that the data referenced by ALT stays valid while it is used by
+   MAIN, until dwarf_setalt is called on MAIN with a different
+   descriptor, or dwarf_end.  */
+extern void dwarf_setalt (Dwarf *main, Dwarf *alt);
+
 /* Release debugging handling context.  */
 extern int dwarf_end (Dwarf *dwarf);
 
@@ -345,6 +364,23 @@ extern Dwarf_Die *dwarf_diecu (Dwarf_Die *die, Dwarf_Die *result,
                               uint8_t *address_sizep, uint8_t *offset_sizep)
      __nonnull_attribute__ (2);
 
+/* Return the CU DIE and the header info associated with a Dwarf_Die
+   or Dwarf_Attribute.  A Dwarf_Die or a Dwarf_Attribute is associated
+   with a particular Dwarf_CU handle.  This function returns the CU or
+   type unit DIE and header information for that Dwarf_CU.  The
+   returned DIE is either a compile_unit, partial_unit or type_unit.
+   If it is a type_unit, then the type signature and type offset are
+   also provided, otherwise type_offset will be set to zero.  See also
+   dwarf_diecu and dwarf_next_unit.  */
+extern Dwarf_Die *dwarf_cu_die (Dwarf_CU *cu, Dwarf_Die *result,
+                               Dwarf_Half *versionp,
+                               Dwarf_Off *abbrev_offsetp,
+                               uint8_t *address_sizep,
+                               uint8_t *offset_sizep,
+                               uint64_t *type_signaturep,
+                               Dwarf_Off *type_offsetp)
+     __nonnull_attribute__ (2);
+
 /* Return CU DIE containing given address.  */
 extern Dwarf_Die *dwarf_addrdie (Dwarf *dbg, Dwarf_Addr addr,
                                 Dwarf_Die *result) __nonnull_attribute__ (3);
@@ -630,6 +666,22 @@ extern int dwarf_getlocation_addr (Dwarf_Attribute *attr, Dwarf_Addr address,
                                   Dwarf_Op **exprs, size_t *exprlens,
                                   size_t nlocs);
 
+/* Enumerate the locations ranges and descriptions covered by the
+   given attribute.  In the first call OFFSET should be zero and
+   *BASEP need not be initialized.  Returns -1 for errors, zero when
+   there are no more locations to report, or a nonzero OFFSET
+   value to pass to the next call.  Each subsequent call must preserve
+   *BASEP from the prior call.  Successful calls fill in *STARTP and
+   *ENDP with a contiguous address range and *EXPR with a pointer to
+   an array of operations with length *EXPRLEN.  If the attribute
+   describes a single location description and not a location list the
+   first call (with OFFSET zero) will return the location description
+   in *EXPR with *STARTP set to zero and *ENDP set to minus one.  */
+extern ptrdiff_t dwarf_getlocations (Dwarf_Attribute *attr,
+                                    ptrdiff_t offset, Dwarf_Addr *basep,
+                                    Dwarf_Addr *startp, Dwarf_Addr *endp,
+                                    Dwarf_Op **expr, size_t *exprlen);
+
 /* Return the block associated with a DW_OP_implicit_value operation.
    The OP pointer must point into an expression that dwarf_getlocation
    or dwarf_getlocation_addr has returned given the same ATTR.  */
@@ -648,6 +700,29 @@ extern int dwarf_getlocation_implicit_pointer (Dwarf_Attribute *attr,
                                               Dwarf_Attribute *result)
   __nonnull_attribute__ (2, 3);
 
+/* Return the DIE associated with an operation such as
+   DW_OP_GNU_implicit_pointer, DW_OP_GNU_parameter_ref, DW_OP_GNU_convert,
+   DW_OP_GNU_reinterpret, DW_OP_GNU_const_type, DW_OP_GNU_regval_type or
+   DW_OP_GNU_deref_type.  The OP pointer must point into an expression that
+   dwarf_getlocation or dwarf_getlocation_addr has returned given the same
+   ATTR.  The RESULT is a DIE that expresses a type or value needed by the
+   given OP.  */
+extern int dwarf_getlocation_die (Dwarf_Attribute *attr,
+                                 const Dwarf_Op *op,
+                                 Dwarf_Die *result)
+  __nonnull_attribute__ (2, 3);
+
+/* Return the attribute expressing a value associated with an operation such
+   as DW_OP_implicit_value, DW_OP_GNU_entry_value or DW_OP_GNU_const_type.
+   The OP pointer must point into an expression that dwarf_getlocation
+   or dwarf_getlocation_addr has returned given the same ATTR.
+   The RESULT is a value expressed by an attribute such as DW_AT_location
+   or DW_AT_const_value.  */
+extern int dwarf_getlocation_attr (Dwarf_Attribute *attr,
+                                  const Dwarf_Op *op,
+                                  Dwarf_Attribute *result)
+  __nonnull_attribute__ (2, 3);
+
 
 /* Compute the byte-size of a type DIE according to DWARF rules.
    For most types, this is just DW_AT_byte_size.
@@ -708,7 +783,16 @@ extern Dwarf_Arange *dwarf_getarange_addr (Dwarf_Aranges *aranges,
 
 
 
-/* Get functions in CUDIE.  */
+/* Get functions in CUDIE.  The given callback will be called for all
+   defining DW_TAG_subprograms in the CU DIE tree.  If the callback
+   returns DWARF_CB_ABORT the return value can be used as offset argument
+   to resume the function to find all remaining functions (this is not
+   really recommended, since it needs to rewalk the CU DIE tree first till
+   that offset is found again).  If the callback returns DWARF_CB_OK
+   dwarf_getfuncs will not return but keep calling the callback for each
+   function DIE it finds.  Pass zero for offset on the first call to walk
+   the full CU DIE tree.  If no more functions can be found and the callback
+   returned DWARF_CB_OK then the function returns zero.  */
 extern ptrdiff_t dwarf_getfuncs (Dwarf_Die *cudie,
                                 int (*callback) (Dwarf_Die *, void *),
                                 void *arg, ptrdiff_t offset);
index 1f71d03..55bc537 100644 (file)
@@ -254,3 +254,56 @@ ELFUTILS_0.149 {
 
     dwfl_dwarf_line;
 } ELFUTILS_0.148;
+
+ELFUTILS_0.156 {
+  global:
+    # Replaced ELFUTILS_0.122 version, which has a wrapper without add_p_vaddr.
+    dwfl_report_elf;
+} ELFUTILS_0.149;
+
+ELFUTILS_0.157 {
+  global:
+    dwarf_getlocations;
+    dwarf_getlocation_die;
+    dwarf_getlocation_attr;
+} ELFUTILS_0.156;
+
+ELFUTILS_0.158 {
+  global:
+    # Replaced ELFUTILS_0.146 version, which has a wrapper without executable.
+    dwfl_core_file_report;
+
+    dwfl_attach_state;
+    dwfl_pid;
+    dwfl_thread_dwfl;
+    dwfl_thread_tid;
+    dwfl_frame_thread;
+    dwfl_thread_state_registers;
+    dwfl_thread_state_register_pc;
+    dwfl_getthread_frames;
+    dwfl_getthreads;
+    dwfl_thread_getframes;
+    dwfl_frame_pc;
+
+    dwfl_module_getsymtab_first_global;
+    dwfl_module_addrinfo;
+    dwfl_module_getsym_info;
+
+    dwfl_core_file_attach;
+    dwfl_linux_proc_attach;
+} ELFUTILS_0.157;
+
+ELFUTILS_0.159 {
+  global:
+    dwarf_getalt;
+    dwarf_setalt;
+    dwelf_dwarf_gnu_debugaltlink;
+    dwelf_elf_gnu_debuglink;
+    dwelf_elf_gnu_build_id;
+} ELFUTILS_0.158;
+
+ELFUTILS_0.160 {
+  global:
+    dwarf_cu_getdwarf;
+    dwarf_cu_die;
+} ELFUTILS_0.159;
\ No newline at end of file
index 76bddff..ce8a83d 100644 (file)
@@ -1,5 +1,5 @@
 /* Internal definitions for libdwarf.
-   Copyright (C) 2002-2011 Red Hat, Inc.
+   Copyright (C) 2002-2011, 2013, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -34,6 +34,7 @@
 #include <stdbool.h>
 
 #include <libdw.h>
+#include <dwarf.h>
 
 
 /* gettext helper macros.  */
@@ -73,6 +74,7 @@ enum
     IDX_debug_macinfo,
     IDX_debug_macro,
     IDX_debug_ranges,
+    IDX_gnu_debugaltlink,
     IDX_last
   };
 
@@ -145,9 +147,6 @@ struct Dwarf
   /* If true, we allocated the ELF descriptor ourselves.  */
   bool free_elf;
 
-  /* If true, we allocated the Dwarf descriptor for alt_dwarf ourselves.  */
-  bool free_alt;
-
   /* Information for traversing the .debug_pubnames section.  This is
      an array and separately allocated with malloc.  */
   struct pubnames_s
@@ -403,11 +402,40 @@ extern Dwarf_Abbrev *__libdw_getabbrev (Dwarf *dbg, struct Dwarf_CU *cu,
      __nonnull_attribute__ (1) internal_function;
 
 /* Helper functions for form handling.  */
-extern size_t __libdw_form_val_len (Dwarf *dbg, struct Dwarf_CU *cu,
-                                   unsigned int form,
-                                   const unsigned char *valp)
+extern size_t __libdw_form_val_compute_len (Dwarf *dbg, struct Dwarf_CU *cu,
+                                           unsigned int form,
+                                           const unsigned char *valp)
      __nonnull_attribute__ (1, 2, 4) internal_function;
 
+/* Find the length of a form attribute.  */
+static inline size_t
+__nonnull_attribute__ (1, 2, 4)
+__libdw_form_val_len (Dwarf *dbg, struct Dwarf_CU *cu,
+                     unsigned int form, const unsigned char *valp)
+{
+  /* Small lookup table of forms with fixed lengths.  Absent indexes are
+     initialized 0, so any truly desired 0 is set to 0x80 and masked.  */
+  static const uint8_t form_lengths[] =
+    {
+      [DW_FORM_flag_present] = 0x80,
+      [DW_FORM_data1] = 1, [DW_FORM_ref1] = 1, [DW_FORM_flag] = 1,
+      [DW_FORM_data2] = 2, [DW_FORM_ref2] = 2,
+      [DW_FORM_data4] = 4, [DW_FORM_ref4] = 4,
+      [DW_FORM_data8] = 8, [DW_FORM_ref8] = 8, [DW_FORM_ref_sig8] = 8,
+    };
+
+  /* Return immediately for forms with fixed lengths.  */
+  if (form < sizeof form_lengths / sizeof form_lengths[0])
+    {
+      uint8_t len = form_lengths[form];
+      if (len != 0)
+       return len & 0x7f; /* Mask to allow 0x80 -> 0.  */
+    }
+
+  /* Other forms require some computation.  */
+  return __libdw_form_val_compute_len (dbg, cu, form, valp);
+}
+
 /* Helper function for DW_FORM_ref* handling.  */
 extern int __libdw_formref (Dwarf_Attribute *attr, Dwarf_Off *return_offset)
      __nonnull_attribute__ (1, 2) internal_function;
@@ -624,13 +652,9 @@ unsigned char * __libdw_formptr (Dwarf_Attribute *attr, int sec_index,
                                 Dwarf_Off *offsetp)
   internal_function;
 
-#ifdef ENABLE_DWZ
-/* Checks that the build_id of the underlying Elf matches the expected.
-   Returns zero on match, -1 on error or no build_id found or 1 when
-   build_id doesn't match.  */
-int __check_build_id (Dwarf *dw, const uint8_t *build_id, const size_t id_len)
+/* Fills in the given attribute to point at an empty location expression.  */
+void __libdw_empty_loc_attr (Dwarf_Attribute *attr, struct Dwarf_CU *cu)
   internal_function;
-#endif /* ENABLE_DWZ */
 
 
 /* Aliases to avoid PLTs.  */
@@ -651,9 +675,11 @@ INTDECL (dwarf_formref_die)
 INTDECL (dwarf_formsdata)
 INTDECL (dwarf_formstring)
 INTDECL (dwarf_formudata)
+INTDECL (dwarf_getalt)
 INTDECL (dwarf_getarange_addr)
 INTDECL (dwarf_getarangeinfo)
 INTDECL (dwarf_getaranges)
+INTDECL (dwarf_getlocation_die)
 INTDECL (dwarf_getsrcfiles)
 INTDECL (dwarf_getsrclines)
 INTDECL (dwarf_hasattr)
@@ -665,6 +691,7 @@ INTDECL (dwarf_nextcu)
 INTDECL (dwarf_next_unit)
 INTDECL (dwarf_offdie)
 INTDECL (dwarf_ranges)
+INTDECL (dwarf_setalt)
 INTDECL (dwarf_siblingof)
 INTDECL (dwarf_srclang)
 INTDECL (dwarf_tag)
index 70e24a0..c0bff2a 100644 (file)
@@ -110,6 +110,9 @@ __libdw_intern_next_unit (dbg, debug_types)
   newp->lines = NULL;
   newp->locs = NULL;
 
+  if (debug_types)
+    Dwarf_Sig8_Hash_insert (&dbg->sig8_hash, type_sig8, newp);
+
   /* Add the new entry to the search tree.  */
   if (tsearch (newp, tree, findcu_cb) == NULL)
     {
index c476a6e..5350556 100644 (file)
 
 size_t
 internal_function
-__libdw_form_val_len (Dwarf *dbg, struct Dwarf_CU *cu, unsigned int form,
-                     const unsigned char *valp)
+__libdw_form_val_compute_len (Dwarf *dbg, struct Dwarf_CU *cu,
+                             unsigned int form, const unsigned char *valp)
 {
   const unsigned char *saved;
   Dwarf_Word u128;
   size_t result;
 
+  /* NB: This doesn't cover constant form lengths, which are
+     already handled by the inlined __libdw_form_val_len.  */
   switch (form)
     {
     case DW_FORM_addr:
@@ -82,32 +84,6 @@ __libdw_form_val_len (Dwarf *dbg, struct Dwarf_CU *cu, unsigned int form,
       result = u128 + (valp - saved);
       break;
 
-    case DW_FORM_flag_present:
-      result = 0;
-      break;
-
-    case DW_FORM_ref1:
-    case DW_FORM_data1:
-    case DW_FORM_flag:
-      result = 1;
-      break;
-
-    case DW_FORM_data2:
-    case DW_FORM_ref2:
-      result = 2;
-      break;
-
-    case DW_FORM_data4:
-    case DW_FORM_ref4:
-      result = 4;
-      break;
-
-    case DW_FORM_data8:
-    case DW_FORM_ref8:
-    case DW_FORM_ref_sig8:
-      result = 8;
-      break;
-
     case DW_FORM_string:
       result = strlen ((char *) valp) + 1;
       break;
index ea0c6b4..487375d 100644 (file)
 #include "libdwP.h"
 #include <dwarf.h>
 
-enum die_class { ignore, match, match_inline, walk, imported };
 
-static enum die_class
-classify_die (Dwarf_Die *die)
+static bool
+may_have_scopes (Dwarf_Die *die)
 {
   switch (INTUSE(dwarf_tag) (die))
     {
@@ -48,31 +47,21 @@ classify_die (Dwarf_Die *die)
     case DW_TAG_catch_block:
     case DW_TAG_try_block:
     case DW_TAG_entry_point:
-      return match;
     case DW_TAG_inlined_subroutine:
-      return match_inline;
     case DW_TAG_subprogram:
-      /* This might be a concrete out-of-line instance of an inline, in
-        which case it is not guaranteed to be owned by the right scope and
-        we will search for its origin as for DW_TAG_inlined_subroutine.  */
-      return (INTUSE(dwarf_hasattr) (die, DW_AT_abstract_origin)
-             ? match_inline : match);
+      return true;
 
       /* DIEs without addresses that can own DIEs with addresses.  */
     case DW_TAG_namespace:
     case DW_TAG_class_type:
     case DW_TAG_structure_type:
-      return walk;
-
-      /* Special indirection required.  */
-    case DW_TAG_imported_unit:
-      return imported;
+      return true;
 
       /* Other DIEs we have no reason to descend.  */
     default:
       break;
     }
-  return ignore;
+  return false;
 }
 
 int
@@ -84,10 +73,11 @@ __libdw_visit_scopes (depth, root, previsit, postvisit, arg)
      void *arg;
 {
   struct Dwarf_Die_Chain child;
+  int ret;
 
   child.parent = root;
-  if (INTUSE(dwarf_child) (&root->die, &child.die) != 0)
-    return -1;
+  if ((ret = INTUSE(dwarf_child) (&root->die, &child.die)) != 0)
+    return ret < 0 ? -1 : 0; // Having zero children is legal.
 
   inline int recurse (void)
     {
@@ -95,63 +85,63 @@ __libdw_visit_scopes (depth, root, previsit, postvisit, arg)
                                   previsit, postvisit, arg);
     }
 
-  do
-    {
-      child.prune = false;
-
-      if (previsit != NULL)
-       {
-         int result = (*previsit) (depth + 1, &child, arg);
-         if (result != DWARF_CB_OK)
-           return result;
-       }
-
-      if (!child.prune)
-       switch (classify_die (&child.die))
+  inline int walk_children ()
+  {
+    do
+      {
+       /* For an imported unit, it is logically as if the children of
+          that unit are siblings of the other children.  So don't do
+          a full recursion into the imported unit, but just walk the
+          children in place before moving to the next real child.  */
+       while (INTUSE(dwarf_tag) (&child.die) == DW_TAG_imported_unit)
          {
-         case match:
-         case match_inline:
-         case walk:
-           if (INTUSE(dwarf_haschildren) (&child.die))
+           Dwarf_Die orig_child_die = child.die;
+           Dwarf_Attribute attr_mem;
+           Dwarf_Attribute *attr = INTUSE(dwarf_attr) (&child.die,
+                                                       DW_AT_import,
+                                                       &attr_mem);
+           if (INTUSE(dwarf_formref_die) (attr, &child.die) != NULL
+                && INTUSE(dwarf_child) (&child.die, &child.die) == 0)
              {
-               int result = recurse ();
+               int result = walk_children ();
                if (result != DWARF_CB_OK)
                  return result;
              }
-           break;
-
-         case imported:
-           {
-             /* This imports another compilation unit to appear
-                as part of this one, inside the current scope.
-                Recurse to search the referenced unit, but without
-                recording it as an inner scoping level.  */
-
-             Dwarf_Attribute attr_mem;
-             Dwarf_Attribute *attr = INTUSE(dwarf_attr) (&child.die,
-                                                         DW_AT_import,
-                                                         &attr_mem);
-             if (INTUSE(dwarf_formref_die) (attr, &child.die) != NULL)
-               {
-                 int result = recurse ();
-                 if (result != DWARF_CB_OK)
-                   return result;
-               }
-           }
-           break;
-
-         default:
-           break;
+
+           /* Any "real" children left?  */
+           if ((ret = INTUSE(dwarf_siblingof) (&orig_child_die,
+                                               &child.die)) != 0)
+             return ret < 0 ? -1 : 0;
+         };
+
+       child.prune = false;
+
+       if (previsit != NULL)
+         {
+           int result = (*previsit) (depth + 1, &child, arg);
+           if (result != DWARF_CB_OK)
+             return result;
          }
 
-      if (postvisit != NULL)
-       {
-         int result = (*postvisit) (depth + 1, &child, arg);
-         if (result != DWARF_CB_OK)
-           return result;
-       }
-    }
-  while (INTUSE(dwarf_siblingof) (&child.die, &child.die) == 0);
+       if (!child.prune && may_have_scopes (&child.die)
+           && INTUSE(dwarf_haschildren) (&child.die))
+         {
+           int result = recurse ();
+           if (result != DWARF_CB_OK)
+             return result;
+         }
+
+       if (postvisit != NULL)
+         {
+           int result = (*postvisit) (depth + 1, &child, arg);
+           if (result != DWARF_CB_OK)
+             return result;
+         }
+      }
+    while ((ret = INTUSE(dwarf_siblingof) (&child.die, &child.die)) == 0);
+
+    return ret < 0 ? -1 : 0;
+  }
 
-  return 0;
+  return walk_children ();
 }
index 5773e5c..f41f783 100644 (file)
@@ -1,5 +1,5 @@
 /* Unaligned memory access functionality.
-   Copyright (C) 2000-2010 Red Hat, Inc.
+   Copyright (C) 2000-2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2001.
 
 
 /* Number decoding macros.  See 7.6 Variable Length Data.  */
 
-#define get_uleb128_step(var, addr, nth, break)                                      \
-    __b = *(addr)++;                                                         \
-    var |= (uintmax_t) (__b & 0x7f) << (nth * 7);                            \
-    if (likely ((__b & 0x80) == 0))                                          \
-      break
-
-#define get_uleb128(var, addr)                                               \
-  do {                                                                       \
-    unsigned char __b;                                                       \
-    var = 0;                                                                 \
-    get_uleb128_step (var, addr, 0, break);                                  \
-    var = __libdw_get_uleb128 (var, 1, &(addr));                             \
-  } while (0)
+#define len_leb128(var) ((8 * sizeof (var) + 6) / 7)
 
-#define get_uleb128_rest_return(var, i, addrp)                               \
+#define get_uleb128_step(var, addr, nth)                                     \
   do {                                                                       \
-    for (; i < 10; ++i)                                                              \
-      {                                                                              \
-       get_uleb128_step (var, *addrp, i, return var);                        \
-      }                                                                              \
-    /* Other implementations set VALUE to UINT_MAX in this                   \
-       case.  So we better do this as well.  */                                      \
-    return UINT64_MAX;                                                       \
+    unsigned char __b = *(addr)++;                                           \
+    (var) |= (typeof (var)) (__b & 0x7f) << ((nth) * 7);                     \
+    if (likely ((__b & 0x80) == 0))                                          \
+      return (var);                                                          \
   } while (0)
 
-/* The signed case is similar, but we sign-extend the result.  */
+static inline uint64_t
+__libdw_get_uleb128 (const unsigned char **addrp)
+{
+  uint64_t acc = 0;
+  /* Unroll the first step to help the compiler optimize
+     for the common single-byte case.  */
+  get_uleb128_step (acc, *addrp, 0);
+  for (unsigned int i = 1; i < len_leb128 (acc); ++i)
+    get_uleb128_step (acc, *addrp, i);
+  /* Other implementations set VALUE to UINT_MAX in this
+     case.  So we better do this as well.  */
+  return UINT64_MAX;
+}
 
-#define get_sleb128_step(var, addr, nth, break)                                      \
-    __b = *(addr)++;                                                         \
-    _v |= (uint64_t) (__b & 0x7f) << (nth * 7);                                      \
-    if (likely ((__b & 0x80) == 0))                                          \
-      {                                                                              \
-       var = (_v << (64 - (nth * 7) - 7)) >> (64 - (nth * 7) - 7);           \
-        break;                                                               \
-      }                                                                              \
-    else do {} while (0)
+#define get_uleb128(var, addr) ((var) = __libdw_get_uleb128 (&(addr)))
 
-#define get_sleb128(var, addr)                                               \
-  do {                                                                       \
-    unsigned char __b;                                                       \
-    int64_t _v = 0;                                                          \
-    get_sleb128_step (var, addr, 0, break);                                  \
-    var = __libdw_get_sleb128 (_v, 1, &(addr));                                      \
-  } while (0)
+/* The signed case is similar, but we sign-extend the result.  */
 
-#define get_sleb128_rest_return(var, i, addrp)                               \
+#define get_sleb128_step(var, addr, nth)                                     \
   do {                                                                       \
-    for (; i < 9; ++i)                                                       \
+    unsigned char __b = *(addr)++;                                           \
+    if (likely ((__b & 0x80) == 0))                                          \
       {                                                                              \
-       get_sleb128_step (var, *addrp, i, return var);                        \
+       struct { signed int i:7; } __s = { .i = __b };                        \
+       (var) |= (typeof (var)) __s.i * ((typeof (var)) 1 << ((nth) * 7));    \
+       return (var);                                                         \
       }                                                                              \
-    __b = *(*addrp)++;                                                       \
-    if (likely ((__b & 0x80) == 0))                                          \
-      return var | ((uint64_t) __b << 63);                                   \
-    else                                                                     \
-      /* Other implementations set VALUE to INT_MAX in this                  \
-        case.  So we better do this as well.  */                             \
-      return INT64_MAX;                                                              \
+    (var) |= (typeof (var)) (__b & 0x7f) << ((nth) * 7);                     \
   } while (0)
 
-#ifdef IS_LIBDW
-extern uint64_t __libdw_get_uleb128 (uint64_t acc, unsigned int i,
-                                    const unsigned char **addrp)
-     internal_function attribute_hidden;
-extern int64_t __libdw_get_sleb128 (int64_t acc, unsigned int i,
-                                   const unsigned char **addrp)
-     internal_function attribute_hidden;
-#else
-static inline uint64_t
-__attribute__ ((unused))
-__libdw_get_uleb128 (uint64_t acc, unsigned int i, const unsigned char **addrp)
-{
-  unsigned char __b;
-  get_uleb128_rest_return (acc, i, addrp);
-}
 static inline int64_t
-__attribute__ ((unused))
-__libdw_get_sleb128 (int64_t acc, unsigned int i, const unsigned char **addrp)
+__libdw_get_sleb128 (const unsigned char **addrp)
 {
-  unsigned char __b;
-  int64_t _v = acc;
-  get_sleb128_rest_return (acc, i, addrp);
+  int64_t acc = 0;
+  /* Unrolling 0 like uleb128 didn't prove to benefit optimization.  */
+  for (unsigned int i = 0; i < len_leb128 (acc); ++i)
+    get_sleb128_step (acc, *addrp, i);
+  /* Other implementations set VALUE to INT_MAX in this
+     case.  So we better do this as well.  */
+  return INT64_MAX;
 }
-#endif
+
+#define get_sleb128(var, addr) ((var) = __libdw_get_sleb128 (&(addr)))
 
 
 /* We use simple memory access functions in case the hardware allows it.
@@ -147,6 +116,8 @@ __libdw_get_sleb128 (int64_t acc, unsigned int i, const unsigned char **addrp)
    ? (int32_t) bswap_32 (*((const int32_t *) (Addr)))                        \
    : *((const int32_t *) (Addr)))
 
+# define read_8ubyte_unaligned_noncvt(Addr) \
+   *((const uint64_t *) (Addr))
 # define read_8ubyte_unaligned(Dbg, Addr) \
   (unlikely ((Dbg)->other_byte_order)                                        \
    ? bswap_64 (*((const uint64_t *) (Addr)))                                 \
@@ -223,6 +194,12 @@ read_4sbyte_unaligned_1 (bool other_byte_order, const void *p)
 }
 
 static inline uint64_t
+read_8ubyte_unaligned_noncvt (const void *p)
+{
+  const union unaligned *up = p;
+  return up->u8;
+}
+static inline uint64_t
 read_8ubyte_unaligned_1 (bool other_byte_order, const void *p)
 {
   const union unaligned *up = p;
diff --git a/libdwelf/ChangeLog b/libdwelf/ChangeLog
new file mode 100644 (file)
index 0000000..9f95ea8
--- /dev/null
@@ -0,0 +1,23 @@
+2014-04-30  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (AM_CPPFLAGS): Add libdwfl and libebl include dirs.
+       (libdwelf_a_SOURCES): Add dwelf_elf_gnu_build_id.c
+       * dwelf_elf_gnu_build_id.c: New file. Moved libdwfl function
+       __libdwfl_find_elf_build_id here.
+       * libdwelf.h (dwelf_elf_gnu_build_id): Declare new function.
+       * libdwelfP.h (dwelf_elf_gnu_build_id): Add internal declaration.
+
+2014-04-24  Florian Weimer  <fweimer@redhat.com>
+
+       * dwelf_dwarf_gnu_debugaltlink.c: New file.
+       * Makefile.am (libdwelf_a_SOURCES): Add it.
+       * libdwelf.h (dwelf_dwarf_gnu_debugaltlink): Declare new function.
+       * libdwelfP.h (dwelf_dwarf_gnu_debugaltlink): Add internal
+       declaration.
+
+2014-04-11  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: New file.
+       * libdwelf.h: Likewise.
+       * libdwelfP.h: Likewise.
+       * dwelf_elf_gnu_debuglink.c: Likewise.
diff --git a/libdwelf/Makefile.am b/libdwelf/Makefile.am
new file mode 100644 (file)
index 0000000..cd4b7dd
--- /dev/null
@@ -0,0 +1,55 @@
+## Makefile.am for libdwelf library subdirectory in elfutils.
+##
+## Process this file with automake to create Makefile.in
+##
+## Copyright (C) 2014 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)/../libelf -I$(srcdir)/../libdw \
+              -I$(srcdir)/../libdwfl -I$(srcdir)/../libebl
+VERSION = 1
+
+noinst_LIBRARIES = libdwelf.a libdwelf_pic.a
+
+pkginclude_HEADERS = libdwelf.h
+noinst_HEADERS = libdwelfP.h
+
+libdwelf_a_SOURCES = dwelf_elf_gnu_debuglink.c dwelf_dwarf_gnu_debugaltlink.c \
+       dwelf_elf_gnu_build_id.c
+
+libdwelf = $(libdw)
+
+libdw = ../libdw/libdw.so
+libelf = ../libelf/libelf.so
+libebl = ../libebl/libebl.a
+libeu = ../lib/libeu.a
+
+libdwelf_pic_a_SOURCES =
+am_libdwelf_pic_a_OBJECTS = $(libdwelf_a_SOURCES:.c=.os)
+
+CLEANFILES += $(am_libdwelf_pic_a_OBJECTS)
diff --git a/libdwelf/Makefile.in b/libdwelf/Makefile.in
new file mode 100644 (file)
index 0000000..45ff600
--- /dev/null
@@ -0,0 +1,655 @@
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \
+       $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \
+       $(noinst_HEADERS) $(pkginclude_HEADERS) ChangeLog
+subdir = libdwelf
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+       $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/zip.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
+libdwelf_a_AR = $(AR) $(ARFLAGS)
+libdwelf_a_LIBADD =
+am_libdwelf_a_OBJECTS = dwelf_elf_gnu_debuglink.$(OBJEXT) \
+       dwelf_dwarf_gnu_debugaltlink.$(OBJEXT) \
+       dwelf_elf_gnu_build_id.$(OBJEXT)
+libdwelf_a_OBJECTS = $(am_libdwelf_a_OBJECTS)
+libdwelf_pic_a_AR = $(AR) $(ARFLAGS)
+libdwelf_pic_a_LIBADD =
+libdwelf_pic_a_OBJECTS = $(am_libdwelf_pic_a_OBJECTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/config/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libdwelf_a_SOURCES) $(libdwelf_pic_a_SOURCES)
+DIST_SOURCES = $(libdwelf_a_SOURCES) $(libdwelf_pic_a_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(pkgincludedir)"
+HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_BIARCH = @CC_BIARCH@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEBUGPRED = @DEBUGPRED@
+DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DLOCALEDIR='"${localedir}"'
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_VALGRIND = @HAVE_VALGRIND@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBEBL_SUBDIR = @LIBEBL_SUBDIR@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MODVERSION = @MODVERSION@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+READELF = @READELF@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = 1
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+base_cpu = @base_cpu@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+eu_version = @eu_version@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+zip_LIBS = @zip_LIBS@
+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \
+       -I$(srcdir)/../libelf -I$(srcdir)/../libdw \
+       -I$(srcdir)/../libdwfl -I$(srcdir)/../libebl
+AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \
+           $(if $($(*F)_no_Werror),,-Werror) \
+           $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \
+           $($(*F)_CFLAGS)
+
+COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE))
+CLEANFILES = *.gcno *.gcda $(am_libdwelf_pic_a_OBJECTS)
+textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
+noinst_LIBRARIES = libdwelf.a libdwelf_pic.a
+pkginclude_HEADERS = libdwelf.h
+noinst_HEADERS = libdwelfP.h
+libdwelf_a_SOURCES = dwelf_elf_gnu_debuglink.c dwelf_dwarf_gnu_debugaltlink.c \
+       dwelf_elf_gnu_build_id.c
+
+libdwelf = $(libdw)
+libdw = ../libdw/libdw.so
+libelf = ../libelf/libelf.so
+libebl = ../libebl/libebl.a
+libeu = ../lib/libeu.a
+libdwelf_pic_a_SOURCES = 
+am_libdwelf_pic_a_OBJECTS = $(libdwelf_a_SOURCES:.c=.os)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/eu.am $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits libdwelf/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnits libdwelf/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+$(top_srcdir)/config/eu.am:
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+libdwelf.a: $(libdwelf_a_OBJECTS) $(libdwelf_a_DEPENDENCIES) $(EXTRA_libdwelf_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libdwelf.a
+       $(AM_V_AR)$(libdwelf_a_AR) libdwelf.a $(libdwelf_a_OBJECTS) $(libdwelf_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libdwelf.a
+
+libdwelf_pic.a: $(libdwelf_pic_a_OBJECTS) $(libdwelf_pic_a_DEPENDENCIES) $(EXTRA_libdwelf_pic_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libdwelf_pic.a
+       $(AM_V_AR)$(libdwelf_pic_a_AR) libdwelf_pic.a $(libdwelf_pic_a_OBJECTS) $(libdwelf_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libdwelf_pic.a
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwelf_dwarf_gnu_debugaltlink.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwelf_elf_gnu_build_id.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwelf_elf_gnu_debuglink.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+       @$(NORMAL_INSTALL)
+       @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
+         $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
+       done
+
+uninstall-pkgincludeHEADERS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       set x; \
+       here=`pwd`; \
+       $(am__define_uniq_tagged_files); \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES) $(HEADERS)
+installdirs:
+       for dir in "$(DESTDIR)$(pkgincludedir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgincludeHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-pkgincludeHEADERS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+       clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \
+       distclean-compile distclean-generic distclean-tags distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
+       install-info install-info-am install-man install-pdf \
+       install-pdf-am install-pkgincludeHEADERS install-ps \
+       install-ps-am install-strip installcheck installcheck-am \
+       installdirs maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
+       ps ps-am tags tags-am uninstall uninstall-am \
+       uninstall-pkgincludeHEADERS
+
+
+%.os: %.c %.o
+@AMDEP_TRUE@   if $(COMPILE.os) -c -o $@ -fpic -DPIC -DSHARED -MT $@ -MD -MP \
+@AMDEP_TRUE@     -MF "$(DEPDIR)/$*.Tpo" `test -f '$<' || echo '$(srcdir)/'`$<; \
+@AMDEP_TRUE@   then cat "$(DEPDIR)/$*.Tpo" >> "$(DEPDIR)/$*.Po"; \
+@AMDEP_TRUE@        rm -f "$(DEPDIR)/$*.Tpo"; \
+@AMDEP_TRUE@   else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
+@AMDEP_TRUE@   fi
+@AMDEP_FALSE@  $(COMPILE.os) -c -o $@ -fpic -DPIC -DSHARED $<
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/libdwelf/dwelf_dwarf_gnu_debugaltlink.c b/libdwelf/dwelf_dwarf_gnu_debugaltlink.c
new file mode 100644 (file)
index 0000000..b8285d0
--- /dev/null
@@ -0,0 +1,62 @@
+/* Returns the file name and build ID stored in the .gnu_altdebuglink if found.
+   Copyright (C) 2014 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 "libdwelfP.h"
+
+ssize_t
+dwelf_dwarf_gnu_debugaltlink (Dwarf *dwarf,
+                             const char **name_p,
+                             const void **build_idp)
+{
+  Elf_Data *data = dwarf->sectiondata[IDX_gnu_debugaltlink];
+  if (data == NULL)
+    {
+      return 0;
+    }
+
+  const void *ptr = memchr (data->d_buf, '\0', data->d_size);
+  if (ptr == NULL)
+    {
+      __libdw_seterrno (DWARF_E_INVALID_ELF);
+      return -1;
+    }
+  size_t build_id_len = data->d_size - (ptr - data->d_buf + 1);
+  if (build_id_len == 0 || (size_t) (ssize_t) build_id_len != build_id_len)
+    {
+      __libdw_seterrno (DWARF_E_INVALID_ELF);
+      return -1;
+    }
+  *name_p = data->d_buf;
+  *build_idp = ptr + 1;
+  return build_id_len;
+}
+INTDEF(dwelf_dwarf_gnu_debugaltlink)
diff --git a/libdwelf/dwelf_elf_gnu_build_id.c b/libdwelf/dwelf_elf_gnu_build_id.c
new file mode 100644 (file)
index 0000000..1ed501d
--- /dev/null
@@ -0,0 +1,147 @@
+/* Returns the build id if found in a NT_GNU_BUILD_ID note.
+   Copyright (C) 2014 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 "libdwelfP.h"
+#include "libdwflP.h"
+
+#define NO_VADDR       ((GElf_Addr) -1l)
+
+/* Defined here for reuse. The dwelf interface doesn't care about the
+   address of the note, but libdwfl does.  */
+static int
+find_elf_build_id (Dwfl_Module *mod, int e_type, Elf *elf,
+                  const void **build_id_bits, GElf_Addr *build_id_elfaddr,
+                  int *build_id_len)
+{
+  int check_notes (Elf_Data *data, GElf_Addr data_elfaddr)
+  {
+    size_t pos = 0;
+    GElf_Nhdr nhdr;
+    size_t name_pos;
+    size_t desc_pos;
+    while ((pos = gelf_getnote (data, pos, &nhdr, &name_pos, &desc_pos)) > 0)
+      if (nhdr.n_type == NT_GNU_BUILD_ID
+         && nhdr.n_namesz == sizeof "GNU" && !memcmp (data->d_buf + name_pos,
+                                                      "GNU", sizeof "GNU"))
+       {
+         *build_id_bits = data->d_buf + desc_pos;
+         *build_id_elfaddr = (data_elfaddr == NO_VADDR
+                              ? 0 : data_elfaddr + desc_pos);
+         *build_id_len = nhdr.n_descsz;
+         return 1;
+       }
+    return 0;
+  }
+
+  size_t shstrndx = SHN_UNDEF;
+  int result = 0;
+
+  Elf_Scn *scn = elf_nextscn (elf, NULL);
+
+  if (scn == NULL)
+    {
+      /* No sections, have to look for phdrs.  */
+      size_t phnum;
+      if (unlikely (elf_getphdrnum (elf, &phnum) != 0))
+       {
+         if (mod != NULL)
+           __libdwfl_seterrno (DWFL_E_LIBELF);
+         return -1;
+       }
+      for (size_t i = 0; result == 0 && i < phnum; ++i)
+       {
+         GElf_Phdr phdr_mem;
+         GElf_Phdr *phdr = gelf_getphdr (elf, i, &phdr_mem);
+         if (likely (phdr != NULL) && phdr->p_type == PT_NOTE)
+           result = check_notes (elf_getdata_rawchunk (elf,
+                                                       phdr->p_offset,
+                                                       phdr->p_filesz,
+                                                       ELF_T_NHDR),
+                                 phdr->p_vaddr);
+       }
+    }
+  else
+    do
+      {
+       GElf_Shdr shdr_mem;
+       GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+       if (likely (shdr != NULL) && shdr->sh_type == SHT_NOTE)
+         {
+           /* Determine the right sh_addr in this module.  */
+           GElf_Addr vaddr = 0;
+           if (!(shdr->sh_flags & SHF_ALLOC))
+             vaddr = NO_VADDR;
+           else if (mod == NULL || e_type != ET_REL)
+             vaddr = shdr->sh_addr;
+           else if (__libdwfl_relocate_value (mod, elf, &shstrndx,
+                                              elf_ndxscn (scn), &vaddr))
+             vaddr = NO_VADDR;
+           result = check_notes (elf_getdata (scn, NULL), vaddr);
+         }
+      }
+    while (result == 0 && (scn = elf_nextscn (elf, scn)) != NULL);
+
+  return result;
+}
+
+int
+internal_function
+__libdwfl_find_elf_build_id (Dwfl_Module *mod, Elf *elf,
+                            const void **build_id_bits,
+                            GElf_Addr *build_id_elfaddr, int *build_id_len)
+{
+  GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (elf, &ehdr_mem);
+  if (unlikely (ehdr == NULL))
+    {
+      __libdwfl_seterrno (DWFL_E_LIBELF);
+      return -1;
+    }
+  // MOD->E_TYPE is zero here.
+  assert (ehdr->e_type != ET_REL || mod != NULL);
+
+  return find_elf_build_id (mod, ehdr->e_type, elf,
+                           build_id_bits, build_id_elfaddr, build_id_len);
+}
+
+ssize_t
+dwelf_elf_gnu_build_id (Elf *elf, const void **build_idp)
+{
+  GElf_Addr build_id_elfaddr;
+  int build_id_len;
+  int result = find_elf_build_id (NULL, ET_NONE, elf, build_idp,
+                                 &build_id_elfaddr, &build_id_len);
+  if (result > 0)
+    return build_id_len;
+
+  return result;
+}
+INTDEF(dwelf_elf_gnu_build_id)
diff --git a/libdwelf/dwelf_elf_gnu_debuglink.c b/libdwelf/dwelf_elf_gnu_debuglink.c
new file mode 100644 (file)
index 0000000..7b5fc93
--- /dev/null
@@ -0,0 +1,99 @@
+/* Returns the file name and crc stored in the .gnu_debuglink if found.
+   Copyright (C) 2014 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 "libdwelfP.h"
+
+const char *
+dwelf_elf_gnu_debuglink (Elf *elf, GElf_Word *crc)
+{
+  size_t shstrndx;
+  if (elf_getshdrstrndx (elf, &shstrndx) < 0)
+    return NULL;
+
+  Elf_Scn *scn = NULL;
+  while ((scn = elf_nextscn (elf, scn)) != NULL)
+    {
+      GElf_Shdr shdr_mem;
+      GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+      if (shdr == NULL)
+        return NULL;
+
+      const char *name = elf_strptr (elf, shstrndx, shdr->sh_name);
+      if (name == NULL)
+        return NULL;
+
+      if (!strcmp (name, ".gnu_debuglink"))
+        break;
+    }
+
+  if (scn == NULL)
+    return NULL;
+
+  /* Found the .gnu_debuglink section.  Extract its contents.  */
+  Elf_Data *rawdata = elf_rawdata (scn, NULL);
+  if (rawdata == NULL)
+    return NULL;
+
+  /* The CRC comes after the zero-terminated file name,
+     (aligned up to 4 bytes) at the end of the section data.  */
+  if (rawdata->d_size <= sizeof *crc
+      || memchr (rawdata->d_buf, '\0', rawdata->d_size - sizeof *crc) == NULL)
+    return NULL;
+
+  Elf_Data crcdata =
+    {
+      .d_type = ELF_T_WORD,
+      .d_buf = crc,
+      .d_size = sizeof *crc,
+      .d_version = EV_CURRENT,
+    };
+  Elf_Data conv =
+    {
+      .d_type = ELF_T_WORD,
+      .d_buf = rawdata->d_buf + rawdata->d_size - sizeof *crc,
+      .d_size = sizeof *crc,
+      .d_version = EV_CURRENT,
+    };
+
+  GElf_Ehdr ehdr_mem;
+  GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem);
+  if (ehdr == NULL)
+    return NULL;
+
+  Elf_Data *d = gelf_xlatetom (elf, &crcdata, &conv, ehdr->e_ident[EI_DATA]);
+  if (d == NULL)
+    return NULL;
+  assert (d == &crcdata);
+
+  return rawdata->d_buf;
+}
+INTDEF(dwelf_elf_gnu_debuglink)
diff --git a/libdwelf/libdwelf.h b/libdwelf/libdwelf.h
new file mode 100644 (file)
index 0000000..e16dc0f
--- /dev/null
@@ -0,0 +1,72 @@
+/* Interfaces for libdwelf. DWARF ELF Low-level Functions.
+   Copyright (C) 2014 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 _LIBDWELF_H
+#define _LIBDWELF_H    1
+
+#include "libdw.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* DWARF ELF Low-level Functions (dwelf).
+   Functions starting with dwelf_elf will take a (libelf) Elf object as
+   first argument and might set elf_errno on error.  Functions starting
+   with dwelf_dwarf will take a (libdw) Dwarf object as first argument
+   and might set dwarf_errno on error.  */
+
+/* Returns the name and the CRC32 of the separate debug file from the
+   .gnu_debuglink section if found in the ELF.  Return NULL if the ELF
+   file didn't have a .gnu_debuglink section, had malformed data in the
+   section or some other error occured.  */
+extern const char *dwelf_elf_gnu_debuglink (Elf *elf, GElf_Word *crc);
+
+/* Returns the name and build ID from the .gnu_debugaltlink section if
+   found in the ELF.  On success, pointers to the name and build ID
+   are written to *NAMEP and *BUILDID_P, and the positive length of
+   the build ID is returned.  Returns 0 if the ELF lacks a
+   .gnu_debugaltlink section.  Returns -1 in case of malformed data or
+   other errors.  */
+extern ssize_t dwelf_dwarf_gnu_debugaltlink (Dwarf *dwarf,
+                                            const char **namep,
+                                            const void **build_idp);
+
+/* Returns the build ID as found in a NT_GNU_BUILD_ID note from either
+   a SHT_NOTE section or from a PT_NOTE segment if the ELF file
+   doesn't contain any section headers.  On success a pointer to the
+   build ID is written to *BUILDID_P, and the positive length of the
+   build ID is returned.  Returns 0 if the ELF lacks a NT_GNU_BUILD_ID
+   note.  Returns -1 in case of malformed data or other errors.  */
+extern ssize_t dwelf_elf_gnu_build_id (Elf *elf, const void **build_idp);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* libdwelf.h */
diff --git a/libdwelf/libdwelfP.h b/libdwelf/libdwelfP.h
new file mode 100644 (file)
index 0000000..d83c759
--- /dev/null
@@ -0,0 +1,42 @@
+/* Internal definitions for libdwelf. DWARF ELF Low-level Functions.
+   Copyright (C) 2014 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 _LIBDWELFP_H
+#define _LIBDWELFP_H   1
+
+#include <libdwelf.h>
+#include "../libdw/libdwP.h"   /* We need its INTDECLs.  */
+#include <assert.h>
+#include <string.h>
+
+/* Avoid PLT entries.  */
+INTDECL (dwelf_elf_gnu_debuglink)
+INTDECL (dwelf_dwarf_gnu_debugaltlink)
+INTDECL (dwelf_elf_gnu_build_id)
+
+#endif /* libdwelfP.h */
index 36db7a3..c644ffe 100644 (file)
@@ -1,3 +1,815 @@
+2014-08-14  Mark Wielaard  <mjw@redhat.com>
+
+       * linux-kernel-modules.c (check-suffix): Also TRY .ko.xz.
+
+2014-07-24  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Fix report_r_debug for prelinked libraries.
+       * link_map.c (report_r_debug): Comment out variable l_addr.
+       Use instead new variable base recalculated from l_ld.
+
+2014-06-24  Kurt Roeckx  <kurt@roeckx.be>
+
+       * linux-pid-attach.c: Make it build on non linux hosts.
+
+2014-06-17  Mark Wielaard  <mjw@redhat.com>
+
+       * frame_unwind.c (handle_cfi): Use ebl_func_addr_mask.
+       * dwfl_module_getsym.c (__libdwfl_getsym): Likewise.
+
+2014-06-15  Mark Wielaard  <mjw@redhat.com>
+
+       * linux-core-attach.c (core_memory_read): Use libdw/memory-access.h
+       macros read_4ubyte_unaligned_noncvt and read_8ubyte_unaligned_noncvt
+       to read possibly unaligned data.
+       (core_next_thread): Likewise.
+       (core_set_initial_registers): Likewise.
+       (dwfl_core_file_attach): Likewise.
+
+2014-06-11  Mark Wielaard  <mjw@redhat.com>
+
+       * dwfl_frame.c (__libdwfl_process_free): Reset dwfl->attacherr.
+       (dwfl_attach_state): Set dwfl->attacherr.
+       (dwfl_pid): Check and return dwfl->attacherr if set.
+       (dwfl_getthreads): Likewise.
+       (getthread): Likewise.
+       * libdwflP.h: Add DWFL_E_NO_CORE_FILE.
+       (struct Dwfl): Add attacherr field.
+       * linux-core-attach.c (dwfl_core_file_attach): Set dwfl->attacherr.
+       Don't assert if ELF file is not ET_CORE, just return error.
+       * linux-pid-attach.c (dwfl_linux_proc_attach): Set dwfl->attacherr.
+
+2014-06-10  Mark Wielaard  <mjw@redhat.com>
+
+       * argp-std.c (parse_opt): Ignore errors from dwfl_core_file_attach
+       or dwfl_linux_proc_attach.
+
+2014-05-15  Mark Wielaard  <mjw@redhat.com>
+
+       * linux-proc-maps.c (grovel_auxv): Close fd on error.
+
+2014-05-02  Mark Wielaard  <mjw@redhat.com>
+
+       * dwfl_module_getdwarf: Remove ENABLE_DWZ ifdefs so find_debug_altlink
+       is always called.
+
+2014-05-01  Mark Wielaard  <mjw@redhat.com>
+
+       * libdwflP.h (struct Dwfl_Module): Add alt, alt_fd and alt_elf fields.
+       (__libdwfl_open_mod_by_build_id): Renamed __libdwfl_open_by_build_id.
+       (__libdwfl_open_by_build_id): New declaration that takes an explicit
+       build-id.
+       * dwfl_build_id_find_debuginfo.c (dwfl_build_id_find_debuginfo): If
+       we already have the Dwarf then look for the alt dwz multi file by
+       build-id.
+       * dwfl_build_id_find_elf.c (__libdwfl_open_by_build_id): Add the
+       build-id we are looking for as argument.
+       (__libdwfl_open_mod_by_build_id): New function, calls
+       __libdwfl_open_by_build_id.
+       (dwfl_build_id_find_elf): Call __libdwfl_open_mod_by_build_id.
+       * dwfl_module.c (__libdwfl_module_free): Release alt, alt_elf and
+       close alt_fd if necessary.
+       * dwfl_module_getdwarf.c (__check_build_id): Removed.
+       (try_debugaltlink): Removed.
+       (open_debugaltlink): Removed.
+       (open_elf_file): First half of open_elf that just opens the elf
+       file but doesn't setup the load address.
+       (open_elf): Call open_elf_file.
+       (find_debug_altlink): New function.
+       (load_dw): Remove loading of dwz multifile.
+       (find_dw): Call find_debug_altlink.
+       * find-debuginfo.c (validate): Handle alt debug case using
+       dwelf_dwarf_gnu_debugaltlink and mod->alt_elf.
+       (find_debuginfo_in_path): Handle alt debug files possibly in .dwz
+       subdirs.
+       * linux-kernel-modules.c (try_kernel_name): Use fakemod.debug.name
+       to store name to find by dwfl_standard_find_debuginfo instead of
+       allocating an extra variable on stack.
+
+2014-04-30  Mark Wielaard  <mjw@redhat.com>
+
+       * dwfl_module_build_id.c (__libdwfl_find_elf_build_id): Moved to
+       dwelf_elf_gnu_build_id.c.
+       (__libdwfl_find_build_id): Add assert to make sure mod is never NULL.
+       * dwfl_segment_report_module.c (dwfl_segment_report_module): Call
+       dwelf_elf_gnu_build_id directly instead of __libdwfl_find_build_id.
+       * dwfl_module_getdwarf.c (__check_build_id): Implement using
+       dwelf_elf_gnu_build_id.
+
+2014-04-15  Florian Weimer  <fweimer@redhat.com>
+
+       * dwfl_module_getdwarf.c (__check_build_id): Moved from libdw.
+       (try_debugaltlink): Likewise.
+       (open_debugaltlink): Likewise.
+       (load_dw): Locate alternate debug information using
+       dwelf_dwarf_gnu_debugaltlink and call open_debugaltlink.
+
+2014-04-11  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (AM_CPPFLAGS): Add libdwelf.
+       * libdwflP.h: Include libdwelfP.h.
+       * dwfl_module_getdwarf.c (find_debuglink): Moved to libdwelf.
+       (find_debuginfo): Use dwelf_elf_gnu_debuglink.
+
+2014-04-22  Mark Wielaard  <mjw@redhat.com>
+
+       * frame_unwind.c (__libdwfl_frame_reg_get): Use uint64_t when
+       checking bits.
+       (__libdwfl_frame_reg_set): Likewise.
+
+2014-04-22  Kurt Roeckx  <kurt@roeckx.be>
+
+       * linux-pid-attach.c: Make linux only.
+
+2014-03-14  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: Remove !MUDFLAP and MUDFLAP conditions.
+       Remove libelf and libdw definitions when MUDFLAP is defined.
+       * argp-std.c (__libdwfl_argp_mudflap_options): Removed.
+
+2014-03-03  Mark Wielaard  <mjw@redhat.com>
+
+       * elf-from-memory.c (elf_from_remote_memory): Keep track of
+       segments_end_mem. Pass memsz to first handle_segment pass. Only
+       extend contents_size and use shdrs if only file bits are in
+       segment.
+
+2014-03-11  Josh Stone  <jistone@redhat.com>
+
+       * dwfl_module_getdwarf.c (open_elf): Only explicitly set
+       mod->e_type when processing the main ELF file.
+
+2014-03-04  Mark Wielaard  <mjw@redhat.com>
+
+       * libdwflP.h (struct __libdwfl_pid_arg): Moved here and renamed from
+       linux-pid-attach.c (struct pid_arg).
+       (__libdwfl_get_pid_arg): New internal function declaration.
+       (__libdwfl_ptrace_attach): Likewise.
+       (__libdwfl_ptrace_detach): Likewise.
+       * dwfl_frame.c (dwfl_attach_state): Add "(deleted)" files to the
+       special exception modules that cannot be checked at this point.
+       * linux-pid-attach.c (struct pid_arg): Moved to libdwflP.h
+       (ptrace_attach): Renamed to...
+       (__libdwfl_ptrace_attach): New internal function.
+       (__libdwfl_ptrace_detach): Likewise. Extracted from ...
+       (pid_thread_detach): Call __libdwfl_ptrace_detach now.
+       (__libdwfl_get_pid_arg): New internal function.
+       * linux-proc-maps.c (dwfl_linux_proc_find_elf): Check if special
+       module name contains "(deleted)" and dwfl_pid gives an attached
+       pid. If pid is set and try to (re)use ptrace attach state of
+       process before reading memory.
+
+2014-03-03  Mark Wielaard  <mjw@redhat.com>
+
+       * elf-from-memory.c (elf_from_remote_memory): Take pagesize as
+       argument. Free buffer when detecting bad elf. Check PT_LOAD
+       alignment requirements on first handle_segment pass. Calculate
+       loadbase, start and end of segment using pagesize, not p_align.
+       * linux-proc-maps.c (dwfl_linux_proc_find_elf): Provide pagesize
+       to elf_from_remote_memory.
+
+2014-02-26  Mark Wielaard  <mjw@redhat.com>
+
+       * linux-proc-maps.c (proc_maps_report): Don't assert on bad input.
+
+2014-02-26  Mark Wielaard  <mjw@redhat.com>
+
+       * elf-from-memory.c (elf_from_remote_memory): Check against p64
+       p_type in case ELFCLASS64, not against p32 p_type.
+
+2014-01-17  Petr Machata  <pmachata@redhat.com>
+
+       * relocate.c (relocate_section): Use gelf_fsize instead of relying
+       on shdr->sh_entsize.
+
+2014-01-05  Mark Wielaard  <mjw@redhat.com>
+
+       * frame_unwind.c (handle_cfi): Only skip resetting return register
+       if the regno is not the actual CIE return address register.
+
+2014-01-02  Mark Wielaard  <mjw@redhat.com>
+
+       * linux-pid-attach.c (dwfl_linux_proc_attach): Use strtol, not atoi.
+
+2013-12-30  Mark Wielaard  <mjw@redhat.com>
+
+       * argp-std.c (parse_opt): Call dwfl_linux_proc_attach and
+       dwfl_core_file_attach explicitly.
+       * core-file.c (dwfl_core_file_report): Don't call
+       __libdwfl_attach_state_for_core implicitly.
+       * dwfl_begin.c (dwfl_begin): Remove setting of process_attach_error.
+       * dwfl_frame.c (dwfl_pid): Set errno to DWFL_E_NO_ATTACH_STATE, not
+       process_attach_error.
+       (dwfl_getthreads): Likewise.
+       (getthread): Likewise.
+       * libdwfl.h (dwfl_core_file_report): Update documentation.
+       (dwfl_linux_proc_report): Likewise.
+       (dwfl_core_file_attach): New function declaration.
+       (dwfl_linux_proc_attach): Likewise.
+       * libdwflP.h (struct Dwfl): Remove process_attach_error.
+       (__libdwfl_attach_state_for_pid): Removed declaration.
+       (__libdwfl_attach_state_for_core): Likewise.
+       (dwfl_core_file_attach): New internal declaration.
+       (dwfl_linux_proc_attach): Likewise.
+       (attach_state_for_core): Renamed to...
+       (dwfl_core_file_attach): ...this. Change return type.
+       (__libdwfl_attach_state_for_core): Removed.
+       * linux-pid-attach.c (struct pid_arg): Add assume_ptrace_stopped.
+       (pid_set_initial_registers): Check assume_ptrace_stopped before
+       calling ptrace.
+       (pid_thread_detach): Likewise.
+       (__libdwfl_attach_state_for_pid): Renamed to...
+       (dwfl_linux_proc_attach): ...this. Adjust return type.
+       * linux-proc-maps.c (dwfl_linux_proc_report): Don't call
+       __libdwfl_attach_state_for_pid implicitly.
+
+2013-12-28  Mark Wielaard  <mjw@redhat.com>
+
+       * linux-proc-maps.c (dwfl_linux_proc_find_elf): Don't return special
+       character device files, only regular files.
+
+2013-12-24  Mark Wielaard  <mjw@redhat.com>
+
+       * linux-core-attach.c (core_next_thread): Check whether thread_argp
+       is NULL. Reset core_arg->thread_note_offset and malloc a thread_arg
+       in that case. Free thread_arg if there are no more threads.
+
+2013-12-23  Mark Wielaard  <mjw@redhat.com>
+
+       * dwfl_segment_report_module.c (dwfl_segment_report_module): Free
+       build_id before returning early.
+
+2013-12-23  Mark Wielaard  <mjw@redhat.com>
+
+       * linux-pid-attach.c (__libdwfl_attach_state_for_pid): Report actual
+       pid (thread group leader) to dwfl_attach_state.
+
+2013-12-21  Mark Wielaard  <mjw@redhat.com>
+
+       * frame_unwind.c (handle_cfi): Track whether the return register
+       has been set and only allow it to be set once.
+
+2013-12-20  Mark Wielaard  <mjw@redhat.com>
+
+       * dwfl_frame.c (one_arg): New struct.
+       (get_one_thread_cb): New function.
+       (dwfl_getthread): Likewise.
+       (one_thread): New struct.
+       (get_one_thread_frames_cb): New function.
+       (dwfl_getthread_frames): Likewise.
+       * libdwfl.h (Dwfl_Thread_Callbacks): Add get_thread function.
+       (dwfl_getthread_frames): Likewise.
+       * libdwflP.h (dwfl_getthread_frames): New internal function declaration.
+       * linux-core-attach.c (core_thread_callbacks): Initialize get_thread
+       to NULL.
+       * linux-pid-attach.c (pid_getthread): New function.
+       (pid_thread_callbacks): Initialize get_thread to pid_getthread.
+
+2013-12-20  Mark Wielaard  <mjw@redhat.com>
+
+       * linux-kernel-modules.c (report_kernel_archive): Correct nested
+       asprintf result check for debug.a.
+
+2013-12-18  Mark Wielaard  <mjw@redhat.com>
+
+       * derelocate.c (__libdwfl_find_section_ndx): New internal function.
+       * dwfl_module_addrname.c (dwfl_module_addrname): Use
+       dwfl_module_addrinfo.
+       * dwfl_module_addrsym.c (dwfl_module_addrsym_elf): Replace with...
+       (__libdwfl_addrsym): ...this. Use __libdwfl_getsym, use value
+       for comparisons, not st_value. Fill in off. Search for both value
+       and the (adjusted) sym.st_value when different.
+       (dwfl_module_addrsym): Implement using __libdwfl_addrsym.
+       (dwfl_module_addrinfo): New function.
+       * dwfl_module_getsym.c (dwfl_module_getsym_elf): Replace with...
+       (__libdwfl_getsym): ...this. Use ebl_resolve_sym_value if requested
+       and possible. Adjust sym->st_value only when requested. Fill in addr
+       if available.
+       (dwfl_module_getsym_info): New function.
+       (dwfl_module_getsym): Use __libdwfl_getsym.
+       * libdwfl.h (dwfl_module_getsym_elf): Removed.
+       (dwfl_module_getsym_info): New function declaration.
+       (dwfl_module_addrinfo): Likewise.
+       (dwfl_module_addrsym): Add documentation describing differences
+       with addrinfo variants.
+       (dwfl_module_addrsym_elf): Removed.
+       * libdwflP.h (__libdwfl_getsym): New internal function declaration.
+       (__libdwfl_addrsym): Likewise.
+       (__libdwfl_find_section_ndx): Likewise.
+       (dwfl_module_addrinfo): New internal declaration.
+       (dwfl_module_getsym_info): Likewise.
+       (dwfl_module_addrsym_elf): Removed.
+       (dwfl_module_getsym_elf): Likewise.
+
+2013-12-18  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * argp-std.c (offline_find_elf): Remove.
+       (offline_callbacks): Use dwfl_build_id_find_elf instead.
+       * dwfl_build_id_find_elf.c (dwfl_build_id_find_elf): Move here the code
+       removed above.
+
+2013-12-18  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       unwinder: s390 and s390x
+       * dwfl_frame_pc.c (dwfl_frame_pc): Call ebl_normalize_pc.
+       * frame_unwind.c (new_unwound): New function from ...
+       (handle_cfi): ... here.  Call it.
+       (setfunc, getfunc, readfunc): New functions.
+       (__libdwfl_frame_unwind): Call ebl_unwind with those functions.
+       * linux-core-attach.c (core_set_initial_registers): Always iterate
+       through the Ebl_Register_Location loop.  Call
+       dwfl_thread_state_register_pc there.
+
+2013-12-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * frame_unwind.c (handle_cfi): Call ebl_dwarf_to_regno for RA.
+
+2013-12-17  Mark Wielaard  <mjw@redhat.com>
+
+       * linux-pid-attach.c (pid_next_thread): Call rewinddir on first
+       traversal.
+
+2013-12-16  Mark Wielaard  <mjw@redhat.com>
+
+       * libdwfl.h (dwfl_module_getsymtab_first_global): New function
+       definition.
+       * dwfl_module_getdwarf.c (dwfl_module_getsymtab_first_global): New
+       function.
+       * libdwflP.h (dwfl_module_getsymtab_first_global): New internal
+       function definition.
+       * dwfl_module_addrsym.c (dwfl_module_addrsym_elf): Use new function.
+
+2013-12-14  Mark Wielaard  <mjw@redhat.com>
+
+       * dwfl_module.c (__libdwfl_module_free): Free mod->reloc_info if
+       allocated. Call dwarf_cfi_end on mod->eh_cfi if necessary.
+       * frame_unwind.c (handle_cfi): Free frame result from
+       dwarf_cfi_addrframe when done.
+
+2013-12-15  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       unwinder: ppc and ppc64
+       * frame_unwind.c (__libdwfl_frame_reg_get, __libdwfl_frame_reg_set):
+       Call ebl_dwarf_to_regno.
+       * linux-core-attach.c (core_set_initial_registers): Implement
+       pc_register support.
+       * linux-pid-attach.c (pid_thread_state_registers_cb): Implement
+       FIRSTREG -1.
+
+2013-11-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Introduce process_attach_error.
+       * dwfl_begin.c (dwfl_begin): Initialize process_attach_error.
+       * dwfl_frame.c (dwfl_pid, dwfl_getthreads): Use PROCESS_ATTACH_ERROR if
+       PROCESS is NULL.
+       * libdwflP.h (struct Dwfl): New field process_attach_error.
+       * linux-core-attach.c (__libdwfl_attach_state_for_core): Rename to ...
+       (attach_state_for_core): ... here, make it static, change return type,
+       no longer use __libdwfl_seterrno.
+       (__libdwfl_attach_state_for_core): New wrapper for it.
+
+2013-11-27  Mark Wielaard  <mjw@redhat.com>
+
+       * dwfl_module_addrsym.c (dwfl_module_addrsym): Rename to and call...
+       (dwfl_module_addrsym_elf): this. Add elfp and biasp arguments,
+       keep track of symelf, addr_symelf, closest_elf and sizeless_elf
+       instead of tracking dwfl_files.
+       * dwfl_module_getsym.c (__libdwfl_module_getsym): Renamed to...
+       (dwfl_module_getsym_elf): ...this. Remove dwfl_file argument, add
+       new elfp and biasp arguments. Track elf instead of file.
+       (dwfl_module_getsym): Call dwfl_module_getsym_elf.
+       dwfl_module_info.c (dwfl_module_info): Pass elf to
+       dwfl_adjusted_st_value.
+       * libdwfl.h (dwfl_module_getsym): Document limitations of shndx.
+       (dwfl_module_getsym_elf): New function declaration.
+       (dwfl_module_addrsym_elf): Likewise.
+       * libdwflP.h (dwfl_module_addrsym_elf): INTDECL.
+       (dwfl_module_getsym_elf): Likewise.
+       (dwfl_adjusted_st_value): Take and check elf not dwfl_file.
+       (dwfl_deadjust_st_value): Likewise.
+       (__libdwfl_module_getsym): Removed.
+       * relocate.c (resolve_symbol): Pass elf to dwfl_adjusted_st_value.
+
+2013-11-21  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Fix non-build-id core files on build-id system.
+       * link_map.c (report_r_debug): Remove valid clearing if build-id cannot
+       be read from memory.
+
+2013-11-21  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * dwfl_segment_report_module.c (dwfl_segment_report_module): New
+       variable close_elf.  Call __libdwfl_find_elf_build_id and compare the
+       content, if possible.
+
+2013-11-21  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       link_map: Use proper bias, not l_addr.
+       * core-file.c (dynamic_vaddr_get): Rename to ...
+       (__libdwfl_dynamic_vaddr_get): ... here, make it global,
+       internal_function.
+       (dwfl_core_file_report): Update name in the caller.
+       * libdwflP.h (__libdwfl_dynamic_vaddr_get): New declaration.
+       * link_map.c (report_r_debug): New variable elf_dynamic_vaddr.  Call
+       __libdwfl_dynamic_vaddr_get for it.  Remove L_ADDR FIXME comment.
+       Use ELF_DYNAMIC_VADDR instead of L_ADDR.
+
+2013-11-19  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Compatibility with older kernels such as RHEL-6.
+       * linux-pid-attach.c (struct pid_arg): New field tid_was_stopped.
+       (ptrace_attach): New parameter tid_was_stoppedp.  Set it.
+       (pid_set_initial_registers): Pass tid_was_stopped.
+       (pid_thread_detach): Use tid_was_stopped.
+
+2013-11-18  Josh Stone  <jistone@redhat.com>
+
+       * dwfl_module_getdwarf.c (find_aux_address_sync): New function.
+       (find_aux_sym): Use it.
+
+2013-11-14  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Code cleanup: Remove const in prototype
+       * dwfl_frame_regs.c (dwfl_thread_state_registers): Remove const from
+       firstreg.
+       * libdwfl.h (dwfl_thread_state_registers): Likewise.
+       * linux-pid-attach.c (pid_thread_state_registers_cb): Likewise.
+
+2013-11-14  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Fix dwfl_attach_state machine->elf.
+       * dwfl_frame.c (dwfl_attach_state): Change parameter machine to elf.
+       Call ebl_openbackend instead of ebl_openbackend_machine.
+       * libdwfl.h (dwfl_attach_state): Change parameter machine to elf.
+       Update the function description.
+       * linux-core-attach.c (__libdwfl_attach_state_for_core): Pass CORE to
+       dwfl_attach_state.
+       * linux-pid-attach.c (__libdwfl_attach_state_for_pid): Pass NULL to
+       dwfl_attach_state.
+
+2013-11-06  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Provide __libdwfl_module_getsym to get dwfl_file *.
+       * dwfl_module_addrsym.c (dwfl_module_addrsym) (i_to_symfile): Remove.
+       (dwfl_module_addrsym) (search_table): New variable file.  Use
+       __libdwfl_module_getsym.  Use file.
+       * dwfl_module_getsym.c (dwfl_module_getsym): Rename to ...
+       (__libdwfl_module_getsym): ... here.  Add parameter filep.  Set it.
+       (dwfl_module_getsym): New wrapper.
+       * libdwflP.h (__libdwfl_module_getsym): New declaration.
+
+2013-11-13  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Fix dwfl_module_addrsym for minidebuginfo.
+       * dwfl_module_addrsym.c (dwfl_module_addrsym): New variable
+       addr_symfile.
+       (dwfl_module_addrsym) (same_section): Use it.
+       (dwfl_module_addrsym) (i_to_symfile): New function.
+       (dwfl_module_addrsym) (search_table): Use it.
+
+2013-11-07  Jan Kratochvil  <jan.kratochvil@redhat.com>
+           Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (libdwfl_a_SOURCES): Add dwfl_frame.c, frame_unwind.c,
+       dwfl_frame_pc.c, linux-pid-attach.c, linux-core-attach.c and
+       dwfl_frame_regs.c.
+       * core-file.c (dwfl_core_file_report): Call
+       __libdwfl_attach_state_for_core.
+       * dwfl_end.c (dwfl_end): Call __libdwfl_process_free.
+       * dwfl_frame.c: New file.
+       * frame_unwind.c: New file.
+       * dwfl_frame_pc.c: New file.
+       * linux-pid-attach.c: New file.
+       * linux-core-attach.c: New file.
+       * dwfl_frame_regs.c: New file.
+       * libdwfl.h (Dwfl_Thread, Dwfl_Frame): New typedefs.
+       (dwfl_core_file_report, dwfl_linux_proc_report): Extend comments.
+       (Dwfl_Thread_Callbacks): New definition.
+       (struct ebl, dwfl_attach_state, dwfl_pid, dwfl_thread_dwfl)
+       (dwfl_thread_tid, dwfl_frame_thread, dwfl_thread_state_registers)
+       (dwfl_thread_state_register_pc, dwfl_getthreads, dwfl_thread_getframes)
+       (dwfl_frame_pc): New declarations.
+       * libdwflP.h (Dwfl_Process): New typedef.
+       (LIBEBL_BAD, CORE_MISSING, INVALID_REGISTER, PROCESS_MEMORY_READ)
+       (PROCESS_NO_ARCH, PARSE_PROC, INVALID_DWARF, UNSUPPORTED_DWARF)
+       (NEXT_THREAD_FAIL, ATTACH_STATE_CONFLICT, NO_ATTACH_STATE, NO_UNWIND)
+       (INVALID_ARGUMENT): New DWFL_ERROR entries.
+       (struct Dwfl): New entry process.
+       (struct Dwfl_Process, struct Dwfl_Thread, struct Dwfl_Frame)
+       (__libdwfl_frame_reg_get, __libdwfl_frame_reg_set)
+       (__libdwfl_process_free, __libdwfl_frame_unwind)
+       (__libdwfl_attach_state_for_pid, __libdwfl_attach_state_for_core)
+       (__libdwfl_segment_start, __libdwfl_segment_end): New declarations.
+       (dwfl_attach_state, dwfl_pid, dwfl_thread_dwfl, dwfl_thread_tid)
+       (dwfl_frame_thread, dwfl_thread_state_registers)
+       (dwfl_thread_state_register_pc, dwfl_getthreads, dwfl_thread_getframes)
+       (dwfl_frame_pc): New INTDECL entries.
+       * linux-proc-maps.c (dwfl_linux_proc_report): Call
+       __libdwfl_attach_state_for_pid.
+       * segment.c (segment_start): Rename to ...
+       (__libdwfl_segment_start): ... here and make it internal_function.
+       (segment_end): Rename to ...
+       (__libdwfl_segment_end): ... here and make it internal_function.
+       (reify_segments, dwfl_report_segment): Rename them at the callers.
+
+2013-11-07  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * core-file.c (dwfl_core_file_report): Remove the use of MAX.
+
+2013-11-07  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * core-file.c (dwfl_core_file_report): Replaced variable sniffed by
+       retval.  Fix one forgotten LISTED increase.
+
+2013-11-07  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Fix core files for re-prelink-ed files.
+       * core-file.c (dynamic_vaddr_get): New function.
+       (dwfl_core_file_report): New variable file_dynamic_vaddr.  Call
+       dynamic_vaddr_get instead of using L_ADDR.
+       * libdwflP.h (struct r_debug_info_module): Remove field l_addr.
+       * link_map.c (report_r_debug): Do not initialize l_addr.
+
+2013-11-07  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Code cleanup.
+       * core-file.c (dwfl_core_file_report): Reindent block of code by
+       continue keyword.
+
+2013-10-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * argp-std.c (parse_opt): Use executable parameter of
+       dwfl_core_file_report.
+       * core-file.c (dwfl_core_file_report): Add parameter executable.  Set
+       it to DWFL.  Add NEW_VERSION for it.
+       (_compat_without_executable_dwfl_core_file_report): New.  Twice.
+       * libdwfl.h (dwfl_core_file_report): Add parameter executable, update
+       the function comment.
+
+2013-10-15  Mark Wielaard  <mjw@redhat.com>
+
+       * linux-proc-maps.c (proc_maps_report): Ignore non-absolute file
+       mappings.
+       (dwfl_linux_proc_find_elf): Don't abort, just return failure.
+
+2013-09-12  Mark Wielaard  <mjw@redhat.com>
+
+       * cu.c (intern_cu): If dwarf_offdie fails free cu.
+
+2013-09-12  Mark Wielaard  <mjw@redhat.com>
+
+       * linux-proc-maps.c (proc_maps_report): Don't fclose FILE in
+       bad_report.
+
+2013-09-12  Mark Wielaard  <mjw@redhat.com>
+
+       * dwfl_module_getdwarf.c (find_symtab): Call elf_getdata with
+       aux_xndxscn, not xndxscn, for aux_symxndxdata.
+
+2013-08-25  Mark Wielaard  <mjw@redhat.com>
+
+       * linux-kernel-modules.c (report_kernel): Pass add_p_vaddr as true
+       to dwfl_report_elf.
+
+2013-07-25  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * dwfl_segment_report_module.c (dwfl_segment_report_module): Check for
+       conflicts all the modules, not just the first one.  Compare L_LD if it
+       is equal, not if it is in a module address range.
+
+2013-07-23  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * libdwflP.h (__libdwfl_elf_address_range): Add internal_function.
+
+2013-07-23  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * core-file.c (clear_r_debug_info): Close also ELF and FD.
+       (dwfl_core_file_report): Call __libdwfl_report_elf for
+       R_DEBUG_INFO.MODULE.
+       * dwfl_report_elf.c (__libdwfl_elf_address_range): New function from
+       code of ...
+       (__libdwfl_report_elf): ... this function.  Call it.
+       * dwfl_segment_report_module.c: Include unistd.h.
+       (dwfl_segment_report_module): Use basename for MODULE->NAME.
+       Clear MODULE if it has no build-id and we have segment with build-id.
+       Ignore this segment only if MODULE still contains valid ELF.
+       * libdwflP.h (__libdwfl_elf_address_range): New declaration.
+       (struct r_debug_info_module): New fields fd, elf, l_addr, start, end
+       and disk_file_has_build_id.
+       (dwfl_link_map_report): Extend the comment.
+       * link_map.c (report_r_debug): Extend the comment.  Always fill in new
+       r_debug_info_module.  Initialize also the new r_debug_info_module
+       fields.  Remove one FIXME comment.  Call __libdwfl_elf_address_range
+       instead of __libdwfl_report_elf when R_DEBUG_INFO is not NULL.
+
+2013-07-19  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * libdwflP.h (__libdwfl_find_elf_build_id): Add internal_function.
+
+2013-07-02  Mark Wielaard  <mjw@redhat.com>
+
+       * relocate.c (__libdwfl_relocate_value): Remove mod->e_type assert.
+
+2013-06-05  Mark Wielaard  <mjw@redhat.com>
+
+       * link_map.c (report_r_debug): Always call release_buffer after
+       memory_callback succeeded reading build_id.
+
+2013-05-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * argp-std.c (parse_opt) <ARGP_KEY_SUCCESS> <opt->core> <opt->e>: Set
+       executable_for_core before calling dwfl_core_file_report.
+       * core-file.c (clear_r_debug_info): New function.
+       (dwfl_core_file_report): Move raw segments reporting lower.  New
+       variable r_debug_info, pass it to dwfl_segment_report_module.  Call
+       clear_r_debug_info in the end.  Return sum of LISTED and SNIFFED.
+       * dwfl_module_build_id.c (check_notes): Move into
+       __libdwfl_find_elf_build_id.
+       (__libdwfl_find_build_id): Rename to ...
+       (__libdwfl_find_elf_build_id): ... here.  Add parameters build_id_bits,
+       build_id_elfaddr and build_id_len.  Verify MOD vs. ELF.
+       (__libdwfl_find_elf_build_id) (check_notes): Remove parameters mod and
+       set, rename data_vaddr to data_elfaddr.  Do not call found_build_id.
+       (__libdwfl_find_elf_build_id): Update the check_notes caller, do not
+       adjust its data_elfaddr parameter.
+       (__libdwfl_find_build_id): New wrapper of __libdwfl_find_elf_build_id.
+       * dwfl_segment_report_module.c (dwfl_segment_report_module): New
+       parameter r_debug_info.  New variable name_is_final.  Adjust addresses
+       according to R_DEBUG_INFO->MODULE.  Check conflicts against DWFL.
+       Do not overwrite NAME by SONAME if NAME_IS_FINAL.
+       * libdwflP.h (__libdwfl_find_elf_build_id): New declaration.
+       (struct r_debug_info_module, struct r_debug_info): New definitions.
+       (dwfl_segment_report_module, dwfl_link_map_report): Add parameter
+       r_debug_info.
+       * link_map.c: Include fcntl.h.
+       (report_r_debug): Add parameter r_debug_info, describe it in the
+       function comment.  Delete dwfl_addrmodule call and its dependent code.
+       Verify build-id before calling dwfl_report_elf, also supply
+       executable_for_core to it.  Store r_debug_info->module info when
+       appropriate.
+       (dwfl_link_map_report): Add parameter r_debug_info.  New variable
+       in_ok.  Try to read IN from EXECUTABLE_FOR_CORE.  Update report_r_debug
+       caller parameters.
+
+2013-04-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * dwfl_report_elf.c (__libdwfl_report_elf): Add parameter add_p_vaddr.
+       Set it to true for ET_EXEC and ET_CORE.  Provide alternative
+       setup of START and BIAS if !ADD_P_VADDR.  Set END from BIAS, not BASE.
+       (dwfl_report_elf): Add parameter add_p_vaddr.  Pass it down.  Add
+       NEW_VERSION.
+       (_compat_without_add_p_vaddr_dwfl_report_elf) <SHARED>: New, with
+       COMPAT_VERSION.
+       * libdwfl.h (dwfl_report_elf): Add parameter add_p_vaddr.  Describe it.
+       * libdwflP.h (__libdwfl_report_elf): Add parameter add_p_vaddr.
+       * link_map.c (report_r_debug): Use true add_p_vaddr for dwfl_report_elf.
+       * linux-kernel-modules.c (report_kernel): Use false add_p_vaddr for
+       dwfl_report_elf.
+       * offline.c (process_elf): Use true add_p_vaddr for dwfl_report_elf.
+
+2013-04-27  Mark Wielaard  <mjw@redhat.com>
+
+       * link_map.c: #include system.h.
+
+2013-04-26  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * link_map.c (BE32, BE64, LE32, LE64): Delete the definitions, move
+       them to lib/system.h.
+
+2013-04-24  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: Use AM_CPPFLAGS instead of INCLUDES.
+
+2013-03-20  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * dwfl_report_elf.c (__libdwfl_report_elf): Remove BASE aligning.
+
+2013-03-12  Mark Wielaard  <mjw@redhat.com>
+
+       * dwfl_getsrclines.c (dwfl_getsrclines): Return 0 on success.
+
+2013-02-22  Mark Wielaard  <mjw@redhat.com>
+
+       * open.c (__libdw_gunzip,__libdw_bunzip2,__libdw_unlzma): Define
+       as DWFL_E_BADELF when not used.
+
+2013-02-10  Mark Wielaard  <mjw@redhat.com>
+
+       * argp-std.c (parse_opt): Use opt->core and opt->e explicitly in
+       failure messages When handling ARGP_KEY_SUCCESS because arg will
+       not have been set.
+
+2013-01-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * linux-proc-maps.c: Include system.h.
+       (PROCEXEFMT, get_pid_class): New.
+       (grovel_auxv): Detect 32-bit vs. 64-bit auxv, possibly call
+       get_pid_class.
+
+2013-01-23  Mark Wielaard  <mjw@redhat.com>
+
+       * dwfl_module_getdwarf.c (find_aux_sym): Don't substract one
+       from aux_syments by default.
+       (find_symtab): Also succeed when only aux_symdata is found.
+       When no symtab is found always try to load auxiliary table.
+       (dwfl_module_getsymtab): Substract one from result when both
+       tables have symbols.
+       * dwfl_module_getsym.c (dwfl_module_getsym): Only skip auxiliary
+       zero entry when both tables have symbols.
+       * dwfl_module_addrsym.c (dwfl_module_addrsym): Only substract
+       one from first_global when both tables have symbols.
+
+2013-01-16  Mark Wielaard  <mjw@redhat.com>
+
+       * libdwflP.h (struct Dwfl_Module): Add aux_sym, aux_symdata,
+       aux_syments, aux_symstrdata, aux_symxndxdata and aux_first_global.
+       (dwfl_adjusted_aux_sym_addr): New function.
+       (dwfl_deadjust_aux_sym_addr): Likewise.
+       (dwfl_adjusted_st_value): Take and check symfile argument.
+       (dwfl_deadjust_st_value): Likewise.
+       * dwfl_module_getdwarf.c (find_prelink_address_sync): Take and
+       use dwfl_file as argument to set address_sync.
+       (find_debuginfo): Call find_prelink_address_sync with debug file.
+       (find_aux_sym): New function.
+       (find_symtab): Use find_aux_sym if all we have is the dynsym table
+       and fill in aux DwflModule fields.
+       (dwfl_module_getsymtab): Return syments plus aux_syments.
+       (load_symtab): Always set first_global.
+       * dwfl_module_addrsym.c (dwfl_module_addrsym): Check symfile
+       when using same_section. Calculate first_global based on both
+       mod->first_global and mod->aux_first_global.
+       * dwfl_module.c (__libdwfl_module_free): Free aux_sym.
+       * dwfl_module_getsym.c (dwfl_module_getsym): Use auxsym table
+       to retrieve symbol and name if necessary, making sure all locals
+       from any table come before any globals.
+       * dwfl_module_info.c (dwfl_module_info): Call dwfl_adjusted_st_value
+       with symfile.
+       * relocate.c (resolve_symbol): Likewise.
+
+2013-01-07  Roland McGrath  <roland@hack.frob.com>
+
+       * link_map.c (auxv_format_probe): Handle unaligned 64-bit data, but
+       still assume the data is at least 32-bit aligned anyway.
+       (dwfl_link_map_report): Handle unaligned auxv data.
+
+2012-12-11  Mark Wielaard  <mjw@redhat.com>
+
+       * linux-kernel-modules.c (report_kernel): Only free fname if
+       find_kernel_elf succeeds and allocates it.
+       (report_kernel_archive): Fix brackets around unlikely expression.
+
+2012-11-29  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * argp-std.c: Update Copyright year.
+       (offline_find_elf): New function.
+       (offline_callbacks): Use it for find_elf.
+       (struct parse_opt): New.
+       (parse_opt): New key ARGP_KEY_INIT.  In other make hook struct
+       parse_opt pointer from former Dwfl pointer.  Delay 'e and OPT_COREFILE
+       processing till ARGP_KEY_SUCCESS.  Initialize state->input already from
+       ARGP_KEY_SUCCESS.  Modify the cleanup in ARGP_KEY_ERROR.  Make the
+       final state->input initialization optional.
+       * dwfl_end.c: Update Copyright year.
+       (dwfl_end): Free executable_for_core.
+       * libdwflP.h: Update Copyright year.
+       (struct Dwfl): New field executable_for_core.
+
+2012-11-20  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * dwfl_report_elf.c (__libdwfl_report_elf): Simplify START and BIAS
+       calculation.
+
+2012-10-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * dwfl_module_getdwarf.c (mod_verify_build_id): New function with code
+       from ...
+       (__libdwfl_getelf): ... here.  Call it.
+
+2012-10-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * libdwfl.h (dwfl_module_getelf): Add __nonnull_attribute__.
+
+2012-10-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * dwfl_segment_report_module.c (dwfl_segment_report_module):
+       Initialize mod->MAIN_BIAS.
+
+2012-10-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * dwfl_module_addrsym.c (dwfl_module_addrsym): New function
+       binding_value.  Use it for both zero and non-zero size symbols
+       comparisons.
+
+2012-10-01  Mark Wielaard  <mjw@redhat.com>
+
+       * cu.c (cudie_offset): Don't use type_sig8, it might not be
+       initialized and these are always real CUs, never TUs.
+
+2012-10-01  Mark Wielaard  <mjw@redhat.com>
+
+       * derelocate.c (find_section): Check next section exists before
+       accessing it.
+
 2012-08-01  Petr Machata  <pmachata@redhat.com>
 
        * offline.c (process_archive_member): Ignore entry "/SYM64/".
index 0ef4928..72c980b 100644 (file)
@@ -2,7 +2,7 @@
 ##
 ## Process this file with automake to create Makefile.in
 ##
-## Copyright (C) 2005-2010 Red Hat, Inc.
+## Copyright (C) 2005-2010, 2013 Red Hat, Inc.
 ## This file is part of elfutils.
 ##
 ## This file is free software; you can redistribute it and/or modify
 ## not, see <http://www.gnu.org/licenses/>.
 ##
 include $(top_srcdir)/config/eu.am
-INCLUDES += -I$(srcdir) -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
-          -I$(srcdir)/../libdw
+AM_CPPFLAGS += -I$(srcdir) -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
+          -I$(srcdir)/../libdw -I$(srcdir)/../libdwelf
 VERSION = 1
 
 noinst_LIBRARIES = libdwfl.a
-if !MUDFLAP
 noinst_LIBRARIES += libdwfl_pic.a
-endif
 
 pkginclude_HEADERS = libdwfl.h
 
@@ -68,7 +66,9 @@ libdwfl_a_SOURCES = dwfl_begin.c dwfl_end.c dwfl_error.c dwfl_version.c \
                    dwfl_module_return_value_location.c \
                    dwfl_module_register_names.c \
                    dwfl_segment_report_module.c \
-                   link_map.c core-file.c open.c image-header.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
 
 if ZLIB
 libdwfl_a_SOURCES += gzip.c
@@ -80,22 +80,14 @@ if LZMA
 libdwfl_a_SOURCES += lzma.c
 endif
 
-if MUDFLAP
-libdwfl = libdwfl.a $(libdw) $(libebl) $(libelf) $(libeu)
-libdw = ../libdw/libdw.a
-libelf = ../libelf/libelf.a
-else
 libdwfl = $(libdw)
 libdw = ../libdw/libdw.so
 libelf = ../libelf/libelf.so
-endif
 libebl = ../libebl/libebl.a
 libeu = ../lib/libeu.a
 
-if !MUDFLAP
 libdwfl_pic_a_SOURCES =
 am_libdwfl_pic_a_OBJECTS = $(libdwfl_a_SOURCES:.c=.os)
-endif
 
 noinst_HEADERS = libdwflP.h
 
index 99f4090..37ea652 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -35,18 +79,16 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
-       $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-       $(top_srcdir)/config/eu.am ChangeLog
-@MUDFLAP_TRUE@am__append_1 = -fmudflap
-@MUDFLAP_FALSE@am__append_2 = libdwfl_pic.a
-@ZLIB_TRUE@am__append_3 = gzip.c
-@BZLIB_TRUE@am__append_4 = bzip2.c
-@LZMA_TRUE@am__append_5 = lzma.c
-@MUDFLAP_TRUE@am_libdwfl_pic_a_OBJECTS =
+DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \
+       $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \
+       $(noinst_HEADERS) $(pkginclude_HEADERS) ChangeLog
+@ZLIB_TRUE@am__append_1 = gzip.c
+@BZLIB_TRUE@am__append_2 = bzip2.c
+@LZMA_TRUE@am__append_3 = lzma.c
 subdir = libdwfl
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
        $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/zip.m4 \
        $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
@@ -56,8 +98,11 @@ CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 LIBRARIES = $(noinst_LIBRARIES)
-AR = ar
 ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
 libdwfl_a_AR = $(AR) $(ARFLAGS)
 libdwfl_a_LIBADD =
 am__libdwfl_a_SOURCES_DIST = dwfl_begin.c dwfl_end.c dwfl_error.c \
@@ -79,8 +124,9 @@ am__libdwfl_a_SOURCES_DIST = dwfl_begin.c dwfl_end.c dwfl_error.c \
        dwfl_module_getsym.c dwfl_module_addrname.c \
        dwfl_module_addrsym.c dwfl_module_return_value_location.c \
        dwfl_module_register_names.c dwfl_segment_report_module.c \
-       link_map.c core-file.c open.c image-header.c gzip.c bzip2.c \
-       lzma.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 bzip2.c lzma.c
 @ZLIB_TRUE@am__objects_1 = gzip.$(OBJEXT)
 @BZLIB_TRUE@am__objects_2 = bzip2.$(OBJEXT)
 @LZMA_TRUE@am__objects_3 = lzma.$(OBJEXT)
@@ -114,21 +160,49 @@ am_libdwfl_a_OBJECTS = dwfl_begin.$(OBJEXT) dwfl_end.$(OBJEXT) \
        dwfl_module_register_names.$(OBJEXT) \
        dwfl_segment_report_module.$(OBJEXT) link_map.$(OBJEXT) \
        core-file.$(OBJEXT) open.$(OBJEXT) image-header.$(OBJEXT) \
+       dwfl_frame.$(OBJEXT) frame_unwind.$(OBJEXT) \
+       dwfl_frame_pc.$(OBJEXT) linux-pid-attach.$(OBJEXT) \
+       linux-core-attach.$(OBJEXT) dwfl_frame_regs.$(OBJEXT) \
        $(am__objects_1) $(am__objects_2) $(am__objects_3)
 libdwfl_a_OBJECTS = $(am_libdwfl_a_OBJECTS)
 libdwfl_pic_a_AR = $(AR) $(ARFLAGS)
 libdwfl_pic_a_LIBADD =
 libdwfl_pic_a_OBJECTS = $(am_libdwfl_pic_a_OBJECTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/config/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
 SOURCES = $(libdwfl_a_SOURCES) $(libdwfl_pic_a_SOURCES)
 DIST_SOURCES = $(am__libdwfl_a_SOURCES_DIST) $(libdwfl_pic_a_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -158,18 +232,39 @@ am__uninstall_files_from_dir = { \
   }
 am__installdirs = "$(DESTDIR)$(pkgincludedir)"
 HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
+CC_BIARCH = @CC_BIARCH@
 CFLAGS = @CFLAGS@
+CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEBUGPRED = @DEBUGPRED@
@@ -178,10 +273,13 @@ DEPDIR = @DEPDIR@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_VALGRIND = @HAVE_VALGRIND@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -202,6 +300,7 @@ MODVERSION = @MODVERSION@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
+NM = @NM@
 OBJEXT = @OBJEXT@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -212,6 +311,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+READELF = @READELF@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
@@ -226,6 +326,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -275,22 +376,18 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 zip_LIBS = @zip_LIBS@
-INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. -I$(srcdir) \
+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. -I$(srcdir) \
        -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
-       -I$(srcdir)/../libdw
-AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \
-       $($(*F)_no_Werror),,-Werror) $(if \
-       $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \
-       $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \
-       $(am__append_1)
-@MUDFLAP_FALSE@libmudflap = 
-@MUDFLAP_TRUE@libmudflap = -lmudflap
-COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\
-                         $(COMPILE))
+       -I$(srcdir)/../libdw -I$(srcdir)/../libdwelf
+AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \
+           $(if $($(*F)_no_Werror),,-Werror) \
+           $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \
+           $($(*F)_CFLAGS)
 
+COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE))
 CLEANFILES = *.gcno *.gcda $(am_libdwfl_pic_a_OBJECTS)
-textrel_check = if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
-noinst_LIBRARIES = libdwfl.a $(am__append_2)
+textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
+noinst_LIBRARIES = libdwfl.a libdwfl_pic.a
 pkginclude_HEADERS = libdwfl.h
 libdwfl_a_SOURCES = dwfl_begin.c dwfl_end.c dwfl_error.c \
        dwfl_version.c dwfl_module.c dwfl_report_elf.c relocate.c \
@@ -311,18 +408,17 @@ libdwfl_a_SOURCES = dwfl_begin.c dwfl_end.c dwfl_error.c \
        dwfl_module_getsym.c dwfl_module_addrname.c \
        dwfl_module_addrsym.c dwfl_module_return_value_location.c \
        dwfl_module_register_names.c dwfl_segment_report_module.c \
-       link_map.c core-file.c open.c image-header.c $(am__append_3) \
-       $(am__append_4) $(am__append_5)
-@MUDFLAP_FALSE@libdwfl = $(libdw)
-@MUDFLAP_TRUE@libdwfl = libdwfl.a $(libdw) $(libebl) $(libelf) $(libeu)
-@MUDFLAP_FALSE@libdw = ../libdw/libdw.so
-@MUDFLAP_TRUE@libdw = ../libdw/libdw.a
-@MUDFLAP_FALSE@libelf = ../libelf/libelf.so
-@MUDFLAP_TRUE@libelf = ../libelf/libelf.a
+       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 $(am__append_1) \
+       $(am__append_2) $(am__append_3)
+libdwfl = $(libdw)
+libdw = ../libdw/libdw.so
+libelf = ../libelf/libelf.so
 libebl = ../libebl/libebl.a
 libeu = ../lib/libeu.a
-@MUDFLAP_FALSE@libdwfl_pic_a_SOURCES = 
-@MUDFLAP_FALSE@am_libdwfl_pic_a_OBJECTS = $(libdwfl_a_SOURCES:.c=.os)
+libdwfl_pic_a_SOURCES = 
+am_libdwfl_pic_a_OBJECTS = $(libdwfl_a_SOURCES:.c=.os)
 noinst_HEADERS = libdwflP.h
 all: all-am
 
@@ -362,14 +458,16 @@ $(am__aclocal_m4_deps):
 
 clean-noinstLIBRARIES:
        -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
 libdwfl.a: $(libdwfl_a_OBJECTS) $(libdwfl_a_DEPENDENCIES) $(EXTRA_libdwfl_a_DEPENDENCIES) 
-       -rm -f libdwfl.a
-       $(libdwfl_a_AR) libdwfl.a $(libdwfl_a_OBJECTS) $(libdwfl_a_LIBADD)
-       $(RANLIB) libdwfl.a
+       $(AM_V_at)-rm -f libdwfl.a
+       $(AM_V_AR)$(libdwfl_a_AR) libdwfl.a $(libdwfl_a_OBJECTS) $(libdwfl_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libdwfl.a
+
 libdwfl_pic.a: $(libdwfl_pic_a_OBJECTS) $(libdwfl_pic_a_DEPENDENCIES) $(EXTRA_libdwfl_pic_a_DEPENDENCIES) 
-       -rm -f libdwfl_pic.a
-       $(libdwfl_pic_a_AR) libdwfl_pic.a $(libdwfl_pic_a_OBJECTS) $(libdwfl_pic_a_LIBADD)
-       $(RANLIB) libdwfl_pic.a
+       $(AM_V_at)-rm -f libdwfl_pic.a
+       $(AM_V_AR)$(libdwfl_pic_a_AR) libdwfl_pic.a $(libdwfl_pic_a_OBJECTS) $(libdwfl_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libdwfl_pic.a
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -392,6 +490,9 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwfl_dwarf_line.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwfl_end.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwfl_error.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwfl_frame.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwfl_frame_pc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwfl_frame_regs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwfl_getdwarf.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwfl_getmodules.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwfl_getsrc.Po@am__quote@
@@ -425,13 +526,16 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwfl_version.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf-from-memory.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/find-debuginfo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frame_unwind.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gzip.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/image-header.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdwfl_crc32.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libdwfl_crc32_file.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lines.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/link_map.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linux-core-attach.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linux-kernel-modules.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linux-pid-attach.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linux-proc-maps.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lzma.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/offline.Po@am__quote@
@@ -440,22 +544,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/segment.Po@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
 
 .c.obj:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
 install-pkgincludeHEADERS: $(pkginclude_HEADERS)
        @$(NORMAL_INSTALL)
-       test -z "$(pkgincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)"
        @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -471,26 +578,15 @@ uninstall-pkgincludeHEADERS:
        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
        dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
 
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -502,15 +598,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -519,6 +611,21 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -662,18 +769,19 @@ uninstall-am: uninstall-pkgincludeHEADERS
 
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-       clean-noinstLIBRARIES ctags distclean distclean-compile \
-       distclean-generic distclean-tags distdir dvi dvi-am html \
-       html-am info info-am install install-am install-data \
-       install-data-am install-dvi install-dvi-am install-exec \
-       install-exec-am install-html install-html-am install-info \
-       install-info-am install-man install-pdf install-pdf-am \
-       install-pkgincludeHEADERS install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
-       mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
-       tags uninstall uninstall-am uninstall-pkgincludeHEADERS
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+       clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \
+       distclean-compile distclean-generic distclean-tags distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
+       install-info install-info-am install-man install-pdf \
+       install-pdf-am install-pkgincludeHEADERS install-ps \
+       install-ps-am install-strip installcheck installcheck-am \
+       installdirs maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
+       ps ps-am tags tags-am uninstall uninstall-am \
+       uninstall-pkgincludeHEADERS
 
 
 %.os: %.c %.o
index 2ef4555..42b7e78 100644 (file)
@@ -1,5 +1,5 @@
 /* Standard argp argument parsers for tools using libdwfl.
-   Copyright (C) 2005-2010 Red Hat, Inc.
+   Copyright (C) 2005-2010, 2012 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -90,6 +90,16 @@ static const Dwfl_Callbacks kernel_callbacks =
     .section_address = INTUSE(dwfl_linux_kernel_module_section_address),
   };
 
+/* Structure held at state->HOOK.  */
+struct parse_opt
+{
+  Dwfl *dwfl;
+  /* The -e|--executable parameter.  */
+  const char *e;
+  /* The --core parameter.  */
+  const char *core;
+};
+
 static error_t
 parse_opt (int key, char *arg, struct argp_state *state)
 {
@@ -111,152 +121,145 @@ parse_opt (int key, char *arg, struct argp_state *state)
 
   switch (key)
     {
+    case ARGP_KEY_INIT:
+      {
+       assert (state->hook == NULL);
+       struct parse_opt *opt = calloc (1, sizeof (*opt));
+       if (opt == NULL)
+         failure (NULL, DWFL_E_ERRNO, "calloc");
+       state->hook = opt;
+      }
+      break;
+
     case OPT_DEBUGINFO:
       debuginfo_path = arg;
       break;
 
     case 'e':
       {
-       Dwfl *dwfl = state->hook;
+       struct parse_opt *opt = state->hook;
+       Dwfl *dwfl = opt->dwfl;
        if (dwfl == NULL)
          {
            dwfl = INTUSE(dwfl_begin) (&offline_callbacks);
            if (dwfl == NULL)
              return fail (dwfl, -1, arg);
-           state->hook = dwfl;
+           opt->dwfl = dwfl;
 
            /* Start at zero so if there is just one -e foo.so,
               the DSO is shown without address bias.  */
            dwfl->offline_next_address = 0;
          }
-       if (dwfl->callbacks == &offline_callbacks)
-         {
-           if (INTUSE(dwfl_report_offline) (dwfl, "", arg, -1) == NULL)
-             return fail (dwfl, -1, arg);
-           state->hook = dwfl;
-         }
-       else
+       if (dwfl->callbacks != &offline_callbacks)
          {
          toomany:
            argp_error (state, "%s",
                        _("only one of -e, -p, -k, -K, or --core allowed"));
            return EINVAL;
          }
+       opt->e = arg;
       }
       break;
 
     case 'p':
-      if (state->hook == NULL)
-       {
-         Dwfl *dwfl = INTUSE(dwfl_begin) (&proc_callbacks);
-         int result = INTUSE(dwfl_linux_proc_report) (dwfl, atoi (arg));
-         if (result != 0)
-           return fail (dwfl, result, arg);
-         state->hook = dwfl;
-       }
-      else
-       goto toomany;
+      {
+       struct parse_opt *opt = state->hook;
+       if (opt->dwfl == NULL)
+         {
+           Dwfl *dwfl = INTUSE(dwfl_begin) (&proc_callbacks);
+           int result = INTUSE(dwfl_linux_proc_report) (dwfl, atoi (arg));
+           if (result != 0)
+             return fail (dwfl, result, arg);
+
+           /* Non-fatal to not be able to attach to process, ignore error.  */
+           INTUSE(dwfl_linux_proc_attach) (dwfl, atoi (arg), false);
+
+           opt->dwfl = dwfl;
+         }
+       else
+         goto toomany;
+      }
       break;
 
     case 'M':
-      if (state->hook == NULL)
-       {
-         FILE *f = fopen (arg, "r");
-         if (f == NULL)
-         nofile:
-           {
-             int code = errno;
-             argp_failure (state, EXIT_FAILURE, code,
-                           "cannot open '%s'", arg);
-             return code;
-           }
-         Dwfl *dwfl = INTUSE(dwfl_begin) (&proc_callbacks);
-         int result = INTUSE(dwfl_linux_proc_maps_report) (dwfl, f);
-         fclose (f);
-         if (result != 0)
-           return fail (dwfl, result, arg);
-         state->hook = dwfl;
-       }
-      else
-       goto toomany;
+      {
+       struct parse_opt *opt = state->hook;
+       if (opt->dwfl == NULL)
+         {
+           FILE *f = fopen (arg, "r");
+           if (f == NULL)
+             {
+               int code = errno;
+               argp_failure (state, EXIT_FAILURE, code,
+                             "cannot open '%s'", arg);
+               return code;
+             }
+           Dwfl *dwfl = INTUSE(dwfl_begin) (&proc_callbacks);
+           int result = INTUSE(dwfl_linux_proc_maps_report) (dwfl, f);
+           fclose (f);
+           if (result != 0)
+             return fail (dwfl, result, arg);
+           opt->dwfl = dwfl;
+         }
+       else
+         goto toomany;
+      }
       break;
 
     case OPT_COREFILE:
       {
-       Dwfl *dwfl = state->hook;
+       struct parse_opt *opt = state->hook;
+       Dwfl *dwfl = opt->dwfl;
        if (dwfl == NULL)
-         state->hook = dwfl = INTUSE(dwfl_begin) (&offline_callbacks);
+         opt->dwfl = dwfl = INTUSE(dwfl_begin) (&offline_callbacks);
        /* Permit -e and --core together.  */
        else if (dwfl->callbacks != &offline_callbacks)
          goto toomany;
-
-       int fd = open64 (arg, O_RDONLY);
-       if (fd < 0)
-         goto nofile;
-
-       Elf *core;
-       Dwfl_Error error = __libdw_open_file (&fd, &core, true, false);
-       if (error != DWFL_E_NOERROR)
-         {
-           argp_failure (state, EXIT_FAILURE, 0,
-                         _("cannot read ELF core file: %s"),
-                         INTUSE(dwfl_errmsg) (error));
-           return error == DWFL_E_ERRNO ? errno : EIO;
-         }
-
-       int result = INTUSE(dwfl_core_file_report) (dwfl, core);
-       if (result < 0)
-         {
-           elf_end (core);
-           close (fd);
-           return fail (dwfl, result, arg);
-         }
-
-       /* From now we leak FD and CORE.  */
-
-       if (result == 0)
-         {
-           argp_failure (state, EXIT_FAILURE, 0,
-                         _("No modules recognized in core file"));
-           return ENOENT;
-         }
+       opt->core = arg;
       }
       break;
 
     case 'k':
-      if (state->hook == NULL)
-       {
-         Dwfl *dwfl = INTUSE(dwfl_begin) (&kernel_callbacks);
-         int result = INTUSE(dwfl_linux_kernel_report_kernel) (dwfl);
-         if (result != 0)
-           return fail (dwfl, result, _("cannot load kernel symbols"));
-         result = INTUSE(dwfl_linux_kernel_report_modules) (dwfl);
-         if (result != 0)
-           /* Non-fatal to have no modules since we do have the kernel.  */
-           failure (dwfl, result, _("cannot find kernel modules"));
-         state->hook = dwfl;
-       }
-      else
-       goto toomany;
+      {
+       struct parse_opt *opt = state->hook;
+       if (opt->dwfl == NULL)
+         {
+           Dwfl *dwfl = INTUSE(dwfl_begin) (&kernel_callbacks);
+           int result = INTUSE(dwfl_linux_kernel_report_kernel) (dwfl);
+           if (result != 0)
+             return fail (dwfl, result, _("cannot load kernel symbols"));
+           result = INTUSE(dwfl_linux_kernel_report_modules) (dwfl);
+           if (result != 0)
+             /* Non-fatal to have no modules since we do have the kernel.  */
+             failure (dwfl, result, _("cannot find kernel modules"));
+           opt->dwfl = dwfl;
+         }
+       else
+         goto toomany;
+      }
       break;
 
     case 'K':
-      if (state->hook == NULL)
-       {
-         Dwfl *dwfl = INTUSE(dwfl_begin) (&offline_callbacks);
-         int result = INTUSE(dwfl_linux_kernel_report_offline) (dwfl, arg,
-                                                                NULL);
-         if (result != 0)
-           return fail (dwfl, result, _("cannot find kernel or modules"));
-         state->hook = dwfl;
-       }
-      else
-       goto toomany;
+      {
+       struct parse_opt *opt = state->hook;
+       if (opt->dwfl == NULL)
+         {
+           Dwfl *dwfl = INTUSE(dwfl_begin) (&offline_callbacks);
+           int result = INTUSE(dwfl_linux_kernel_report_offline) (dwfl, arg,
+                                                                  NULL);
+           if (result != 0)
+             return fail (dwfl, result, _("cannot find kernel or modules"));
+           opt->dwfl = dwfl;
+         }
+       else
+         goto toomany;
+      }
       break;
 
     case ARGP_KEY_SUCCESS:
       {
-       Dwfl *dwfl = state->hook;
+       struct parse_opt *opt = state->hook;
+       Dwfl *dwfl = opt->dwfl;
 
        if (dwfl == NULL)
          {
@@ -265,7 +268,54 @@ parse_opt (int key, char *arg, struct argp_state *state)
            dwfl = INTUSE(dwfl_begin) (&offline_callbacks);
            if (INTUSE(dwfl_report_offline) (dwfl, "", arg, -1) == NULL)
              return fail (dwfl, -1, arg);
-           state->hook = dwfl;
+           opt->dwfl = dwfl;
+         }
+
+       if (opt->core)
+         {
+           int fd = open64 (opt->core, O_RDONLY);
+           if (fd < 0)
+             {
+               int code = errno;
+               argp_failure (state, EXIT_FAILURE, code,
+                             "cannot open '%s'", opt->core);
+               return code;
+             }
+
+           Elf *core;
+           Dwfl_Error error = __libdw_open_file (&fd, &core, true, false);
+           if (error != DWFL_E_NOERROR)
+             {
+               argp_failure (state, EXIT_FAILURE, 0,
+                             _("cannot read ELF core file: %s"),
+                             INTUSE(dwfl_errmsg) (error));
+               return error == DWFL_E_ERRNO ? errno : EIO;
+             }
+
+           int result = INTUSE(dwfl_core_file_report) (dwfl, core, opt->e);
+           if (result < 0)
+             {
+               elf_end (core);
+               close (fd);
+               return fail (dwfl, result, opt->core);
+             }
+
+           /* Non-fatal to not be able to attach to core, ignore error.  */
+           INTUSE(dwfl_core_file_attach) (dwfl, core);
+
+           /* From now we leak FD and CORE.  */
+
+           if (result == 0)
+             {
+               argp_failure (state, EXIT_FAILURE, 0,
+                             _("No modules recognized in core file"));
+               return ENOENT;
+             }
+         }
+       else if (opt->e)
+         {
+           if (INTUSE(dwfl_report_offline) (dwfl, "", opt->e, -1) == NULL)
+             return fail (dwfl, -1, opt->e);
          }
 
        /* One of the three flavors has done dwfl_begin and some reporting
@@ -274,12 +324,22 @@ parse_opt (int key, char *arg, struct argp_state *state)
 
        int result = INTUSE(dwfl_report_end) (dwfl, NULL, NULL);
        assert (result == 0);
+
+       /* Update the input all along, so a parent parser can see it.
+          As we free OPT the update below will be no longer active.  */
+       *(Dwfl **) state->input = dwfl;
+       free (opt);
+       state->hook = NULL;
       }
       break;
 
     case ARGP_KEY_ERROR:
-      dwfl_end (state->hook);
-      state->hook = NULL;
+      {
+       struct parse_opt *opt = state->hook;
+       dwfl_end (opt->dwfl);
+       free (opt);
+       state->hook = NULL;
+      }
       break;
 
     default:
@@ -287,7 +347,10 @@ parse_opt (int key, char *arg, struct argp_state *state)
     }
 
   /* Update the input all along, so a parent parser can see it.  */
-  *(Dwfl **) state->input = state->hook;
+  struct parse_opt *opt = state->hook;
+  if (opt)
+    *(Dwfl **) state->input = opt->dwfl;
+
   return 0;
 }
 
@@ -299,15 +362,3 @@ dwfl_standard_argp (void)
 {
   return &libdwfl_argp;
 }
-
-#ifdef _MUDFLAP
-/* In the absence of a mudflap wrapper for argp_parse, or a libc compiled
-   with -fmudflap, we'll see spurious errors for using the struct argp_state
-   on argp_parse's stack.  */
-
-void __attribute__ ((constructor))
-__libdwfl_argp_mudflap_options (void)
-{
-  __mf_set_options ("-heur-stack-bound");
-}
-#endif
index 1545ca8..4ce63c4 100644 (file)
@@ -1,5 +1,5 @@
 /* Core file handling.
-   Copyright (C) 2008-2010 Red Hat, Inc.
+   Copyright (C) 2008-2010, 2013 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -381,8 +381,46 @@ dwfl_elf_phdr_memory_callback (Dwfl *dwfl, int ndx,
   return true;
 }
 
+/* Free the contents of R_DEBUG_INFO without the R_DEBUG_INFO memory itself.  */
+
+static void
+clear_r_debug_info (struct r_debug_info *r_debug_info)
+{
+  while (r_debug_info->module != NULL)
+    {
+      struct r_debug_info_module *module = r_debug_info->module;
+      r_debug_info->module = module->next;
+      elf_end (module->elf);
+      if (module->fd != -1)
+       close (module->fd);
+      free (module);
+    }
+}
+
+bool
+internal_function
+__libdwfl_dynamic_vaddr_get (Elf *elf, GElf_Addr *vaddrp)
+{
+  size_t phnum;
+  if (unlikely (elf_getphdrnum (elf, &phnum) != 0))
+    return false;
+  for (size_t i = 0; i < phnum; ++i)
+    {
+      GElf_Phdr phdr_mem;
+      GElf_Phdr *phdr = gelf_getphdr (elf, i, &phdr_mem);
+      if (unlikely (phdr == NULL))
+       return false;
+      if (phdr->p_type == PT_DYNAMIC)
+       {
+         *vaddrp = phdr->p_vaddr;
+         return true;
+       }
+    }
+  return false;
+}
+
 int
-dwfl_core_file_report (Dwfl *dwfl, Elf *elf)
+dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable)
 {
   size_t phnum;
   if (unlikely (elf_getphdrnum (elf, &phnum) != 0))
@@ -391,32 +429,25 @@ dwfl_core_file_report (Dwfl *dwfl, Elf *elf)
       return -1;
     }
 
+  free (dwfl->executable_for_core);
+  if (executable == NULL)
+    dwfl->executable_for_core = NULL;
+  else
+    {
+      dwfl->executable_for_core = strdup (executable);
+      if (dwfl->executable_for_core == NULL)
+       {
+         __libdwfl_seterrno (DWFL_E_NOMEM);
+         return -1;
+       }
+    }
+
   /* First report each PT_LOAD segment.  */
   GElf_Phdr notes_phdr;
   int ndx = dwfl_report_core_segments (dwfl, elf, phnum, &notes_phdr);
   if (unlikely (ndx <= 0))
     return ndx;
 
-  /* Now sniff segment contents for modules.  */
-  int sniffed = 0;
-  ndx = 0;
-  do
-    {
-      int seg = dwfl_segment_report_module (dwfl, ndx, NULL,
-                                           &dwfl_elf_phdr_memory_callback, elf,
-                                           core_file_read_eagerly, elf);
-      if (unlikely (seg < 0))
-       return seg;
-      if (seg > ndx)
-       {
-         ndx = seg;
-         ++sniffed;
-       }
-      else
-       ++ndx;
-    }
-  while (ndx < (int) phnum);
-
   /* Next, we should follow the chain from DT_DEBUG.  */
 
   const void *auxv = NULL;
@@ -451,13 +482,99 @@ dwfl_core_file_report (Dwfl *dwfl, Elf *elf)
   /* Now we have NT_AUXV contents.  From here on this processing could be
      used for a live process with auxv read from /proc.  */
 
-  int listed = dwfl_link_map_report (dwfl, auxv, auxv_size,
-                                    dwfl_elf_phdr_memory_callback, elf);
+  struct r_debug_info r_debug_info;
+  memset (&r_debug_info, 0, sizeof r_debug_info);
+  int retval = dwfl_link_map_report (dwfl, auxv, auxv_size,
+                                    dwfl_elf_phdr_memory_callback, elf,
+                                    &r_debug_info);
+  int listed = retval > 0 ? retval : 0;
+
+  /* Now sniff segment contents for modules hinted by information gathered
+     from DT_DEBUG.  */
+
+  ndx = 0;
+  do
+    {
+      int seg = dwfl_segment_report_module (dwfl, ndx, NULL,
+                                           &dwfl_elf_phdr_memory_callback, elf,
+                                           core_file_read_eagerly, elf,
+                                           &r_debug_info);
+      if (unlikely (seg < 0))
+       {
+         clear_r_debug_info (&r_debug_info);
+         return seg;
+       }
+      if (seg > ndx)
+       {
+         ndx = seg;
+         ++listed;
+       }
+      else
+       ++ndx;
+    }
+  while (ndx < (int) phnum);
+
+  /* Now report the modules from dwfl_link_map_report which were not filtered
+     out by dwfl_segment_report_module.  */
+
+  Dwfl_Module **lastmodp = &dwfl->modulelist;
+  while (*lastmodp != NULL)
+    lastmodp = &(*lastmodp)->next;
+  for (struct r_debug_info_module *module = r_debug_info.module;
+       module != NULL; module = module->next)
+    {
+      if (module->elf == NULL)
+       continue;
+      GElf_Addr file_dynamic_vaddr;
+      if (! __libdwfl_dynamic_vaddr_get (module->elf, &file_dynamic_vaddr))
+       continue;
+      Dwfl_Module *mod;
+      mod = __libdwfl_report_elf (dwfl, basename (module->name), module->name,
+                                 module->fd, module->elf,
+                                 module->l_ld - file_dynamic_vaddr,
+                                 true, true);
+      if (mod == NULL)
+       continue;
+      ++listed;
+      module->elf = NULL;
+      module->fd = -1;
+      /* Move this module to the end of the list, so that we end
+        up with a list in the same order as the link_map chain.  */
+      if (mod->next != NULL)
+       {
+         if (*lastmodp != mod)
+           {
+             lastmodp = &dwfl->modulelist;
+             while (*lastmodp != mod)
+               lastmodp = &(*lastmodp)->next;
+           }
+         *lastmodp = mod->next;
+         mod->next = NULL;
+         while (*lastmodp != NULL)
+           lastmodp = &(*lastmodp)->next;
+         *lastmodp = mod;
+       }
+      lastmodp = &mod->next;
+    }
+
+  clear_r_debug_info (&r_debug_info);
 
   /* We return the number of modules we found if we found any.
      If we found none, we return -1 instead of 0 if there was an
-     error rather than just nothing found.  If link_map handling
-     failed, we still have the sniffed modules.  */
-  return sniffed == 0 || listed > sniffed ? listed : sniffed;
+     error rather than just nothing found.  */
+  return listed > 0 ? listed : retval;
 }
 INTDEF (dwfl_core_file_report)
+NEW_VERSION (dwfl_core_file_report, ELFUTILS_0.158)
+
+#ifdef SHARED
+int _compat_without_executable_dwfl_core_file_report (Dwfl *dwfl, Elf *elf);
+COMPAT_VERSION_NEWPROTO (dwfl_core_file_report, ELFUTILS_0.146,
+                        without_executable)
+
+int
+_compat_without_executable_dwfl_core_file_report (Dwfl *dwfl, Elf *elf)
+{
+  return dwfl_core_file_report (dwfl, elf, NULL);
+}
+#endif
index 2e98568..40b0201 100644 (file)
@@ -151,8 +151,12 @@ less_lazy (Dwfl_Module *mod)
 static inline Dwarf_Off
 cudie_offset (const struct dwfl_cu *cu)
 {
+  /* These are real CUs, so there never is a type_sig8.  Note
+     initialization of dwkey.start and offset_size in intern_cu ()
+     to see why this calculates the same value for both key and
+     die.cu search items.  */
   return DIE_OFFSET_FROM_CU_OFFSET (cu->die.cu->start, cu->die.cu->offset_size,
-                                   cu->die.cu->type_sig8 != 0);
+                                   0);
 }
 
 static int
@@ -200,7 +204,10 @@ intern_cu (Dwfl_Module *mod, Dwarf_Off cuoff, struct dwfl_cu **result)
          /* XXX use non-searching lookup */
          Dwarf_Die *die = INTUSE(dwarf_offdie) (mod->dw, cuoff, &cu->die);
          if (die == NULL)
-           return DWFL_E_LIBDW;
+           {
+             free (cu);
+             return DWFL_E_LIBDW;
+           }
          assert (die == &cu->die);
 
          struct dwfl_cu **newvec = realloc (mod->cu, ((mod->ncu + 1)
index e3fcba8..da67908 100644 (file)
@@ -1,5 +1,5 @@
 /* Recover relocatibility for addresses computed from debug information.
-   Copyright (C) 2005-2010 Red Hat, Inc.
+   Copyright (C) 2005-2010, 2013 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -317,7 +317,7 @@ find_section (Dwfl_Module *mod, Dwarf_Addr *addr)
             inside the next one.  A section limit address can appear in
             line records.  */
          if (*addr == sections->refs[idx].end
-             && idx < sections->count
+             && idx + 1 < sections->count
              && *addr == sections->refs[idx + 1].start)
            ++idx;
 
@@ -330,6 +330,17 @@ find_section (Dwfl_Module *mod, Dwarf_Addr *addr)
   return -1;
 }
 
+size_t
+internal_function
+__libdwfl_find_section_ndx (Dwfl_Module *mod, Dwarf_Addr *addr)
+{
+  int idx = find_section (mod, addr);
+  if (unlikely (idx == -1))
+    return SHN_UNDEF;
+
+  return elf_ndxscn (mod->reloc_info->refs[idx].scn);
+}
+
 int
 dwfl_module_relocate_address (Dwfl_Module *mod, Dwarf_Addr *addr)
 {
index a955735..f1c64bc 100644 (file)
@@ -1,5 +1,5 @@
 /* Find the debuginfo file for a module from its build ID.
-   Copyright (C) 2007, 2009 Red Hat, Inc.
+   Copyright (C) 2007, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -41,10 +41,61 @@ dwfl_build_id_find_debuginfo (Dwfl_Module *mod,
                              char **debuginfo_file_name)
 {
   int fd = -1;
+
+  /* Are we looking for a separate debug file for the main file or for
+     an alternate (dwz multi) debug file?  Alternatively we could check
+     whether the dwbias == -1.  */
+  if (mod->dw != NULL)
+    {
+      const void *build_id;
+      const char *altname;
+      ssize_t build_id_len = INTUSE(dwelf_dwarf_gnu_debugaltlink) (mod->dw,
+                                                                  &altname,
+                                                                  &build_id);
+      if (build_id_len > 0)
+       fd = __libdwfl_open_by_build_id (mod, true, debuginfo_file_name,
+                                        build_id_len, build_id);
+
+      if (fd >= 0)
+       {
+         /* We need to open an Elf handle on the file so we can check its
+            build ID note for validation.  Backdoor the handle into the
+            module data structure since we had to open it early anyway.  */
+         Dwfl_Error error = __libdw_open_file (&fd, &mod->alt_elf,
+                                               true, false);
+         if (error != DWFL_E_NOERROR)
+           __libdwfl_seterrno (error);
+         else
+           {
+             const void *alt_build_id;
+             ssize_t alt_len = INTUSE(dwelf_elf_gnu_build_id) (mod->alt_elf,
+                                                               &alt_build_id);
+             if (alt_len > 0 && alt_len == build_id_len
+                 && memcmp (build_id, alt_build_id, alt_len) == 0)
+               return fd;
+             else
+               {
+                 /* A mismatch!  */
+                 elf_end (mod->alt_elf);
+                 mod->alt_elf = NULL;
+                 close (fd);
+                 fd = -1;
+               }
+             free (*debuginfo_file_name);
+             *debuginfo_file_name = NULL;
+             errno = 0;
+           }
+       }
+      return fd;
+    }
+
+  /* We don't even have the Dwarf yet and it isn't in the main file.
+     Try to find separate debug file now using the module build id.  */
   const unsigned char *bits;
   GElf_Addr vaddr;
+
   if (INTUSE(dwfl_module_build_id) (mod, &bits, &vaddr) > 0)
-    fd = __libdwfl_open_by_build_id (mod, true, debuginfo_file_name);
+    fd = __libdwfl_open_mod_by_build_id (mod, true, debuginfo_file_name);
   if (fd >= 0)
     {
       /* We need to open an Elf handle on the file so we can check its
index 9272c1f..1555008 100644 (file)
@@ -1,5 +1,5 @@
 /* Find an ELF file for a module from its build ID.
-   Copyright (C) 2007-2010 Red Hat, Inc.
+   Copyright (C) 2007-2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
 
 int
 internal_function
-__libdwfl_open_by_build_id (Dwfl_Module *mod, bool debug, char **file_name)
+__libdwfl_open_by_build_id (Dwfl_Module *mod, bool debug, char **file_name,
+                           const size_t id_len, const uint8_t *id)
 {
-  /* If *FILE_NAME was primed into the module, leave it there
-     as the fallback when we have nothing to offer.  */
-  errno = 0;
-  if (mod->build_id_len <= 0)
-    return -1;
-
-  const size_t id_len = mod->build_id_len;
-  const uint8_t *id = mod->build_id_bits;
-
   /* Search debuginfo_path directories' .build-id/ subdirectories.  */
 
   char id_name[sizeof "/.build-id/" + 1 + id_len * 2 + sizeof ".debug" - 1];
@@ -109,6 +101,22 @@ __libdwfl_open_by_build_id (Dwfl_Module *mod, bool debug, char **file_name)
 }
 
 int
+internal_function
+__libdwfl_open_mod_by_build_id (Dwfl_Module *mod, bool debug, char **file_name)
+{
+  /* If *FILE_NAME was primed into the module, leave it there
+     as the fallback when we have nothing to offer.  */
+  errno = 0;
+  if (mod->build_id_len <= 0)
+    return -1;
+
+  const size_t id_len = mod->build_id_len;
+  const uint8_t *id = mod->build_id_bits;
+
+  return __libdwfl_open_by_build_id (mod, debug, file_name, id_len, id);
+}
+
+int
 dwfl_build_id_find_elf (Dwfl_Module *mod,
                        void **userdata __attribute__ ((unused)),
                        const char *modname __attribute__ ((unused)),
@@ -116,7 +124,24 @@ dwfl_build_id_find_elf (Dwfl_Module *mod,
                        char **file_name, Elf **elfp)
 {
   *elfp = NULL;
-  int fd = __libdwfl_open_by_build_id (mod, false, file_name);
+  if (modname != NULL && mod->dwfl->executable_for_core != NULL
+      && (strcmp (modname, "[exe]") == 0 || strcmp (modname, "[pie]") == 0))
+    {
+      /* When dwfl_core_file_report was called with a non-NULL executable file
+        name this callback will replace the Dwfl_Module main.name with the
+        recorded executable file when the modname is [exe] or [pie] (which
+        then triggers opening and reporting of the executable).  */
+      int fd = open64 (mod->dwfl->executable_for_core, O_RDONLY);
+      if (fd >= 0)
+       {
+         *file_name = strdup (mod->dwfl->executable_for_core);
+         if (*file_name != NULL)
+           return fd;
+         else
+           close (fd);
+       }
+    }
+  int fd = __libdwfl_open_mod_by_build_id (mod, false, file_name);
   if (fd >= 0)
     {
       Dwfl_Error error = __libdw_open_file (&fd, elfp, true, false);
index fd38e0f..33cae48 100644 (file)
@@ -1,5 +1,5 @@
 /* Finish a session using libdwfl.
-   Copyright (C) 2005, 2008 Red Hat, Inc.
+   Copyright (C) 2005, 2008, 2012-2013 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -34,6 +34,9 @@ dwfl_end (Dwfl *dwfl)
   if (dwfl == NULL)
     return;
 
+  if (dwfl->process)
+    __libdwfl_process_free (dwfl->process);
+
   free (dwfl->lookup_addr);
   free (dwfl->lookup_module);
   free (dwfl->lookup_segndx);
@@ -46,5 +49,6 @@ dwfl_end (Dwfl *dwfl)
       __libdwfl_module_free (dead);
     }
 
+  free (dwfl->executable_for_core);
   free (dwfl);
 }
diff --git a/libdwfl/dwfl_frame.c b/libdwfl/dwfl_frame.c
new file mode 100644 (file)
index 0000000..f6f86c0
--- /dev/null
@@ -0,0 +1,474 @@
+/* Get Dwarf Frame state for target PID or core file.
+   Copyright (C) 2013, 2014 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 "libdwflP.h"
+#include <sys/ptrace.h>
+#include <unistd.h>
+
+/* Set STATE->pc_set from STATE->regs according to the backend.  Return true on
+   success, false on error.  */
+static bool
+state_fetch_pc (Dwfl_Frame *state)
+{
+  switch (state->pc_state)
+    {
+    case DWFL_FRAME_STATE_PC_SET:
+      return true;
+    case DWFL_FRAME_STATE_PC_UNDEFINED:
+      abort ();
+    case DWFL_FRAME_STATE_ERROR:
+      {
+       Ebl *ebl = state->thread->process->ebl;
+       Dwarf_CIE abi_info;
+       if (ebl_abi_cfi (ebl, &abi_info) != 0)
+         {
+           __libdwfl_seterrno (DWFL_E_LIBEBL);
+           return false;
+         }
+       unsigned ra = abi_info.return_address_register;
+       /* dwarf_frame_state_reg_is_set is not applied here.  */
+       if (ra >= ebl_frame_nregs (ebl))
+         {
+           __libdwfl_seterrno (DWFL_E_LIBEBL_BAD);
+           return false;
+         }
+       state->pc = state->regs[ra];
+       state->pc_state = DWFL_FRAME_STATE_PC_SET;
+      }
+      return true;
+    }
+  abort ();
+}
+
+/* Do not call it on your own, to be used by thread_* functions only.  */
+
+static void
+state_free (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);
+}
+
+static Dwfl_Frame *
+state_alloc (Dwfl_Thread *thread)
+{
+  assert (thread->unwound == NULL);
+  Ebl *ebl = thread->process->ebl;
+  size_t nregs = ebl_frame_nregs (ebl);
+  if (nregs == 0)
+    return NULL;
+  assert (nregs < sizeof (((Dwfl_Frame *) NULL)->regs_set) * 8);
+  Dwfl_Frame *state = malloc (sizeof (*state) + sizeof (*state->regs) * nregs);
+  if (state == NULL)
+    return NULL;
+  state->thread = thread;
+  state->signal_frame = false;
+  state->initial_frame = true;
+  state->pc_state = DWFL_FRAME_STATE_ERROR;
+  memset (state->regs_set, 0, sizeof (state->regs_set));
+  thread->unwound = state;
+  state->unwound = NULL;
+  return state;
+}
+
+void
+internal_function
+__libdwfl_process_free (Dwfl_Process *process)
+{
+  Dwfl *dwfl = process->dwfl;
+  if (process->callbacks->detach != NULL)
+    process->callbacks->detach (dwfl, process->callbacks_arg);
+  assert (dwfl->process == process);
+  dwfl->process = NULL;
+  if (process->ebl_close)
+    ebl_closebackend (process->ebl);
+  free (process);
+  dwfl->attacherr = DWFL_E_NOERROR;
+}
+
+/* Allocate new Dwfl_Process for DWFL.  */
+static void
+process_alloc (Dwfl *dwfl)
+{
+  Dwfl_Process *process = malloc (sizeof (*process));
+  if (process == NULL)
+    return;
+  process->dwfl = dwfl;
+  dwfl->process = process;
+}
+
+bool
+dwfl_attach_state (Dwfl *dwfl, Elf *elf, pid_t pid,
+                  const Dwfl_Thread_Callbacks *thread_callbacks, void *arg)
+{
+  if (dwfl->process != NULL)
+    {
+      __libdwfl_seterrno (DWFL_E_ATTACH_STATE_CONFLICT);
+      return false;
+    }
+
+  /* Reset any previous error, we are just going to try again.  */
+  dwfl->attacherr = DWFL_E_NOERROR;
+  if (thread_callbacks == NULL || thread_callbacks->next_thread == NULL
+      || thread_callbacks->set_initial_registers == NULL)
+    {
+      dwfl->attacherr = DWFL_E_INVALID_ARGUMENT;
+    fail:
+      dwfl->attacherr = __libdwfl_canon_error (dwfl->attacherr);
+      __libdwfl_seterrno (dwfl->attacherr);
+      return false;
+    }
+
+  Ebl *ebl;
+  bool ebl_close;
+  if (elf != NULL)
+    {
+      ebl = ebl_openbackend (elf);
+      ebl_close = true;
+    }
+  else
+    {
+      ebl = NULL;
+      for (Dwfl_Module *mod = dwfl->modulelist; mod != NULL; mod = mod->next)
+       {
+         /* Reading of the vDSO or (deleted) modules may fail as
+            /proc/PID/mem is unreadable without PTRACE_ATTACH and
+            we may not be PTRACE_ATTACH-ed now.  MOD would not be
+            re-read later to unwind it when we are already
+            PTRACE_ATTACH-ed to PID.  This happens when this function
+            is called from dwfl_linux_proc_attach with elf == NULL.
+            __libdwfl_module_getebl will call __libdwfl_getelf which
+            will call the find_elf callback.  */
+         if (strncmp (mod->name, "[vdso: ", 7) == 0
+             || strcmp (strrchr (mod->name, ' ') ?: "",
+                        " (deleted)") == 0)
+           continue;
+         Dwfl_Error error = __libdwfl_module_getebl (mod);
+         if (error != DWFL_E_NOERROR)
+           continue;
+         ebl = mod->ebl;
+         break;
+       }
+      ebl_close = false;
+    }
+  if (ebl == NULL)
+    {
+      /* Not identified EBL from any of the modules.  */
+      dwfl->attacherr = DWFL_E_PROCESS_NO_ARCH;
+      goto fail;
+    }
+  process_alloc (dwfl);
+  Dwfl_Process *process = dwfl->process;
+  if (process == NULL)
+    {
+      if (ebl_close)
+       ebl_closebackend (ebl);
+      dwfl->attacherr = DWFL_E_NOMEM;
+      goto fail;
+    }
+  process->ebl = ebl;
+  process->ebl_close = ebl_close;
+  process->pid = pid;
+  process->callbacks = thread_callbacks;
+  process->callbacks_arg = arg;
+  return true;
+}
+INTDEF(dwfl_attach_state)
+
+pid_t
+dwfl_pid (Dwfl *dwfl)
+{
+  if (dwfl->attacherr != DWFL_E_NOERROR)
+    {
+      __libdwfl_seterrno (dwfl->attacherr);
+      return -1;
+    }
+
+  if (dwfl->process == NULL)
+    {
+      __libdwfl_seterrno (DWFL_E_NO_ATTACH_STATE);
+      return -1;
+    }
+  return dwfl->process->pid;
+}
+INTDEF(dwfl_pid)
+
+Dwfl *
+dwfl_thread_dwfl (Dwfl_Thread *thread)
+{
+  return thread->process->dwfl;
+}
+INTDEF(dwfl_thread_dwfl)
+
+pid_t
+dwfl_thread_tid (Dwfl_Thread *thread)
+{
+  return thread->tid;
+}
+INTDEF(dwfl_thread_tid)
+
+Dwfl_Thread *
+dwfl_frame_thread (Dwfl_Frame *state)
+{
+  return state->thread;
+}
+INTDEF(dwfl_frame_thread)
+
+int
+dwfl_getthreads (Dwfl *dwfl, int (*callback) (Dwfl_Thread *thread, void *arg),
+                void *arg)
+{
+  if (dwfl->attacherr != DWFL_E_NOERROR)
+    {
+      __libdwfl_seterrno (dwfl->attacherr);
+      return -1;
+    }
+
+  Dwfl_Process *process = dwfl->process;
+  if (process == NULL)
+    {
+      __libdwfl_seterrno (DWFL_E_NO_ATTACH_STATE);
+      return -1;
+    }
+
+  Dwfl_Thread thread;
+  thread.process = process;
+  thread.unwound = NULL;
+  thread.callbacks_arg = NULL;
+  for (;;)
+    {
+      thread.tid = process->callbacks->next_thread (dwfl,
+                                                   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;
+       }
+      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;
+       }
+      assert (thread.unwound == NULL);
+    }
+  /* NOTREACHED */
+}
+INTDEF(dwfl_getthreads)
+
+struct one_arg
+{
+  pid_t tid;
+  bool seen;
+  int (*callback) (Dwfl_Thread *thread, void *arg);
+  void *arg;
+  int ret;
+};
+
+static int
+get_one_thread_cb (Dwfl_Thread *thread, void *arg)
+{
+  struct one_arg *oa = (struct one_arg *) arg;
+  if (! oa->seen && INTUSE(dwfl_thread_tid) (thread) == oa->tid)
+    {
+      oa->seen = true;
+      oa->ret = oa->callback (thread, oa->arg);
+      return DWARF_CB_ABORT;
+    }
+
+  return DWARF_CB_OK;
+}
+
+/* Note not currently exported, will be when there are more Dwfl_Thread
+   properties to query.  Use dwfl_getthread_frames for now directly.  */
+static int
+getthread (Dwfl *dwfl, pid_t tid,
+          int (*callback) (Dwfl_Thread *thread, void *arg),
+          void *arg)
+{
+  if (dwfl->attacherr != DWFL_E_NOERROR)
+    {
+      __libdwfl_seterrno (dwfl->attacherr);
+      return -1;
+    }
+
+  Dwfl_Process *process = dwfl->process;
+  if (process == NULL)
+    {
+      __libdwfl_seterrno (DWFL_E_NO_ATTACH_STATE);
+      return -1;
+    }
+
+  if (process->callbacks->get_thread != NULL)
+    {
+      Dwfl_Thread thread;
+      thread.process = process;
+      thread.unwound = NULL;
+      thread.callbacks_arg = NULL;
+
+      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 -1;
+    }
+
+   struct one_arg oa = { .tid = tid, .callback = callback,
+                        .arg = arg, .seen = false };
+   int err = INTUSE(dwfl_getthreads) (dwfl, get_one_thread_cb, &oa);
+
+   if (err == DWARF_CB_ABORT && oa.seen)
+     return oa.ret;
+
+   if (err == DWARF_CB_OK && ! oa.seen)
+     {
+       errno = ESRCH;
+       __libdwfl_seterrno (DWFL_E_ERRNO);
+       return -1;
+     }
+
+   return err;
+}
+
+struct one_thread
+{
+  int (*callback) (Dwfl_Frame *frame, void *arg);
+  void *arg;
+};
+
+static int
+get_one_thread_frames_cb (Dwfl_Thread *thread, void *arg)
+{
+  struct one_thread *ot = (struct one_thread *) arg;
+  return INTUSE(dwfl_thread_getframes) (thread, ot->callback, ot->arg);
+}
+
+int
+dwfl_getthread_frames (Dwfl *dwfl, pid_t tid,
+                      int (*callback) (Dwfl_Frame *frame, void *arg),
+                      void *arg)
+{
+  struct one_thread ot = { .callback = callback, .arg = arg };
+  return getthread (dwfl, tid, get_one_thread_frames_cb, &ot);
+}
+INTDEF(dwfl_getthread_frames)
+
+int
+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)
+    {
+      __libdwfl_seterrno (DWFL_E_NO_UNWIND);
+      return -1;
+    }
+  if (state_alloc (thread) == NULL)
+    {
+      __libdwfl_seterrno (DWFL_E_NOMEM);
+      return -1;
+    }
+  Dwfl_Process *process = thread->process;
+  if (! process->callbacks->set_initial_registers (thread,
+                                                  thread->callbacks_arg))
+    {
+      thread_free_all_states (thread);
+      return -1;
+    }
+  if (! state_fetch_pc (thread->unwound))
+    {
+      if (process->callbacks->thread_detach)
+       process->callbacks->thread_detach (thread, thread->callbacks_arg);
+      thread_free_all_states (thread);
+      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);
+         return err;
+       }
+      __libdwfl_frame_unwind (state);
+      /* The old frame is no longer needed.  */
+      state_free (thread->unwound);
+      state = thread->unwound;
+    }
+  while (state && state->pc_state == DWFL_FRAME_STATE_PC_SET);
+
+  Dwfl_Error err = dwfl_errno ();
+  if (process->callbacks->thread_detach)
+    process->callbacks->thread_detach (thread, thread->callbacks_arg);
+  if (state == NULL || state->pc_state == DWFL_FRAME_STATE_ERROR)
+    {
+      thread_free_all_states (thread);
+      __libdwfl_seterrno (err);
+      return -1;
+    }
+  assert (state->pc_state == DWFL_FRAME_STATE_PC_UNDEFINED);
+  thread_free_all_states (thread);
+  return 0;
+}
+INTDEF(dwfl_thread_getframes)
diff --git a/libdwfl/dwfl_frame_pc.c b/libdwfl/dwfl_frame_pc.c
new file mode 100644 (file)
index 0000000..296c815
--- /dev/null
@@ -0,0 +1,64 @@
+/* Get return address register value for frame.
+   Copyright (C) 2013 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"
+
+bool
+dwfl_frame_pc (Dwfl_Frame *state, Dwarf_Addr *pc, bool *isactivation)
+{
+  assert (state->pc_state == DWFL_FRAME_STATE_PC_SET);
+  *pc = state->pc;
+  ebl_normalize_pc (state->thread->process->ebl, pc);
+  if (isactivation)
+    {
+      /* Bottom frame?  */
+      if (state->initial_frame)
+       *isactivation = true;
+      /* *ISACTIVATION is logical union of whether current or previous frame
+        state is SIGNAL_FRAME.  */
+      else if (state->signal_frame)
+       *isactivation = true;
+      else
+       {
+         /* If the previous frame has unwound unsuccessfully just silently do
+            not consider it could be a SIGNAL_FRAME.  */
+         __libdwfl_frame_unwind (state);
+         if (state->unwound == NULL
+             || state->unwound->pc_state != DWFL_FRAME_STATE_PC_SET)
+           *isactivation = false;
+         else
+           *isactivation = state->unwound->signal_frame;
+       }
+    }
+  return true;
+}
+INTDEF (dwfl_frame_pc)
diff --git a/libdwfl/dwfl_frame_regs.c b/libdwfl/dwfl_frame_regs.c
new file mode 100644 (file)
index 0000000..10803fe
--- /dev/null
@@ -0,0 +1,57 @@
+/* Get Dwarf Frame state from modules present in DWFL.
+   Copyright (C) 2013 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 "libdwflP.h"
+
+bool
+dwfl_thread_state_registers (Dwfl_Thread *thread, int firstreg,
+                            unsigned nregs, const Dwarf_Word *regs)
+{
+  Dwfl_Frame *state = thread->unwound;
+  assert (state && state->unwound == NULL);
+  assert (state->initial_frame);
+  for (unsigned regno = firstreg; regno < firstreg + nregs; regno++)
+    if (! __libdwfl_frame_reg_set (state, regno, regs[regno - firstreg]))
+      {
+       __libdwfl_seterrno (DWFL_E_INVALID_REGISTER);
+       return false;
+      }
+  return true;
+}
+INTDEF(dwfl_thread_state_registers)
+
+void
+dwfl_thread_state_register_pc (Dwfl_Thread *thread, Dwarf_Word pc)
+{
+  Dwfl_Frame *state = thread->unwound;
+  assert (state && state->unwound == NULL);
+  assert (state->initial_frame);
+  state->pc = pc;
+  state->pc_state = DWFL_FRAME_STATE_PC_SET;
+}
+INTDEF(dwfl_thread_state_register_pc)
index cc8cb7c..bdfcf5c 100644 (file)
@@ -1,5 +1,5 @@
 /* Fetch source line information for CU.
-   Copyright (C) 2005 Red Hat, Inc.
+   Copyright (C) 2005, 2013 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -44,5 +44,5 @@ dwfl_getsrclines (Dwarf_Die *cudie, size_t *nlines)
     }
 
   *nlines = cu->die.cu->lines->nlines;
-  return -1;
+  return 0;
 }
index e703d27..8efcfaa 100644 (file)
@@ -1,5 +1,5 @@
 /* Maintenance of module list in libdwfl.
-   Copyright (C) 2005, 2006, 2007, 2008 Red Hat, Inc.
+   Copyright (C) 2005, 2006, 2007, 2008, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -71,7 +71,17 @@ __libdwfl_module_free (Dwfl_Module *mod)
     }
 
   if (mod->dw != NULL)
-    INTUSE(dwarf_end) (mod->dw);
+    {
+      INTUSE(dwarf_end) (mod->dw);
+      if (mod->alt != NULL)
+       {
+         INTUSE(dwarf_end) (mod->alt);
+         if (mod->alt_elf != NULL)
+           elf_end (mod->alt_elf);
+         if (mod->alt_fd != -1)
+           close (mod->alt_fd);
+       }
+    }
 
   if (mod->ebl != NULL)
     ebl_closebackend (mod->ebl);
@@ -79,10 +89,17 @@ __libdwfl_module_free (Dwfl_Module *mod)
   if (mod->debug.elf != mod->main.elf)
     free_file (&mod->debug);
   free_file (&mod->main);
+  free_file (&mod->aux_sym);
 
   if (mod->build_id_bits != NULL)
     free (mod->build_id_bits);
 
+  if (mod->reloc_info != NULL)
+    free (mod->reloc_info);
+
+  if (mod->eh_cfi != NULL)
+    dwarf_cfi_end (mod->eh_cfi);
+
   free (mod->name);
   free (mod);
 }
index 6ae0123..88a8139 100644 (file)
@@ -1,5 +1,5 @@
 /* Find debugging and symbol information for a module in libdwfl.
-   Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+   Copyright (C) 2005, 2006, 2007, 2013 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -31,6 +31,8 @@
 const char *
 dwfl_module_addrname (Dwfl_Module *mod, GElf_Addr addr)
 {
+  GElf_Off off;
   GElf_Sym sym;
-  return INTUSE(dwfl_module_addrsym) (mod, addr, &sym, NULL);
+  return INTUSE(dwfl_module_addrinfo) (mod, addr, &off, &sym,
+                                      NULL, NULL, NULL);
 }
index 4e0646e..d205832 100644 (file)
@@ -1,5 +1,5 @@
 /* Find debugging and symbol information for a module in libdwfl.
-   Copyright (C) 2005-2011 Red Hat, Inc.
+   Copyright (C) 2005-2013 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
    Never returns symbols at addresses above ADDR.  */
 
 const char *
-dwfl_module_addrsym (Dwfl_Module *mod, GElf_Addr addr,
-                    GElf_Sym *closest_sym, GElf_Word *shndxp)
+internal_function
+__libdwfl_addrsym (Dwfl_Module *mod, GElf_Addr addr, GElf_Off *off,
+                  GElf_Sym *closest_sym, GElf_Word *shndxp,
+                  Elf **elfp, Dwarf_Addr *biasp, bool adjust_st_value)
 {
   int syments = INTUSE(dwfl_module_getsymtab) (mod);
   if (syments < 0)
@@ -41,19 +43,36 @@ dwfl_module_addrsym (Dwfl_Module *mod, GElf_Addr addr,
 
   /* Return true iff we consider ADDR to lie in the same section as SYM.  */
   GElf_Word addr_shndx = SHN_UNDEF;
-  inline bool same_section (const GElf_Sym *sym, GElf_Word shndx)
+  Elf *addr_symelf = NULL;
+  inline bool same_section (GElf_Addr value, Elf *symelf, GElf_Word shndx)
     {
       /* For absolute symbols and the like, only match exactly.  */
       if (shndx >= SHN_LORESERVE)
-       return sym->st_value == addr;
+       return value == addr;
+
+      /* If value might not be st_value, the shndx of the symbol might
+        not match the section of the value. Explicitly look both up.  */
+      if (! adjust_st_value)
+       {
+         Dwarf_Addr v;
+         if (addr_shndx == SHN_UNDEF)
+           {
+             v = addr;
+             addr_shndx = __libdwfl_find_section_ndx (mod, &v);
+           }
+
+         v = value;
+         return addr_shndx == __libdwfl_find_section_ndx (mod, &v);
+       }
 
       /* Figure out what section ADDR lies in.  */
-      if (addr_shndx == SHN_UNDEF)
+      if (addr_shndx == SHN_UNDEF || addr_symelf != symelf)
        {
-         GElf_Addr mod_addr = dwfl_deadjust_st_value (mod, addr);
+         GElf_Addr mod_addr = dwfl_deadjust_st_value (mod, symelf, addr);
          Elf_Scn *scn = NULL;
          addr_shndx = SHN_ABS;
-         while ((scn = elf_nextscn (mod->symfile->elf, scn)) != NULL)
+         addr_symelf = symelf;
+         while ((scn = elf_nextscn (symelf, scn)) != NULL)
            {
              GElf_Shdr shdr_mem;
              GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
@@ -67,113 +86,204 @@ dwfl_module_addrsym (Dwfl_Module *mod, GElf_Addr addr,
            }
        }
 
-      return shndx == addr_shndx;
+      return shndx == addr_shndx && addr_symelf == symelf;
     }
 
   /* Keep track of the closest symbol we have seen so far.
      Here we store only symbols with nonzero st_size.  */
   const char *closest_name = NULL;
+  GElf_Addr closest_value = 0;
   GElf_Word closest_shndx = SHN_UNDEF;
+  Elf *closest_elf = NULL;
 
   /* Keep track of an eligible symbol with st_size == 0 as a fallback.  */
   const char *sizeless_name = NULL;
   GElf_Sym sizeless_sym = { 0, 0, 0, 0, 0, SHN_UNDEF };
+  GElf_Addr sizeless_value = 0;
   GElf_Word sizeless_shndx = SHN_UNDEF;
+  Elf *sizeless_elf = NULL;
 
   /* Keep track of the lowest address a relevant sizeless symbol could have.  */
   GElf_Addr min_label = 0;
 
+  /* Try one symbol and associated value from the search table.  */
+  inline void try_sym_value (GElf_Addr value, GElf_Sym *sym,
+                            const char *name, GElf_Word shndx,
+                            Elf *elf, bool resolved)
+  {
+    /* Even if we don't choose this symbol, its existence excludes
+       any sizeless symbol (assembly label) that is below its upper
+       bound.  */
+    if (value + sym->st_size > min_label)
+      min_label = value + sym->st_size;
+
+    if (sym->st_size == 0 || addr - value < sym->st_size)
+      {
+       /* Return GELF_ST_BIND as higher-is-better integer.  */
+       inline int binding_value (const GElf_Sym *symp)
+       {
+         switch (GELF_ST_BIND (symp->st_info))
+           {
+           case STB_GLOBAL:
+             return 3;
+           case STB_WEAK:
+             return 2;
+           case STB_LOCAL:
+             return 1;
+           default:
+             return 0;
+           }
+       }
+
+       /* This symbol is a better candidate than the current one
+          if it's closer to ADDR or is global when it was local.  */
+       if (closest_name == NULL
+           || closest_value < value
+           || binding_value (closest_sym) < binding_value (sym))
+         {
+           if (sym->st_size != 0)
+             {
+               *closest_sym = *sym;
+               closest_value = value;
+               closest_shndx = shndx;
+               closest_elf = elf;
+               closest_name = name;
+             }
+           else if (closest_name == NULL
+                    && value >= min_label
+                    && same_section (value,
+                                     resolved ? mod->main.elf : elf, shndx))
+             {
+               /* Handwritten assembly symbols sometimes have no
+                  st_size.  If no symbol with proper size includes
+                  the address, we'll use the closest one that is in
+                  the same section as ADDR.  */
+               sizeless_sym = *sym;
+               sizeless_value = value;
+               sizeless_shndx = shndx;
+               sizeless_elf = elf;
+               sizeless_name = name;
+             }
+         }
+       /* When the beginning of its range is no closer,
+          the end of its range might be.  Otherwise follow
+          GELF_ST_BIND preference.  If all are equal prefer
+          the first symbol found.  */
+       else if (sym->st_size != 0
+                && closest_value == value
+                && ((closest_sym->st_size > sym->st_size
+                     && (binding_value (closest_sym)
+                         <= binding_value (sym)))
+                    || (closest_sym->st_size >= sym->st_size
+                        && (binding_value (closest_sym)
+                            < binding_value (sym)))))
+         {
+           *closest_sym = *sym;
+           closest_value = value;
+           closest_shndx = shndx;
+           closest_elf = elf;
+           closest_name = name;
+         }
+      }
+  }
+
   /* Look through the symbol table for a matching symbol.  */
   inline void search_table (int start, int end)
     {
       for (int i = start; i < end; ++i)
        {
          GElf_Sym sym;
+         GElf_Addr value;
          GElf_Word shndx;
-         const char *name = INTUSE(dwfl_module_getsym) (mod, i, &sym, &shndx);
+         Elf *elf;
+         bool resolved;
+         const char *name = __libdwfl_getsym (mod, i, &sym, &value,
+                                              &shndx, &elf, NULL,
+                                              &resolved, adjust_st_value);
          if (name != NULL && name[0] != '\0'
              && sym.st_shndx != SHN_UNDEF
-             && sym.st_value <= addr
+             && value <= addr
              && GELF_ST_TYPE (sym.st_info) != STT_SECTION
              && GELF_ST_TYPE (sym.st_info) != STT_FILE
              && GELF_ST_TYPE (sym.st_info) != STT_TLS)
            {
-             /* Even if we don't choose this symbol, its existence excludes
-                any sizeless symbol (assembly label) that is below its upper
-                bound.  */
-             if (sym.st_value + sym.st_size > min_label)
-               min_label = sym.st_value + sym.st_size;
+             try_sym_value (value, &sym, name, shndx, elf, resolved);
 
-             if (sym.st_size == 0 || addr - sym.st_value < sym.st_size)
+             /* If this is an addrinfo variant and the value could be
+                resolved then also try matching the (adjusted) st_value.  */
+             if (resolved && mod->e_type != ET_REL)
                {
-                 /* This symbol is a better candidate than the current one
-                    if it's closer to ADDR or is global when it was local.  */
-                 if (closest_name == NULL
-                     || closest_sym->st_value < sym.st_value
-                     || (GELF_ST_BIND (closest_sym->st_info)
-                         < GELF_ST_BIND (sym.st_info)))
-                   {
-                     if (sym.st_size != 0)
-                       {
-                         *closest_sym = sym;
-                         closest_shndx = shndx;
-                         closest_name = name;
-                       }
-                     else if (closest_name == NULL
-                              && sym.st_value >= min_label
-                              && same_section (&sym, shndx))
-                       {
-                         /* Handwritten assembly symbols sometimes have no
-                            st_size.  If no symbol with proper size includes
-                            the address, we'll use the closest one that is in
-                            the same section as ADDR.  */
-                         sizeless_sym = sym;
-                         sizeless_shndx = shndx;
-                         sizeless_name = name;
-                       }
-                   }
-                 /* When the beginning of its range is no closer,
-                    the end of its range might be.  But do not
-                    replace a global symbol with a local!  */
-                 else if (sym.st_size != 0
-                          && closest_sym->st_value == sym.st_value
-                          && closest_sym->st_size > sym.st_size
-                          && (GELF_ST_BIND (closest_sym->st_info)
-                              <= GELF_ST_BIND (sym.st_info)))
-                   {
-                     *closest_sym = sym;
-                     closest_shndx = shndx;
-                     closest_name = name;
-                   }
+                 GElf_Addr adjusted_st_value;
+                 adjusted_st_value = dwfl_adjusted_st_value (mod, elf,
+                                                             sym.st_value);
+                 if (value != adjusted_st_value && adjusted_st_value <= addr)
+                   try_sym_value (adjusted_st_value, &sym, name, shndx,
+                                  elf, false);
                }
            }
        }
     }
 
-  /* First go through global symbols.  mod->first_global is setup by
-     dwfl_module_getsymtab to the index of the first global symbol in
-     the module's symbol table, or -1 when unknown.  All symbols with
-     local binding come first in the symbol table, then all globals.  */
-  search_table (mod->first_global < 0 ? 1 : mod->first_global, syments);
+  /* First go through global symbols.  mod->first_global and
+     mod->aux_first_global are setup by dwfl_module_getsymtab to the
+     index of the first global symbol in those symbol tables.  Both
+     are non-zero when the table exist, except when there is only a
+     dynsym table loaded through phdrs, then first_global is zero and
+     there will be no auxiliary table.  All symbols with local binding
+     come first in the symbol table, then all globals.  The zeroth,
+     null entry, in the auxiliary table is skipped if there is a main
+     table.  */
+  int first_global = INTUSE (dwfl_module_getsymtab_first_global) (mod);
+  if (first_global < 0)
+    return NULL;
+  search_table (first_global == 0 ? 1 : first_global, syments);
 
   /* If we found nothing searching the global symbols, then try the locals.
      Unless we have a global sizeless symbol that matches exactly.  */
-  if (closest_name == NULL && mod->first_global > 1
-      && (sizeless_name == NULL || sizeless_sym.st_value != addr))
-    search_table (1, mod->first_global);
+  if (closest_name == NULL && first_global > 1
+      && (sizeless_name == NULL || sizeless_value != addr))
+    search_table (1, first_global);
 
   /* If we found no proper sized symbol to use, fall back to the best
      candidate sizeless symbol we found, if any.  */
   if (closest_name == NULL
-      && sizeless_name != NULL && sizeless_sym.st_value >= min_label)
+      && sizeless_name != NULL && sizeless_value >= min_label)
     {
       *closest_sym = sizeless_sym;
+      closest_value = sizeless_value;
       closest_shndx = sizeless_shndx;
+      closest_elf = sizeless_elf;
       closest_name = sizeless_name;
     }
 
+  *off = addr - closest_value;
+
   if (shndxp != NULL)
     *shndxp = closest_shndx;
+  if (elfp != NULL)
+    *elfp = closest_elf;
+  if (biasp != NULL)
+    *biasp = dwfl_adjusted_st_value (mod, closest_elf, 0);
   return closest_name;
 }
+
+
+const char *
+dwfl_module_addrsym (Dwfl_Module *mod, GElf_Addr addr,
+                    GElf_Sym *closest_sym, GElf_Word *shndxp)
+{
+  GElf_Off off;
+  return __libdwfl_addrsym (mod, addr, &off, closest_sym, shndxp,
+                           NULL, NULL, true);
+}
 INTDEF (dwfl_module_addrsym)
+
+const char
+*dwfl_module_addrinfo (Dwfl_Module *mod, GElf_Addr address,
+                      GElf_Off *offset, GElf_Sym *sym,
+                      GElf_Word *shndxp, Elf **elfp, Dwarf_Addr *bias)
+{
+  return __libdwfl_addrsym (mod, address, offset, sym, shndxp, elfp, bias,
+                           false);
+}
+INTDEF (dwfl_module_addrinfo)
index 660c733..350bbf8 100644 (file)
@@ -1,5 +1,5 @@
 /* Return build ID information for a module.
-   Copyright (C) 2007-2010 Red Hat, Inc.
+   Copyright (C) 2007-2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -52,82 +52,25 @@ found_build_id (Dwfl_Module *mod, bool set,
   return len;
 }
 
-#define NO_VADDR       ((GElf_Addr) -1l)
-
-static int
-check_notes (Dwfl_Module *mod, bool set, Elf_Data *data, GElf_Addr data_vaddr)
-{
-  size_t pos = 0;
-  GElf_Nhdr nhdr;
-  size_t name_pos;
-  size_t desc_pos;
-  while ((pos = gelf_getnote (data, pos, &nhdr, &name_pos, &desc_pos)) > 0)
-    if (nhdr.n_type == NT_GNU_BUILD_ID
-       && nhdr.n_namesz == sizeof "GNU" && !memcmp (data->d_buf + name_pos,
-                                                    "GNU", sizeof "GNU"))
-      return found_build_id (mod, set,
-                            data->d_buf + desc_pos, nhdr.n_descsz,
-                            data_vaddr == NO_VADDR ? 0
-                            : data_vaddr + desc_pos);
-  return 0;
-}
-
 int
 internal_function
 __libdwfl_find_build_id (Dwfl_Module *mod, bool set, Elf *elf)
 {
-  size_t shstrndx = SHN_UNDEF;
-  int result = 0;
+  const void *build_id_bits;
+  GElf_Addr build_id_elfaddr;
+  int build_id_len;
 
-  Elf_Scn *scn = elf_nextscn (elf, NULL);
+  /* For mod == NULL use dwelf_elf_gnu_build_id directly.  */
+  assert (mod != NULL);
 
-  if (scn == NULL)
-    {
-      /* No sections, have to look for phdrs.  */
-      GElf_Ehdr ehdr_mem;
-      GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem);
-      size_t phnum;
-      if (unlikely (ehdr == NULL)
-         || unlikely (elf_getphdrnum (elf, &phnum) != 0))
-       {
-         __libdwfl_seterrno (DWFL_E_LIBELF);
-         return -1;
-       }
-      for (size_t i = 0; result == 0 && i < phnum; ++i)
-       {
-         GElf_Phdr phdr_mem;
-         GElf_Phdr *phdr = gelf_getphdr (elf, i, &phdr_mem);
-         if (likely (phdr != NULL) && phdr->p_type == PT_NOTE)
-           result = check_notes (mod, set,
-                                 elf_getdata_rawchunk (elf,
-                                                       phdr->p_offset,
-                                                       phdr->p_filesz,
-                                                       ELF_T_NHDR),
-                                 dwfl_adjusted_address (mod, phdr->p_vaddr));
-       }
-    }
-  else
-    do
-      {
-       GElf_Shdr shdr_mem;
-       GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
-       if (likely (shdr != NULL) && shdr->sh_type == SHT_NOTE)
-         {
-           /* Determine the right sh_addr in this module.  */
-           GElf_Addr vaddr = 0;
-           if (!(shdr->sh_flags & SHF_ALLOC))
-             vaddr = NO_VADDR;
-           else if (mod->e_type != ET_REL)
-             vaddr = dwfl_adjusted_address (mod, shdr->sh_addr);
-           else if (__libdwfl_relocate_value (mod, elf, &shstrndx,
-                                              elf_ndxscn (scn), &vaddr))
-             vaddr = NO_VADDR;
-           result = check_notes (mod, set, elf_getdata (scn, NULL), vaddr);
-         }
-      }
-    while (result == 0 && (scn = elf_nextscn (elf, scn)) != NULL);
+  int result = __libdwfl_find_elf_build_id (mod, elf, &build_id_bits,
+                                           &build_id_elfaddr, &build_id_len);
+  if (result <= 0)
+    return result;
 
-  return result;
+  GElf_Addr build_id_vaddr = build_id_elfaddr + (build_id_elfaddr != 0
+                                                ? mod->main_bias : 0);
+  return found_build_id (mod, set, build_id_bits, build_id_len, build_id_vaddr);
 }
 
 int
index bbf9ff3..7259984 100644 (file)
@@ -1,5 +1,5 @@
 /* Find debugging and symbol information for a module in libdwfl.
-   Copyright (C) 2005-2011 Red Hat, Inc.
+   Copyright (C) 2005-2012, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
    not, see <http://www.gnu.org/licenses/>.  */
 
 #include "libdwflP.h"
+#include <inttypes.h>
 #include <fcntl.h>
 #include <string.h>
 #include <unistd.h>
 #include "../libdw/libdwP.h"   /* DWARF_E_* values are here.  */
+#include "../libelf/libelfP.h"
 
-
-/* Open libelf FILE->fd and compute the load base of ELF as loaded in MOD.
-   When we return success, FILE->elf and FILE->vaddr are set up.  */
 static inline Dwfl_Error
-open_elf (Dwfl_Module *mod, struct dwfl_file *file)
+open_elf_file (Elf **elf, int *fd, char **name)
 {
-  if (file->elf == NULL)
+  if (*elf == NULL)
     {
       /* CBFAIL uses errno if it's set, so clear it first in case we don't
         set it with an open failure below.  */
@@ -46,25 +45,36 @@ open_elf (Dwfl_Module *mod, struct dwfl_file *file)
 
       /* If there was a pre-primed file name left that the callback left
         behind, try to open that file name.  */
-      if (file->fd < 0 && file->name != NULL)
-       file->fd = TEMP_FAILURE_RETRY (open64 (file->name, O_RDONLY));
+      if (*fd < 0 && *name != NULL)
+       *fd = TEMP_FAILURE_RETRY (open64 (*name, O_RDONLY));
 
-      if (file->fd < 0)
+      if (*fd < 0)
        return CBFAIL;
 
-      Dwfl_Error error = __libdw_open_file (&file->fd, &file->elf, true, false);
-      if (error != DWFL_E_NOERROR)
-       return error;
+      return __libdw_open_file (fd, elf, true, false);
     }
-  else if (unlikely (elf_kind (file->elf) != ELF_K_ELF))
+  else if (unlikely (elf_kind (*elf) != ELF_K_ELF))
     {
-      elf_end (file->elf);
-      file->elf = NULL;
-      close (file->fd);
-      file->fd = -1;
+      elf_end (*elf);
+      *elf = NULL;
+      close (*fd);
+      *fd = -1;
       return DWFL_E_BADELF;
     }
 
+  /* Elf file already open and looks fine.  */
+  return DWFL_E_NOERROR;
+}
+
+/* Open libelf FILE->fd and compute the load base of ELF as loaded in MOD.
+   When we return success, FILE->elf and FILE->vaddr are set up.  */
+static inline Dwfl_Error
+open_elf (Dwfl_Module *mod, struct dwfl_file *file)
+{
+  Dwfl_Error error = open_elf_file (&file->elf, &file->fd, &file->name);
+  if (error != DWFL_E_NOERROR)
+    return error;
+
   GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (file->elf, &ehdr_mem);
   if (ehdr == NULL)
     {
@@ -76,7 +86,7 @@ open_elf (Dwfl_Module *mod, struct dwfl_file *file)
       return DWFL_E (LIBELF, elf_errno ());
     }
 
-  if (mod->e_type != ET_REL)
+  if (ehdr->e_type != ET_REL)
     {
       /* In any non-ET_REL file, we compute the "synchronization address".
 
@@ -130,15 +140,65 @@ open_elf (Dwfl_Module *mod, struct dwfl_file *file)
        }
     }
 
-  mod->e_type = ehdr->e_type;
+  /* We only want to set the module e_type explictly once, derived from
+     the main ELF file.  (It might be changed for the kernel, because
+     that is special - see below.)  open_elf is always called first for
+     the main ELF file, because both find_dw and find_symtab call
+     __libdwfl_getelf first to open the main file.  So don't let debug
+     or aux files override the module e_type.  The kernel heuristic
+     below could otherwise trigger for non-kernel/non-main files, since
+     their phdrs might not match the actual load addresses.  */
+  if (file == &mod->main)
+    {
+      mod->e_type = ehdr->e_type;
 
-  /* Relocatable Linux kernels are ET_EXEC but act like ET_DYN.  */
-  if (mod->e_type == ET_EXEC && file->vaddr != mod->low_addr)
-    mod->e_type = ET_DYN;
+      /* Relocatable Linux kernels are ET_EXEC but act like ET_DYN.  */
+      if (mod->e_type == ET_EXEC && file->vaddr != mod->low_addr)
+       mod->e_type = ET_DYN;
+    }
+  else
+    assert (mod->main.elf != NULL);
 
   return DWFL_E_NOERROR;
 }
 
+/* We have an authoritative build ID for this module MOD, so don't use
+   a file by name that doesn't match that ID.  */
+static void
+mod_verify_build_id (Dwfl_Module *mod)
+{
+  assert (mod->build_id_len > 0);
+
+  switch (__builtin_expect (__libdwfl_find_build_id (mod, false,
+                                                    mod->main.elf), 2))
+    {
+    case 2:
+      /* Build ID matches as it should. */
+      return;
+
+    case -1:                   /* ELF error.  */
+      mod->elferr = INTUSE(dwfl_errno) ();
+      break;
+
+    case 0:                    /* File has no build ID note.  */
+    case 1:                    /* FIle has a build ID that does not match.  */
+      mod->elferr = DWFL_E_WRONG_ID_ELF;
+      break;
+
+    default:
+      abort ();
+    }
+
+  /* We get here when it was the right ELF file.  Clear it out.  */
+  elf_end (mod->main.elf);
+  mod->main.elf = NULL;
+  if (mod->main.fd >= 0)
+    {
+      close (mod->main.fd);
+      mod->main.fd = -1;
+    }
+}
+
 /* Find the main ELF file for this module and open libelf on it.
    When we return success, MOD->main.elf and MOD->main.bias are set up.  */
 void
@@ -166,105 +226,11 @@ __libdwfl_getelf (Dwfl_Module *mod)
       mod->build_id_len = 0;
     }
   else if (fallback)
-    {
-      /* We have an authoritative build ID for this module, so
-        don't use a file by name that doesn't match that ID.  */
-
-      assert (mod->build_id_len > 0);
-
-      switch (__builtin_expect (__libdwfl_find_build_id (mod, false,
-                                                        mod->main.elf), 2))
-       {
-       case 2:
-         /* Build ID matches as it should. */
-         return;
-
-       case -1:                        /* ELF error.  */
-         mod->elferr = INTUSE(dwfl_errno) ();
-         break;
-
-       case 0:                 /* File has no build ID note.  */
-       case 1:                 /* FIle has a build ID that does not match.  */
-         mod->elferr = DWFL_E_WRONG_ID_ELF;
-         break;
-
-       default:
-         abort ();
-       }
-
-      /* We get here when it was the right ELF file.  Clear it out.  */
-      elf_end (mod->main.elf);
-      mod->main.elf = NULL;
-      if (mod->main.fd >= 0)
-       {
-         close (mod->main.fd);
-         mod->main.fd = -1;
-       }
-    }
+    mod_verify_build_id (mod);
 
   mod->main_bias = mod->e_type == ET_REL ? 0 : mod->low_addr - mod->main.vaddr;
 }
 
-/* Search an ELF file for a ".gnu_debuglink" section.  */
-static const char *
-find_debuglink (Elf *elf, GElf_Word *crc)
-{
-  size_t shstrndx;
-  if (elf_getshdrstrndx (elf, &shstrndx) < 0)
-    return NULL;
-
-  Elf_Scn *scn = NULL;
-  while ((scn = elf_nextscn (elf, scn)) != NULL)
-    {
-      GElf_Shdr shdr_mem;
-      GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
-      if (shdr == NULL)
-       return NULL;
-
-      const char *name = elf_strptr (elf, shstrndx, shdr->sh_name);
-      if (name == NULL)
-       return NULL;
-
-      if (!strcmp (name, ".gnu_debuglink"))
-       break;
-    }
-
-  if (scn == NULL)
-    return NULL;
-
-  /* Found the .gnu_debuglink section.  Extract its contents.  */
-  Elf_Data *rawdata = elf_rawdata (scn, NULL);
-  if (rawdata == NULL)
-    return NULL;
-
-  Elf_Data crcdata =
-    {
-      .d_type = ELF_T_WORD,
-      .d_buf = crc,
-      .d_size = sizeof *crc,
-      .d_version = EV_CURRENT,
-    };
-  Elf_Data conv =
-    {
-      .d_type = ELF_T_WORD,
-      .d_buf = rawdata->d_buf + rawdata->d_size - sizeof *crc,
-      .d_size = sizeof *crc,
-      .d_version = EV_CURRENT,
-    };
-
-  GElf_Ehdr ehdr_mem;
-  GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem);
-  if (ehdr == NULL)
-    return NULL;
-
-  Elf_Data *d = gelf_xlatetom (elf, &crcdata, &conv, ehdr->e_ident[EI_DATA]);
-  if (d == NULL)
-    return NULL;
-  assert (d == &crcdata);
-
-  return rawdata->d_buf;
-}
-
 /* If the main file might have been prelinked, then we need to
    discover the correct synchronization address between the main and
    debug files.  Because of prelink's section juggling, we cannot rely
@@ -282,7 +248,7 @@ find_debuglink (Elf *elf, GElf_Word *crc)
    looked like before prelink juggled them--when they still had a
    direct correspondence to the debug file.  */
 static Dwfl_Error
-find_prelink_address_sync (Dwfl_Module *mod)
+find_prelink_address_sync (Dwfl_Module *mod, struct dwfl_file *file)
 {
   /* The magic section is only identified by name.  */
   size_t shstrndx;
@@ -509,8 +475,8 @@ find_prelink_address_sync (Dwfl_Module *mod)
          consider_shdr (undo_interp, shdr.s64[i].sh_type, shdr.s64[i].sh_flags,
                         shdr.s64[i].sh_addr, shdr.s64[i].sh_size);
 
-      if (highest > mod->debug.vaddr)
-       mod->debug.address_sync = highest;
+      if (highest > file->vaddr)
+       file->address_sync = highest;
       else
        return DWFL_E_BAD_PRELINK;
     }
@@ -527,7 +493,9 @@ find_debuginfo (Dwfl_Module *mod)
     return DWFL_E_NOERROR;
 
   GElf_Word debuglink_crc = 0;
-  const char *debuglink_file = find_debuglink (mod->main.elf, &debuglink_crc);
+  const char *debuglink_file;
+  debuglink_file = INTUSE(dwelf_elf_gnu_debuglink) (mod->main.elf,
+                                                   &debuglink_crc);
 
   mod->debug.fd = (*mod->dwfl->callbacks->find_debuginfo) (MODCB_ARGS (mod),
                                                           mod->main.name,
@@ -536,10 +504,59 @@ find_debuginfo (Dwfl_Module *mod)
                                                           &mod->debug.name);
   Dwfl_Error result = open_elf (mod, &mod->debug);
   if (result == DWFL_E_NOERROR && mod->debug.address_sync != 0)
-    result = find_prelink_address_sync (mod);
+    result = find_prelink_address_sync (mod, &mod->debug);
   return result;
 }
 
+/* Try to find the alternative debug link for the given DWARF and set
+   it if found.  Only called when mod->dw is already setup but still
+   might need an alternative (dwz multi) debug file.  filename is either
+   the main or debug name from which the Dwarf was created. */
+static void
+find_debug_altlink (Dwfl_Module *mod, const char *filename)
+{
+  assert (mod->dw != NULL);
+
+  const char *altname;
+  const void *build_id;
+  ssize_t build_id_len = INTUSE(dwelf_dwarf_gnu_debugaltlink) (mod->dw,
+                                                              &altname,
+                                                              &build_id);
+
+  if (build_id_len > 0)
+    {
+      /* We could store altfile in the module, but don't really need it.  */
+      char *altfile = NULL;
+      mod->alt_fd = (*mod->dwfl->callbacks->find_debuginfo) (MODCB_ARGS (mod),
+                                                            filename,
+                                                            altname,
+                                                            0,
+                                                            &altfile);
+
+      /* The (internal) callbacks might just set mod->alt_elf directly
+        because they open the Elf anyway for sanity checking.
+        Otherwise open either the given file name or use the fd
+        returned.  */
+      Dwfl_Error error = open_elf_file (&mod->alt_elf, &mod->alt_fd,
+                                       &altfile);
+      if (error == DWFL_E_NOERROR)
+       {
+         mod->alt = INTUSE(dwarf_begin_elf) (mod->alt_elf,
+                                             DWARF_C_READ, NULL);
+         if (mod->alt == NULL)
+           {
+             elf_end (mod->alt_elf);
+             mod->alt_elf = NULL;
+             close (mod->alt_fd);
+             mod->alt_fd = -1;
+           }
+         else
+           dwarf_setalt (mod->dw, mod->alt);
+       }
+
+      free (altfile); /* See above, we don't really need it.  */
+    }
+}
 
 /* Try to find a symbol table in FILE.
    Returns DWFL_E_NOERROR if a proper one is found.
@@ -576,6 +593,7 @@ load_symtab (struct dwfl_file *file, struct dwfl_file **symfile,
            *symfile = file;
            *strshndx = shdr->sh_link;
            *syments = shdr->sh_size / shdr->sh_entsize;
+           *first_global = shdr->sh_info;
            break;
 
          case SHT_SYMTAB_SHNDX:
@@ -811,11 +829,157 @@ find_dynsym (Dwfl_Module *mod)
     }
 }
 
+
+#if USE_LZMA
+/* Try to find the offset between the main file and .gnu_debugdata.  */
+static bool
+find_aux_address_sync (Dwfl_Module *mod)
+{
+  /* Don't trust the phdrs in the minisymtab elf file to be setup correctly.
+     The address_sync is equal to the main file it is embedded in at first.  */
+  mod->aux_sym.address_sync = mod->main.address_sync;
+
+  /* Adjust address_sync for the difference in entry addresses, attempting to
+     account for ELF relocation changes after aux was split.  */
+  GElf_Ehdr ehdr_main, ehdr_aux;
+  if (unlikely (gelf_getehdr (mod->main.elf, &ehdr_main) == NULL)
+      || unlikely (gelf_getehdr (mod->aux_sym.elf, &ehdr_aux) == NULL))
+    return false;
+  mod->aux_sym.address_sync += ehdr_aux.e_entry - ehdr_main.e_entry;
+
+  /* The shdrs are setup OK to make find_prelink_address_sync () do the right
+     thing, which is possibly more reliable, but it needs .gnu.prelink_undo.  */
+  if (mod->aux_sym.address_sync != 0)
+    return find_prelink_address_sync (mod, &mod->aux_sym) == DWFL_E_NOERROR;
+
+  return true;
+}
+#endif
+
+/* Try to find the auxiliary symbol table embedded in the main elf file
+   section .gnu_debugdata.  Only matters if the symbol information comes
+   from the main file dynsym.  No harm done if not found.  */
+static void
+find_aux_sym (Dwfl_Module *mod __attribute__ ((unused)),
+             Elf_Scn **aux_symscn __attribute__ ((unused)),
+             Elf_Scn **aux_xndxscn __attribute__ ((unused)),
+             GElf_Word *aux_strshndx __attribute__ ((unused)))
+{
+  /* Since a .gnu_debugdata section is compressed using lzma don't do
+     anything unless we have support for that.  */
+#if USE_LZMA
+  Elf *elf = mod->main.elf;
+
+  size_t shstrndx;
+  if (elf_getshdrstrndx (elf, &shstrndx) < 0)
+    return;
+
+  Elf_Scn *scn = NULL;
+  while ((scn = elf_nextscn (elf, scn)) != NULL)
+    {
+      GElf_Shdr shdr_mem;
+      GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+      if (shdr == NULL)
+       return;
+
+      const char *name = elf_strptr (elf, shstrndx, shdr->sh_name);
+      if (name == NULL)
+       return;
+
+      if (!strcmp (name, ".gnu_debugdata"))
+       break;
+    }
+
+  if (scn == NULL)
+    return;
+
+  /* Found the .gnu_debugdata section.  Uncompress the lzma image and
+     turn it into an ELF image.  */
+  Elf_Data *rawdata = elf_rawdata (scn, NULL);
+  if (rawdata == NULL)
+    return;
+
+  Dwfl_Error error;
+  void *buffer = NULL;
+  size_t size = 0;
+  error = __libdw_unlzma (-1, 0, rawdata->d_buf, rawdata->d_size,
+                         &buffer, &size);
+  if (error == DWFL_E_NOERROR)
+    {
+      if (unlikely (size == 0))
+       free (buffer);
+      else
+       {
+         mod->aux_sym.elf = elf_memory (buffer, size);
+         if (mod->aux_sym.elf == NULL)
+           free (buffer);
+         else
+           {
+             mod->aux_sym.fd = -1;
+             mod->aux_sym.elf->flags |= ELF_F_MALLOCED;
+             if (open_elf (mod, &mod->aux_sym) != DWFL_E_NOERROR)
+               return;
+             if (! find_aux_address_sync (mod))
+               {
+                 elf_end (mod->aux_sym.elf);
+                 mod->aux_sym.elf = NULL;
+                 return;
+               }
+
+             /* So far, so good. Get minisymtab table data and cache it. */
+             bool minisymtab = false;
+             scn = NULL;
+             while ((scn = elf_nextscn (mod->aux_sym.elf, scn)) != NULL)
+               {
+                 GElf_Shdr shdr_mem, *shdr = gelf_getshdr (scn, &shdr_mem);
+                 if (shdr != NULL)
+                   switch (shdr->sh_type)
+                     {
+                     case SHT_SYMTAB:
+                       minisymtab = true;
+                       *aux_symscn = scn;
+                       *aux_strshndx = shdr->sh_link;
+                       mod->aux_syments = shdr->sh_size / shdr->sh_entsize;
+                       mod->aux_first_global = shdr->sh_info;
+                       if (*aux_xndxscn != NULL)
+                         return;
+                       break;
+
+                     case SHT_SYMTAB_SHNDX:
+                       *aux_xndxscn = scn;
+                       if (minisymtab)
+                         return;
+                       break;
+
+                     default:
+                       break;
+                     }
+               }
+
+             if (minisymtab)
+               /* We found one, though no SHT_SYMTAB_SHNDX to go with it.  */
+               return;
+
+             /* We found no SHT_SYMTAB, so everything else is bogus.  */
+             *aux_xndxscn = NULL;
+             *aux_strshndx = 0;
+             mod->aux_syments = 0;
+             elf_end (mod->aux_sym.elf);
+             mod->aux_sym.elf = NULL;
+             return;
+           }
+       }
+    }
+  else
+    free (buffer);
+#endif
+}
+
 /* Try to find a symbol table in either MOD->main.elf or MOD->debug.elf.  */
 static void
 find_symtab (Dwfl_Module *mod)
 {
-  if (mod->symdata != NULL     /* Already done.  */
+  if (mod->symdata != NULL || mod->aux_symdata != NULL /* Already done.  */
       || mod->symerr != DWFL_E_NOERROR) /* Cached previous failure.  */
     return;
 
@@ -824,11 +988,10 @@ find_symtab (Dwfl_Module *mod)
   if (mod->symerr != DWFL_E_NOERROR)
     return;
 
-  mod->first_global = -1; /* Unknown, unless explicitly set by load_symtab.  */
-
   /* First see if the main ELF file has the debugging information.  */
   Elf_Scn *symscn = NULL, *xndxscn = NULL;
-  GElf_Word strshndx;
+  Elf_Scn *aux_symscn = NULL, *aux_xndxscn = NULL;
+  GElf_Word strshndx, aux_strshndx = 0;
   mod->symerr = load_symtab (&mod->main, &mod->symfile, &symscn,
                             &xndxscn, &mod->syments, &mod->first_global,
                             &strshndx);
@@ -868,6 +1031,9 @@ find_symtab (Dwfl_Module *mod)
          break;
 
        case DWFL_E_NO_SYMTAB:
+         /* There might be an auxiliary table.  */
+         find_aux_sym (mod, &aux_symscn, &aux_xndxscn, &aux_strshndx);
+
          if (symscn != NULL)
            {
              /* We still have the dynamic symbol table.  */
@@ -875,6 +1041,13 @@ find_symtab (Dwfl_Module *mod)
              break;
            }
 
+         if (aux_symscn != NULL)
+           {
+             /* We still have the auxiliary symbol table.  */
+             mod->symerr = DWFL_E_NOERROR;
+             goto aux_cache;
+           }
+
          /* Last ditch, look for dynamic symbols without section headers.  */
          find_dynsym (mod);
          return;
@@ -887,7 +1060,7 @@ find_symtab (Dwfl_Module *mod)
     {
     elferr:
       mod->symerr = DWFL_E (LIBELF, elf_errno ());
-      return;
+      goto aux_cleanup;
     }
 
   /* Cache the data; MOD->syments and MOD->first_global were set above.  */
@@ -909,6 +1082,40 @@ find_symtab (Dwfl_Module *mod)
   mod->symdata = elf_getdata (symscn, NULL);
   if (mod->symdata == NULL)
     goto elferr;
+
+  /* Cache any auxiliary symbol info, when it fails, just ignore aux_sym.  */
+  if (aux_symscn != NULL)
+    {
+  aux_cache:
+      /* This does some sanity checks on the string table section.  */
+      if (elf_strptr (mod->aux_sym.elf, aux_strshndx, 0) == NULL)
+       {
+       aux_cleanup:
+         mod->aux_syments = 0;
+         elf_end (mod->aux_sym.elf);
+         mod->aux_sym.elf = NULL;
+         return;
+       }
+
+      mod->aux_symstrdata = elf_getdata (elf_getscn (mod->aux_sym.elf,
+                                                    aux_strshndx),
+                                        NULL);
+      if (mod->aux_symstrdata == NULL)
+       goto aux_cleanup;
+
+      if (aux_xndxscn == NULL)
+       mod->aux_symxndxdata = NULL;
+      else
+       {
+         mod->aux_symxndxdata = elf_getdata (aux_xndxscn, NULL);
+         if (mod->aux_symxndxdata == NULL)
+           goto aux_cleanup;
+       }
+
+      mod->aux_symdata = elf_getdata (aux_symscn, NULL);
+      if (mod->aux_symdata == NULL)
+       goto aux_cleanup;
+    }
 }
 
 
@@ -999,6 +1206,11 @@ find_dw (Dwfl_Module *mod)
     case DWFL_E_NOERROR:
       mod->debug.elf = mod->main.elf;
       mod->debug.address_sync = mod->main.address_sync;
+
+      /* The Dwarf might need an alt debug file, find that now after
+        everything about the debug file has been setup (the
+        find_debuginfo callback might need it).  */
+      find_debug_altlink (mod, mod->main.name);
       return;
 
     case DWFL_E_NO_DWARF:
@@ -1014,6 +1226,15 @@ find_dw (Dwfl_Module *mod)
     {
     case DWFL_E_NOERROR:
       mod->dwerr = load_dw (mod, &mod->debug);
+      if (mod->dwerr == DWFL_E_NOERROR)
+       {
+         /* The Dwarf might need an alt debug file, find that now after
+            everything about the debug file has been setup (the
+            find_debuginfo callback might need it).  */
+         find_debug_altlink (mod, mod->debug.name);
+         return;
+       }
+
       break;
 
     case DWFL_E_CB:            /* The find_debuginfo hook failed.  */
@@ -1064,9 +1285,34 @@ dwfl_module_getsymtab (Dwfl_Module *mod)
 
   find_symtab (mod);
   if (mod->symerr == DWFL_E_NOERROR)
-    return mod->syments;
+    /* We will skip the auxiliary zero entry if there is another one.  */
+    return (mod->syments + mod->aux_syments
+           - (mod->syments > 0 && mod->aux_syments > 0 ? 1 : 0));
 
   __libdwfl_seterrno (mod->symerr);
   return -1;
 }
 INTDEF (dwfl_module_getsymtab)
+
+int
+dwfl_module_getsymtab_first_global (Dwfl_Module *mod)
+{
+  if (mod == NULL)
+    return -1;
+
+  find_symtab (mod);
+  if (mod->symerr == DWFL_E_NOERROR)
+    {
+      /* All local symbols should come before all global symbols.  If
+        we have an auxiliary table make sure all the main locals come
+        first, then all aux locals, then all main globals and finally all
+        aux globals.  And skip the auxiliary table zero undefined
+        entry.  */
+      int skip_aux_zero = (mod->syments > 0 && mod->aux_syments > 0) ? 1 : 0;
+      return mod->first_global + mod->aux_first_global - skip_aux_zero;
+    }
+
+  __libdwfl_seterrno (mod->symerr);
+  return -1;
+}
+INTDEF (dwfl_module_getsymtab_first_global)
index 9103380..42d2b67 100644 (file)
@@ -1,5 +1,5 @@
 /* Find debugging and symbol information for a module in libdwfl.
-   Copyright (C) 2006-2010 Red Hat, Inc.
+   Copyright (C) 2006-2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
 #include "libdwflP.h"
 
 const char *
-dwfl_module_getsym (Dwfl_Module *mod, int ndx,
-                   GElf_Sym *sym, GElf_Word *shndxp)
+internal_function
+__libdwfl_getsym (Dwfl_Module *mod, int ndx, GElf_Sym *sym, GElf_Addr *addr,
+                 GElf_Word *shndxp, Elf **elfp, Dwarf_Addr *biasp,
+                 bool *resolved, bool adjust_st_value)
 {
   if (unlikely (mod == NULL))
     return NULL;
@@ -42,8 +44,56 @@ dwfl_module_getsym (Dwfl_Module *mod, int ndx,
        return NULL;
     }
 
+  /* All local symbols should come before all global symbols.  If we
+     have an auxiliary table make sure all the main locals come first,
+     then all aux locals, then all main globals and finally all aux globals.
+     And skip the auxiliary table zero undefined entry.  */
   GElf_Word shndx;
-  sym = gelf_getsymshndx (mod->symdata, mod->symxndxdata, ndx, sym, &shndx);
+  int tndx = ndx;
+  int skip_aux_zero = (mod->syments > 0 && mod->aux_syments > 0) ? 1 : 0;
+  Elf *elf;
+  Elf_Data *symdata;
+  Elf_Data *symxndxdata;
+  Elf_Data *symstrdata;
+  if (mod->aux_symdata == NULL
+      || ndx < mod->first_global)
+    {
+      /* main symbol table (locals).  */
+      tndx = ndx;
+      elf = mod->symfile->elf;
+      symdata = mod->symdata;
+      symxndxdata = mod->symxndxdata;
+      symstrdata = mod->symstrdata;
+    }
+  else if (ndx < mod->first_global + mod->aux_first_global - skip_aux_zero)
+    {
+      /* aux symbol table (locals).  */
+      tndx = ndx - mod->first_global + skip_aux_zero;
+      elf = mod->aux_sym.elf;
+      symdata = mod->aux_symdata;
+      symxndxdata = mod->aux_symxndxdata;
+      symstrdata = mod->aux_symstrdata;
+    }
+  else if ((size_t) ndx < mod->syments + mod->aux_first_global - skip_aux_zero)
+    {
+      /* main symbol table (globals).  */
+      tndx = ndx - mod->aux_first_global + skip_aux_zero;
+      elf = mod->symfile->elf;
+      symdata = mod->symdata;
+      symxndxdata = mod->symxndxdata;
+      symstrdata = mod->symstrdata;
+    }
+  else
+    {
+      /* aux symbol table (globals).  */
+      tndx = ndx - mod->syments + skip_aux_zero;
+      elf = mod->aux_sym.elf;
+      symdata = mod->aux_symdata;
+      symxndxdata = mod->aux_symxndxdata;
+      symstrdata = mod->aux_symstrdata;
+    }
+  sym = gelf_getsymshndx (symdata, symxndxdata, tndx, sym, &shndx);
+
   if (unlikely (sym == NULL))
     {
       __libdwfl_seterrno (DWFL_E_LIBELF);
@@ -60,11 +110,37 @@ dwfl_module_getsym (Dwfl_Module *mod, int ndx,
          || (sym->st_shndx < SHN_LORESERVE && sym->st_shndx != SHN_UNDEF)))
     {
       GElf_Shdr shdr_mem;
-      GElf_Shdr *shdr = gelf_getshdr (elf_getscn (mod->symfile->elf, shndx),
-                                     &shdr_mem);
+      GElf_Shdr *shdr = gelf_getshdr (elf_getscn (elf, shndx), &shdr_mem);
       alloc = unlikely (shdr == NULL) || (shdr->sh_flags & SHF_ALLOC);
     }
 
+  /* In case of an value in an allocated section the main Elf Ebl
+     might know where the real value is (e.g. for function
+     descriptors).  */
+
+  char *ident;
+  GElf_Addr st_value = sym->st_value & ebl_func_addr_mask (mod->ebl);
+  *resolved = false;
+  if (! adjust_st_value && mod->e_type != ET_REL && alloc
+      && (GELF_ST_TYPE (sym->st_info) == STT_FUNC
+         || (GELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
+             && (ident = elf_getident (elf, NULL)) != NULL
+             && ident[EI_OSABI] == ELFOSABI_LINUX)))
+    {
+      if (likely (__libdwfl_module_getebl (mod) == DWFL_E_NOERROR))
+       {
+         if (elf != mod->main.elf)
+           {
+             st_value = dwfl_adjusted_st_value (mod, elf, st_value);
+             st_value = dwfl_deadjust_st_value (mod, mod->main.elf, st_value);
+           }
+
+         *resolved = ebl_resolve_sym_value (mod->ebl, &st_value);
+         if (! *resolved)
+           st_value = sym->st_value;
+       }
+    }
+
   if (shndxp != NULL)
     /* Yield -1 in case of a non-SHF_ALLOC section.  */
     *shndxp = alloc ? shndx : (GElf_Word) -1;
@@ -82,9 +158,9 @@ dwfl_module_getsym (Dwfl_Module *mod, int ndx,
          /* In an ET_REL file, the symbol table values are relative
             to the section, not to the module's load base.  */
          size_t symshstrndx = SHN_UNDEF;
-         Dwfl_Error result = __libdwfl_relocate_value (mod, mod->symfile->elf,
+         Dwfl_Error result = __libdwfl_relocate_value (mod, elf,
                                                        &symshstrndx,
-                                                       shndx, &sym->st_value);
+                                                       shndx, &st_value);
          if (unlikely (result != DWFL_E_NOERROR))
            {
              __libdwfl_seterrno (result);
@@ -93,15 +169,48 @@ dwfl_module_getsym (Dwfl_Module *mod, int ndx,
        }
       else if (alloc)
        /* Apply the bias to the symbol value.  */
-       sym->st_value = dwfl_adjusted_st_value (mod, sym->st_value);
+       st_value = dwfl_adjusted_st_value (mod,
+                                          *resolved ? mod->main.elf : elf,
+                                          st_value);
       break;
     }
 
-  if (unlikely (sym->st_name >= mod->symstrdata->d_size))
+  if (adjust_st_value)
+    sym->st_value = st_value;
+
+  if (addr != NULL)
+    *addr = st_value;
+
+  if (unlikely (sym->st_name >= symstrdata->d_size))
     {
       __libdwfl_seterrno (DWFL_E_BADSTROFF);
       return NULL;
     }
-  return (const char *) mod->symstrdata->d_buf + sym->st_name;
+  if (elfp)
+    *elfp = elf;
+  if (biasp)
+    *biasp = dwfl_adjusted_st_value (mod, elf, 0);
+  return (const char *) symstrdata->d_buf + sym->st_name;
+}
+
+const char *
+dwfl_module_getsym_info (Dwfl_Module *mod, int ndx,
+                        GElf_Sym *sym, GElf_Addr *addr,
+                        GElf_Word *shndxp,
+                        Elf **elfp, Dwarf_Addr *bias)
+{
+  bool resolved;
+  return __libdwfl_getsym (mod, ndx, sym, addr, shndxp, elfp, bias,
+                          &resolved, false);
+}
+INTDEF (dwfl_module_getsym_info)
+
+const char *
+dwfl_module_getsym (Dwfl_Module *mod, int ndx,
+                   GElf_Sym *sym, GElf_Word *shndxp)
+{
+  bool resolved;
+  return __libdwfl_getsym (mod, ndx, sym, NULL, shndxp, NULL, NULL,
+                          &resolved, true);
 }
 INTDEF (dwfl_module_getsym)
index e14002c..df16be4 100644 (file)
@@ -49,7 +49,7 @@ dwfl_module_info (Dwfl_Module *mod, void ***userdata,
               : dwfl_adjusted_dwarf_addr (mod, 0));
   if (symbias)
     *symbias = (mod->symfile == NULL ? (Dwarf_Addr) -1
-               : dwfl_adjusted_st_value (mod, 0));
+               : dwfl_adjusted_st_value (mod, mod->symfile->elf, 0));
 
   if (mainfile)
     *mainfile = mod->main.name;
index 35d9f48..3a4ae2e 100644 (file)
    rejiggering (see below).  */
 #define REL_MIN_ALIGN  ((GElf_Xword) 0x100)
 
-Dwfl_Module *
+bool
 internal_function
-__libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
-                     int fd, Elf *elf, GElf_Addr base, bool sanity)
+__libdwfl_elf_address_range (Elf *elf, GElf_Addr base, bool add_p_vaddr,
+                            bool sanity, GElf_Addr *vaddrp,
+                            GElf_Addr *address_syncp, GElf_Addr *startp,
+                            GElf_Addr *endp, GElf_Addr *biasp,
+                            GElf_Half *e_typep)
 {
   GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (elf, &ehdr_mem);
   if (ehdr == NULL)
     {
     elf_error:
       __libdwfl_seterrno (DWFL_E_LIBELF);
-      return NULL;
+      return false;
     }
 
   GElf_Addr vaddr = 0;
@@ -166,6 +169,7 @@ __libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
     case ET_CORE:
       /* An assigned base address is meaningless for these.  */
       base = 0;
+      add_p_vaddr = true;
 
     case ET_DYN:
     default:;
@@ -181,13 +185,19 @@ __libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
            {
              vaddr = ph->p_vaddr & -ph->p_align;
              address_sync = ph->p_vaddr + ph->p_memsz;
-             if ((base & (ph->p_align - 1)) != 0)
-               base = (base + ph->p_align - 1) & -ph->p_align;
-             start = base + (ph->p_vaddr & -ph->p_align);
              break;
            }
        }
-      bias = start - vaddr;
+      if (add_p_vaddr)
+       {
+         start = base + vaddr;
+         bias = base;
+       }
+      else
+       {
+         start = base;
+         bias = base - vaddr;
+       }
 
       for (size_t i = phnum; i-- > 0;)
        {
@@ -197,7 +207,7 @@ __libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
          if (ph->p_type == PT_LOAD
              && ph->p_vaddr + ph->p_memsz > 0)
            {
-             end = base + (ph->p_vaddr + ph->p_memsz);
+             end = bias + (ph->p_vaddr + ph->p_memsz);
              break;
            }
        }
@@ -205,11 +215,37 @@ __libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
       if (end == 0 && sanity)
        {
          __libdwfl_seterrno (DWFL_E_NO_PHDR);
-         return NULL;
+         return false;
        }
       break;
     }
+  if (vaddrp)
+    *vaddrp = vaddr;
+  if (address_syncp)
+    *address_syncp = address_sync;
+  if (startp)
+    *startp = start;
+  if (endp)
+    *endp = end;
+  if (biasp)
+    *biasp = bias;
+  if (e_typep)
+    *e_typep = ehdr->e_type;
+  return true;
+}
 
+Dwfl_Module *
+internal_function
+__libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
+                     int fd, Elf *elf, GElf_Addr base, bool add_p_vaddr,
+                     bool sanity)
+{
+  GElf_Addr vaddr, address_sync, start, end, bias;
+  GElf_Half e_type;
+  if (! __libdwfl_elf_address_range (elf, base, add_p_vaddr, sanity, &vaddr,
+                                    &address_sync, &start, &end, &bias,
+                                    &e_type))
+    return NULL;
   Dwfl_Module *m = INTUSE(dwfl_report_module) (dwfl, name, start, end);
   if (m != NULL)
     {
@@ -234,7 +270,7 @@ __libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
          m->main.vaddr = vaddr;
          m->main.address_sync = address_sync;
          m->main_bias = bias;
-         m->e_type = ehdr->e_type;
+         m->e_type = e_type;
        }
       else
        {
@@ -248,8 +284,8 @@ __libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
 }
 
 Dwfl_Module *
-dwfl_report_elf (Dwfl *dwfl, const char *name,
-                const char *file_name, int fd, GElf_Addr base)
+dwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name, int fd,
+                GElf_Addr base, bool add_p_vaddr)
 {
   bool closefd = false;
   if (fd < 0)
@@ -272,7 +308,7 @@ dwfl_report_elf (Dwfl *dwfl, const char *name,
     }
 
   Dwfl_Module *mod = __libdwfl_report_elf (dwfl, name, file_name,
-                                          fd, elf, base, true);
+                                          fd, elf, base, add_p_vaddr, true);
   if (mod == NULL)
     {
       elf_end (elf);
@@ -283,3 +319,20 @@ dwfl_report_elf (Dwfl *dwfl, const char *name,
   return mod;
 }
 INTDEF (dwfl_report_elf)
+NEW_VERSION (dwfl_report_elf, ELFUTILS_0.156)
+
+#ifdef SHARED
+Dwfl_Module *
+  _compat_without_add_p_vaddr_dwfl_report_elf (Dwfl *dwfl, const char *name,
+                                              const char *file_name, int fd,
+                                              GElf_Addr base);
+COMPAT_VERSION_NEWPROTO (dwfl_report_elf, ELFUTILS_0.122, without_add_p_vaddr)
+
+Dwfl_Module *
+_compat_without_add_p_vaddr_dwfl_report_elf (Dwfl *dwfl, const char *name,
+                                            const char *file_name, int fd,
+                                            GElf_Addr base)
+{
+  return dwfl_report_elf (dwfl, name, file_name, fd, base, true);
+}
+#endif
index afe9da1..dfecb51 100644 (file)
@@ -37,6 +37,7 @@
 #include <sys/param.h>
 #include <alloca.h>
 #include <endian.h>
+#include <unistd.h>
 
 
 /* A good size for the initial read from memory, if it's not too costly.
@@ -83,7 +84,8 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name,
                            Dwfl_Memory_Callback *memory_callback,
                            void *memory_callback_arg,
                            Dwfl_Module_Callback *read_eagerly,
-                           void *read_eagerly_arg)
+                           void *read_eagerly_arg,
+                           const struct r_debug_info *r_debug_info)
 {
   size_t segment = ndx;
 
@@ -425,7 +427,10 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name,
   /* We must have seen the segment covering offset 0, or else the ELF
      header we read at START was not produced by these program headers.  */
   if (unlikely (!found_bias))
-    return finish ();
+    {
+      free (build_id);
+      return finish ();
+    }
 
   /* Now we know enough to report a module for sure: its bounds.  */
   module_start += bias;
@@ -433,6 +438,95 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name,
 
   dyn_vaddr += bias;
 
+  /* NAME found from link map has precedence over DT_SONAME possibly read
+     below.  */
+  bool name_is_final = false;
+
+  /* Try to match up DYN_VADDR against L_LD as found in link map.
+     Segments sniffing may guess invalid address as the first read-only memory
+     mapping may not be dumped to the core file (if ELF headers are not dumped)
+     and the ELF header is dumped first with the read/write mapping of the same
+     file at higher addresses.  */
+  if (r_debug_info != NULL)
+    for (const struct r_debug_info_module *module = r_debug_info->module;
+        module != NULL; module = module->next)
+      if (module_start <= module->l_ld && module->l_ld < module_end)
+       {
+         /* L_LD read from link map must be right while DYN_VADDR is unsafe.
+            Therefore subtract DYN_VADDR and add L_LD to get a possibly
+            corrective displacement for all addresses computed so far.  */
+         GElf_Addr fixup = module->l_ld - dyn_vaddr;
+         if ((fixup & (dwfl->segment_align - 1)) == 0
+             && module_start + fixup <= module->l_ld
+             && module->l_ld < module_end + fixup)
+           {
+             module_start += fixup;
+             module_end += fixup;
+             dyn_vaddr += fixup;
+             bias += fixup;
+             if (module->name[0] != '\0')
+               {
+                 name = basename (module->name);
+                 name_is_final = true;
+               }
+             break;
+           }
+       }
+
+  if (r_debug_info != NULL)
+    {
+      bool skip_this_module = false;
+      for (struct r_debug_info_module *module = r_debug_info->module;
+          module != NULL; module = module->next)
+       if ((module_end > module->start && module_start < module->end)
+           || dyn_vaddr == module->l_ld)
+         {
+           bool close_elf = false;
+           if (! module->disk_file_has_build_id && build_id_len > 0)
+             {
+               /* Module found in segments with build-id is more reliable
+                  than a module found via DT_DEBUG on disk without any
+                  build-id.   */
+               if (module->elf != NULL)
+                 close_elf = true;
+             }
+           if (module->elf != NULL
+               && module->disk_file_has_build_id && build_id_len > 0)
+             {
+               const void *elf_build_id;
+               ssize_t elf_build_id_len;
+
+               /* If there is a build id in the elf file, check it.  */
+               elf_build_id_len = INTUSE(dwelf_elf_gnu_build_id) (module->elf,
+                                                               &elf_build_id);
+               if (elf_build_id_len > 0)
+                 {
+                   if (build_id_len != (size_t) elf_build_id_len
+                       || memcmp (build_id, elf_build_id, build_id_len) != 0)
+                     close_elf = true;
+                 }
+             }
+           if (close_elf)
+             {
+               elf_end (module->elf);
+               close (module->fd);
+               module->elf = NULL;
+               module->fd = -1;
+             }
+           if (module->elf != NULL)
+             {
+               /* Ignore this found module if it would conflict in address
+                  space with any already existing module of DWFL.  */
+               skip_this_module = true;
+             }
+         }
+      if (skip_this_module)
+       {
+         free (build_id);
+         return finish ();
+       }
+    }
+
   /* Our return value now says to skip the segments contained
      within the module.  */
   ndx = addr_segndx (dwfl, segment, module_end, true);
@@ -518,7 +612,7 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name,
 
   void *soname = NULL;
   size_t soname_size = 0;
-  if (dynstrsz != 0 && dynstr_vaddr != 0)
+  if (! name_is_final && dynstrsz != 0 && dynstr_vaddr != 0)
     {
       /* We know the bounds of the .dynstr section.
 
@@ -650,6 +744,7 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name,
       mod->main.elf = elf;
       mod->main.vaddr = module_start - bias;
       mod->main.address_sync = module_address_sync;
+      mod->main_bias = bias;
     }
 
   return finish ();
index 528c35f..df9fbe6 100644 (file)
@@ -1,5 +1,5 @@
 /* Reconstruct an ELF file by reading the segments out of remote memory.
-   Copyright (C) 2005-2011 Red Hat, Inc.
+   Copyright (C) 2005-2011, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
    MAXREAD bytes from the remote memory at target address ADDRESS into the
    local buffer at DATA; it should return -1 for errors (with code in
    `errno'), 0 if it failed to read at least MINREAD bytes due to EOF, or
-   the number of bytes read if >= MINREAD.  ARG is passed through.  */
+   the number of bytes read if >= MINREAD.  ARG is passed through.
+
+   PAGESIZE is the minimum page size and alignment used for the PT_LOAD
+   segments.  */
 
 Elf *
 elf_from_remote_memory (GElf_Addr ehdr_vma,
+                       GElf_Xword pagesize,
                        GElf_Addr *loadbasep,
                        ssize_t (*read_memory) (void *arg, void *data,
                                                GElf_Addr address,
@@ -83,6 +87,7 @@ elf_from_remote_memory (GElf_Addr ehdr_vma,
   if (memcmp (buffer, ELFMAG, SELFMAG) != 0)
     {
     bad_elf:
+      free (buffer);
       __libdwfl_seterrno (DWFL_E_BADELF);
       return NULL;
     }
@@ -191,25 +196,39 @@ elf_from_remote_memory (GElf_Addr ehdr_vma,
   /* Scan for PT_LOAD segments to find the total size of the file image.  */
   size_t contents_size = 0;
   GElf_Off segments_end = 0;
+  GElf_Off segments_end_mem = 0;
   GElf_Addr loadbase = ehdr_vma;
   bool found_base = false;
   switch (ehdr.e32.e_ident[EI_CLASS])
     {
-      inline void handle_segment (GElf_Addr vaddr, GElf_Off offset,
-                                 GElf_Xword filesz, GElf_Xword align)
+      /* Sanity checks segments and calculates segment_end,
+        segments_end, segments_end_mem and loadbase (if not
+        found_base yet).  Returns true if sanity checking failed,
+        false otherwise.  */
+      inline bool handle_segment (GElf_Addr vaddr, GElf_Off offset,
+                                 GElf_Xword filesz, GElf_Xword memsz,
+                                 GElf_Xword palign)
        {
-         GElf_Off segment_end = ((offset + filesz + align - 1) & -align);
+         /* Sanity check the alignment requirements.  */
+         if ((palign & (pagesize - 1)) != 0
+             || ((vaddr - offset) & (palign - 1)) != 0)
+           return true;
+
+         GElf_Off segment_end = ((offset + filesz + pagesize - 1)
+                                 & -pagesize);
 
          if (segment_end > (GElf_Off) contents_size)
            contents_size = segment_end;
 
-         if (!found_base && (offset & -align) == 0)
+         if (!found_base && (offset & -pagesize) == 0)
            {
-             loadbase = ehdr_vma - (vaddr & -align);
+             loadbase = ehdr_vma - (vaddr & -pagesize);
              found_base = true;
            }
 
          segments_end = offset + filesz;
+         segments_end_mem = offset + memsz;
+         return false;
        }
 
     case ELFCLASS32:
@@ -218,8 +237,10 @@ elf_from_remote_memory (GElf_Addr ehdr_vma,
        goto libelf_error;
       for (uint_fast16_t i = 0; i < phnum; ++i)
        if (phdrs.p32[i].p_type == PT_LOAD)
-         handle_segment (phdrs.p32[i].p_vaddr, phdrs.p32[i].p_offset,
-                         phdrs.p32[i].p_filesz, phdrs.p32[i].p_align);
+         if (handle_segment (phdrs.p32[i].p_vaddr, phdrs.p32[i].p_offset,
+                             phdrs.p32[i].p_filesz, phdrs.p32[i].p_memsz,
+                             phdrs.p32[i].p_align))
+           goto bad_elf;
       break;
 
     case ELFCLASS64:
@@ -228,8 +249,10 @@ elf_from_remote_memory (GElf_Addr ehdr_vma,
        goto libelf_error;
       for (uint_fast16_t i = 0; i < phnum; ++i)
        if (phdrs.p64[i].p_type == PT_LOAD)
-         handle_segment (phdrs.p64[i].p_vaddr, phdrs.p64[i].p_offset,
-                         phdrs.p64[i].p_filesz, phdrs.p64[i].p_align);
+         if (handle_segment (phdrs.p64[i].p_vaddr, phdrs.p64[i].p_offset,
+                             phdrs.p64[i].p_filesz, phdrs.p64[i].p_memsz,
+                             phdrs.p64[i].p_align))
+           goto bad_elf;
       break;
 
     default:
@@ -239,9 +262,11 @@ elf_from_remote_memory (GElf_Addr ehdr_vma,
 
   /* Trim the last segment so we don't bother with zeros in the last page
      that are off the end of the file.  However, if the extra bit in that
-     page includes the section headers, keep them.  */
+     page includes the section headers and the memory isn't extended (which
+     might indicate it will have been reused otherwise), keep them.  */
   if ((GElf_Off) contents_size > segments_end
-      && (GElf_Off) contents_size >= shdrs_end)
+      && (GElf_Off) contents_size >= shdrs_end
+      && segments_end == segments_end_mem)
     {
       contents_size = segments_end;
       if ((GElf_Off) contents_size < shdrs_end)
@@ -259,15 +284,17 @@ elf_from_remote_memory (GElf_Addr ehdr_vma,
 
   switch (ehdr.e32.e_ident[EI_CLASS])
     {
+      /* Reads the given segment.  Returns true if reading fails,
+        false otherwise.  */
       inline bool handle_segment (GElf_Addr vaddr, GElf_Off offset,
-                                 GElf_Xword filesz, GElf_Xword align)
+                                 GElf_Xword filesz)
        {
-         GElf_Off start = offset & -align;
-         GElf_Off end = (offset + filesz + align - 1) & -align;
+         GElf_Off start = offset & -pagesize;
+         GElf_Off end = (offset + filesz + pagesize - 1) & -pagesize;
          if (end > (GElf_Off) contents_size)
            end = contents_size;
          nread = (*read_memory) (arg, buffer + start,
-                                 (loadbase + vaddr) & -align,
+                                 (loadbase + vaddr) & -pagesize,
                                  end - start, end - start);
          return nread <= 0;
        }
@@ -276,7 +303,7 @@ elf_from_remote_memory (GElf_Addr ehdr_vma,
       for (uint_fast16_t i = 0; i < phnum; ++i)
        if (phdrs.p32[i].p_type == PT_LOAD)
          if (handle_segment (phdrs.p32[i].p_vaddr, phdrs.p32[i].p_offset,
-                             phdrs.p32[i].p_filesz, phdrs.p32[i].p_align))
+                             phdrs.p32[i].p_filesz))
            goto read_error;
 
       /* If the segments visible in memory didn't include the section
@@ -301,9 +328,9 @@ elf_from_remote_memory (GElf_Addr ehdr_vma,
 
     case ELFCLASS64:
       for (uint_fast16_t i = 0; i < phnum; ++i)
-       if (phdrs.p32[i].p_type == PT_LOAD)
+       if (phdrs.p64[i].p_type == PT_LOAD)
          if (handle_segment (phdrs.p64[i].p_vaddr, phdrs.p64[i].p_offset,
-                             phdrs.p64[i].p_filesz, phdrs.p64[i].p_align))
+                             phdrs.p64[i].p_filesz))
            goto read_error;
 
       /* If the segments visible in memory didn't include the section
index 21db91a..3f5314a 100644 (file)
@@ -1,5 +1,5 @@
 /* Standard find_debuginfo callback for libdwfl.
-   Copyright (C) 2005-2010 Red Hat, Inc.
+   Copyright (C) 2005-2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -84,6 +84,45 @@ check_crc (int fd, GElf_Word debuglink_crc)
 static bool
 validate (Dwfl_Module *mod, int fd, bool check, GElf_Word debuglink_crc)
 {
+  /* For alt debug files always check the build-id from the Dwarf and alt.  */
+  if (mod->dw != NULL)
+    {
+      bool valid = false;
+      const void *build_id;
+      const char *altname;
+      ssize_t build_id_len = INTUSE(dwelf_dwarf_gnu_debugaltlink) (mod->dw,
+                                                                  &altname,
+                                                                  &build_id);
+      if (build_id_len > 0)
+       {
+         /* We need to open an Elf handle on the file so we can check its
+            build ID note for validation.  Backdoor the handle into the
+            module data structure since we had to open it early anyway.  */
+         Dwfl_Error error = __libdw_open_file (&fd, &mod->alt_elf,
+                                               false, false);
+         if (error != DWFL_E_NOERROR)
+           __libdwfl_seterrno (error);
+         else
+           {
+             const void *alt_build_id;
+             ssize_t alt_len = INTUSE(dwelf_elf_gnu_build_id) (mod->alt_elf,
+                                                               &alt_build_id);
+             if (alt_len > 0 && alt_len == build_id_len
+                 && memcmp (build_id, alt_build_id, alt_len) == 0)
+               valid = true;
+             else
+               {
+                 /* A mismatch!  */
+                 elf_end (mod->alt_elf);
+                 mod->alt_elf = NULL;
+                 close (fd);
+                 fd = -1;
+               }
+           }
+       }
+      return valid;
+    }
+
   /* If we have a build ID, check only that.  */
   if (mod->build_id_len > 0)
     {
@@ -124,7 +163,9 @@ find_debuginfo_in_path (Dwfl_Module *mod, const char *file_name,
   const char *file_basename = file_name == NULL ? NULL : basename (file_name);
   if (debuglink_file == NULL)
     {
-      if (file_basename == NULL)
+      /* For a alt debug multi file we need a name, for a separate debug
+        name we may be able to fall back on file_basename.debug.  */
+      if (file_basename == NULL || mod->dw != NULL)
        {
          errno = 0;
          return -1;
@@ -174,38 +215,67 @@ find_debuginfo_in_path (Dwfl_Module *mod, const char *file_name,
        check = *p++ == '+';
       check = check && cancheck;
 
-      const char *dir, *subdir;
+      const char *dir, *subdir, *file;
       switch (p[0])
        {
        case '\0':
          /* An empty entry says to try the main file's directory.  */
          dir = file_dirname;
          subdir = NULL;
+         file = debuglink_file;
          break;
        case '/':
          /* An absolute path says to look there for a subdirectory
-            named by the main file's absolute directory.
-            This cannot be applied to a relative file name.  */
-         if (file_dirname == NULL || file_dirname[0] != '/')
+            named by the main file's absolute directory.  This cannot
+            be applied to a relative file name.  For alt debug files
+            it means to look for the basename file in that dir or the
+            .dwz subdir (see below).  */
+         if (mod->dw == NULL
+             && (file_dirname == NULL || file_dirname[0] != '/'))
            continue;
          dir = p;
-         subdir = file_dirname + 1;
+         if (mod->dw == NULL)
+           {
+             subdir = file_dirname + 1;
+             file = debuglink_file;
+           }
+         else
+           {
+             subdir = NULL;
+             file = basename (debuglink_file);
+           }
          break;
        default:
          /* A relative path says to try a subdirectory of that name
             in the main file's directory.  */
          dir = file_dirname;
          subdir = p;
+         file = debuglink_file;
          break;
        }
 
       char *fname = NULL;
-      int fd = try_open (&main_stat, dir, subdir, debuglink_file, &fname);
+      int fd = try_open (&main_stat, dir, subdir, file, &fname);
       if (fd < 0)
        switch (errno)
          {
          case ENOENT:
          case ENOTDIR:
+           /* If we are looking for the alt file also try the .dwz subdir.
+              But only if this is the empty or absolute path.  */
+           if (mod->dw != NULL && (p[0] == '\0' || p[0] == '/'))
+             {
+               fd = try_open (&main_stat, dir, ".dwz",
+                              basename (file), &fname);
+               if (fd < 0)
+                 {
+                   if (errno != ENOENT && errno != ENOTDIR)
+                     return -1;
+                   else
+                     continue;
+                 }
+               break;
+             }
            continue;
          default:
            return -1;
@@ -240,11 +310,21 @@ dwfl_standard_find_debuginfo (Dwfl_Module *mod,
   GElf_Addr vaddr;
   if (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
+        some user code out there also does this, so we'll have to
+        handle it anyway.  */
       int fd = INTUSE(dwfl_build_id_find_debuginfo) (mod,
                                                     NULL, NULL, 0,
                                                     NULL, NULL, 0,
                                                     debuginfo_file_name);
-      if (fd >= 0 || mod->debug.elf != NULL || errno != 0)
+
+      /* Did the build_id callback find something or report an error?
+         Then we are done.  Otherwise fallback on path based search.  */
+      if (fd >= 0
+         || (mod->dw == NULL && mod->debug.elf != NULL)
+         || (mod->dw != NULL && mod->alt_elf != NULL)
+         || errno != 0)
        return fd;
     }
 
diff --git a/libdwfl/frame_unwind.c b/libdwfl/frame_unwind.c
new file mode 100644 (file)
index 0000000..16cebd0
--- /dev/null
@@ -0,0 +1,725 @@
+/* Get previous frame state for an existing frame state.
+   Copyright (C) 2013, 2014 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 "cfi.h"
+#include <stdlib.h>
+#include "libdwflP.h"
+#include "../libdw/dwarf.h"
+#include <sys/ptrace.h>
+
+/* Maximum number of DWARF expression stack slots before returning an error.  */
+#define DWARF_EXPR_STACK_MAX 0x100
+
+/* Maximum number of DWARF expression executed operations before returning an
+   error.  */
+#define DWARF_EXPR_STEPS_MAX 0x1000
+
+#ifndef MAX
+# define MAX(a, b) ((a) > (b) ? (a) : (b))
+#endif
+
+bool
+internal_function
+__libdwfl_frame_reg_get (Dwfl_Frame *state, unsigned regno, Dwarf_Addr *val)
+{
+  Ebl *ebl = state->thread->process->ebl;
+  if (! ebl_dwarf_to_regno (ebl, &regno))
+    return false;
+  if (regno >= ebl_frame_nregs (ebl))
+    return false;
+  if ((state->regs_set[regno / sizeof (*state->regs_set) / 8]
+       & ((uint64_t) 1U << (regno % (sizeof (*state->regs_set) * 8)))) == 0)
+    return false;
+  if (val)
+    *val = state->regs[regno];
+  return true;
+}
+
+bool
+internal_function
+__libdwfl_frame_reg_set (Dwfl_Frame *state, unsigned regno, Dwarf_Addr val)
+{
+  Ebl *ebl = state->thread->process->ebl;
+  if (! ebl_dwarf_to_regno (ebl, &regno))
+    return false;
+  if (regno >= ebl_frame_nregs (ebl))
+    return false;
+  /* For example i386 user_regs_struct has signed fields.  */
+  if (ebl_get_elfclass (ebl) == ELFCLASS32)
+    val &= 0xffffffff;
+  state->regs_set[regno / sizeof (*state->regs_set) / 8] |=
+               ((uint64_t) 1U << (regno % (sizeof (*state->regs_set) * 8)));
+  state->regs[regno] = val;
+  return true;
+}
+
+static bool
+state_get_reg (Dwfl_Frame *state, unsigned regno, Dwarf_Addr *val)
+{
+  if (! __libdwfl_frame_reg_get (state, regno, val))
+    {
+      __libdwfl_seterrno (DWFL_E_INVALID_REGISTER);
+      return false;
+    }
+  return true;
+}
+
+static int
+bra_compar (const void *key_voidp, const void *elem_voidp)
+{
+  Dwarf_Word offset = (uintptr_t) key_voidp;
+  const Dwarf_Op *op = elem_voidp;
+  return (offset > op->offset) - (offset < op->offset);
+}
+
+/* If FRAME is NULL is are computing CFI frame base.  In such case another
+   DW_OP_call_frame_cfa is no longer permitted.  */
+
+static bool
+expr_eval (Dwfl_Frame *state, Dwarf_Frame *frame, const Dwarf_Op *ops,
+          size_t nops, Dwarf_Addr *result, Dwarf_Addr bias)
+{
+  Dwfl_Process *process = state->thread->process;
+  if (nops == 0)
+    {
+      __libdwfl_seterrno (DWFL_E_INVALID_DWARF);
+      return false;
+    }
+  Dwarf_Addr *stack = NULL;
+  size_t stack_used = 0, stack_allocated = 0;
+
+  bool
+  push (Dwarf_Addr val)
+  {
+    if (stack_used >= DWARF_EXPR_STACK_MAX)
+      {
+       __libdwfl_seterrno (DWFL_E_INVALID_DWARF);
+       return false;
+      }
+    if (stack_used == stack_allocated)
+      {
+       stack_allocated = MAX (stack_allocated * 2, 32);
+       Dwarf_Addr *stack_new = realloc (stack, stack_allocated * sizeof (*stack));
+       if (stack_new == NULL)
+         {
+           __libdwfl_seterrno (DWFL_E_NOMEM);
+           return false;
+         }
+       stack = stack_new;
+      }
+    stack[stack_used++] = val;
+    return true;
+  }
+
+  bool
+  pop (Dwarf_Addr *val)
+  {
+    if (stack_used == 0)
+      {
+       __libdwfl_seterrno (DWFL_E_INVALID_DWARF);
+       return false;
+      }
+    *val = stack[--stack_used];
+    return true;
+  }
+
+  Dwarf_Addr val1, val2;
+  bool is_location = false;
+  size_t steps_count = 0;
+  for (const Dwarf_Op *op = ops; op < ops + nops; op++)
+    {
+      if (++steps_count > DWARF_EXPR_STEPS_MAX)
+       {
+         __libdwfl_seterrno (DWFL_E_INVALID_DWARF);
+         return false;
+       }
+      switch (op->atom)
+      {
+       /* DW_OP_* order matches libgcc/unwind-dw2.c execute_stack_op:  */
+       case DW_OP_lit0 ... DW_OP_lit31:
+         if (! push (op->atom - DW_OP_lit0))
+           {
+             free (stack);
+             return false;
+           }
+         break;
+       case DW_OP_addr:
+         if (! push (op->number + bias))
+           {
+             free (stack);
+             return false;
+           }
+         break;
+       case DW_OP_GNU_encoded_addr:
+         /* Missing support in the rest of elfutils.  */
+         __libdwfl_seterrno (DWFL_E_UNSUPPORTED_DWARF);
+         return false;
+       case DW_OP_const1u:
+       case DW_OP_const1s:
+       case DW_OP_const2u:
+       case DW_OP_const2s:
+       case DW_OP_const4u:
+       case DW_OP_const4s:
+       case DW_OP_const8u:
+       case DW_OP_const8s:
+       case DW_OP_constu:
+       case DW_OP_consts:
+         if (! push (op->number))
+           {
+             free (stack);
+             return false;
+           }
+         break;
+       case DW_OP_reg0 ... DW_OP_reg31:
+         if (! state_get_reg (state, op->atom - DW_OP_reg0, &val1)
+             || ! push (val1))
+           {
+             free (stack);
+             return false;
+           }
+         break;
+       case DW_OP_regx:
+         if (! state_get_reg (state, op->number, &val1) || ! push (val1))
+           {
+             free (stack);
+             return false;
+           }
+         break;
+       case DW_OP_breg0 ... DW_OP_breg31:
+         if (! state_get_reg (state, op->atom - DW_OP_breg0, &val1))
+           {
+             free (stack);
+             return false;
+           }
+         val1 += op->number;
+         if (! push (val1))
+           {
+             free (stack);
+             return false;
+           }
+         break;
+       case DW_OP_bregx:
+         if (! state_get_reg (state, op->number, &val1))
+           {
+             free (stack);
+             return false;
+           }
+         val1 += op->number2;
+         if (! push (val1))
+           {
+             free (stack);
+             return false;
+           }
+         break;
+       case DW_OP_dup:
+         if (! pop (&val1) || ! push (val1) || ! push (val1))
+           {
+             free (stack);
+             return false;
+           }
+         break;
+       case DW_OP_drop:
+         if (! pop (&val1))
+           {
+             free (stack);
+             return false;
+           }
+         break;
+       case DW_OP_pick:
+         if (stack_used <= op->number)
+           {
+             free (stack);
+             __libdwfl_seterrno (DWFL_E_INVALID_DWARF);
+             return false;
+           }
+         if (! push (stack[stack_used - 1 - op->number]))
+           {
+             free (stack);
+             return false;
+           }
+         break;
+       case DW_OP_over:
+         if (! pop (&val1) || ! pop (&val2)
+             || ! push (val2) || ! push (val1) || ! push (val2))
+           {
+             free (stack);
+             return false;
+           }
+         break;
+       case DW_OP_swap:
+         if (! pop (&val1) || ! pop (&val2) || ! push (val1) || ! push (val2))
+           {
+             free (stack);
+             return false;
+           }
+         break;
+       case DW_OP_rot:
+         {
+           Dwarf_Addr val3;
+           if (! pop (&val1) || ! pop (&val2) || ! pop (&val3)
+               || ! push (val1) || ! push (val3) || ! push (val2))
+             {
+               free (stack);
+               return false;
+             }
+         }
+         break;
+       case DW_OP_deref:
+       case DW_OP_deref_size:
+         if (process->callbacks->memory_read == NULL)
+           {
+             free (stack);
+             __libdwfl_seterrno (DWFL_E_INVALID_ARGUMENT);
+             return false;
+           }
+         if (! pop (&val1)
+             || ! process->callbacks->memory_read (process->dwfl, val1, &val1,
+                                                   process->callbacks_arg))
+           {
+             free (stack);
+             return false;
+           }
+         if (op->atom == DW_OP_deref_size)
+           {
+             const int elfclass = frame->cache->e_ident[EI_CLASS];
+             const unsigned addr_bytes = elfclass == ELFCLASS32 ? 4 : 8;
+             if (op->number > addr_bytes)
+               {
+                 free (stack);
+                 __libdwfl_seterrno (DWFL_E_INVALID_DWARF);
+                 return false;
+               }
+#if BYTE_ORDER == BIG_ENDIAN
+             if (op->number == 0)
+               val1 = 0;
+             else
+               val1 >>= (addr_bytes - op->number) * 8;
+#else
+             if (op->number < 8)
+               val1 &= (1 << (op->number * 8)) - 1;
+#endif
+           }
+         if (! push (val1))
+           {
+             free (stack);
+             return false;
+           }
+         break;
+#define UNOP(atom, expr)                                               \
+       case atom:                                                      \
+         if (! pop (&val1) || ! push (expr))                           \
+           {                                                           \
+             free (stack);                                             \
+             return false;                                             \
+           }                                                           \
+         break;
+       UNOP (DW_OP_abs, abs ((int64_t) val1))
+       UNOP (DW_OP_neg, -(int64_t) val1)
+       UNOP (DW_OP_not, ~val1)
+#undef UNOP
+       case DW_OP_plus_uconst:
+         if (! pop (&val1) || ! push (val1 + op->number))
+           {
+             free (stack);
+             return false;
+           }
+         break;
+#define BINOP(atom, op)                                                        \
+       case atom:                                                      \
+         if (! pop (&val2) || ! pop (&val1) || ! push (val1 op val2))  \
+           {                                                           \
+             free (stack);                                             \
+             return false;                                             \
+           }                                                           \
+         break;
+#define BINOP_SIGNED(atom, op)                                         \
+       case atom:                                                      \
+         if (! pop (&val2) || ! pop (&val1)                            \
+             || ! push ((int64_t) val1 op (int64_t) val2))             \
+           {                                                           \
+             free (stack);                                             \
+             return false;                                             \
+           }                                                           \
+         break;
+       BINOP (DW_OP_and, &)
+       case DW_OP_div:
+         if (! pop (&val2) || ! pop (&val1))
+           {
+             free (stack);
+             return false;
+           }
+         if (val2 == 0)
+           {
+             free (stack);
+             __libdwfl_seterrno (DWFL_E_INVALID_DWARF);
+             return false;
+           }
+         if (! push ((int64_t) val1 / (int64_t) val2))
+           {
+             free (stack);
+             return false;
+           }
+         break;
+       BINOP (DW_OP_minus, -)
+       case DW_OP_mod:
+         if (! pop (&val2) || ! pop (&val1))
+           {
+             free (stack);
+             return false;
+           }
+         if (val2 == 0)
+           {
+             free (stack);
+             __libdwfl_seterrno (DWFL_E_INVALID_DWARF);
+             return false;
+           }
+         if (! push (val1 % val2))
+           {
+             free (stack);
+             return false;
+           }
+         break;
+       BINOP (DW_OP_mul, *)
+       BINOP (DW_OP_or, |)
+       BINOP (DW_OP_plus, +)
+       BINOP (DW_OP_shl, <<)
+       BINOP (DW_OP_shr, >>)
+       BINOP_SIGNED (DW_OP_shra, >>)
+       BINOP (DW_OP_xor, ^)
+       BINOP_SIGNED (DW_OP_le, <=)
+       BINOP_SIGNED (DW_OP_ge, >=)
+       BINOP_SIGNED (DW_OP_eq, ==)
+       BINOP_SIGNED (DW_OP_lt, <)
+       BINOP_SIGNED (DW_OP_gt, >)
+       BINOP_SIGNED (DW_OP_ne, !=)
+#undef BINOP
+#undef BINOP_SIGNED
+       case DW_OP_bra:
+         if (! pop (&val1))
+           {
+             free (stack);
+             return false;
+           }
+         if (val1 == 0)
+           break;
+         /* FALLTHRU */
+       case DW_OP_skip:;
+         Dwarf_Word offset = op->offset + 1 + 2 + (int16_t) op->number;
+         const Dwarf_Op *found = bsearch ((void *) (uintptr_t) offset, ops, nops,
+                                          sizeof (*ops), bra_compar);
+         if (found == NULL)
+           {
+             free (stack);
+             /* PPC32 vDSO has such invalid operations.  */
+             __libdwfl_seterrno (DWFL_E_INVALID_DWARF);
+             return false;
+           }
+         /* Undo the 'for' statement increment.  */
+         op = found - 1;
+         break;
+       case DW_OP_nop:
+         break;
+       /* DW_OP_* not listed in libgcc/unwind-dw2.c execute_stack_op:  */
+       case DW_OP_call_frame_cfa:;
+         // Not used by CFI itself but it is synthetized by elfutils internation.
+         Dwarf_Op *cfa_ops;
+         size_t cfa_nops;
+         Dwarf_Addr cfa;
+         if (frame == NULL
+             || dwarf_frame_cfa (frame, &cfa_ops, &cfa_nops) != 0
+             || ! expr_eval (state, NULL, cfa_ops, cfa_nops, &cfa, bias)
+             || ! push (cfa))
+           {
+             __libdwfl_seterrno (DWFL_E_LIBDW);
+             free (stack);
+             return false;
+           }
+         is_location = true;
+         break;
+       case DW_OP_stack_value:
+         // Not used by CFI itself but it is synthetized by elfutils internation.
+         is_location = false;
+         break;
+       default:
+         __libdwfl_seterrno (DWFL_E_INVALID_DWARF);
+         return false;
+      }
+    }
+  if (! pop (result))
+    {
+      free (stack);
+      return false;
+    }
+  free (stack);
+  if (is_location)
+    {
+      if (process->callbacks->memory_read == NULL)
+       {
+         __libdwfl_seterrno (DWFL_E_INVALID_ARGUMENT);
+         return false;
+       }
+      if (! process->callbacks->memory_read (process->dwfl, *result, result,
+                                            process->callbacks_arg))
+       return false;
+    }
+  return true;
+}
+
+static void
+new_unwound (Dwfl_Frame *state)
+{
+  assert (state->unwound == NULL);
+  Dwfl_Thread *thread = state->thread;
+  Dwfl_Process *process = thread->process;
+  Ebl *ebl = process->ebl;
+  size_t nregs = ebl_frame_nregs (ebl);
+  assert (nregs > 0);
+  Dwfl_Frame *unwound;
+  unwound = malloc (sizeof (*unwound) + sizeof (*unwound->regs) * nregs);
+  state->unwound = unwound;
+  unwound->thread = thread;
+  unwound->unwound = NULL;
+  unwound->signal_frame = false;
+  unwound->initial_frame = false;
+  unwound->pc_state = DWFL_FRAME_STATE_ERROR;
+  memset (unwound->regs_set, 0, sizeof (unwound->regs_set));
+}
+
+/* The logic is to call __libdwfl_seterrno for any CFI bytecode interpretation
+   error so one can easily catch the problem with a debugger.  Still there are
+   archs with invalid CFI for some registers where the registers are never used
+   later.  Therefore we continue unwinding leaving the registers undefined.  */
+
+static void
+handle_cfi (Dwfl_Frame *state, Dwarf_Addr pc, Dwarf_CFI *cfi, Dwarf_Addr bias)
+{
+  Dwarf_Frame *frame;
+  if (INTUSE(dwarf_cfi_addrframe) (cfi, pc, &frame) != 0)
+    {
+      __libdwfl_seterrno (DWFL_E_LIBDW);
+      return;
+    }
+  new_unwound (state);
+  Dwfl_Frame *unwound = state->unwound;
+  unwound->signal_frame = frame->fde->cie->signal_frame;
+  Dwfl_Thread *thread = state->thread;
+  Dwfl_Process *process = thread->process;
+  Ebl *ebl = process->ebl;
+  size_t nregs = ebl_frame_nregs (ebl);
+  assert (nregs > 0);
+
+  /* The return register is special for setting the unwound->pc_state.  */
+  unsigned ra = frame->fde->cie->return_address_register;
+  bool ra_set = false;
+  ebl_dwarf_to_regno (ebl, &ra);
+
+  for (unsigned regno = 0; regno < nregs; regno++)
+    {
+      Dwarf_Op reg_ops_mem[3], *reg_ops;
+      size_t reg_nops;
+      if (dwarf_frame_register (frame, regno, reg_ops_mem, &reg_ops,
+                               &reg_nops) != 0)
+       {
+         __libdwfl_seterrno (DWFL_E_LIBDW);
+         continue;
+       }
+      Dwarf_Addr regval;
+      if (reg_nops == 0)
+       {
+         if (reg_ops == reg_ops_mem)
+           {
+             /* REGNO is undefined.  */
+             if (regno == ra)
+               unwound->pc_state = DWFL_FRAME_STATE_PC_UNDEFINED;
+             continue;
+           }
+         else if (reg_ops == NULL)
+           {
+             /* REGNO is same-value.  */
+             if (! state_get_reg (state, regno, &regval))
+               continue;
+           }
+         else
+           {
+             __libdwfl_seterrno (DWFL_E_INVALID_DWARF);
+             continue;
+           }
+       }
+      else if (! expr_eval (state, frame, reg_ops, reg_nops, &regval, bias))
+       {
+         /* PPC32 vDSO has various invalid operations, ignore them.  The
+            register will look as unset causing an error later, if used.
+            But PPC32 does not use such registers.  */
+         continue;
+       }
+
+      /* Some architectures encode some extra info in the return address.  */
+      if (regno == frame->fde->cie->return_address_register)
+       regval &= ebl_func_addr_mask (ebl);
+
+      /* This is another strange PPC[64] case.  There are two
+        registers numbers that can represent the same DWARF return
+        register number.  We only want one to actually set the return
+        register value.  But we always want to override the value if
+        the register is the actual CIE return address register.  */
+      if (ra_set && regno != frame->fde->cie->return_address_register)
+       {
+         unsigned r = regno;
+         if (ebl_dwarf_to_regno (ebl, &r) && r == ra)
+           continue;
+       }
+
+      if (! __libdwfl_frame_reg_set (unwound, regno, regval))
+       {
+         __libdwfl_seterrno (DWFL_E_INVALID_REGISTER);
+         continue;
+       }
+      else if (! ra_set)
+       {
+         unsigned r = regno;
+          if (ebl_dwarf_to_regno (ebl, &r) && r == ra)
+           ra_set = true;
+       }
+    }
+  if (unwound->pc_state == DWFL_FRAME_STATE_ERROR
+      && __libdwfl_frame_reg_get (unwound,
+                                 frame->fde->cie->return_address_register,
+                                 &unwound->pc))
+    {
+      /* PPC32 __libc_start_main properly CFI-unwinds PC as zero.  Currently
+        none of the archs supported for unwinding have zero as a valid PC.  */
+      if (unwound->pc == 0)
+       unwound->pc_state = DWFL_FRAME_STATE_PC_UNDEFINED;
+      else
+       unwound->pc_state = DWFL_FRAME_STATE_PC_SET;
+    }
+  free (frame);
+}
+
+static bool
+setfunc (int firstreg, unsigned nregs, const Dwarf_Word *regs, void *arg)
+{
+  Dwfl_Frame *state = arg;
+  Dwfl_Frame *unwound = state->unwound;
+  if (firstreg < 0)
+    {
+      assert (firstreg == -1);
+      assert (nregs == 1);
+      assert (unwound->pc_state == DWFL_FRAME_STATE_PC_UNDEFINED);
+      unwound->pc = *regs;
+      unwound->pc_state = DWFL_FRAME_STATE_PC_SET;
+      return true;
+    }
+  while (nregs--)
+    if (! __libdwfl_frame_reg_set (unwound, firstreg++, *regs++))
+      return false;
+  return true;
+}
+
+static bool
+getfunc (int firstreg, unsigned nregs, Dwarf_Word *regs, void *arg)
+{
+  Dwfl_Frame *state = arg;
+  assert (firstreg >= 0);
+  while (nregs--)
+    if (! __libdwfl_frame_reg_get (state, firstreg++, regs++))
+      return false;
+  return true;
+}
+
+static bool
+readfunc (Dwarf_Addr addr, Dwarf_Word *datap, void *arg)
+{
+  Dwfl_Frame *state = arg;
+  Dwfl_Thread *thread = state->thread;
+  Dwfl_Process *process = thread->process;
+  return process->callbacks->memory_read (process->dwfl, addr, datap,
+                                         process->callbacks_arg);
+}
+
+void
+internal_function
+__libdwfl_frame_unwind (Dwfl_Frame *state)
+{
+  if (state->unwound)
+    return;
+  /* Do not ask dwfl_frame_pc for ISACTIVATION, it would try to unwind STATE
+     which would deadlock us.  */
+  Dwarf_Addr pc;
+  bool ok = INTUSE(dwfl_frame_pc) (state, &pc, NULL);
+  assert (ok);
+  /* Check whether this is the initial frame or a signal frame.
+     Then we need to unwind from the original, unadjusted PC.  */
+  if (! state->initial_frame && ! state->signal_frame)
+    pc--;
+  Dwfl_Module *mod = INTUSE(dwfl_addrmodule) (state->thread->process->dwfl, pc);
+  if (mod == NULL)
+    __libdwfl_seterrno (DWFL_E_NO_DWARF);
+  else
+    {
+      Dwarf_Addr bias;
+      Dwarf_CFI *cfi_eh = INTUSE(dwfl_module_eh_cfi) (mod, &bias);
+      if (cfi_eh)
+       {
+         handle_cfi (state, pc - bias, cfi_eh, bias);
+         if (state->unwound)
+           return;
+       }
+      Dwarf_CFI *cfi_dwarf = INTUSE(dwfl_module_dwarf_cfi) (mod, &bias);
+      if (cfi_dwarf)
+       {
+         handle_cfi (state, pc - bias, cfi_dwarf, bias);
+         if (state->unwound)
+           return;
+       }
+    }
+  assert (state->unwound == NULL);
+  Dwfl_Thread *thread = state->thread;
+  Dwfl_Process *process = thread->process;
+  Ebl *ebl = process->ebl;
+  new_unwound (state);
+  state->unwound->pc_state = DWFL_FRAME_STATE_PC_UNDEFINED;
+  // &Dwfl_Frame.signal_frame cannot be passed as it is a bitfield.
+  bool signal_frame = false;
+  if (! ebl_unwind (ebl, pc, setfunc, getfunc, readfunc, state, &signal_frame))
+    {
+      // Discard the unwind attempt.  During next __libdwfl_frame_unwind call
+      // we may have for example the appropriate Dwfl_Module already mapped.
+      assert (state->unwound->unwound == NULL);
+      free (state->unwound);
+      state->unwound = NULL;
+      // __libdwfl_seterrno has been called above.
+      return;
+    }
+  assert (state->unwound->pc_state == DWFL_FRAME_STATE_PC_SET);
+  state->unwound->signal_frame = signal_frame;
+}
index 506a2a0..2bb4f45 100644 (file)
@@ -1,5 +1,5 @@
 /* Interfaces for libdwfl.
-   Copyright (C) 2005-2010 Red Hat, Inc.
+   Copyright (C) 2005-2010, 2013 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -41,6 +41,14 @@ typedef struct Dwfl_Module Dwfl_Module;
 /* Handle describing a line record.  */
 typedef struct Dwfl_Line Dwfl_Line;
 
+/* This holds information common for all the frames of one backtrace for
+   a partical thread/task/TID.  Several threads belong to one Dwfl.  */
+typedef struct Dwfl_Thread Dwfl_Thread;
+
+/* This holds everything we know about the state of the frame at a particular
+   PC location described by an FDE belonging to Dwfl_Thread.  */
+typedef struct Dwfl_Frame Dwfl_Frame;
+
 /* Callbacks.  */
 typedef struct
 {
@@ -137,14 +145,21 @@ extern int dwfl_report_segment (Dwfl *dwfl, int ndx,
 extern Dwfl_Module *dwfl_report_module (Dwfl *dwfl, const char *name,
                                        Dwarf_Addr start, Dwarf_Addr end);
 
-/* Report a module with start and end addresses computed from the ELF
-   program headers in the given file, plus BASE.  For an ET_REL file,
-   does a simple absolute section layout starting at BASE.
+/* Report a module to address BASE with start and end addresses computed
+   from the ELF program headers in the given file - see the table below.
    FD may be -1 to open FILE_NAME.  On success, FD is consumed by the
-   library, and the `find_elf' callback will not be used for this module.  */
+   library, and the `find_elf' callback will not be used for this module.
+           ADD_P_VADDR  BASE
+   ET_EXEC  ignored      ignored
+   ET_DYN   false        absolute address where to place the file
+           true         start address relative to ELF's phdr p_vaddr
+   ET_REL   ignored      absolute address where to place the file
+   ET_CORE  ignored      ignored
+   ET_DYN ELF phdr p_vaddr address can be non-zero if the shared library
+   has been prelinked by tool prelink(8).  */
 extern Dwfl_Module *dwfl_report_elf (Dwfl *dwfl, const char *name,
                                     const char *file_name, int fd,
-                                    GElf_Addr base);
+                                    GElf_Addr base, bool add_p_vaddr);
 
 /* Similar, but report the module for offline use.  All ET_EXEC files
    being reported must be reported before any relocatable objects.
@@ -342,15 +357,17 @@ extern int dwfl_linux_kernel_report_offline (Dwfl *dwfl, const char *release,
    This can follow a dwfl_report_offline call to bootstrap the
    DT_DEBUG method of following the dynamic linker link_map chain, in
    case the core file does not contain enough of the executable's text
-   segment to locate its PT_DYNAMIC in the dump.  This might call
-   dwfl_report_elf on file names found in the dump if reading some
-   link_map files is the only way to ascertain those modules' addresses.
-   Returns the number of modules reported, or -1 for errors.  */
-extern int dwfl_core_file_report (Dwfl *dwfl, Elf *elf);
+   segment to locate its PT_DYNAMIC in the dump.  In such case you need to
+   supply non-NULL EXECUTABLE, otherwise dynamic libraries will not be loaded
+   into the DWFL map.  This might call dwfl_report_elf on file names found in
+   the dump if reading some link_map files is the only way to ascertain those
+   modules' addresses.  Returns the number of modules reported, or -1 for
+   errors.  */
+extern int dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable);
 
 /* Call dwfl_report_module for each file mapped into the address space of PID.
    Returns zero on success, -1 if dwfl_report_module failed,
-   or an errno code if opening the kernel binary failed.  */
+   or an errno code if opening the proc files failed.  */
 extern int dwfl_linux_proc_report (Dwfl *dwfl, pid_t pid);
 
 /* Similar, but reads an input stream in the format of Linux /proc/PID/maps
@@ -403,28 +420,99 @@ extern int dwfl_validate_address (Dwfl *dwfl,
    are found) for use with libelf.  If successful, fills in *BIAS
    with the difference between addresses within the loaded module
    and those in symbol tables or Dwarf information referring to it.  */
-extern Elf *dwfl_module_getelf (Dwfl_Module *, GElf_Addr *bias);
+extern Elf *dwfl_module_getelf (Dwfl_Module *, GElf_Addr *bias)
+  __nonnull_attribute__ (1, 2);
 
 /* Return the number of symbols in the module's symbol table,
    or -1 for errors.  */
 extern int dwfl_module_getsymtab (Dwfl_Module *mod);
 
+/* Return the index of the first global symbol in the module's symbol
+   table, or -1 for errors.  In each symbol table, all symbols with
+   STB_LOCAL binding precede the weak and global symbols.  This
+   function returns the symbol table index one greater than the last
+   local symbol.  */
+extern int dwfl_module_getsymtab_first_global (Dwfl_Module *mod);
+
 /* Fetch one entry from the module's symbol table.  On errors, returns
    NULL.  If successful, fills in *SYM and returns the string for st_name.
    This works like gelf_getsym except that st_value is always adjusted to
    an absolute value based on the module's location, when the symbol is in
    an SHF_ALLOC section.  If SHNDXP is non-null, it's set with the section
    index (whether from st_shndx or extended index table); in case of a
-   symbol in a non-allocated section, *SHNDXP is instead set to -1.  */
+   symbol in a non-allocated section, *SHNDXP is instead set to -1.
+   Note that since symbols can come from either the main, debug or auxiliary
+   ELF symbol file (either dynsym or symtab) the section index can only
+   be reliably used to compare against special section constants like
+   SHN_UNDEF or SHN_ABS.  It is recommended to use dwfl_module_getsym_info
+   which doesn't have these deficiencies.  */
 extern const char *dwfl_module_getsym (Dwfl_Module *mod, int ndx,
                                       GElf_Sym *sym, GElf_Word *shndxp)
   __nonnull_attribute__ (3);
 
+/* Fetch one entry from the module's symbol table and the associated
+   address value.  On errors, returns NULL.  If successful, fills in
+   *SYM, *ADDR and returns the string for st_name.  This works like
+   gelf_getsym.  *ADDR is set to the st_value adjusted to an absolute
+   value based on the module's location, when the symbol is in an
+   SHF_ALLOC section.  For non-ET_REL files, if the arch uses function
+   descriptors, and the st_value points to one, *ADDR will be resolved
+   to the actual function entry address.  The SYM->ST_VALUE itself
+   isn't adjusted in any way.  Fills in ELFP, if not NULL, with the
+   ELF file the symbol originally came from.  Note that symbols can
+   come from either the main, debug or auxiliary ELF symbol file
+   (either dynsym or symtab).  If SHNDXP is non-null, it's set with
+   the section index (whether from st_shndx or extended index table);
+   in case of a symbol in a non-allocated section, *SHNDXP is instead
+   set to -1.  Fills in BIAS, if not NULL, with the difference between
+   addresses within the loaded module and those in symbol table of the
+   ELF file.  Note that the address associated with the symbol might
+   be in a different section than the returned symbol.  The section in
+   the main elf file in which returned ADDR falls can be found with
+   dwfl_module_address_section.  */
+extern const char *dwfl_module_getsym_info (Dwfl_Module *mod, int ndx,
+                                           GElf_Sym *sym, GElf_Addr *addr,
+                                           GElf_Word *shndxp,
+                                           Elf **elfp, Dwarf_Addr *bias)
+  __nonnull_attribute__ (3, 4);
+
 /* Find the symbol that ADDRESS lies inside, and return its name.  */
 extern const char *dwfl_module_addrname (Dwfl_Module *mod, GElf_Addr address);
 
+/* Find the symbol associated with ADDRESS.  Return its name or NULL
+   when nothing was found.  If the architecture uses function
+   descriptors, and symbol st_value points to one, ADDRESS wil be
+   matched against either the adjusted st_value or the associated
+   function entry value as described in dwfl_module_getsym_info.  If
+   OFFSET is not NULL it will be filled in with the difference from
+   the start of the symbol (or function entry).  If SYM is not NULL it
+   is filled in with the symbol associated with the matched ADDRESS.
+   The SYM->ST_VALUE itself isn't adjusted in any way.  Fills in ELFP,
+   if not NULL, with the ELF file the symbol originally came from.
+   Note that symbols can come from either the main, debug or auxiliary
+   ELF symbol file (either dynsym or symtab).  If SHNDXP is non-null,
+   it's set with the section index (whether from st_shndx or extended
+   index table).  Fills in BIAS, if not NULL, with the difference
+   between addresses within the loaded module and those in symbol
+   table of the ELF file.  Note that the address matched against the
+   symbol might be in a different section than the returned symbol.
+   The section in the main elf file in ADDRESS falls can be found with
+   dwfl_module_address_section.  */
+extern const char *dwfl_module_addrinfo (Dwfl_Module *mod, GElf_Addr address,
+                                        GElf_Off *offset, GElf_Sym *sym,
+                                        GElf_Word *shndxp, Elf **elfp,
+                                        Dwarf_Addr *bias)
+  __nonnull_attribute__ (3);
+
 /* Find the symbol that ADDRESS lies inside, and return detailed
-   information as for dwfl_module_getsym (above).  */
+   information as for dwfl_module_getsym (above).  Note that like
+   dwfl_module_getsym this function also adjusts SYM->ST_VALUE to an
+   absolute value based on the module's location.  ADDRESS is only
+   matched against this adjusted SYM->ST_VALUE.  This means that
+   depending on architecture this might only match symbols that
+   represent function descriptor addresses (and not function entry
+   addresses).  For these reasons it is recommended to use
+   dwfl_module_addrinfo instead.  */
 extern const char *dwfl_module_addrsym (Dwfl_Module *mod, GElf_Addr address,
                                        GElf_Sym *sym, GElf_Word *shndxp)
   __nonnull_attribute__ (3);
@@ -557,6 +645,166 @@ extern Dwarf_CFI *dwfl_module_dwarf_cfi (Dwfl_Module *mod, Dwarf_Addr *bias);
 extern Dwarf_CFI *dwfl_module_eh_cfi (Dwfl_Module *mod, Dwarf_Addr *bias);
 
 
+typedef struct
+{
+  /* Called to iterate through threads.  Returns next TID (thread ID) on
+     success, a negative number on failure and zero if there are no more
+     threads.  dwfl_errno () should be set if negative number has been
+     returned.  *THREAD_ARGP is NULL on first call, and may be optionally
+     set by the implementation. The value set by the implementation will
+     be passed in on the next call to NEXT_THREAD.  THREAD_ARGP is never
+     NULL.  *THREAD_ARGP will be passed to set_initial_registers or
+     thread_detach callbacks together with Dwfl_Thread *thread.  This
+     method must not be NULL.  */
+  pid_t (*next_thread) (Dwfl *dwfl, void *dwfl_arg, void **thread_argp)
+    __nonnull_attribute__ (1);
+
+  /* Called to get a specific thread.  Returns true if there is a
+     thread with the given thread id number, returns false if no such
+     thread exists and will set dwfl_errno in that case.  THREAD_ARGP
+     is never NULL.  *THREAD_ARGP will be passed to
+     set_initial_registers or thread_detach callbacks together with
+     Dwfl_Thread *thread.  This method may be NULL and will then be
+     emulated using the next_thread callback. */
+  bool (*get_thread) (Dwfl *dwfl, pid_t tid, void *dwfl_arg,
+                     void **thread_argp)
+    __nonnull_attribute__ (1);
+
+  /* Called during unwinding to access memory (stack) state.  Returns true for
+     successfully read *RESULT or false and sets dwfl_errno () on failure.
+     This method may be NULL - in such case dwfl_thread_getframes will return
+     only the initial frame.  */
+  bool (*memory_read) (Dwfl *dwfl, Dwarf_Addr addr, Dwarf_Word *result,
+                       void *dwfl_arg)
+    __nonnull_attribute__ (1, 3);
+
+  /* Called on initial unwind to get the initial register state of the first
+     frame.  Should call dwfl_thread_state_registers, possibly multiple times
+     for different ranges and possibly also dwfl_thread_state_register_pc, to
+     fill in initial (DWARF) register values.  After this call, till at least
+     thread_detach is called, the thread is assumed to be frozen, so that it is
+     safe to unwind.  Returns true on success or false and sets dwfl_errno ()
+     on failure.  In the case of a failure thread_detach will not be called.
+     This method must not be NULL.  */
+  bool (*set_initial_registers) (Dwfl_Thread *thread, void *thread_arg)
+    __nonnull_attribute__ (1);
+
+  /* Called by dwfl_end.  All thread_detach method calls have been already
+     done.  This method may be NULL.  */
+  void (*detach) (Dwfl *dwfl, void *dwfl_arg)
+    __nonnull_attribute__ (1);
+
+  /* Called when unwinding is done.  No callback will be called after
+     this method has been called.  Iff set_initial_registers was called for
+     a TID and it returned success thread_detach will be called before the
+     detach method above.  This method may be NULL.  */
+  void (*thread_detach) (Dwfl_Thread *thread, void *thread_arg)
+    __nonnull_attribute__ (1);
+} Dwfl_Thread_Callbacks;
+
+/* PID is the process id associated with the DWFL state.  Architecture of DWFL
+   modules is specified by ELF, ELF must remain valid during DWFL lifetime.
+   Use NULL ELF to detect architecture from DWFL, the function will then detect
+   it from arbitrary Dwfl_Module of DWFL.  DWFL_ARG is the callback backend
+   state.  DWFL_ARG will be provided to the callbacks.  *THREAD_CALLBACKS
+   function pointers must remain valid during lifetime of DWFL.  Function
+   returns true on success, false otherwise.  */
+bool dwfl_attach_state (Dwfl *dwfl, Elf *elf, pid_t pid,
+                        const Dwfl_Thread_Callbacks *thread_callbacks,
+                       void *dwfl_arg)
+  __nonnull_attribute__ (1, 4);
+
+/* Calls dwfl_attach_state with Dwfl_Thread_Callbacks setup for extracting
+   thread state from the ELF core file.  Returns the pid number extracted
+   from the core file, or -1 for errors.  */
+extern int dwfl_core_file_attach (Dwfl *dwfl, Elf *elf);
+
+/* Calls dwfl_attach_state with Dwfl_Thread_Callbacks setup for extracting
+   thread state from the proc file system.  Uses ptrace to attach and stop
+   the thread under inspection and detaches when thread_detach is called
+   and unwinding for the thread is done, unless ASSUME_PTRACE_STOPPED is
+   true.  If ASSUME_PTRACE_STOPPED is true the caller should make sure that
+   the thread is ptrace attached and stopped before unwinding by calling
+   either dwfl_thread_getframes or dwfl_getthread_frames.  Returns zero on
+   success, -1 if dwfl_attach_state failed, or an errno code if opening the
+   proc files failed.  */
+extern int dwfl_linux_proc_attach (Dwfl *dwfl, pid_t pid,
+                                  bool assume_ptrace_stopped);
+
+/* Return PID for the process associated with DWFL.  Function returns -1 if
+   dwfl_attach_state was not called for DWFL.  */
+pid_t dwfl_pid (Dwfl *dwfl)
+  __nonnull_attribute__ (1);
+
+/* Return DWFL from which THREAD was created using dwfl_getthreads.  */
+Dwfl *dwfl_thread_dwfl (Dwfl_Thread *thread)
+  __nonnull_attribute__ (1);
+
+/* Return positive TID (thread ID) for THREAD.  This function never fails.  */
+pid_t dwfl_thread_tid (Dwfl_Thread *thread)
+  __nonnull_attribute__ (1);
+
+/* Return thread for frame STATE.  This function never fails.  */
+Dwfl_Thread *dwfl_frame_thread (Dwfl_Frame *state)
+  __nonnull_attribute__ (1);
+
+/* Called by Dwfl_Thread_Callbacks.set_initial_registers implementation.
+   For every known continuous block of registers <FIRSTREG..FIRSTREG+NREGS)
+   (inclusive..exclusive) set their content to REGS (array of NREGS items).
+   Function returns false if any of the registers has invalid number.  */
+bool dwfl_thread_state_registers (Dwfl_Thread *thread, int firstreg,
+                                  unsigned nregs, const Dwarf_Word *regs)
+  __nonnull_attribute__ (1, 4);
+
+/* Called by Dwfl_Thread_Callbacks.set_initial_registers implementation.
+   If PC is not contained among DWARF registers passed by
+   dwfl_thread_state_registers on the target architecture pass the PC value
+   here.  */
+void dwfl_thread_state_register_pc (Dwfl_Thread *thread, Dwarf_Word pc)
+  __nonnull_attribute__ (1);
+
+/* Iterate through the threads for a process.  Returns zero if all threads have
+   been processed by the callback, returns -1 on error, or the value of the
+   callback when not DWARF_CB_OK.  -1 returned on error will set dwfl_errno ().
+   Keeps calling the callback with the next thread while the callback returns
+   DWARF_CB_OK, till there are no more threads.  */
+int dwfl_getthreads (Dwfl *dwfl,
+                    int (*callback) (Dwfl_Thread *thread, void *arg),
+                    void *arg)
+  __nonnull_attribute__ (1, 2);
+
+/* Iterate through the frames for a thread.  Returns zero if all frames
+   have been processed by the callback, returns -1 on error, or the value of
+   the callback when not DWARF_CB_OK.  -1 returned on error will
+   set dwfl_errno ().  Some systems return error instead of zero on end of the
+   backtrace, for cross-platform compatibility callers should consider error as
+   a zero.  Keeps calling the callback with the next frame while the callback
+   returns DWARF_CB_OK, till there are no more frames.  On start will call the
+   set_initial_registers callback and on return will call the detach_thread
+   callback of the Dwfl_Thread.  */
+int dwfl_thread_getframes (Dwfl_Thread *thread,
+                          int (*callback) (Dwfl_Frame *state, void *arg),
+                          void *arg)
+  __nonnull_attribute__ (1, 2);
+
+/* Like dwfl_thread_getframes, but specifying the thread by its unique
+   identifier number.  Returns zero if all frames have been processed
+   by the callback, returns -1 on error (and when no thread with
+   the given thread id number exists), or the value of the callback
+   when not DWARF_CB_OK.  -1 returned on error will set dwfl_errno ().  */
+int dwfl_getthread_frames (Dwfl *dwfl, pid_t tid,
+                          int (*callback) (Dwfl_Frame *thread, void *arg),
+                          void *arg)
+  __nonnull_attribute__ (1, 3);
+
+/* Return *PC (program counter) for thread-specific frame STATE.
+   Set *ISACTIVATION according to DWARF frame "activation" definition.
+   Typically you need to substract 1 from *PC if *ACTIVATION is false to safely
+   find function of the caller.  ACTIVATION may be NULL.  PC must not be NULL.
+   Function returns false if it failed to find *PC.  */
+bool dwfl_frame_pc (Dwfl_Frame *state, Dwarf_Addr *pc, bool *isactivation)
+  __nonnull_attribute__ (1, 2);
+
 #ifdef __cplusplus
 }
 #endif
index ca8be2f..30c0f8a 100644 (file)
@@ -1,5 +1,5 @@
 /* Internal definitions for libdwfl.
-   Copyright (C) 2005-2011 Red Hat, Inc.
+   Copyright (C) 2005-2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
 #include <libdwfl.h>
 #include <libebl.h>
 #include <assert.h>
+#include <dirent.h>
 #include <errno.h>
 #include <stdbool.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include "../libdw/libdwP.h"   /* We need its INTDECLs.  */
+#include "../libdwelf/libdwelfP.h"
+
+typedef struct Dwfl_Process Dwfl_Process;
 
 /* gettext helper macros.  */
 #define _(Str) dgettext ("elfutils", Str)
   DWFL_ERROR (BADELF, N_("not a valid ELF file"))                            \
   DWFL_ERROR (WEIRD_TYPE, N_("cannot handle DWARF type description"))        \
   DWFL_ERROR (WRONG_ID_ELF, N_("ELF file does not match build ID"))          \
-  DWFL_ERROR (BAD_PRELINK, N_("corrupt .gnu.prelink_undo section data"))
+  DWFL_ERROR (BAD_PRELINK, N_("corrupt .gnu.prelink_undo section data"))      \
+  DWFL_ERROR (LIBEBL_BAD, N_("Internal error due to ebl"))                   \
+  DWFL_ERROR (CORE_MISSING, N_("Missing data in core file"))                 \
+  DWFL_ERROR (INVALID_REGISTER, N_("Invalid register"))                              \
+  DWFL_ERROR (PROCESS_MEMORY_READ, N_("Error reading process memory"))       \
+  DWFL_ERROR (PROCESS_NO_ARCH, N_("Couldn't find architecture of any ELF"))   \
+  DWFL_ERROR (PARSE_PROC, N_("Error parsing /proc filesystem"))                      \
+  DWFL_ERROR (INVALID_DWARF, N_("Invalid DWARF"))                            \
+  DWFL_ERROR (UNSUPPORTED_DWARF, N_("Unsupported DWARF"))                    \
+  DWFL_ERROR (NEXT_THREAD_FAIL, N_("Unable to find more threads"))           \
+  DWFL_ERROR (ATTACH_STATE_CONFLICT, N_("Dwfl already has attached state"))   \
+  DWFL_ERROR (NO_ATTACH_STATE, N_("Dwfl has no attached state"))             \
+  DWFL_ERROR (NO_UNWIND, N_("Unwinding not supported for this architecture")) \
+  DWFL_ERROR (INVALID_ARGUMENT, N_("Invalid argument"))                              \
+  DWFL_ERROR (NO_CORE_FILE, N_("Not an ET_CORE ELF file"))
 
 #define DWFL_ERROR(name, text) DWFL_E_##name,
 typedef enum { DWFL_ERRORS DWFL_E_NUM } Dwfl_Error;
@@ -92,6 +110,9 @@ struct Dwfl
 
   Dwfl_Module *modulelist;    /* List in order used by full traversals.  */
 
+  Dwfl_Process *process;
+  Dwfl_Error attacherr;      /* Previous error attaching process.  */
+
   GElf_Addr offline_next_address;
 
   GElf_Addr segment_align;     /* Smallest granularity of segments.  */
@@ -108,6 +129,8 @@ struct Dwfl
   GElf_Off lookup_tail_vaddr;
   GElf_Off lookup_tail_offset;
   int lookup_tail_ndx;
+
+  char *executable_for_core;   /* --executable if --core was specified.  */
 };
 
 #define OFFLINE_REDZONE                0x10000
@@ -140,7 +163,7 @@ struct Dwfl_Module
   char *name;                  /* Iterator name for this module.  */
   GElf_Addr low_addr, high_addr;
 
-  struct dwfl_file main, debug;
+  struct dwfl_file main, debug, aux_sym;
   GElf_Addr main_bias;
   Ebl *ebl;
   GElf_Half e_type;            /* GElf_Ehdr.e_type cache.  */
@@ -150,12 +173,20 @@ struct Dwfl_Module
 
   struct dwfl_file *symfile;   /* Either main or debug.  */
   Elf_Data *symdata;           /* Data in the ELF symbol table section.  */
+  Elf_Data *aux_symdata;       /* Data in the auxiliary ELF symbol table.  */
   size_t syments;              /* sh_size / sh_entsize of that section.  */
+  size_t aux_syments;          /* sh_size / sh_entsize of aux_sym section.  */
   int first_global;            /* Index of first global symbol of table.  */
+  int aux_first_global;                /* Index of first global of aux_sym table.  */
   Elf_Data *symstrdata;                /* Data for its string table.  */
+  Elf_Data *aux_symstrdata;    /* Data for aux_sym string table.  */
   Elf_Data *symxndxdata;       /* Data in the extended section index table. */
+  Elf_Data *aux_symxndxdata;   /* Data in the extended auxiliary table. */
 
   Dwarf *dw;                   /* libdw handle for its debugging info.  */
+  Dwarf *alt;                  /* Dwarf used for dwarf_setalt, or NULL.  */
+  int alt_fd;                  /* descriptor, only valid when alt != NULL.  */
+  Elf *alt_elf;                /* Elf for alt Dwarf.  */
 
   Dwfl_Error symerr;           /* Previous failure to load symbols.  */
   Dwfl_Error dwerr;            /* Previous failure to load DWARF.  */
@@ -182,7 +213,72 @@ struct Dwfl_Module
   bool gc;                     /* Mark/sweep flag.  */
 };
 
+/* This holds information common for all the threads/tasks/TIDs of one process
+   for backtraces.  */
+
+struct Dwfl_Process
+{
+  struct Dwfl *dwfl;
+  pid_t pid;
+  const Dwfl_Thread_Callbacks *callbacks;
+  void *callbacks_arg;
+  struct ebl *ebl;
+  bool ebl_close:1;
+};
+
+/* See its typedef in libdwfl.h.  */
+
+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.  */
+  Dwfl_Frame *unwound;
+  void *callbacks_arg;
+};
+
+/* See its typedef in libdwfl.h.  */
+
+struct Dwfl_Frame
+{
+  Dwfl_Thread *thread;
+  /* Previous (outer) frame.  */
+  Dwfl_Frame *unwound;
+  bool signal_frame : 1;
+  bool initial_frame : 1;
+  enum
+  {
+    /* This structure is still being initialized or there was an error
+       initializing it.  */
+    DWFL_FRAME_STATE_ERROR,
+    /* PC field is valid.  */
+    DWFL_FRAME_STATE_PC_SET,
+    /* PC field is undefined, this means the next (inner) frame was the
+       outermost frame.  */
+    DWFL_FRAME_STATE_PC_UNDEFINED
+  } pc_state;
+  /* Either initialized from appropriate REGS element or on some archs
+     initialized separately as the return address has no DWARF register.  */
+  Dwarf_Addr pc;
+  /* (1 << X) bitmask where 0 <= X < ebl_frame_nregs.  */
+  uint64_t regs_set[3];
+  /* REGS array size is ebl_frame_nregs.
+     REGS_SET tells which of the REGS are valid.  */
+  Dwarf_Addr regs[];
+};
+
+/* Fetch value from Dwfl_Frame->regs indexed by DWARF REGNO.
+   No error code is set if the function returns FALSE.  */
+bool __libdwfl_frame_reg_get (Dwfl_Frame *state, unsigned regno,
+                             Dwarf_Addr *val)
+  internal_function;
 
+/* Store value to Dwfl_Frame->regs indexed by DWARF REGNO.
+   No error code is set if the function returns FALSE.  */
+bool __libdwfl_frame_reg_set (Dwfl_Frame *state, unsigned regno,
+                             Dwarf_Addr val)
+  internal_function;
 
 /* Information cached about each CU in Dwfl_Module.dw.  */
 struct dwfl_cu
@@ -253,20 +349,40 @@ dwfl_deadjust_dwarf_addr (Dwfl_Module *mod, Dwarf_Addr addr)
          + mod->debug.address_sync);
 }
 
+static inline Dwarf_Addr
+dwfl_adjusted_aux_sym_addr (Dwfl_Module *mod, Dwarf_Addr addr)
+{
+  return dwfl_adjusted_address (mod, (addr
+                                     - mod->aux_sym.address_sync
+                                     + mod->main.address_sync));
+}
+
+static inline Dwarf_Addr
+dwfl_deadjust_aux_sym_addr (Dwfl_Module *mod, Dwarf_Addr addr)
+{
+  return (dwfl_deadjust_address (mod, addr)
+         - mod->main.address_sync
+         + mod->aux_sym.address_sync);
+}
+
 static inline GElf_Addr
-dwfl_adjusted_st_value (Dwfl_Module *mod, GElf_Addr addr)
+dwfl_adjusted_st_value (Dwfl_Module *mod, Elf *symelf, GElf_Addr addr)
 {
-  if (mod->symfile == &mod->main)
+  if (symelf == mod->main.elf)
     return dwfl_adjusted_address (mod, addr);
-  return dwfl_adjusted_dwarf_addr (mod, addr);
+  if (symelf == mod->debug.elf)
+    return dwfl_adjusted_dwarf_addr (mod, addr);
+  return dwfl_adjusted_aux_sym_addr (mod, addr);
 }
 
 static inline GElf_Addr
-dwfl_deadjust_st_value (Dwfl_Module *mod, GElf_Addr addr)
+dwfl_deadjust_st_value (Dwfl_Module *mod, Elf *symelf, GElf_Addr addr)
 {
-  if (mod->symfile == &mod->main)
+  if (symelf == mod->main.elf)
     return dwfl_deadjust_address (mod, addr);
-  return dwfl_deadjust_dwarf_addr (mod, addr);
+  if (symelf == mod->debug.elf)
+    return dwfl_deadjust_dwarf_addr (mod, addr);
+  return dwfl_deadjust_aux_sym_addr (mod, addr);
 }
 
 /* This describes a contiguous address range that lies in a single CU.
@@ -278,6 +394,56 @@ struct dwfl_arange
 };
 
 
+/* Structure used for keeping track of ptrace attaching a thread.
+   Shared by linux-pid-attach and linux-proc-maps.  If it has been setup
+   then get the instance through __libdwfl_get_pid_arg.  */
+struct __libdwfl_pid_arg
+{
+  DIR *dir;
+  /* It is 0 if not used.  */
+  pid_t tid_attached;
+  /* Valid only if TID_ATTACHED is not zero.  */
+  bool tid_was_stopped;
+  /* True if threads are ptrace stopped by caller.  */
+  bool assume_ptrace_stopped;
+};
+
+/* If DWfl is not NULL and a Dwfl_Process has been setup that has
+   Dwfl_Thread_Callbacks set to pid_thread_callbacks, then return the
+   callbacks_arg, which will be a struct __libdwfl_pid_arg.  Otherwise
+   returns NULL.  */
+extern struct __libdwfl_pid_arg *__libdwfl_get_pid_arg (Dwfl *dwfl)
+  internal_function;
+
+/* Makes sure the given tid is attached. On success returns true and
+   sets tid_was_stopped.  */
+extern bool __libdwfl_ptrace_attach (pid_t tid, bool *tid_was_stoppedp)
+  internal_function;
+
+/* Detaches a tid that was attached through
+   __libdwfl_ptrace_attach. Must be given the tid_was_stopped as set
+   by __libdwfl_ptrace_attach.  */
+extern void __libdwfl_ptrace_detach (pid_t tid, bool tid_was_stopped)
+  internal_function;
+
+
+/* Internal wrapper for old dwfl_module_getsym and new dwfl_module_getsym_info.
+   adjust_st_value set to true returns adjusted SYM st_value, set to false
+   it will not adjust SYM at all, but does match against resolved *ADDR. */
+extern const char *__libdwfl_getsym (Dwfl_Module *mod, int ndx, GElf_Sym *sym,
+                                    GElf_Addr *addr, GElf_Word *shndxp,
+                                    Elf **elfp, Dwarf_Addr *biasp,
+                                    bool *resolved, bool adjust_st_value)
+  internal_function;
+
+/* Internal wrapper for old dwfl_module_addrsym and new dwfl_module_addrinfo.
+   adjust_st_value set to true returns adjusted SYM st_value, set to false
+   it will not adjust SYM at all, but does match against resolved values. */
+extern const char *__libdwfl_addrsym (Dwfl_Module *mod, GElf_Addr addr,
+                                     GElf_Off *off, GElf_Sym *sym,
+                                     GElf_Word *shndxp, Elf **elfp,
+                                     Dwarf_Addr *bias,
+                                     bool adjust_st_value) internal_function;
 
 extern void __libdwfl_module_free (Dwfl_Module *mod) internal_function;
 
@@ -294,6 +460,12 @@ extern void __libdwfl_getelf (Dwfl_Module *mod) internal_function;
 extern Dwfl_Error __libdwfl_relocate (Dwfl_Module *mod, Elf *file, bool debug)
   internal_function;
 
+/* Find the section index in mod->main.elf that contains the given
+   *ADDR.  Adjusts *ADDR to be section relative on success, returns
+   SHN_UNDEF on failure.  */
+extern size_t __libdwfl_find_section_ndx (Dwfl_Module *mod, Dwarf_Addr *addr)
+  internal_function;
+
 /* Process (simple) relocations in arbitrary section TSCN of an ET_REL file.
    RELOCSCN is SHT_REL or SHT_RELA and TSCN is its sh_info target section.  */
 extern Dwfl_Error __libdwfl_relocate_section (Dwfl_Module *mod, Elf *relocated,
@@ -310,7 +482,6 @@ extern Dwfl_Error __libdwfl_relocate_value (Dwfl_Module *mod, Elf *elf,
                                            GElf_Addr *value)
      internal_function;
 
-
 /* Ensure that MOD->ebl is set up.  */
 extern Dwfl_Error __libdwfl_module_getebl (Dwfl_Module *mod) internal_function;
 
@@ -333,6 +504,17 @@ extern Dwfl_Error __libdwfl_addrcu (Dwfl_Module *mod, Dwarf_Addr addr,
 extern Dwfl_Error __libdwfl_cu_getsrclines (struct dwfl_cu *cu)
   internal_function;
 
+/* Look in ELF for an NT_GNU_BUILD_ID note.  Store it to BUILD_ID_BITS,
+   its vaddr in ELF to BUILD_ID_VADDR (it is unrelocated, even if MOD is not
+   NULL) and store length to BUILD_ID_LEN.  Returns -1 for errors, 1 if it was
+   stored and 0 if no note is found.  MOD may be NULL, MOD must be non-NULL
+   only if ELF is ET_REL.  */
+extern int __libdwfl_find_elf_build_id (Dwfl_Module *mod, Elf *elf,
+                                       const void **build_id_bits,
+                                       GElf_Addr *build_id_elfaddr,
+                                       int *build_id_len)
+  internal_function;
+
 /* Look in ELF for an NT_GNU_BUILD_ID note.  If SET is true, store it
    in MOD and return its length.  If SET is false, instead compare it
    to that stored in MOD and return 2 if they match, 1 if they do not.
@@ -341,19 +523,35 @@ extern int __libdwfl_find_build_id (Dwfl_Module *mod, bool set, Elf *elf)
   internal_function;
 
 /* Open a main or debuginfo file by its build ID, returns the fd.  */
+extern int __libdwfl_open_mod_by_build_id (Dwfl_Module *mod, bool debug,
+                                          char **file_name) internal_function;
+
+/* Same, but takes an explicit build_id, can also be used for alt debug.  */
 extern int __libdwfl_open_by_build_id (Dwfl_Module *mod, bool debug,
-                                      char **file_name) internal_function;
+                                      char **file_name, const size_t id_len,
+                                      const uint8_t *id) internal_function;
 
 extern uint32_t __libdwfl_crc32 (uint32_t crc, unsigned char *buf, size_t len)
   attribute_hidden;
 extern int __libdwfl_crc32_file (int fd, uint32_t *resp) attribute_hidden;
 
 
+/* Given ELF and some parameters return TRUE if the *P return value parameters
+   have been successfully filled in.  Any of the *P parameters can be NULL.  */
+extern bool __libdwfl_elf_address_range (Elf *elf, GElf_Addr base,
+                                        bool add_p_vaddr, bool sanity,
+                                        GElf_Addr *vaddrp,
+                                        GElf_Addr *address_syncp,
+                                        GElf_Addr *startp, GElf_Addr *endp,
+                                        GElf_Addr *biasp, GElf_Half *e_typep)
+  internal_function;
+
 /* Meat of dwfl_report_elf, given elf_begin just called.
    Consumes ELF on success, not on failure.  */
 extern Dwfl_Module *__libdwfl_report_elf (Dwfl *dwfl, const char *name,
                                          const char *file_name, int fd,
-                                         Elf *elf, GElf_Addr base, bool sanity)
+                                         Elf *elf, GElf_Addr base,
+                                         bool add_p_vaddr, bool sanity)
   internal_function;
 
 /* Meat of dwfl_report_offline.  */
@@ -364,6 +562,25 @@ extern Dwfl_Module *__libdwfl_report_offline (Dwfl *dwfl, const char *name,
                                                                const char *))
   internal_function;
 
+/* Free PROCESS.  Unlink and free also any structures it references.  */
+extern void __libdwfl_process_free (Dwfl_Process *process)
+  internal_function;
+
+/* Update STATE->unwound for the unwound frame.
+   On error STATE->unwound == NULL
+   or STATE->unwound->pc_state == DWFL_FRAME_STATE_ERROR;
+   in such case dwfl_errno () is set.
+   If STATE->unwound->pc_state == DWFL_FRAME_STATE_PC_UNDEFINED
+   then STATE was the last valid frame.  */
+extern void __libdwfl_frame_unwind (Dwfl_Frame *state)
+  internal_function;
+
+/* Align segment START downwards or END upwards addresses according to DWFL.  */
+extern GElf_Addr __libdwfl_segment_start (Dwfl *dwfl, GElf_Addr start)
+  internal_function;
+extern GElf_Addr __libdwfl_segment_end (Dwfl *dwfl, GElf_Addr end)
+  internal_function;
+
 /* Decompression wrappers: decompress whole file into memory.  */
 extern Dwfl_Error __libdw_gunzip  (int fd, off64_t start_offset,
                                   void *mapped, size_t mapped_size,
@@ -391,6 +608,11 @@ extern Dwfl_Error __libdw_open_file (int *fdp, Elf **elfp,
                                     bool close_on_fail, bool archive_ok)
   internal_function;
 
+/* Fetch PT_DYNAMIC P_VADDR from ELF and store it to *VADDRP.  Return success.
+   *VADDRP is not modified if the function fails.  */
+extern bool __libdwfl_dynamic_vaddr_get (Elf *elf, GElf_Addr *vaddrp)
+  internal_function;
+
 /* These are working nicely for --core, but are not ready to be
    exported interfaces quite yet.  */
 
@@ -409,13 +631,35 @@ typedef bool Dwfl_Module_Callback (Dwfl_Module *mod, void **userdata,
                                   GElf_Off whole, GElf_Off contiguous,
                                   void *arg, Elf **elfp);
 
+/* One shared library (or executable) info from DT_DEBUG link map.  */
+struct r_debug_info_module
+{
+  struct r_debug_info_module *next;
+  /* FD is -1 iff ELF is NULL.  */
+  int fd;
+  Elf *elf;
+  GElf_Addr l_ld;
+  /* START and END are both zero if not valid.  */
+  GElf_Addr start, end;
+  bool disk_file_has_build_id;
+  char name[0];
+};
+
+/* Information gathered from DT_DEBUG by dwfl_link_map_report hinted to
+   dwfl_segment_report_module.  */
+struct r_debug_info
+{
+  struct r_debug_info_module *module;
+};
+
 /* ...
  */
 extern int dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name,
                                       Dwfl_Memory_Callback *memory_callback,
                                       void *memory_callback_arg,
                                       Dwfl_Module_Callback *read_eagerly,
-                                      void *read_eagerly_arg);
+                                      void *read_eagerly_arg,
+                                      const struct r_debug_info *r_debug_info);
 
 /* Report a module for entry in the dynamic linker's struct link_map list.
    For each link_map entry, if an existing module resides at its address,
@@ -429,10 +673,16 @@ extern int dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name,
    only find where to begin if the correct executable file was
    previously reported and preloaded as with dwfl_report_elf.
 
+   Fill in R_DEBUG_INFO if it is not NULL.  It should be cleared by the
+   caller, this function does not touch fields it does not need to modify.
+   If R_DEBUG_INFO is not NULL then no modules get added to DWFL, caller
+   has to add them from filled in R_DEBUG_INFO.
+
    Returns the number of modules found, or -1 for errors.  */
 extern int dwfl_link_map_report (Dwfl *dwfl, const void *auxv, size_t auxv_size,
                                 Dwfl_Memory_Callback *memory_callback,
-                                void *memory_callback_arg);
+                                void *memory_callback_arg,
+                                struct r_debug_info *r_debug_info);
 
 
 /* Avoid PLT entries.  */
@@ -443,16 +693,20 @@ INTDECL (dwfl_addrmodule)
 INTDECL (dwfl_addrsegment)
 INTDECL (dwfl_addrdwarf)
 INTDECL (dwfl_addrdie)
+INTDECL (dwfl_core_file_attach)
 INTDECL (dwfl_core_file_report)
 INTDECL (dwfl_getmodules)
 INTDECL (dwfl_module_addrdie)
 INTDECL (dwfl_module_address_section)
+INTDECL (dwfl_module_addrinfo)
 INTDECL (dwfl_module_addrsym)
 INTDECL (dwfl_module_build_id)
 INTDECL (dwfl_module_getdwarf)
 INTDECL (dwfl_module_getelf)
 INTDECL (dwfl_module_getsym)
+INTDECL (dwfl_module_getsym_info)
 INTDECL (dwfl_module_getsymtab)
+INTDECL (dwfl_module_getsymtab_first_global)
 INTDECL (dwfl_module_getsrc)
 INTDECL (dwfl_module_report_build_id)
 INTDECL (dwfl_report_elf)
@@ -468,6 +722,7 @@ INTDECL (dwfl_standard_find_debuginfo)
 INTDECL (dwfl_link_map_report)
 INTDECL (dwfl_linux_kernel_find_elf)
 INTDECL (dwfl_linux_kernel_module_section_address)
+INTDECL (dwfl_linux_proc_attach)
 INTDECL (dwfl_linux_proc_report)
 INTDECL (dwfl_linux_proc_maps_report)
 INTDECL (dwfl_linux_proc_find_elf)
@@ -478,6 +733,17 @@ INTDECL (dwfl_offline_section_address)
 INTDECL (dwfl_module_relocate_address)
 INTDECL (dwfl_module_dwarf_cfi)
 INTDECL (dwfl_module_eh_cfi)
+INTDECL (dwfl_attach_state)
+INTDECL (dwfl_pid)
+INTDECL (dwfl_thread_dwfl)
+INTDECL (dwfl_thread_tid)
+INTDECL (dwfl_frame_thread)
+INTDECL (dwfl_thread_state_registers)
+INTDECL (dwfl_thread_state_register_pc)
+INTDECL (dwfl_getthread_frames)
+INTDECL (dwfl_getthreads)
+INTDECL (dwfl_thread_getframes)
+INTDECL (dwfl_frame_pc)
 
 /* Leading arguments standard to callbacks passed a Dwfl_Module.  */
 #define MODCB_ARGS(mod)        (mod), &(mod)->userdata, (mod)->name, (mod)->low_addr
index 8543ed6..272f89b 100644 (file)
@@ -1,5 +1,5 @@
 /* Report modules by examining dynamic linker data structures.
-   Copyright (C) 2008-2010 Red Hat, Inc.
+   Copyright (C) 2008-2013 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
 
 #include <config.h>
 #include "libdwflP.h"
+#include "../libdw/memory-access.h"
+#include "system.h"
 
 #include <byteswap.h>
 #include <endian.h>
+#include <fcntl.h>
 
 /* This element is always provided and always has a constant value.
    This makes it an easy thing to scan for to discern the format.  */
 #define PROBE_VAL32    sizeof (Elf32_Phdr)
 #define PROBE_VAL64    sizeof (Elf64_Phdr)
 
-#if BYTE_ORDER == BIG_ENDIAN
-# define BE32(x)       (x)
-# define BE64(x)       (x)
-# define LE32(x)       bswap_32 (x)
-# define LE64(x)       bswap_64 (x)
-#else
-# define LE32(x)       (x)
-# define LE64(x)       (x)
-# define BE32(x)       bswap_32 (x)
-# define BE64(x)       bswap_64 (x)
-#endif
-
 
 /* Examine an auxv data block and determine its format.
    Return true iff we figured it out.  */
@@ -66,15 +57,22 @@ auxv_format_probe (const void *auxv, size_t size,
 
   inline bool check64 (size_t i)
   {
-    if (u->a64[i].a_type == BE64 (PROBE_TYPE)
-       && u->a64[i].a_un.a_val == BE64 (PROBE_VAL64))
+    /* The AUXV pointer might not even be naturally aligned for 64-bit
+       data, because note payloads in a core file are not aligned.
+       But we assume the data is 32-bit aligned.  */
+
+    uint64_t type = read_8ubyte_unaligned_noncvt (&u->a64[i].a_type);
+    uint64_t val = read_8ubyte_unaligned_noncvt (&u->a64[i].a_un.a_val);
+
+    if (type == BE64 (PROBE_TYPE)
+       && val == BE64 (PROBE_VAL64))
       {
        *elfdata = ELFDATA2MSB;
        return true;
       }
 
-    if (u->a64[i].a_type == LE64 (PROBE_TYPE)
-       && u->a64[i].a_un.a_val == LE64 (PROBE_VAL64))
+    if (type == LE64 (PROBE_TYPE)
+       && val == LE64 (PROBE_VAL64))
       {
        *elfdata = ELFDATA2LSB;
        return true;
@@ -225,7 +223,10 @@ addrsize (uint_fast8_t elfclass)
 }
 
 /* Report a module for each struct link_map in the linked list at r_map
-   in the struct r_debug at R_DEBUG_VADDR.
+   in the struct r_debug at R_DEBUG_VADDR.  For r_debug_info description
+   see dwfl_link_map_report in libdwflP.h.  If R_DEBUG_INFO is not NULL then no
+   modules get added to DWFL, caller has to add them from filled in
+   R_DEBUG_INFO.
 
    For each link_map entry, if an existing module resides at its address,
    this just modifies that module's name and suggested file name.  If
@@ -237,7 +238,8 @@ static int
 report_r_debug (uint_fast8_t elfclass, uint_fast8_t elfdata,
                Dwfl *dwfl, GElf_Addr r_debug_vaddr,
                Dwfl_Memory_Callback *memory_callback,
-               void *memory_callback_arg)
+               void *memory_callback_arg,
+               struct r_debug_info *r_debug_info)
 {
   /* Skip r_version, to aligned r_map field.  */
   GElf_Addr read_vaddr = r_debug_vaddr + addrsize (elfclass);
@@ -319,7 +321,11 @@ report_r_debug (uint_fast8_t elfclass, uint_fast8_t elfdata,
       if (read_addrs (next, 4))
        return release_buffer (-1);
 
-      GElf_Addr l_addr = addrs[0];
+      /* Unused: l_addr is the difference between the address in memory
+         and the ELF file when the core was created. We need to
+         recalculate the difference below because the ELF file we use
+         might be differently pre-linked.  */
+      // GElf_Addr l_addr = addrs[0];
       GElf_Addr l_name = addrs[1];
       GElf_Addr l_ld = addrs[2];
       next = addrs[3];
@@ -352,42 +358,117 @@ report_r_debug (uint_fast8_t elfclass, uint_fast8_t elfdata,
       if (name != NULL && name[0] == '\0')
        name = NULL;
 
-      /* If content-sniffing already reported a module covering
-        the same area, find that existing module to adjust.
-        The l_ld address is the only one we know for sure
-        to be within the module's own segments (its .dynamic).  */
-      Dwfl_Module *mod = INTUSE(dwfl_addrmodule) (dwfl, l_ld);
-      if (mod != NULL)
+      if (iterations == 1 && dwfl->executable_for_core != NULL)
+       name = dwfl->executable_for_core;
+
+      struct r_debug_info_module *r_debug_info_module = NULL;
+      if (r_debug_info != NULL)
+       {
+         /* Save link map information about valid shared library (or
+            executable) which has not been found on disk.  */
+         const char *name1 = name == NULL ? "" : name;
+         r_debug_info_module = malloc (sizeof (*r_debug_info_module)
+                                       + strlen (name1) + 1);
+         if (r_debug_info_module == NULL)
+           return release_buffer (result);
+         r_debug_info_module->fd = -1;
+         r_debug_info_module->elf = NULL;
+         r_debug_info_module->l_ld = l_ld;
+         r_debug_info_module->start = 0;
+         r_debug_info_module->end = 0;
+         r_debug_info_module->disk_file_has_build_id = false;
+         strcpy (r_debug_info_module->name, name1);
+         r_debug_info_module->next = r_debug_info->module;
+         r_debug_info->module = r_debug_info_module;
+       }
+
+      Dwfl_Module *mod = NULL;
+      if (name != NULL)
        {
-         /* We have a module.  We can give it a better name from l_name.  */
-         if (name != NULL && mod->name[0] == '[')
+         /* This code is mostly inlined dwfl_report_elf.  */
+         // XXX hook for sysroot
+         int fd = open64 (name, O_RDONLY);
+         if (fd >= 0)
            {
-             char *newname = strdup (basename (name));
-             if (newname != NULL)
+             Elf *elf;
+             Dwfl_Error error = __libdw_open_file (&fd, &elf, true, false);
+             GElf_Addr elf_dynamic_vaddr;
+             if (error == DWFL_E_NOERROR
+                 && __libdwfl_dynamic_vaddr_get (elf, &elf_dynamic_vaddr))
                {
-                 free (mod->name);
-                 mod->name = newname;
+                 const void *build_id_bits;
+                 GElf_Addr build_id_elfaddr;
+                 int build_id_len;
+                 bool valid = true;
+
+                 if (__libdwfl_find_elf_build_id (NULL, elf, &build_id_bits,
+                                                  &build_id_elfaddr,
+                                                  &build_id_len) > 0
+                     && build_id_elfaddr != 0)
+                   {
+                     if (r_debug_info_module != NULL)
+                       r_debug_info_module->disk_file_has_build_id = true;
+                     GElf_Addr build_id_vaddr = (build_id_elfaddr
+                                                 - elf_dynamic_vaddr + l_ld);
+
+                     release_buffer (0);
+                     int segndx = INTUSE(dwfl_addrsegment) (dwfl,
+                                                            build_id_vaddr,
+                                                            NULL);
+                     if (! (*memory_callback) (dwfl, segndx,
+                                               &buffer, &buffer_available,
+                                               build_id_vaddr, build_id_len,
+                                               memory_callback_arg))
+                       {
+                         /* File has valid build-id which cannot be read from
+                            memory.  This happens for core files without bit 4
+                            (0x10) set in Linux /proc/PID/coredump_filter.  */
+                       }
+                     else
+                       {
+                         if (memcmp (build_id_bits, buffer, build_id_len) != 0)
+                           /* File has valid build-id which does not match
+                              the one in memory.  */
+                           valid = false;
+                         release_buffer (0);
+                       }
+                   }
+
+                 if (valid)
+                   {
+                     // It is like l_addr but it handles differently prelinked
+                     // files at core dumping vs. core loading time.
+                     GElf_Addr base = l_ld - elf_dynamic_vaddr;
+                     if (r_debug_info_module == NULL)
+                       {
+                         // XXX hook for sysroot
+                         mod = __libdwfl_report_elf (dwfl, basename (name),
+                                                     name, fd, elf, base,
+                                                     true, true);
+                         if (mod != NULL)
+                           {
+                             elf = NULL;
+                             fd = -1;
+                           }
+                       }
+                     else if (__libdwfl_elf_address_range (elf, base, true,
+                                                           true, NULL, NULL,
+                                                   &r_debug_info_module->start,
+                                                   &r_debug_info_module->end,
+                                                           NULL, NULL))
+                       {
+                         r_debug_info_module->elf = elf;
+                         r_debug_info_module->fd = fd;
+                         elf = NULL;
+                         fd = -1;
+                       }
+                   }
+                 if (elf != NULL)
+                   elf_end (elf);
+                 if (fd != -1)
+                   close (fd);
                }
            }
-
-         if (name == NULL && mod->name[0] == '/')
-           name = mod->name;
-
-         /* If we don't have a file for it already, we can pre-install
-            the full file name from l_name.  Opening the file by this
-            name will be the fallback when no build ID match is found.
-            XXX hook for sysroot */
-         if (name != NULL && mod->main.name == NULL)
-           mod->main.name = strdup (name);
-       }
-      else if (name != NULL)
-       {
-         /* We have to find the file's phdrs to compute along with l_addr
-            what its runtime address boundaries are.  */
-
-         // XXX hook for sysroot
-         mod = INTUSE(dwfl_report_elf) (dwfl, basename (name),
-                                        name, -1, l_addr);
        }
 
       if (mod != NULL)
@@ -604,7 +685,8 @@ find_executable (Dwfl *dwfl, GElf_Addr at_phdr, GElf_Addr at_entry,
 int
 dwfl_link_map_report (Dwfl *dwfl, const void *auxv, size_t auxv_size,
                      Dwfl_Memory_Callback *memory_callback,
-                     void *memory_callback_arg)
+                     void *memory_callback_arg,
+                     struct r_debug_info *r_debug_info)
 {
   GElf_Addr r_debug_vaddr = 0;
 
@@ -618,29 +700,32 @@ dwfl_link_map_report (Dwfl *dwfl, const void *auxv, size_t auxv_size,
       GElf_Xword phent = 0;
       GElf_Xword phnum = 0;
 
-#define AUXV_SCAN(NN, BL) do                                   \
-       {                                                       \
-         const Elf##NN##_auxv_t *av = auxv;                    \
-         for (size_t i = 0; i < auxv_size / sizeof av[0]; ++i) \
-           {                                                   \
-             Elf##NN##_Addr val = BL##NN (av[i].a_un.a_val);   \
-             if (av[i].a_type == BL##NN (AT_ENTRY))            \
-               entry = val;                                    \
-             else if (av[i].a_type == BL##NN (AT_PHDR))        \
-               phdr = val;                                     \
-             else if (av[i].a_type == BL##NN (AT_PHNUM))       \
-               phnum = val;                                    \
-             else if (av[i].a_type == BL##NN (AT_PHENT))       \
-               phent = val;                                    \
-             else if (av[i].a_type == BL##NN (AT_PAGESZ))      \
-               {                                               \
-                 if (val > 1                                   \
-                     && (dwfl->segment_align == 0              \
-                         || val < dwfl->segment_align))        \
-                   dwfl->segment_align = val;                  \
-               }                                               \
-           }                                                   \
-       }                                                       \
+#define READ_AUXV32(ptr)       read_4ubyte_unaligned_noncvt (ptr)
+#define READ_AUXV64(ptr)       read_8ubyte_unaligned_noncvt (ptr)
+#define AUXV_SCAN(NN, BL) do                                            \
+       {                                                               \
+         const Elf##NN##_auxv_t *av = auxv;                            \
+         for (size_t i = 0; i < auxv_size / sizeof av[0]; ++i)         \
+           {                                                           \
+              uint##NN##_t type = READ_AUXV##NN (&av[i].a_type);        \
+              uint##NN##_t val = BL##NN (READ_AUXV##NN (&av[i].a_un.a_val)); \
+             if (type == BL##NN (AT_ENTRY))                            \
+               entry = val;                                            \
+             else if (type == BL##NN (AT_PHDR))                        \
+               phdr = val;                                             \
+             else if (type == BL##NN (AT_PHNUM))                       \
+               phnum = val;                                            \
+             else if (type == BL##NN (AT_PHENT))                       \
+               phent = val;                                            \
+             else if (type == BL##NN (AT_PAGESZ))                      \
+               {                                                       \
+                 if (val > 1                                           \
+                     && (dwfl->segment_align == 0                      \
+                         || val < dwfl->segment_align))                \
+                   dwfl->segment_align = val;                          \
+               }                                                       \
+           }                                                           \
+       }                                                               \
       while (0)
 
       if (elfclass == ELFCLASS32)
@@ -699,8 +784,65 @@ dwfl_link_map_report (Dwfl *dwfl, const void *auxv, size_t auxv_size,
              .d_size = phnum * phent,
              .d_buf = NULL
            };
-         if ((*memory_callback) (dwfl, phdr_segndx, &in.d_buf, &in.d_size,
-                                 phdr, phnum * phent, memory_callback_arg))
+         bool in_ok = (*memory_callback) (dwfl, phdr_segndx, &in.d_buf,
+                                          &in.d_size, phdr, phnum * phent,
+                                          memory_callback_arg);
+         if (! in_ok && dwfl->executable_for_core != NULL)
+           {
+             /* AUXV -> PHDR -> DYNAMIC
+                Both AUXV and DYNAMIC should be always present in a core file.
+                PHDR may be missing in core file, try to read it from
+                EXECUTABLE_FOR_CORE to find where DYNAMIC is located in the
+                core file.  */
+
+             int fd = open (dwfl->executable_for_core, O_RDONLY);
+             Elf *elf;
+             Dwfl_Error error = DWFL_E_ERRNO;
+             if (fd != -1)
+               error = __libdw_open_file (&fd, &elf, true, false);
+             if (error != DWFL_E_NOERROR)
+               {
+                 __libdwfl_seterrno (error);
+                 return false;
+               }
+             GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (elf, &ehdr_mem);
+             if (ehdr == NULL)
+               {
+                 elf_end (elf);
+                 close (fd);
+                 __libdwfl_seterrno (DWFL_E_LIBELF);
+                 return false;
+               }
+             if (ehdr->e_phnum != phnum || ehdr->e_phentsize != phent)
+               {
+                 elf_end (elf);
+                 close (fd);
+                 __libdwfl_seterrno (DWFL_E_BADELF);
+                 return false;
+               }
+             off_t off = ehdr->e_phoff;
+             assert (in.d_buf == NULL);
+             assert (in.d_size == phnum * phent);
+             in.d_buf = malloc (in.d_size);
+             if (unlikely (in.d_buf == NULL))
+               {
+                 elf_end (elf);
+                 close (fd);
+                 __libdwfl_seterrno (DWFL_E_NOMEM);
+                 return false;
+               }
+             ssize_t nread = pread_retry (fd, in.d_buf, in.d_size, off);
+             elf_end (elf);
+             close (fd);
+             if (nread != (ssize_t) in.d_size)
+               {
+                 free (in.d_buf);
+                 __libdwfl_seterrno (DWFL_E_ERRNO);
+                 return false;
+               }
+             in_ok = true;
+           }
+         if (in_ok)
            {
              union
              {
@@ -862,6 +1004,6 @@ dwfl_link_map_report (Dwfl *dwfl, const void *auxv, size_t auxv_size,
 
   /* Now we can follow the dynamic linker's library list.  */
   return report_r_debug (elfclass, elfdata, dwfl, r_debug_vaddr,
-                        &integrated_memory_callback, &mcb);
+                        &integrated_memory_callback, &mcb, r_debug_info);
 }
 INTDEF (dwfl_link_map_report)
diff --git a/libdwfl/linux-core-attach.c b/libdwfl/linux-core-attach.c
new file mode 100644 (file)
index 0000000..5a7b3b3
--- /dev/null
@@ -0,0 +1,427 @@
+/* Get Dwarf Frame state for target core file.
+   Copyright (C) 2013, 2014 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 "libdwflP.h"
+#include <fcntl.h>
+#include "system.h"
+
+#include "../libdw/memory-access.h"
+
+#ifndef MIN
+# define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+struct core_arg
+{
+  Elf *core;
+  Elf_Data *note_data;
+  size_t thread_note_offset;
+  Ebl *ebl;
+};
+
+struct thread_arg
+{
+  struct core_arg *core_arg;
+  size_t note_offset;
+};
+
+static bool
+core_memory_read (Dwfl *dwfl, Dwarf_Addr addr, Dwarf_Word *result,
+                 void *dwfl_arg)
+{
+  Dwfl_Process *process = dwfl->process;
+  struct core_arg *core_arg = dwfl_arg;
+  Elf *core = core_arg->core;
+  assert (core != NULL);
+  static size_t phnum;
+  if (elf_getphdrnum (core, &phnum) < 0)
+    {
+      __libdwfl_seterrno (DWFL_E_LIBELF);
+      return false;
+    }
+  for (size_t cnt = 0; cnt < phnum; ++cnt)
+    {
+      GElf_Phdr phdr_mem, *phdr = gelf_getphdr (core, cnt, &phdr_mem);
+      if (phdr == NULL || phdr->p_type != PT_LOAD)
+       continue;
+      /* Bias is zero here, a core file itself has no bias.  */
+      GElf_Addr start = __libdwfl_segment_start (dwfl, phdr->p_vaddr);
+      GElf_Addr end = __libdwfl_segment_end (dwfl,
+                                            phdr->p_vaddr + phdr->p_memsz);
+      unsigned bytes = ebl_get_elfclass (process->ebl) == ELFCLASS64 ? 8 : 4;
+      if (addr < start || addr + bytes > end)
+       continue;
+      Elf_Data *data;
+      data = elf_getdata_rawchunk (core, phdr->p_offset + addr - start,
+                                  bytes, ELF_T_ADDR);
+      if (data == NULL)
+       {
+         __libdwfl_seterrno (DWFL_E_LIBELF);
+         return false;
+       }
+      assert (data->d_size == bytes);
+      if (bytes == 8)
+       *result = read_8ubyte_unaligned_noncvt (data->d_buf);
+      else
+       *result = read_4ubyte_unaligned_noncvt (data->d_buf);
+      return true;
+    }
+  __libdwfl_seterrno (DWFL_E_ADDR_OUTOFRANGE);
+  return false;
+}
+
+static pid_t
+core_next_thread (Dwfl *dwfl __attribute__ ((unused)), void *dwfl_arg,
+                 void **thread_argp)
+{
+  struct core_arg *core_arg = dwfl_arg;
+  Elf *core = core_arg->core;
+  GElf_Nhdr nhdr;
+  size_t name_offset;
+  size_t desc_offset;
+  Elf_Data *note_data = core_arg->note_data;
+  size_t offset;
+
+  struct thread_arg *thread_arg;
+  if (*thread_argp == NULL)
+    {
+      core_arg->thread_note_offset = 0;
+      thread_arg = malloc (sizeof (*thread_arg));
+      if (thread_arg == NULL)
+       {
+         __libdwfl_seterrno (DWFL_E_NOMEM);
+         return -1;
+       }
+      thread_arg->core_arg = core_arg;
+      *thread_argp = thread_arg;
+    }
+  else
+    thread_arg = (struct thread_arg *) *thread_argp;
+
+  while (offset = core_arg->thread_note_offset, offset < note_data->d_size
+        && (core_arg->thread_note_offset = gelf_getnote (note_data, offset,
+                                                         &nhdr, &name_offset,
+                                                         &desc_offset)) > 0)
+    {
+      /* Do not check NAME for now, help broken Linux kernels.  */
+      const char *name = note_data->d_buf + name_offset;
+      const char *desc = note_data->d_buf + desc_offset;
+      GElf_Word regs_offset;
+      size_t nregloc;
+      const Ebl_Register_Location *reglocs;
+      size_t nitems;
+      const Ebl_Core_Item *items;
+      if (! ebl_core_note (core_arg->ebl, &nhdr, name,
+                          &regs_offset, &nregloc, &reglocs, &nitems, &items))
+       {
+         /* This note may be just not recognized, skip it.  */
+         continue;
+       }
+      if (nhdr.n_type != NT_PRSTATUS)
+       continue;
+      const Ebl_Core_Item *item;
+      for (item = items; item < items + nitems; item++)
+       if (strcmp (item->name, "pid") == 0)
+         break;
+      if (item == items + nitems)
+       continue;
+      uint32_t val32 = read_4ubyte_unaligned_noncvt (desc + item->offset);
+      val32 = (elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB
+               ? be32toh (val32) : le32toh (val32));
+      pid_t tid = (int32_t) val32;
+      eu_static_assert (sizeof val32 <= sizeof tid);
+      thread_arg->note_offset = offset;
+      return tid;
+    }
+
+  free (thread_arg);
+  return 0;
+}
+
+static bool
+core_set_initial_registers (Dwfl_Thread *thread, void *thread_arg_voidp)
+{
+  struct thread_arg *thread_arg = thread_arg_voidp;
+  struct core_arg *core_arg = thread_arg->core_arg;
+  Elf *core = core_arg->core;
+  size_t offset = thread_arg->note_offset;
+  GElf_Nhdr nhdr;
+  size_t name_offset;
+  size_t desc_offset;
+  Elf_Data *note_data = core_arg->note_data;
+  size_t nregs = ebl_frame_nregs (core_arg->ebl);
+  assert (nregs > 0);
+  assert (offset < note_data->d_size);
+  size_t getnote_err = gelf_getnote (note_data, offset, &nhdr, &name_offset,
+                                    &desc_offset);
+  /* __libdwfl_attach_state_for_core already verified the note is there.  */
+  assert (getnote_err != 0);
+  /* Do not check NAME for now, help broken Linux kernels.  */
+  const char *name = note_data->d_buf + name_offset;
+  const char *desc = note_data->d_buf + desc_offset;
+  GElf_Word regs_offset;
+  size_t nregloc;
+  const Ebl_Register_Location *reglocs;
+  size_t nitems;
+  const Ebl_Core_Item *items;
+  int core_note_err = ebl_core_note (core_arg->ebl, &nhdr, name, &regs_offset,
+                                    &nregloc, &reglocs, &nitems, &items);
+  /* __libdwfl_attach_state_for_core already verified the note is there.  */
+  assert (core_note_err != 0);
+  assert (nhdr.n_type == NT_PRSTATUS);
+  const Ebl_Core_Item *item;
+  for (item = items; item < items + nitems; item++)
+    if (strcmp (item->name, "pid") == 0)
+      break;
+  assert (item < items + nitems);
+  pid_t tid;
+  {
+    uint32_t val32 = read_4ubyte_unaligned_noncvt (desc + item->offset);
+    val32 = (elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB
+            ? be32toh (val32) : le32toh (val32));
+    tid = (int32_t) val32;
+    eu_static_assert (sizeof val32 <= sizeof tid);
+  }
+  /* core_next_thread already found this TID there.  */
+  assert (tid == INTUSE(dwfl_thread_tid) (thread));
+  for (item = items; item < items + nitems; item++)
+    if (item->pc_register)
+      break;
+  if (item < items + nitems)
+    {
+      Dwarf_Word pc;
+      switch (gelf_getclass (core) == ELFCLASS32 ? 32 : 64)
+      {
+       case 32:;
+         uint32_t val32 = read_4ubyte_unaligned_noncvt (desc + item->offset);
+         val32 = (elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB
+                  ? be32toh (val32) : le32toh (val32));
+         /* Do a host width conversion.  */
+         pc = val32;
+         break;
+       case 64:;
+         uint64_t val64 = read_8ubyte_unaligned_noncvt (desc + item->offset);
+         val64 = (elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB
+                  ? be64toh (val64) : le64toh (val64));
+         pc = val64;
+         break;
+       default:
+         abort ();
+      }
+      INTUSE(dwfl_thread_state_register_pc) (thread, pc);
+    }
+  desc += regs_offset;
+  for (size_t regloci = 0; regloci < nregloc; regloci++)
+    {
+      const Ebl_Register_Location *regloc = reglocs + regloci;
+      // Iterate even regs out of NREGS range so that we can find pc_register.
+      if (regloc->bits != 32 && regloc->bits != 64)
+       continue;
+      const char *reg_desc = desc + regloc->offset;
+      for (unsigned regno = regloc->regno;
+          regno < regloc->regno + (regloc->count ?: 1U);
+          regno++)
+       {
+         /* PPC provides DWARF register 65 irrelevant for
+            CFI which clashes with register 108 (LR) we need.
+            LR (108) is provided earlier (in NT_PRSTATUS) than the # 65.
+            FIXME: It depends now on their order in core notes.
+            FIXME: It uses private function.  */
+         if (regno < nregs
+             && __libdwfl_frame_reg_get (thread->unwound, regno, NULL))
+           continue;
+         Dwarf_Word val;
+         switch (regloc->bits)
+         {
+           case 32:;
+             uint32_t val32 = read_4ubyte_unaligned_noncvt (reg_desc);
+             reg_desc += sizeof val32;
+             val32 = (elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB
+                      ? be32toh (val32) : le32toh (val32));
+             /* Do a host width conversion.  */
+             val = val32;
+             break;
+           case 64:;
+             uint64_t val64 = read_8ubyte_unaligned_noncvt (reg_desc);
+             reg_desc += sizeof val64;
+             val64 = (elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB
+                      ? be64toh (val64) : le64toh (val64));
+             assert (sizeof (*thread->unwound->regs) == sizeof val64);
+             val = val64;
+             break;
+           default:
+             abort ();
+         }
+         /* Registers not valid for CFI are just ignored.  */
+         if (regno < nregs)
+           INTUSE(dwfl_thread_state_registers) (thread, regno, 1, &val);
+         if (regloc->pc_register)
+           INTUSE(dwfl_thread_state_register_pc) (thread, val);
+         reg_desc += regloc->pad;
+       }
+    }
+  return true;
+}
+
+static void
+core_detach (Dwfl *dwfl __attribute__ ((unused)), void *dwfl_arg)
+{
+  struct core_arg *core_arg = dwfl_arg;
+  ebl_closebackend (core_arg->ebl);
+  free (core_arg);
+}
+
+static const Dwfl_Thread_Callbacks core_thread_callbacks =
+{
+  core_next_thread,
+  NULL, /* get_thread */
+  core_memory_read,
+  core_set_initial_registers,
+  core_detach,
+  NULL, /* core_thread_detach */
+};
+
+int
+dwfl_core_file_attach (Dwfl *dwfl, Elf *core)
+{
+  Dwfl_Error err = DWFL_E_NOERROR;
+  Ebl *ebl = ebl_openbackend (core);
+  if (ebl == NULL)
+    {
+      err = DWFL_E_LIBEBL;
+    fail_err:
+      if (dwfl->process == NULL && dwfl->attacherr == DWFL_E_NOERROR)
+       dwfl->attacherr = __libdwfl_canon_error (err);
+      __libdwfl_seterrno (err);
+      return -1;
+    }
+  size_t nregs = ebl_frame_nregs (ebl);
+  if (nregs == 0)
+    {
+      err = DWFL_E_NO_UNWIND;
+    fail:
+      ebl_closebackend (ebl);
+      goto fail_err;
+    }
+  GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (core, &ehdr_mem);
+  if (ehdr == NULL)
+    {
+      err = DWFL_E_LIBELF;
+      goto fail;
+    }
+  if (ehdr->e_type != ET_CORE)
+    {
+      err = DWFL_E_NO_CORE_FILE;
+      goto fail;
+    }
+  size_t phnum;
+  if (elf_getphdrnum (core, &phnum) < 0)
+    {
+      err = DWFL_E_LIBELF;
+      goto fail;
+    }
+  pid_t pid = -1;
+  Elf_Data *note_data = NULL;
+  for (size_t cnt = 0; cnt < phnum; ++cnt)
+    {
+      GElf_Phdr phdr_mem, *phdr = gelf_getphdr (core, cnt, &phdr_mem);
+      if (phdr != NULL && phdr->p_type == PT_NOTE)
+       {
+         note_data = elf_getdata_rawchunk (core, phdr->p_offset,
+                                           phdr->p_filesz, ELF_T_NHDR);
+         break;
+       }
+    }
+  if (note_data == NULL)
+    {
+      err = DWFL_E_LIBELF;
+      goto fail;
+    }
+  size_t offset = 0;
+  GElf_Nhdr nhdr;
+  size_t name_offset;
+  size_t desc_offset;
+  while (offset < note_data->d_size
+        && (offset = gelf_getnote (note_data, offset,
+                                   &nhdr, &name_offset, &desc_offset)) > 0)
+    {
+      /* Do not check NAME for now, help broken Linux kernels.  */
+      const char *name = note_data->d_buf + name_offset;
+      const char *desc = note_data->d_buf + desc_offset;
+      GElf_Word regs_offset;
+      size_t nregloc;
+      const Ebl_Register_Location *reglocs;
+      size_t nitems;
+      const Ebl_Core_Item *items;
+      if (! ebl_core_note (ebl, &nhdr, name,
+                          &regs_offset, &nregloc, &reglocs, &nitems, &items))
+       {
+         /* This note may be just not recognized, skip it.  */
+         continue;
+       }
+      if (nhdr.n_type != NT_PRPSINFO)
+       continue;
+      const Ebl_Core_Item *item;
+      for (item = items; item < items + nitems; item++)
+       if (strcmp (item->name, "pid") == 0)
+         break;
+      if (item == items + nitems)
+       continue;
+      uint32_t val32 = read_4ubyte_unaligned_noncvt (desc + item->offset);
+      val32 = (elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB
+               ? be32toh (val32) : le32toh (val32));
+      pid = (int32_t) val32;
+      eu_static_assert (sizeof val32 <= sizeof pid);
+      break;
+    }
+  if (pid == -1)
+    {
+      /* No valid NT_PRPSINFO recognized in this CORE.  */
+      err = DWFL_E_BADELF;
+      goto fail;
+    }
+  struct core_arg *core_arg = malloc (sizeof *core_arg);
+  if (core_arg == NULL)
+    {
+      err = DWFL_E_NOMEM;
+      goto fail;
+    }
+  core_arg->core = core;
+  core_arg->note_data = note_data;
+  core_arg->thread_note_offset = 0;
+  core_arg->ebl = ebl;
+  if (! INTUSE(dwfl_attach_state) (dwfl, core, pid, &core_thread_callbacks,
+                                  core_arg))
+    {
+      free (core_arg);
+      ebl_closebackend (ebl);
+      return -1;
+    }
+  return pid;
+}
+INTDEF (dwfl_core_file_attach)
index bafe53c..e4065d8 100644 (file)
@@ -1,5 +1,5 @@
 /* Standard libdwfl callbacks for debugging the running Linux kernel.
-   Copyright (C) 2005-2011 Red Hat, Inc.
+   Copyright (C) 2005-2011, 2013, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -88,23 +88,22 @@ try_kernel_name (Dwfl *dwfl, char **fname, bool try_debug)
 
   if (fd < 0)
     {
-      char *debugfname = NULL;
       Dwfl_Module fakemod = { .dwfl = dwfl };
       /* First try the file's unadorned basename as DEBUGLINK_FILE,
         to look for "vmlinux" files.  */
       fd = INTUSE(dwfl_standard_find_debuginfo) (&fakemod, NULL, NULL, 0,
                                                 *fname, basename (*fname), 0,
-                                                &debugfname);
+                                                &fakemod.debug.name);
       if (fd < 0 && try_debug)
        /* Next, let the call use the default of basename + ".debug",
           to look for "vmlinux.debug" files.  */
        fd = INTUSE(dwfl_standard_find_debuginfo) (&fakemod, NULL, NULL, 0,
                                                   *fname, NULL, 0,
-                                                  &debugfname);
-      if (debugfname != NULL)
+                                                  &fakemod.debug.name);
+      if (fakemod.debug.name != NULL)
        {
          free (*fname);
-         *fname = debugfname;
+         *fname = fakemod.debug.name;
        }
     }
 
@@ -216,8 +215,14 @@ report_kernel (Dwfl *dwfl, const char **release,
 
       if (report)
        {
+         /* Note that on some architectures (e.g. x86_64) the vmlinux
+            is ET_EXEC, while on others (e.g. ppc64) it is ET_DYN.
+            In both cases the phdr p_vaddr load address will be non-zero.
+            We want the image to be placed as if it was ET_DYN, so
+            pass true for add_p_vaddr which will do the right thing
+            (in combination with a zero base) in either case.  */
          Dwfl_Module *mod = INTUSE(dwfl_report_elf) (dwfl, KERNEL_MODNAME,
-                                                     fname, fd, 0);
+                                                     fname, fd, 0, true);
          if (mod == NULL)
            result = -1;
          else
@@ -225,12 +230,12 @@ report_kernel (Dwfl *dwfl, const char **release,
            mod->e_type = ET_DYN;
        }
 
+      free (fname);
+
       if (!report || result < 0)
        close (fd);
     }
 
-  free (fname);
-
   return result;
 }
 
@@ -245,9 +250,10 @@ report_kernel_archive (Dwfl *dwfl, const char **release,
     return result;
 
   char *archive;
-  if (unlikely ((*release)[0] == '/'
-               ? asprintf (&archive, "%s/debug.a", *release)
-               : asprintf (&archive, MODULEDIRFMT "/debug.a", *release)) < 0)
+  int res = (((*release)[0] == '/')
+            ? asprintf (&archive, "%s/debug.a", *release)
+            : asprintf (&archive, MODULEDIRFMT "/debug.a", *release));
+  if (unlikely (res < 0))
     return ENOMEM;
 
   int fd = try_kernel_name (dwfl, &archive, false);
@@ -296,6 +302,9 @@ check_suffix (const FTSENT *f, size_t namelen)
 #if USE_BZLIB
   TRY (".ko.bz2");
 #endif
+#if USE_LZMA
+  TRY (".ko.xz");
+#endif
 
   return 0;
 
diff --git a/libdwfl/linux-pid-attach.c b/libdwfl/linux-pid-attach.c
new file mode 100644 (file)
index 0000000..ae71702
--- /dev/null
@@ -0,0 +1,475 @@
+/* Get Dwarf Frame state for target live PID process.
+   Copyright (C) 2013, 2014 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 "libdwflP.h"
+#include <sys/ptrace.h>
+#include <sys/wait.h>
+#include <dirent.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+#ifndef MAX
+# define MAX(a, b) ((a) > (b) ? (a) : (b))
+#endif
+
+#ifdef __linux__
+
+static bool
+linux_proc_pid_is_stopped (pid_t pid)
+{
+  char buffer[64];
+  FILE *procfile;
+  bool retval, have_state;
+
+  snprintf (buffer, sizeof (buffer), "/proc/%ld/status", (long) pid);
+  procfile = fopen (buffer, "r");
+  if (procfile == NULL)
+    return false;
+
+  have_state = false;
+  while (fgets (buffer, sizeof (buffer), procfile) != NULL)
+    if (strncmp (buffer, "State:", 6) == 0)
+      {
+       have_state = true;
+       break;
+      }
+  retval = (have_state && strstr (buffer, "T (stopped)") != NULL);
+  fclose (procfile);
+  return retval;
+}
+
+bool
+internal_function
+__libdwfl_ptrace_attach (pid_t tid, bool *tid_was_stoppedp)
+{
+  if (ptrace (PTRACE_ATTACH, tid, NULL, NULL) != 0)
+    {
+      __libdwfl_seterrno (DWFL_E_ERRNO);
+      return false;
+    }
+  *tid_was_stoppedp = linux_proc_pid_is_stopped (tid);
+  if (*tid_was_stoppedp)
+    {
+      /* Make sure there is a SIGSTOP signal pending even when the process is
+        already State: T (stopped).  Older kernels might fail to generate
+        a SIGSTOP notification in that case in response to our PTRACE_ATTACH
+        above.  Which would make the waitpid below wait forever.  So emulate
+        it.  Since there can only be one SIGSTOP notification pending this is
+        safe.  See also gdb/linux-nat.c linux_nat_post_attach_wait.  */
+      syscall (__NR_tkill, tid, SIGSTOP);
+      ptrace (PTRACE_CONT, tid, NULL, NULL);
+    }
+  for (;;)
+    {
+      int status;
+      if (waitpid (tid, &status, __WALL) != tid || !WIFSTOPPED (status))
+       {
+         int saved_errno = errno;
+         ptrace (PTRACE_DETACH, tid, NULL, NULL);
+         errno = saved_errno;
+         __libdwfl_seterrno (DWFL_E_ERRNO);
+         return false;
+       }
+      if (WSTOPSIG (status) == SIGSTOP)
+       break;
+      if (ptrace (PTRACE_CONT, tid, NULL,
+                 (void *) (uintptr_t) WSTOPSIG (status)) != 0)
+       {
+         int saved_errno = errno;
+         ptrace (PTRACE_DETACH, tid, NULL, NULL);
+         errno = saved_errno;
+         __libdwfl_seterrno (DWFL_E_ERRNO);
+         return false;
+       }
+    }
+  return true;
+}
+
+static bool
+pid_memory_read (Dwfl *dwfl, Dwarf_Addr addr, Dwarf_Word *result, void *arg)
+{
+  struct __libdwfl_pid_arg *pid_arg = arg;
+  pid_t tid = pid_arg->tid_attached;
+  assert (tid > 0);
+  Dwfl_Process *process = dwfl->process;
+  if (ebl_get_elfclass (process->ebl) == ELFCLASS64)
+    {
+#if SIZEOF_LONG == 8
+      errno = 0;
+      *result = ptrace (PTRACE_PEEKDATA, tid, (void *) (uintptr_t) addr, NULL);
+      return errno == 0;
+#else /* SIZEOF_LONG != 8 */
+      /* This should not happen.  */
+      return false;
+#endif /* SIZEOF_LONG != 8 */
+    }
+#if SIZEOF_LONG == 8
+  /* We do not care about reads unaliged to 4 bytes boundary.
+     But 0x...ffc read of 8 bytes could overrun a page.  */
+  bool lowered = (addr & 4) != 0;
+  if (lowered)
+    addr -= 4;
+#endif /* SIZEOF_LONG == 8 */
+  errno = 0;
+  *result = ptrace (PTRACE_PEEKDATA, tid, (void *) (uintptr_t) addr, NULL);
+  if (errno != 0)
+    return false;
+#if SIZEOF_LONG == 8
+# if BYTE_ORDER == BIG_ENDIAN
+  if (! lowered)
+    *result >>= 32;
+# else
+  if (lowered)
+    *result >>= 32;
+# endif
+#endif /* SIZEOF_LONG == 8 */
+  *result &= 0xffffffff;
+  return true;
+}
+
+static pid_t
+pid_next_thread (Dwfl *dwfl __attribute__ ((unused)), void *dwfl_arg,
+                void **thread_argp)
+{
+  struct __libdwfl_pid_arg *pid_arg = dwfl_arg;
+  struct dirent *dirent;
+  /* Start fresh on first traversal. */
+  if (*thread_argp == NULL)
+    rewinddir (pid_arg->dir);
+  do
+    {
+      errno = 0;
+      dirent = readdir (pid_arg->dir);
+      if (dirent == NULL)
+       {
+         if (errno != 0)
+           {
+             __libdwfl_seterrno (DWFL_E_ERRNO);
+             return -1;
+           }
+         return 0;
+       }
+    }
+  while (strcmp (dirent->d_name, ".") == 0
+        || strcmp (dirent->d_name, "..") == 0);
+  char *end;
+  errno = 0;
+  long tidl = strtol (dirent->d_name, &end, 10);
+  if (errno != 0)
+    {
+      __libdwfl_seterrno (DWFL_E_ERRNO);
+      return -1;
+    }
+  pid_t tid = tidl;
+  if (tidl <= 0 || (end && *end) || tid != tidl)
+    {
+      __libdwfl_seterrno (DWFL_E_PARSE_PROC);
+      return -1;
+    }
+  *thread_argp = dwfl_arg;
+  return tid;
+}
+
+/* Just checks that the thread id exists.  */
+static bool
+pid_getthread (Dwfl *dwfl __attribute__ ((unused)), pid_t tid,
+              void *dwfl_arg, void **thread_argp)
+{
+  *thread_argp = dwfl_arg;
+  if (kill (tid, 0) < 0)
+    {
+      __libdwfl_seterrno (DWFL_E_ERRNO);
+      return false;
+    }
+  return true;
+}
+
+/* Implement the ebl_set_initial_registers_tid setfunc callback.  */
+
+static bool
+pid_thread_state_registers_cb (int firstreg, unsigned nregs,
+                              const Dwarf_Word *regs, void *arg)
+{
+  Dwfl_Thread *thread = (Dwfl_Thread *) arg;
+  if (firstreg < 0)
+    {
+      assert (firstreg == -1);
+      assert (nregs == 1);
+      INTUSE(dwfl_thread_state_register_pc) (thread, *regs);
+      return true;
+    }
+  assert (nregs > 0);
+  return INTUSE(dwfl_thread_state_registers) (thread, firstreg, nregs, regs);
+}
+
+static bool
+pid_set_initial_registers (Dwfl_Thread *thread, void *thread_arg)
+{
+  struct __libdwfl_pid_arg *pid_arg = thread_arg;
+  assert (pid_arg->tid_attached == 0);
+  pid_t tid = INTUSE(dwfl_thread_tid) (thread);
+  if (! pid_arg->assume_ptrace_stopped
+      && ! __libdwfl_ptrace_attach (tid, &pid_arg->tid_was_stopped))
+    return false;
+  pid_arg->tid_attached = tid;
+  Dwfl_Process *process = thread->process;
+  Ebl *ebl = process->ebl;
+  return ebl_set_initial_registers_tid (ebl, tid,
+                                       pid_thread_state_registers_cb, thread);
+}
+
+static void
+pid_detach (Dwfl *dwfl __attribute__ ((unused)), void *dwfl_arg)
+{
+  struct __libdwfl_pid_arg *pid_arg = dwfl_arg;
+  closedir (pid_arg->dir);
+  free (pid_arg);
+}
+
+void
+internal_function
+__libdwfl_ptrace_detach (pid_t tid, bool tid_was_stopped)
+{
+  /* This handling is needed only on older Linux kernels such as
+     2.6.32-358.23.2.el6.ppc64.  Later kernels such as
+     3.11.7-200.fc19.x86_64 remember the T (stopped) state
+     themselves and no longer need to pass SIGSTOP during
+     PTRACE_DETACH.  */
+  ptrace (PTRACE_DETACH, tid, NULL,
+         (void *) (intptr_t) (tid_was_stopped ? SIGSTOP : 0));
+}
+
+static void
+pid_thread_detach (Dwfl_Thread *thread, void *thread_arg)
+{
+  struct __libdwfl_pid_arg *pid_arg = thread_arg;
+  pid_t tid = INTUSE(dwfl_thread_tid) (thread);
+  assert (pid_arg->tid_attached == tid);
+  pid_arg->tid_attached = 0;
+  if (! pid_arg->assume_ptrace_stopped)
+    __libdwfl_ptrace_detach (tid, pid_arg->tid_was_stopped);
+}
+
+static const Dwfl_Thread_Callbacks pid_thread_callbacks =
+{
+  pid_next_thread,
+  pid_getthread,
+  pid_memory_read,
+  pid_set_initial_registers,
+  pid_detach,
+  pid_thread_detach,
+};
+
+int
+dwfl_linux_proc_attach (Dwfl *dwfl, pid_t pid, bool assume_ptrace_stopped)
+{
+  char buffer[36];
+  FILE *procfile;
+  int err = 0; /* The errno to return and set for dwfl->attcherr.  */
+
+  /* Make sure to report the actual PID (thread group leader) to
+     dwfl_attach_state.  */
+  snprintf (buffer, sizeof (buffer), "/proc/%ld/status", (long) pid);
+  procfile = fopen (buffer, "r");
+  if (procfile == NULL)
+    {
+      err = errno;
+    fail:
+      if (dwfl->process == NULL && dwfl->attacherr == DWFL_E_NOERROR)
+       {
+         errno = err;
+         dwfl->attacherr = __libdwfl_canon_error (DWFL_E_ERRNO);
+       }
+      return err;
+    }
+
+  char *line = NULL;
+  size_t linelen = 0;
+  while (getline (&line, &linelen, procfile) >= 0)
+    if (strncmp (line, "Tgid:", 5) == 0)
+      {
+       errno = 0;
+       char *endptr;
+       long val = strtol (&line[5], &endptr, 10);
+       if ((errno == ERANGE && val == LONG_MAX)
+           || *endptr != '\n' || val < 0 || val != (pid_t) val)
+         pid = 0;
+       else
+         pid = (pid_t) val;
+       break;
+      }
+  free (line);
+  fclose (procfile);
+
+  if (pid == 0)
+    {
+      err = ESRCH;
+      goto fail;
+    }
+
+  char dirname[64];
+  int i = snprintf (dirname, sizeof (dirname), "/proc/%ld/task", (long) pid);
+  assert (i > 0 && i < (ssize_t) sizeof (dirname) - 1);
+  DIR *dir = opendir (dirname);
+  if (dir == NULL)
+    {
+      err = errno;
+      goto fail;
+    }
+  struct __libdwfl_pid_arg *pid_arg = malloc (sizeof *pid_arg);
+  if (pid_arg == NULL)
+    {
+      closedir (dir);
+      err = ENOMEM;
+      goto fail;
+    }
+  pid_arg->dir = dir;
+  pid_arg->tid_attached = 0;
+  pid_arg->assume_ptrace_stopped = assume_ptrace_stopped;
+  if (! INTUSE(dwfl_attach_state) (dwfl, NULL, pid, &pid_thread_callbacks,
+                                  pid_arg))
+    {
+      closedir (dir);
+      free (pid_arg);
+      return -1;
+    }
+  return 0;
+}
+INTDEF (dwfl_linux_proc_attach)
+
+struct __libdwfl_pid_arg *
+internal_function
+__libdwfl_get_pid_arg (Dwfl *dwfl)
+{
+  if (dwfl != NULL && dwfl->process != NULL
+      && dwfl->process->callbacks == &pid_thread_callbacks)
+    return (struct __libdwfl_pid_arg *) dwfl->process->callbacks_arg;
+
+  return NULL;
+}
+
+#else  /* __linux__ */
+
+static pid_t
+pid_next_thread (Dwfl *dwfl __attribute__ ((unused)),
+                void *dwfl_arg __attribute__ ((unused)),
+                void **thread_argp __attribute__ ((unused)))
+{
+  errno = ENOSYS;
+  __libdwfl_seterrno (DWFL_E_ERRNO);
+  return -1;
+}
+
+static bool
+pid_getthread (Dwfl *dwfl __attribute__ ((unused)),
+              pid_t tid __attribute__ ((unused)),
+              void *dwfl_arg __attribute__ ((unused)),
+              void **thread_argp __attribute__ ((unused)))
+{
+  errno = ENOSYS;
+  __libdwfl_seterrno (DWFL_E_ERRNO);
+  return false;
+}
+
+bool
+internal_function
+__libdwfl_ptrace_attach (pid_t tid __attribute__ ((unused)),
+                        bool *tid_was_stoppedp __attribute__ ((unused)))
+{
+  errno = ENOSYS;
+  __libdwfl_seterrno (DWFL_E_ERRNO);
+  return false;
+}
+
+static bool
+pid_memory_read (Dwfl *dwfl __attribute__ ((unused)),
+                 Dwarf_Addr addr __attribute__ ((unused)),
+                Dwarf_Word *result __attribute__ ((unused)),
+                void *arg __attribute__ ((unused)))
+{
+  errno = ENOSYS;
+  __libdwfl_seterrno (DWFL_E_ERRNO);
+  return false;
+}
+
+static bool
+pid_set_initial_registers (Dwfl_Thread *thread __attribute__ ((unused)),
+                          void *thread_arg __attribute__ ((unused)))
+{
+  errno = ENOSYS;
+  __libdwfl_seterrno (DWFL_E_ERRNO);
+  return false;
+}
+
+static void
+pid_detach (Dwfl *dwfl __attribute__ ((unused)),
+           void *dwfl_arg __attribute__ ((unused)))
+{
+}
+
+void
+internal_function
+__libdwfl_ptrace_detach (pid_t tid __attribute__ ((unused)),
+                        bool tid_was_stopped __attribute__ ((unused)))
+{
+}
+
+static void
+pid_thread_detach (Dwfl_Thread *thread __attribute__ ((unused)),
+                 void *thread_arg __attribute__ ((unused)))
+{
+}
+
+static const Dwfl_Thread_Callbacks pid_thread_callbacks =
+{
+  pid_next_thread,
+  pid_getthread,
+  pid_memory_read,
+  pid_set_initial_registers,
+  pid_detach,
+  pid_thread_detach,
+};
+
+int
+dwfl_linux_proc_attach (Dwfl *dwfl __attribute__ ((unused)),
+                       pid_t pid __attribute__ ((unused)),
+                       bool assume_ptrace_stopped __attribute__ ((unused)))
+{
+  return ENOSYS;
+}
+INTDEF (dwfl_linux_proc_attach)
+
+struct __libdwfl_pid_arg *
+internal_function
+__libdwfl_get_pid_arg (Dwfl *dwfl __attribute__ ((unused)))
+{
+  return NULL;
+}
+
+#endif /* ! __linux __ */
+
index 4fbe90d..d085834 100644 (file)
@@ -1,5 +1,5 @@
 /* Standard libdwfl callbacks for debugging a live Linux process.
-   Copyright (C) 2005-2010 Red Hat, Inc.
+   Copyright (C) 2005-2010, 2013, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -29,6 +29,7 @@
 #include "libdwflP.h"
 #include <inttypes.h>
 #include <sys/types.h>
+#include <sys/stat.h>
 #include <errno.h>
 #include <stdio.h>
 #include <stdio_ext.h>
 #include <unistd.h>
 #include <assert.h>
 #include <endian.h>
+#include "system.h"
 
 
 #define PROCMAPSFMT    "/proc/%d/maps"
 #define PROCMEMFMT     "/proc/%d/mem"
 #define PROCAUXVFMT    "/proc/%d/auxv"
+#define PROCEXEFMT     "/proc/%d/exe"
 
 
-/* Search /proc/PID/auxv for the AT_SYSINFO_EHDR tag.  */
+/* Return ELFCLASS64 or ELFCLASS32 for the main ELF executable.  Return
+   ELFCLASSNONE for an error.  */
+
+static unsigned char
+get_pid_class (pid_t pid)
+{
+  char *fname;
+  if (asprintf (&fname, PROCEXEFMT, pid) < 0)
+    return ELFCLASSNONE;
+
+  int fd = open64 (fname, O_RDONLY);
+  free (fname);
+  if (fd < 0)
+    return ELFCLASSNONE;
+
+  unsigned char buf[EI_CLASS + 1];
+  ssize_t nread = pread_retry (fd, &buf, sizeof buf, 0);
+  close (fd);
+  if (nread != sizeof buf || buf[EI_MAG0] != ELFMAG0
+      || buf[EI_MAG1] != ELFMAG1 || buf[EI_MAG2] != ELFMAG2
+      || buf[EI_MAG3] != ELFMAG3
+      || (buf[EI_CLASS] != ELFCLASS64 && buf[EI_CLASS] != ELFCLASS32))
+    return ELFCLASSNONE;
+
+  return buf[EI_CLASS];
+}
+
+/* Search /proc/PID/auxv for the AT_SYSINFO_EHDR tag.
+
+   It would be easiest to call get_pid_class and parse everything according to
+   the 32-bit or 64-bit class.  But this would bring the overhead of syscalls
+   to open and read the "/proc/%d/exe" file.
+
+   Therefore this function tries to parse the "/proc/%d/auxv" content both
+   ways, as if it were the 32-bit format and also if it were the 64-bit format.
+   Only if it gives some valid data in both cases get_pid_class gets called.
+   In most cases only one of the format bit sizes gives valid data and the
+   get_pid_class call overhead can be saved.  */
 
 static int
 grovel_auxv (pid_t pid, Dwfl *dwfl, GElf_Addr *sysinfo_ehdr)
@@ -60,61 +100,79 @@ grovel_auxv (pid_t pid, Dwfl *dwfl, GElf_Addr *sysinfo_ehdr)
   if (fd < 0)
     return errno == ENOENT ? 0 : errno;
 
+  GElf_Addr sysinfo_ehdr64 = 0;
+  GElf_Addr sysinfo_ehdr32 = 0;
+  GElf_Addr segment_align64 = dwfl->segment_align;
+  GElf_Addr segment_align32 = dwfl->segment_align;
+  off_t offset = 0;
   ssize_t nread;
+  union
+  {
+    Elf64_auxv_t a64[64];
+    Elf32_auxv_t a32[128];
+  } d;
   do
     {
-      union
-      {
-       char buffer[sizeof (long int) * 2 * 64];
-       Elf64_auxv_t a64[sizeof (long int) * 2 * 64 / sizeof (Elf64_auxv_t)];
-       Elf32_auxv_t a32[sizeof (long int) * 2 * 32 / sizeof (Elf32_auxv_t)];
-      } d;
-      nread = read (fd, &d, sizeof d);
-      if (nread > 0)
+      eu_static_assert (sizeof d.a64 == sizeof d.a32);
+      nread = pread_retry (fd, d.a64, sizeof d.a64, offset);
+      if (nread < 0)
        {
-         switch (sizeof (long int))
-           {
-           case 4:
-             for (size_t i = 0; (char *) &d.a32[i] < &d.buffer[nread]; ++i)
-               if (d.a32[i].a_type == AT_SYSINFO_EHDR)
-                 {
-                   *sysinfo_ehdr = d.a32[i].a_un.a_val;
-                   if (dwfl->segment_align > 1)
-                     {
-                       nread = 0;
-                       break;
-                     }
-                 }
-               else if (d.a32[i].a_type == AT_PAGESZ
-                        && dwfl->segment_align <= 1)
-                 dwfl->segment_align = d.a32[i].a_un.a_val;
+         int ret = errno;
+         close (fd);
+         return ret;
+       }
+      for (size_t a32i = 0; a32i < nread / sizeof d.a32[0]; a32i++)
+       {
+         const Elf32_auxv_t *a32 = d.a32 + a32i;
+         switch (a32->a_type)
+         {
+           case AT_SYSINFO_EHDR:
+             sysinfo_ehdr32 = a32->a_un.a_val;
              break;
-           case 8:
-             for (size_t i = 0; (char *) &d.a64[i] < &d.buffer[nread]; ++i)
-               if (d.a64[i].a_type == AT_SYSINFO_EHDR)
-                 {
-                   *sysinfo_ehdr = d.a64[i].a_un.a_val;
-                   if (dwfl->segment_align > 1)
-                     {
-                       nread = 0;
-                       break;
-                     }
-                 }
-               else if (d.a64[i].a_type == AT_PAGESZ
-                        && dwfl->segment_align <= 1)
-                 dwfl->segment_align = d.a64[i].a_un.a_val;
+           case AT_PAGESZ:
+             segment_align32 = a32->a_un.a_val;
              break;
-           default:
-             abort ();
+         }
+       }
+      for (size_t a64i = 0; a64i < nread / sizeof d.a64[0]; a64i++)
+       {
+         const Elf64_auxv_t *a64 = d.a64 + a64i;
+         switch (a64->a_type)
+         {
+           case AT_SYSINFO_EHDR:
+             sysinfo_ehdr64 = a64->a_un.a_val;
              break;
-           }
+           case AT_PAGESZ:
+             segment_align64 = a64->a_un.a_val;
+             break;
+         }
        }
+      offset += nread;
     }
-  while (nread > 0);
+  while (nread == sizeof d.a64);
 
   close (fd);
 
-  return nread < 0 ? errno : 0;
+  bool valid64 = sysinfo_ehdr64 != 0 || segment_align64 != dwfl->segment_align;
+  bool valid32 = sysinfo_ehdr32 != 0 || segment_align32 != dwfl->segment_align;
+
+  unsigned char pid_class = ELFCLASSNONE;
+  if (valid64 && valid32)
+    pid_class = get_pid_class (pid);
+
+  if (pid_class == ELFCLASS64 || (valid64 && ! valid32))
+    {
+      *sysinfo_ehdr = sysinfo_ehdr64;
+      dwfl->segment_align = segment_align64;
+      return 0;
+    }
+  if (pid_class == ELFCLASS32 || (! valid64 && valid32))
+    {
+      *sysinfo_ehdr = sysinfo_ehdr32;
+      dwfl->segment_align = segment_align32;
+      return 0;
+    }
+  return ENOEXEC;
 }
 
 static int
@@ -168,7 +226,6 @@ proc_maps_report (Dwfl *dwfl, FILE *f, GElf_Addr sysinfo_ehdr, pid_t pid)
            {
            bad_report:
              free (line);
-             fclose (f);
              return -1;
            }
 
@@ -180,7 +237,7 @@ proc_maps_report (Dwfl *dwfl, FILE *f, GElf_Addr sysinfo_ehdr, pid_t pid)
        }
 
       char *file = line + nread + strspn (line + nread, " \t");
-      if (file[0] == '\0' || (ino == 0 && dmajor == 0 && dminor == 0))
+      if (file[0] != '/' || (ino == 0 && dmajor == 0 && dminor == 0))
        /* This line doesn't indicate a file mapping.  */
        continue;
 
@@ -188,7 +245,8 @@ proc_maps_report (Dwfl *dwfl, FILE *f, GElf_Addr sysinfo_ehdr, pid_t pid)
          && ino == last_ino && dmajor == last_dmajor && dminor == last_dminor)
        {
          /* This is another portion of the same file's mapping.  */
-         assert (!strcmp (last_file, file));
+         if (strcmp (last_file, file) != 0)
+           goto bad_report;
          high = end;
        }
       else
@@ -267,6 +325,7 @@ read_proc_memory (void *arg, void *data, GElf_Addr address,
 }
 
 extern Elf *elf_from_remote_memory (GElf_Addr ehdr_vma,
+                                   GElf_Xword pagesize,
                                    GElf_Addr *loadbasep,
                                    ssize_t (*read_memory) (void *arg,
                                                            void *data,
@@ -284,44 +343,80 @@ dwfl_linux_proc_find_elf (Dwfl_Module *mod __attribute__ ((unused)),
                          const char *module_name, Dwarf_Addr base,
                          char **file_name, Elf **elfp)
 {
+  int pid = -1;
   if (module_name[0] == '/')
     {
-      int fd = open64 (module_name, O_RDONLY);
-      if (fd >= 0)
+      /* When this callback is used together with dwfl_linux_proc_report
+        then we might see mappings of special character devices.  Make
+        sure we only open and return regular files.  Special devices
+        might hang on open or read.  (deleted) files are super special.
+        The image might come from memory if we are attached.  */
+      struct stat sb;
+      if (stat (module_name, &sb) == -1 || (sb.st_mode & S_IFMT) != S_IFREG)
+       {
+         if (strcmp (strrchr (module_name, ' ') ?: "", " (deleted)") == 0)
+           pid = INTUSE(dwfl_pid) (mod->dwfl);
+         else
+           return -1;
+       }
+
+      if (pid == -1)
        {
-         *file_name = strdup (module_name);
-         if (*file_name == NULL)
+         int fd = open64 (module_name, O_RDONLY);
+         if (fd >= 0)
            {
-             close (fd);
-             return ENOMEM;
+             *file_name = strdup (module_name);
+             if (*file_name == NULL)
+               {
+                 close (fd);
+                 return ENOMEM;
+               }
            }
+         return fd;
        }
-      return fd;
     }
 
-  int pid;
-  if (sscanf (module_name, "[vdso: %d]", &pid) == 1)
+  if (pid != -1 || sscanf (module_name, "[vdso: %d]", &pid) == 1)
     {
       /* Special case for in-memory ELF image.  */
 
+      bool detach = false;
+      bool tid_was_stopped = false;
+      struct __libdwfl_pid_arg *pid_arg = __libdwfl_get_pid_arg (mod->dwfl);
+      if (pid_arg != NULL && ! pid_arg->assume_ptrace_stopped)
+       {
+         /* If any thread is already attached we are fine.  Read
+            through that thread.  It doesn't have to be the main
+            thread pid.  */
+         pid_t tid = pid_arg->tid_attached;
+         if (tid != 0)
+           pid = tid;
+         else
+           detach = __libdwfl_ptrace_attach (pid, &tid_was_stopped);
+       }
+
       char *fname;
       if (asprintf (&fname, PROCMEMFMT, pid) < 0)
-       return -1;
+       goto detach;
 
       int fd = open64 (fname, O_RDONLY);
       free (fname);
       if (fd < 0)
-       return -1;
+       goto detach;
 
-      *elfp = elf_from_remote_memory (base, NULL, &read_proc_memory, &fd);
+      *elfp = elf_from_remote_memory (base, getpagesize (), NULL,
+                                     &read_proc_memory, &fd);
 
       close (fd);
 
       *file_name = NULL;
+
+    detach:
+      if (detach)
+       __libdwfl_ptrace_detach (pid, tid_was_stopped);
       return -1;
     }
 
-  abort ();
   return -1;
 }
 INTDEF (dwfl_linux_proc_find_elf)
index 26a6bd6..28d2782 100644 (file)
@@ -127,7 +127,8 @@ process_elf (Dwfl *dwfl, const char *name, const char *file_name, int fd,
             Elf *elf)
 {
   Dwfl_Module *mod = __libdwfl_report_elf (dwfl, name, file_name, fd, elf,
-                                          dwfl->offline_next_address, false);
+                                          dwfl->offline_next_address, true,
+                                          false);
   if (mod != NULL)
     {
       /* If this is an ET_EXEC file with fixed addresses, the address range
index 7dd5b52..40aac38 100644 (file)
 #include <unistd.h>
 
 #if !USE_ZLIB
-# define __libdw_gunzip(...)   false
+# define __libdw_gunzip(...)   DWFL_E_BADELF
 #endif
 
 #if !USE_BZLIB
-# define __libdw_bunzip2(...)  false
+# define __libdw_bunzip2(...)  DWFL_E_BADELF
 #endif
 
 #if !USE_LZMA
-# define __libdw_unlzma(...)   false
+# define __libdw_unlzma(...)   DWFL_E_BADELF
 #endif
 
 /* Consumes and replaces *ELF only on success.  */
index 2c24bd5..52b7b5e 100644 (file)
@@ -1,5 +1,5 @@
 /* Relocate debug information.
-   Copyright (C) 2005-2010 Red Hat, Inc.
+   Copyright (C) 2005-2011, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -38,8 +38,6 @@ internal_function
 __libdwfl_relocate_value (Dwfl_Module *mod, Elf *elf, size_t *shstrndx,
                          Elf32_Word shndx, GElf_Addr *value)
 {
-  assert (mod->e_type == ET_REL);
-
   Elf_Scn *refscn = elf_getscn (elf, shndx);
   GElf_Shdr refshdr_mem, *refshdr = gelf_getshdr (refscn, &refshdr_mem);
   if (refshdr == NULL)
@@ -254,7 +252,8 @@ resolve_symbol (Dwfl_Module *referer, struct reloc_symtab_cache *symtab,
 
                if (m->e_type != ET_REL)
                  {
-                   sym->st_value = dwfl_adjusted_st_value (m, sym->st_value);
+                   sym->st_value = dwfl_adjusted_st_value (m, m->symfile->elf,
+                                                           sym->st_value);
                    return DWFL_E_NOERROR;
                  }
 
@@ -457,7 +456,10 @@ relocate_section (Dwfl_Module *mod, Elf *relocated, const GElf_Ehdr *ehdr,
       }
   }
 
-  size_t nrels = shdr->sh_size / shdr->sh_entsize;
+  size_t sh_entsize
+    = gelf_fsize (relocated, shdr->sh_type == SHT_REL ? ELF_T_REL : ELF_T_RELA,
+                 1, EV_CURRENT);
+  size_t nrels = shdr->sh_size / sh_entsize;
   size_t complete = 0;
   if (shdr->sh_type == SHT_REL)
     for (size_t relidx = 0; !result && relidx < nrels; ++relidx)
@@ -559,7 +561,7 @@ relocate_section (Dwfl_Module *mod, Elf *relocated, const GElf_Ehdr *ehdr,
          nrels = next;
        }
 
-      shdr->sh_size = reldata->d_size = nrels * shdr->sh_entsize;
+      shdr->sh_size = reldata->d_size = nrels * sh_entsize;
       gelf_update_shdr (scn, shdr);
     }
 
index 496b4fd..9276917 100644 (file)
@@ -1,5 +1,5 @@
 /* Manage address space lookup table for libdwfl.
-   Copyright (C) 2008, 2009, 2010 Red Hat, Inc.
+   Copyright (C) 2008, 2009, 2010, 2013 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
 
 #include "libdwflP.h"
 
-static GElf_Addr
-segment_start (Dwfl *dwfl, GElf_Addr start)
+GElf_Addr
+internal_function
+__libdwfl_segment_start (Dwfl *dwfl, GElf_Addr start)
 {
   if (dwfl->segment_align > 1)
     start &= -dwfl->segment_align;
   return start;
 }
 
-static GElf_Addr
-segment_end (Dwfl *dwfl, GElf_Addr end)
+GElf_Addr
+internal_function
+__libdwfl_segment_end (Dwfl *dwfl, GElf_Addr end)
 {
   if (dwfl->segment_align > 1)
     end = (end + dwfl->segment_align - 1) & -dwfl->segment_align;
@@ -156,8 +158,8 @@ reify_segments (Dwfl *dwfl)
   for (Dwfl_Module *mod = dwfl->modulelist; mod != NULL; mod = mod->next)
     if (! mod->gc)
       {
-       const GElf_Addr start = segment_start (dwfl, mod->low_addr);
-       const GElf_Addr end = segment_end (dwfl, mod->high_addr);
+       const GElf_Addr start = __libdwfl_segment_start (dwfl, mod->low_addr);
+       const GElf_Addr end = __libdwfl_segment_end (dwfl, mod->high_addr);
        bool resized = false;
 
        int idx = lookup (dwfl, start, hint);
@@ -296,8 +298,9 @@ dwfl_report_segment (Dwfl *dwfl, int ndx, const GElf_Phdr *phdr, GElf_Addr bias,
       dwfl->lookup_module = NULL;
     }
 
-  GElf_Addr start = segment_start (dwfl, bias + phdr->p_vaddr);
-  GElf_Addr end = segment_end (dwfl, bias + phdr->p_vaddr + phdr->p_memsz);
+  GElf_Addr start = __libdwfl_segment_start (dwfl, bias + phdr->p_vaddr);
+  GElf_Addr end = __libdwfl_segment_end (dwfl,
+                                        bias + phdr->p_vaddr + phdr->p_memsz);
 
   /* Coalesce into the last one if contiguous and matching.  */
   if (ndx != dwfl->lookup_tail_ndx
index af819a2..5ec7101 100644 (file)
@@ -1,3 +1,99 @@
+2014-06-17  Mark Wielaard  <mjw@redhat.com>
+
+       * eblinitreg.c (ebl_func_addr_mask): New function.
+       * libebl.h (ebl_func_addr_mask): Define.
+       * libeblP.h (struct ebl): Add func_addr_mask.
+
+2014-05-19  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (gen_SOURCES): Add eblcheckreloctargettype.c.
+       * eblcheckreloctargettype.c: New file.
+       * ebl-hooks.h (check_reloc_target_type): New hook.
+       * eblopenbackend.c (default_check_reloc_target_type): New function.
+       (fill_defaults): Assign default_check_reloc_target_type to
+       check_reloc_target_type.
+       * libebl.h (ebl_check_reloc_target_type): New function definition.
+
+2013-12-18  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (gen_SOURCES): Add eblresolvesym.c.
+       * ebl-hooks.h (resolve_sym_value): New entry.
+       * eblresolvesym.c: New file.
+       * libebl.h (ebl_resolve_sym_value): New definition.
+       * libeblP.h (fd_addr): New field.
+       (fd_data): Likewise.
+
+2013-12-18  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       unwinder: s390 and s390x
+       * Makefile.am (gen_SOURCES): Add eblnormalizepc.c and eblunwind.c.
+       * ebl-hooks.h (normalize_pc, unwind): New.
+       * eblnormalizepc.c: New file.
+       * eblunwind.c: New file.
+       * libebl.h (Ebl_Register_Location): Add field pc_register.
+       (ebl_normalize_pc): New declaration.
+       (ebl_tid_registers_get_t, ebl_pid_memory_read_t): New definitions.
+       (ebl_unwind): New declaration.
+
+2013-12-15  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       unwinder: ppc and ppc64
+       * Makefile.am (gen_SOURCES): Add ebldwarftoregno.c.
+       * ebl-hooks.h (dwarf_to_regno): New.
+       * ebldwarftoregno.c: New file.
+       * libebl.h (Ebl_Core_Item): New field pc_register.
+       (ebl_tid_registers_t): Add FIRSTREG -1 to the comment.
+       (ebl_dwarf_to_regno): New.
+
+2013-11-25  Petr Machata  <pmachata@redhat.com>
+
+       * eblopenbackend.c (machines): Add entry for AArch64.
+
+2013-11-14  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Code cleanup: Remove const in prototype
+       * libebl.h (ebl_tid_registers_t): Remove const from firstreg.
+
+2013-11-07  Jan Kratochvil  <jan.kratochvil@redhat.com>
+           Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (gen_SOURCES): Add eblinitreg.c.
+       * ebl-hooks.h (set_initial_registers_tid): New entry.
+       * eblinitreg.c: New file.
+       * libebl.h (ebl_tid_registers_t): New definition.
+       (ebl_set_initial_registers_tid, ebl_frame_nregs): New declarations.
+       * libeblP.h (struct ebl): New entry frame_nregs.
+
+2013-10-06  Mark Wielaard  <mjw@redhat.com>
+
+       * libebl.h (ebl_abi_cfi): Document restrictions using register
+       rules.
+
+2013-09-26  Petr Machata  <pmachata@redhat.com>
+
+       * eblcorenotetypename.c: Handle NT_ARM_TLS, NT_ARM_HW_BREAK,
+       NT_ARM_HW_WATCH, NT_SIGINFO, NT_FILE.
+
+2013-09-25  Mark Wielaard  <mjw@redhat.com>
+
+       * eblsectionstripp.c (ebl_section_strip_p): Check shdr_l is not NULL.
+
+2013-04-24  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: Use AM_CPPFLAGS instead of INCLUDES.
+
+2012-10-12  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * ebl-hooks.h (abi_cfi): Extend its comment for return value.
+       * eblopenbackend.c (default_abi_cfi): Return -1.
+       * libebl.h (ebl_abi_cfi): Extend its comment for return value.
+
+2012-08-30  Petr Machata  <pmachata@redhat.com>
+
+       * eblcorenotetypename.c: Handle PPC_VSX, X86_XSTATE,
+       S390_HIGH_GPRS, S390_TIMER, S390_TODCMP, S390_TODPREG, S390_CTRS,
+       S390_PREFIX, S390_LAST_BREAK, S390_SYSTEM_CALL, and ARM_VFP.
+
 2012-08-22  Jeff Kenton  <jkenton@tilera.com>
 
        * eblopenbackend.c (machines): Add tilegx.
index 65e6b5b..ec4477b 100644 (file)
@@ -1,6 +1,6 @@
 ## Process this file with automake to create Makefile.in
 ##
-## Copyright (C) 2000-2010 Red Hat, Inc.
+## Copyright (C) 2000-2010, 2013 Red Hat, Inc.
 ## This file is part of elfutils.
 ##
 ## This file is free software; you can redistribute it and/or modify
@@ -29,7 +29,7 @@
 ##
 include $(top_srcdir)/config/eu.am
 AM_CFLAGS += -fpic
-INCLUDES += -I$(srcdir)/../libelf -I$(srcdir)/../libdw -I$(srcdir)/../libasm
+AM_CPPFLAGS += -I$(srcdir)/../libelf -I$(srcdir)/../libdw -I$(srcdir)/../libasm
 VERSION = 1
 LIBEBL_SUBDIR = @LIBEBL_SUBDIR@
 
@@ -54,7 +54,8 @@ gen_SOURCES = eblopenbackend.c eblclosebackend.c eblstrtab.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
+             eblstother.c eblinitreg.c ebldwarftoregno.c eblnormalizepc.c \
+             eblunwind.c eblresolvesym.c eblcheckreloctargettype.c
 
 libebl_a_SOURCES = $(gen_SOURCES)
 
index c4e9754..9340618 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -35,13 +79,13 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(noinst_HEADERS) $(pkginclude_HEADERS) \
-       $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-       $(top_srcdir)/config/eu.am ChangeLog
-@MUDFLAP_TRUE@am__append_1 = -fmudflap
+DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \
+       $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \
+       $(noinst_HEADERS) $(pkginclude_HEADERS) ChangeLog
 subdir = libebl
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
        $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/zip.m4 \
        $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
@@ -79,8 +123,11 @@ am__uninstall_files_from_dir = { \
   }
 am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"
 LIBRARIES = $(lib_LIBRARIES)
-AR = ar
 ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
 libebl_a_AR = $(AR) $(ARFLAGS)
 libebl_a_LIBADD =
 am__objects_1 = eblopenbackend.$(OBJEXT) eblclosebackend.$(OBJEXT) \
@@ -106,32 +153,81 @@ am__objects_1 = eblopenbackend.$(OBJEXT) eblclosebackend.$(OBJEXT) \
        eblsysvhashentrysize.$(OBJEXT) eblauxvinfo.$(OBJEXT) \
        eblcheckobjattr.$(OBJEXT) ebl_check_special_section.$(OBJEXT) \
        ebl_syscall_abi.$(OBJEXT) eblabicfi.$(OBJEXT) \
-       eblstother.$(OBJEXT)
+       eblstother.$(OBJEXT) eblinitreg.$(OBJEXT) \
+       ebldwarftoregno.$(OBJEXT) eblnormalizepc.$(OBJEXT) \
+       eblunwind.$(OBJEXT) eblresolvesym.$(OBJEXT) \
+       eblcheckreloctargettype.$(OBJEXT)
 am_libebl_a_OBJECTS = $(am__objects_1)
 libebl_a_OBJECTS = $(am_libebl_a_OBJECTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/config/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
 SOURCES = $(libebl_a_SOURCES)
 DIST_SOURCES = $(libebl_a_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 HEADERS = $(noinst_HEADERS) $(pkginclude_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
+CC_BIARCH = @CC_BIARCH@
 CFLAGS = @CFLAGS@
+CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEBUGPRED = @DEBUGPRED@
@@ -140,10 +236,13 @@ DEPDIR = @DEPDIR@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_VALGRIND = @HAVE_VALGRIND@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -164,6 +263,7 @@ MODVERSION = @MODVERSION@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
+NM = @NM@
 OBJEXT = @OBJEXT@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -174,6 +274,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+READELF = @READELF@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
@@ -188,6 +289,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -237,21 +339,15 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 zip_LIBS = @zip_LIBS@
-INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \
+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \
        -I$(srcdir)/../libelf -I$(srcdir)/../libdw \
        -I$(srcdir)/../libasm
-AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \
+AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 $(if \
        $($(*F)_no_Werror),,-Werror) $(if \
-       $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \
-       $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \
-       $(am__append_1) -fpic
-@MUDFLAP_FALSE@libmudflap = 
-@MUDFLAP_TRUE@libmudflap = -lmudflap
-COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\
-                         $(COMPILE))
-
+       $($(*F)_no_Wunused),,-Wunused -Wextra) $($(*F)_CFLAGS) -fpic
+COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE))
 CLEANFILES = *.gcno *.gcda $(am_libebl_pic_a_OBJECTS)
-textrel_check = if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
+textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
 lib_LIBRARIES = libebl.a
 pkginclude_HEADERS = libebl.h
 gen_SOURCES = eblopenbackend.c eblclosebackend.c eblstrtab.c \
@@ -271,7 +367,8 @@ gen_SOURCES = eblopenbackend.c eblclosebackend.c eblstrtab.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
+             eblstother.c eblinitreg.c ebldwarftoregno.c eblnormalizepc.c \
+             eblunwind.c eblresolvesym.c eblcheckreloctargettype.c
 
 libebl_a_SOURCES = $(gen_SOURCES)
 noinst_HEADERS = libeblP.h ebl-hooks.h
@@ -312,7 +409,6 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 install-libLIBRARIES: $(lib_LIBRARIES)
        @$(NORMAL_INSTALL)
-       test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
        @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \
        list2=; for p in $$list; do \
          if test -f $$p; then \
@@ -320,6 +416,8 @@ install-libLIBRARIES: $(lib_LIBRARIES)
          else :; fi; \
        done; \
        test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
          echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \
          $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; }
        @$(POST_INSTALL)
@@ -340,10 +438,11 @@ uninstall-libLIBRARIES:
 
 clean-libLIBRARIES:
        -test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES)
+
 libebl.a: $(libebl_a_OBJECTS) $(libebl_a_DEPENDENCIES) $(EXTRA_libebl_a_DEPENDENCIES) 
-       -rm -f libebl.a
-       $(libebl_a_AR) libebl.a $(libebl_a_OBJECTS) $(libebl_a_LIBADD)
-       $(RANLIB) libebl.a
+       $(AM_V_at)-rm -f libebl.a
+       $(AM_V_AR)$(libebl_a_AR) libebl.a $(libebl_a_OBJECTS) $(libebl_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libebl.a
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -359,11 +458,13 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblbackendname.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblbsspltp.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblcheckobjattr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblcheckreloctargettype.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblclosebackend.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblcopyrelocp.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblcorenote.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblcorenotetypename.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ebldebugscnp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ebldwarftoregno.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ebldynamictagcheck.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ebldynamictagname.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblelfclass.Po@am__quote@
@@ -371,10 +472,12 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblelfmachine.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblgotpcreloccheck.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblgstrtab.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblinitreg.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblmachineflagcheck.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblmachineflagname.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblmachinesectionflagcheck.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblnonerelocp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblnormalizepc.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblobjecttypename.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblobjnote.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblobjnotetypename.Po@am__quote@
@@ -386,6 +489,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblreloctypecheck.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblreloctypename.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblrelocvaliduse.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblresolvesym.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblretval.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblsectionname.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblsectionstripp.Po@am__quote@
@@ -397,25 +501,29 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblsymbolbindingname.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblsymboltypename.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblsysvhashentrysize.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblunwind.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eblwstrtab.Po@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
 
 .c.obj:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
 install-pkgincludeHEADERS: $(pkginclude_HEADERS)
        @$(NORMAL_INSTALL)
-       test -z "$(pkgincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)"
        @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -431,26 +539,15 @@ uninstall-pkgincludeHEADERS:
        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
        dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
 
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -462,15 +559,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -479,6 +572,21 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -622,18 +730,19 @@ uninstall-am: uninstall-libLIBRARIES uninstall-pkgincludeHEADERS
 
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-       clean-libLIBRARIES ctags distclean distclean-compile \
-       distclean-generic distclean-tags distdir dvi dvi-am html \
-       html-am info info-am install install-am install-data \
-       install-data-am install-dvi install-dvi-am install-exec \
-       install-exec-am install-html install-html-am install-info \
-       install-info-am install-libLIBRARIES install-man install-pdf \
-       install-pdf-am install-pkgincludeHEADERS install-ps \
-       install-ps-am install-strip installcheck installcheck-am \
-       installdirs maintainer-clean maintainer-clean-generic \
-       mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
-       ps ps-am tags uninstall uninstall-am uninstall-libLIBRARIES \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+       clean-libLIBRARIES cscopelist-am ctags ctags-am distclean \
+       distclean-compile distclean-generic distclean-tags distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
+       install-info install-info-am install-libLIBRARIES install-man \
+       install-pdf install-pdf-am install-pkgincludeHEADERS \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
+       uninstall-am uninstall-libLIBRARIES \
        uninstall-pkgincludeHEADERS
 
 
index f629bce..e1186f8 100644 (file)
@@ -1,5 +1,5 @@
 /* Backend hook signatures internal interface for libebl.
-   Copyright (C) 2000-2011 Red Hat, Inc.
+   Copyright (C) 2000-2011, 2013, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -105,6 +105,9 @@ bool EBLHOOK(object_note) (const char *, uint32_t, uint32_t, const char *);
 bool EBLHOOK(check_object_attribute) (Ebl *, const char *, int, uint64_t,
                                      const char **, const char **);
 
+/* Check reloc target section type.  */
+bool EBLHOOK(check_reloc_target_type) (Ebl *, Elf64_Word);
+
 /* Describe auxv element type.  */
 int EBLHOOK(auxv_info) (GElf_Xword, const char **, const char **);
 
@@ -151,8 +154,42 @@ int EBLHOOK(disasm) (const uint8_t **startp, const uint8_t *end,
                     GElf_Addr addr, const char *fmt, DisasmOutputCB_t outcb,
                     DisasmGetSymCB_t symcb, void *outcbarg, void *symcbarg);
 
-/* Supply the machine-specific state of CFI before CIE initial programs.  */
+/* Supply the machine-specific state of CFI before CIE initial programs.
+   Function returns 0 on success and -1 on error.  */
 int EBLHOOK(abi_cfi) (Ebl *ebl, Dwarf_CIE *abi_info);
 
+/* Fetch process data from live TID and call SETFUNC one or more times.
+   Method should be present only when EBL_FRAME_NREGS > 0, otherwise the
+   backend doesn't support unwinding.  */
+bool EBLHOOK(set_initial_registers_tid) (pid_t tid,
+                                        ebl_tid_registers_t *setfunc,
+                                        void *arg);
+
+/* Convert *REGNO as is in DWARF to a lower range suitable for
+   Dwarf_Frame->REGS indexing.  */
+bool EBLHOOK(dwarf_to_regno) (Ebl *ebl, unsigned *regno);
+
+/* Optionally modify *PC as fetched from inferior data into valid PC
+   instruction pointer.  */
+void EBLHOOK(normalize_pc) (Ebl *ebl, Dwarf_Addr *pc);
+
+/* Get previous frame state for an existing frame state.  Method is called only
+   if unwinder could not find CFI for current PC.  PC is for the
+   existing frame.  SETFUNC sets register in the previous frame.  GETFUNC gets
+   register from the existing frame.  Note that GETFUNC vs. SETFUNC act on
+   a disjunct set of registers.  READFUNC reads memory.  ARG has to be passed
+   for SETFUNC, GETFUNC and READFUNC.  *SIGNAL_FRAMEP is initialized to false,
+   it can be set to true if existing frame is a signal frame.  SIGNAL_FRAMEP is
+   never NULL.  */
+bool EBLHOOK(unwind) (Ebl *ebl, Dwarf_Addr pc, ebl_tid_registers_t *setfunc,
+                     ebl_tid_registers_get_t *getfunc,
+                     ebl_pid_memory_read_t *readfunc, void *arg,
+                     bool *signal_framep);
+
+/* Returns true if the value can be resolved to an address in an
+   allocated section, which will be returned in *ADDR.
+   (e.g. function descriptor resolving)  */
+bool EBLHOOK(resolve_sym_value) (Ebl *ebl, GElf_Addr *addr);
+
 /* Destructor for ELF backend handle.  */
 void EBLHOOK(destr) (struct ebl *);
diff --git a/libebl/eblcheckreloctargettype.c b/libebl/eblcheckreloctargettype.c
new file mode 100644 (file)
index 0000000..e135f8a
--- /dev/null
@@ -0,0 +1,46 @@
+/* Check whether a section type is a valid target for relocation.
+   Copyright (C) 2014 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 <libeblP.h>
+
+
+bool
+ebl_check_reloc_target_type (Ebl *ebl, Elf64_Word sh_type)
+{
+  if (ebl->check_reloc_target_type (ebl, sh_type))
+    return true;
+
+  if (sh_type == SHT_PROGBITS || sh_type == SHT_NOBITS)
+    return true;
+
+  return false;
+}
index c4c0c9c..b6db6cd 100644 (file)
@@ -1,5 +1,5 @@
 /* Return note type name.
-   Copyright (C) 2002, 2007, 2008 Red Hat, Inc.
+   Copyright (C) 2002, 2007, 2008, 2012, 2013 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -78,8 +78,24 @@ ebl_core_note_type_name (ebl, type, buf, len)
            KNOWNSTYPE (PRXFPREG);
            KNOWNSTYPE (PPC_VMX);
            KNOWNSTYPE (PPC_SPE);
+           KNOWNSTYPE (PPC_VSX);
            KNOWNSTYPE (386_TLS);
            KNOWNSTYPE (386_IOPERM);
+           KNOWNSTYPE (X86_XSTATE);
+           KNOWNSTYPE (S390_HIGH_GPRS);
+           KNOWNSTYPE (S390_TIMER);
+           KNOWNSTYPE (S390_TODCMP);
+           KNOWNSTYPE (S390_TODPREG);
+           KNOWNSTYPE (S390_CTRS);
+           KNOWNSTYPE (S390_PREFIX);
+           KNOWNSTYPE (S390_LAST_BREAK);
+           KNOWNSTYPE (S390_SYSTEM_CALL);
+           KNOWNSTYPE (ARM_VFP);
+           KNOWNSTYPE (ARM_TLS);
+           KNOWNSTYPE (ARM_HW_BREAK);
+           KNOWNSTYPE (ARM_HW_WATCH);
+           KNOWNSTYPE (SIGINFO);
+           KNOWNSTYPE (FILE);
 #undef KNOWNSTYPE
 
          default:
diff --git a/libebl/ebldwarftoregno.c b/libebl/ebldwarftoregno.c
new file mode 100644 (file)
index 0000000..8fb8540
--- /dev/null
@@ -0,0 +1,41 @@
+/* Convert *REGNO as is in DWARF to a lower range.
+   Copyright (C) 2013 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 <libeblP.h>
+
+bool
+ebl_dwarf_to_regno (Ebl *ebl, unsigned *regno)
+{
+  if (ebl == NULL)
+    return false;
+  return ebl->dwarf_to_regno == NULL ? true : ebl->dwarf_to_regno (ebl, regno);
+}
diff --git a/libebl/eblinitreg.c b/libebl/eblinitreg.c
new file mode 100644 (file)
index 0000000..5729b3c
--- /dev/null
@@ -0,0 +1,58 @@
+/* Fetch live process Dwfl_Frame from PID.
+   Copyright (C) 2013, 2014 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 <libeblP.h>
+#include <assert.h>
+
+bool
+ebl_set_initial_registers_tid (Ebl *ebl, pid_t tid,
+                              ebl_tid_registers_t *setfunc,
+                              void *arg)
+{
+  /* Otherwise caller could not allocate THREAD frame of proper size.
+     If set_initial_registers_tid is unsupported then FRAME_NREGS is zero.  */
+  assert (ebl->set_initial_registers_tid != NULL);
+  return ebl->set_initial_registers_tid (tid, setfunc, arg);
+}
+
+size_t
+ebl_frame_nregs (Ebl *ebl)
+{
+  return ebl == NULL ? 0 : ebl->frame_nregs;
+}
+
+GElf_Addr
+ebl_func_addr_mask (Ebl *ebl)
+{
+  return ((ebl == NULL || ebl->func_addr_mask == 0)
+         ? ~(GElf_Addr)0 : ebl->func_addr_mask);
+}
diff --git a/libebl/eblnormalizepc.c b/libebl/eblnormalizepc.c
new file mode 100644 (file)
index 0000000..a5fea77
--- /dev/null
@@ -0,0 +1,40 @@
+/* Modify PC as fetched from inferior data into valid PC.
+   Copyright (C) 2013 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 <libeblP.h>
+
+void
+ebl_normalize_pc (Ebl *ebl, Dwarf_Addr *pc)
+{
+  if (ebl != NULL && ebl->normalize_pc != NULL)
+    ebl->normalize_pc (ebl, pc);
+}
index 89e5da5..bd94759 100644 (file)
@@ -1,5 +1,5 @@
 /* Generate ELF backend handle.
-   Copyright (C) 2000-2011 Red Hat, Inc.
+   Copyright (C) 2000-2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -131,6 +131,7 @@ static const struct
   { "openrisc", "elf_openrisc", "openrisc", 8, EM_OPENRISC, 0, 0 },
   { "arc", "elf_arc_a5", "arc_a5", 6, EM_ARC_A5, 0, 0 },
   { "xtensa", "elf_xtensa", "xtensa", 6, EM_XTENSA, 0, 0 },
+  { "aarch64", "elf_aarch64", "aarch64", 7, EM_AARCH64, ELFCLASS64, 0 },
 };
 #define nmachines (sizeof (machines) / sizeof (machines[0]))
 
@@ -199,6 +200,7 @@ static bool default_check_object_attribute (Ebl *ebl, const char *vendor,
                                            int tag, uint64_t value,
                                            const char **tag_name,
                                            const char **value_name);
+static bool default_check_reloc_target_type (Ebl *ebl, Elf64_Word sh_type);
 static int default_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info);
 
 
@@ -240,6 +242,7 @@ fill_defaults (Ebl *result)
   result->register_info = default_register_info;
   result->syscall_abi = default_syscall_abi;
   result->check_object_attribute = default_check_object_attribute;
+  result->check_reloc_target_type = default_check_reloc_target_type;
   result->disasm = NULL;
   result->abi_cfi = default_abi_cfi;
   result->destr = default_destr;
@@ -746,9 +749,16 @@ default_check_object_attribute (Ebl *ebl __attribute__ ((unused)),
   return false;
 }
 
+static bool
+default_check_reloc_target_type (Ebl *ebl __attribute__ ((unused)),
+                                Elf64_Word sh_type __attribute__ ((unused)))
+{
+  return false;
+}
+
 static int
 default_abi_cfi (Ebl *ebl __attribute__ ((unused)),
                 Dwarf_CIE *abi_info __attribute__ ((unused)))
 {
-  return 0;
+  return -1;
 }
diff --git a/libebl/eblresolvesym.c b/libebl/eblresolvesym.c
new file mode 100644 (file)
index 0000000..470f6f0
--- /dev/null
@@ -0,0 +1,43 @@
+/* Resolve a symbol value to an allocated section of the Elf file.
+   Copyright (C) 2013 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 <libeblP.h>
+#include <assert.h>
+
+bool
+ebl_resolve_sym_value (Ebl *ebl, GElf_Addr *addr)
+{
+  if (ebl == NULL || ebl->resolve_sym_value == NULL)
+    return false;
+
+  return ebl->resolve_sym_value (ebl, addr);
+}
index 9497068..c6cda63 100644 (file)
@@ -1,5 +1,5 @@
 /* Check whether section can be stripped.
-   Copyright (C) 2005 Red Hat, Inc.
+   Copyright (C) 2005, 2013 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -51,7 +51,7 @@ ebl_section_strip_p (Ebl *ebl, const GElf_Ehdr *ehdr, const GElf_Shdr *shdr,
          Elf_Scn *scn_l = elf_getscn (ebl->elf, (shdr)->sh_info);
          GElf_Shdr shdr_mem_l;
          GElf_Shdr *shdr_l = gelf_getshdr (scn_l, &shdr_mem_l);
-         if (shdr_l == NULL)
+         if (shdr_l != NULL)
            {
              const char *s_l = elf_strptr (ebl->elf, ehdr->e_shstrndx,
                                            shdr_l->sh_name);
diff --git a/libebl/eblunwind.c b/libebl/eblunwind.c
new file mode 100644 (file)
index 0000000..1251c1b
--- /dev/null
@@ -0,0 +1,43 @@
+/* Get previous frame state for an existing frame state.
+   Copyright (C) 2013 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 <libeblP.h>
+
+bool
+ebl_unwind (Ebl *ebl, Dwarf_Addr pc, ebl_tid_registers_t *setfunc,
+           ebl_tid_registers_get_t *getfunc, ebl_pid_memory_read_t *readfunc,
+           void *arg, bool *signal_framep)
+{
+  if (ebl == NULL || ebl->unwind == NULL)
+    return false;
+  return ebl->unwind (ebl, pc, setfunc, getfunc, readfunc, arg, signal_framep);
+}
index 0d5621d..bb993bf 100644 (file)
@@ -1,5 +1,5 @@
 /* Interface for libebl.
-   Copyright (C) 2000-2010 Red Hat, Inc.
+   Copyright (C) 2000-2010, 2013, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -179,6 +179,9 @@ extern bool ebl_check_object_attribute (Ebl *ebl, const char *vendor,
                                        const char **tag_name,
                                        const char **value_name);
 
+/* Check whether a section type is a valid reloc target.  */
+extern bool ebl_check_reloc_target_type (Ebl *ebl, Elf64_Word sh_type);
+
 
 /* Check section name for being that of a debug informatino section.  */
 extern bool ebl_debugscn_p (Ebl *ebl, const char *name);
@@ -257,6 +260,11 @@ extern int ebl_syscall_abi (Ebl *ebl, int *sp, int *pc,
    before each CIE's initial instructions.  It should set the
    data_alignment_factor member if it affects the initial instructions.
 
+   The callback should not use the register rules DW_CFA_expression or
+   DW_CFA_val_expression.  Defining the CFA using DW_CFA_def_cfa_expression
+   is allowed.  This is an implementation detail since register rules
+   store expressions as offsets from the .eh_frame or .debug_frame data.
+
    As a shorthand for some common cases, for this instruction stream
    we overload some CFI instructions that cannot be used in a CIE:
 
@@ -267,7 +275,10 @@ extern int ebl_syscall_abi (Ebl *ebl, int *sp, int *pc,
    DWARF register number that identifies the actual PC in machine state.
    If there is no canonical DWARF register number with that meaning, it's
    left unchanged (callers usually initialize with (Dwarf_Word) -1).
-   This value is not used by CFI per se.  */
+   This value is not used by CFI per se.
+
+   Function returns 0 on success and -1 for error or unsupported by the
+   backend.  */
 extern int ebl_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info)
   __nonnull_attribute__ (2);
 
@@ -348,6 +359,7 @@ typedef struct
   uint8_t bits;                        /* Bits of data for one register.  */
   uint8_t pad;                 /* Bytes of padding after register's data.  */
   Dwarf_Half count;            /* Consecutive register numbers here.  */
+  bool pc_register;
 } Ebl_Register_Location;
 
 /* Non-register data items in core notes.  */
@@ -360,6 +372,7 @@ typedef struct
   Elf_Type type;
   char format;
   bool thread_identifier;
+  bool pc_register;
 } Ebl_Core_Item;
 
 /* Describe the format of a core file note with the given header and NAME.
@@ -375,6 +388,76 @@ extern int ebl_auxv_info (Ebl *ebl, GElf_Xword a_type,
                          const char **name, const char **format)
   __nonnull_attribute__ (1, 3, 4);
 
+/* Callback type for ebl_set_initial_registers_tid.
+   Register -1 is mapped to PC (if arch PC has no DWARF number).
+   If FIRSTREG is -1 then NREGS has to be 1.  */
+typedef bool (ebl_tid_registers_t) (int firstreg, unsigned nregs,
+                                   const Dwarf_Word *regs, void *arg)
+  __nonnull_attribute__ (3);
+
+/* Callback to fetch process data from live TID.
+   EBL architecture has to have EBL_FRAME_NREGS > 0, otherwise the
+   backend doesn't support unwinding and this function call may crash.  */
+extern bool ebl_set_initial_registers_tid (Ebl *ebl,
+                                          pid_t tid,
+                                          ebl_tid_registers_t *setfunc,
+                                          void *arg)
+  __nonnull_attribute__ (1, 3);
+
+/* Number of registers to allocate for ebl_set_initial_registers_tid.
+   EBL architecture can unwind iff EBL_FRAME_NREGS > 0.  */
+extern size_t ebl_frame_nregs (Ebl *ebl)
+  __nonnull_attribute__ (1);
+
+/* Mask to use for function symbol or unwind return addresses in case
+   the architecture adds some extra non-address bits to it.  This is
+   different from ebl_resolve_sym_value which only works for actual
+   symbol addresses (in non-ET_REL files) that might resolve to an
+   address in a different section.  ebl_func_addr_mask is called to
+   turn a given function value into the a real address or offset (the
+   original value might not be a real address).  This works for all
+   cases where an actual function address (or offset in ET_REL symbol
+   tables) is needed.  */
+extern GElf_Addr ebl_func_addr_mask (Ebl *ebl);
+
+/* Convert *REGNO as is in DWARF to a lower range suitable for
+   Dwarf_Frame->REGS indexing.  */
+extern bool ebl_dwarf_to_regno (Ebl *ebl, unsigned *regno)
+  __nonnull_attribute__ (1, 2);
+
+/* Modify PC as fetched from inferior data into valid PC.  */
+extern void ebl_normalize_pc (Ebl *ebl, Dwarf_Addr *pc)
+  __nonnull_attribute__ (1, 2);
+
+/* Callback type for ebl_unwind's parameter getfunc.  */
+typedef bool (ebl_tid_registers_get_t) (int firstreg, unsigned nregs,
+                                       Dwarf_Word *regs, void *arg)
+  __nonnull_attribute__ (3);
+
+/* Callback type for ebl_unwind's parameter readfunc.  */
+typedef bool (ebl_pid_memory_read_t) (Dwarf_Addr addr, Dwarf_Word *data,
+                                     void *arg)
+  __nonnull_attribute__ (3);
+
+/* Get previous frame state for an existing frame state.  Method is called only
+   if unwinder could not find CFI for current PC.  PC is for the
+   existing frame.  SETFUNC sets register in the previous frame.  GETFUNC gets
+   register from the existing frame.  Note that GETFUNC vs. SETFUNC act on
+   a disjunct set of registers.  READFUNC reads memory.  ARG has to be passed
+   for SETFUNC, GETFUNC and READFUNC.  *SIGNAL_FRAMEP is initialized to false,
+   it can be set to true if existing frame is a signal frame.  SIGNAL_FRAMEP is
+   never NULL.  */
+extern bool ebl_unwind (Ebl *ebl, Dwarf_Addr pc, ebl_tid_registers_t *setfunc,
+                       ebl_tid_registers_get_t *getfunc,
+                       ebl_pid_memory_read_t *readfunc, void *arg,
+                       bool *signal_framep)
+  __nonnull_attribute__ (1, 3, 4, 5, 7);
+
+/* Returns true if the value can be resolved to an address in an
+   allocated section, which will be returned in *ADDR
+   (e.g. function descriptor resolving)  */
+extern bool ebl_resolve_sym_value (Ebl *ebl, GElf_Addr *addr)
+   __nonnull_attribute__ (2);
 
 #ifdef __cplusplus
 }
index 5ec26a4..dbd67f3 100644 (file)
@@ -1,5 +1,5 @@
 /* Internal definitions for interface for libebl.
-   Copyright (C) 2000-2009 Red Hat, Inc.
+   Copyright (C) 2000-2009, 2013, 2014 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
@@ -60,6 +60,21 @@ struct ebl
   /* Size of entry in Sysv-style hash table.  */
   int sysvhash_entrysize;
 
+  /* Number of registers to allocate for ebl_set_initial_registers_tid.
+     Ebl architecture can unwind iff FRAME_NREGS > 0.  */
+  size_t frame_nregs;
+
+  /* Mask to use to turn a function value into a real function address
+     in case the architecture adds some extra non-address bits to it.
+     If not initialized (0) then ebl_func_addr_mask will return ~0,
+     otherwise it should be the actual mask to use.  */
+  GElf_Addr func_addr_mask;
+
+  /* Function descriptor load address and table as used by
+     ebl_resolve_sym_value if available for this arch.  */
+  GElf_Addr fd_addr;
+  Elf_Data *fd_data;
+
   /* Internal data.  */
   void *dlhandle;
 };
index d1df31a..4bc8f56 100644 (file)
@@ -1,3 +1,108 @@
+2014-07-07  Mark Wielaard  <mjw@redhat.com>
+
+       * elf.h: Update from glibc.
+
+2014-04-13  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: Remove !MUDFLAP conditions.
+       * elf_begin.c (read_file): Don't clear use_mmap when _MUDFLAP is
+       defined.
+       * elf_update.c (write_file): Remove _MUDFLAP condition.
+
+2014-01-17  Jakub Jelinek  <jakub@redhat.com>
+           Roland McGrath  <roland@redhat.com>
+
+       * libelfP.h (INVALID_NDX): Define.
+       * gelf_getdyn.c (gelf_getdyn): Use it.  Remove ndx < 0 test if any.
+       * gelf_getlib.c (gelf_getlib): Likewise.
+       * gelf_getmove.c (gelf_getmove): Likewise.
+       * gelf_getrel.c (gelf_getrel): Likewise.
+       * gelf_getrela.c (gelf_getrela): Likewise.
+       * gelf_getsym.c (gelf_getsym): Likewise.
+       * gelf_getsyminfo.c (gelf_getsyminfo): Likewise.
+       * gelf_getsymshndx.c (gelf_getsymshndx): Likewise.
+       * gelf_getversym.c (gelf_getversym): Likewise.
+       * gelf_update_dyn.c (gelf_update_dyn): Likewise.
+       * gelf_update_lib.c (gelf_update_lib): Likewise.
+       * gelf_update_move.c (gelf_update_move): Likewise.
+       * gelf_update_rel.c (gelf_update_rel): Likewise.
+       * gelf_update_rela.c (gelf_update_rela): Likewise.
+       * gelf_update_sym.c (gelf_update_sym): Likewise.
+       * gelf_update_syminfo.c (gelf_update_syminfo): Likewise.
+       * gelf_update_symshndx.c (gelf_update_symshndx): Likewise.
+       * gelf_update_versym.c (gelf_update_versym): Likewise.
+
+2014-01-17  Jakub Jelinek  <jakub@redhat.com>
+
+       * elf32_getphdr.c (elfw2(LIBELFBITS,getphdr)): Check if program header
+       table fits into object's bounds.
+       * elf_getshdrstrndx.c (elf_getshstrndx): Add elf->start_offset to
+       elf->map_address.  Check if first section header fits into object's
+       bounds.
+       * elf32_getshdr.c (elfw2(LIBELFBITS,getshdr)):
+       Check if section header table fits into object's bounds.
+       * elf_begin.c (get_shnum): Ensure section headers fits into
+       object's bounds.
+       (file_read_elf): Make sure scncnt is small enough to allocate both
+       ElfXX_Shdr and Elf_Scn array.  Make sure section and program header
+       tables fit into object's bounds.  Avoid memory leak on failure.
+       * elf_newscn.c (elf_newscn): Check for overflow.
+       * elf32_updatefile.c (__elfw2(LIBELFBITS,updatemmap)): Likewise.
+       (__elfw2(LIBELFBITS,updatefile)): Likewise.
+       * elf32_newphdr.c (elfw2(LIBELFBITS,newphdr)): Likewise.
+       * elf_getarsym.c (elf_getarsym): Likewise.
+
+2013-11-08  Mark Wielaard  <mjw@redhat.com>
+
+       * elf32_updatefile.c (elfXX_updatemmap): Only memcpy ehdr when not
+       already directly mmapped.
+
+2013-11-05  Mark Wielaard  <mjw@redhat.com>
+
+       * elf32_updatefile.c (elfXX_updatefile): Copy all section headers
+       if elf->flags dirty.
+
+2013-11-01  Michael Forney  <mforney@mforney.org>
+
+       * Makefile.am: Use READELF.
+
+2013-10-01  Petr Machata  <pmachata@redhat.com>
+
+       * elf.h: Update from glibc.
+
+2013-06-17  Petr Machata  <pmachata@redhat.com>
+
+       * elf.h: Update from glibc.
+
+2013-08-28  Namhyung Kim  <namhyung@gmail.com>
+
+       * gelf.h (gelf_fsize): Fix typo in comment.
+
+2013-08-28  Mark Wielaard  <mjw@redhat.com>
+
+       * gelf_getauxv.c (gelf_getauxv): Add missing whitespace.
+
+2013-08-27  Mark Wielaard  <mjw@redhat.com>
+
+       * gelf_getauxv.c (gelf_getauxv): Remove unnecessary casts to char *.
+
+2013-08-25  Kurt Roeckx  <kurt@roeckx.be>
+
+       * gelf_getauxv.c (gelf_getauxv): Use memcpy instead of pointer
+       dereference to avoid alignment problems.
+
+2013-01-07  Roland McGrath  <roland@hack.frob.com>
+
+       * elf_getarsym.c (elf_getarsym): Copy FILE_DATA into stack space if it
+       would be unaligned and !ALLOW_UNALIGNED.
+
+       * elf_getarsym.c (read_number_entries): Use memcpy instead of pointer
+       dereference so as not to assume the field is naturally aligned.
+
+2012-09-17  Petr Machata  <pmachata@redhat.com>
+
+       * elf.h: Update from glibc.
+
 2012-08-16  Roland McGrath  <roland@hack.frob.com>
 
        * elf.h: Update from glibc.
index 5903ea8..493e4ec 100644 (file)
@@ -35,10 +35,8 @@ GCC_INCLUDE = -I$(shell $(CC) -print-file-name=include)
 VERSION = 1
 
 lib_LIBRARIES = libelf.a
-if !MUDFLAP
 noinst_LIBRARIES = libelf_pic.a
 noinst_PROGRAMS = $(noinst_LIBRARIES:_pic.a=.so)
-endif
 include_HEADERS = libelf.h gelf.h nlist.h
 
 pkginclude_HEADERS = elf-knowledge.h
@@ -92,7 +90,6 @@ libelf_a_SOURCES = elf_version.c elf_hash.c elf_error.c elf_fill.c \
                   elf_gnu_hash.c \
                   elf_scnshndx.c
 
-if !MUDFLAP
 libelf_pic_a_SOURCES =
 am_libelf_pic_a_OBJECTS = $(libelf_a_SOURCES:.c=.os)
 
@@ -102,11 +99,11 @@ libelf_so_LDLIBS += -lpthread
 endif
 
 libelf_so_SOURCES =
-libelf.so: libelf_pic.a libelf.map
+libelf.so$(EXEEXT): libelf_pic.a libelf.map
        $(LINK) -shared -o $@ -Wl,--whole-archive,$<,--no-whole-archive \
                -Wl,--version-script,$(srcdir)/libelf.map,--no-undefined \
                -Wl,--soname,$@.$(VERSION),-z,defs,-z,relro $(libelf_so_LDLIBS)
-       if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
+       if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
        ln -fs $@ $@.$(VERSION)
 
 install: install-am libelf.so
@@ -119,7 +116,6 @@ uninstall: uninstall-am
        rm -f $(DESTDIR)$(libdir)/libelf-$(PACKAGE_VERSION).so
        rm -f $(DESTDIR)$(libdir)/libelf.so.$(VERSION)
        rm -f $(DESTDIR)$(libdir)/libelf.so
-endif
 
 noinst_HEADERS = elf.h abstract.h common.h exttypes.h gelf_xlate.h libelfP.h \
                 version_xlate.h gnuhash_xlate.h note_xlate.h dl-hash.h
index 57c4317..8a99ae0 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -36,17 +80,17 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(include_HEADERS) $(noinst_HEADERS) \
-       $(pkginclude_HEADERS) $(srcdir)/Makefile.am \
-       $(srcdir)/Makefile.in $(top_srcdir)/config/eu.am ChangeLog
-@MUDFLAP_TRUE@am__append_1 = -fmudflap
-@BUILD_STATIC_TRUE@am__append_2 = -fpic
-@MUDFLAP_FALSE@noinst_PROGRAMS = $(am__EXEEXT_1)
-@MUDFLAP_TRUE@am_libelf_pic_a_OBJECTS =
-@MUDFLAP_FALSE@@USE_LOCKS_TRUE@am__append_3 = -lpthread
+DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \
+       $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \
+       $(include_HEADERS) $(noinst_HEADERS) $(pkginclude_HEADERS) \
+       ChangeLog
+@BUILD_STATIC_TRUE@am__append_1 = -fpic
+noinst_PROGRAMS = $(am__EXEEXT_1)
+@USE_LOCKS_TRUE@am__append_2 = -lpthread
 subdir = libelf
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
        $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/zip.m4 \
        $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
@@ -85,8 +129,11 @@ am__uninstall_files_from_dir = { \
 am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" \
        "$(DESTDIR)$(pkgincludedir)"
 LIBRARIES = $(lib_LIBRARIES) $(noinst_LIBRARIES)
-AR = ar
 ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
 libelf_a_AR = $(AR) $(ARFLAGS)
 libelf_a_LIBADD =
 am_libelf_a_OBJECTS = elf_version.$(OBJEXT) elf_hash.$(OBJEXT) \
@@ -147,36 +194,82 @@ libelf_a_OBJECTS = $(am_libelf_a_OBJECTS)
 libelf_pic_a_AR = $(AR) $(ARFLAGS)
 libelf_pic_a_LIBADD =
 libelf_pic_a_OBJECTS = $(am_libelf_pic_a_OBJECTS)
-@MUDFLAP_FALSE@am__EXEEXT_1 = libelf.so$(EXEEXT)
+am__EXEEXT_1 = libelf.so$(EXEEXT)
 PROGRAMS = $(noinst_PROGRAMS)
 am_libelf_so_OBJECTS =
 libelf_so_OBJECTS = $(am_libelf_so_OBJECTS)
 libelf_so_LDADD = $(LDADD)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/config/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
 SOURCES = $(libelf_a_SOURCES) $(libelf_pic_a_SOURCES) \
        $(libelf_so_SOURCES)
 DIST_SOURCES = $(libelf_a_SOURCES) $(libelf_pic_a_SOURCES) \
        $(libelf_so_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 HEADERS = $(include_HEADERS) $(noinst_HEADERS) $(pkginclude_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
+CC_BIARCH = @CC_BIARCH@
 CFLAGS = @CFLAGS@
+CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEBUGPRED = @DEBUGPRED@
@@ -185,10 +278,13 @@ DEPDIR = @DEPDIR@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_VALGRIND = @HAVE_VALGRIND@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -209,6 +305,7 @@ MODVERSION = @MODVERSION@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
+NM = @NM@
 OBJEXT = @OBJEXT@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -219,6 +316,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+READELF = @READELF@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
@@ -233,6 +331,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -282,23 +381,18 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 zip_LIBS = @zip_LIBS@
-INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I..
-AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \
+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I..
+AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 $(if \
        $($(*F)_no_Werror),,-Werror) $(if \
-       $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \
-       $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \
-       $(am__append_1) $(am__append_2)
-@MUDFLAP_FALSE@libmudflap = 
-@MUDFLAP_TRUE@libmudflap = -lmudflap
-COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\
-                         $(COMPILE))
-
+       $($(*F)_no_Wunused),,-Wunused -Wextra) $($(*F)_CFLAGS) \
+       $(am__append_1)
+COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE))
 CLEANFILES = *.gcno *.gcda $(am_libelf_pic_a_OBJECTS) \
        libelf.so.$(VERSION)
-textrel_check = if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
+textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
 GCC_INCLUDE = -I$(shell $(CC) -print-file-name=include)
 lib_LIBRARIES = libelf.a
-@MUDFLAP_FALSE@noinst_LIBRARIES = libelf_pic.a
+noinst_LIBRARIES = libelf_pic.a
 include_HEADERS = libelf.h gelf.h nlist.h
 pkginclude_HEADERS = elf-knowledge.h
 libelf_a_SOURCES = elf_version.c elf_hash.c elf_error.c elf_fill.c \
@@ -350,10 +444,10 @@ libelf_a_SOURCES = elf_version.c elf_hash.c elf_error.c elf_fill.c \
                   elf_gnu_hash.c \
                   elf_scnshndx.c
 
-@MUDFLAP_FALSE@libelf_pic_a_SOURCES = 
-@MUDFLAP_FALSE@am_libelf_pic_a_OBJECTS = $(libelf_a_SOURCES:.c=.os)
-@MUDFLAP_FALSE@libelf_so_LDLIBS = $(am__append_3)
-@MUDFLAP_FALSE@libelf_so_SOURCES = 
+libelf_pic_a_SOURCES = 
+am_libelf_pic_a_OBJECTS = $(libelf_a_SOURCES:.c=.os)
+libelf_so_LDLIBS = $(am__append_2)
+libelf_so_SOURCES = 
 noinst_HEADERS = elf.h abstract.h common.h exttypes.h gelf_xlate.h libelfP.h \
                 version_xlate.h gnuhash_xlate.h note_xlate.h dl-hash.h
 
@@ -395,7 +489,6 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 install-libLIBRARIES: $(lib_LIBRARIES)
        @$(NORMAL_INSTALL)
-       test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
        @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \
        list2=; for p in $$list; do \
          if test -f $$p; then \
@@ -403,6 +496,8 @@ install-libLIBRARIES: $(lib_LIBRARIES)
          else :; fi; \
        done; \
        test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
          echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \
          $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; }
        @$(POST_INSTALL)
@@ -426,20 +521,19 @@ clean-libLIBRARIES:
 
 clean-noinstLIBRARIES:
        -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
 libelf.a: $(libelf_a_OBJECTS) $(libelf_a_DEPENDENCIES) $(EXTRA_libelf_a_DEPENDENCIES) 
-       -rm -f libelf.a
-       $(libelf_a_AR) libelf.a $(libelf_a_OBJECTS) $(libelf_a_LIBADD)
-       $(RANLIB) libelf.a
+       $(AM_V_at)-rm -f libelf.a
+       $(AM_V_AR)$(libelf_a_AR) libelf.a $(libelf_a_OBJECTS) $(libelf_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libelf.a
+
 libelf_pic.a: $(libelf_pic_a_OBJECTS) $(libelf_pic_a_DEPENDENCIES) $(EXTRA_libelf_pic_a_DEPENDENCIES) 
-       -rm -f libelf_pic.a
-       $(libelf_pic_a_AR) libelf_pic.a $(libelf_pic_a_OBJECTS) $(libelf_pic_a_LIBADD)
-       $(RANLIB) libelf_pic.a
+       $(AM_V_at)-rm -f libelf_pic.a
+       $(AM_V_AR)$(libelf_pic_a_AR) libelf_pic.a $(libelf_pic_a_OBJECTS) $(libelf_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libelf_pic.a
 
 clean-noinstPROGRAMS:
        -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
-@MUDFLAP_TRUE@libelf.so$(EXEEXT): $(libelf_so_OBJECTS) $(libelf_so_DEPENDENCIES) $(EXTRA_libelf_so_DEPENDENCIES) 
-@MUDFLAP_TRUE@ @rm -f libelf.so$(EXEEXT)
-@MUDFLAP_TRUE@ $(LINK) $(libelf_so_OBJECTS) $(libelf_so_LDADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -560,22 +654,25 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nlist.Po@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
 
 .c.obj:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
 install-includeHEADERS: $(include_HEADERS)
        @$(NORMAL_INSTALL)
-       test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
        @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -592,8 +689,11 @@ uninstall-includeHEADERS:
        dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
 install-pkgincludeHEADERS: $(pkginclude_HEADERS)
        @$(NORMAL_INSTALL)
-       test -z "$(pkgincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)"
        @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -609,26 +709,15 @@ uninstall-pkgincludeHEADERS:
        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
        dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
 
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -640,15 +729,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -657,6 +742,21 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -698,10 +798,8 @@ installdirs:
        for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(pkgincludedir)"; do \
          test -z "$$dir" || $(MKDIR_P) "$$dir"; \
        done
-@MUDFLAP_TRUE@install: install-am
 install-exec: install-exec-am
 install-data: install-data-am
-@MUDFLAP_TRUE@uninstall: uninstall-am
 
 install-am: all-am
        @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
@@ -802,19 +900,20 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLIBRARIES \
 
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
        clean-libLIBRARIES clean-noinstLIBRARIES clean-noinstPROGRAMS \
-       ctags distclean distclean-compile distclean-generic \
-       distclean-tags distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-includeHEADERS install-info \
-       install-info-am install-libLIBRARIES install-man install-pdf \
-       install-pdf-am install-pkgincludeHEADERS install-ps \
-       install-ps-am install-strip installcheck installcheck-am \
-       installdirs maintainer-clean maintainer-clean-generic \
-       mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
-       ps ps-am tags uninstall uninstall-am uninstall-includeHEADERS \
+       cscopelist-am ctags ctags-am distclean distclean-compile \
+       distclean-generic distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am \
+       install-includeHEADERS install-info install-info-am \
+       install-libLIBRARIES install-man install-pdf install-pdf-am \
+       install-pkgincludeHEADERS install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+       tags tags-am uninstall uninstall-am uninstall-includeHEADERS \
        uninstall-libLIBRARIES uninstall-pkgincludeHEADERS
 
 
@@ -826,23 +925,23 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLIBRARIES \
 @AMDEP_TRUE@   else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
 @AMDEP_TRUE@   fi
 @AMDEP_FALSE@  $(COMPILE.os) -c -o $@ -fpic -DPIC -DSHARED $<
-@MUDFLAP_FALSE@libelf.so: libelf_pic.a libelf.map
-@MUDFLAP_FALSE@        $(LINK) -shared -o $@ -Wl,--whole-archive,$<,--no-whole-archive \
-@MUDFLAP_FALSE@                -Wl,--version-script,$(srcdir)/libelf.map,--no-undefined \
-@MUDFLAP_FALSE@                -Wl,--soname,$@.$(VERSION),-z,defs,-z,relro $(libelf_so_LDLIBS)
-@MUDFLAP_FALSE@        if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
-@MUDFLAP_FALSE@        ln -fs $@ $@.$(VERSION)
-
-@MUDFLAP_FALSE@install: install-am libelf.so
-@MUDFLAP_FALSE@        $(mkinstalldirs) $(DESTDIR)$(libdir)
-@MUDFLAP_FALSE@        $(INSTALL_PROGRAM) libelf.so $(DESTDIR)$(libdir)/libelf-$(PACKAGE_VERSION).so
-@MUDFLAP_FALSE@        ln -fs libelf-$(PACKAGE_VERSION).so $(DESTDIR)$(libdir)/libelf.so.$(VERSION)
-@MUDFLAP_FALSE@        ln -fs libelf.so.$(VERSION) $(DESTDIR)$(libdir)/libelf.so
-
-@MUDFLAP_FALSE@uninstall: uninstall-am
-@MUDFLAP_FALSE@        rm -f $(DESTDIR)$(libdir)/libelf-$(PACKAGE_VERSION).so
-@MUDFLAP_FALSE@        rm -f $(DESTDIR)$(libdir)/libelf.so.$(VERSION)
-@MUDFLAP_FALSE@        rm -f $(DESTDIR)$(libdir)/libelf.so
+libelf.so$(EXEEXT): libelf_pic.a libelf.map
+       $(LINK) -shared -o $@ -Wl,--whole-archive,$<,--no-whole-archive \
+               -Wl,--version-script,$(srcdir)/libelf.map,--no-undefined \
+               -Wl,--soname,$@.$(VERSION),-z,defs,-z,relro $(libelf_so_LDLIBS)
+       if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
+       ln -fs $@ $@.$(VERSION)
+
+install: install-am libelf.so
+       $(mkinstalldirs) $(DESTDIR)$(libdir)
+       $(INSTALL_PROGRAM) libelf.so $(DESTDIR)$(libdir)/libelf-$(PACKAGE_VERSION).so
+       ln -fs libelf-$(PACKAGE_VERSION).so $(DESTDIR)$(libdir)/libelf.so.$(VERSION)
+       ln -fs libelf.so.$(VERSION) $(DESTDIR)$(libdir)/libelf.so
+
+uninstall: uninstall-am
+       rm -f $(DESTDIR)$(libdir)/libelf-$(PACKAGE_VERSION).so
+       rm -f $(DESTDIR)$(libdir)/libelf.so.$(VERSION)
+       rm -f $(DESTDIR)$(libdir)/libelf.so
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
index 1e67ef5..40e87b2 100644 (file)
@@ -1,5 +1,5 @@
 /* This file defines standard ELF types, structures, and macros.
-   Copyright (C) 1995-2012 Free Software Foundation, Inc.
+   Copyright (C) 1995-2014 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -249,7 +249,9 @@ typedef struct
 #define EM_OPENRISC    92              /* OpenRISC 32-bit embedded processor */
 #define EM_ARC_A5      93              /* ARC Cores Tangent-A5 */
 #define EM_XTENSA      94              /* Tensilica Xtensa Architecture */
+#define EM_AARCH64     183             /* ARM AARCH64 */
 #define EM_TILEPRO     188             /* Tilera TILEPro */
+#define EM_MICROBLAZE  189             /* Xilinx MicroBlaze */
 #define EM_TILEGX      191             /* Tilera TILE-Gx */
 #define EM_NUM         192
 
@@ -615,6 +617,10 @@ typedef struct
 #define NT_LWPSTATUS   16              /* Contains copy of lwpstatus struct */
 #define NT_LWPSINFO    17              /* Contains copy of lwpinfo struct */
 #define NT_PRFPXREG    20              /* Contains copy of fprxregset struct */
+#define NT_SIGINFO     0x53494749      /* Contains copy of siginfo_t,
+                                          size might increase */
+#define NT_FILE                0x46494c45      /* Contains information about mapped
+                                          files */
 #define NT_PRXFPREG    0x46e62b7f      /* Contains copy of user_fxsr_struct */
 #define NT_PPC_VMX     0x100           /* PowerPC Altivec/VMX registers */
 #define NT_PPC_SPE     0x101           /* PowerPC SPE/EVR registers */
@@ -622,6 +628,19 @@ typedef struct
 #define NT_386_TLS     0x200           /* i386 TLS slots (struct user_desc) */
 #define NT_386_IOPERM  0x201           /* x86 io permission bitmap (1=deny) */
 #define NT_X86_XSTATE  0x202           /* x86 extended state using xsave */
+#define NT_S390_HIGH_GPRS      0x300   /* s390 upper register halves */
+#define NT_S390_TIMER  0x301           /* s390 timer register */
+#define NT_S390_TODCMP 0x302           /* s390 TOD clock comparator register */
+#define NT_S390_TODPREG        0x303           /* s390 TOD programmable register */
+#define NT_S390_CTRS   0x304           /* s390 control registers */
+#define NT_S390_PREFIX 0x305           /* s390 prefix register */
+#define NT_S390_LAST_BREAK     0x306   /* s390 breaking event address */
+#define NT_S390_SYSTEM_CALL    0x307   /* s390 system call restart data */
+#define NT_S390_TDB    0x308           /* s390 transaction diagnostic block */
+#define NT_ARM_VFP     0x400           /* ARM VFP/NEON registers */
+#define NT_ARM_TLS     0x401           /* ARM TLS register */
+#define NT_ARM_HW_BREAK        0x402           /* ARM hardware breakpoint registers */
+#define NT_ARM_HW_WATCH        0x403           /* ARM hardware watchpoint registers */
 
 /* Legal values for the note segment descriptor types for object files.  */
 
@@ -785,6 +804,15 @@ typedef struct
 #define DF_1_ENDFILTEE 0x00004000      /* Filtee terminates filters search. */
 #define        DF_1_DISPRELDNE 0x00008000      /* Disp reloc applied at build time. */
 #define        DF_1_DISPRELPND 0x00010000      /* Disp reloc applied at run-time.  */
+#define        DF_1_NODIRECT   0x00020000      /* Object has no-direct binding. */
+#define        DF_1_IGNMULDEF  0x00040000
+#define        DF_1_NOKSYMS    0x00080000
+#define        DF_1_NOHDR      0x00100000
+#define        DF_1_EDITED     0x00200000      /* Object is modified after built.  */
+#define        DF_1_NORELOC    0x00400000
+#define        DF_1_SYMINTPOSE 0x00800000      /* Object has individual interposers.  */
+#define        DF_1_GLOBAUDIT  0x01000000      /* Global auditing required.  */
+#define        DF_1_SINGLETON  0x02000000      /* Singleton symbols are used.  */
 
 /* Flags for the feature selection in DT_FEATURE_1.  */
 #define DTF_1_PARINIT  0x00000001
@@ -965,7 +993,7 @@ typedef struct
 
 /* Some more special a_type values describing the hardware.  */
 #define AT_PLATFORM    15              /* String identifying platform.  */
-#define AT_HWCAP       16              /* Machine dependent hints about
+#define AT_HWCAP       16              /* Machine-dependent hints about
                                           processor capabilities.  */
 
 /* This entry gives some information about the FPU initialization
@@ -987,6 +1015,9 @@ typedef struct
 
 #define AT_RANDOM      25              /* Address of 16 random bytes.  */
 
+#define AT_HWCAP2      26              /* More machine-dependent hints about
+                                          processor capabilities.  */
+
 #define AT_EXECFN      31              /* Filename of executable.  */
 
 /* Pointer to the global system page used for system calls and other
@@ -1202,7 +1233,7 @@ typedef struct
 #define R_386_TLS_DTPMOD32 35          /* ID of module containing symbol */
 #define R_386_TLS_DTPOFF32 36          /* Offset in TLS block */
 #define R_386_TLS_TPOFF32  37          /* Negated offset in static TLS block */
-/* 38? */
+#define R_386_SIZE32      38           /* 32-bit symbol size */
 #define R_386_TLS_GOTDESC  39          /* GOT offset for TLS descriptor.  */
 #define R_386_TLS_DESC_CALL 40         /* Marker of call through TLS
                                           descriptor for
@@ -1338,102 +1369,105 @@ typedef struct
 
 /* For Sparc64, legal values for d_tag of Elf64_Dyn.  */
 
-#define DT_SPARC_REGISTER 0x70000001
-#define DT_SPARC_NUM   2
+#define DT_SPARC_REGISTER      0x70000001
+#define DT_SPARC_NUM           2
 
 /* MIPS R3000 specific definitions.  */
 
 /* Legal values for e_flags field of Elf32_Ehdr.  */
 
-#define EF_MIPS_NOREORDER   1          /* A .noreorder directive was used */
-#define EF_MIPS_PIC        2           /* Contains PIC code */
-#define EF_MIPS_CPIC       4           /* Uses PIC calling sequence */
-#define EF_MIPS_XGOT       8
-#define EF_MIPS_64BIT_WHIRL 16
-#define EF_MIPS_ABI2       32
-#define EF_MIPS_ABI_ON32    64
-#define EF_MIPS_ARCH       0xf0000000  /* MIPS architecture level */
+#define EF_MIPS_NOREORDER      1     /* A .noreorder directive was used.  */
+#define EF_MIPS_PIC            2     /* Contains PIC code.  */
+#define EF_MIPS_CPIC           4     /* Uses PIC calling sequence.  */
+#define EF_MIPS_XGOT           8
+#define EF_MIPS_64BIT_WHIRL    16
+#define EF_MIPS_ABI2           32
+#define EF_MIPS_ABI_ON32       64
+#define EF_MIPS_NAN2008        1024  /* Uses IEEE 754-2008 NaN encoding.  */
+#define EF_MIPS_ARCH           0xf0000000 /* MIPS architecture level.  */
 
 /* Legal values for MIPS architecture level.  */
 
-#define EF_MIPS_ARCH_1     0x00000000  /* -mips1 code.  */
-#define EF_MIPS_ARCH_2     0x10000000  /* -mips2 code.  */
-#define EF_MIPS_ARCH_3     0x20000000  /* -mips3 code.  */
-#define EF_MIPS_ARCH_4     0x30000000  /* -mips4 code.  */
-#define EF_MIPS_ARCH_5     0x40000000  /* -mips5 code.  */
-#define EF_MIPS_ARCH_32            0x60000000  /* MIPS32 code.  */
-#define EF_MIPS_ARCH_64            0x70000000  /* MIPS64 code.  */
-
-/* The following are non-official names and should not be used.  */
-
-#define E_MIPS_ARCH_1    0x00000000    /* -mips1 code.  */
-#define E_MIPS_ARCH_2    0x10000000    /* -mips2 code.  */
-#define E_MIPS_ARCH_3    0x20000000    /* -mips3 code.  */
-#define E_MIPS_ARCH_4    0x30000000    /* -mips4 code.  */
-#define E_MIPS_ARCH_5    0x40000000    /* -mips5 code.  */
-#define E_MIPS_ARCH_32   0x60000000    /* MIPS32 code.  */
-#define E_MIPS_ARCH_64   0x70000000    /* MIPS64 code.  */
+#define EF_MIPS_ARCH_1         0x00000000 /* -mips1 code.  */
+#define EF_MIPS_ARCH_2         0x10000000 /* -mips2 code.  */
+#define EF_MIPS_ARCH_3         0x20000000 /* -mips3 code.  */
+#define EF_MIPS_ARCH_4         0x30000000 /* -mips4 code.  */
+#define EF_MIPS_ARCH_5         0x40000000 /* -mips5 code.  */
+#define EF_MIPS_ARCH_32                0x50000000 /* MIPS32 code.  */
+#define EF_MIPS_ARCH_64                0x60000000 /* MIPS64 code.  */
+#define EF_MIPS_ARCH_32R2      0x70000000 /* MIPS32r2 code.  */
+#define EF_MIPS_ARCH_64R2      0x80000000 /* MIPS64r2 code.  */
+
+/* The following are unofficial names and should not be used.  */
+
+#define E_MIPS_ARCH_1          EF_MIPS_ARCH_1
+#define E_MIPS_ARCH_2          EF_MIPS_ARCH_2
+#define E_MIPS_ARCH_3          EF_MIPS_ARCH_3
+#define E_MIPS_ARCH_4          EF_MIPS_ARCH_4
+#define E_MIPS_ARCH_5          EF_MIPS_ARCH_5
+#define E_MIPS_ARCH_32         EF_MIPS_ARCH_32
+#define E_MIPS_ARCH_64         EF_MIPS_ARCH_64
 
 /* Special section indices.  */
 
-#define SHN_MIPS_ACOMMON    0xff00     /* Allocated common symbols */
-#define SHN_MIPS_TEXT      0xff01      /* Allocated test symbols.  */
-#define SHN_MIPS_DATA      0xff02      /* Allocated data symbols.  */
-#define SHN_MIPS_SCOMMON    0xff03     /* Small common symbols */
-#define SHN_MIPS_SUNDEFINED 0xff04     /* Small undefined symbols */
+#define SHN_MIPS_ACOMMON       0xff00  /* Allocated common symbols.  */
+#define SHN_MIPS_TEXT          0xff01  /* Allocated test symbols.  */
+#define SHN_MIPS_DATA          0xff02  /* Allocated data symbols.  */
+#define SHN_MIPS_SCOMMON       0xff03  /* Small common symbols.  */
+#define SHN_MIPS_SUNDEFINED    0xff04  /* Small undefined symbols.  */
 
 /* Legal values for sh_type field of Elf32_Shdr.  */
 
-#define SHT_MIPS_LIBLIST       0x70000000 /* Shared objects used in link */
-#define SHT_MIPS_MSYM         0x70000001
-#define SHT_MIPS_CONFLICT      0x70000002 /* Conflicting symbols */
-#define SHT_MIPS_GPTAB        0x70000003 /* Global data area sizes */
-#define SHT_MIPS_UCODE        0x70000004 /* Reserved for SGI/MIPS compilers */
-#define SHT_MIPS_DEBUG        0x70000005 /* MIPS ECOFF debugging information*/
-#define SHT_MIPS_REGINFO       0x70000006 /* Register usage information */
-#define SHT_MIPS_PACKAGE       0x70000007
-#define SHT_MIPS_PACKSYM       0x70000008
-#define SHT_MIPS_RELD         0x70000009
-#define SHT_MIPS_IFACE         0x7000000b
-#define SHT_MIPS_CONTENT       0x7000000c
-#define SHT_MIPS_OPTIONS       0x7000000d /* Miscellaneous options.  */
-#define SHT_MIPS_SHDR         0x70000010
-#define SHT_MIPS_FDESC        0x70000011
-#define SHT_MIPS_EXTSYM               0x70000012
-#define SHT_MIPS_DENSE        0x70000013
-#define SHT_MIPS_PDESC        0x70000014
-#define SHT_MIPS_LOCSYM               0x70000015
-#define SHT_MIPS_AUXSYM               0x70000016
-#define SHT_MIPS_OPTSYM               0x70000017
-#define SHT_MIPS_LOCSTR               0x70000018
-#define SHT_MIPS_LINE         0x70000019
-#define SHT_MIPS_RFDESC               0x7000001a
-#define SHT_MIPS_DELTASYM      0x7000001b
-#define SHT_MIPS_DELTAINST     0x7000001c
-#define SHT_MIPS_DELTACLASS    0x7000001d
-#define SHT_MIPS_DWARF         0x7000001e /* DWARF debugging information.  */
-#define SHT_MIPS_DELTADECL     0x7000001f
-#define SHT_MIPS_SYMBOL_LIB    0x70000020
-#define SHT_MIPS_EVENTS               0x70000021 /* Event section.  */
-#define SHT_MIPS_TRANSLATE     0x70000022
-#define SHT_MIPS_PIXIE        0x70000023
-#define SHT_MIPS_XLATE        0x70000024
-#define SHT_MIPS_XLATE_DEBUG   0x70000025
-#define SHT_MIPS_WHIRL        0x70000026
-#define SHT_MIPS_EH_REGION     0x70000027
-#define SHT_MIPS_XLATE_OLD     0x70000028
-#define SHT_MIPS_PDR_EXCEPTION 0x70000029
+#define SHT_MIPS_LIBLIST       0x70000000 /* Shared objects used in link */
+#define SHT_MIPS_MSYM          0x70000001
+#define SHT_MIPS_CONFLICT      0x70000002 /* Conflicting symbols */
+#define SHT_MIPS_GPTAB         0x70000003 /* Global data area sizes.  */
+#define SHT_MIPS_UCODE         0x70000004 /* Reserved for SGI/MIPS compilers */
+#define SHT_MIPS_DEBUG         0x70000005 /* MIPS ECOFF debugging info.  */
+#define SHT_MIPS_REGINFO       0x70000006 /* Register usage information */
+#define SHT_MIPS_PACKAGE       0x70000007
+#define SHT_MIPS_PACKSYM       0x70000008
+#define SHT_MIPS_RELD          0x70000009
+#define SHT_MIPS_IFACE         0x7000000b
+#define SHT_MIPS_CONTENT       0x7000000c
+#define SHT_MIPS_OPTIONS       0x7000000d /* Miscellaneous options.  */
+#define SHT_MIPS_SHDR          0x70000010
+#define SHT_MIPS_FDESC         0x70000011
+#define SHT_MIPS_EXTSYM                0x70000012
+#define SHT_MIPS_DENSE         0x70000013
+#define SHT_MIPS_PDESC         0x70000014
+#define SHT_MIPS_LOCSYM                0x70000015
+#define SHT_MIPS_AUXSYM                0x70000016
+#define SHT_MIPS_OPTSYM                0x70000017
+#define SHT_MIPS_LOCSTR                0x70000018
+#define SHT_MIPS_LINE          0x70000019
+#define SHT_MIPS_RFDESC                0x7000001a
+#define SHT_MIPS_DELTASYM      0x7000001b
+#define SHT_MIPS_DELTAINST     0x7000001c
+#define SHT_MIPS_DELTACLASS    0x7000001d
+#define SHT_MIPS_DWARF         0x7000001e /* DWARF debugging information.  */
+#define SHT_MIPS_DELTADECL     0x7000001f
+#define SHT_MIPS_SYMBOL_LIB    0x70000020
+#define SHT_MIPS_EVENTS                0x70000021 /* Event section.  */
+#define SHT_MIPS_TRANSLATE     0x70000022
+#define SHT_MIPS_PIXIE         0x70000023
+#define SHT_MIPS_XLATE         0x70000024
+#define SHT_MIPS_XLATE_DEBUG   0x70000025
+#define SHT_MIPS_WHIRL         0x70000026
+#define SHT_MIPS_EH_REGION     0x70000027
+#define SHT_MIPS_XLATE_OLD     0x70000028
+#define SHT_MIPS_PDR_EXCEPTION 0x70000029
 
 /* Legal values for sh_flags field of Elf32_Shdr.  */
 
-#define SHF_MIPS_GPREL  0x10000000     /* Must be part of global data area */
-#define SHF_MIPS_MERGE  0x20000000
-#define SHF_MIPS_ADDR   0x40000000
-#define SHF_MIPS_STRINGS 0x80000000
-#define SHF_MIPS_NOSTRIP 0x08000000
-#define SHF_MIPS_LOCAL  0x04000000
-#define SHF_MIPS_NAMES  0x02000000
-#define SHF_MIPS_NODUPE         0x01000000
+#define SHF_MIPS_GPREL         0x10000000 /* Must be in global data area.  */
+#define SHF_MIPS_MERGE         0x20000000
+#define SHF_MIPS_ADDR          0x40000000
+#define SHF_MIPS_STRINGS       0x80000000
+#define SHF_MIPS_NOSTRIP       0x08000000
+#define SHF_MIPS_LOCAL         0x04000000
+#define SHF_MIPS_NAMES         0x02000000
+#define SHF_MIPS_NODUPE                0x01000000
 
 
 /* Symbol tables.  */
@@ -1455,23 +1489,23 @@ typedef union
 {
   struct
     {
-      Elf32_Word gt_current_g_value;   /* -G value used for compilation */
-      Elf32_Word gt_unused;            /* Not used */
-    } gt_header;                       /* First entry in section */
+      Elf32_Word gt_current_g_value;   /* -G value used for compilation */
+      Elf32_Word gt_unused;            /* Not used */
+    } gt_header;                       /* First entry in section */
   struct
     {
-      Elf32_Word gt_g_value;           /* If this value were used for -G */
-      Elf32_Word gt_bytes;             /* This many bytes would be used */
-    } gt_entry;                                /* Subsequent entries in section */
+      Elf32_Word gt_g_value;           /* If this value were used for -G */
+      Elf32_Word gt_bytes;             /* This many bytes would be used */
+    } gt_entry;                                /* Subsequent entries in section */
 } Elf32_gptab;
 
 /* Entry found in sections of type SHT_MIPS_REGINFO.  */
 
 typedef struct
 {
-  Elf32_Word   ri_gprmask;             /* General registers used */
-  Elf32_Word   ri_cprmask[4];          /* Coprocessor registers used */
-  Elf32_Sword  ri_gp_value;            /* $gp register value */
+  Elf32_Word ri_gprmask;               /* General registers used.  */
+  Elf32_Word ri_cprmask[4];            /* Coprocessor registers used.  */
+  Elf32_Sword ri_gp_value;             /* $gp register value.  */
 } Elf32_RegInfo;
 
 /* Entries found in sections of type SHT_MIPS_OPTIONS.  */
@@ -2218,6 +2252,17 @@ typedef Elf32_Addr Elf32_Conflict;
 #define R_PPC64_DTPREL16_HIGHERA 104 /* half16 (sym+add)@dtprel@highera */
 #define R_PPC64_DTPREL16_HIGHEST 105 /* half16 (sym+add)@dtprel@highest */
 #define R_PPC64_DTPREL16_HIGHESTA 106 /* half16        (sym+add)@dtprel@highesta */
+#define R_PPC64_TLSGD          107 /* none     (sym+add)@tlsgd */
+#define R_PPC64_TLSLD          108 /* none     (sym+add)@tlsld */
+#define R_PPC64_TOCSAVE                109 /* none */
+
+/* Added when HA and HI relocs were changed to report overflows.  */
+#define R_PPC64_ADDR16_HIGH    110
+#define R_PPC64_ADDR16_HIGHA   111
+#define R_PPC64_TPREL16_HIGH   112
+#define R_PPC64_TPREL16_HIGHA  113
+#define R_PPC64_DTPREL16_HIGH  114
+#define R_PPC64_DTPREL16_HIGHA 115
 
 /* GNU extension to support local ifunc.  */
 #define R_PPC64_JMP_IREL       247
@@ -2227,12 +2272,29 @@ typedef Elf32_Addr Elf32_Conflict;
 #define R_PPC64_REL16_HI       251     /* half16   (sym+add-.)@h */
 #define R_PPC64_REL16_HA       252     /* half16   (sym+add-.)@ha */
 
+/* e_flags bits specifying ABI.
+   1 for original function descriptor using ABI,
+   2 for revised ABI without function descriptors,
+   0 for unspecified or not using any features affected by the differences.  */
+#define EF_PPC64_ABI   3
+
 /* PowerPC64 specific values for the Dyn d_tag field.  */
 #define DT_PPC64_GLINK  (DT_LOPROC + 0)
 #define DT_PPC64_OPD   (DT_LOPROC + 1)
 #define DT_PPC64_OPDSZ (DT_LOPROC + 2)
+#define DT_PPC64_OPT   (DT_LOPROC + 3)
 #define DT_PPC64_NUM    3
 
+/* PowerPC64 specific values for the DT_PPC64_OPT Dyn entry.  */
+#define PPC64_OPT_TLS          1
+#define PPC64_OPT_MULTI_TOC    2
+
+/* PowerPC64 specific values for the Elf64_Sym st_other field.  */
+#define STO_PPC64_LOCAL_BIT    5
+#define STO_PPC64_LOCAL_MASK   (7 << STO_PPC64_LOCAL_BIT)
+#define PPC64_LOCAL_ENTRY_OFFSET(other)                                \
+ (((1 << (((other) & STO_PPC64_LOCAL_MASK) >> STO_PPC64_LOCAL_BIT)) >> 2) << 2)
+
 
 /* ARM specific declarations */
 
@@ -2250,6 +2312,9 @@ typedef Elf32_Addr Elf32_Conflict;
 #define EF_ARM_VFP_FLOAT       0x400
 #define EF_ARM_MAVERICK_FLOAT  0x800
 
+#define EF_ARM_ABI_FLOAT_SOFT  0x200   /* NB conflicts with EF_ARM_SOFT_FLOAT */
+#define EF_ARM_ABI_FLOAT_HARD  0x400   /* NB conflicts with EF_ARM_VFP_FLOAT */
+
 
 /* Other constants defined in the ARM ELF spec. version B-01.  */
 /* NB. These conflict with values defined above.  */
@@ -2294,26 +2359,154 @@ typedef Elf32_Addr Elf32_Conflict;
 #define SHT_ARM_ATTRIBUTES     (SHT_LOPROC + 3) /* ARM attributes section.  */
 
 
+/* AArch64 relocs.  */
+
+#define R_AARCH64_NONE            0    /* No relocation.  */
+#define R_AARCH64_ABS64         257    /* Direct 64 bit. */
+#define R_AARCH64_ABS32         258    /* Direct 32 bit.  */
+#define R_AARCH64_ABS16                259     /* Direct 16-bit.  */
+#define R_AARCH64_PREL64       260     /* PC-relative 64-bit.  */
+#define R_AARCH64_PREL32       261     /* PC-relative 32-bit.  */
+#define R_AARCH64_PREL16       262     /* PC-relative 16-bit.  */
+#define R_AARCH64_MOVW_UABS_G0 263     /* Dir. MOVZ imm. from bits 15:0.  */
+#define R_AARCH64_MOVW_UABS_G0_NC 264  /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_UABS_G1 265     /* Dir. MOVZ imm. from bits 31:16.  */
+#define R_AARCH64_MOVW_UABS_G1_NC 266  /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_UABS_G2 267     /* Dir. MOVZ imm. from bits 47:32.  */
+#define R_AARCH64_MOVW_UABS_G2_NC 268  /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_UABS_G3 269     /* Dir. MOV{K,Z} imm. from 63:48.  */
+#define R_AARCH64_MOVW_SABS_G0 270     /* Dir. MOV{N,Z} imm. from 15:0.  */
+#define R_AARCH64_MOVW_SABS_G1 271     /* Dir. MOV{N,Z} imm. from 31:16.  */
+#define R_AARCH64_MOVW_SABS_G2 272     /* Dir. MOV{N,Z} imm. from 47:32.  */
+#define R_AARCH64_LD_PREL_LO19 273     /* PC-rel. LD imm. from bits 20:2.  */
+#define R_AARCH64_ADR_PREL_LO21        274     /* PC-rel. ADR imm. from bits 20:0.  */
+#define R_AARCH64_ADR_PREL_PG_HI21 275 /* Page-rel. ADRP imm. from 32:12.  */
+#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 /* Likewise; no overflow check.  */
+#define R_AARCH64_ADD_ABS_LO12_NC 277  /* Dir. ADD imm. from bits 11:0.  */
+#define R_AARCH64_LDST8_ABS_LO12_NC 278        /* Likewise for LD/ST; no check. */
+#define R_AARCH64_TSTBR14      279     /* PC-rel. TBZ/TBNZ imm. from 15:2.  */
+#define R_AARCH64_CONDBR19     280     /* PC-rel. cond. br. imm. from 20:2. */
+#define R_AARCH64_JUMP26       282     /* PC-rel. B imm. from bits 27:2.  */
+#define R_AARCH64_CALL26       283     /* Likewise for CALL.  */
+#define R_AARCH64_LDST16_ABS_LO12_NC 284 /* Dir. ADD imm. from bits 11:1.  */
+#define R_AARCH64_LDST32_ABS_LO12_NC 285 /* Likewise for bits 11:2.  */
+#define R_AARCH64_LDST64_ABS_LO12_NC 286 /* Likewise for bits 11:3.  */
+#define R_AARCH64_MOVW_PREL_G0 287     /* PC-rel. MOV{N,Z} imm. from 15:0.  */
+#define R_AARCH64_MOVW_PREL_G0_NC 288  /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_PREL_G1 289     /* PC-rel. MOV{N,Z} imm. from 31:16. */
+#define R_AARCH64_MOVW_PREL_G1_NC 290  /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_PREL_G2 291     /* PC-rel. MOV{N,Z} imm. from 47:32. */
+#define R_AARCH64_MOVW_PREL_G2_NC 292  /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_PREL_G3 293     /* PC-rel. MOV{N,Z} imm. from 63:48. */
+#define R_AARCH64_LDST128_ABS_LO12_NC 299 /* Dir. ADD imm. from bits 11:4.  */
+#define R_AARCH64_MOVW_GOTOFF_G0 300   /* GOT-rel. off. MOV{N,Z} imm. 15:0. */
+#define R_AARCH64_MOVW_GOTOFF_G0_NC 301        /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_GOTOFF_G1 302   /* GOT-rel. o. MOV{N,Z} imm. 31:16.  */
+#define R_AARCH64_MOVW_GOTOFF_G1_NC 303        /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_GOTOFF_G2 304   /* GOT-rel. o. MOV{N,Z} imm. 47:32.  */
+#define R_AARCH64_MOVW_GOTOFF_G2_NC 305        /* Likewise for MOVK; no check.  */
+#define R_AARCH64_MOVW_GOTOFF_G3 306   /* GOT-rel. o. MOV{N,Z} imm. 63:48.  */
+#define R_AARCH64_GOTREL64     307     /* GOT-relative 64-bit.  */
+#define R_AARCH64_GOTREL32     308     /* GOT-relative 32-bit.  */
+#define R_AARCH64_GOT_LD_PREL19        309     /* PC-rel. GOT off. load imm. 20:2.  */
+#define R_AARCH64_LD64_GOTOFF_LO15 310 /* GOT-rel. off. LD/ST imm. 14:3.  */
+#define R_AARCH64_ADR_GOT_PAGE 311     /* P-page-rel. GOT off. ADRP 32:12.  */
+#define R_AARCH64_LD64_GOT_LO12_NC 312 /* Dir. GOT off. LD/ST imm. 11:3.  */
+#define R_AARCH64_LD64_GOTPAGE_LO15 313        /* GOT-page-rel. GOT off. LD/ST 14:3 */
+#define R_AARCH64_TLSGD_ADR_PREL21 512 /* PC-relative ADR imm. 20:0.  */
+#define R_AARCH64_TLSGD_ADR_PAGE21 513 /* page-rel. ADRP imm. 32:12.  */
+#define R_AARCH64_TLSGD_ADD_LO12_NC 514        /* direct ADD imm. from 11:0.  */
+#define R_AARCH64_TLSGD_MOVW_G1        515     /* GOT-rel. MOV{N,Z} 31:16.  */
+#define R_AARCH64_TLSGD_MOVW_G0_NC 516 /* GOT-rel. MOVK imm. 15:0.  */
+#define R_AARCH64_TLSLD_ADR_PREL21 517 /* Like 512; local dynamic model.  */
+#define R_AARCH64_TLSLD_ADR_PAGE21 518 /* Like 513; local dynamic model.  */
+#define R_AARCH64_TLSLD_ADD_LO12_NC 519        /* Like 514; local dynamic model.  */
+#define R_AARCH64_TLSLD_MOVW_G1        520     /* Like 515; local dynamic model.  */
+#define R_AARCH64_TLSLD_MOVW_G0_NC 521 /* Like 516; local dynamic model.  */
+#define R_AARCH64_TLSLD_LD_PREL19 522  /* TLS PC-rel. load imm. 20:2.  */
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 /* TLS DTP-rel. MOV{N,Z} 47:32.  */
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 /* TLS DTP-rel. MOV{N,Z} 31:16.  */
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 /* Likewise; MOVK; no check.  */
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 /* TLS DTP-rel. MOV{N,Z} 15:0.  */
+#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527 /* Likewise; MOVK; no check.  */
+#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 /* DTP-rel. ADD imm. from 23:12. */
+#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 /* DTP-rel. ADD imm. from 11:0.  */
+#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 /* Likewise; no ovfl. check.  */
+#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 /* DTP-rel. LD/ST imm. 11:0.  */
+#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 /* Likewise; no check.  */
+#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 /* DTP-rel. LD/ST imm. 11:1.  */
+#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 /* Likewise; no check.  */
+#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 /* DTP-rel. LD/ST imm. 11:2.  */
+#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 /* Likewise; no check.  */
+#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 /* DTP-rel. LD/ST imm. 11:3.  */
+#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 /* Likewise; no check.  */
+#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 /* GOT-rel. MOV{N,Z} 31:16.  */
+#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 /* GOT-rel. MOVK 15:0.  */
+#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 /* Page-rel. ADRP 32:12.  */
+#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 /* Direct LD off. 11:3.  */
+#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 /* PC-rel. load imm. 20:2.  */
+#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 /* TLS TP-rel. MOV{N,Z} 47:32.  */
+#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545 /* TLS TP-rel. MOV{N,Z} 31:16.  */
+#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546 /* Likewise; MOVK; no check.  */
+#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547 /* TLS TP-rel. MOV{N,Z} 15:0.  */
+#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548 /* Likewise; MOVK; no check.  */
+#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549 /* TP-rel. ADD imm. 23:12.  */
+#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550 /* TP-rel. ADD imm. 11:0.  */
+#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551 /* Likewise; no ovfl. check.  */
+#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552 /* TP-rel. LD/ST off. 11:0.  */
+#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553 /* Likewise; no ovfl. check. */
+#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554 /* TP-rel. LD/ST off. 11:1.  */
+#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555 /* Likewise; no check.  */
+#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556 /* TP-rel. LD/ST off. 11:2.  */
+#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557 /* Likewise; no check.  */
+#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558 /* TP-rel. LD/ST off. 11:3.  */
+#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559 /* Likewise; no check.  */
+#define R_AARCH64_TLSDESC_LD_PREL19 560        /* PC-rel. load immediate 20:2.  */
+#define R_AARCH64_TLSDESC_ADR_PREL21 561 /* PC-rel. ADR immediate 20:0.  */
+#define R_AARCH64_TLSDESC_ADR_PAGE21 562 /* Page-rel. ADRP imm. 32:12.  */
+#define R_AARCH64_TLSDESC_LD64_LO12 563        /* Direct LD off. from 11:3.  */
+#define R_AARCH64_TLSDESC_ADD_LO12 564 /* Direct ADD imm. from 11:0.  */
+#define R_AARCH64_TLSDESC_OFF_G1 565   /* GOT-rel. MOV{N,Z} imm. 31:16.  */
+#define R_AARCH64_TLSDESC_OFF_G0_NC 566        /* GOT-rel. MOVK imm. 15:0; no ck.  */
+#define R_AARCH64_TLSDESC_LDR  567     /* Relax LDR.  */
+#define R_AARCH64_TLSDESC_ADD  568     /* Relax ADD.  */
+#define R_AARCH64_TLSDESC_CALL 569     /* Relax BLR.  */
+#define R_AARCH64_TLSLE_LDST128_TPREL_LO12 570 /* TP-rel. LD/ST off. 11:4.  */
+#define R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC 571 /* Likewise; no check.  */
+#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12 572 /* DTP-rel. LD/ST imm. 11:4. */
+#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC 573 /* Likewise; no check.  */
+#define R_AARCH64_COPY         1024    /* Copy symbol at runtime.  */
+#define R_AARCH64_GLOB_DAT     1025    /* Create GOT entry.  */
+#define R_AARCH64_JUMP_SLOT    1026    /* Create PLT entry.  */
+#define R_AARCH64_RELATIVE     1027    /* Adjust by program base.  */
+#define R_AARCH64_TLS_DTPMOD64 1028    /* Module number, 64 bit.  */
+#define R_AARCH64_TLS_DTPREL64 1029    /* Module-relative offset, 64 bit.  */
+#define R_AARCH64_TLS_TPREL64  1030    /* TP-relative offset, 64 bit.  */
+#define R_AARCH64_TLSDESC      1031    /* TLS Descriptor.  */
+#define R_AARCH64_IRELATIVE    1032    /* STT_GNU_IFUNC relocation.  */
+
 /* ARM relocs.  */
 
 #define R_ARM_NONE             0       /* No reloc */
-#define R_ARM_PC24             1       /* PC relative 26 bit branch */
+#define R_ARM_PC24             1       /* Deprecated PC relative 26
+                                          bit branch.  */
 #define R_ARM_ABS32            2       /* Direct 32 bit  */
 #define R_ARM_REL32            3       /* PC relative 32 bit */
 #define R_ARM_PC13             4
 #define R_ARM_ABS16            5       /* Direct 16 bit */
 #define R_ARM_ABS12            6       /* Direct 12 bit */
-#define R_ARM_THM_ABS5         7
+#define R_ARM_THM_ABS5         7       /* Direct & 0x7C (LDR, STR).  */
 #define R_ARM_ABS8             8       /* Direct 8 bit */
 #define R_ARM_SBREL32          9
-#define R_ARM_THM_PC22         10
-#define R_ARM_THM_PC8          11
+#define R_ARM_THM_PC22         10      /* PC relative 24 bit (Thumb32 BL).  */
+#define R_ARM_THM_PC8          11      /* PC relative & 0x3FC
+                                          (Thumb16 LDR, ADD, ADR).  */
 #define R_ARM_AMP_VCALL9       12
 #define R_ARM_SWI24            13      /* Obsolete static relocation.  */
 #define R_ARM_TLS_DESC         13      /* Dynamic relocation.  */
-#define R_ARM_THM_SWI8         14
-#define R_ARM_XPC25            15
-#define R_ARM_THM_XPC22                16
+#define R_ARM_THM_SWI8         14      /* Reserved.  */
+#define R_ARM_XPC25            15      /* Reserved.  */
+#define R_ARM_THM_XPC22                16      /* Reserved.  */
 #define R_ARM_TLS_DTPMOD32     17      /* ID of module containing symbol */
 #define R_ARM_TLS_DTPOFF32     18      /* Offset in TLS block */
 #define R_ARM_TLS_TPOFF32      19      /* Offset in static TLS block */
@@ -2324,21 +2517,109 @@ typedef Elf32_Addr Elf32_Conflict;
 #define R_ARM_GOTOFF           24      /* 32 bit offset to GOT */
 #define R_ARM_GOTPC            25      /* 32 bit PC relative offset to GOT */
 #define R_ARM_GOT32            26      /* 32 bit GOT entry */
-#define R_ARM_PLT32            27      /* 32 bit PLT address */
-#define R_ARM_ALU_PCREL_7_0    32
-#define R_ARM_ALU_PCREL_15_8   33
-#define R_ARM_ALU_PCREL_23_15  34
-#define R_ARM_LDR_SBREL_11_0   35
-#define R_ARM_ALU_SBREL_19_12  36
-#define R_ARM_ALU_SBREL_27_20  37
+#define R_ARM_PLT32            27      /* Deprecated, 32 bit PLT address.  */
+#define R_ARM_CALL             28      /* PC relative 24 bit (BL, BLX).  */
+#define R_ARM_JUMP24           29      /* PC relative 24 bit
+                                          (B, BL<cond>).  */
+#define R_ARM_THM_JUMP24       30      /* PC relative 24 bit (Thumb32 B.W).  */
+#define R_ARM_BASE_ABS         31      /* Adjust by program base.  */
+#define R_ARM_ALU_PCREL_7_0    32      /* Obsolete.  */
+#define R_ARM_ALU_PCREL_15_8   33      /* Obsolete.  */
+#define R_ARM_ALU_PCREL_23_15  34      /* Obsolete.  */
+#define R_ARM_LDR_SBREL_11_0   35      /* Deprecated, prog. base relative.  */
+#define R_ARM_ALU_SBREL_19_12  36      /* Deprecated, prog. base relative.  */
+#define R_ARM_ALU_SBREL_27_20  37      /* Deprecated, prog. base relative.  */
+#define R_ARM_TARGET1          38
+#define R_ARM_SBREL31          39      /* Program base relative.  */
+#define R_ARM_V4BX             40
+#define R_ARM_TARGET2          41
+#define R_ARM_PREL31           42      /* 32 bit PC relative.  */
+#define R_ARM_MOVW_ABS_NC      43      /* Direct 16-bit (MOVW).  */
+#define R_ARM_MOVT_ABS         44      /* Direct high 16-bit (MOVT).  */
+#define R_ARM_MOVW_PREL_NC     45      /* PC relative 16-bit (MOVW).  */
+#define R_ARM_MOVT_PREL                46      /* PC relative (MOVT).  */
+#define R_ARM_THM_MOVW_ABS_NC  47      /* Direct 16 bit (Thumb32 MOVW).  */
+#define R_ARM_THM_MOVT_ABS     48      /* Direct high 16 bit
+                                          (Thumb32 MOVT).  */
+#define R_ARM_THM_MOVW_PREL_NC 49      /* PC relative 16 bit
+                                          (Thumb32 MOVW).  */
+#define R_ARM_THM_MOVT_PREL    50      /* PC relative high 16 bit
+                                          (Thumb32 MOVT).  */
+#define R_ARM_THM_JUMP19       51      /* PC relative 20 bit
+                                          (Thumb32 B<cond>.W).  */
+#define R_ARM_THM_JUMP6                52      /* PC relative X & 0x7E
+                                          (Thumb16 CBZ, CBNZ).  */
+#define R_ARM_THM_ALU_PREL_11_0        53      /* PC relative 12 bit
+                                          (Thumb32 ADR.W).  */
+#define R_ARM_THM_PC12         54      /* PC relative 12 bit
+                                          (Thumb32 LDR{D,SB,H,SH}).  */
+#define R_ARM_ABS32_NOI                55      /* Direct 32-bit.  */
+#define R_ARM_REL32_NOI                56      /* PC relative 32-bit.  */
+#define R_ARM_ALU_PC_G0_NC     57      /* PC relative (ADD, SUB).  */
+#define R_ARM_ALU_PC_G0                58      /* PC relative (ADD, SUB).  */
+#define R_ARM_ALU_PC_G1_NC     59      /* PC relative (ADD, SUB).  */
+#define R_ARM_ALU_PC_G1                60      /* PC relative (ADD, SUB).  */
+#define R_ARM_ALU_PC_G2                61      /* PC relative (ADD, SUB).  */
+#define R_ARM_LDR_PC_G1                62      /* PC relative (LDR,STR,LDRB,STRB).  */
+#define R_ARM_LDR_PC_G2                63      /* PC relative (LDR,STR,LDRB,STRB).  */
+#define R_ARM_LDRS_PC_G0       64      /* PC relative (STR{D,H},
+                                          LDR{D,SB,H,SH}).  */
+#define R_ARM_LDRS_PC_G1       65      /* PC relative (STR{D,H},
+                                          LDR{D,SB,H,SH}).  */
+#define R_ARM_LDRS_PC_G2       66      /* PC relative (STR{D,H},
+                                          LDR{D,SB,H,SH}).  */
+#define R_ARM_LDC_PC_G0                67      /* PC relative (LDC, STC).  */
+#define R_ARM_LDC_PC_G1                68      /* PC relative (LDC, STC).  */
+#define R_ARM_LDC_PC_G2                69      /* PC relative (LDC, STC).  */
+#define R_ARM_ALU_SB_G0_NC     70      /* Program base relative (ADD,SUB).  */
+#define R_ARM_ALU_SB_G0                71      /* Program base relative (ADD,SUB).  */
+#define R_ARM_ALU_SB_G1_NC     72      /* Program base relative (ADD,SUB).  */
+#define R_ARM_ALU_SB_G1                73      /* Program base relative (ADD,SUB).  */
+#define R_ARM_ALU_SB_G2                74      /* Program base relative (ADD,SUB).  */
+#define R_ARM_LDR_SB_G0                75      /* Program base relative (LDR,
+                                          STR, LDRB, STRB).  */
+#define R_ARM_LDR_SB_G1                76      /* Program base relative
+                                          (LDR, STR, LDRB, STRB).  */
+#define R_ARM_LDR_SB_G2                77      /* Program base relative
+                                          (LDR, STR, LDRB, STRB).  */
+#define R_ARM_LDRS_SB_G0       78      /* Program base relative
+                                          (LDR, STR, LDRB, STRB).  */
+#define R_ARM_LDRS_SB_G1       79      /* Program base relative
+                                          (LDR, STR, LDRB, STRB).  */
+#define R_ARM_LDRS_SB_G2       80      /* Program base relative
+                                          (LDR, STR, LDRB, STRB).  */
+#define R_ARM_LDC_SB_G0                81      /* Program base relative (LDC,STC).  */
+#define R_ARM_LDC_SB_G1                82      /* Program base relative (LDC,STC).  */
+#define R_ARM_LDC_SB_G2                83      /* Program base relative (LDC,STC).  */
+#define R_ARM_MOVW_BREL_NC     84      /* Program base relative 16
+                                          bit (MOVW).  */
+#define R_ARM_MOVT_BREL                85      /* Program base relative high
+                                          16 bit (MOVT).  */
+#define R_ARM_MOVW_BREL                86      /* Program base relative 16
+                                          bit (MOVW).  */
+#define R_ARM_THM_MOVW_BREL_NC 87      /* Program base relative 16
+                                          bit (Thumb32 MOVW).  */
+#define R_ARM_THM_MOVT_BREL    88      /* Program base relative high
+                                          16 bit (Thumb32 MOVT).  */
+#define R_ARM_THM_MOVW_BREL    89      /* Program base relative 16
+                                          bit (Thumb32 MOVW).  */
 #define R_ARM_TLS_GOTDESC      90
 #define R_ARM_TLS_CALL         91
-#define R_ARM_TLS_DESCSEQ      92
+#define R_ARM_TLS_DESCSEQ      92      /* TLS relaxation.  */
 #define R_ARM_THM_TLS_CALL     93
+#define R_ARM_PLT32_ABS                94
+#define R_ARM_GOT_ABS          95      /* GOT entry.  */
+#define R_ARM_GOT_PREL         96      /* PC relative GOT entry.  */
+#define R_ARM_GOT_BREL12       97      /* GOT entry relative to GOT
+                                          origin (LDR).  */
+#define R_ARM_GOTOFF12         98      /* 12 bit, GOT entry relative
+                                          to GOT origin (LDR, STR).  */
+#define R_ARM_GOTRELAX         99
 #define R_ARM_GNU_VTENTRY      100
 #define R_ARM_GNU_VTINHERIT    101
-#define R_ARM_THM_PC11         102     /* thumb unconditional branch */
-#define R_ARM_THM_PC9          103     /* thumb conditional branch */
+#define R_ARM_THM_PC11         102     /* PC relative & 0xFFE (Thumb16 B).  */
+#define R_ARM_THM_PC9          103     /* PC relative & 0x1FE
+                                          (Thumb16 B/B<cond>).  */
 #define R_ARM_TLS_GD32         104     /* PC-rel 32 bit for global dynamic
                                           thread local data */
 #define R_ARM_TLS_LDM32                105     /* PC-rel 32 bit for local dynamic
@@ -2349,7 +2630,18 @@ typedef Elf32_Addr Elf32_Conflict;
                                           static TLS block offset */
 #define R_ARM_TLS_LE32         108     /* 32 bit offset relative to static
                                           TLS block */
-#define        R_ARM_THM_TLS_DESCSEQ   129
+#define R_ARM_TLS_LDO12                109     /* 12 bit relative to TLS
+                                          block (LDR, STR).  */
+#define R_ARM_TLS_LE12         110     /* 12 bit relative to static
+                                          TLS block (LDR, STR).  */
+#define R_ARM_TLS_IE12GP       111     /* 12 bit GOT entry relative
+                                          to GOT origin (LDR).  */
+#define R_ARM_ME_TOO           128     /* Obsolete.  */
+#define R_ARM_THM_TLS_DESCSEQ  129
+#define R_ARM_THM_TLS_DESCSEQ16        129
+#define R_ARM_THM_TLS_DESCSEQ32        130
+#define R_ARM_THM_GOT_BREL12   131     /* GOT entry relative to GOT
+                                          origin, 12 bit (Thumb32 LDR).  */
 #define R_ARM_IRELATIVE                160
 #define R_ARM_RXPC25           249
 #define R_ARM_RSBREL32         250
@@ -2808,6 +3100,37 @@ typedef Elf32_Addr Elf32_Conflict;
 #define R_M32R_GOTOFF_LO       64      /* Low 16 bit offset to GOT */
 #define R_M32R_NUM             256     /* Keep this the last entry. */
 
+/* MicroBlaze relocations */
+#define R_MICROBLAZE_NONE              0       /* No reloc. */
+#define R_MICROBLAZE_32                1       /* Direct 32 bit. */
+#define R_MICROBLAZE_32_PCREL          2       /* PC relative 32 bit. */
+#define R_MICROBLAZE_64_PCREL          3       /* PC relative 64 bit. */
+#define R_MICROBLAZE_32_PCREL_LO       4       /* Low 16 bits of PCREL32. */
+#define R_MICROBLAZE_64                5       /* Direct 64 bit. */
+#define R_MICROBLAZE_32_LO             6       /* Low 16 bit. */
+#define R_MICROBLAZE_SRO32             7       /* Read-only small data area. */
+#define R_MICROBLAZE_SRW32             8       /* Read-write small data area. */
+#define R_MICROBLAZE_64_NONE           9       /* No reloc. */
+#define R_MICROBLAZE_32_SYM_OP_SYM     10      /* Symbol Op Symbol relocation. */
+#define R_MICROBLAZE_GNU_VTINHERIT     11      /* GNU C++ vtable hierarchy. */
+#define R_MICROBLAZE_GNU_VTENTRY       12      /* GNU C++ vtable member usage. */
+#define R_MICROBLAZE_GOTPC_64          13      /* PC-relative GOT offset.  */
+#define R_MICROBLAZE_GOT_64            14      /* GOT entry offset.  */
+#define R_MICROBLAZE_PLT_64            15      /* PLT offset (PC-relative).  */
+#define R_MICROBLAZE_REL               16      /* Adjust by program base.  */
+#define R_MICROBLAZE_JUMP_SLOT         17      /* Create PLT entry.  */
+#define R_MICROBLAZE_GLOB_DAT          18      /* Create GOT entry.  */
+#define R_MICROBLAZE_GOTOFF_64         19      /* 64 bit offset to GOT. */
+#define R_MICROBLAZE_GOTOFF_32         20      /* 32 bit offset to GOT. */
+#define R_MICROBLAZE_COPY              21      /* Runtime copy.  */
+#define R_MICROBLAZE_TLS               22      /* TLS Reloc. */
+#define R_MICROBLAZE_TLSGD             23      /* TLS General Dynamic. */
+#define R_MICROBLAZE_TLSLD             24      /* TLS Local Dynamic. */
+#define R_MICROBLAZE_TLSDTPMOD32       25      /* TLS Module ID. */
+#define R_MICROBLAZE_TLSDTPREL32       26      /* TLS Offset Within TLS Block. */
+#define R_MICROBLAZE_TLSDTPREL64       27      /* TLS Offset Within TLS Block. */
+#define R_MICROBLAZE_TLSGOTTPREL32     28      /* TLS Offset From Thread Pointer. */
+#define R_MICROBLAZE_TLSTPREL32        29      /* TLS Offset From Thread Pointer. */
 
 /* TILEPro relocations.  */
 #define R_TILEPRO_NONE         0       /* No reloc */
@@ -2974,12 +3297,18 @@ typedef Elf32_Addr Elf32_Conflict;
 #define R_TILEGX_IMM16_X1_HW2_LAST_PCREL 63 /* X1 pipe PC-rel last hword 2 */
 #define R_TILEGX_IMM16_X0_HW0_GOT 64   /* X0 pipe hword 0 GOT offset */
 #define R_TILEGX_IMM16_X1_HW0_GOT 65   /* X1 pipe hword 0 GOT offset */
-/* Relocs 66-71 are currently not defined.  */
+#define R_TILEGX_IMM16_X0_HW0_PLT_PCREL 66 /* X0 pipe PC-rel PLT hword 0 */
+#define R_TILEGX_IMM16_X1_HW0_PLT_PCREL 67 /* X1 pipe PC-rel PLT hword 0 */
+#define R_TILEGX_IMM16_X0_HW1_PLT_PCREL 68 /* X0 pipe PC-rel PLT hword 1 */
+#define R_TILEGX_IMM16_X1_HW1_PLT_PCREL 69 /* X1 pipe PC-rel PLT hword 1 */
+#define R_TILEGX_IMM16_X0_HW2_PLT_PCREL 70 /* X0 pipe PC-rel PLT hword 2 */
+#define R_TILEGX_IMM16_X1_HW2_PLT_PCREL 71 /* X1 pipe PC-rel PLT hword 2 */
 #define R_TILEGX_IMM16_X0_HW0_LAST_GOT 72 /* X0 pipe last hword 0 GOT offset */
 #define R_TILEGX_IMM16_X1_HW0_LAST_GOT 73 /* X1 pipe last hword 0 GOT offset */
 #define R_TILEGX_IMM16_X0_HW1_LAST_GOT 74 /* X0 pipe last hword 1 GOT offset */
 #define R_TILEGX_IMM16_X1_HW1_LAST_GOT 75 /* X1 pipe last hword 1 GOT offset */
-/* Relocs 76-77 are currently not defined.  */
+#define R_TILEGX_IMM16_X0_HW3_PLT_PCREL 76 /* X0 pipe PC-rel PLT hword 3 */
+#define R_TILEGX_IMM16_X1_HW3_PLT_PCREL 77 /* X1 pipe PC-rel PLT hword 3 */
 #define R_TILEGX_IMM16_X0_HW0_TLS_GD 78        /* X0 pipe hword 0 TLS GD offset */
 #define R_TILEGX_IMM16_X1_HW0_TLS_GD 79        /* X1 pipe hword 0 TLS GD offset */
 #define R_TILEGX_IMM16_X0_HW0_TLS_LE 80        /* X0 pipe hword 0 TLS LE offset */
@@ -2995,7 +3324,12 @@ typedef Elf32_Addr Elf32_Conflict;
 /* Relocs 90-91 are currently not defined.  */
 #define R_TILEGX_IMM16_X0_HW0_TLS_IE 92        /* X0 pipe hword 0 TLS IE offset */
 #define R_TILEGX_IMM16_X1_HW0_TLS_IE 93        /* X1 pipe hword 0 TLS IE offset */
-/* Relocs 94-99 are currently not defined.  */
+#define R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL 94 /* X0 pipe PC-rel PLT last hword 0 */
+#define R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL 95 /* X1 pipe PC-rel PLT last hword 0 */
+#define R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL 96 /* X0 pipe PC-rel PLT last hword 1 */
+#define R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL 97 /* X1 pipe PC-rel PLT last hword 1 */
+#define R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL 98 /* X0 pipe PC-rel PLT last hword 2 */
+#define R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL 99 /* X1 pipe PC-rel PLT last hword 2 */
 #define R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE 100 /* X0 pipe last hword 0 IE off */
 #define R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE 101 /* X1 pipe last hword 0 IE off */
 #define R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE 102 /* X0 pipe last hword 1 IE off */
index a47c9f7..e74e63f 100644 (file)
@@ -1,5 +1,5 @@
 /* Get ELF program header table.
-   Copyright (C) 1998-2010 Red Hat, Inc.
+   Copyright (C) 1998-2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 1998.
 
@@ -93,6 +93,16 @@ __elfw2(LIBELFBITS,getphdr_wrlock) (elf)
 
       if (elf->map_address != NULL)
        {
+         /* First see whether the information in the ELF header is
+            valid and it does not ask for too much.  */
+         if (unlikely (ehdr->e_phoff >= elf->maximum_size)
+             || unlikely (elf->maximum_size - ehdr->e_phoff < size))
+           {
+             /* Something is wrong.  */
+             __libelf_seterrno (ELF_E_INVALID_PHDR);
+             goto out;
+           }
+
          /* All the data is already mapped.  Use it.  */
          void *file_phdr = ((char *) elf->map_address
                             + elf->start_offset + ehdr->e_phoff);
index bd9340d..7417047 100644 (file)
@@ -1,5 +1,5 @@
 /* Return section header.
-   Copyright (C) 1998-2002, 2005, 2007, 2009, 2012 Red Hat, Inc.
+   Copyright (C) 1998-2002, 2005, 2007, 2009, 2012, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 1998.
 
@@ -60,7 +60,8 @@ load_shdr_wrlock (Elf_Scn *scn)
     goto out;
 
   size_t shnum;
-  if (__elf_getshdrnum_rdlock (elf, &shnum) != 0)
+  if (__elf_getshdrnum_rdlock (elf, &shnum) != 0
+      || shnum > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Shdr)))
     goto out;
   size_t size = shnum * sizeof (ElfW2(LIBELFBITS,Shdr));
 
@@ -77,6 +78,16 @@ load_shdr_wrlock (Elf_Scn *scn)
 
   if (elf->map_address != NULL)
     {
+      /* First see whether the information in the ELF header is
+        valid and it does not ask for too much.  */
+      if (unlikely (ehdr->e_shoff >= elf->maximum_size)
+         || unlikely (elf->maximum_size - ehdr->e_shoff < size))
+       {
+         /* Something is wrong.  */
+         __libelf_seterrno (ELF_E_INVALID_SECTION_HEADER);
+         goto free_and_out;
+       }
+
       ElfW2(LIBELFBITS,Shdr) *notcvt;
 
       /* All the data is already mapped.  If we could use it
index 1db2080..01038e7 100644 (file)
@@ -1,5 +1,5 @@
 /* Create new ELF program header table.
-   Copyright (C) 1999-2010 Red Hat, Inc.
+   Copyright (C) 1999-2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 1998.
 
@@ -114,6 +114,12 @@ elfw2(LIBELFBITS,newphdr) (elf, count)
           || count == PN_XNUM
           || elf->state.ELFW(elf,LIBELFBITS).phdr == NULL)
     {
+      if (unlikely (count > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Phdr))))
+       {
+         result = NULL;
+         goto out;
+       }
+
       /* Allocate a new program header with the appropriate number of
         elements.  */
       result = (ElfW2(LIBELFBITS,Phdr) *)
index 296b1ac..153e377 100644 (file)
@@ -1,5 +1,5 @@
 /* Write changed data structures.
-   Copyright (C) 2000-2010 Red Hat, Inc.
+   Copyright (C) 2000-2010, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -133,7 +133,7 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
          (*fctp) ((char *) elf->map_address + elf->start_offset, ehdr,
                   sizeof (ElfW2(LIBELFBITS,Ehdr)), 1);
        }
-      else
+      else if (elf->map_address + elf->start_offset != ehdr)
        memcpy (elf->map_address + elf->start_offset, ehdr,
                sizeof (ElfW2(LIBELFBITS,Ehdr)));
 
@@ -202,6 +202,9 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
   /* Write all the sections.  Well, only those which are modified.  */
   if (shnum > 0)
     {
+      if (unlikely (shnum > SIZE_MAX / sizeof (Elf_Scn *)))
+       return 1;
+
       Elf_ScnList *list = &elf->state.ELFW(elf,LIBELFBITS).scns;
       Elf_Scn **scns = (Elf_Scn **) alloca (shnum * sizeof (Elf_Scn *));
       char *const shdr_start = ((char *) elf->map_address + elf->start_offset
@@ -624,6 +627,10 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
   /* Write all the sections.  Well, only those which are modified.  */
   if (shnum > 0)
     {
+      if (unlikely (shnum > SIZE_MAX / (sizeof (Elf_Scn *)
+                                       + sizeof (ElfW2(LIBELFBITS,Shdr)))))
+       return 1;
+
       off_t shdr_offset = elf->start_offset + ehdr->e_shoff;
 #if EV_NUM != 2
       xfct_t shdr_fctp = __elf_xfctstom[__libelf_version - 1][EV_CURRENT - 1][ELFW(ELFCLASS, LIBELFBITS) - 1][ELF_T_SHDR];
@@ -633,7 +640,8 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
 #endif
 
       ElfW2(LIBELFBITS,Shdr) *shdr_data;
-      if (change_bo || elf->state.ELFW(elf,LIBELFBITS).shdr == NULL)
+      if (change_bo || elf->state.ELFW(elf,LIBELFBITS).shdr == NULL
+         || (elf->flags & ELF_F_DIRTY))
        shdr_data = (ElfW2(LIBELFBITS,Shdr) *)
          alloca (shnum * sizeof (ElfW2(LIBELFBITS,Shdr)));
       else
@@ -764,7 +772,8 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
            (*shdr_fctp) (&shdr_data[scn->index],
                          scn->shdr.ELFW(e,LIBELFBITS),
                          sizeof (ElfW2(LIBELFBITS,Shdr)), 1);
-         else if (elf->state.ELFW(elf,LIBELFBITS).shdr == NULL)
+         else if (elf->state.ELFW(elf,LIBELFBITS).shdr == NULL
+                  || (elf->flags & ELF_F_DIRTY))
            memcpy (&shdr_data[scn->index], scn->shdr.ELFW(e,LIBELFBITS),
                    sizeof (ElfW2(LIBELFBITS,Shdr)));
 
index b9d5cea..1ef70ac 100644 (file)
@@ -1,5 +1,5 @@
 /* Create descriptor for processing file.
-   Copyright (C) 1998-2010, 2012 Red Hat, Inc.
+   Copyright (C) 1998-2010, 2012, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 1998.
 
@@ -144,7 +144,8 @@ get_shnum (void *map_address, unsigned char *e_ident, int fildes, off_t offset,
 
       if (unlikely (result == 0) && ehdr.e32->e_shoff != 0)
        {
-         if (ehdr.e32->e_shoff + sizeof (Elf32_Shdr) > maxsize)
+         if (unlikely (ehdr.e32->e_shoff >= maxsize)
+             || unlikely (maxsize - ehdr.e32->e_shoff < sizeof (Elf32_Shdr)))
            /* Cannot read the first section header.  */
            return 0;
 
@@ -192,7 +193,8 @@ get_shnum (void *map_address, unsigned char *e_ident, int fildes, off_t offset,
 
       if (unlikely (result == 0) && ehdr.e64->e_shoff != 0)
        {
-         if (ehdr.e64->e_shoff + sizeof (Elf64_Shdr) > maxsize)
+         if (unlikely (ehdr.e64->e_shoff >= maxsize)
+             || unlikely (ehdr.e64->e_shoff + sizeof (Elf64_Shdr) > maxsize))
            /* Cannot read the first section header.  */
            return 0;
 
@@ -264,6 +266,15 @@ file_read_elf (int fildes, void *map_address, unsigned char *e_ident,
     /* Could not determine the number of sections.  */
     return NULL;
 
+  /* Check for too many sections.  */
+  if (e_ident[EI_CLASS] == ELFCLASS32)
+    {
+      if (scncnt > SIZE_MAX / (sizeof (Elf_Scn) + sizeof (Elf32_Shdr)))
+       return NULL;
+    }
+  else if (scncnt > SIZE_MAX / (sizeof (Elf_Scn) + sizeof (Elf64_Shdr)))
+    return NULL;
+
   /* We can now allocate the memory.  Even if there are no section headers,
      we allocate space for a zeroth section in case we need it later.  */
   const size_t scnmax = (scncnt ?: (cmd == ELF_C_RDWR || cmd == ELF_C_RDWR_MMAP)
@@ -303,6 +314,16 @@ file_read_elf (int fildes, void *map_address, unsigned char *e_ident,
        {
          /* We can use the mmapped memory.  */
          elf->state.elf32.ehdr = ehdr;
+
+         if (unlikely (ehdr->e_shoff >= maxsize)
+             || unlikely (maxsize - ehdr->e_shoff
+                          < scncnt * sizeof (Elf32_Shdr)))
+           {
+           free_and_out:
+             free (elf);
+             __libelf_seterrno (ELF_E_INVALID_FILE);
+             return NULL;
+           }
          elf->state.elf32.shdr
            = (Elf32_Shdr *) ((char *) ehdr + ehdr->e_shoff);
 
@@ -389,6 +410,11 @@ file_read_elf (int fildes, void *map_address, unsigned char *e_ident,
        {
          /* We can use the mmapped memory.  */
          elf->state.elf64.ehdr = ehdr;
+
+         if (unlikely (ehdr->e_shoff >= maxsize)
+             || unlikely (ehdr->e_shoff
+                          + scncnt * sizeof (Elf32_Shdr) > maxsize))
+           goto free_and_out;
          elf->state.elf64.shdr
            = (Elf64_Shdr *) ((char *) ehdr + ehdr->e_shoff);
 
@@ -565,11 +591,6 @@ read_file (int fildes, off_t offset, size_t maxsize,
                  || cmd == ELF_C_WRITE_MMAP
                  || cmd == ELF_C_READ_MMAP_PRIVATE);
 
-#if _MUDFLAP
-  /* Mudflap doesn't grok that our mmap'd data is ok.  */
-  use_mmap = 0;
-#endif
-
   if (use_mmap)
     {
       if (parent == NULL)
index 9e0f4c2..7325190 100644 (file)
@@ -1,5 +1,5 @@
 /* Return symbol table of archive.
-   Copyright (C) 1998-2000, 2002, 2005, 2012 Red Hat, Inc.
+   Copyright (C) 1998-2000, 2002, 2005, 2009, 2012, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 1998.
 
@@ -57,7 +57,9 @@ read_number_entries (uint64_t *nump, Elf *elf, size_t *offp, bool index64_p)
 
   size_t w = index64_p ? 8 : 4;
   if (elf->map_address != NULL)
-    u = *(union u *) (elf->map_address + *offp);
+    /* Use memcpy instead of pointer dereference so as not to assume the
+       field is naturally aligned within the file.  */
+    memcpy (&u, elf->map_address + *offp, sizeof u);
   else if ((size_t) pread_retry (elf->fildes, &u, w, *offp) != w)
     return -1;
 
@@ -181,6 +183,9 @@ elf_getarsym (elf, ptr)
       size_t index_size = atol (tmpbuf);
 
       if (SARMAG + sizeof (struct ar_hdr) + index_size > elf->maximum_size
+#if SIZE_MAX <= 4294967295U
+         || n >= SIZE_MAX / sizeof (Elf_Arsym)
+#endif
          || n * w > index_size)
        {
          /* This index table cannot be right since it does not fit into
@@ -238,6 +243,9 @@ elf_getarsym (elf, ptr)
          else
            {
              file_data = (void *) (elf->map_address + off);
+             if (!ALLOW_UNALIGNED
+                 && ((uintptr_t) file_data & -(uintptr_t) n) != 0)
+               file_data = memcpy (alloca (sz), elf->map_address + off, sz);
              str_data = (char *) (elf->map_address + off + sz);
            }
 
index 57ad800..1dbed4c 100644 (file)
@@ -1,5 +1,5 @@
 /* Return section index of section header string table.
-   Copyright (C) 2002, 2005, 2009 Red Hat, Inc.
+   Copyright (C) 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -104,10 +104,25 @@ elf_getshdrstrndx (elf, dst)
              if (elf->map_address != NULL
                  && elf->state.elf32.ehdr->e_ident[EI_DATA] == MY_ELFDATA
                  && (ALLOW_UNALIGNED
-                     || (((size_t) ((char *) elf->map_address + offset))
+                     || (((size_t) ((char *) elf->map_address
+                          + elf->start_offset + offset))
                          & (__alignof__ (Elf32_Shdr) - 1)) == 0))
-               /* We can directly access the memory.  */
-               num = ((Elf32_Shdr *) (elf->map_address + offset))->sh_link;
+               {
+                 /* First see whether the information in the ELF header is
+                    valid and it does not ask for too much.  */
+                 if (unlikely (elf->maximum_size - offset
+                               < sizeof (Elf32_Shdr)))
+                   {
+                     /* Something is wrong.  */
+                     __libelf_seterrno (ELF_E_INVALID_SECTION_HEADER);
+                     result = -1;
+                     goto out;
+                   }
+
+                 /* We can directly access the memory.  */
+                 num = ((Elf32_Shdr *) (elf->map_address + elf->start_offset
+                                        + offset))->sh_link;
+               }
              else
                {
                  /* We avoid reading in all the section headers.  Just read
@@ -142,10 +157,25 @@ elf_getshdrstrndx (elf, dst)
              if (elf->map_address != NULL
                  && elf->state.elf64.ehdr->e_ident[EI_DATA] == MY_ELFDATA
                  && (ALLOW_UNALIGNED
-                     || (((size_t) ((char *) elf->map_address + offset))
+                     || (((size_t) ((char *) elf->map_address
+                          + elf->start_offset + offset))
                          & (__alignof__ (Elf64_Shdr) - 1)) == 0))
-               /* We can directly access the memory.  */
-               num = ((Elf64_Shdr *) (elf->map_address + offset))->sh_link;
+               {
+                 /* First see whether the information in the ELF header is
+                    valid and it does not ask for too much.  */
+                 if (unlikely (elf->maximum_size - offset
+                               < sizeof (Elf64_Shdr)))
+                   {
+                     /* Something is wrong.  */
+                     __libelf_seterrno (ELF_E_INVALID_SECTION_HEADER);
+                     result = -1;
+                     goto out;
+                   }
+
+                 /* We can directly access the memory.  */
+                 num = ((Elf64_Shdr *) (elf->map_address + elf->start_offset
+                                        + offset))->sh_link;
+               }
              else
                {
                  /* We avoid reading in all the section headers.  Just read
index 70d29b6..6e0029e 100644 (file)
@@ -1,5 +1,5 @@
 /* Append new section.
-   Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 1998.
 
@@ -83,10 +83,18 @@ elf_newscn (elf)
   else
     {
       /* We must allocate a new element.  */
-      Elf_ScnList *newp;
+      Elf_ScnList *newp = NULL;
 
       assert (elf->state.elf.scnincr > 0);
 
+      if (
+#if SIZE_MAX <= 4294967295U
+         likely (elf->state.elf.scnincr
+                 < SIZE_MAX / 2 / sizeof (Elf_Scn) - sizeof (Elf_ScnList))
+#else
+         1
+#endif
+         )
       newp = (Elf_ScnList *) calloc (sizeof (Elf_ScnList)
                                     + ((elf->state.elf.scnincr *= 2)
                                        * sizeof (Elf_Scn)), 1);
index 31ba253..54c20f5 100644 (file)
@@ -69,14 +69,10 @@ write_file (Elf *elf, off_t size, int change_bo, size_t shnum)
   /* Try to map the file if this isn't done yet.  */
   if (elf->map_address == NULL && elf->cmd == ELF_C_WRITE_MMAP)
     {
-#if _MUDFLAP
-      /* Mudflap doesn't grok that our mmap'd data is ok.  */
-#else
       elf->map_address = mmap (NULL, size, PROT_READ | PROT_WRITE,
                               MAP_SHARED, elf->fildes, 0);
       if (unlikely (elf->map_address == MAP_FAILED))
        elf->map_address = NULL;
-#endif
     }
 
   if (elf->map_address != NULL)
index cd33225..e3f0740 100644 (file)
@@ -150,7 +150,7 @@ typedef Elf64_Lib GElf_Lib;
 extern int gelf_getclass (Elf *__elf);
 
 
-/* Return size of array of COUNT elemeents of the type denoted by TYPE
+/* Return size of array of COUNT elements of the type denoted by TYPE
    in the external representation.  The binary class is taken from ELF.
    The result is based on version VERSION of the ELF standard.  */
 extern size_t gelf_fsize (Elf *__elf, Elf_Type __type, size_t __count,
index d87362e..a2f04e7 100644 (file)
@@ -97,7 +97,8 @@ gelf_getauxv (data, ndx, dst)
          goto out;
        }
 
-      *dst = ((GElf_auxv_t *) data_scn->d.d_buf)[ndx];
+      memcpy (dst, data_scn->d.d_buf + ndx * sizeof (GElf_auxv_t),
+             sizeof (GElf_auxv_t));
     }
 
   result = dst;
index 721af62..c366fd5 100644 (file)
@@ -1,5 +1,5 @@
 /* Get information from dynamic table at the given index.
-   Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 2000, 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -72,7 +72,7 @@ gelf_getdyn (data, ndx, dst)
         table entries has to be adopted.  The user better has provided
         a buffer where we can store the information.  While copying the
         data we are converting the format.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf32_Dyn) > data_scn->d.d_size))
+      if (INVALID_NDX (ndx, Elf32_Dyn, &data_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
@@ -93,7 +93,7 @@ gelf_getdyn (data, ndx, dst)
 
       /* The data is already in the correct form.  Just make sure the
         index is OK.  */
-      if (unlikely ((ndx + 1) * sizeof (GElf_Dyn) > data_scn->d.d_size))
+      if (INVALID_NDX (ndx, GElf_Dyn, &data_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
index 9a8a174..880817e 100644 (file)
@@ -1,5 +1,5 @@
 /* Get library from table at the given index.
-   Copyright (C) 2004 Red Hat, Inc.
+   Copyright (C) 2004, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2004.
 
@@ -65,7 +65,7 @@ gelf_getlib (data, ndx, dst)
   /* The data is already in the correct form.  Just make sure the
      index is OK.  */
   GElf_Lib *result = NULL;
-  if (unlikely ((ndx + 1) * sizeof (GElf_Lib) > data->d_size))
+  if (INVALID_NDX (ndx, GElf_Lib, data))
     __libelf_seterrno (ELF_E_INVALID_INDEX);
   else
     {
index 9566930..b81d61f 100644 (file)
@@ -1,5 +1,5 @@
 /* Get move structure at the given index.
-   Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 2000, 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -62,7 +62,7 @@ gelf_getmove (data, ndx, dst)
 
   /* The data is already in the correct form.  Just make sure the
      index is OK.  */
-  if (unlikely ((ndx + 1) * sizeof (GElf_Move) > data->d_size))
+  if (INVALID_NDX (ndx, GElf_Move, data))
     {
       __libelf_seterrno (ELF_E_INVALID_INDEX);
       goto out;
index 78394b4..1f786ff 100644 (file)
@@ -1,5 +1,5 @@
 /* Get REL relocation information at given index.
-   Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 2000, 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -50,12 +50,6 @@ gelf_getrel (data, ndx, dst)
   if (data_scn == NULL)
     return NULL;
 
-  if (unlikely (ndx < 0))
-    {
-      __libelf_seterrno (ELF_E_INVALID_INDEX);
-      return NULL;
-    }
-
   if (unlikely (data_scn->d.d_type != ELF_T_REL))
     {
       __libelf_seterrno (ELF_E_INVALID_HANDLE);
@@ -72,7 +66,7 @@ gelf_getrel (data, ndx, dst)
   if (scn->elf->class == ELFCLASS32)
     {
       /* We have to convert the data.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf32_Rel) > data_scn->d.d_size))
+      if (INVALID_NDX (ndx, Elf32_Rel, &data_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          result = NULL;
@@ -92,7 +86,7 @@ gelf_getrel (data, ndx, dst)
     {
       /* Simply copy the data after we made sure we are actually getting
         correct data.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf64_Rel) > data_scn->d.d_size))
+      if (INVALID_NDX (ndx, Elf64_Rel, &data_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          result = NULL;
index 1d0e7ee..cead7ee 100644 (file)
@@ -1,5 +1,5 @@
 /* Get RELA relocation information at given index.
-   Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 2000, 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -50,12 +50,6 @@ gelf_getrela (data, ndx, dst)
   if (data_scn == NULL)
     return NULL;
 
-  if (unlikely (ndx < 0))
-    {
-      __libelf_seterrno (ELF_E_INVALID_INDEX);
-      return NULL;
-    }
-
   if (unlikely (data_scn->d.d_type != ELF_T_RELA))
     {
       __libelf_seterrno (ELF_E_INVALID_HANDLE);
@@ -72,7 +66,7 @@ gelf_getrela (data, ndx, dst)
   if (scn->elf->class == ELFCLASS32)
     {
       /* We have to convert the data.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf32_Rela) > data_scn->d.d_size))
+      if (INVALID_NDX (ndx, Elf32_Rela, &data_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          result = NULL;
@@ -93,7 +87,7 @@ gelf_getrela (data, ndx, dst)
     {
       /* Simply copy the data after we made sure we are actually getting
         correct data.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf64_Rela) > data_scn->d.d_size))
+      if (INVALID_NDX (ndx, Elf64_Rela, &data_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          result = NULL;
index 183872e..a141c2d 100644 (file)
@@ -1,5 +1,5 @@
 /* Get symbol information from symbol table at the given index.
-   Copyright (C) 1999, 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 1999, 2000, 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 1999.
 
@@ -69,7 +69,7 @@ gelf_getsym (data, ndx, dst)
         table entries has to be adopted.  The user better has provided
         a buffer where we can store the information.  While copying the
         data we are converting the format.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf32_Sym) > data->d_size))
+      if (INVALID_NDX (ndx, Elf32_Sym, data))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
@@ -98,7 +98,7 @@ gelf_getsym (data, ndx, dst)
 
       /* The data is already in the correct form.  Just make sure the
         index is OK.  */
-      if (unlikely ((ndx + 1) * sizeof (GElf_Sym) > data->d_size))
+      if (INVALID_NDX (ndx, GElf_Sym, data))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
index 09c9cee..8d7da7f 100644 (file)
@@ -1,5 +1,5 @@
 /* Get additional symbol information from symbol table at the given index.
-   Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 2000, 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -63,7 +63,7 @@ gelf_getsyminfo (data, ndx, dst)
 
   /* The data is already in the correct form.  Just make sure the
      index is OK.  */
-  if (unlikely ((ndx + 1) * sizeof (GElf_Syminfo) > data->d_size))
+  if (INVALID_NDX (ndx, GElf_Syminfo, data))
     {
       __libelf_seterrno (ELF_E_INVALID_INDEX);
       goto out;
index 91e1bf6..c19e876 100644 (file)
@@ -1,6 +1,6 @@
 /* Get symbol information and separate section index from symbol table
    at the given index.
-   Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 2000, 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -69,7 +69,7 @@ gelf_getsymshndx (symdata, shndxdata, ndx, dst, dstshndx)
      section index table.  */
   if (likely (shndxdata_scn != NULL))
     {
-      if (unlikely ((ndx + 1) * sizeof (Elf32_Word) > shndxdata_scn->d.d_size))
+      if (INVALID_NDX (ndx, Elf32_Word, &shndxdata_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
@@ -89,7 +89,7 @@ gelf_getsymshndx (symdata, shndxdata, ndx, dst, dstshndx)
         table entries has to be adopted.  The user better has provided
         a buffer where we can store the information.  While copying the
         data we are converting the format.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf32_Sym) > symdata->d_size))
+      if (INVALID_NDX (ndx, Elf32_Sym, symdata))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
@@ -118,7 +118,7 @@ gelf_getsymshndx (symdata, shndxdata, ndx, dst, dstshndx)
 
       /* The data is already in the correct form.  Just make sure the
         index is OK.  */
-      if (unlikely ((ndx + 1) * sizeof (GElf_Sym) > symdata->d_size))
+      if (INVALID_NDX (ndx, GElf_Sym, symdata))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
index 9e80efc..fe8dc62 100644 (file)
@@ -1,5 +1,5 @@
 /* Get symbol version information at the given index.
-   Copyright (C) 1999, 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 1999, 2000, 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 1999.
 
@@ -71,7 +71,7 @@ gelf_getversym (data, ndx, dst)
 
   /* The data is already in the correct form.  Just make sure the
      index is OK.  */
-  if (unlikely ((ndx + 1) * sizeof (GElf_Versym) > data->d_size))
+  if (INVALID_NDX (ndx, GElf_Versym, data))
     {
       __libelf_seterrno (ELF_E_INVALID_INDEX);
       result = NULL;
index 94408c8..2eb526e 100644 (file)
@@ -1,5 +1,5 @@
 /* Update information in dynamic table at the given index.
-   Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 2000, 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -50,12 +50,6 @@ gelf_update_dyn (data, ndx, src)
   if (data == NULL)
     return 0;
 
-  if (unlikely (ndx < 0))
-    {
-      __libelf_seterrno (ELF_E_INVALID_INDEX);
-      return 0;
-    }
-
   if (unlikely (data_scn->d.d_type != ELF_T_DYN))
     {
       /* The type of the data better should match.  */
@@ -81,7 +75,7 @@ gelf_update_dyn (data, ndx, src)
        }
 
       /* Check whether we have to resize the data buffer.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf32_Dyn) > data_scn->d.d_size))
+      if (INVALID_NDX (ndx, Elf32_Dyn, &data_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
@@ -95,7 +89,7 @@ gelf_update_dyn (data, ndx, src)
   else
     {
       /* Check whether we have to resize the data buffer.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf64_Dyn) > data_scn->d.d_size))
+      if (INVALID_NDX (ndx, Elf64_Dyn, &data_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
index 4700bef..1c8c23d 100644 (file)
@@ -1,5 +1,5 @@
 /* Update library in table at the given index.
-   Copyright (C) 2004 Red Hat, Inc.
+   Copyright (C) 2004, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2004.
 
@@ -47,12 +47,6 @@ gelf_update_lib (data, ndx, src)
   if (data == NULL)
     return 0;
 
-  if (unlikely (ndx < 0))
-    {
-      __libelf_seterrno (ELF_E_INVALID_INDEX);
-      return 0;
-    }
-
   Elf_Data_Scn *data_scn = (Elf_Data_Scn *) data;
   if (unlikely (data_scn->d.d_type != ELF_T_LIB))
     {
@@ -66,7 +60,7 @@ gelf_update_lib (data, ndx, src)
 
   /* Check whether we have to resize the data buffer.  */
   int result = 0;
-  if (unlikely ((ndx + 1) * sizeof (Elf64_Lib) > data_scn->d.d_size))
+  if (INVALID_NDX (ndx, Elf64_Lib, &data_scn->d))
     __libelf_seterrno (ELF_E_INVALID_INDEX);
   else
     {
index 102a45b..ad2ca6a 100644 (file)
@@ -1,5 +1,5 @@
 /* Update move structure at the given index.
-   Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 2000, 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -54,8 +54,7 @@ gelf_update_move (data, ndx, src)
   assert (sizeof (GElf_Move) == sizeof (Elf64_Move));
 
   /* Check whether we have to resize the data buffer.  */
-  if (unlikely (ndx < 0)
-      || unlikely ((ndx + 1) * sizeof (GElf_Move) > data_scn->d.d_size))
+  if (INVALID_NDX (ndx, GElf_Move, &data_scn->d))
     {
       __libelf_seterrno (ELF_E_INVALID_INDEX);
       return 0;
index d13e402..14f62e9 100644 (file)
@@ -1,5 +1,5 @@
 /* Update REL relocation information at given index.
-   Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 2000, 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -47,12 +47,6 @@ gelf_update_rel (Elf_Data *dst, int ndx, GElf_Rel *src)
   if (dst == NULL)
     return 0;
 
-  if (unlikely (ndx < 0))
-    {
-      __libelf_seterrno (ELF_E_INVALID_INDEX);
-      return 0;
-    }
-
   if (unlikely (data_scn->d.d_type != ELF_T_REL))
     {
       /* The type of the data better should match.  */
@@ -78,7 +72,7 @@ gelf_update_rel (Elf_Data *dst, int ndx, GElf_Rel *src)
        }
 
       /* Check whether we have to resize the data buffer.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf32_Rel) > data_scn->d.d_size))
+      if (INVALID_NDX (ndx, Elf32_Rel, &data_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
@@ -93,7 +87,7 @@ gelf_update_rel (Elf_Data *dst, int ndx, GElf_Rel *src)
   else
     {
       /* Check whether we have to resize the data buffer.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf64_Rel) > data_scn->d.d_size))
+      if (INVALID_NDX (ndx, Elf64_Rel, &data_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
index cc70297..8825270 100644 (file)
@@ -1,5 +1,5 @@
 /* Update RELA relocation information at given index.
-   Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 2000, 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -47,12 +47,6 @@ gelf_update_rela (Elf_Data *dst, int ndx, GElf_Rela *src)
   if (dst == NULL)
     return 0;
 
-  if (unlikely (ndx < 0))
-    {
-      __libelf_seterrno (ELF_E_INVALID_INDEX);
-      return 0;
-    }
-
   if (unlikely (data_scn->d.d_type != ELF_T_RELA))
     {
       /* The type of the data better should match.  */
@@ -80,7 +74,7 @@ gelf_update_rela (Elf_Data *dst, int ndx, GElf_Rela *src)
        }
 
       /* Check whether we have to resize the data buffer.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf32_Rela) > data_scn->d.d_size))
+      if (INVALID_NDX (ndx, Elf32_Rela, &data_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
@@ -96,7 +90,7 @@ gelf_update_rela (Elf_Data *dst, int ndx, GElf_Rela *src)
   else
     {
       /* Check whether we have to resize the data buffer.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf64_Rela) > data_scn->d.d_size))
+      if (INVALID_NDX (ndx, Elf64_Rela, &data_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
index ab37641..278129c 100644 (file)
@@ -1,5 +1,5 @@
 /* Update symbol information in symbol table at the given index.
-   Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 2000, 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -51,12 +51,6 @@ gelf_update_sym (data, ndx, src)
   if (data == NULL)
     return 0;
 
-  if (unlikely (ndx < 0))
-    {
-      __libelf_seterrno (ELF_E_INVALID_INDEX);
-      return 0;
-    }
-
   if (unlikely (data_scn->d.d_type != ELF_T_SYM))
     {
       /* The type of the data better should match.  */
@@ -81,7 +75,7 @@ gelf_update_sym (data, ndx, src)
        }
 
       /* Check whether we have to resize the data buffer.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf32_Sym) > data_scn->d.d_size))
+      if (INVALID_NDX (ndx, Elf32_Sym, &data_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
@@ -104,7 +98,7 @@ gelf_update_sym (data, ndx, src)
   else
     {
       /* Check whether we have to resize the data buffer.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf64_Sym) > data_scn->d.d_size))
+      if (INVALID_NDX (ndx, Elf64_Sym, &data_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
index 5654a0d..640a1ed 100644 (file)
@@ -1,5 +1,5 @@
 /* Update additional symbol information in symbol table at the given index.
-   Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 2000, 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -51,12 +51,6 @@ gelf_update_syminfo (data, ndx, src)
   if (data == NULL)
     return 0;
 
-  if (unlikely (ndx < 0))
-    {
-      __libelf_seterrno (ELF_E_INVALID_INDEX);
-      return 0;
-    }
-
   if (unlikely (data_scn->d.d_type != ELF_T_SYMINFO))
     {
       /* The type of the data better should match.  */
@@ -72,7 +66,7 @@ gelf_update_syminfo (data, ndx, src)
   rwlock_wrlock (scn->elf->lock);
 
   /* Check whether we have to resize the data buffer.  */
-  if (unlikely ((ndx + 1) * sizeof (GElf_Syminfo) > data_scn->d.d_size))
+  if (INVALID_NDX (ndx, GElf_Syminfo, &data_scn->d))
     {
       __libelf_seterrno (ELF_E_INVALID_INDEX);
       goto out;
index d2bb5bb..5e2c7f7 100644 (file)
@@ -1,6 +1,6 @@
 /* Update symbol information and section index in symbol table at the
    given index.
-   Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+   Copyright (C) 2000, 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -56,12 +56,6 @@ gelf_update_symshndx (symdata, shndxdata, ndx, src, srcshndx)
   if (symdata == NULL)
     return 0;
 
-  if (unlikely (ndx < 0))
-    {
-      __libelf_seterrno (ELF_E_INVALID_INDEX);
-      return 0;
-    }
-
   if (unlikely (symdata_scn->d.d_type != ELF_T_SYM))
     {
       /* The type of the data better should match.  */
@@ -107,7 +101,7 @@ gelf_update_symshndx (symdata, shndxdata, ndx, src, srcshndx)
        }
 
       /* Check whether we have to resize the data buffer.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf32_Sym) > symdata_scn->d.d_size))
+      if (INVALID_NDX (ndx, Elf32_Sym, &symdata_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
@@ -130,7 +124,7 @@ gelf_update_symshndx (symdata, shndxdata, ndx, src, srcshndx)
   else
     {
       /* Check whether we have to resize the data buffer.  */
-      if (unlikely ((ndx + 1) * sizeof (Elf64_Sym) > symdata_scn->d.d_size))
+      if (INVALID_NDX (ndx, Elf64_Sym, &symdata_scn->d))
        {
          __libelf_seterrno (ELF_E_INVALID_INDEX);
          goto out;
index a4cec1f..03a3c5a 100644 (file)
@@ -1,5 +1,5 @@
 /* Update symbol version information.
-   Copyright (C) 2001, 2002 Red Hat, Inc.
+   Copyright (C) 2001, 2002, 2005, 2009, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2001.
 
@@ -54,8 +54,7 @@ gelf_update_versym (data, ndx, src)
   assert (sizeof (GElf_Versym) == sizeof (Elf64_Versym));
 
   /* Check whether we have to resize the data buffer.  */
-  if (unlikely (ndx < 0)
-      || unlikely ((ndx + 1) * sizeof (GElf_Versym) > data_scn->d.d_size))
+  if (INVALID_NDX (ndx, GElf_Versym, &data_scn->d))
     {
       __libelf_seterrno (ELF_E_INVALID_INDEX);
       return 0;
index 7da2370..52cf745 100644 (file)
@@ -587,4 +587,8 @@ extern uint32_t __libelf_crc32 (uint32_t crc, unsigned char *buf, size_t len)
 /* Align offset to 4 bytes as needed for note name and descriptor data.  */
 #define NOTE_ALIGN(n)  (((n) + 3) & -4U)
 
+/* Convenience macro.  */
+#define INVALID_NDX(ndx, type, data) \
+  unlikely ((data)->d_size / sizeof (type) <= (unsigned int) (ndx))
+
 #endif  /* libelfP.h */
index d4f2bc1..163ee73 100644 (file)
@@ -1,3 +1,23 @@
+2014-07-14  Mark Wielaard  <mjw@redhat.com>
+
+       * biarch.m4 (utrace_BIARCH): Set biarch-no for cross-compile using
+       AC_RUN_IFELSE extra argument.
+
+2013-12-02  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * biarch.m4 (utrace_BIARCH): Call AC_MSG_WARN if !BIARCH.
+
+2013-11-07  Roland McGrath  <roland@redhat.com>
+           Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * biarch.m4: New file.
+
+2013-04-24  Mark Wielaard  <mjw@redhat.com>
+
+       * gettext.m4: Upgrade to gettext-0.18.2.
+       * iconv.m4: Upgrade to gettext-0.18.2.
+       * po.m4: Upgrade to gettext-0.18.2.
+
 2010-04-14  Roland McGrath  <roland@redhat.com>
 
        * gettext.m4: Upgrade to gettext-0.17.
index b00c01e..d081f9e 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 @SET_MAKE@
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -34,9 +78,10 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 subdir = m4
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ChangeLog
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
        $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/zip.m4 \
        $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
@@ -45,18 +90,40 @@ mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 SOURCES =
 DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
+CC_BIARCH = @CC_BIARCH@
 CFLAGS = @CFLAGS@
+CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEBUGPRED = @DEBUGPRED@
@@ -65,10 +132,13 @@ DEPDIR = @DEPDIR@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_VALGRIND = @HAVE_VALGRIND@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -89,6 +159,7 @@ MODVERSION = @MODVERSION@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
+NM = @NM@
 OBJEXT = @OBJEXT@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -99,6 +170,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+READELF = @READELF@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
@@ -113,6 +185,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -196,11 +269,11 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
-tags: TAGS
-TAGS:
+tags TAGS:
+
+ctags CTAGS:
 
-ctags: CTAGS
-CTAGS:
+cscope cscopelist:
 
 
 distdir: $(DISTFILES)
@@ -335,15 +408,16 @@ uninstall-am:
 
 .MAKE: install-am install-strip
 
-.PHONY: all all-am check check-am clean clean-generic distclean \
-       distclean-generic distdir dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am install-dvi \
-       install-dvi-am install-exec install-exec-am install-html \
-       install-html-am install-info install-info-am install-man \
-       install-pdf install-pdf-am install-ps install-ps-am \
-       install-strip installcheck installcheck-am installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
-       mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am
+.PHONY: all all-am check check-am clean clean-generic cscopelist-am \
+       ctags-am distclean distclean-generic distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-dvi install-dvi-am install-exec \
+       install-exec-am install-html install-html-am install-info \
+       install-info-am install-man install-pdf install-pdf-am \
+       install-ps install-ps-am install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+       pdf-am ps ps-am tags-am uninstall uninstall-am
 
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/m4/biarch.m4 b/m4/biarch.m4
new file mode 100644 (file)
index 0000000..c238d8d
--- /dev/null
@@ -0,0 +1,47 @@
+AC_DEFUN([utrace_CC_m32], [dnl
+AC_CACHE_CHECK([$CC option for 32-bit word size], utrace_cv_CC_m32, [dnl
+save_CC="$CC"
+utrace_cv_CC_m32=none
+for ut_try in -m32 -m31; do
+  [CC=`echo "$save_CC" | sed 's/ -m[36][241]//'`" $ut_try"]
+  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int foo (void) { return 1; }]])],
+                   [utrace_cv_CC_m32=$ut_try])
+  test x$utrace_cv_CC_m32 = xnone || break
+done
+CC="$save_CC"])])
+
+AC_DEFUN([utrace_HOST64], [AC_REQUIRE([utrace_CC_m32])
+AS_IF([test x$utrace_cv_CC_m32 != xnone], [dnl
+AC_CACHE_CHECK([for 64-bit host], utrace_cv_host64, [dnl
+AC_EGREP_CPP([@utrace_host64@], [#include <stdint.h>
+#if (UINTPTR_MAX > 0xffffffffUL)
+@utrace_host64@
+#endif],
+             utrace_cv_host64=yes, utrace_cv_host64=no)])
+AS_IF([test $utrace_cv_host64 = no],
+      [utrace_biarch=-m64 utrace_thisarch=$utrace_cv_CC_m32],
+      [utrace_biarch=$utrace_cv_CC_m32 utrace_thisarch=-m64])
+
+biarch_CC=`echo "$CC" | sed "s/ *${utrace_thisarch}//"`
+biarch_CC="$biarch_CC $utrace_biarch"])])
+
+AC_DEFUN([utrace_BIARCH], [AC_REQUIRE([utrace_HOST64])
+utrace_biarch_forced=no
+AC_ARG_WITH([biarch],
+           AC_HELP_STRING([--with-biarch],
+                          [enable biarch tests despite build problems]),
+           [AS_IF([test "x$with_biarch" != xno], [utrace_biarch_forced=yes])])
+AS_IF([test $utrace_biarch_forced = yes], [dnl
+utrace_cv_cc_biarch=yes
+AC_MSG_NOTICE([enabling biarch tests regardless using $biarch_CC])], [dnl
+AS_IF([test x$utrace_cv_CC_m32 != xnone], [dnl
+AC_CACHE_CHECK([whether $biarch_CC makes executables we can run],
+              utrace_cv_cc_biarch, [dnl
+save_CC="$CC"
+CC="$biarch_CC"
+AC_RUN_IFELSE([AC_LANG_PROGRAM([], [])],
+             utrace_cv_cc_biarch=yes, utrace_cv_cc_biarch=no, utrace_cv_cc_biarch=no)
+CC="$save_CC"])], [utrace_cv_cc_biarch=no])
+AS_IF([test $utrace_cv_cc_biarch != yes], [dnl
+AC_MSG_WARN([not running biarch tests, $biarch_CC does not work])])])
+AM_CONDITIONAL(BIARCH, [test $utrace_cv_cc_biarch = yes])])
index c9ae1f7..8d1f066 100644 (file)
@@ -1,5 +1,5 @@
-# gettext.m4 serial 60 (gettext-0.17)
-dnl Copyright (C) 1995-2007 Free Software Foundation, Inc.
+# gettext.m4 serial 66 (gettext-0.18.2)
+dnl Copyright (C) 1995-2013 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -15,7 +15,7 @@ dnl They are *not* in the public domain.
 
 dnl Authors:
 dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
-dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2006.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2006, 2008-2010.
 
 dnl Macro to add for using GNU gettext.
 
@@ -35,7 +35,7 @@ dnl    will be ignored.  If NEEDSYMBOL is specified and is
 dnl    'need-formatstring-macros', then GNU gettext implementations that don't
 dnl    support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
 dnl INTLDIR is used to find the intl libraries.  If empty,
-dnl    the value `$(top_builddir)/intl/' is used.
+dnl    the value '$(top_builddir)/intl/' is used.
 dnl
 dnl The result of the configuration is one of three cases:
 dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
@@ -60,6 +60,8 @@ AC_DEFUN([AM_GNU_GETTEXT],
   ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
     [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
 ])])])])])
+  ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old],
+    [AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])])
   ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
     [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
 ])])])])
@@ -95,7 +97,7 @@ AC_DEFUN([AM_GNU_GETTEXT],
     AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
   ])
 
-  dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation.
+  dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation.
   gt_INTL_MACOSX
 
   dnl Set USE_NLS.
@@ -123,11 +125,11 @@ AC_DEFUN([AM_GNU_GETTEXT],
     gt_use_preinstalled_gnugettext=no
     ifelse(gt_included_intl, yes, [
       AC_MSG_CHECKING([whether included gettext is requested])
-      AC_ARG_WITH(included-gettext,
+      AC_ARG_WITH([included-gettext],
         [  --with-included-gettext use the GNU gettext library included here],
         nls_cv_force_use_gnu_gettext=$withval,
         nls_cv_force_use_gnu_gettext=no)
-      AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
+      AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext])
 
       nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
       if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
@@ -155,12 +157,18 @@ changequote([,])dnl
         fi
 
         AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc],
-         [AC_TRY_LINK([#include <libintl.h>
+         [AC_LINK_IFELSE(
+            [AC_LANG_PROGRAM(
+               [[
+#include <libintl.h>
 $gt_revision_test_code
 extern int _nl_msg_cat_cntr;
-extern int *_nl_domain_bindings;],
-            [bindtextdomain ("", "");
-return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings],
+extern int *_nl_domain_bindings;
+               ]],
+               [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings
+               ]])],
             [eval "$gt_func_gnugettext_libc=yes"],
             [eval "$gt_func_gnugettext_libc=no"])])
 
@@ -181,35 +189,47 @@ return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_b
             gt_save_LIBS="$LIBS"
             LIBS="$LIBS $LIBINTL"
             dnl Now see whether libintl exists and does not depend on libiconv.
-            AC_TRY_LINK([#include <libintl.h>
+            AC_LINK_IFELSE(
+              [AC_LANG_PROGRAM(
+                 [[
+#include <libintl.h>
 $gt_revision_test_code
 extern int _nl_msg_cat_cntr;
 extern
 #ifdef __cplusplus
 "C"
 #endif
-const char *_nl_expand_alias (const char *);],
-              [bindtextdomain ("", "");
-return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")],
+const char *_nl_expand_alias (const char *);
+                 ]],
+                 [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+                 ]])],
               [eval "$gt_func_gnugettext_libintl=yes"],
               [eval "$gt_func_gnugettext_libintl=no"])
             dnl Now see whether libintl exists and depends on libiconv.
             if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
               LIBS="$LIBS $LIBICONV"
-              AC_TRY_LINK([#include <libintl.h>
+              AC_LINK_IFELSE(
+                [AC_LANG_PROGRAM(
+                   [[
+#include <libintl.h>
 $gt_revision_test_code
 extern int _nl_msg_cat_cntr;
 extern
 #ifdef __cplusplus
 "C"
 #endif
-const char *_nl_expand_alias (const char *);],
-                [bindtextdomain ("", "");
-return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")],
-               [LIBINTL="$LIBINTL $LIBICONV"
-                LTLIBINTL="$LTLIBINTL $LTLIBICONV"
-                eval "$gt_func_gnugettext_libintl=yes"
-               ])
+const char *_nl_expand_alias (const char *);
+                   ]],
+                   [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+                   ]])],
+                [LIBINTL="$LIBINTL $LIBICONV"
+                 LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+                 eval "$gt_func_gnugettext_libintl=yes"
+                ])
             fi
             CPPFLAGS="$gt_save_CPPFLAGS"
             LIBS="$gt_save_LIBS"])
@@ -267,7 +287,7 @@ return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_a
 
     if test "$gt_use_preinstalled_gnugettext" = "yes" \
        || test "$nls_cv_use_gnu_gettext" = "yes"; then
-      AC_DEFINE(ENABLE_NLS, 1,
+      AC_DEFINE([ENABLE_NLS], [1],
         [Define to 1 if translation of program messages to the user's native language
    is requested.])
     else
@@ -301,9 +321,9 @@ return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_a
       fi
 
       dnl For backward compatibility. Some packages may be using this.
-      AC_DEFINE(HAVE_GETTEXT, 1,
+      AC_DEFINE([HAVE_GETTEXT], [1],
        [Define if the GNU gettext() function is already present or preinstalled.])
-      AC_DEFINE(HAVE_DCGETTEXT, 1,
+      AC_DEFINE([HAVE_DCGETTEXT], [1],
        [Define if the GNU dcgettext() function is already present or preinstalled.])
     fi
 
@@ -319,9 +339,9 @@ return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_a
     fi
 
     dnl Make all variables we use known to autoconf.
-    AC_SUBST(BUILD_INCLUDED_LIBINTL)
-    AC_SUBST(USE_INCLUDED_LIBINTL)
-    AC_SUBST(CATOBJEXT)
+    AC_SUBST([BUILD_INCLUDED_LIBINTL])
+    AC_SUBST([USE_INCLUDED_LIBINTL])
+    AC_SUBST([CATOBJEXT])
 
     dnl For backward compatibility. Some configure.ins may be using this.
     nls_cv_header_intl=
@@ -329,36 +349,36 @@ return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_a
 
     dnl For backward compatibility. Some Makefiles may be using this.
     DATADIRNAME=share
-    AC_SUBST(DATADIRNAME)
+    AC_SUBST([DATADIRNAME])
 
     dnl For backward compatibility. Some Makefiles may be using this.
     INSTOBJEXT=.mo
-    AC_SUBST(INSTOBJEXT)
+    AC_SUBST([INSTOBJEXT])
 
     dnl For backward compatibility. Some Makefiles may be using this.
     GENCAT=gencat
-    AC_SUBST(GENCAT)
+    AC_SUBST([GENCAT])
 
     dnl For backward compatibility. Some Makefiles may be using this.
     INTLOBJS=
     if test "$USE_INCLUDED_LIBINTL" = yes; then
       INTLOBJS="\$(GETTOBJS)"
     fi
-    AC_SUBST(INTLOBJS)
+    AC_SUBST([INTLOBJS])
 
     dnl Enable libtool support if the surrounding package wishes it.
     INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
-    AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX)
+    AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX])
   ])
 
   dnl For backward compatibility. Some Makefiles may be using this.
   INTLLIBS="$LIBINTL"
-  AC_SUBST(INTLLIBS)
+  AC_SUBST([INTLLIBS])
 
   dnl Make all documented variables known to autoconf.
-  AC_SUBST(LIBINTL)
-  AC_SUBST(LTLIBINTL)
-  AC_SUBST(POSUB)
+  AC_SUBST([LIBINTL])
+  AC_SUBST([LTLIBINTL])
+  AC_SUBST([POSUB])
 ])
 
 
index 66bc76f..a503646 100644 (file)
@@ -1,5 +1,5 @@
-# iconv.m4 serial AM6 (gettext-0.17)
-dnl Copyright (C) 2000-2002, 2007 Free Software Foundation, Inc.
+# iconv.m4 serial 18 (gettext-0.18.2)
+dnl Copyright (C) 2000-2002, 2007-2013 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -30,44 +30,55 @@ AC_DEFUN([AM_ICONV_LINK],
   dnl Add $INCICONV to CPPFLAGS before performing the following checks,
   dnl because if the user has installed libiconv and not disabled its use
   dnl via --without-libiconv-prefix, he wants to use it. The first
-  dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed.
+  dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed.
   am_save_CPPFLAGS="$CPPFLAGS"
   AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
 
-  AC_CACHE_CHECK([for iconv], am_cv_func_iconv, [
+  AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [
     am_cv_func_iconv="no, consider installing GNU libiconv"
     am_cv_lib_iconv=no
-    AC_TRY_LINK([#include <stdlib.h>
-#include <iconv.h>],
-      [iconv_t cd = iconv_open("","");
-       iconv(cd,NULL,NULL,NULL,NULL);
-       iconv_close(cd);],
-      am_cv_func_iconv=yes)
+    AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM(
+         [[
+#include <stdlib.h>
+#include <iconv.h>
+         ]],
+         [[iconv_t cd = iconv_open("","");
+           iconv(cd,NULL,NULL,NULL,NULL);
+           iconv_close(cd);]])],
+      [am_cv_func_iconv=yes])
     if test "$am_cv_func_iconv" != yes; then
       am_save_LIBS="$LIBS"
       LIBS="$LIBS $LIBICONV"
-      AC_TRY_LINK([#include <stdlib.h>
-#include <iconv.h>],
-        [iconv_t cd = iconv_open("","");
-         iconv(cd,NULL,NULL,NULL,NULL);
-         iconv_close(cd);],
-        am_cv_lib_iconv=yes
-        am_cv_func_iconv=yes)
+      AC_LINK_IFELSE(
+        [AC_LANG_PROGRAM(
+           [[
+#include <stdlib.h>
+#include <iconv.h>
+           ]],
+           [[iconv_t cd = iconv_open("","");
+             iconv(cd,NULL,NULL,NULL,NULL);
+             iconv_close(cd);]])],
+        [am_cv_lib_iconv=yes]
+        [am_cv_func_iconv=yes])
       LIBS="$am_save_LIBS"
     fi
   ])
   if test "$am_cv_func_iconv" = yes; then
-    AC_CACHE_CHECK([for working iconv], am_cv_func_iconv_works, [
-      dnl This tests against bugs in AIX 5.1 and HP-UX 11.11.
+    AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [
+      dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11,
+      dnl Solaris 10.
       am_save_LIBS="$LIBS"
       if test $am_cv_lib_iconv = yes; then
         LIBS="$LIBS $LIBICONV"
       fi
-      AC_TRY_RUN([
+      AC_RUN_IFELSE(
+        [AC_LANG_SOURCE([[
 #include <iconv.h>
 #include <string.h>
 int main ()
 {
+  int result = 0;
   /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
      returns.  */
   {
@@ -84,7 +95,47 @@ int main ()
                             (char **) &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if (res == 0)
-          return 1;
+          result |= 1;
+        iconv_close (cd_utf8_to_88591);
+      }
+  }
+  /* Test against Solaris 10 bug: Failures are not distinguishable from
+     successful returns.  */
+  {
+    iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+    if (cd_ascii_to_88591 != (iconv_t)(-1))
+      {
+        static const char input[] = "\263";
+        char buf[10];
+        const char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_ascii_to_88591,
+                            (char **) &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          result |= 2;
+        iconv_close (cd_ascii_to_88591);
+      }
+  }
+  /* Test against AIX 6.1..7.1 bug: Buffer overrun.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static const char input[] = "\304";
+        static char buf[2] = { (char)0xDE, (char)0xAD };
+        const char *inptr = input;
+        size_t inbytesleft = 1;
+        char *outptr = buf;
+        size_t outbytesleft = 1;
+        size_t res = iconv (cd_88591_to_utf8,
+                            (char **) &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+          result |= 4;
+        iconv_close (cd_88591_to_utf8);
       }
   }
 #if 0 /* This bug could be worked around by the caller.  */
@@ -103,7 +154,8 @@ int main ()
                             (char **) &inptr, &inbytesleft,
                             &outptr, &outbytesleft);
         if ((int)res > 0)
-          return 1;
+          result |= 8;
+        iconv_close (cd_88591_to_utf8);
       }
   }
 #endif
@@ -117,13 +169,19 @@ int main ()
       && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
       /* Try HP-UX names.  */
       && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
-    return 1;
-  return 0;
-}], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no],
-        [case "$host_os" in
+    result |= 16;
+  return result;
+}]])],
+        [am_cv_func_iconv_works=yes],
+        [am_cv_func_iconv_works=no],
+        [
+changequote(,)dnl
+         case "$host_os" in
            aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
            *)            am_cv_func_iconv_works="guessing yes" ;;
-         esac])
+         esac
+changequote([,])dnl
+        ])
       LIBS="$am_save_LIBS"
     ])
     case "$am_cv_func_iconv_works" in
@@ -134,7 +192,7 @@ int main ()
     am_func_iconv=no am_cv_lib_iconv=no
   fi
   if test "$am_func_iconv" = yes; then
-    AC_DEFINE(HAVE_ICONV, 1,
+    AC_DEFINE([HAVE_ICONV], [1],
       [Define if you have the iconv() function and it works.])
   fi
   if test "$am_cv_lib_iconv" = yes; then
@@ -147,34 +205,64 @@ int main ()
     LIBICONV=
     LTLIBICONV=
   fi
-  AC_SUBST(LIBICONV)
-  AC_SUBST(LTLIBICONV)
+  AC_SUBST([LIBICONV])
+  AC_SUBST([LTLIBICONV])
 ])
 
-AC_DEFUN([AM_ICONV],
+dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to
+dnl avoid warnings like
+dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required".
+dnl This is tricky because of the way 'aclocal' is implemented:
+dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN.
+dnl   Otherwise aclocal's initial scan pass would miss the macro definition.
+dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions.
+dnl   Otherwise aclocal would emit many "Use of uninitialized value $1"
+dnl   warnings.
+m4_define([gl_iconv_AC_DEFUN],
+  m4_version_prereq([2.64],
+    [[AC_DEFUN_ONCE(
+        [$1], [$2])]],
+    [m4_ifdef([gl_00GNULIB],
+       [[AC_DEFUN_ONCE(
+           [$1], [$2])]],
+       [[AC_DEFUN(
+           [$1], [$2])]])]))
+gl_iconv_AC_DEFUN([AM_ICONV],
 [
   AM_ICONV_LINK
   if test "$am_cv_func_iconv" = yes; then
     AC_MSG_CHECKING([for iconv declaration])
-    AC_CACHE_VAL(am_cv_proto_iconv, [
-      AC_TRY_COMPILE([
+    AC_CACHE_VAL([am_cv_proto_iconv], [
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM(
+           [[
 #include <stdlib.h>
 #include <iconv.h>
 extern
 #ifdef __cplusplus
 "C"
 #endif
-#if defined(__STDC__) || defined(__cplusplus)
+#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus)
 size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
 #else
 size_t iconv();
 #endif
-], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
+           ]],
+           [[]])],
+        [am_cv_proto_iconv_arg1=""],
+        [am_cv_proto_iconv_arg1="const"])
       am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
     am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
-    AC_MSG_RESULT([$]{ac_t:-
-         }[$]am_cv_proto_iconv)
-    AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
+    AC_MSG_RESULT([
+         $am_cv_proto_iconv])
+    AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
       [Define as const if the declaration of iconv() needs const.])
+    dnl Also substitute ICONV_CONST in the gnulib generated <iconv.h>.
+    m4_ifdef([gl_ICONV_H_DEFAULTS],
+      [AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+       if test -n "$am_cv_proto_iconv_arg1"; then
+         ICONV_CONST="const"
+       fi
+      ])
   fi
 ])
index 0734762..f395723 100644 (file)
--- a/m4/po.m4
+++ b/m4/po.m4
@@ -1,5 +1,5 @@
-# po.m4 serial 15 (gettext-0.17)
-dnl Copyright (C) 1995-2007 Free Software Foundation, Inc.
+# po.m4 serial 20 (gettext-0.18.2)
+dnl Copyright (C) 1995-2013 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -17,19 +17,19 @@ dnl Authors:
 dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
 dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
 
-AC_PREREQ(2.50)
+AC_PREREQ([2.60])
 
 dnl Checks for all prerequisites of the po subdirectory.
 AC_DEFUN([AM_PO_SUBDIRS],
 [
   AC_REQUIRE([AC_PROG_MAKE_SET])dnl
   AC_REQUIRE([AC_PROG_INSTALL])dnl
-  AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake
+  AC_REQUIRE([AC_PROG_MKDIR_P])dnl
   AC_REQUIRE([AM_NLS])dnl
 
   dnl Release version of the gettext macros. This is used to ensure that
   dnl the gettext macros and po/Makefile.in.in are in sync.
-  AC_SUBST([GETTEXT_MACRO_VERSION], [0.17])
+  AC_SUBST([GETTEXT_MACRO_VERSION], [0.18])
 
   dnl Perform the following tests also if --disable-nls has been given,
   dnl because they are needed for "make dist" to work.
@@ -41,7 +41,7 @@ AC_DEFUN([AM_PO_SUBDIRS],
     [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
      (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
     :)
-  AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+  AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT])
 
   dnl Test whether it is GNU msgfmt >= 0.15.
 changequote(,)dnl
@@ -102,7 +102,7 @@ changequote([,])dnl
       case "$ac_file" in */Makefile.in)
         # Adjust a relative srcdir.
         ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
-        ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+        ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
         ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
         # In autoconf-2.13 it is called $ac_given_srcdir.
         # In autoconf-2.50 it is called $srcdir.
@@ -118,7 +118,8 @@ changequote([,])dnl
         if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
           rm -f "$ac_dir/POTFILES"
           test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
-          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[  ]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+          gt_tab=`printf '\t'`
+          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
           POMAKEFILEDEPS="POTFILES.in"
           # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
           # on $ac_dir but don't depend on user-specified configuration
@@ -129,12 +130,12 @@ changequote([,])dnl
               test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
             fi
             ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
-            # Hide the ALL_LINGUAS assigment from automake < 1.5.
+            # Hide the ALL_LINGUAS assignment from automake < 1.5.
             eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
             POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
           else
             # The set of available languages was given in configure.in.
-            # Hide the ALL_LINGUAS assigment from automake < 1.5.
+            # Hide the ALL_LINGUAS assignment from automake < 1.5.
             eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
           fi
           # Compute POFILES
@@ -226,7 +227,7 @@ AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE],
 changequote(,)dnl
   # Adjust a relative srcdir.
   ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
-  ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+  ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
   ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
   # In autoconf-2.13 it is called $ac_given_srcdir.
   # In autoconf-2.50 it is called $srcdir.
@@ -254,6 +255,7 @@ EOT
   fi
 
   # A sed script that extracts the value of VARIABLE from a Makefile.
+  tab=`printf '\t'`
   sed_x_variable='
 # Test if the hold space is empty.
 x
@@ -261,9 +263,9 @@ s/P/P/
 x
 ta
 # Yes it was empty. Look if we have the expected variable definition.
-/^[     ]*VARIABLE[     ]*=/{
+/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=/{
   # Seen the first line of the variable definition.
-  s/^[  ]*VARIABLE[     ]*=//
+  s/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=//
   ba
 }
 bd
@@ -315,7 +317,7 @@ changequote([,])dnl
     sed_x_LINGUAS=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'`
     ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"`
   fi
-  # Hide the ALL_LINGUAS assigment from automake < 1.5.
+  # Hide the ALL_LINGUAS assignment from automake < 1.5.
   eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
   # Compute POFILES
   # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
@@ -405,14 +407,15 @@ changequote([,])dnl
   fi
 
   sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp"
+  tab=`printf '\t'`
   if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then
     # Add dependencies that cannot be formulated as a simple suffix rule.
     for lang in $ALL_LINGUAS; do
       frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
       cat >> "$ac_file.tmp" <<EOF
 $frobbedlang.msg: $lang.po
-       @echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
-       \$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+${tab}@echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
+${tab}\$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
 EOF
     done
   fi
@@ -422,8 +425,8 @@ EOF
       frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
       cat >> "$ac_file.tmp" <<EOF
 $frobbedlang/\$(DOMAIN).resources.dll: $lang.po
-       @echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
-       \$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+${tab}@echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
+${tab}\$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
 EOF
     done
   fi
index a90f4ad..ec4f384 100644 (file)
@@ -1,3 +1,31 @@
+2014-08-25  Mark Wielaard  <mjw@redhat.com>
+
+       * *.po: Update for 0.160.
+
+2014-05-20  Mark Wielaard  <mjw@redhat.com>
+
+       * *.po: Regenerated.
+
+2014-05-17  Mark Wielaard  <mjw@redhat.com>
+
+       * *.po: Update for 0.159.
+
+2014-01-03  Mark Wielaard  <mjw@redhat.com>
+
+       * *.po: Update for 0.158.
+
+2013-07-30  Mark Wielaard  <mjw@redhat.com>
+
+       * *.po: Update for 0.157.
+
+2013-07-25  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * *.po: Update for 0.156.
+
+2013-04-24  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.in.in: Upgrade to gettext-0.18.2.
+
 2012-08-27  Mark Wielaard  <mjw@redhat.com>
 
        * *.po: Update for 0.155.
index fecf500..fce63a6 100644 (file)
@@ -1,5 +1,5 @@
 # Makefile for PO directory in any package using GNU gettext.
-# Copyright (C) 1995-1997, 2000-2007 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+# Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
 #
 # This file can be copied and used freely without restrictions.  It can
 # be used in projects which are not available under the GNU General Public
@@ -8,8 +8,8 @@
 # Please note that the actual code of GNU gettext is covered by the GNU
 # General Public License and is *not* in the public domain.
 #
-# Origin: gettext-0.17
-GETTEXT_MACRO_VERSION = 0.17
+# Origin: gettext-0.18.2
+GETTEXT_MACRO_VERSION = 0.18
 
 PACKAGE = @PACKAGE@
 VERSION = @VERSION@
@@ -88,22 +88,22 @@ CATALOGS = @CATALOGS@
 .po.gmo:
        @lang=`echo $* | sed -e 's,.*/,,'`; \
        test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
-       echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \
-       cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
+       echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \
+       cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
 
 .sin.sed:
        sed -e '/^#/d' $< > t-$@
        mv t-$@ $@
 
 
-all: check-macro-version all-@USE_NLS@
+all: all-@USE_NLS@
 
 all-yes: stamp-po
 all-no:
 
 # Ensure that the gettext macros and this Makefile.in.in are in sync.
-check-macro-version:
-       @test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \
+CHECK_MACRO_VERSION = \
+       test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \
          || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \
               exit 1; \
             }
@@ -123,6 +123,7 @@ check-macro-version:
 # $(POFILES) has been designed to not touch files that don't need to be
 # changed.
 stamp-po: $(srcdir)/$(DOMAIN).pot
+       @$(CHECK_MACRO_VERSION)
        test ! -f $(srcdir)/$(DOMAIN).pot || \
          test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES)
        @test ! -f $(srcdir)/$(DOMAIN).pot || { \
@@ -137,8 +138,16 @@ stamp-po: $(srcdir)/$(DOMAIN).pot
 
 # This target rebuilds $(DOMAIN).pot; it is an expensive operation.
 # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
+# The determination of whether the package xyz is a GNU one is based on the
+# heuristic whether some file in the top level directory mentions "GNU xyz".
+# If GNU 'find' is available, we avoid grepping through monster files.
 $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
-       if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \
+       if { if (LC_ALL=C find --version) 2>/dev/null | grep GNU >/dev/null; then \
+              LC_ALL=C find -L $(top_srcdir) -maxdepth 1 -type f -size -10000000c -exec grep 'GNU @PACKAGE@' /dev/null '{}' ';' 2>/dev/null; \
+            else \
+              LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null; \
+            fi; \
+          } | grep -v 'libtool:' >/dev/null; then \
          package_gnu='GNU '; \
        else \
          package_gnu=''; \
@@ -193,8 +202,15 @@ $(POFILES): $(srcdir)/$(DOMAIN).pot
        @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
        if test -f "$(srcdir)/$${lang}.po"; then \
          test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
-         echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \
-         cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \
+         echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \
+         cd $(srcdir) \
+           && { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+                  '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
+                    $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \
+                  *) \
+                    $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \
+                esac; \
+              }; \
        else \
          $(MAKE) $${lang}.po-create; \
        fi
@@ -217,7 +233,6 @@ install-data: install-data-@USE_NLS@
        fi
 install-data-no: all
 install-data-yes: all
-       $(mkdir_p) $(DESTDIR)$(datadir)
        @catalogs='$(CATALOGS)'; \
        for cat in $$catalogs; do \
          cat=`basename $$cat`; \
@@ -269,7 +284,6 @@ installdirs-data: installdirs-data-@USE_NLS@
        fi
 installdirs-data-no:
 installdirs-data-yes:
-       $(mkdir_p) $(DESTDIR)$(datadir)
        @catalogs='$(CATALOGS)'; \
        for cat in $$catalogs; do \
          cat=`basename $$cat`; \
@@ -395,9 +409,15 @@ update-po: Makefile
        tmpdir=`pwd`; \
        echo "$$lang:"; \
        test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
-       echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
+       echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
        cd $(srcdir); \
-       if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \
+       if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+              '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
+                $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
+              *) \
+                $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
+            esac; \
+          }; then \
          if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
            rm -f $$tmpdir/$$lang.new.po; \
          else \
@@ -418,9 +438,13 @@ $(DUMMYPOFILES):
 update-gmo: Makefile $(GMOFILES)
        @:
 
+# Recreate Makefile by invoking config.status. Explicitly invoke the shell,
+# because execution permission bits may not work on the current file system.
+# Use @SHELL@, which is the shell determined by autoconf for the use by its
+# scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient.
 Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@
        cd $(top_builddir) \
-         && $(SHELL) ./config.status $(subdir)/$@.in po-directories
+         && @SHELL@ ./config.status $(subdir)/$@.in po-directories
 
 force:
 
index 9605049..69c0400 100644 (file)
Binary files a/po/de.gmo and b/po/de.gmo differ
index ea42846..34d83e2 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -11,29 +11,29 @@ msgid ""
 msgstr ""
 "Project-Id-Version: elfutils VERSION\n"
 "Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
-"POT-Creation-Date: 2012-08-27 20:34+0200\n"
+"POT-Creation-Date: 2014-08-27 11:26+0200\n"
 "PO-Revision-Date: 2009-06-29 15:15+0200\n"
 "Last-Translator: Michael Münch <micm@fedoraproject.org>\n"
 "Language-Team: German\n"
-"Language: \n"
+"Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Lokalize 0.3\n"
 
-#: lib/xmalloc.c:54 lib/xmalloc.c:68 lib/xmalloc.c:82 src/readelf.c:2842
-#: src/readelf.c:3181 src/unstrip.c:2090 src/unstrip.c:2298
+#: lib/xmalloc.c:54 lib/xmalloc.c:68 lib/xmalloc.c:82 src/readelf.c:3098
+#: src/readelf.c:3447 src/readelf.c:8018 src/unstrip.c:2115 src/unstrip.c:2323
 #, c-format
 msgid "memory exhausted"
 msgstr "Kein Speicher mehr verfügbar"
 
-#: libasm/asm_error.c:65 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:49
+#: libasm/asm_error.c:65 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:53
 #: libelf/elf_error.c:60
 msgid "no error"
 msgstr "kein Fehler"
 
-#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:51
+#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:55
 #: libelf/elf_error.c:91
 msgid "out of memory"
 msgstr "nicht genügend Speicher"
@@ -72,7 +72,7 @@ msgstr "Fehler bei Datenausgabe"
 msgid "no backend support available"
 msgstr "keine Backend-Unterstützung verfügbar"
 
-#: libasm/asm_error.c:84 libdw/dwarf_error.c:59 libdwfl/libdwflP.h:50
+#: libasm/asm_error.c:84 libdw/dwarf_error.c:59 libdwfl/libdwflP.h:54
 #: libelf/elf_error.c:63
 msgid "unknown error"
 msgstr "unbekannter Fehler"
@@ -169,7 +169,7 @@ msgstr "Ungültige DWARF Version"
 msgid "invalid directory index"
 msgstr "ungültiger Verzeichnisindex"
 
-#: libdw/dwarf_error.c:84 libdwfl/libdwflP.h:70
+#: libdw/dwarf_error.c:84 libdwfl/libdwflP.h:74
 msgid "address out of range"
 msgstr "Außerhalb des Adressbereiches"
 
@@ -189,7 +189,7 @@ msgstr "Ungültiger Zeilenindex"
 msgid "invalid address range index"
 msgstr "Ungültiger Adressbereichs Index"
 
-#: libdw/dwarf_error.c:89 libdwfl/libdwflP.h:71
+#: libdw/dwarf_error.c:89 libdwfl/libdwflP.h:75
 msgid "no matching address range"
 msgstr "Kein passender Adressbereich"
 
@@ -214,7 +214,7 @@ msgstr "ungültiger Abschnitt"
 msgid "no alternative debug link found"
 msgstr ""
 
-#: libdwfl/argp-std.c:46 src/unstrip.c:2240
+#: libdwfl/argp-std.c:46 src/unstrip.c:2265
 msgid "Input selection options:"
 msgstr "Eingabeauswahloptionen:"
 
@@ -248,139 +248,199 @@ msgstr "Kernel mit allen Modulen"
 msgid "Search path for separate debuginfo files"
 msgstr "Dateisuchpfad für separate Debug-Informationen"
 
-#: libdwfl/argp-std.c:142
+#: libdwfl/argp-std.c:157
 msgid "only one of -e, -p, -k, -K, or --core allowed"
 msgstr "Nur eine Option von -e, -p, -k, -K, oder --core erlaubt"
 
-#: libdwfl/argp-std.c:202
-#, c-format
-msgid "cannot read ELF core file: %s"
-msgstr "Konnte ELF Kerndatei %s nicht lesen"
-
-#: libdwfl/argp-std.c:220
-msgid "No modules recognized in core file"
-msgstr "Keine Module in der Kerndatei gefunden"
-
-#: libdwfl/argp-std.c:232
+#: libdwfl/argp-std.c:230
 msgid "cannot load kernel symbols"
 msgstr "Konnte Kernel Symbole nicht laden"
 
-#: libdwfl/argp-std.c:236
+#: libdwfl/argp-std.c:234
 msgid "cannot find kernel modules"
 msgstr "Konnte Kernel Module nicht finden"
 
-#: libdwfl/argp-std.c:250
+#: libdwfl/argp-std.c:251
 msgid "cannot find kernel or modules"
 msgstr "Konnte Kernel oder Module nicht finden"
 
-#: libdwfl/libdwflP.h:52
+#: libdwfl/argp-std.c:290
+#, c-format
+msgid "cannot read ELF core file: %s"
+msgstr "Konnte ELF Kerndatei %s nicht lesen"
+
+#: libdwfl/argp-std.c:311
+msgid "No modules recognized in core file"
+msgstr "Keine Module in der Kerndatei gefunden"
+
+#: libdwfl/libdwflP.h:56
 msgid "See errno"
 msgstr ""
 
-#: libdwfl/libdwflP.h:53
+#: libdwfl/libdwflP.h:57
 msgid "See elf_errno"
 msgstr ""
 
-#: libdwfl/libdwflP.h:54
+#: libdwfl/libdwflP.h:58
 msgid "See dwarf_errno"
 msgstr ""
 
-#: libdwfl/libdwflP.h:55
+#: libdwfl/libdwflP.h:59
 msgid "See ebl_errno (XXX missing)"
 msgstr ""
 
-#: libdwfl/libdwflP.h:56
+#: libdwfl/libdwflP.h:60
 msgid "gzip decompression failed"
 msgstr ""
 
-#: libdwfl/libdwflP.h:57
+#: libdwfl/libdwflP.h:61
 msgid "bzip2 decompression failed"
 msgstr ""
 
-#: libdwfl/libdwflP.h:58
+#: libdwfl/libdwflP.h:62
 msgid "LZMA decompression failed"
 msgstr ""
 
-#: libdwfl/libdwflP.h:59
+#: libdwfl/libdwflP.h:63
 msgid "no support library found for machine"
 msgstr ""
 
-#: libdwfl/libdwflP.h:60
+#: libdwfl/libdwflP.h:64
 msgid "Callbacks missing for ET_REL file"
 msgstr ""
 
-#: libdwfl/libdwflP.h:61
+#: libdwfl/libdwflP.h:65
 msgid "Unsupported relocation type"
 msgstr ""
 
-#: libdwfl/libdwflP.h:62
+#: libdwfl/libdwflP.h:66
 msgid "r_offset is bogus"
 msgstr ""
 
-#: libdwfl/libdwflP.h:63 libelf/elf_error.c:111 libelf/elf_error.c:171
+#: libdwfl/libdwflP.h:67 libelf/elf_error.c:111 libelf/elf_error.c:171
 msgid "offset out of range"
 msgstr "Offset ausserhalb des Bereichs"
 
-#: libdwfl/libdwflP.h:64
+#: libdwfl/libdwflP.h:68
 #, fuzzy
 msgid "relocation refers to undefined symbol"
 msgstr "Zeige Grösse der definierten Symbole"
 
-#: libdwfl/libdwflP.h:65
+#: libdwfl/libdwflP.h:69
 msgid "Callback returned failure"
 msgstr ""
 
-#: libdwfl/libdwflP.h:66
+#: libdwfl/libdwflP.h:70
 #, fuzzy
 msgid "No DWARF information found"
 msgstr "keine DWARF Information"
 
-#: libdwfl/libdwflP.h:67
+#: libdwfl/libdwflP.h:71
 msgid "No symbol table found"
 msgstr ""
 
-#: libdwfl/libdwflP.h:68
+#: libdwfl/libdwflP.h:72
 #, fuzzy
 msgid "No ELF program headers"
 msgstr "Programm-Köpfe anzeigen"
 
-#: libdwfl/libdwflP.h:69
+#: libdwfl/libdwflP.h:73
 msgid "address range overlaps an existing module"
 msgstr ""
 
-#: libdwfl/libdwflP.h:72
+#: libdwfl/libdwflP.h:76
 msgid "image truncated"
 msgstr ""
 
-#: libdwfl/libdwflP.h:73
+#: libdwfl/libdwflP.h:77
 #, fuzzy
 msgid "ELF file opened"
 msgstr "keine ELF Datei"
 
-#: libdwfl/libdwflP.h:74
+#: libdwfl/libdwflP.h:78
 #, fuzzy
 msgid "not a valid ELF file"
 msgstr "Ungültige ELF Datei"
 
-#: libdwfl/libdwflP.h:75
+#: libdwfl/libdwflP.h:79
 #, fuzzy
 msgid "cannot handle DWARF type description"
 msgstr "konnte Elf-Deskriptor nicht erzeugen: %s"
 
-#: libdwfl/libdwflP.h:76
+#: libdwfl/libdwflP.h:80
 msgid "ELF file does not match build ID"
 msgstr ""
 
-#: libdwfl/libdwflP.h:77
+#: libdwfl/libdwflP.h:81
 #, fuzzy
 msgid "corrupt .gnu.prelink_undo section data"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
+#: libdwfl/libdwflP.h:82
+msgid "Internal error due to ebl"
+msgstr ""
+
+#: libdwfl/libdwflP.h:83
+msgid "Missing data in core file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:84
+#, fuzzy
+msgid "Invalid register"
+msgstr "ungültiger Parameter"
+
+#: libdwfl/libdwflP.h:85
+msgid "Error reading process memory"
+msgstr ""
+
+#: libdwfl/libdwflP.h:86
+msgid "Couldn't find architecture of any ELF"
+msgstr ""
+
+#: libdwfl/libdwflP.h:87
+msgid "Error parsing /proc filesystem"
+msgstr ""
+
+#: libdwfl/libdwflP.h:88
+#, fuzzy
+msgid "Invalid DWARF"
+msgstr "DWARF ungültig"
+
+#: libdwfl/libdwflP.h:89
+msgid "Unsupported DWARF"
+msgstr ""
+
+#: libdwfl/libdwflP.h:90
+msgid "Unable to find more threads"
+msgstr ""
+
+#: libdwfl/libdwflP.h:91
+msgid "Dwfl already has attached state"
+msgstr ""
+
+#: libdwfl/libdwflP.h:92
+msgid "Dwfl has no attached state"
+msgstr ""
+
+#: libdwfl/libdwflP.h:93
+msgid "Unwinding not supported for this architecture"
+msgstr ""
+
+#: libdwfl/libdwflP.h:94
+#, fuzzy
+msgid "Invalid argument"
+msgstr "ungültiger Parameter"
+
+#: libdwfl/libdwflP.h:95
+#, fuzzy
+msgid "Not an ET_CORE ELF file"
+msgstr "Ungültige ELF Datei"
+
 #: libebl/eblbackendname.c:42
 msgid "No backend"
 msgstr "Kein Backend"
 
-#: libebl/eblcorenotetypename.c:86 libebl/eblobjecttypename.c:57
+#: libebl/eblcorenotetypename.c:102 libebl/eblobjecttypename.c:57
 #: libebl/eblobjnotetypename.c:73 libebl/eblosabiname.c:77
 #: libebl/eblsectionname.c:89 libebl/eblsectiontypename.c:119
 #: libebl/eblsegmenttypename.c:83
@@ -476,7 +536,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:4697
+#: libelf/elf_error.c:87 src/readelf.c:5190
 #, c-format
 msgid "invalid encoding"
 msgstr "ungültige Kodierung"
@@ -559,8 +619,8 @@ msgstr "data/scn Unterschied"
 msgid "invalid section header"
 msgstr "ungültiger Abschnitts-Header"
 
-#: libelf/elf_error.c:187 src/readelf.c:6335 src/readelf.c:6780
-#: src/readelf.c:6881 src/readelf.c:7043
+#: libelf/elf_error.c:187 src/readelf.c:6980 src/readelf.c:7426
+#: src/readelf.c:7527 src/readelf.c:7689
 #, c-format
 msgid "invalid data"
 msgstr "Ungültige Daten"
@@ -623,31 +683,41 @@ msgid "Also show symbol or section names"
 msgstr ""
 
 #: src/addr2line.c:64
+msgid "Also show symbol and the section names"
+msgstr ""
+
+#: src/addr2line.c:65
 msgid "Also show line table flags"
 msgstr ""
 
-#: src/addr2line.c:66
+#: src/addr2line.c:67
 msgid "Treat addresses as offsets relative to NAME section."
 msgstr ""
 
-#: src/addr2line.c:68 src/elfcmp.c:72 src/findtextrel.c:67 src/nm.c:100
+#: src/addr2line.c:69
+msgid ""
+"Show all source locations that caused inline expansion of subroutines at the "
+"address."
+msgstr ""
+
+#: src/addr2line.c:72 src/elfcmp.c:72 src/findtextrel.c:67 src/nm.c:100
 #: src/strings.c:75
 msgid "Miscellaneous:"
 msgstr "Verschiedenes:"
 
-#: src/addr2line.c:77
+#: src/addr2line.c:81
 msgid ""
 "Locate source files and line information for ADDRs (in a.out by default)."
 msgstr ""
 
-#: src/addr2line.c:81
+#: src/addr2line.c:85
 msgid "[ADDR...]"
 msgstr ""
 
-#: src/addr2line.c:181 src/ar.c:289 src/elfcmp.c:662 src/elflint.c:231
+#: src/addr2line.c:196 src/ar.c:289 src/elfcmp.c:662 src/elflint.c:235
 #: src/findtextrel.c:162 src/ld.c:949 src/nm.c:265 src/objdump.c:181
-#: src/ranlib.c:128 src/readelf.c:460 src/size.c:211 src/strings.c:219
-#: src/strip.c:213 src/unstrip.c:226
+#: src/ranlib.c:128 src/readelf.c:500 src/size.c:211 src/strings.c:226
+#: src/strip.c:213 src/unstrip.c:233
 #, c-format
 msgid ""
 "Copyright (C) %s Red Hat, Inc.\n"
@@ -659,30 +729,30 @@ msgstr ""
 "GARANTIE,\n"
 "auch nicht für Marktgängigkeit oder Eignung für einen Bestimmten Zweck.\n"
 
-#: src/addr2line.c:186 src/ar.c:294 src/elfcmp.c:667 src/elflint.c:236
+#: src/addr2line.c:201 src/ar.c:294 src/elfcmp.c:667 src/elflint.c:240
 #: src/findtextrel.c:167 src/ld.c:954 src/nm.c:270 src/objdump.c:186
-#: src/ranlib.c:133 src/readelf.c:465 src/size.c:216 src/strings.c:224
-#: src/strip.c:218 src/unstrip.c:231
+#: src/ranlib.c:133 src/readelf.c:505 src/size.c:216 src/strings.c:231
+#: src/strip.c:218 src/unstrip.c:238
 #, c-format
 msgid "Written by %s.\n"
 msgstr "Geschrieben von %s.\n"
 
-#: src/addr2line.c:405
+#: src/addr2line.c:474
 #, fuzzy, c-format
 msgid "Section syntax requires exactly one module"
 msgstr "Abschnitt syntax benötigt genau ein Modul"
 
-#: src/addr2line.c:428
+#: src/addr2line.c:497
 #, c-format
 msgid "offset %#<PRIxMAX> lies outside section '%s'"
 msgstr ""
 
-#: src/addr2line.c:469
+#: src/addr2line.c:563
 #, c-format
 msgid "cannot find symbol '%s'"
 msgstr "Konnte Symbol '%s' nicht finden"
 
-#: src/addr2line.c:474
+#: src/addr2line.c:568
 #, c-format
 msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
 msgstr ""
@@ -1121,8 +1191,8 @@ msgstr ""
 
 #: src/elfcmp.c:722 src/findtextrel.c:221 src/ldgeneric.c:1757
 #: src/ldgeneric.c:4247 src/nm.c:381 src/ranlib.c:161 src/size.c:293
-#: src/strings.c:175 src/strip.c:450 src/strip.c:487 src/unstrip.c:1903
-#: src/unstrip.c:1932
+#: src/strings.c:182 src/strip.c:451 src/strip.c:488 src/unstrip.c:1911
+#: src/unstrip.c:1940
 #, c-format
 msgid "cannot open '%s'"
 msgstr "'%s' kann nicht geöffnet werden"
@@ -1174,1596 +1244,1596 @@ msgstr ""
 msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
 msgstr ""
 
-#: src/elflint.c:78 src/readelf.c:113
+#: src/elflint.c:78 src/readelf.c:123
 msgid "FILE..."
 msgstr "DATEI..."
 
-#: src/elflint.c:151 src/readelf.c:271
+#: src/elflint.c:155 src/readelf.c:292
 #, c-format
 msgid "cannot open input file"
 msgstr "Kann Eingabedatei nicht öffnen"
 
-#: src/elflint.c:158
+#: src/elflint.c:162
 #, c-format
 msgid "cannot generate Elf descriptor: %s\n"
 msgstr "kann Elf-Deskriptor nicht erzeugen: %s\n"
 
-#: src/elflint.c:177
+#: src/elflint.c:181
 #, c-format
 msgid "error while closing Elf descriptor: %s\n"
 msgstr "Fehler beim Schliessen des Elf-Desktriptor: %s\n"
 
-#: src/elflint.c:181
+#: src/elflint.c:185
 msgid "No errors"
 msgstr "Keine Fehler"
 
-#: src/elflint.c:215 src/readelf.c:434
+#: src/elflint.c:219 src/readelf.c:468
 msgid "Missing file name.\n"
 msgstr "Dateiname fehlt.\n"
 
-#: src/elflint.c:294
+#: src/elflint.c:298
 #, c-format
 msgid " error while freeing sub-ELF descriptor: %s\n"
 msgstr ""
 
-#: src/elflint.c:302
+#: src/elflint.c:306
 #, fuzzy, c-format
 msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
 msgstr "Keine ELF-Datei - sie hat die falschen Magic Bytes am Anfang\n"
 
-#: src/elflint.c:363
+#: src/elflint.c:371
 #, c-format
 msgid "e_ident[%d] == %d is no known class\n"
 msgstr ""
 
-#: src/elflint.c:368
+#: src/elflint.c:376
 #, c-format
 msgid "e_ident[%d] == %d is no known data encoding\n"
 msgstr ""
 
-#: src/elflint.c:372
+#: src/elflint.c:380
 #, c-format
 msgid "unknown ELF header version number e_ident[%d] == %d\n"
 msgstr ""
 
-#: src/elflint.c:378
+#: src/elflint.c:386
 #, c-format
 msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
 msgstr ""
 
-#: src/elflint.c:384
+#: src/elflint.c:392
 #, c-format
 msgid "unsupport ABI version e_ident[%d] == %d\n"
 msgstr ""
 
-#: src/elflint.c:389
+#: src/elflint.c:397
 #, c-format
 msgid "e_ident[%zu] is not zero\n"
 msgstr "e_ident[%zu] ist nicht null\n"
 
-#: src/elflint.c:394
+#: src/elflint.c:402
 #, c-format
 msgid "unknown object file type %d\n"
 msgstr ""
 
-#: src/elflint.c:401
+#: src/elflint.c:409
 #, c-format
 msgid "unknown machine type %d\n"
 msgstr ""
 
-#: src/elflint.c:405
+#: src/elflint.c:413
 #, c-format
 msgid "unknown object file version\n"
 msgstr ""
 
-#: src/elflint.c:411
+#: src/elflint.c:419
 #, c-format
 msgid "invalid program header offset\n"
 msgstr ""
 
-#: src/elflint.c:413
+#: src/elflint.c:421
 #, c-format
 msgid "executables and DSOs cannot have zero program header offset\n"
 msgstr ""
 
-#: src/elflint.c:417
+#: src/elflint.c:425
 #, c-format
 msgid "invalid number of program header entries\n"
 msgstr ""
 
-#: src/elflint.c:425
+#: src/elflint.c:433
 #, c-format
 msgid "invalid section header table offset\n"
 msgstr ""
 
-#: src/elflint.c:428
+#: src/elflint.c:436
 #, c-format
 msgid "section header table must be present\n"
 msgstr ""
 
-#: src/elflint.c:442
+#: src/elflint.c:450
 #, c-format
 msgid "invalid number of section header table entries\n"
 msgstr ""
 
-#: src/elflint.c:459
+#: src/elflint.c:467
 #, c-format
 msgid "invalid section header index\n"
 msgstr ""
 
-#: src/elflint.c:473
+#: src/elflint.c:481
 #, fuzzy, c-format
 msgid "invalid number of program header table entries\n"
 msgstr "Ungültige Anzahl von Parametern.\n"
 
-#: src/elflint.c:482
+#: src/elflint.c:490
 #, c-format
 msgid "invalid machine flags: %s\n"
 msgstr ""
 
-#: src/elflint.c:489 src/elflint.c:506
+#: src/elflint.c:497 src/elflint.c:514
 #, c-format
 msgid "invalid ELF header size: %hd\n"
 msgstr ""
 
-#: src/elflint.c:492 src/elflint.c:509
+#: src/elflint.c:500 src/elflint.c:517
 #, c-format
 msgid "invalid program header size: %hd\n"
 msgstr ""
 
-#: src/elflint.c:495 src/elflint.c:512
+#: src/elflint.c:503 src/elflint.c:520
 #, c-format
 msgid "invalid program header position or size\n"
 msgstr ""
 
-#: src/elflint.c:498 src/elflint.c:515
+#: src/elflint.c:506 src/elflint.c:523
 #, c-format
 msgid "invalid section header size: %hd\n"
 msgstr ""
 
-#: src/elflint.c:501 src/elflint.c:518
+#: src/elflint.c:509 src/elflint.c:526
 #, c-format
 msgid "invalid section header position or size\n"
 msgstr ""
 
-#: src/elflint.c:562
+#: src/elflint.c:570
 #, c-format
 msgid ""
 "section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
 "group\n"
 msgstr ""
 
-#: src/elflint.c:566
+#: src/elflint.c:574
 #, c-format
 msgid ""
 "section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
 msgstr ""
 
-#: src/elflint.c:582 src/elflint.c:1426 src/elflint.c:1476 src/elflint.c:1581
-#: src/elflint.c:2166 src/elflint.c:2680 src/elflint.c:2841 src/elflint.c:2971
-#: src/elflint.c:3143 src/elflint.c:4045
+#: src/elflint.c:590 src/elflint.c:1457 src/elflint.c:1508 src/elflint.c:1614
+#: src/elflint.c:1939 src/elflint.c:2228 src/elflint.c:2742 src/elflint.c:2904
+#: src/elflint.c:3034 src/elflint.c:3206 src/elflint.c:4108
 #, c-format
 msgid "section [%2d] '%s': cannot get section data\n"
 msgstr ""
 
-#: src/elflint.c:595 src/elflint.c:1588
+#: src/elflint.c:603 src/elflint.c:1621
 #, c-format
 msgid ""
 "section [%2d] '%s': referenced as string table for section [%2d] '%s' but "
 "type is not SHT_STRTAB\n"
 msgstr ""
 
-#: src/elflint.c:618
+#: src/elflint.c:626
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol table cannot have more than one extended index "
 "section\n"
 msgstr ""
 
-#: src/elflint.c:629
+#: src/elflint.c:638
 #, c-format
 msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
 msgstr ""
 
-#: src/elflint.c:638
+#: src/elflint.c:647
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
 msgstr ""
 
-#: src/elflint.c:643 src/elflint.c:646 src/elflint.c:649 src/elflint.c:652
-#: src/elflint.c:655 src/elflint.c:658
+#: src/elflint.c:652 src/elflint.c:655 src/elflint.c:658 src/elflint.c:661
+#: src/elflint.c:664 src/elflint.c:667
 #, c-format
 msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
 msgstr ""
 
-#: src/elflint.c:661
+#: src/elflint.c:670
 #, c-format
 msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
 msgstr ""
 
-#: src/elflint.c:671
+#: src/elflint.c:680
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
 msgstr ""
 
-#: src/elflint.c:680
+#: src/elflint.c:689
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
 msgstr ""
 
-#: src/elflint.c:694
+#: src/elflint.c:704
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: too large section index but no extended "
 "section index section\n"
 msgstr ""
 
-#: src/elflint.c:700
+#: src/elflint.c:710
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
 "st_shndx (%<PRIu32>)\n"
 msgstr ""
 
-#: src/elflint.c:712
+#: src/elflint.c:722
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
 msgstr ""
 
-#: src/elflint.c:720
+#: src/elflint.c:730
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown type\n"
 msgstr ""
 
-#: src/elflint.c:726
+#: src/elflint.c:736
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
 msgstr ""
 
-#: src/elflint.c:731
+#: src/elflint.c:741
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
 msgstr ""
 
-#: src/elflint.c:739
+#: src/elflint.c:749
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
 msgstr ""
 
-#: src/elflint.c:743
+#: src/elflint.c:753
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
 msgstr ""
 
-#: src/elflint.c:747
+#: src/elflint.c:757
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
 msgstr ""
 
-#: src/elflint.c:779
+#: src/elflint.c:804
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:785 src/elflint.c:810 src/elflint.c:853
+#: src/elflint.c:810 src/elflint.c:835 src/elflint.c:878
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu does not fit completely in referenced section "
 "[%2d] '%s'\n"
 msgstr ""
 
-#: src/elflint.c:794
+#: src/elflint.c:819
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
 "SHF_TLS flag set\n"
 msgstr ""
 
-#: src/elflint.c:804 src/elflint.c:846
+#: src/elflint.c:829 src/elflint.c:871
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
 "[%2d] '%s'\n"
 msgstr ""
 
-#: src/elflint.c:831
+#: src/elflint.c:856
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
 msgstr ""
 
-#: src/elflint.c:839
+#: src/elflint.c:864
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] "
 "'%s'\n"
 msgstr ""
 
-#: src/elflint.c:866
+#: src/elflint.c:891
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: local symbol outside range described in "
 "sh_info\n"
 msgstr ""
 
-#: src/elflint.c:873
+#: src/elflint.c:898
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
 "sh_info\n"
 msgstr ""
 
-#: src/elflint.c:880
+#: src/elflint.c:905
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
 msgstr ""
 
-#: src/elflint.c:930
+#: src/elflint.c:955
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section "
 "[%2d]\n"
 msgstr ""
 
-#: src/elflint.c:937
+#: src/elflint.c:962
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] "
 "'%s'\n"
 msgstr ""
 
-#: src/elflint.c:953
+#: src/elflint.c:978
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
 "match %s section address %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:960
+#: src/elflint.c:985
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
 "match %s section size %<PRIu64>\n"
 msgstr ""
 
-#: src/elflint.c:968
+#: src/elflint.c:993
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
 "section\n"
 msgstr ""
 
-#: src/elflint.c:984
+#: src/elflint.c:1009
 #, c-format
 msgid ""
 "section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
 "segment address %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:991
+#: src/elflint.c:1016
 #, c-format
 msgid ""
 "section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
 "segment size %<PRIu64>\n"
 msgstr ""
 
-#: src/elflint.c:1004
+#: src/elflint.c:1029
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
 "default visibility\n"
 msgstr ""
 
-#: src/elflint.c:1008
+#: src/elflint.c:1033
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
 msgstr ""
 
-#: src/elflint.c:1053
+#: src/elflint.c:1082
 #, c-format
 msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
 msgstr ""
 
-#: src/elflint.c:1062 src/elflint.c:1114
+#: src/elflint.c:1093 src/elflint.c:1145
 #, c-format
 msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
 msgstr ""
 
-#: src/elflint.c:1087 src/elflint.c:1139
+#: src/elflint.c:1118 src/elflint.c:1170
 #, c-format
 msgid ""
 "section [%2d] '%s': relative relocations after index %d as specified by "
 "DT_RELCOUNT\n"
 msgstr ""
 
-#: src/elflint.c:1093 src/elflint.c:1145
+#: src/elflint.c:1124 src/elflint.c:1176
 #, c-format
 msgid ""
 "section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
 "specified %d relative relocations\n"
 msgstr ""
 
-#: src/elflint.c:1105
+#: src/elflint.c:1136
 #, c-format
 msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
 msgstr ""
 
-#: src/elflint.c:1187
+#: src/elflint.c:1218
 #, c-format
 msgid "section [%2d] '%s': invalid destination section index\n"
 msgstr ""
 
-#: src/elflint.c:1200
+#: src/elflint.c:1230
 #, c-format
 msgid "section [%2d] '%s': invalid destination section type\n"
 msgstr ""
 
-#: src/elflint.c:1208
+#: src/elflint.c:1238
 #, c-format
 msgid "section [%2d] '%s': sh_info should be zero\n"
 msgstr ""
 
-#: src/elflint.c:1215
+#: src/elflint.c:1245
 #, c-format
 msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
 msgstr ""
 
-#: src/elflint.c:1222
+#: src/elflint.c:1253
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
 msgstr ""
 
-#: src/elflint.c:1282
+#: src/elflint.c:1313
 #, c-format
 msgid "text relocation flag set but there is no read-only segment\n"
 msgstr ""
 
-#: src/elflint.c:1309
+#: src/elflint.c:1340
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: invalid type\n"
 msgstr ""
 
-#: src/elflint.c:1317
+#: src/elflint.c:1348
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: relocation type invalid for the file "
 "type\n"
 msgstr ""
 
-#: src/elflint.c:1325
+#: src/elflint.c:1356
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
 msgstr ""
 
-#: src/elflint.c:1343
+#: src/elflint.c:1374
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
 "be used with %s\n"
 msgstr ""
 
-#: src/elflint.c:1360
+#: src/elflint.c:1391
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:1375
+#: src/elflint.c:1406
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: copy relocation against symbol of type "
 "%s\n"
 msgstr ""
 
-#: src/elflint.c:1396
+#: src/elflint.c:1427
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: read-only section modified but text "
 "relocation flag not set\n"
 msgstr ""
 
-#: src/elflint.c:1411
+#: src/elflint.c:1442
 #, c-format
 msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
 msgstr ""
 
-#: src/elflint.c:1450 src/elflint.c:1500
+#: src/elflint.c:1482 src/elflint.c:1533
 #, c-format
 msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
 msgstr ""
 
-#: src/elflint.c:1576
+#: src/elflint.c:1609
 #, c-format
 msgid "more than one dynamic section present\n"
 msgstr ""
 
-#: src/elflint.c:1594
+#: src/elflint.c:1628
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
 msgstr ""
 
-#: src/elflint.c:1599 src/elflint.c:1882
+#: src/elflint.c:1633 src/elflint.c:1918
 #, c-format
 msgid "section [%2d] '%s': sh_info not zero\n"
 msgstr ""
 
-#: src/elflint.c:1609
+#: src/elflint.c:1643
 #, c-format
 msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
 msgstr ""
 
-#: src/elflint.c:1617
+#: src/elflint.c:1651
 #, c-format
 msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
 msgstr ""
 
-#: src/elflint.c:1624
+#: src/elflint.c:1658
 #, c-format
 msgid "section [%2d] '%s': entry %zu: unknown tag\n"
 msgstr ""
 
-#: src/elflint.c:1635
+#: src/elflint.c:1669
 #, c-format
 msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
 msgstr ""
 
-#: src/elflint.c:1645
+#: src/elflint.c:1679
 #, c-format
 msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
 msgstr ""
 
-#: src/elflint.c:1663
+#: src/elflint.c:1697
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
 msgstr ""
 
-#: src/elflint.c:1676
+#: src/elflint.c:1710
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: pointer does not match address of section "
 "[%2d] '%s' referenced by sh_link\n"
 msgstr ""
 
-#: src/elflint.c:1719
+#: src/elflint.c:1753
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
 msgstr ""
 
-#: src/elflint.c:1734
+#: src/elflint.c:1768
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: %s value must be valid offset in section "
 "[%2d] '%s'\n"
 msgstr ""
 
-#: src/elflint.c:1754 src/elflint.c:1782
+#: src/elflint.c:1788 src/elflint.c:1816
 #, c-format
 msgid "section [%2d] '%s': contains %s entry but not %s\n"
 msgstr ""
 
-#: src/elflint.c:1766
+#: src/elflint.c:1800
 #, c-format
 msgid "section [%2d] '%s': mandatory tag %s not present\n"
 msgstr ""
 
-#: src/elflint.c:1775
+#: src/elflint.c:1809
 #, c-format
 msgid "section [%2d] '%s': no hash section present\n"
 msgstr ""
 
-#: src/elflint.c:1790 src/elflint.c:1797
+#: src/elflint.c:1824 src/elflint.c:1831
 #, c-format
 msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
 msgstr ""
 
-#: src/elflint.c:1807 src/elflint.c:1811
+#: src/elflint.c:1841 src/elflint.c:1845
 #, c-format
 msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
 msgstr ""
 
-#: src/elflint.c:1817
+#: src/elflint.c:1851
 #, c-format
 msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
 msgstr ""
 
-#: src/elflint.c:1828 src/elflint.c:1832 src/elflint.c:1836 src/elflint.c:1840
+#: src/elflint.c:1862 src/elflint.c:1866 src/elflint.c:1870 src/elflint.c:1874
 #, c-format
 msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
 msgstr ""
 
-#: src/elflint.c:1852
+#: src/elflint.c:1886
 #, c-format
 msgid ""
 "section [%2d] '%s': only relocatable files can have extended section index\n"
 msgstr ""
 
-#: src/elflint.c:1862
+#: src/elflint.c:1896
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index section not for symbol table\n"
 msgstr ""
 
-#: src/elflint.c:1867
+#: src/elflint.c:1901
 #, c-format
 msgid "cannot get data for symbol section\n"
 msgstr ""
 
-#: src/elflint.c:1870
+#: src/elflint.c:1904
 #, c-format
 msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
 msgstr ""
 
-#: src/elflint.c:1877
+#: src/elflint.c:1913
 #, c-format
 msgid "section [%2d] '%s': extended index table too small for symbol table\n"
 msgstr ""
 
-#: src/elflint.c:1892
+#: src/elflint.c:1928
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
 "same symbol table\n"
 msgstr ""
 
-#: src/elflint.c:1903
+#: src/elflint.c:1945
 #, c-format
 msgid "symbol 0 should have zero extended section index\n"
 msgstr ""
 
-#: src/elflint.c:1915
+#: src/elflint.c:1957
 #, c-format
 msgid "cannot get data for symbol %zu\n"
 msgstr ""
 
-#: src/elflint.c:1920
+#: src/elflint.c:1962
 #, c-format
 msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
 msgstr ""
 
-#: src/elflint.c:1936 src/elflint.c:1977
+#: src/elflint.c:1978 src/elflint.c:2029
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
 msgstr ""
 
-#: src/elflint.c:1948 src/elflint.c:1989
+#: src/elflint.c:1990 src/elflint.c:2041
 #, c-format
 msgid "section [%2d] '%s': chain array too large\n"
 msgstr ""
 
-#: src/elflint.c:1957 src/elflint.c:1998
+#: src/elflint.c:2004 src/elflint.c:2055
 #, c-format
 msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:1963
+#: src/elflint.c:2014
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:2004
+#: src/elflint.c:2065
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:2019
+#: src/elflint.c:2081
 #, c-format
 msgid "section [%2d] '%s': bitmask size not power of 2: %u\n"
 msgstr ""
 
-#: src/elflint.c:2030
+#: src/elflint.c:2092
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected at "
-"least%ld)\n"
+"least %ld)\n"
 msgstr ""
 
-#: src/elflint.c:2038
+#: src/elflint.c:2100
 #, c-format
 msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
 msgstr ""
 
-#: src/elflint.c:2070
+#: src/elflint.c:2132
 #, c-format
 msgid ""
 "section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
 msgstr ""
 
-#: src/elflint.c:2091
+#: src/elflint.c:2153
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
 "undefined\n"
 msgstr ""
 
-#: src/elflint.c:2102
+#: src/elflint.c:2164
 #, c-format
 msgid ""
 "section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
 msgstr ""
 
-#: src/elflint.c:2133
+#: src/elflint.c:2195
 #, c-format
 msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:2138
+#: src/elflint.c:2200
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:2144
+#: src/elflint.c:2206
 #, c-format
 msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
 msgstr ""
 
-#: src/elflint.c:2157
+#: src/elflint.c:2219
 #, c-format
 msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
 msgstr ""
 
-#: src/elflint.c:2175
+#: src/elflint.c:2237
 #, c-format
 msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
 msgstr ""
 
-#: src/elflint.c:2183
+#: src/elflint.c:2245
 #, c-format
 msgid "section [%2d] '%s': hash table entry size incorrect\n"
 msgstr ""
 
-#: src/elflint.c:2188
+#: src/elflint.c:2250
 #, c-format
 msgid "section [%2d] '%s': not marked to be allocated\n"
 msgstr ""
 
-#: src/elflint.c:2193
+#: src/elflint.c:2255
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table has not even room for initial administrative "
 "entries\n"
 msgstr ""
 
-#: src/elflint.c:2241
+#: src/elflint.c:2303
 #, c-format
 msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
 msgstr ""
 
-#: src/elflint.c:2319 src/elflint.c:2323
+#: src/elflint.c:2381 src/elflint.c:2385
 #, c-format
 msgid "section [%2zu] '%s': reference to symbol index 0\n"
 msgstr ""
 
-#: src/elflint.c:2330
+#: src/elflint.c:2392
 #, c-format
 msgid ""
 "symbol %d referenced in new hash table in [%2zu] '%s' but not in old hash "
 "table in [%2zu] '%s'\n"
 msgstr ""
 
-#: src/elflint.c:2342
+#: src/elflint.c:2404
 #, c-format
 msgid ""
 "symbol %d referenced in old hash table in [%2zu] '%s' but not in new hash "
 "table in [%2zu] '%s'\n"
 msgstr ""
 
-#: src/elflint.c:2358
+#: src/elflint.c:2420
 #, c-format
 msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
 msgstr ""
 
-#: src/elflint.c:2378
+#: src/elflint.c:2440
 #, c-format
 msgid ""
 "section [%2d] '%s': section groups only allowed in relocatable object files\n"
 msgstr ""
 
-#: src/elflint.c:2389
+#: src/elflint.c:2451
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol table: %s\n"
 msgstr ""
 
-#: src/elflint.c:2394
+#: src/elflint.c:2456
 #, c-format
 msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
 msgstr ""
 
-#: src/elflint.c:2400
+#: src/elflint.c:2462
 #, c-format
 msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
 msgstr ""
 
-#: src/elflint.c:2405
+#: src/elflint.c:2467
 #, c-format
 msgid "section [%2d] '%s': sh_flags not zero\n"
 msgstr ""
 
-#: src/elflint.c:2412
+#: src/elflint.c:2474
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol for signature\n"
 msgstr ""
 
-#: src/elflint.c:2417
+#: src/elflint.c:2479
 #, c-format
 msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
 msgstr ""
 
-#: src/elflint.c:2423
+#: src/elflint.c:2485
 #, c-format
 msgid "section [%2d] '%s': sh_flags not set correctly\n"
 msgstr ""
 
-#: src/elflint.c:2429
+#: src/elflint.c:2491
 #, c-format
 msgid "section [%2d] '%s': cannot get data: %s\n"
 msgstr ""
 
-#: src/elflint.c:2438
+#: src/elflint.c:2500
 #, c-format
 msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
 msgstr ""
 
-#: src/elflint.c:2443
+#: src/elflint.c:2505
 #, c-format
 msgid "section [%2d] '%s': section group without flags word\n"
 msgstr ""
 
-#: src/elflint.c:2449
+#: src/elflint.c:2511
 #, c-format
 msgid "section [%2d] '%s': section group without member\n"
 msgstr ""
 
-#: src/elflint.c:2453
+#: src/elflint.c:2515
 #, c-format
 msgid "section [%2d] '%s': section group with only one member\n"
 msgstr ""
 
-#: src/elflint.c:2464
+#: src/elflint.c:2526
 #, c-format
 msgid "section [%2d] '%s': unknown section group flags\n"
 msgstr ""
 
-#: src/elflint.c:2476
+#: src/elflint.c:2538
 #, c-format
 msgid "section [%2d] '%s': section index %Zu out of range\n"
 msgstr ""
 
-#: src/elflint.c:2485
+#: src/elflint.c:2547
 #, c-format
 msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
 msgstr ""
 
-#: src/elflint.c:2492
+#: src/elflint.c:2554
 #, c-format
 msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
 msgstr ""
 
-#: src/elflint.c:2498
+#: src/elflint.c:2560
 #, c-format
 msgid ""
 "section [%2d] '%s': element %Zu references section [%2d] '%s' without "
 "SHF_GROUP flag set\n"
 msgstr ""
 
-#: src/elflint.c:2505
+#: src/elflint.c:2567
 #, c-format
 msgid "section [%2d] '%s' is contained in more than one section group\n"
 msgstr ""
 
-#: src/elflint.c:2694
+#: src/elflint.c:2756
 #, c-format
 msgid ""
 "section [%2d] '%s' refers in sh_link to section [%2d] '%s' which is no "
 "dynamic symbol table\n"
 msgstr ""
 
-#: src/elflint.c:2705
+#: src/elflint.c:2768
 #, c-format
 msgid ""
 "section [%2d] '%s' has different number of entries than symbol table [%2d] "
 "'%s'\n"
 msgstr ""
 
-#: src/elflint.c:2721
+#: src/elflint.c:2784
 #, c-format
 msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
 msgstr ""
 
-#: src/elflint.c:2737
+#: src/elflint.c:2800
 #, c-format
 msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
 msgstr ""
 
-#: src/elflint.c:2745
+#: src/elflint.c:2808
 #, c-format
 msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
 msgstr ""
 
-#: src/elflint.c:2759
+#: src/elflint.c:2822
 #, c-format
 msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
 msgstr ""
 
-#: src/elflint.c:2764
+#: src/elflint.c:2827
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: version index %d is for defined version\n"
 msgstr ""
 
-#: src/elflint.c:2774
+#: src/elflint.c:2837
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: version index %d is for requested version\n"
 msgstr ""
 
-#: src/elflint.c:2826
+#: src/elflint.c:2889
 #, c-format
 msgid "more than one version reference section present\n"
 msgstr ""
 
-#: src/elflint.c:2834 src/elflint.c:2963
+#: src/elflint.c:2897 src/elflint.c:3026
 #, c-format
 msgid "section [%2d] '%s': sh_link does not link to string table\n"
 msgstr ""
 
-#: src/elflint.c:2857 src/elflint.c:3015
+#: src/elflint.c:2920 src/elflint.c:3078
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong version %d\n"
 msgstr ""
 
-#: src/elflint.c:2863 src/elflint.c:3021
+#: src/elflint.c:2926 src/elflint.c:3084
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
 msgstr ""
 
-#: src/elflint.c:2871
+#: src/elflint.c:2934
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid file reference\n"
 msgstr ""
 
-#: src/elflint.c:2879
+#: src/elflint.c:2942
 #, c-format
 msgid "section [%2d] '%s': entry %d references unknown dependency\n"
 msgstr ""
 
-#: src/elflint.c:2891
+#: src/elflint.c:2954
 #, c-format
 msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
 msgstr ""
 
-#: src/elflint.c:2898
+#: src/elflint.c:2961
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
 "reference\n"
 msgstr ""
 
-#: src/elflint.c:2905
+#: src/elflint.c:2968
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: "
 "%#x, expected %#x\n"
 msgstr ""
 
-#: src/elflint.c:2915
+#: src/elflint.c:2978
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
 "name '%s'\n"
 msgstr ""
 
-#: src/elflint.c:2926
+#: src/elflint.c:2989
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
 msgstr ""
 
-#: src/elflint.c:2942 src/elflint.c:3100
+#: src/elflint.c:3005 src/elflint.c:3163
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
 msgstr ""
 
-#: src/elflint.c:2955
+#: src/elflint.c:3018
 #, c-format
 msgid "more than one version definition section present\n"
 msgstr ""
 
-#: src/elflint.c:3000
+#: src/elflint.c:3063
 #, c-format
 msgid "section [%2d] '%s': more than one BASE definition\n"
 msgstr ""
 
-#: src/elflint.c:3004
+#: src/elflint.c:3067
 #, c-format
 msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
 msgstr ""
 
-#: src/elflint.c:3010
+#: src/elflint.c:3073
 #, c-format
 msgid "section [%2d] '%s': entry %d has unknown flag\n"
 msgstr ""
 
-#: src/elflint.c:3034
+#: src/elflint.c:3097
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid name reference\n"
 msgstr ""
 
-#: src/elflint.c:3041
+#: src/elflint.c:3104
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
 msgstr ""
 
-#: src/elflint.c:3050
+#: src/elflint.c:3113
 #, c-format
 msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
 msgstr ""
 
-#: src/elflint.c:3069
+#: src/elflint.c:3132
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
 msgstr ""
 
-#: src/elflint.c:3084
+#: src/elflint.c:3147
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
 msgstr ""
 
-#: src/elflint.c:3106
+#: src/elflint.c:3169
 #, c-format
 msgid "section [%2d] '%s': no BASE definition\n"
 msgstr ""
 
-#: src/elflint.c:3122
+#: src/elflint.c:3185
 #, c-format
 msgid "section [%2d] '%s': unknown parent version '%s'\n"
 msgstr ""
 
-#: src/elflint.c:3135
+#: src/elflint.c:3198
 #, c-format
 msgid "section [%2d] '%s': empty object attributes section\n"
 msgstr ""
 
-#: src/elflint.c:3156
+#: src/elflint.c:3219
 #, c-format
 msgid "section [%2d] '%s': unrecognized attribute format\n"
 msgstr ""
 
-#: src/elflint.c:3172
+#: src/elflint.c:3235
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3181
+#: src/elflint.c:3244
 #, c-format
 msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3193
+#: src/elflint.c:3256
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
 msgstr ""
 
-#: src/elflint.c:3210
+#: src/elflint.c:3273
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
 msgstr ""
 
-#: src/elflint.c:3219
+#: src/elflint.c:3282
 #, c-format
 msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3228
+#: src/elflint.c:3291
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
 msgstr ""
 
-#: src/elflint.c:3241
+#: src/elflint.c:3304
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
 msgstr ""
 
-#: src/elflint.c:3252
+#: src/elflint.c:3315
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
 msgstr ""
 
-#: src/elflint.c:3270
+#: src/elflint.c:3333
 #, c-format
 msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
 msgstr ""
 
-#: src/elflint.c:3281
+#: src/elflint.c:3344
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
 msgstr ""
 
-#: src/elflint.c:3294
+#: src/elflint.c:3357
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
 msgstr ""
 
-#: src/elflint.c:3298
+#: src/elflint.c:3361
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
 msgstr ""
 
-#: src/elflint.c:3308
+#: src/elflint.c:3371
 #, c-format
 msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
 msgstr ""
 
-#: src/elflint.c:3314
+#: src/elflint.c:3377
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3403
+#: src/elflint.c:3466
 #, c-format
 msgid "cannot get section header of zeroth section\n"
 msgstr ""
 
-#: src/elflint.c:3407
+#: src/elflint.c:3470
 #, c-format
 msgid "zeroth section has nonzero name\n"
 msgstr ""
 
-#: src/elflint.c:3409
+#: src/elflint.c:3472
 #, c-format
 msgid "zeroth section has nonzero type\n"
 msgstr ""
 
-#: src/elflint.c:3411
+#: src/elflint.c:3474
 #, c-format
 msgid "zeroth section has nonzero flags\n"
 msgstr ""
 
-#: src/elflint.c:3413
+#: src/elflint.c:3476
 #, c-format
 msgid "zeroth section has nonzero address\n"
 msgstr ""
 
-#: src/elflint.c:3415
+#: src/elflint.c:3478
 #, c-format
 msgid "zeroth section has nonzero offset\n"
 msgstr ""
 
-#: src/elflint.c:3417
+#: src/elflint.c:3480
 #, c-format
 msgid "zeroth section has nonzero align value\n"
 msgstr ""
 
-#: src/elflint.c:3419
+#: src/elflint.c:3482
 #, c-format
 msgid "zeroth section has nonzero entry size value\n"
 msgstr ""
 
-#: src/elflint.c:3422
+#: src/elflint.c:3485
 #, c-format
 msgid ""
 "zeroth section has nonzero size value while ELF header has nonzero shnum "
 "value\n"
 msgstr ""
 
-#: src/elflint.c:3426
+#: src/elflint.c:3489
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
 "overflow in shstrndx\n"
 msgstr ""
 
-#: src/elflint.c:3430
+#: src/elflint.c:3493
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
 "overflow in phnum\n"
 msgstr ""
 
-#: src/elflint.c:3447
+#: src/elflint.c:3510
 #, c-format
 msgid "cannot get section header for section [%2zu] '%s': %s\n"
 msgstr ""
 
-#: src/elflint.c:3456
+#: src/elflint.c:3519
 #, c-format
 msgid "section [%2zu]: invalid name\n"
 msgstr ""
 
-#: src/elflint.c:3483
+#: src/elflint.c:3546
 #, c-format
 msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
 msgstr ""
 
-#: src/elflint.c:3499
+#: src/elflint.c:3562
 #, c-format
 msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
 msgstr ""
 
-#: src/elflint.c:3516
+#: src/elflint.c:3579
 #, c-format
 msgid ""
 "section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
 msgstr ""
 
-#: src/elflint.c:3534
+#: src/elflint.c:3597
 #, c-format
 msgid "section [%2zu] '%s' present in object file\n"
 msgstr ""
 
-#: src/elflint.c:3540 src/elflint.c:3572
+#: src/elflint.c:3603 src/elflint.c:3635
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
 msgstr ""
 
-#: src/elflint.c:3545 src/elflint.c:3577
+#: src/elflint.c:3608 src/elflint.c:3640
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
 "segments\n"
 msgstr ""
 
-#: src/elflint.c:3553
+#: src/elflint.c:3616
 #, c-format
 msgid ""
 "section [%2zu] '%s' is extension section index table in non-object file\n"
 msgstr ""
 
-#: src/elflint.c:3596
+#: src/elflint.c:3659
 #, c-format
 msgid "section [%2zu] '%s': size not multiple of entry size\n"
 msgstr ""
 
-#: src/elflint.c:3601
+#: src/elflint.c:3664
 #, c-format
 msgid "cannot get section header\n"
 msgstr ""
 
-#: src/elflint.c:3611
+#: src/elflint.c:3674
 #, c-format
 msgid "section [%2zu] '%s' has unsupported type %d\n"
 msgstr ""
 
-#: src/elflint.c:3625
+#: src/elflint.c:3688
 #, c-format
 msgid ""
 "section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:3632
+#: src/elflint.c:3695
 #, c-format
 msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:3640
+#: src/elflint.c:3703
 #, c-format
 msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
 msgstr ""
 
-#: src/elflint.c:3648
+#: src/elflint.c:3711
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in link value\n"
 msgstr ""
 
-#: src/elflint.c:3653
+#: src/elflint.c:3716
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in info value\n"
 msgstr ""
 
-#: src/elflint.c:3660
+#: src/elflint.c:3723
 #, c-format
 msgid "section [%2zu] '%s': strings flag set without merge flag\n"
 msgstr ""
 
-#: src/elflint.c:3665
+#: src/elflint.c:3728
 #, c-format
 msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
 msgstr ""
 
-#: src/elflint.c:3683
+#: src/elflint.c:3746
 #, c-format
 msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
 msgstr ""
 
-#: src/elflint.c:3692
+#: src/elflint.c:3755
 #, c-format
 msgid "section [%2zu] '%s' is both executable and writable\n"
 msgstr ""
 
-#: src/elflint.c:3721
+#: src/elflint.c:3784
 #, c-format
 msgid ""
 "section [%2zu] '%s' not fully contained in segment of program header entry "
 "%d\n"
 msgstr ""
 
-#: src/elflint.c:3729
+#: src/elflint.c:3792
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
 "program header entry %d\n"
 msgstr ""
 
-#: src/elflint.c:3738
+#: src/elflint.c:3801
 #, c-format
 msgid ""
 "section [%2zu] '%s' has not type NOBITS but is not read from the file in "
 "segment of program header entry %d\n"
 msgstr ""
 
-#: src/elflint.c:3749
+#: src/elflint.c:3812
 #, c-format
 msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
 msgstr ""
 
-#: src/elflint.c:3759
+#: src/elflint.c:3822
 #, c-format
 msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
 msgstr ""
 
-#: src/elflint.c:3769
+#: src/elflint.c:3832
 #, c-format
 msgid ""
 "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
 msgstr ""
 
-#: src/elflint.c:3775
+#: src/elflint.c:3838
 #, c-format
 msgid ""
 "section [%2zu] '%s': ELF header says this is the section header string table "
 "but type is not SHT_TYPE\n"
 msgstr ""
 
-#: src/elflint.c:3783
+#: src/elflint.c:3846
 #, c-format
 msgid ""
 "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
 msgstr ""
 
-#: src/elflint.c:3834
+#: src/elflint.c:3897
 #, c-format
 msgid "more than one version symbol table present\n"
 msgstr ""
 
-#: src/elflint.c:3857
+#: src/elflint.c:3920
 #, c-format
 msgid "INTERP program header entry but no .interp section\n"
 msgstr ""
 
-#: src/elflint.c:3868
+#: src/elflint.c:3931
 #, c-format
 msgid ""
 "loadable segment [%u] is executable but contains no executable sections\n"
 msgstr ""
 
-#: src/elflint.c:3874
+#: src/elflint.c:3937
 #, c-format
 msgid "loadable segment [%u] is writable but contains no writable sections\n"
 msgstr ""
 
-#: src/elflint.c:3885
+#: src/elflint.c:3948
 #, c-format
 msgid ""
 "no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
 "exist\n"
 msgstr ""
 
-#: src/elflint.c:3898
+#: src/elflint.c:3961
 #, c-format
 msgid "duplicate version index %d\n"
 msgstr ""
 
-#: src/elflint.c:3912
+#: src/elflint.c:3975
 #, c-format
 msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
 msgstr ""
 
-#: src/elflint.c:3961
+#: src/elflint.c:4024
 #, c-format
 msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
 msgstr ""
 
-#: src/elflint.c:3965
+#: src/elflint.c:4028
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
 msgstr ""
 
-#: src/elflint.c:3988
+#: src/elflint.c:4051
 #, c-format
 msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
 msgstr ""
 
-#: src/elflint.c:3992
+#: src/elflint.c:4055
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
 msgstr ""
 
-#: src/elflint.c:4009
+#: src/elflint.c:4072
 #, c-format
 msgid "phdr[%d]: no note entries defined for the type of file\n"
 msgstr ""
 
-#: src/elflint.c:4028
+#: src/elflint.c:4091
 #, c-format
 msgid "phdr[%d]: cannot get content of note section: %s\n"
 msgstr ""
 
-#: src/elflint.c:4031
+#: src/elflint.c:4094
 #, c-format
 msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
 msgstr ""
 
-#: src/elflint.c:4052
+#: src/elflint.c:4115
 #, c-format
 msgid "section [%2d] '%s': no note entries defined for the type of file\n"
 msgstr ""
 
-#: src/elflint.c:4059
+#: src/elflint.c:4122
 #, c-format
 msgid "section [%2d] '%s': cannot get content of note section\n"
 msgstr ""
 
-#: src/elflint.c:4062
+#: src/elflint.c:4125
 #, c-format
 msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
 msgstr ""
 
-#: src/elflint.c:4080
+#: src/elflint.c:4143
 #, c-format
 msgid ""
 "only executables, shared objects, and core files can have program headers\n"
 msgstr ""
 
-#: src/elflint.c:4095
+#: src/elflint.c:4158
 #, c-format
 msgid "cannot get program header entry %d: %s\n"
 msgstr ""
 
-#: src/elflint.c:4104
+#: src/elflint.c:4167
 #, c-format
 msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:4115
+#: src/elflint.c:4178
 #, c-format
 msgid "more than one INTERP entry in program header\n"
 msgstr ""
 
-#: src/elflint.c:4123
+#: src/elflint.c:4186
 #, c-format
 msgid "more than one TLS entry in program header\n"
 msgstr ""
 
-#: src/elflint.c:4130
+#: src/elflint.c:4193
 #, c-format
 msgid "static executable cannot have dynamic sections\n"
 msgstr ""
 
-#: src/elflint.c:4144
+#: src/elflint.c:4207
 #, c-format
 msgid "dynamic section reference in program header has wrong offset\n"
 msgstr ""
 
-#: src/elflint.c:4147
+#: src/elflint.c:4210
 #, c-format
 msgid "dynamic section size mismatch in program and section header\n"
 msgstr ""
 
-#: src/elflint.c:4157
+#: src/elflint.c:4220
 #, c-format
 msgid "more than one GNU_RELRO entry in program header\n"
 msgstr ""
 
-#: src/elflint.c:4178
+#: src/elflint.c:4241
 #, c-format
 msgid "loadable segment GNU_RELRO applies to is not writable\n"
 msgstr ""
 
-#: src/elflint.c:4181
+#: src/elflint.c:4244
 #, c-format
 msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
 msgstr ""
 
-#: src/elflint.c:4189 src/elflint.c:4212
+#: src/elflint.c:4252 src/elflint.c:4275
 #, c-format
 msgid "%s segment not contained in a loaded segment\n"
 msgstr ""
 
-#: src/elflint.c:4218
+#: src/elflint.c:4281
 #, c-format
 msgid "program header offset in ELF header and PHDR entry do not match"
 msgstr ""
 
-#: src/elflint.c:4242
+#: src/elflint.c:4305
 #, c-format
 msgid "call frame search table reference in program header has wrong offset\n"
 msgstr ""
 
-#: src/elflint.c:4245
+#: src/elflint.c:4308
 #, c-format
 msgid "call frame search table size mismatch in program and section header\n"
 msgstr ""
 
-#: src/elflint.c:4258
+#: src/elflint.c:4321
 #, c-format
 msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
 msgstr ""
 
-#: src/elflint.c:4266
+#: src/elflint.c:4329
 #, c-format
 msgid "call frame search table must be allocated\n"
 msgstr ""
 
-#: src/elflint.c:4269
+#: src/elflint.c:4332
 #, c-format
 msgid "section [%2zu] '%s' must be allocated\n"
 msgstr ""
 
-#: src/elflint.c:4273
+#: src/elflint.c:4336
 #, c-format
 msgid "call frame search table must not be writable\n"
 msgstr ""
 
-#: src/elflint.c:4276
+#: src/elflint.c:4339
 #, c-format
 msgid "section [%2zu] '%s' must not be writable\n"
 msgstr ""
 
-#: src/elflint.c:4281
+#: src/elflint.c:4344
 #, c-format
 msgid "call frame search table must not be executable\n"
 msgstr ""
 
-#: src/elflint.c:4284
+#: src/elflint.c:4347
 #, c-format
 msgid "section [%2zu] '%s' must not be executable\n"
 msgstr ""
 
-#: src/elflint.c:4295
+#: src/elflint.c:4358
 #, c-format
 msgid "program header entry %d: file size greater than memory size\n"
 msgstr ""
 
-#: src/elflint.c:4302
+#: src/elflint.c:4365
 #, c-format
 msgid "program header entry %d: alignment not a power of 2\n"
 msgstr ""
 
-#: src/elflint.c:4305
+#: src/elflint.c:4368
 #, c-format
 msgid ""
 "program header entry %d: file offset and virtual address not module of "
 "alignment\n"
 msgstr ""
 
-#: src/elflint.c:4318
+#: src/elflint.c:4381
 #, c-format
 msgid ""
 "executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
 "program header entry"
 msgstr ""
 
-#: src/elflint.c:4352
+#: src/elflint.c:4415
 #, c-format
 msgid "cannot read ELF header: %s\n"
 msgstr ""
 
-#: src/elflint.c:4378
+#: src/elflint.c:4441
 #, c-format
 msgid "text relocation flag set but not needed\n"
 msgstr ""
@@ -3271,7 +3341,8 @@ msgstr ""
 msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
 msgstr ""
 
-#: src/ldgeneric.c:651 src/ldgeneric.c:1112 src/readelf.c:640 src/strip.c:562
+#: src/ldgeneric.c:651 src/ldgeneric.c:1112 src/readelf.c:527
+#: src/readelf.c:829 src/strip.c:563
 #, c-format
 msgid "cannot determine number of sections: %s"
 msgstr ""
@@ -3502,7 +3573,7 @@ msgstr ""
 msgid "cannot get header of 0th section: %s"
 msgstr ""
 
-#: src/ldgeneric.c:6930 src/unstrip.c:1810
+#: src/ldgeneric.c:6930 src/unstrip.c:1818
 #, c-format
 msgid "cannot update ELF header: %s"
 msgstr ""
@@ -3670,7 +3741,7 @@ msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
 msgstr "%s: INTERNER FEHLER %d (%s-%s): %s"
 
 #: src/nm.c:398 src/nm.c:410 src/size.c:309 src/size.c:318 src/size.c:329
-#: src/strip.c:2124
+#: src/strip.c:2155
 #, c-format
 msgid "while closing '%s'"
 msgstr "beim Schliessen von '%s'"
@@ -3714,17 +3785,17 @@ msgstr "%s%s%s: Dateiformat nicht erkannt"
 msgid "cannot create search tree"
 msgstr "Kann Suchbaum nicht erstellen"
 
-#: src/nm.c:757 src/nm.c:1156 src/objdump.c:787 src/readelf.c:896
-#: src/readelf.c:1039 src/readelf.c:1187 src/readelf.c:1369 src/readelf.c:1569
-#: src/readelf.c:1755 src/readelf.c:1965 src/readelf.c:2219 src/readelf.c:2285
-#: src/readelf.c:2363 src/readelf.c:2861 src/readelf.c:2897 src/readelf.c:2959
-#: src/readelf.c:7270 src/readelf.c:8176 src/readelf.c:8323 src/readelf.c:8391
-#: src/size.c:417 src/size.c:491 src/strip.c:502
+#: src/nm.c:757 src/nm.c:1163 src/objdump.c:787 src/readelf.c:536
+#: src/readelf.c:1085 src/readelf.c:1245 src/readelf.c:1393 src/readelf.c:1579
+#: src/readelf.c:1785 src/readelf.c:1972 src/readelf.c:2196 src/readelf.c:2454
+#: src/readelf.c:2524 src/readelf.c:2606 src/readelf.c:3117 src/readelf.c:3153
+#: src/readelf.c:3216 src/readelf.c:7920 src/readelf.c:9002 src/readelf.c:9149
+#: src/readelf.c:9217 src/size.c:417 src/size.c:487 src/strip.c:503
 #, c-format
 msgid "cannot get section header string table index"
 msgstr ""
 
-#: src/nm.c:782
+#: src/nm.c:784
 #, c-format
 msgid ""
 "\n"
@@ -3737,29 +3808,29 @@ msgstr ""
 "Symbole aus %s:\n"
 "\n"
 
-#: src/nm.c:785
+#: src/nm.c:787
 #, c-format
 msgid ""
 "%*s%-*s %-*s Class  Type     %-*s %*s Section\n"
 "\n"
 msgstr ""
 
-#: src/nm.c:1166
+#: src/nm.c:1173
 #, c-format
 msgid "%s: entry size in section `%s' is not what we expect"
 msgstr "%s: entry size in section `%s' is not what we expect"
 
-#: src/nm.c:1170
+#: src/nm.c:1177
 #, c-format
 msgid "%s: size of section `%s' is not multiple of entry size"
 msgstr ""
 
-#: src/nm.c:1428
+#: src/nm.c:1435
 #, c-format
 msgid "%s%s%s%s: Invalid operation"
 msgstr "%s%s%s%s: Ungültige Operation"
 
-#: src/nm.c:1485
+#: src/nm.c:1492
 #, c-format
 msgid "%s%s%s: no symbols"
 msgstr "%s%s%s: keine Symbole"
@@ -3793,7 +3864,7 @@ msgstr ""
 msgid "Show information from FILEs (a.out by default)."
 msgstr ""
 
-#: src/objdump.c:236 src/readelf.c:439
+#: src/objdump.c:236 src/readelf.c:473
 msgid "No operation specified.\n"
 msgstr "Keine Operation angegeben.\n"
 
@@ -3802,11 +3873,11 @@ msgstr "Keine Operation angegeben.\n"
 msgid "while close `%s'"
 msgstr ""
 
-#: src/objdump.c:379 src/readelf.c:1664 src/readelf.c:1838
+#: src/objdump.c:379 src/readelf.c:1880 src/readelf.c:2069
 msgid "INVALID SYMBOL"
 msgstr ""
 
-#: src/objdump.c:394 src/readelf.c:1695 src/readelf.c:1871
+#: src/objdump.c:394 src/readelf.c:1911 src/readelf.c:2102
 msgid "INVALID SECTION"
 msgstr ""
 
@@ -3860,388 +3931,435 @@ msgstr "'%s' ist kein Archiv"
 msgid "error while freeing sub-ELF descriptor: %s"
 msgstr ""
 
-#: src/readelf.c:67
+#: src/readelf.c:71
+#, fuzzy
+msgid "ELF input selection:"
+msgstr "Eingabeauswahloptionen:"
+
+#: src/readelf.c:73
+msgid ""
+"Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data"
+msgstr ""
+
+#: src/readelf.c:75
 #, fuzzy
 msgid "ELF output selection:"
 msgstr "Eingabeauswahloptionen:"
 
-#: src/readelf.c:69
+#: src/readelf.c:77
 msgid "All these plus -p .strtab -p .dynstr -p .comment"
 msgstr ""
 
-#: src/readelf.c:70
+#: src/readelf.c:78
 msgid "Display the dynamic segment"
 msgstr ""
 
-#: src/readelf.c:71
+#: src/readelf.c:79
 msgid "Display the ELF file header"
 msgstr ""
 
-#: src/readelf.c:73
+#: src/readelf.c:81
 msgid "Display histogram of bucket list lengths"
 msgstr ""
 
-#: src/readelf.c:74
+#: src/readelf.c:82
 msgid "Display the program headers"
 msgstr "Programm-Köpfe anzeigen"
 
-#: src/readelf.c:76
+#: src/readelf.c:84
 msgid "Display relocations"
 msgstr "Relocations anzeigen"
 
-#: src/readelf.c:77
+#: src/readelf.c:85
 #, fuzzy
 msgid "Display the sections' headers"
 msgstr "Programm-Köpfe anzeigen"
 
-#: src/readelf.c:79
+#: src/readelf.c:87
 msgid "Display the symbol table"
 msgstr "Symboltabelle anzeigen"
 
-#: src/readelf.c:80
+#: src/readelf.c:88
 msgid "Display versioning information"
 msgstr "Versionierungsinformationen anzeigen"
 
-#: src/readelf.c:81
+#: src/readelf.c:89
 #, fuzzy
 msgid "Display the ELF notes"
 msgstr "Kernnotizen anzeigen"
 
-#: src/readelf.c:83
+#: src/readelf.c:91
 #, fuzzy
 msgid "Display architecture specific information, if any"
 msgstr "Architekturspezifische Informationen anzeigen (falls vorhanden)"
 
-#: src/readelf.c:85
+#: src/readelf.c:93
 msgid "Display sections for exception handling"
 msgstr "Abschnitte für Ausnahmebehandlung anzeigen"
 
-#: src/readelf.c:87
+#: src/readelf.c:95
 msgid "Additional output selection:"
 msgstr ""
 
-#: src/readelf.c:89
+#: src/readelf.c:97
 msgid ""
 "Display DWARF section content.  SECTION can be one of abbrev, aranges, "
-"frame, gdb_index, info, loc, line, ranges, pubnames, str, macinfo, macro or "
-"exception"
+"decodedaranges, frame, gdb_index, info, loc, line, decodedline, ranges, "
+"pubnames, str, macinfo, macro or exception"
 msgstr ""
 
-#: src/readelf.c:93
+#: src/readelf.c:101
 msgid "Dump the uninterpreted contents of SECTION, by number or name"
 msgstr ""
 
-#: src/readelf.c:95
+#: src/readelf.c:103
 msgid "Print string contents of sections"
 msgstr ""
 
-#: src/readelf.c:98
+#: src/readelf.c:106
 msgid "Display the symbol index of an archive"
 msgstr "Symbolindex des Archivs anzeigen"
 
-#: src/readelf.c:100
+#: src/readelf.c:108
 msgid "Output control:"
 msgstr "Ausgabekontrolle:"
 
-#: src/readelf.c:102
+#: src/readelf.c:110
 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:104
+#: src/readelf.c:112
+#, 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:114
 msgid "Ignored for compatibility (lines always wide)"
 msgstr ""
 
-#: src/readelf.c:109
+#: src/readelf.c:119
 msgid "Print information from ELF file in human-readable form."
 msgstr "Informationen aus der ELF-Datei in menschenlesbarer Form ausgeben."
 
-#: src/readelf.c:410
+#: src/readelf.c:441
 #, c-format
 msgid "Unknown DWARF debug section `%s'.\n"
 msgstr ""
 
-#: src/readelf.c:476
+#: src/readelf.c:520 src/readelf.c:631
 #, c-format
 msgid "cannot generate Elf descriptor: %s"
 msgstr "konnte Elf-Deskriptor nicht erzeugen: %s"
 
-#: src/readelf.c:488
+#: src/readelf.c:545 src/readelf.c:1099 src/readelf.c:1269
 #, c-format
-msgid "'%s' is not an archive, cannot print archive index"
+msgid "cannot get section: %s"
+msgstr ""
+
+#: src/readelf.c:554 src/readelf.c:1106 src/readelf.c:1277 src/readelf.c:9169
+#: src/unstrip.c:352 src/unstrip.c:383 src/unstrip.c:432 src/unstrip.c:540
+#: src/unstrip.c:557 src/unstrip.c:593 src/unstrip.c:791 src/unstrip.c:1059
+#: src/unstrip.c:1250 src/unstrip.c:1310 src/unstrip.c:1431 src/unstrip.c:1484
+#: src/unstrip.c:1591 src/unstrip.c:1780
+#, c-format
+msgid "cannot get section header: %s"
 msgstr ""
 
-#: src/readelf.c:493
+#: src/readelf.c:562
+#, fuzzy, c-format
+msgid "cannot get section name"
+msgstr "konnte Abschnittsdaten nicht holen: %s"
+
+#: src/readelf.c:571 src/readelf.c:5221 src/readelf.c:7414 src/readelf.c:7516
+#: src/readelf.c:7674
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr ""
+
+#: src/readelf.c:587
+#, fuzzy, c-format
+msgid "cannot create temp file '%s'"
+msgstr "neue Datei konnte nicht angelegt werden"
+
+#: src/readelf.c:596
+#, fuzzy, c-format
+msgid "cannot write section data"
+msgstr "konnte Abschnittsdaten nicht holen: %s"
+
+#: src/readelf.c:602 src/readelf.c:619 src/readelf.c:648
 #, c-format
 msgid "error while closing Elf descriptor: %s"
 msgstr ""
 
-#: src/readelf.c:585
+#: src/readelf.c:609
+#, fuzzy, c-format
+msgid "error while rewinding file descriptor"
+msgstr "Fehler beim Schliessen des Elf-Desktriptor: %s\n"
+
+#: src/readelf.c:643
+#, c-format
+msgid "'%s' is not an archive, cannot print archive index"
+msgstr ""
+
+#: src/readelf.c:742
+#, fuzzy, c-format
+msgid "No such section '%s' in '%s'"
+msgstr "konnte Abschnittsdaten nicht holen: %s"
+
+#: src/readelf.c:769
 #, c-format
 msgid "cannot stat input file"
 msgstr ""
 
-#: src/readelf.c:587
+#: src/readelf.c:771
 #, c-format
 msgid "input file is empty"
 msgstr ""
 
-#: src/readelf.c:589
+#: src/readelf.c:773
 #, c-format
 msgid "failed reading '%s': %s"
 msgstr "Konnte '%s' nicht lesen: %s"
 
-#: src/readelf.c:625
+#: src/readelf.c:814
 #, c-format
 msgid "cannot read ELF header: %s"
 msgstr ""
 
-#: src/readelf.c:633
+#: src/readelf.c:822
 #, c-format
 msgid "cannot create EBL handle"
 msgstr ""
 
-#: src/readelf.c:646
+#: src/readelf.c:835
 #, fuzzy, c-format
 msgid "cannot determine number of program headers: %s"
 msgstr "konnte Programm-Kopf nicht erstellen: %s"
 
-#: src/readelf.c:732
+#: src/readelf.c:921
 msgid "NONE (None)"
 msgstr ""
 
-#: src/readelf.c:733
+#: src/readelf.c:922
 msgid "REL (Relocatable file)"
 msgstr ""
 
-#: src/readelf.c:734
+#: src/readelf.c:923
 msgid "EXEC (Executable file)"
 msgstr ""
 
-#: src/readelf.c:735
+#: src/readelf.c:924
 msgid "DYN (Shared object file)"
 msgstr ""
 
-#: src/readelf.c:736
+#: src/readelf.c:925
 msgid "CORE (Core file)"
 msgstr ""
 
-#: src/readelf.c:741
+#: src/readelf.c:930
 #, c-format
 msgid "OS Specific: (%x)\n"
 msgstr ""
 
-#: src/readelf.c:743
+#: src/readelf.c:932
 #, c-format
 msgid "Processor Specific: (%x)\n"
 msgstr ""
 
-#: src/readelf.c:753
+#: src/readelf.c:942
 msgid ""
 "ELF Header:\n"
 "  Magic:  "
 msgstr ""
 
-#: src/readelf.c:757
+#: src/readelf.c:946
 #, c-format
 msgid ""
 "\n"
 "  Class:                             %s\n"
 msgstr ""
 
-#: src/readelf.c:762
+#: src/readelf.c:951
 #, fuzzy, c-format
 msgid "  Data:                              %s\n"
 msgstr "  Daten:                             %s\n"
 
-#: src/readelf.c:768
+#: src/readelf.c:957
 #, c-format
 msgid "  Ident Version:                     %hhd %s\n"
 msgstr ""
 
-#: src/readelf.c:770 src/readelf.c:787
+#: src/readelf.c:959 src/readelf.c:976
 msgid "(current)"
 msgstr "(aktuell)"
 
-#: src/readelf.c:774
+#: src/readelf.c:963
 #, c-format
 msgid "  OS/ABI:                            %s\n"
 msgstr ""
 
-#: src/readelf.c:777
+#: src/readelf.c:966
 #, c-format
 msgid "  ABI Version:                       %hhd\n"
 msgstr ""
 
-#: src/readelf.c:780
+#: src/readelf.c:969
 msgid "  Type:                              "
 msgstr "  Typ:                               "
 
-#: src/readelf.c:783
+#: src/readelf.c:972
 #, c-format
 msgid "  Machine:                           %s\n"
 msgstr ""
 
-#: src/readelf.c:785
+#: src/readelf.c:974
 #, c-format
 msgid "  Version:                           %d %s\n"
 msgstr ""
 
-#: src/readelf.c:789
+#: src/readelf.c:978
 #, c-format
 msgid "  Entry point address:               %#<PRIx64>\n"
 msgstr ""
 
-#: src/readelf.c:792
+#: src/readelf.c:981
 #, c-format
 msgid "  Start of program headers:          %<PRId64> %s\n"
 msgstr ""
 
-#: src/readelf.c:793 src/readelf.c:796
+#: src/readelf.c:982 src/readelf.c:985
 msgid "(bytes into file)"
 msgstr ""
 
-#: src/readelf.c:795
+#: src/readelf.c:984
 #, c-format
 msgid "  Start of section headers:          %<PRId64> %s\n"
 msgstr ""
 
-#: src/readelf.c:798
+#: src/readelf.c:987
 #, c-format
 msgid "  Flags:                             %s\n"
 msgstr ""
 
-#: src/readelf.c:801
+#: src/readelf.c:990
 #, c-format
 msgid "  Size of this header:               %<PRId16> %s\n"
 msgstr ""
 
-#: src/readelf.c:802 src/readelf.c:805 src/readelf.c:822
+#: src/readelf.c:991 src/readelf.c:994 src/readelf.c:1011
 msgid "(bytes)"
 msgstr "(Bytes)"
 
-#: src/readelf.c:804
+#: src/readelf.c:993
 #, c-format
 msgid "  Size of program header entries:    %<PRId16> %s\n"
 msgstr ""
 
-#: src/readelf.c:807
+#: src/readelf.c:996
 #, c-format
 msgid "  Number of program headers entries: %<PRId16>"
 msgstr ""
 
-#: src/readelf.c:814
+#: src/readelf.c:1003
 #, c-format
 msgid " (%<PRIu32> in [0].sh_info)"
 msgstr ""
 
-#: src/readelf.c:817 src/readelf.c:834 src/readelf.c:848
+#: src/readelf.c:1006 src/readelf.c:1023 src/readelf.c:1037
 msgid " ([0] not available)"
 msgstr ""
 
-#: src/readelf.c:821
+#: src/readelf.c:1010
 #, c-format
 msgid "  Size of section header entries:    %<PRId16> %s\n"
 msgstr ""
 
-#: src/readelf.c:824
+#: src/readelf.c:1013
 #, c-format
 msgid "  Number of section headers entries: %<PRId16>"
 msgstr ""
 
-#: src/readelf.c:831
+#: src/readelf.c:1020
 #, c-format
 msgid " (%<PRIu32> in [0].sh_size)"
 msgstr ""
 
-#: src/readelf.c:844
+#: src/readelf.c:1033
 #, c-format
 msgid " (%<PRIu32> in [0].sh_link)"
 msgstr ""
 
-#: src/readelf.c:852
+#: src/readelf.c:1041
 #, c-format
 msgid ""
 "  Section header string table index: XINDEX%s\n"
 "\n"
 msgstr ""
 
-#: src/readelf.c:856
+#: src/readelf.c:1045
 #, c-format
 msgid ""
 "  Section header string table index: %<PRId16>\n"
 "\n"
 msgstr ""
 
-#: src/readelf.c:888
+#: src/readelf.c:1077
 #, c-format
 msgid ""
 "There are %d section headers, starting at offset %#<PRIx64>:\n"
 "\n"
 msgstr ""
 
-#: src/readelf.c:898
+#: src/readelf.c:1087
 msgid "Section Headers:"
 msgstr ""
 
-#: src/readelf.c:901
+#: src/readelf.c:1090
 msgid ""
 "[Nr] Name                 Type         Addr     Off    Size   ES Flags Lk "
 "Inf Al"
 msgstr ""
 
-#: src/readelf.c:903
+#: src/readelf.c:1092
 msgid ""
 "[Nr] Name                 Type         Addr             Off      Size     ES "
 "Flags Lk Inf Al"
 msgstr ""
 
-#: src/readelf.c:910 src/readelf.c:1063
-#, c-format
-msgid "cannot get section: %s"
-msgstr ""
-
-#: src/readelf.c:917 src/readelf.c:1071 src/readelf.c:8343 src/unstrip.c:345
-#: src/unstrip.c:376 src/unstrip.c:425 src/unstrip.c:533 src/unstrip.c:550
-#: src/unstrip.c:586 src/unstrip.c:784 src/unstrip.c:1052 src/unstrip.c:1242
-#: src/unstrip.c:1302 src/unstrip.c:1423 src/unstrip.c:1476 src/unstrip.c:1583
-#: src/unstrip.c:1772
-#, c-format
-msgid "cannot get section header: %s"
-msgstr ""
-
-#: src/readelf.c:975
+#: src/readelf.c:1164
 msgid "Program Headers:"
 msgstr "Programm-Köpfe:"
 
-#: src/readelf.c:977
+#: src/readelf.c:1166
 msgid ""
 "  Type           Offset   VirtAddr   PhysAddr   FileSiz  MemSiz   Flg Align"
 msgstr ""
 
-#: src/readelf.c:980
+#: src/readelf.c:1169
 msgid ""
 "  Type           Offset   VirtAddr           PhysAddr           FileSiz  "
 "MemSiz   Flg Align"
 msgstr ""
 
-#: src/readelf.c:1020
+#: src/readelf.c:1226
 #, c-format
 msgid "\t[Requesting program interpreter: %s]\n"
 msgstr ""
 
-#: src/readelf.c:1041
+#: src/readelf.c:1247
 msgid ""
 "\n"
 " Section to Segment mapping:\n"
 "  Segment Sections..."
 msgstr ""
 
-#: src/readelf.c:1052 src/unstrip.c:1827 src/unstrip.c:1866 src/unstrip.c:1873
+#: src/readelf.c:1258 src/unstrip.c:1835 src/unstrip.c:1874 src/unstrip.c:1881
 #, c-format
 msgid "cannot get program header: %s"
 msgstr ""
 
-#: src/readelf.c:1193
+#: src/readelf.c:1401
 #, c-format
 msgid ""
 "\n"
@@ -4252,7 +4370,7 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:1198
+#: src/readelf.c:1406
 #, c-format
 msgid ""
 "\n"
@@ -4263,15 +4381,21 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:1206
+#: src/readelf.c:1414
 msgid "<INVALID SYMBOL>"
 msgstr ""
 
-#: src/readelf.c:1220
+#: src/readelf.c:1428
 msgid "<INVALID SECTION>"
 msgstr ""
 
-#: src/readelf.c:1371
+#: src/readelf.c:1585 src/readelf.c:2202 src/readelf.c:2460 src/readelf.c:2530
+#: src/readelf.c:2812 src/readelf.c:2885 src/readelf.c:4488
+#, fuzzy, c-format
+msgid "invalid sh_link value in section %Zu"
+msgstr "ungültige .debug_line Sektion"
+
+#: src/readelf.c:1588
 #, c-format
 msgid ""
 "\n"
@@ -4284,43 +4408,43 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:1383
+#: src/readelf.c:1598
 msgid "  Type              Value\n"
 msgstr ""
 
-#: src/readelf.c:1407
+#: src/readelf.c:1622
 #, c-format
 msgid "Shared library: [%s]\n"
 msgstr ""
 
-#: src/readelf.c:1412
+#: src/readelf.c:1627
 #, c-format
 msgid "Library soname: [%s]\n"
 msgstr ""
 
-#: src/readelf.c:1417
+#: src/readelf.c:1632
 #, c-format
 msgid "Library rpath: [%s]\n"
 msgstr ""
 
-#: src/readelf.c:1422
+#: src/readelf.c:1637
 #, c-format
 msgid "Library runpath: [%s]\n"
 msgstr ""
 
-#: src/readelf.c:1442
+#: src/readelf.c:1657
 #, c-format
 msgid "%<PRId64> (bytes)\n"
 msgstr ""
 
-#: src/readelf.c:1554 src/readelf.c:1740
+#: src/readelf.c:1770 src/readelf.c:1957
 #, c-format
 msgid ""
 "\n"
 "Invalid symbol table at offset %#0<PRIx64>\n"
 msgstr ""
 
-#: src/readelf.c:1572 src/readelf.c:1757
+#: src/readelf.c:1788 src/readelf.c:1975
 #, c-format
 msgid ""
 "\n"
@@ -4333,7 +4457,7 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:1587
+#: src/readelf.c:1803 src/readelf.c:1990
 #, c-format
 msgid ""
 "\n"
@@ -4344,29 +4468,29 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:1597
+#: src/readelf.c:1813
 msgid "  Offset      Type                 Value       Name\n"
 msgstr ""
 
-#: src/readelf.c:1599
+#: src/readelf.c:1815
 msgid "  Offset              Type                 Value               Name\n"
 msgstr ""
 
-#: src/readelf.c:1652 src/readelf.c:1663 src/readelf.c:1676 src/readelf.c:1694
-#: src/readelf.c:1706 src/readelf.c:1825 src/readelf.c:1837 src/readelf.c:1851
-#: src/readelf.c:1870 src/readelf.c:1883
+#: src/readelf.c:1868 src/readelf.c:1879 src/readelf.c:1892 src/readelf.c:1910
+#: src/readelf.c:1922 src/readelf.c:2056 src/readelf.c:2068 src/readelf.c:2082
+#: src/readelf.c:2101 src/readelf.c:2114
 msgid "<INVALID RELOC>"
 msgstr ""
 
-#: src/readelf.c:1769
+#: src/readelf.c:2000
 msgid "  Offset      Type            Value       Addend Name\n"
 msgstr ""
 
-#: src/readelf.c:1771
+#: src/readelf.c:2002
 msgid "  Offset              Type            Value               Addend Name\n"
 msgstr ""
 
-#: src/readelf.c:1972
+#: src/readelf.c:2210
 #, c-format
 msgid ""
 "\n"
@@ -4377,40 +4501,40 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:1978
+#: src/readelf.c:2215
 #, 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:1988
+#: src/readelf.c:2223
 msgid "  Num:    Value   Size Type    Bind   Vis          Ndx Name\n"
 msgstr ""
 
-#: src/readelf.c:1990
+#: src/readelf.c:2225
 msgid "  Num:            Value   Size Type    Bind   Vis          Ndx Name\n"
 msgstr ""
 
-#: src/readelf.c:2010
+#: src/readelf.c:2245
 #, c-format
 msgid "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
 msgstr ""
 
-#: src/readelf.c:2098
+#: src/readelf.c:2333
 #, c-format
 msgid "bad dynamic symbol"
 msgstr ""
 
-#: src/readelf.c:2180
+#: src/readelf.c:2415
 msgid "none"
 msgstr "keine"
 
-#: src/readelf.c:2197
+#: src/readelf.c:2432
 msgid "| <unknown>"
 msgstr "| <unbekannt>"
 
-#: src/readelf.c:2222
+#: src/readelf.c:2463
 #, c-format
 msgid ""
 "\n"
@@ -4423,17 +4547,17 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:2245
+#: src/readelf.c:2484
 #, fuzzy, c-format
 msgid "  %#06x: Version: %hu  File: %s  Cnt: %hu\n"
 msgstr "  %#06x: Version: %hu  Datei: %s  Cnt: %hu\n"
 
-#: src/readelf.c:2258
+#: src/readelf.c:2497
 #, c-format
 msgid "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 msgstr "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 
-#: src/readelf.c:2289
+#: src/readelf.c:2534
 #, c-format
 msgid ""
 "\n"
@@ -4446,17 +4570,17 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:2319
+#: src/readelf.c:2562
 #, c-format
 msgid "  %#06x: Version: %hd  Flags: %s  Index: %hd  Cnt: %hd  Name: %s\n"
 msgstr ""
 
-#: src/readelf.c:2334
+#: src/readelf.c:2577
 #, c-format
 msgid "  %#06x: Parent %d: %s\n"
 msgstr ""
 
-#: src/readelf.c:2566
+#: src/readelf.c:2816
 #, c-format
 msgid ""
 "\n"
@@ -4469,15 +4593,15 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:2596
+#: src/readelf.c:2844
 msgid "   0 *local*                     "
 msgstr "   0 *lokal*                     "
 
-#: src/readelf.c:2601
+#: src/readelf.c:2849
 msgid "   1 *global*                    "
 msgstr "   1 *global*                    "
 
-#: src/readelf.c:2632
+#: src/readelf.c:2890
 #, c-format
 msgid ""
 "\n"
@@ -4492,41 +4616,41 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:2656
+#: src/readelf.c:2912
 #, no-c-format
 msgid " Length  Number  % of total  Coverage\n"
 msgstr ""
 
-#: src/readelf.c:2658
+#: src/readelf.c:2914
 #, c-format
 msgid "      0  %6<PRIu32>      %5.1f%%\n"
 msgstr "      0  %6<PRIu32>      %5.1f%%\n"
 
-#: src/readelf.c:2665
+#: src/readelf.c:2921
 #, c-format
 msgid "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 msgstr "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 
-#: src/readelf.c:2678
+#: src/readelf.c:2934
 #, c-format
 msgid ""
 " Average number of tests:   successful lookup: %f\n"
 "\t\t\t  unsuccessful lookup: %f\n"
 msgstr ""
 
-#: src/readelf.c:2696 src/readelf.c:2738 src/readelf.c:2779
+#: src/readelf.c:2952 src/readelf.c:2994 src/readelf.c:3035
 #, c-format
 msgid "cannot get data for section %d: %s"
 msgstr ""
 
-#: src/readelf.c:2833
+#: src/readelf.c:3089
 #, c-format
 msgid ""
 " Symbol Bias: %u\n"
 " Bitmask Size: %zu bytes  %<PRIuFAST32>%% bits set  2nd hash shift: %u\n"
 msgstr ""
 
-#: src/readelf.c:2907
+#: src/readelf.c:3164
 #, c-format
 msgid ""
 "\n"
@@ -4537,13 +4661,13 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:2921
+#: src/readelf.c:3178
 msgid ""
 "       Library                       Time Stamp          Checksum Version "
 "Flags"
 msgstr ""
 
-#: src/readelf.c:2971
+#: src/readelf.c:3228
 #, c-format
 msgid ""
 "\n"
@@ -4551,135 +4675,140 @@ msgid ""
 "%#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:2987
+#: src/readelf.c:3244
 msgid "  Owner          Size\n"
 msgstr ""
 
-#: src/readelf.c:3013
+#: src/readelf.c:3270
 #, c-format
 msgid "  %-13s  %4<PRIu32>\n"
 msgstr "  %-13s  %4<PRIu32>\n"
 
-#: src/readelf.c:3045
+#: src/readelf.c:3302
 #, c-format
 msgid "    %-4u %12<PRIu32>\n"
 msgstr "    %-4u %12<PRIu32>\n"
 
-#: src/readelf.c:3050
+#: src/readelf.c:3307
 #, c-format
 msgid "    File: %11<PRIu32>\n"
 msgstr "    File: %11<PRIu32>\n"
 
-#: src/readelf.c:3085
+#: src/readelf.c:3342
 #, c-format
 msgid "      %s: %<PRId64>, %s\n"
 msgstr "      %s: %<PRId64>, %s\n"
 
-#: src/readelf.c:3088
+#: src/readelf.c:3345
 #, c-format
 msgid "      %s: %<PRId64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:3091
+#: src/readelf.c:3348
 #, c-format
 msgid "      %s: %s\n"
 msgstr "      %s: %s\n"
 
-#: src/readelf.c:3098
+#: src/readelf.c:3355
 #, c-format
 msgid "      %u: %<PRId64>\n"
 msgstr "      %u: %<PRId64>\n"
 
-#: src/readelf.c:3101
+#: src/readelf.c:3358
 #, c-format
 msgid "      %u: %s\n"
 msgstr "      %u: %s\n"
 
-#: src/readelf.c:3137
+#: src/readelf.c:3403
 #, c-format
 msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3140
+#: src/readelf.c:3406
 #, c-format
 msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3145
+#: src/readelf.c:3411
 #, c-format
 msgid "%#<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%#<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3148
+#: src/readelf.c:3414
 #, c-format
 msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%#0*<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3154
+#: src/readelf.c:3420
 #, c-format
 msgid "%s+%#<PRIx64> <%s>"
 msgstr "%s+%#<PRIx64> <%s>"
 
-#: src/readelf.c:3157
+#: src/readelf.c:3423
 #, c-format
 msgid "%s+%#0*<PRIx64> <%s>"
 msgstr "%s+%#0*<PRIx64> <%s>"
 
-#: src/readelf.c:3161
+#: src/readelf.c:3427
 #, c-format
 msgid "%#<PRIx64> <%s>"
 msgstr "%#<PRIx64> <%s>"
 
-#: src/readelf.c:3164
+#: src/readelf.c:3430
 #, c-format
 msgid "%#0*<PRIx64> <%s>"
 msgstr "%#0*<PRIx64> <%s>"
 
-#: src/readelf.c:3169
+#: src/readelf.c:3435
 #, c-format
 msgid "%s+%#<PRIx64>"
 msgstr "%s+%#<PRIx64>"
 
-#: src/readelf.c:3172
+#: src/readelf.c:3438
 #, c-format
 msgid "%s+%#0*<PRIx64>"
 msgstr "%s+%#0*<PRIx64>"
 
-#: src/readelf.c:3554
+#: src/readelf.c:3820
 msgid "empty block"
 msgstr ""
 
-#: src/readelf.c:3557
+#: src/readelf.c:3823
 #, c-format
 msgid "%zu byte block:"
 msgstr ""
 
-#: src/readelf.c:3934
+#: src/readelf.c:4217
 #, c-format
 msgid "%*s[%4<PRIuMAX>] %s  <TRUNCATED>\n"
 msgstr ""
 
-#: src/readelf.c:3970
+#: src/readelf.c:4274
 #, c-format
 msgid "%s %#<PRIx64> used with different address sizes"
 msgstr ""
 
-#: src/readelf.c:3977
+#: src/readelf.c:4281
 #, c-format
 msgid "%s %#<PRIx64> used with different offset sizes"
 msgstr ""
 
-#: src/readelf.c:4057
+#: src/readelf.c:4288
+#, c-format
+msgid "%s %#<PRIx64> used with different base addresses"
+msgstr ""
+
+#: src/readelf.c:4370
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE IN REST OF SECTION>\n"
 msgstr ""
 
-#: src/readelf.c:4065
+#: src/readelf.c:4378
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
 msgstr ""
 
-#: src/readelf.c:4087
+#: src/readelf.c:4404
 #, c-format
 msgid ""
 "\n"
@@ -4687,37 +4816,37 @@ msgid ""
 " [ Code]\n"
 msgstr ""
 
-#: src/readelf.c:4095
+#: src/readelf.c:4412
 #, c-format
 msgid ""
 "\n"
 "Abbreviation section at offset %<PRIu64>:\n"
 msgstr ""
 
-#: src/readelf.c:4108
+#: src/readelf.c:4425
 #, c-format
 msgid " *** error while reading abbreviation: %s\n"
 msgstr ""
 
-#: src/readelf.c:4124
+#: src/readelf.c:4441
 #, c-format
 msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
 msgstr ""
 
-#: src/readelf.c:4127
+#: src/readelf.c:4444
 msgid "yes"
 msgstr "ja"
 
-#: src/readelf.c:4127
+#: src/readelf.c:4444
 msgid "no"
 msgstr "nein"
 
-#: src/readelf.c:4162
+#: src/readelf.c:4478 src/readelf.c:4551
 #, c-format
 msgid "cannot get .debug_aranges content: %s"
 msgstr ""
 
-#: src/readelf.c:4167
+#: src/readelf.c:4493
 #, c-format
 msgid ""
 "\n"
@@ -4728,123 +4857,189 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:4198
+#: src/readelf.c:4524
 #, c-format
 msgid " [%*zu] ???\n"
 msgstr " [%*zu] ???\n"
 
-#: src/readelf.c:4200
+#: src/readelf.c:4526
 #, c-format
 msgid ""
 " [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
 msgstr ""
 
-#: src/readelf.c:4219
+#: src/readelf.c:4556 src/readelf.c:4710 src/readelf.c:5231 src/readelf.c:6145
+#: src/readelf.c:6646 src/readelf.c:6766 src/readelf.c:6922 src/readelf.c:7345
 #, c-format
-msgid "cannot get .debug_ranges content: %s"
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:4224 src/readelf.c:4728 src/readelf.c:5505 src/readelf.c:6006
-#: src/readelf.c:6121 src/readelf.c:6277 src/readelf.c:6699
+#: src/readelf.c:4569 src/readelf.c:6171
 #, c-format
 msgid ""
 "\n"
-"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+"Table at offset %Zu:\n"
+msgstr ""
+
+#: src/readelf.c:4573 src/readelf.c:5255 src/readelf.c:6180
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
 msgstr ""
 
-#: src/readelf.c:4248 src/readelf.c:6031
+#: src/readelf.c:4589
+#, fuzzy, c-format
+msgid ""
+"\n"
+" Length:        %6<PRIu64>\n"
+msgstr "      %s: %<PRId64>\n"
+
+#: src/readelf.c:4601
+#, fuzzy, c-format
+msgid " DWARF version: %6<PRIuFAST16>\n"
+msgstr "      %s: %<PRId64>\n"
+
+#: src/readelf.c:4605
+#, c-format
+msgid "unsupported aranges version"
+msgstr ""
+
+#: src/readelf.c:4616
+#, fuzzy, c-format
+msgid " CU offset:     %6<PRIx64>\n"
+msgstr "      %s: %<PRId64>\n"
+
+#: src/readelf.c:4622
+#, c-format
+msgid " Address size:  %6<PRIu64>\n"
+msgstr ""
+
+#: src/readelf.c:4626
+#, fuzzy, c-format
+msgid "unsupported address size"
+msgstr "Kein Adress-Wert"
+
+#: src/readelf.c:4631
+#, c-format
+msgid ""
+" Segment size:  %6<PRIu64>\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:4635
+#, c-format
+msgid "unsupported segment size"
+msgstr ""
+
+#: src/readelf.c:4675
+#, fuzzy, c-format
+msgid "   %s..%s (%<PRIx64>)\n"
+msgstr "      %s: %<PRId64>\n"
+
+#: src/readelf.c:4678
+#, fuzzy, c-format
+msgid "   %s..%s\n"
+msgstr " [%6tx]  %s..%s\n"
+
+#: src/readelf.c:4687
+#, c-format
+msgid "   %Zu padding bytes\n"
+msgstr ""
+
+#: src/readelf.c:4705
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr ""
+
+#: src/readelf.c:4735 src/readelf.c:6673
 #, c-format
 msgid " [%6tx]  <INVALID DATA>\n"
 msgstr ""
 
-#: src/readelf.c:4270 src/readelf.c:6053
+#: src/readelf.c:4757 src/readelf.c:6695
 #, c-format
 msgid " [%6tx]  base address %s\n"
 msgstr ""
 
-#: src/readelf.c:4276 src/readelf.c:6059
+#: src/readelf.c:4764 src/readelf.c:6702
 #, fuzzy, c-format
 msgid " [%6tx]  empty list\n"
 msgstr " [%6tx]  %s..%s\n"
 
-#: src/readelf.c:4285
+#: src/readelf.c:4775
 #, c-format
 msgid " [%6tx]  %s..%s\n"
 msgstr " [%6tx]  %s..%s\n"
 
-#: src/readelf.c:4287
+#: src/readelf.c:4777
 #, c-format
 msgid "           %s..%s\n"
 msgstr "           %s..%s\n"
 
-#: src/readelf.c:4717 src/readelf.c:6768 src/readelf.c:6870 src/readelf.c:7028
-#, c-format
-msgid "cannot get %s content: %s"
-msgstr ""
+#: src/readelf.c:5210
+#, fuzzy, c-format
+msgid "cannot get ELF: %s"
+msgstr "ELF Kopf konnte nicht ausgelesen werden"
 
-#: src/readelf.c:4724
+#: src/readelf.c:5227
 #, c-format
 msgid ""
 "\n"
 "Call frame information section [%2zu] '%s' at offset %#<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:4752 src/readelf.c:5540
-#, c-format
-msgid "invalid data in section [%zu] '%s'"
-msgstr ""
-
-#: src/readelf.c:4774
+#: src/readelf.c:5277
 #, c-format
 msgid ""
 "\n"
 " [%6tx] Zero terminator\n"
 msgstr ""
 
-#: src/readelf.c:4859
+#: src/readelf.c:5362
 #, fuzzy, c-format
 msgid "invalid augmentation length"
 msgstr "ungültige Abschnittsausrichtung"
 
-#: src/readelf.c:4871
+#: src/readelf.c:5374
 msgid "FDE address encoding: "
 msgstr ""
 
-#: src/readelf.c:4877
+#: src/readelf.c:5380
 msgid "LSDA pointer encoding: "
 msgstr ""
 
-#: src/readelf.c:4975
+#: src/readelf.c:5491
 #, c-format
 msgid " (offset: %#<PRIx64>)"
 msgstr ""
 
-#: src/readelf.c:4982
+#: src/readelf.c:5498
 #, c-format
 msgid " (end offset: %#<PRIx64>)"
 msgstr ""
 
-#: src/readelf.c:5009
+#: src/readelf.c:5525
 #, c-format
 msgid "   %-26sLSDA pointer: %#<PRIx64>\n"
 msgstr ""
 
-#: src/readelf.c:5060
+#: src/readelf.c:5577
 #, c-format
 msgid "cannot get attribute code: %s"
 msgstr ""
 
-#: src/readelf.c:5069
+#: src/readelf.c:5586
 #, c-format
 msgid "cannot get attribute form: %s"
 msgstr ""
 
-#: src/readelf.c:5084
+#: src/readelf.c:5601
 #, c-format
 msgid "cannot get attribute value: %s"
 msgstr ""
 
-#: src/readelf.c:5342
+#: src/readelf.c:5894
 #, c-format
 msgid ""
 "\n"
@@ -4852,7 +5047,7 @@ msgid ""
 " [Offset]\n"
 msgstr ""
 
-#: src/readelf.c:5374
+#: src/readelf.c:5926
 #, c-format
 msgid ""
 " Type unit at offset %<PRIu64>:\n"
@@ -4861,7 +5056,7 @@ msgid ""
 " Type signature: %#<PRIx64>, Type offset: %#<PRIx64>\n"
 msgstr ""
 
-#: src/readelf.c:5383
+#: src/readelf.c:5935
 #, c-format
 msgid ""
 " Compilation unit at offset %<PRIu64>:\n"
@@ -4869,44 +5064,45 @@ msgid ""
 "%<PRIu8>, Offset size: %<PRIu8>\n"
 msgstr ""
 
-#: src/readelf.c:5409
+#: src/readelf.c:5960
 #, c-format
 msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
 msgstr ""
 
-#: src/readelf.c:5421
+#: src/readelf.c:5974
 #, c-format
 msgid "cannot get DIE offset: %s"
 msgstr ""
 
-#: src/readelf.c:5430
+#: src/readelf.c:5983
 #, c-format
 msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
 msgstr ""
 
-#: src/readelf.c:5461
+#: src/readelf.c:6015
 #, c-format
 msgid "cannot get next DIE: %s\n"
 msgstr ""
 
-#: src/readelf.c:5469
+#: src/readelf.c:6023
 #, c-format
 msgid "cannot get next DIE: %s"
 msgstr ""
 
-#: src/readelf.c:5518
+#: src/readelf.c:6059
 #, c-format
-msgid "cannot get line data section data: %s"
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+"\n"
 msgstr ""
 
-#: src/readelf.c:5531
+#: src/readelf.c:6158
 #, c-format
-msgid ""
-"\n"
-"Table at offset %Zu:\n"
+msgid "cannot get line data section data: %s"
 msgstr ""
 
-#: src/readelf.c:5586
+#: src/readelf.c:6226
 #, c-format
 msgid ""
 "\n"
@@ -4923,239 +5119,239 @@ msgid ""
 "Opcodes:\n"
 msgstr ""
 
-#: src/readelf.c:5607
+#: src/readelf.c:6247
 #, c-format
 msgid "invalid data at offset %tu in section [%zu] '%s'"
 msgstr ""
 
-#: src/readelf.c:5622
+#: src/readelf.c:6262
 #, c-format
 msgid "  [%*<PRIuFAST8>]  %hhu argument\n"
 msgid_plural "  [%*<PRIuFAST8>]  %hhu arguments\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:5630
+#: src/readelf.c:6270
 msgid ""
 "\n"
 "Directory table:"
 msgstr ""
 
-#: src/readelf.c:5646
+#: src/readelf.c:6286
 msgid ""
 "\n"
 "File name table:\n"
 " Entry Dir   Time      Size      Name"
 msgstr ""
 
-#: src/readelf.c:5675
+#: src/readelf.c:6315
 msgid ""
 "\n"
 "Line number statements:"
 msgstr ""
 
-#: src/readelf.c:5751
+#: src/readelf.c:6391
 #, c-format
 msgid " special opcode %u: address+%u = %s, op_index = %u, line%+d = %zu\n"
 msgstr ""
 
-#: src/readelf.c:5756
+#: src/readelf.c:6396
 #, c-format
 msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
 msgstr ""
 
-#: src/readelf.c:5776
+#: src/readelf.c:6416
 #, c-format
 msgid " extended opcode %u: "
 msgstr ""
 
-#: src/readelf.c:5781
+#: src/readelf.c:6421
 msgid " end of sequence"
 msgstr ""
 
-#: src/readelf.c:5798
+#: src/readelf.c:6438
 #, c-format
 msgid " set address to %s\n"
 msgstr ""
 
-#: src/readelf.c:5819
+#: src/readelf.c:6459
 #, c-format
 msgid " define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
 msgstr ""
 
-#: src/readelf.c:5832
+#: src/readelf.c:6472
 #, c-format
 msgid " set discriminator to %u\n"
 msgstr ""
 
-#: src/readelf.c:5837
+#: src/readelf.c:6477
 #, fuzzy
 msgid " unknown opcode"
 msgstr "unbekannter Typ"
 
-#: src/readelf.c:5849
+#: src/readelf.c:6489
 msgid " copy"
 msgstr ""
 
-#: src/readelf.c:5860
+#: src/readelf.c:6500
 #, c-format
 msgid " advance address by %u to %s, op_index to %u\n"
 msgstr ""
 
-#: src/readelf.c:5864
+#: src/readelf.c:6504
 #, c-format
 msgid " advance address by %u to %s\n"
 msgstr ""
 
-#: src/readelf.c:5875
+#: src/readelf.c:6515
 #, c-format
 msgid " advance line by constant %d to %<PRId64>\n"
 msgstr ""
 
-#: src/readelf.c:5883
+#: src/readelf.c:6523
 #, c-format
 msgid " set file to %<PRIu64>\n"
 msgstr ""
 
-#: src/readelf.c:5893
+#: src/readelf.c:6533
 #, c-format
 msgid " set column to %<PRIu64>\n"
 msgstr ""
 
-#: src/readelf.c:5900
+#: src/readelf.c:6540
 #, c-format
 msgid " set '%s' to %<PRIuFAST8>\n"
 msgstr ""
 
-#: src/readelf.c:5906
+#: src/readelf.c:6546
 msgid " set basic block flag"
 msgstr ""
 
-#: src/readelf.c:5915
+#: src/readelf.c:6555
 #, c-format
 msgid " advance address by constant %u to %s, op_index to %u\n"
 msgstr ""
 
-#: src/readelf.c:5919
+#: src/readelf.c:6559
 #, c-format
 msgid " advance address by constant %u to %s\n"
 msgstr ""
 
-#: src/readelf.c:5937
+#: src/readelf.c:6577
 #, c-format
 msgid " advance address by fixed value %u to %s\n"
 msgstr ""
 
-#: src/readelf.c:5946
+#: src/readelf.c:6586
 msgid " set prologue end flag"
 msgstr ""
 
-#: src/readelf.c:5951
+#: src/readelf.c:6591
 msgid " set epilogue begin flag"
 msgstr ""
 
-#: src/readelf.c:5960
+#: src/readelf.c:6600
 #, c-format
 msgid " set isa to %u\n"
 msgstr ""
 
-#: src/readelf.c:5969
+#: src/readelf.c:6609
 #, c-format
 msgid " unknown opcode with %<PRIu8> parameter:"
 msgid_plural " unknown opcode with %<PRIu8> parameters:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:6001
+#: src/readelf.c:6641
 #, c-format
 msgid "cannot get .debug_loc content: %s"
 msgstr ""
 
-#: src/readelf.c:6071
+#: src/readelf.c:6716
 #, c-format
 msgid " [%6tx]  %s..%s"
 msgstr " [%6tx]  %s..%s"
 
-#: src/readelf.c:6073
+#: src/readelf.c:6718
 #, c-format
 msgid "           %s..%s"
 msgstr "           %s..%s"
 
-#: src/readelf.c:6080
+#: src/readelf.c:6725
 msgid "   <INVALID DATA>\n"
 msgstr ""
 
-#: src/readelf.c:6132 src/readelf.c:6286
+#: src/readelf.c:6777 src/readelf.c:6931
 #, c-format
 msgid "cannot get macro information section data: %s"
 msgstr ""
 
-#: src/readelf.c:6211
+#: src/readelf.c:6856
 #, c-format
 msgid "%*s*** non-terminated string at end of section"
 msgstr ""
 
-#: src/readelf.c:6327
+#: src/readelf.c:6972
 #, fuzzy, c-format
 msgid " Offset:             0x%<PRIx64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:6339
+#: src/readelf.c:6984
 #, fuzzy, c-format
 msgid " Version:            %<PRIu16>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:6345 src/readelf.c:7055
+#: src/readelf.c:6990 src/readelf.c:7703
 #, c-format
 msgid "  unknown version, cannot parse section\n"
 msgstr ""
 
-#: src/readelf.c:6352
+#: src/readelf.c:6997
 #, fuzzy, c-format
 msgid " Flag:               0x%<PRIx8>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:6355
+#: src/readelf.c:7000
 #, c-format
 msgid " Offset length:      %<PRIu8>\n"
 msgstr ""
 
-#: src/readelf.c:6363
+#: src/readelf.c:7008
 #, c-format
 msgid " .debug_line offset: 0x%<PRIx64>\n"
 msgstr ""
 
-#: src/readelf.c:6375
+#: src/readelf.c:7021
 #, c-format
 msgid "  extension opcode table, %<PRIu8> items:\n"
 msgstr ""
 
-#: src/readelf.c:6382
+#: src/readelf.c:7028
 #, c-format
 msgid "    [%<PRIx8>]"
 msgstr ""
 
-#: src/readelf.c:6394
+#: src/readelf.c:7040
 #, c-format
 msgid " %<PRIu8> arguments:"
 msgstr ""
 
-#: src/readelf.c:6422
+#: src/readelf.c:7068
 #, c-format
 msgid " no arguments."
 msgstr ""
 
-#: src/readelf.c:6657
+#: src/readelf.c:7303
 #, c-format
 msgid "vendor opcode not verified?"
 msgstr ""
 
-#: src/readelf.c:6685
+#: src/readelf.c:7331
 #, c-format
 msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
 msgstr ""
 
-#: src/readelf.c:6726
+#: src/readelf.c:7372
 #, c-format
 msgid ""
 "\n"
@@ -5163,47 +5359,47 @@ msgid ""
 " %*s  String\n"
 msgstr ""
 
-#: src/readelf.c:6740
+#: src/readelf.c:7386
 #, c-format
 msgid " *** error while reading strings: %s\n"
 msgstr ""
 
-#: src/readelf.c:6760
+#: src/readelf.c:7406
 #, c-format
 msgid ""
 "\n"
 "Call frame search table section [%2zu] '.eh_frame_hdr':\n"
 msgstr ""
 
-#: src/readelf.c:6862
+#: src/readelf.c:7508
 #, c-format
 msgid ""
 "\n"
 "Exception handling table section [%2zu] '.gcc_except_table':\n"
 msgstr ""
 
-#: src/readelf.c:6885
+#: src/readelf.c:7531
 #, c-format
 msgid " LPStart encoding:    %#x "
 msgstr ""
 
-#: src/readelf.c:6897
+#: src/readelf.c:7543
 #, c-format
 msgid " TType encoding:      %#x "
 msgstr ""
 
-#: src/readelf.c:6911
+#: src/readelf.c:7557
 #, c-format
 msgid " Call site encoding:  %#x "
 msgstr ""
 
-#: src/readelf.c:6924
+#: src/readelf.c:7570
 msgid ""
 "\n"
 " Call site table:"
 msgstr ""
 
-#: src/readelf.c:6938
+#: src/readelf.c:7584
 #, c-format
 msgid ""
 " [%4u] Call site start:   %#<PRIx64>\n"
@@ -5212,193 +5408,193 @@ msgid ""
 "        Action:            %u\n"
 msgstr ""
 
-#: src/readelf.c:6998
+#: src/readelf.c:7644
 #, c-format
 msgid "invalid TType encoding"
 msgstr ""
 
-#: src/readelf.c:7019
+#: src/readelf.c:7665
 #, c-format
 msgid ""
 "\n"
 "GDB section [%2zu] '%s' at offset %#<PRIx64> contains %<PRId64> bytes :\n"
 msgstr ""
 
-#: src/readelf.c:7048
+#: src/readelf.c:7694
 #, fuzzy, c-format
 msgid " Version:         %<PRId32>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:7064
+#: src/readelf.c:7712
 #, c-format
 msgid " CU offset:       %#<PRIx32>\n"
 msgstr ""
 
-#: src/readelf.c:7071
+#: src/readelf.c:7719
 #, c-format
 msgid " TU offset:       %#<PRIx32>\n"
 msgstr ""
 
-#: src/readelf.c:7078
+#: src/readelf.c:7726
 #, c-format
 msgid " address offset:  %#<PRIx32>\n"
 msgstr ""
 
-#: src/readelf.c:7085
+#: src/readelf.c:7733
 #, c-format
 msgid " symbol offset:   %#<PRIx32>\n"
 msgstr ""
 
-#: src/readelf.c:7092
+#: src/readelf.c:7740
 #, c-format
 msgid " constant offset: %#<PRIx32>\n"
 msgstr ""
 
-#: src/readelf.c:7099
+#: src/readelf.c:7747
 #, c-format
 msgid ""
 "\n"
 " CU list at offset %#<PRIx32> contains %zu entries:\n"
 msgstr ""
 
-#: src/readelf.c:7121
+#: src/readelf.c:7769
 #, c-format
 msgid ""
 "\n"
 " TU list at offset %#<PRIx32> contains %zu entries:\n"
 msgstr ""
 
-#: src/readelf.c:7147
+#: src/readelf.c:7795
 #, c-format
 msgid ""
 "\n"
 " Address list at offset %#<PRIx32> contains %zu entries:\n"
 msgstr ""
 
-#: src/readelf.c:7174
+#: src/readelf.c:7824
 #, c-format
 msgid ""
 "\n"
 " Symbol table at offset %#<PRIx32> contains %zu slots:\n"
 msgstr ""
 
-#: src/readelf.c:7259
+#: src/readelf.c:7909
 #, c-format
 msgid "cannot get debug context descriptor: %s"
 msgstr ""
 
-#: src/readelf.c:7409 src/readelf.c:8010
+#: src/readelf.c:8069 src/readelf.c:8675 src/readelf.c:8786 src/readelf.c:8844
 #, c-format
 msgid "cannot convert core note data: %s"
 msgstr ""
 
-#: src/readelf.c:7750
+#: src/readelf.c:8416
 #, c-format
 msgid ""
 "\n"
 "%*s... <repeats %u more times> ..."
 msgstr ""
 
-#: src/readelf.c:8109
+#: src/readelf.c:8919
 msgid "  Owner          Data size  Type\n"
 msgstr ""
 
-#: src/readelf.c:8127
+#: src/readelf.c:8937
 #, c-format
 msgid "  %-13.*s  %9<PRId32>  %s\n"
 msgstr ""
 
-#: src/readelf.c:8161
+#: src/readelf.c:8987
 #, c-format
 msgid "cannot get content of note section: %s"
 msgstr ""
 
-#: src/readelf.c:8188
+#: src/readelf.c:9014
 #, c-format
 msgid ""
 "\n"
 "Note section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:8211
+#: src/readelf.c:9037
 #, c-format
 msgid ""
 "\n"
 "Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:8257
+#: src/readelf.c:9083
 #, c-format
 msgid ""
 "\n"
 "Section [%Zu] '%s' has no data to dump.\n"
 msgstr ""
 
-#: src/readelf.c:8263 src/readelf.c:8286
+#: src/readelf.c:9089 src/readelf.c:9112
 #, c-format
 msgid "cannot get data for section [%Zu] '%s': %s"
 msgstr ""
 
-#: src/readelf.c:8267
+#: src/readelf.c:9093
 #, c-format
 msgid ""
 "\n"
 "Hex dump of section [%Zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:8280
+#: src/readelf.c:9106
 #, c-format
 msgid ""
 "\n"
 "Section [%Zu] '%s' has no strings to dump.\n"
 msgstr ""
 
-#: src/readelf.c:8290
+#: src/readelf.c:9116
 #, c-format
 msgid ""
 "\n"
 "String section [%Zu] '%s' contains %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:8338
+#: src/readelf.c:9164
 #, c-format
 msgid ""
 "\n"
 "section [%lu] does not exist"
 msgstr ""
 
-#: src/readelf.c:8367
+#: src/readelf.c:9193
 #, c-format
 msgid ""
 "\n"
 "section '%s' does not exist"
 msgstr ""
 
-#: src/readelf.c:8424
+#: src/readelf.c:9250
 #, c-format
 msgid "cannot get symbol index of archive '%s': %s"
 msgstr ""
 
-#: src/readelf.c:8427
+#: src/readelf.c:9253
 #, c-format
 msgid ""
 "\n"
 "Archive '%s' has no symbol index\n"
 msgstr ""
 
-#: src/readelf.c:8431
+#: src/readelf.c:9257
 #, c-format
 msgid ""
 "\n"
 "Index of archive '%s' has %Zu entries:\n"
 msgstr ""
 
-#: src/readelf.c:8449
+#: src/readelf.c:9275
 #, c-format
 msgid "cannot extract member at offset %Zu in '%s': %s"
 msgstr ""
 
-#: src/readelf.c:8454
+#: src/readelf.c:9280
 #, c-format
 msgid "Archive member '%s' contains:\n"
 msgstr ""
@@ -5460,12 +5656,12 @@ msgstr ""
 msgid "%s: file format not recognized"
 msgstr ""
 
-#: src/size.c:438 src/size.c:581
+#: src/size.c:438 src/size.c:571
 #, c-format
 msgid " (ex %s)"
 msgstr ""
 
-#: src/size.c:606
+#: src/size.c:596
 msgid "(TOTALS)\n"
 msgstr ""
 
@@ -5503,27 +5699,27 @@ msgstr "Alias für --radix=o"
 msgid "Print the strings of printable characters in files."
 msgstr ""
 
-#: src/strings.c:260 src/strings.c:295
+#: src/strings.c:267 src/strings.c:302
 #, c-format
 msgid "invalid value '%s' for %s parameter"
 msgstr ""
 
-#: src/strings.c:306
+#: src/strings.c:313
 #, c-format
 msgid "invalid minimum length of matched string size"
 msgstr ""
 
-#: src/strings.c:591
+#: src/strings.c:596
 #, c-format
 msgid "lseek64 failed"
 msgstr "lseek64 fehlgeschlagen"
 
-#: src/strings.c:608 src/strings.c:672
+#: src/strings.c:613 src/strings.c:677
 #, c-format
 msgid "re-mmap failed"
 msgstr "re-mmap fehlgeschlagen"
 
-#: src/strings.c:645
+#: src/strings.c:650
 #, c-format
 msgid "mprotect failed"
 msgstr "mprotect fehlgeschlagen"
@@ -5591,7 +5787,7 @@ msgstr ""
 msgid "-F option specified twice"
 msgstr ""
 
-#: src/strip.c:249 src/unstrip.c:117
+#: src/strip.c:249 src/unstrip.c:121
 #, c-format
 msgid "-o option specified twice"
 msgstr ""
@@ -5616,87 +5812,87 @@ msgstr ""
 msgid "%s: cannot use -o or -f when stripping archive"
 msgstr ""
 
-#: src/strip.c:467
+#: src/strip.c:468
 #, c-format
 msgid "cannot open EBL backend"
 msgstr ""
 
-#: src/strip.c:517 src/strip.c:541
+#: src/strip.c:518 src/strip.c:542
 #, c-format
 msgid "cannot create new file '%s': %s"
 msgstr ""
 
-#: src/strip.c:601
+#: src/strip.c:608
 #, c-format
 msgid "illformed file '%s'"
 msgstr ""
 
-#: src/strip.c:905 src/strip.c:994
+#: src/strip.c:930 src/strip.c:1019
 #, c-format
 msgid "while generating output file: %s"
 msgstr ""
 
-#: src/strip.c:967 src/strip.c:1929
+#: src/strip.c:992 src/strip.c:1957
 #, c-format
 msgid "%s: error while creating ELF header: %s"
 msgstr ""
 
-#: src/strip.c:981
+#: src/strip.c:1006
 #, c-format
 msgid "while preparing output for '%s'"
 msgstr ""
 
-#: src/strip.c:1032 src/strip.c:1088
+#: src/strip.c:1057 src/strip.c:1114
 #, c-format
 msgid "while create section header section: %s"
 msgstr ""
 
-#: src/strip.c:1038
+#: src/strip.c:1063
 #, c-format
 msgid "cannot allocate section data: %s"
 msgstr ""
 
-#: src/strip.c:1097
+#: src/strip.c:1123
 #, c-format
 msgid "while create section header string table: %s"
 msgstr ""
 
-#: src/strip.c:1724
+#: src/strip.c:1752
 #, fuzzy, c-format
 msgid "bad relocation"
 msgstr "Relocations anzeigen"
 
-#: src/strip.c:1841 src/strip.c:1951
+#: src/strip.c:1869 src/strip.c:1979
 #, c-format
 msgid "while writing '%s': %s"
 msgstr ""
 
-#: src/strip.c:1852
+#: src/strip.c:1880
 #, c-format
 msgid "while creating '%s'"
 msgstr ""
 
-#: src/strip.c:1874
+#: src/strip.c:1902
 #, c-format
 msgid "while computing checksum for debug information"
 msgstr ""
 
-#: src/strip.c:1937
+#: src/strip.c:1965
 #, c-format
 msgid "%s: error while reading the file: %s"
 msgstr ""
 
-#: src/strip.c:1976 src/strip.c:1996
+#: src/strip.c:2004 src/strip.c:2024
 #, fuzzy, c-format
 msgid "while writing '%s'"
 msgstr "beim Schliessen von '%s'"
 
-#: src/strip.c:2030 src/strip.c:2037
+#: src/strip.c:2061 src/strip.c:2068
 #, c-format
 msgid "error while finishing '%s': %s"
 msgstr ""
 
-#: src/strip.c:2060 src/strip.c:2117
+#: src/strip.c:2091 src/strip.c:2148
 #, c-format
 msgid "cannot set access and modification date of '%s'"
 msgstr ""
@@ -5733,265 +5929,288 @@ msgstr ""
 msgid "Only list module and file names, build IDs"
 msgstr ""
 
-#: src/unstrip.c:126
+#: src/unstrip.c:86
+msgid "Force combining files even if some ELF headers don't seem to match"
+msgstr ""
+
+#: src/unstrip.c:130
 #, c-format
 msgid "-d option specified twice"
 msgstr "Option -d zweimal angegeben"
 
-#: src/unstrip.c:158
+#: src/unstrip.c:165
 #, c-format
 msgid "only one of -o or -d allowed"
 msgstr "nur entweder -o oder -d erlaubt"
 
-#: src/unstrip.c:167
+#: src/unstrip.c:174
 #, c-format
 msgid "-n cannot be used with explicit files or -o or -d"
 msgstr "-n kann nicht mit expliziten Dateien oder -o oder -d verwendet werden"
 
-#: src/unstrip.c:182
+#: src/unstrip.c:189
 #, c-format
 msgid "output directory '%s'"
 msgstr "Ausgabeverzeichnis '%s'"
 
-#: src/unstrip.c:191
+#: src/unstrip.c:198
 #, c-format
 msgid "exactly two file arguments are required"
 msgstr "genau zwei Datei-Argumente werden benötigt"
 
-#: src/unstrip.c:197
+#: src/unstrip.c:204
 #, c-format
 msgid "-m, -a, -R, and -i options not allowed with explicit files"
 msgstr ""
 
-#: src/unstrip.c:210
+#: src/unstrip.c:217
 #, c-format
 msgid "-o or -d is required when using implicit files"
 msgstr ""
 
-#: src/unstrip.c:246
+#: src/unstrip.c:253
 #, c-format
 msgid "cannot create ELF header: %s"
 msgstr ""
 
-#: src/unstrip.c:251
+#: src/unstrip.c:258
 #, c-format
 msgid "cannot copy ELF header: %s"
 msgstr ""
 
-#: src/unstrip.c:256 src/unstrip.c:1820
+#: src/unstrip.c:263 src/unstrip.c:1828
 #, c-format
 msgid "cannot create program headers: %s"
 msgstr "konnte Programm-Kopf nicht erstellen: %s"
 
-#: src/unstrip.c:262
+#: src/unstrip.c:269
 #, c-format
 msgid "cannot copy program header: %s"
 msgstr "konnte Programm-Kopf nicht kopieren: %s"
 
-#: src/unstrip.c:272
+#: src/unstrip.c:279
 #, c-format
 msgid "cannot copy section header: %s"
 msgstr ""
 
-#: src/unstrip.c:275 src/unstrip.c:1501
+#: src/unstrip.c:282 src/unstrip.c:1509
 #, c-format
 msgid "cannot get section data: %s"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/unstrip.c:277 src/unstrip.c:1503
+#: src/unstrip.c:284 src/unstrip.c:1511
 #, c-format
 msgid "cannot copy section data: %s"
 msgstr "konnte Abschnittsdaten nicht kopieren: %s"
 
-#: src/unstrip.c:301
+#: src/unstrip.c:308
 #, c-format
 msgid "cannot create directory '%s'"
 msgstr "konnte Verzeichnis nicht erstellen: %s"
 
-#: src/unstrip.c:341 src/unstrip.c:758 src/unstrip.c:1535
+#: src/unstrip.c:348 src/unstrip.c:765 src/unstrip.c:1543
 #, c-format
 msgid "cannot get symbol table entry: %s"
 msgstr "konnte Eintrag aus der Symboltabelle nicht holen: %s"
 
-#: src/unstrip.c:357 src/unstrip.c:575 src/unstrip.c:596 src/unstrip.c:608
-#: src/unstrip.c:1556 src/unstrip.c:1686 src/unstrip.c:1710
+#: src/unstrip.c:364 src/unstrip.c:582 src/unstrip.c:603 src/unstrip.c:615
+#: src/unstrip.c:1564 src/unstrip.c:1694 src/unstrip.c:1718
 #, c-format
 msgid "cannot update symbol table: %s"
 msgstr "konnte Symboltabelle nicht aktualisieren: %s"
 
-#: src/unstrip.c:367
+#: src/unstrip.c:374
 #, c-format
 msgid "cannot update section header: %s"
 msgstr ""
 
-#: src/unstrip.c:406 src/unstrip.c:417
+#: src/unstrip.c:413 src/unstrip.c:424
 #, c-format
 msgid "cannot update relocation: %s"
 msgstr ""
 
-#: src/unstrip.c:504
+#: src/unstrip.c:511
 #, c-format
 msgid "cannot get symbol version: %s"
 msgstr ""
 
-#: src/unstrip.c:516
+#: src/unstrip.c:523
 #, c-format
 msgid "unexpected section type in [%Zu] with sh_link to symtab"
 msgstr ""
 
-#: src/unstrip.c:764
+#: src/unstrip.c:771
 #, c-format
 msgid "invalid string offset in symbol [%Zu]"
 msgstr ""
 
-#: src/unstrip.c:906 src/unstrip.c:1246
+#: src/unstrip.c:913 src/unstrip.c:1254
 #, c-format
 msgid "cannot read section [%Zu] name: %s"
 msgstr ""
 
-#: src/unstrip.c:947 src/unstrip.c:966 src/unstrip.c:999
+#: src/unstrip.c:954 src/unstrip.c:973 src/unstrip.c:1006
 #, c-format
 msgid "cannot read '.gnu.prelink_undo' section: %s"
 msgstr ""
 
-#: src/unstrip.c:987
+#: src/unstrip.c:994
 #, c-format
 msgid "invalid contents in '%s' section"
 msgstr ""
 
-#: src/unstrip.c:1042 src/unstrip.c:1366
+#: src/unstrip.c:1049 src/unstrip.c:1374
 #, c-format
 msgid "cannot find matching section for [%Zu] '%s'"
 msgstr ""
 
-#: src/unstrip.c:1166 src/unstrip.c:1181 src/unstrip.c:1447
+#: src/unstrip.c:1174 src/unstrip.c:1189 src/unstrip.c:1455
 #, c-format
 msgid "cannot add section name to string table: %s"
 msgstr ""
 
-#: src/unstrip.c:1190
+#: src/unstrip.c:1198
 #, c-format
 msgid "cannot update section header string table data: %s"
 msgstr ""
 
-#: src/unstrip.c:1217 src/unstrip.c:1221
+#: src/unstrip.c:1225 src/unstrip.c:1229
 #, c-format
 msgid "cannot get section header string table section index: %s"
 msgstr ""
 
-#: src/unstrip.c:1225 src/unstrip.c:1229 src/unstrip.c:1462
+#: src/unstrip.c:1233 src/unstrip.c:1237 src/unstrip.c:1470
 #, c-format
 msgid "cannot get section count: %s"
 msgstr ""
 
-#: src/unstrip.c:1232
+#: src/unstrip.c:1240
 #, c-format
 msgid "more sections in stripped file than debug file -- arguments reversed?"
 msgstr ""
 
-#: src/unstrip.c:1291 src/unstrip.c:1381
+#: src/unstrip.c:1299 src/unstrip.c:1389
 #, c-format
 msgid "cannot read section header string table: %s"
 msgstr ""
 
-#: src/unstrip.c:1441
+#: src/unstrip.c:1449
 #, c-format
 msgid "cannot add new section: %s"
 msgstr ""
 
-#: src/unstrip.c:1543
+#: src/unstrip.c:1551
 #, c-format
 msgid "symbol [%Zu] has invalid section index"
 msgstr ""
 
-#: src/unstrip.c:1781
+#: src/unstrip.c:1789
 #, fuzzy, c-format
 msgid "cannot read section data: %s"
 msgstr "konnte Abschnittsdaten nicht holen: %s"
 
-#: src/unstrip.c:1802
+#: src/unstrip.c:1810
 #, c-format
 msgid "cannot get ELF header: %s"
 msgstr ""
 
-#: src/unstrip.c:1830
+#: src/unstrip.c:1838
 #, c-format
 msgid "cannot update program header: %s"
 msgstr "konnte Programm-Kopf nicht aktualisieren: %s"
 
-#: src/unstrip.c:1835 src/unstrip.c:1914
+#: src/unstrip.c:1843 src/unstrip.c:1922
 #, c-format
 msgid "cannot write output file: %s"
 msgstr ""
 
-#: src/unstrip.c:1883
+#: src/unstrip.c:1891
 #, c-format
 msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
 msgstr ""
 
-#: src/unstrip.c:1886
+#: src/unstrip.c:1894
 #, c-format
 msgid ""
 "DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
 msgstr ""
 
-#: src/unstrip.c:1905 src/unstrip.c:1945 src/unstrip.c:1957 src/unstrip.c:2037
+#: src/unstrip.c:1913 src/unstrip.c:1964 src/unstrip.c:1976 src/unstrip.c:2062
 #, c-format
 msgid "cannot create ELF descriptor: %s"
 msgstr ""
 
-#: src/unstrip.c:1963
-#, c-format
-msgid "'%s' and '%s' do not seem to match"
+#: src/unstrip.c:1955
+msgid "WARNING: "
+msgstr ""
+
+#: src/unstrip.c:1957
+msgid ", use --force"
+msgstr ""
+
+#: src/unstrip.c:1980
+msgid "ELF header identification (e_ident) different"
+msgstr ""
+
+#: src/unstrip.c:1983
+msgid "ELF header type (e_type) different"
+msgstr ""
+
+#: src/unstrip.c:1986
+msgid "ELF header machine type (e_machine) different"
+msgstr ""
+
+#: src/unstrip.c:1989
+msgid "stripped program header (e_phnum) smaller than unstripped"
 msgstr ""
 
-#: src/unstrip.c:1994
+#: src/unstrip.c:2019
 #, c-format
 msgid "cannot find stripped file for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:1998
+#: src/unstrip.c:2023
 #, c-format
 msgid "cannot open stripped file '%s' for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2013
+#: src/unstrip.c:2038
 #, c-format
 msgid "cannot find debug file for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2017
+#: src/unstrip.c:2042
 #, c-format
 msgid "cannot open debug file '%s' for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2030
+#: src/unstrip.c:2055
 #, c-format
 msgid "module '%s' file '%s' is not stripped"
 msgstr ""
 
-#: src/unstrip.c:2061
+#: src/unstrip.c:2086
 #, c-format
 msgid "cannot cache section addresses for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2194
+#: src/unstrip.c:2219
 #, c-format
 msgid "no matching modules found"
 msgstr "kein passendes Modul gefunden"
 
-#: src/unstrip.c:2203
+#: src/unstrip.c:2228
 #, c-format
 msgid "matched more than one module"
 msgstr "mehr als ein passendes Modul"
 
-#: src/unstrip.c:2250
+#: src/unstrip.c:2275
 msgid ""
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
 msgstr ""
 
-#: src/unstrip.c:2251
+#: src/unstrip.c:2276
 msgid ""
 "Combine stripped files with separate symbols and debug information.\vThe "
 "first form puts the result in DEBUG-FILE if -o was not given.\n"
@@ -6018,6 +6237,14 @@ msgid ""
 "was found, or . if FILE contains the debug information."
 msgstr ""
 
+#, fuzzy
+#~ msgid "cannot attach to process"
+#~ msgstr "Kann Suchbaum nicht erstellen"
+
+#, fuzzy
+#~ msgid "cannot attach to core"
+#~ msgstr "Kann Suchbaum nicht erstellen"
+
 #~ msgid "unknown tag %hx"
 #~ msgstr "unbekannter Tag %hx"
 
index 1697c8a..cb904cb 100644 (file)
@@ -6,9 +6,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: elfutils 0.155\n"
+"Project-Id-Version: elfutils 0.160\n"
 "Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
-"POT-Creation-Date: 2012-08-27 20:34+0200\n"
+"POT-Creation-Date: 2014-08-27 11:26+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,18 +18,18 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
-#: lib/xmalloc.c:54 lib/xmalloc.c:68 lib/xmalloc.c:82 src/readelf.c:2842
-#: src/readelf.c:3181 src/unstrip.c:2090 src/unstrip.c:2298
+#: lib/xmalloc.c:54 lib/xmalloc.c:68 lib/xmalloc.c:82 src/readelf.c:3098
+#: src/readelf.c:3447 src/readelf.c:8018 src/unstrip.c:2115 src/unstrip.c:2323
 #, c-format
 msgid "memory exhausted"
 msgstr ""
 
-#: libasm/asm_error.c:65 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:49
+#: libasm/asm_error.c:65 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:53
 #: libelf/elf_error.c:60
 msgid "no error"
 msgstr ""
 
-#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:51
+#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:55
 #: libelf/elf_error.c:91
 msgid "out of memory"
 msgstr ""
@@ -68,7 +68,7 @@ msgstr ""
 msgid "no backend support available"
 msgstr ""
 
-#: libasm/asm_error.c:84 libdw/dwarf_error.c:59 libdwfl/libdwflP.h:50
+#: libasm/asm_error.c:84 libdw/dwarf_error.c:59 libdwfl/libdwflP.h:54
 #: libelf/elf_error.c:63
 msgid "unknown error"
 msgstr ""
@@ -165,7 +165,7 @@ msgstr ""
 msgid "invalid directory index"
 msgstr ""
 
-#: libdw/dwarf_error.c:84 libdwfl/libdwflP.h:70
+#: libdw/dwarf_error.c:84 libdwfl/libdwflP.h:74
 msgid "address out of range"
 msgstr ""
 
@@ -185,7 +185,7 @@ msgstr ""
 msgid "invalid address range index"
 msgstr ""
 
-#: libdw/dwarf_error.c:89 libdwfl/libdwflP.h:71
+#: libdw/dwarf_error.c:89 libdwfl/libdwflP.h:75
 msgid "no matching address range"
 msgstr ""
 
@@ -209,7 +209,7 @@ msgstr ""
 msgid "no alternative debug link found"
 msgstr ""
 
-#: libdwfl/argp-std.c:46 src/unstrip.c:2240
+#: libdwfl/argp-std.c:46 src/unstrip.c:2265
 msgid "Input selection options:"
 msgstr ""
 
@@ -243,132 +243,188 @@ msgstr ""
 msgid "Search path for separate debuginfo files"
 msgstr ""
 
-#: libdwfl/argp-std.c:142
+#: libdwfl/argp-std.c:157
 msgid "only one of -e, -p, -k, -K, or --core allowed"
 msgstr ""
 
-#: libdwfl/argp-std.c:202
-#, c-format
-msgid "cannot read ELF core file: %s"
+#: libdwfl/argp-std.c:230
+msgid "cannot load kernel symbols"
 msgstr ""
 
-#: libdwfl/argp-std.c:220
-msgid "No modules recognized in core file"
+#: libdwfl/argp-std.c:234
+msgid "cannot find kernel modules"
 msgstr ""
 
-#: libdwfl/argp-std.c:232
-msgid "cannot load kernel symbols"
+#: libdwfl/argp-std.c:251
+msgid "cannot find kernel or modules"
 msgstr ""
 
-#: libdwfl/argp-std.c:236
-msgid "cannot find kernel modules"
+#: libdwfl/argp-std.c:290
+#, c-format
+msgid "cannot read ELF core file: %s"
 msgstr ""
 
-#: libdwfl/argp-std.c:250
-msgid "cannot find kernel or modules"
+#: libdwfl/argp-std.c:311
+msgid "No modules recognized in core file"
 msgstr ""
 
-#: libdwfl/libdwflP.h:52
+#: libdwfl/libdwflP.h:56
 msgid "See errno"
 msgstr ""
 
-#: libdwfl/libdwflP.h:53
+#: libdwfl/libdwflP.h:57
 msgid "See elf_errno"
 msgstr ""
 
-#: libdwfl/libdwflP.h:54
+#: libdwfl/libdwflP.h:58
 msgid "See dwarf_errno"
 msgstr ""
 
-#: libdwfl/libdwflP.h:55
+#: libdwfl/libdwflP.h:59
 msgid "See ebl_errno (XXX missing)"
 msgstr ""
 
-#: libdwfl/libdwflP.h:56
+#: libdwfl/libdwflP.h:60
 msgid "gzip decompression failed"
 msgstr ""
 
-#: libdwfl/libdwflP.h:57
+#: libdwfl/libdwflP.h:61
 msgid "bzip2 decompression failed"
 msgstr ""
 
-#: libdwfl/libdwflP.h:58
+#: libdwfl/libdwflP.h:62
 msgid "LZMA decompression failed"
 msgstr ""
 
-#: libdwfl/libdwflP.h:59
+#: libdwfl/libdwflP.h:63
 msgid "no support library found for machine"
 msgstr ""
 
-#: libdwfl/libdwflP.h:60
+#: libdwfl/libdwflP.h:64
 msgid "Callbacks missing for ET_REL file"
 msgstr ""
 
-#: libdwfl/libdwflP.h:61
+#: libdwfl/libdwflP.h:65
 msgid "Unsupported relocation type"
 msgstr ""
 
-#: libdwfl/libdwflP.h:62
+#: libdwfl/libdwflP.h:66
 msgid "r_offset is bogus"
 msgstr ""
 
-#: libdwfl/libdwflP.h:63 libelf/elf_error.c:111 libelf/elf_error.c:171
+#: libdwfl/libdwflP.h:67 libelf/elf_error.c:111 libelf/elf_error.c:171
 msgid "offset out of range"
 msgstr ""
 
-#: libdwfl/libdwflP.h:64
+#: libdwfl/libdwflP.h:68
 msgid "relocation refers to undefined symbol"
 msgstr ""
 
-#: libdwfl/libdwflP.h:65
+#: libdwfl/libdwflP.h:69
 msgid "Callback returned failure"
 msgstr ""
 
-#: libdwfl/libdwflP.h:66
+#: libdwfl/libdwflP.h:70
 msgid "No DWARF information found"
 msgstr ""
 
-#: libdwfl/libdwflP.h:67
+#: libdwfl/libdwflP.h:71
 msgid "No symbol table found"
 msgstr ""
 
-#: libdwfl/libdwflP.h:68
+#: libdwfl/libdwflP.h:72
 msgid "No ELF program headers"
 msgstr ""
 
-#: libdwfl/libdwflP.h:69
+#: libdwfl/libdwflP.h:73
 msgid "address range overlaps an existing module"
 msgstr ""
 
-#: libdwfl/libdwflP.h:72
+#: libdwfl/libdwflP.h:76
 msgid "image truncated"
 msgstr ""
 
-#: libdwfl/libdwflP.h:73
+#: libdwfl/libdwflP.h:77
 msgid "ELF file opened"
 msgstr ""
 
-#: libdwfl/libdwflP.h:74
+#: libdwfl/libdwflP.h:78
 msgid "not a valid ELF file"
 msgstr ""
 
-#: libdwfl/libdwflP.h:75
+#: libdwfl/libdwflP.h:79
 msgid "cannot handle DWARF type description"
 msgstr ""
 
-#: libdwfl/libdwflP.h:76
+#: libdwfl/libdwflP.h:80
 msgid "ELF file does not match build ID"
 msgstr ""
 
-#: libdwfl/libdwflP.h:77
+#: libdwfl/libdwflP.h:81
 msgid "corrupt .gnu.prelink_undo section data"
 msgstr ""
 
+#: libdwfl/libdwflP.h:82
+msgid "Internal error due to ebl"
+msgstr ""
+
+#: libdwfl/libdwflP.h:83
+msgid "Missing data in core file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:84
+msgid "Invalid register"
+msgstr ""
+
+#: libdwfl/libdwflP.h:85
+msgid "Error reading process memory"
+msgstr ""
+
+#: libdwfl/libdwflP.h:86
+msgid "Couldn't find architecture of any ELF"
+msgstr ""
+
+#: libdwfl/libdwflP.h:87
+msgid "Error parsing /proc filesystem"
+msgstr ""
+
+#: libdwfl/libdwflP.h:88
+msgid "Invalid DWARF"
+msgstr ""
+
+#: libdwfl/libdwflP.h:89
+msgid "Unsupported DWARF"
+msgstr ""
+
+#: libdwfl/libdwflP.h:90
+msgid "Unable to find more threads"
+msgstr ""
+
+#: libdwfl/libdwflP.h:91
+msgid "Dwfl already has attached state"
+msgstr ""
+
+#: libdwfl/libdwflP.h:92
+msgid "Dwfl has no attached state"
+msgstr ""
+
+#: libdwfl/libdwflP.h:93
+msgid "Unwinding not supported for this architecture"
+msgstr ""
+
+#: libdwfl/libdwflP.h:94
+msgid "Invalid argument"
+msgstr ""
+
+#: libdwfl/libdwflP.h:95
+msgid "Not an ET_CORE ELF file"
+msgstr ""
+
 #: libebl/eblbackendname.c:42
 msgid "No backend"
 msgstr ""
 
-#: libebl/eblcorenotetypename.c:86 libebl/eblobjecttypename.c:57
+#: libebl/eblcorenotetypename.c:102 libebl/eblobjecttypename.c:57
 #: libebl/eblobjnotetypename.c:73 libebl/eblosabiname.c:77
 #: libebl/eblsectionname.c:89 libebl/eblsectiontypename.c:119
 #: libebl/eblsegmenttypename.c:83
@@ -464,7 +520,7 @@ msgstr ""
 msgid "invalid size of destination operand"
 msgstr ""
 
-#: libelf/elf_error.c:87 src/readelf.c:4697
+#: libelf/elf_error.c:87 src/readelf.c:5190
 #, c-format
 msgid "invalid encoding"
 msgstr ""
@@ -545,8 +601,8 @@ msgstr ""
 msgid "invalid section header"
 msgstr ""
 
-#: libelf/elf_error.c:187 src/readelf.c:6335 src/readelf.c:6780
-#: src/readelf.c:6881 src/readelf.c:7043
+#: libelf/elf_error.c:187 src/readelf.c:6980 src/readelf.c:7426
+#: src/readelf.c:7527 src/readelf.c:7689
 #, c-format
 msgid "invalid data"
 msgstr ""
@@ -609,31 +665,41 @@ msgid "Also show symbol or section names"
 msgstr ""
 
 #: src/addr2line.c:64
+msgid "Also show symbol and the section names"
+msgstr ""
+
+#: src/addr2line.c:65
 msgid "Also show line table flags"
 msgstr ""
 
-#: src/addr2line.c:66
+#: src/addr2line.c:67
 msgid "Treat addresses as offsets relative to NAME section."
 msgstr ""
 
-#: src/addr2line.c:68 src/elfcmp.c:72 src/findtextrel.c:67 src/nm.c:100
+#: src/addr2line.c:69
+msgid ""
+"Show all source locations that caused inline expansion of subroutines at the "
+"address."
+msgstr ""
+
+#: src/addr2line.c:72 src/elfcmp.c:72 src/findtextrel.c:67 src/nm.c:100
 #: src/strings.c:75
 msgid "Miscellaneous:"
 msgstr ""
 
-#: src/addr2line.c:77
+#: src/addr2line.c:81
 msgid ""
 "Locate source files and line information for ADDRs (in a.out by default)."
 msgstr ""
 
-#: src/addr2line.c:81
+#: src/addr2line.c:85
 msgid "[ADDR...]"
 msgstr ""
 
-#: src/addr2line.c:181 src/ar.c:289 src/elfcmp.c:662 src/elflint.c:231
+#: src/addr2line.c:196 src/ar.c:289 src/elfcmp.c:662 src/elflint.c:235
 #: src/findtextrel.c:162 src/ld.c:949 src/nm.c:265 src/objdump.c:181
-#: src/ranlib.c:128 src/readelf.c:460 src/size.c:211 src/strings.c:219
-#: src/strip.c:213 src/unstrip.c:226
+#: src/ranlib.c:128 src/readelf.c:500 src/size.c:211 src/strings.c:226
+#: src/strip.c:213 src/unstrip.c:233
 #, c-format
 msgid ""
 "Copyright (C) %s Red Hat, Inc.\n"
@@ -641,30 +707,30 @@ msgid ""
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
 msgstr ""
 
-#: src/addr2line.c:186 src/ar.c:294 src/elfcmp.c:667 src/elflint.c:236
+#: src/addr2line.c:201 src/ar.c:294 src/elfcmp.c:667 src/elflint.c:240
 #: src/findtextrel.c:167 src/ld.c:954 src/nm.c:270 src/objdump.c:186
-#: src/ranlib.c:133 src/readelf.c:465 src/size.c:216 src/strings.c:224
-#: src/strip.c:218 src/unstrip.c:231
+#: src/ranlib.c:133 src/readelf.c:505 src/size.c:216 src/strings.c:231
+#: src/strip.c:218 src/unstrip.c:238
 #, c-format
 msgid "Written by %s.\n"
 msgstr ""
 
-#: src/addr2line.c:405
+#: src/addr2line.c:474
 #, c-format
 msgid "Section syntax requires exactly one module"
 msgstr ""
 
-#: src/addr2line.c:428
+#: src/addr2line.c:497
 #, c-format
 msgid "offset %#<PRIxMAX> lies outside section '%s'"
 msgstr ""
 
-#: src/addr2line.c:469
+#: src/addr2line.c:563
 #, c-format
 msgid "cannot find symbol '%s'"
 msgstr ""
 
-#: src/addr2line.c:474
+#: src/addr2line.c:568
 #, c-format
 msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
 msgstr ""
@@ -1101,8 +1167,8 @@ msgstr ""
 
 #: src/elfcmp.c:722 src/findtextrel.c:221 src/ldgeneric.c:1757
 #: src/ldgeneric.c:4247 src/nm.c:381 src/ranlib.c:161 src/size.c:293
-#: src/strings.c:175 src/strip.c:450 src/strip.c:487 src/unstrip.c:1903
-#: src/unstrip.c:1932
+#: src/strings.c:182 src/strip.c:451 src/strip.c:488 src/unstrip.c:1911
+#: src/unstrip.c:1940
 #, c-format
 msgid "cannot open '%s'"
 msgstr ""
@@ -1154,1596 +1220,1596 @@ msgstr ""
 msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
 msgstr ""
 
-#: src/elflint.c:78 src/readelf.c:113
+#: src/elflint.c:78 src/readelf.c:123
 msgid "FILE..."
 msgstr ""
 
-#: src/elflint.c:151 src/readelf.c:271
+#: src/elflint.c:155 src/readelf.c:292
 #, c-format
 msgid "cannot open input file"
 msgstr ""
 
-#: src/elflint.c:158
+#: src/elflint.c:162
 #, c-format
 msgid "cannot generate Elf descriptor: %s\n"
 msgstr ""
 
-#: src/elflint.c:177
+#: src/elflint.c:181
 #, c-format
 msgid "error while closing Elf descriptor: %s\n"
 msgstr ""
 
-#: src/elflint.c:181
+#: src/elflint.c:185
 msgid "No errors"
 msgstr ""
 
-#: src/elflint.c:215 src/readelf.c:434
+#: src/elflint.c:219 src/readelf.c:468
 msgid "Missing file name.\n"
 msgstr ""
 
-#: src/elflint.c:294
+#: src/elflint.c:298
 #, c-format
 msgid " error while freeing sub-ELF descriptor: %s\n"
 msgstr ""
 
-#: src/elflint.c:302
+#: src/elflint.c:306
 #, c-format
 msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
 msgstr ""
 
-#: src/elflint.c:363
+#: src/elflint.c:371
 #, c-format
 msgid "e_ident[%d] == %d is no known class\n"
 msgstr ""
 
-#: src/elflint.c:368
+#: src/elflint.c:376
 #, c-format
 msgid "e_ident[%d] == %d is no known data encoding\n"
 msgstr ""
 
-#: src/elflint.c:372
+#: src/elflint.c:380
 #, c-format
 msgid "unknown ELF header version number e_ident[%d] == %d\n"
 msgstr ""
 
-#: src/elflint.c:378
+#: src/elflint.c:386
 #, c-format
 msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
 msgstr ""
 
-#: src/elflint.c:384
+#: src/elflint.c:392
 #, c-format
 msgid "unsupport ABI version e_ident[%d] == %d\n"
 msgstr ""
 
-#: src/elflint.c:389
+#: src/elflint.c:397
 #, c-format
 msgid "e_ident[%zu] is not zero\n"
 msgstr ""
 
-#: src/elflint.c:394
+#: src/elflint.c:402
 #, c-format
 msgid "unknown object file type %d\n"
 msgstr ""
 
-#: src/elflint.c:401
+#: src/elflint.c:409
 #, c-format
 msgid "unknown machine type %d\n"
 msgstr ""
 
-#: src/elflint.c:405
+#: src/elflint.c:413
 #, c-format
 msgid "unknown object file version\n"
 msgstr ""
 
-#: src/elflint.c:411
+#: src/elflint.c:419
 #, c-format
 msgid "invalid program header offset\n"
 msgstr ""
 
-#: src/elflint.c:413
+#: src/elflint.c:421
 #, c-format
 msgid "executables and DSOs cannot have zero program header offset\n"
 msgstr ""
 
-#: src/elflint.c:417
+#: src/elflint.c:425
 #, c-format
 msgid "invalid number of program header entries\n"
 msgstr ""
 
-#: src/elflint.c:425
+#: src/elflint.c:433
 #, c-format
 msgid "invalid section header table offset\n"
 msgstr ""
 
-#: src/elflint.c:428
+#: src/elflint.c:436
 #, c-format
 msgid "section header table must be present\n"
 msgstr ""
 
-#: src/elflint.c:442
+#: src/elflint.c:450
 #, c-format
 msgid "invalid number of section header table entries\n"
 msgstr ""
 
-#: src/elflint.c:459
+#: src/elflint.c:467
 #, c-format
 msgid "invalid section header index\n"
 msgstr ""
 
-#: src/elflint.c:473
+#: src/elflint.c:481
 #, c-format
 msgid "invalid number of program header table entries\n"
 msgstr ""
 
-#: src/elflint.c:482
+#: src/elflint.c:490
 #, c-format
 msgid "invalid machine flags: %s\n"
 msgstr ""
 
-#: src/elflint.c:489 src/elflint.c:506
+#: src/elflint.c:497 src/elflint.c:514
 #, c-format
 msgid "invalid ELF header size: %hd\n"
 msgstr ""
 
-#: src/elflint.c:492 src/elflint.c:509
+#: src/elflint.c:500 src/elflint.c:517
 #, c-format
 msgid "invalid program header size: %hd\n"
 msgstr ""
 
-#: src/elflint.c:495 src/elflint.c:512
+#: src/elflint.c:503 src/elflint.c:520
 #, c-format
 msgid "invalid program header position or size\n"
 msgstr ""
 
-#: src/elflint.c:498 src/elflint.c:515
+#: src/elflint.c:506 src/elflint.c:523
 #, c-format
 msgid "invalid section header size: %hd\n"
 msgstr ""
 
-#: src/elflint.c:501 src/elflint.c:518
+#: src/elflint.c:509 src/elflint.c:526
 #, c-format
 msgid "invalid section header position or size\n"
 msgstr ""
 
-#: src/elflint.c:562
+#: src/elflint.c:570
 #, c-format
 msgid ""
 "section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
 "group\n"
 msgstr ""
 
-#: src/elflint.c:566
+#: src/elflint.c:574
 #, c-format
 msgid ""
 "section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
 msgstr ""
 
-#: src/elflint.c:582 src/elflint.c:1426 src/elflint.c:1476 src/elflint.c:1581
-#: src/elflint.c:2166 src/elflint.c:2680 src/elflint.c:2841 src/elflint.c:2971
-#: src/elflint.c:3143 src/elflint.c:4045
+#: src/elflint.c:590 src/elflint.c:1457 src/elflint.c:1508 src/elflint.c:1614
+#: src/elflint.c:1939 src/elflint.c:2228 src/elflint.c:2742 src/elflint.c:2904
+#: src/elflint.c:3034 src/elflint.c:3206 src/elflint.c:4108
 #, c-format
 msgid "section [%2d] '%s': cannot get section data\n"
 msgstr ""
 
-#: src/elflint.c:595 src/elflint.c:1588
+#: src/elflint.c:603 src/elflint.c:1621
 #, c-format
 msgid ""
 "section [%2d] '%s': referenced as string table for section [%2d] '%s' but "
 "type is not SHT_STRTAB\n"
 msgstr ""
 
-#: src/elflint.c:618
+#: src/elflint.c:626
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol table cannot have more than one extended index "
 "section\n"
 msgstr ""
 
-#: src/elflint.c:629
+#: src/elflint.c:638
 #, c-format
 msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
 msgstr ""
 
-#: src/elflint.c:638
+#: src/elflint.c:647
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
 msgstr ""
 
-#: src/elflint.c:643 src/elflint.c:646 src/elflint.c:649 src/elflint.c:652
-#: src/elflint.c:655 src/elflint.c:658
+#: src/elflint.c:652 src/elflint.c:655 src/elflint.c:658 src/elflint.c:661
+#: src/elflint.c:664 src/elflint.c:667
 #, c-format
 msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
 msgstr ""
 
-#: src/elflint.c:661
+#: src/elflint.c:670
 #, c-format
 msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
 msgstr ""
 
-#: src/elflint.c:671
+#: src/elflint.c:680
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
 msgstr ""
 
-#: src/elflint.c:680
+#: src/elflint.c:689
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
 msgstr ""
 
-#: src/elflint.c:694
+#: src/elflint.c:704
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: too large section index but no extended "
 "section index section\n"
 msgstr ""
 
-#: src/elflint.c:700
+#: src/elflint.c:710
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
 "st_shndx (%<PRIu32>)\n"
 msgstr ""
 
-#: src/elflint.c:712
+#: src/elflint.c:722
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
 msgstr ""
 
-#: src/elflint.c:720
+#: src/elflint.c:730
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown type\n"
 msgstr ""
 
-#: src/elflint.c:726
+#: src/elflint.c:736
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
 msgstr ""
 
-#: src/elflint.c:731
+#: src/elflint.c:741
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
 msgstr ""
 
-#: src/elflint.c:739
+#: src/elflint.c:749
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
 msgstr ""
 
-#: src/elflint.c:743
+#: src/elflint.c:753
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
 msgstr ""
 
-#: src/elflint.c:747
+#: src/elflint.c:757
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
 msgstr ""
 
-#: src/elflint.c:779
+#: src/elflint.c:804
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:785 src/elflint.c:810 src/elflint.c:853
+#: src/elflint.c:810 src/elflint.c:835 src/elflint.c:878
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu does not fit completely in referenced section "
 "[%2d] '%s'\n"
 msgstr ""
 
-#: src/elflint.c:794
+#: src/elflint.c:819
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
 "SHF_TLS flag set\n"
 msgstr ""
 
-#: src/elflint.c:804 src/elflint.c:846
+#: src/elflint.c:829 src/elflint.c:871
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
 "[%2d] '%s'\n"
 msgstr ""
 
-#: src/elflint.c:831
+#: src/elflint.c:856
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
 msgstr ""
 
-#: src/elflint.c:839
+#: src/elflint.c:864
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] "
 "'%s'\n"
 msgstr ""
 
-#: src/elflint.c:866
+#: src/elflint.c:891
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: local symbol outside range described in "
 "sh_info\n"
 msgstr ""
 
-#: src/elflint.c:873
+#: src/elflint.c:898
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
 "sh_info\n"
 msgstr ""
 
-#: src/elflint.c:880
+#: src/elflint.c:905
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
 msgstr ""
 
-#: src/elflint.c:930
+#: src/elflint.c:955
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section "
 "[%2d]\n"
 msgstr ""
 
-#: src/elflint.c:937
+#: src/elflint.c:962
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] "
 "'%s'\n"
 msgstr ""
 
-#: src/elflint.c:953
+#: src/elflint.c:978
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
 "match %s section address %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:960
+#: src/elflint.c:985
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
 "match %s section size %<PRIu64>\n"
 msgstr ""
 
-#: src/elflint.c:968
+#: src/elflint.c:993
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
 "section\n"
 msgstr ""
 
-#: src/elflint.c:984
+#: src/elflint.c:1009
 #, c-format
 msgid ""
 "section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
 "segment address %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:991
+#: src/elflint.c:1016
 #, c-format
 msgid ""
 "section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
 "segment size %<PRIu64>\n"
 msgstr ""
 
-#: src/elflint.c:1004
+#: src/elflint.c:1029
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
 "default visibility\n"
 msgstr ""
 
-#: src/elflint.c:1008
+#: src/elflint.c:1033
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
 msgstr ""
 
-#: src/elflint.c:1053
+#: src/elflint.c:1082
 #, c-format
 msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
 msgstr ""
 
-#: src/elflint.c:1062 src/elflint.c:1114
+#: src/elflint.c:1093 src/elflint.c:1145
 #, c-format
 msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
 msgstr ""
 
-#: src/elflint.c:1087 src/elflint.c:1139
+#: src/elflint.c:1118 src/elflint.c:1170
 #, c-format
 msgid ""
 "section [%2d] '%s': relative relocations after index %d as specified by "
 "DT_RELCOUNT\n"
 msgstr ""
 
-#: src/elflint.c:1093 src/elflint.c:1145
+#: src/elflint.c:1124 src/elflint.c:1176
 #, c-format
 msgid ""
 "section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
 "specified %d relative relocations\n"
 msgstr ""
 
-#: src/elflint.c:1105
+#: src/elflint.c:1136
 #, c-format
 msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
 msgstr ""
 
-#: src/elflint.c:1187
+#: src/elflint.c:1218
 #, c-format
 msgid "section [%2d] '%s': invalid destination section index\n"
 msgstr ""
 
-#: src/elflint.c:1200
+#: src/elflint.c:1230
 #, c-format
 msgid "section [%2d] '%s': invalid destination section type\n"
 msgstr ""
 
-#: src/elflint.c:1208
+#: src/elflint.c:1238
 #, c-format
 msgid "section [%2d] '%s': sh_info should be zero\n"
 msgstr ""
 
-#: src/elflint.c:1215
+#: src/elflint.c:1245
 #, c-format
 msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
 msgstr ""
 
-#: src/elflint.c:1222
+#: src/elflint.c:1253
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
 msgstr ""
 
-#: src/elflint.c:1282
+#: src/elflint.c:1313
 #, c-format
 msgid "text relocation flag set but there is no read-only segment\n"
 msgstr ""
 
-#: src/elflint.c:1309
+#: src/elflint.c:1340
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: invalid type\n"
 msgstr ""
 
-#: src/elflint.c:1317
+#: src/elflint.c:1348
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: relocation type invalid for the file "
 "type\n"
 msgstr ""
 
-#: src/elflint.c:1325
+#: src/elflint.c:1356
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
 msgstr ""
 
-#: src/elflint.c:1343
+#: src/elflint.c:1374
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
 "be used with %s\n"
 msgstr ""
 
-#: src/elflint.c:1360
+#: src/elflint.c:1391
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:1375
+#: src/elflint.c:1406
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: copy relocation against symbol of type "
 "%s\n"
 msgstr ""
 
-#: src/elflint.c:1396
+#: src/elflint.c:1427
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: read-only section modified but text "
 "relocation flag not set\n"
 msgstr ""
 
-#: src/elflint.c:1411
+#: src/elflint.c:1442
 #, c-format
 msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
 msgstr ""
 
-#: src/elflint.c:1450 src/elflint.c:1500
+#: src/elflint.c:1482 src/elflint.c:1533
 #, c-format
 msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
 msgstr ""
 
-#: src/elflint.c:1576
+#: src/elflint.c:1609
 #, c-format
 msgid "more than one dynamic section present\n"
 msgstr ""
 
-#: src/elflint.c:1594
+#: src/elflint.c:1628
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
 msgstr ""
 
-#: src/elflint.c:1599 src/elflint.c:1882
+#: src/elflint.c:1633 src/elflint.c:1918
 #, c-format
 msgid "section [%2d] '%s': sh_info not zero\n"
 msgstr ""
 
-#: src/elflint.c:1609
+#: src/elflint.c:1643
 #, c-format
 msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
 msgstr ""
 
-#: src/elflint.c:1617
+#: src/elflint.c:1651
 #, c-format
 msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
 msgstr ""
 
-#: src/elflint.c:1624
+#: src/elflint.c:1658
 #, c-format
 msgid "section [%2d] '%s': entry %zu: unknown tag\n"
 msgstr ""
 
-#: src/elflint.c:1635
+#: src/elflint.c:1669
 #, c-format
 msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
 msgstr ""
 
-#: src/elflint.c:1645
+#: src/elflint.c:1679
 #, c-format
 msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
 msgstr ""
 
-#: src/elflint.c:1663
+#: src/elflint.c:1697
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
 msgstr ""
 
-#: src/elflint.c:1676
+#: src/elflint.c:1710
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: pointer does not match address of section "
 "[%2d] '%s' referenced by sh_link\n"
 msgstr ""
 
-#: src/elflint.c:1719
+#: src/elflint.c:1753
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
 msgstr ""
 
-#: src/elflint.c:1734
+#: src/elflint.c:1768
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: %s value must be valid offset in section "
 "[%2d] '%s'\n"
 msgstr ""
 
-#: src/elflint.c:1754 src/elflint.c:1782
+#: src/elflint.c:1788 src/elflint.c:1816
 #, c-format
 msgid "section [%2d] '%s': contains %s entry but not %s\n"
 msgstr ""
 
-#: src/elflint.c:1766
+#: src/elflint.c:1800
 #, c-format
 msgid "section [%2d] '%s': mandatory tag %s not present\n"
 msgstr ""
 
-#: src/elflint.c:1775
+#: src/elflint.c:1809
 #, c-format
 msgid "section [%2d] '%s': no hash section present\n"
 msgstr ""
 
-#: src/elflint.c:1790 src/elflint.c:1797
+#: src/elflint.c:1824 src/elflint.c:1831
 #, c-format
 msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
 msgstr ""
 
-#: src/elflint.c:1807 src/elflint.c:1811
+#: src/elflint.c:1841 src/elflint.c:1845
 #, c-format
 msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
 msgstr ""
 
-#: src/elflint.c:1817
+#: src/elflint.c:1851
 #, c-format
 msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
 msgstr ""
 
-#: src/elflint.c:1828 src/elflint.c:1832 src/elflint.c:1836 src/elflint.c:1840
+#: src/elflint.c:1862 src/elflint.c:1866 src/elflint.c:1870 src/elflint.c:1874
 #, c-format
 msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
 msgstr ""
 
-#: src/elflint.c:1852
+#: src/elflint.c:1886
 #, c-format
 msgid ""
 "section [%2d] '%s': only relocatable files can have extended section index\n"
 msgstr ""
 
-#: src/elflint.c:1862
+#: src/elflint.c:1896
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index section not for symbol table\n"
 msgstr ""
 
-#: src/elflint.c:1867
+#: src/elflint.c:1901
 #, c-format
 msgid "cannot get data for symbol section\n"
 msgstr ""
 
-#: src/elflint.c:1870
+#: src/elflint.c:1904
 #, c-format
 msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
 msgstr ""
 
-#: src/elflint.c:1877
+#: src/elflint.c:1913
 #, c-format
 msgid "section [%2d] '%s': extended index table too small for symbol table\n"
 msgstr ""
 
-#: src/elflint.c:1892
+#: src/elflint.c:1928
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
 "same symbol table\n"
 msgstr ""
 
-#: src/elflint.c:1903
+#: src/elflint.c:1945
 #, c-format
 msgid "symbol 0 should have zero extended section index\n"
 msgstr ""
 
-#: src/elflint.c:1915
+#: src/elflint.c:1957
 #, c-format
 msgid "cannot get data for symbol %zu\n"
 msgstr ""
 
-#: src/elflint.c:1920
+#: src/elflint.c:1962
 #, c-format
 msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
 msgstr ""
 
-#: src/elflint.c:1936 src/elflint.c:1977
+#: src/elflint.c:1978 src/elflint.c:2029
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
 msgstr ""
 
-#: src/elflint.c:1948 src/elflint.c:1989
+#: src/elflint.c:1990 src/elflint.c:2041
 #, c-format
 msgid "section [%2d] '%s': chain array too large\n"
 msgstr ""
 
-#: src/elflint.c:1957 src/elflint.c:1998
+#: src/elflint.c:2004 src/elflint.c:2055
 #, c-format
 msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:1963
+#: src/elflint.c:2014
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:2004
+#: src/elflint.c:2065
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:2019
+#: src/elflint.c:2081
 #, c-format
 msgid "section [%2d] '%s': bitmask size not power of 2: %u\n"
 msgstr ""
 
-#: src/elflint.c:2030
+#: src/elflint.c:2092
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected at "
-"least%ld)\n"
+"least %ld)\n"
 msgstr ""
 
-#: src/elflint.c:2038
+#: src/elflint.c:2100
 #, c-format
 msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
 msgstr ""
 
-#: src/elflint.c:2070
+#: src/elflint.c:2132
 #, c-format
 msgid ""
 "section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
 msgstr ""
 
-#: src/elflint.c:2091
+#: src/elflint.c:2153
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
 "undefined\n"
 msgstr ""
 
-#: src/elflint.c:2102
+#: src/elflint.c:2164
 #, c-format
 msgid ""
 "section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
 msgstr ""
 
-#: src/elflint.c:2133
+#: src/elflint.c:2195
 #, c-format
 msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:2138
+#: src/elflint.c:2200
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:2144
+#: src/elflint.c:2206
 #, c-format
 msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
 msgstr ""
 
-#: src/elflint.c:2157
+#: src/elflint.c:2219
 #, c-format
 msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
 msgstr ""
 
-#: src/elflint.c:2175
+#: src/elflint.c:2237
 #, c-format
 msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
 msgstr ""
 
-#: src/elflint.c:2183
+#: src/elflint.c:2245
 #, c-format
 msgid "section [%2d] '%s': hash table entry size incorrect\n"
 msgstr ""
 
-#: src/elflint.c:2188
+#: src/elflint.c:2250
 #, c-format
 msgid "section [%2d] '%s': not marked to be allocated\n"
 msgstr ""
 
-#: src/elflint.c:2193
+#: src/elflint.c:2255
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table has not even room for initial administrative "
 "entries\n"
 msgstr ""
 
-#: src/elflint.c:2241
+#: src/elflint.c:2303
 #, c-format
 msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
 msgstr ""
 
-#: src/elflint.c:2319 src/elflint.c:2323
+#: src/elflint.c:2381 src/elflint.c:2385
 #, c-format
 msgid "section [%2zu] '%s': reference to symbol index 0\n"
 msgstr ""
 
-#: src/elflint.c:2330
+#: src/elflint.c:2392
 #, c-format
 msgid ""
 "symbol %d referenced in new hash table in [%2zu] '%s' but not in old hash "
 "table in [%2zu] '%s'\n"
 msgstr ""
 
-#: src/elflint.c:2342
+#: src/elflint.c:2404
 #, c-format
 msgid ""
 "symbol %d referenced in old hash table in [%2zu] '%s' but not in new hash "
 "table in [%2zu] '%s'\n"
 msgstr ""
 
-#: src/elflint.c:2358
+#: src/elflint.c:2420
 #, c-format
 msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
 msgstr ""
 
-#: src/elflint.c:2378
+#: src/elflint.c:2440
 #, c-format
 msgid ""
 "section [%2d] '%s': section groups only allowed in relocatable object files\n"
 msgstr ""
 
-#: src/elflint.c:2389
+#: src/elflint.c:2451
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol table: %s\n"
 msgstr ""
 
-#: src/elflint.c:2394
+#: src/elflint.c:2456
 #, c-format
 msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
 msgstr ""
 
-#: src/elflint.c:2400
+#: src/elflint.c:2462
 #, c-format
 msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
 msgstr ""
 
-#: src/elflint.c:2405
+#: src/elflint.c:2467
 #, c-format
 msgid "section [%2d] '%s': sh_flags not zero\n"
 msgstr ""
 
-#: src/elflint.c:2412
+#: src/elflint.c:2474
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol for signature\n"
 msgstr ""
 
-#: src/elflint.c:2417
+#: src/elflint.c:2479
 #, c-format
 msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
 msgstr ""
 
-#: src/elflint.c:2423
+#: src/elflint.c:2485
 #, c-format
 msgid "section [%2d] '%s': sh_flags not set correctly\n"
 msgstr ""
 
-#: src/elflint.c:2429
+#: src/elflint.c:2491
 #, c-format
 msgid "section [%2d] '%s': cannot get data: %s\n"
 msgstr ""
 
-#: src/elflint.c:2438
+#: src/elflint.c:2500
 #, c-format
 msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
 msgstr ""
 
-#: src/elflint.c:2443
+#: src/elflint.c:2505
 #, c-format
 msgid "section [%2d] '%s': section group without flags word\n"
 msgstr ""
 
-#: src/elflint.c:2449
+#: src/elflint.c:2511
 #, c-format
 msgid "section [%2d] '%s': section group without member\n"
 msgstr ""
 
-#: src/elflint.c:2453
+#: src/elflint.c:2515
 #, c-format
 msgid "section [%2d] '%s': section group with only one member\n"
 msgstr ""
 
-#: src/elflint.c:2464
+#: src/elflint.c:2526
 #, c-format
 msgid "section [%2d] '%s': unknown section group flags\n"
 msgstr ""
 
-#: src/elflint.c:2476
+#: src/elflint.c:2538
 #, c-format
 msgid "section [%2d] '%s': section index %Zu out of range\n"
 msgstr ""
 
-#: src/elflint.c:2485
+#: src/elflint.c:2547
 #, c-format
 msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
 msgstr ""
 
-#: src/elflint.c:2492
+#: src/elflint.c:2554
 #, c-format
 msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
 msgstr ""
 
-#: src/elflint.c:2498
+#: src/elflint.c:2560
 #, c-format
 msgid ""
 "section [%2d] '%s': element %Zu references section [%2d] '%s' without "
 "SHF_GROUP flag set\n"
 msgstr ""
 
-#: src/elflint.c:2505
+#: src/elflint.c:2567
 #, c-format
 msgid "section [%2d] '%s' is contained in more than one section group\n"
 msgstr ""
 
-#: src/elflint.c:2694
+#: src/elflint.c:2756
 #, c-format
 msgid ""
 "section [%2d] '%s' refers in sh_link to section [%2d] '%s' which is no "
 "dynamic symbol table\n"
 msgstr ""
 
-#: src/elflint.c:2705
+#: src/elflint.c:2768
 #, c-format
 msgid ""
 "section [%2d] '%s' has different number of entries than symbol table [%2d] "
 "'%s'\n"
 msgstr ""
 
-#: src/elflint.c:2721
+#: src/elflint.c:2784
 #, c-format
 msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
 msgstr ""
 
-#: src/elflint.c:2737
+#: src/elflint.c:2800
 #, c-format
 msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
 msgstr ""
 
-#: src/elflint.c:2745
+#: src/elflint.c:2808
 #, c-format
 msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
 msgstr ""
 
-#: src/elflint.c:2759
+#: src/elflint.c:2822
 #, c-format
 msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
 msgstr ""
 
-#: src/elflint.c:2764
+#: src/elflint.c:2827
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: version index %d is for defined version\n"
 msgstr ""
 
-#: src/elflint.c:2774
+#: src/elflint.c:2837
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: version index %d is for requested version\n"
 msgstr ""
 
-#: src/elflint.c:2826
+#: src/elflint.c:2889
 #, c-format
 msgid "more than one version reference section present\n"
 msgstr ""
 
-#: src/elflint.c:2834 src/elflint.c:2963
+#: src/elflint.c:2897 src/elflint.c:3026
 #, c-format
 msgid "section [%2d] '%s': sh_link does not link to string table\n"
 msgstr ""
 
-#: src/elflint.c:2857 src/elflint.c:3015
+#: src/elflint.c:2920 src/elflint.c:3078
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong version %d\n"
 msgstr ""
 
-#: src/elflint.c:2863 src/elflint.c:3021
+#: src/elflint.c:2926 src/elflint.c:3084
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
 msgstr ""
 
-#: src/elflint.c:2871
+#: src/elflint.c:2934
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid file reference\n"
 msgstr ""
 
-#: src/elflint.c:2879
+#: src/elflint.c:2942
 #, c-format
 msgid "section [%2d] '%s': entry %d references unknown dependency\n"
 msgstr ""
 
-#: src/elflint.c:2891
+#: src/elflint.c:2954
 #, c-format
 msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
 msgstr ""
 
-#: src/elflint.c:2898
+#: src/elflint.c:2961
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
 "reference\n"
 msgstr ""
 
-#: src/elflint.c:2905
+#: src/elflint.c:2968
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: "
 "%#x, expected %#x\n"
 msgstr ""
 
-#: src/elflint.c:2915
+#: src/elflint.c:2978
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
 "name '%s'\n"
 msgstr ""
 
-#: src/elflint.c:2926
+#: src/elflint.c:2989
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
 msgstr ""
 
-#: src/elflint.c:2942 src/elflint.c:3100
+#: src/elflint.c:3005 src/elflint.c:3163
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
 msgstr ""
 
-#: src/elflint.c:2955
+#: src/elflint.c:3018
 #, c-format
 msgid "more than one version definition section present\n"
 msgstr ""
 
-#: src/elflint.c:3000
+#: src/elflint.c:3063
 #, c-format
 msgid "section [%2d] '%s': more than one BASE definition\n"
 msgstr ""
 
-#: src/elflint.c:3004
+#: src/elflint.c:3067
 #, c-format
 msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
 msgstr ""
 
-#: src/elflint.c:3010
+#: src/elflint.c:3073
 #, c-format
 msgid "section [%2d] '%s': entry %d has unknown flag\n"
 msgstr ""
 
-#: src/elflint.c:3034
+#: src/elflint.c:3097
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid name reference\n"
 msgstr ""
 
-#: src/elflint.c:3041
+#: src/elflint.c:3104
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
 msgstr ""
 
-#: src/elflint.c:3050
+#: src/elflint.c:3113
 #, c-format
 msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
 msgstr ""
 
-#: src/elflint.c:3069
+#: src/elflint.c:3132
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
 msgstr ""
 
-#: src/elflint.c:3084
+#: src/elflint.c:3147
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
 msgstr ""
 
-#: src/elflint.c:3106
+#: src/elflint.c:3169
 #, c-format
 msgid "section [%2d] '%s': no BASE definition\n"
 msgstr ""
 
-#: src/elflint.c:3122
+#: src/elflint.c:3185
 #, c-format
 msgid "section [%2d] '%s': unknown parent version '%s'\n"
 msgstr ""
 
-#: src/elflint.c:3135
+#: src/elflint.c:3198
 #, c-format
 msgid "section [%2d] '%s': empty object attributes section\n"
 msgstr ""
 
-#: src/elflint.c:3156
+#: src/elflint.c:3219
 #, c-format
 msgid "section [%2d] '%s': unrecognized attribute format\n"
 msgstr ""
 
-#: src/elflint.c:3172
+#: src/elflint.c:3235
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3181
+#: src/elflint.c:3244
 #, c-format
 msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3193
+#: src/elflint.c:3256
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
 msgstr ""
 
-#: src/elflint.c:3210
+#: src/elflint.c:3273
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
 msgstr ""
 
-#: src/elflint.c:3219
+#: src/elflint.c:3282
 #, c-format
 msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3228
+#: src/elflint.c:3291
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
 msgstr ""
 
-#: src/elflint.c:3241
+#: src/elflint.c:3304
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
 msgstr ""
 
-#: src/elflint.c:3252
+#: src/elflint.c:3315
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
 msgstr ""
 
-#: src/elflint.c:3270
+#: src/elflint.c:3333
 #, c-format
 msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
 msgstr ""
 
-#: src/elflint.c:3281
+#: src/elflint.c:3344
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
 msgstr ""
 
-#: src/elflint.c:3294
+#: src/elflint.c:3357
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
 msgstr ""
 
-#: src/elflint.c:3298
+#: src/elflint.c:3361
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
 msgstr ""
 
-#: src/elflint.c:3308
+#: src/elflint.c:3371
 #, c-format
 msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
 msgstr ""
 
-#: src/elflint.c:3314
+#: src/elflint.c:3377
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3403
+#: src/elflint.c:3466
 #, c-format
 msgid "cannot get section header of zeroth section\n"
 msgstr ""
 
-#: src/elflint.c:3407
+#: src/elflint.c:3470
 #, c-format
 msgid "zeroth section has nonzero name\n"
 msgstr ""
 
-#: src/elflint.c:3409
+#: src/elflint.c:3472
 #, c-format
 msgid "zeroth section has nonzero type\n"
 msgstr ""
 
-#: src/elflint.c:3411
+#: src/elflint.c:3474
 #, c-format
 msgid "zeroth section has nonzero flags\n"
 msgstr ""
 
-#: src/elflint.c:3413
+#: src/elflint.c:3476
 #, c-format
 msgid "zeroth section has nonzero address\n"
 msgstr ""
 
-#: src/elflint.c:3415
+#: src/elflint.c:3478
 #, c-format
 msgid "zeroth section has nonzero offset\n"
 msgstr ""
 
-#: src/elflint.c:3417
+#: src/elflint.c:3480
 #, c-format
 msgid "zeroth section has nonzero align value\n"
 msgstr ""
 
-#: src/elflint.c:3419
+#: src/elflint.c:3482
 #, c-format
 msgid "zeroth section has nonzero entry size value\n"
 msgstr ""
 
-#: src/elflint.c:3422
+#: src/elflint.c:3485
 #, c-format
 msgid ""
 "zeroth section has nonzero size value while ELF header has nonzero shnum "
 "value\n"
 msgstr ""
 
-#: src/elflint.c:3426
+#: src/elflint.c:3489
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
 "overflow in shstrndx\n"
 msgstr ""
 
-#: src/elflint.c:3430
+#: src/elflint.c:3493
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
 "overflow in phnum\n"
 msgstr ""
 
-#: src/elflint.c:3447
+#: src/elflint.c:3510
 #, c-format
 msgid "cannot get section header for section [%2zu] '%s': %s\n"
 msgstr ""
 
-#: src/elflint.c:3456
+#: src/elflint.c:3519
 #, c-format
 msgid "section [%2zu]: invalid name\n"
 msgstr ""
 
-#: src/elflint.c:3483
+#: src/elflint.c:3546
 #, c-format
 msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
 msgstr ""
 
-#: src/elflint.c:3499
+#: src/elflint.c:3562
 #, c-format
 msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
 msgstr ""
 
-#: src/elflint.c:3516
+#: src/elflint.c:3579
 #, c-format
 msgid ""
 "section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
 msgstr ""
 
-#: src/elflint.c:3534
+#: src/elflint.c:3597
 #, c-format
 msgid "section [%2zu] '%s' present in object file\n"
 msgstr ""
 
-#: src/elflint.c:3540 src/elflint.c:3572
+#: src/elflint.c:3603 src/elflint.c:3635
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
 msgstr ""
 
-#: src/elflint.c:3545 src/elflint.c:3577
+#: src/elflint.c:3608 src/elflint.c:3640
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
 "segments\n"
 msgstr ""
 
-#: src/elflint.c:3553
+#: src/elflint.c:3616
 #, c-format
 msgid ""
 "section [%2zu] '%s' is extension section index table in non-object file\n"
 msgstr ""
 
-#: src/elflint.c:3596
+#: src/elflint.c:3659
 #, c-format
 msgid "section [%2zu] '%s': size not multiple of entry size\n"
 msgstr ""
 
-#: src/elflint.c:3601
+#: src/elflint.c:3664
 #, c-format
 msgid "cannot get section header\n"
 msgstr ""
 
-#: src/elflint.c:3611
+#: src/elflint.c:3674
 #, c-format
 msgid "section [%2zu] '%s' has unsupported type %d\n"
 msgstr ""
 
-#: src/elflint.c:3625
+#: src/elflint.c:3688
 #, c-format
 msgid ""
 "section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:3632
+#: src/elflint.c:3695
 #, c-format
 msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:3640
+#: src/elflint.c:3703
 #, c-format
 msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
 msgstr ""
 
-#: src/elflint.c:3648
+#: src/elflint.c:3711
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in link value\n"
 msgstr ""
 
-#: src/elflint.c:3653
+#: src/elflint.c:3716
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in info value\n"
 msgstr ""
 
-#: src/elflint.c:3660
+#: src/elflint.c:3723
 #, c-format
 msgid "section [%2zu] '%s': strings flag set without merge flag\n"
 msgstr ""
 
-#: src/elflint.c:3665
+#: src/elflint.c:3728
 #, c-format
 msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
 msgstr ""
 
-#: src/elflint.c:3683
+#: src/elflint.c:3746
 #, c-format
 msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
 msgstr ""
 
-#: src/elflint.c:3692
+#: src/elflint.c:3755
 #, c-format
 msgid "section [%2zu] '%s' is both executable and writable\n"
 msgstr ""
 
-#: src/elflint.c:3721
+#: src/elflint.c:3784
 #, c-format
 msgid ""
 "section [%2zu] '%s' not fully contained in segment of program header entry "
 "%d\n"
 msgstr ""
 
-#: src/elflint.c:3729
+#: src/elflint.c:3792
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
 "program header entry %d\n"
 msgstr ""
 
-#: src/elflint.c:3738
+#: src/elflint.c:3801
 #, c-format
 msgid ""
 "section [%2zu] '%s' has not type NOBITS but is not read from the file in "
 "segment of program header entry %d\n"
 msgstr ""
 
-#: src/elflint.c:3749
+#: src/elflint.c:3812
 #, c-format
 msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
 msgstr ""
 
-#: src/elflint.c:3759
+#: src/elflint.c:3822
 #, c-format
 msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
 msgstr ""
 
-#: src/elflint.c:3769
+#: src/elflint.c:3832
 #, c-format
 msgid ""
 "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
 msgstr ""
 
-#: src/elflint.c:3775
+#: src/elflint.c:3838
 #, c-format
 msgid ""
 "section [%2zu] '%s': ELF header says this is the section header string table "
 "but type is not SHT_TYPE\n"
 msgstr ""
 
-#: src/elflint.c:3783
+#: src/elflint.c:3846
 #, c-format
 msgid ""
 "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
 msgstr ""
 
-#: src/elflint.c:3834
+#: src/elflint.c:3897
 #, c-format
 msgid "more than one version symbol table present\n"
 msgstr ""
 
-#: src/elflint.c:3857
+#: src/elflint.c:3920
 #, c-format
 msgid "INTERP program header entry but no .interp section\n"
 msgstr ""
 
-#: src/elflint.c:3868
+#: src/elflint.c:3931
 #, c-format
 msgid ""
 "loadable segment [%u] is executable but contains no executable sections\n"
 msgstr ""
 
-#: src/elflint.c:3874
+#: src/elflint.c:3937
 #, c-format
 msgid "loadable segment [%u] is writable but contains no writable sections\n"
 msgstr ""
 
-#: src/elflint.c:3885
+#: src/elflint.c:3948
 #, c-format
 msgid ""
 "no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
 "exist\n"
 msgstr ""
 
-#: src/elflint.c:3898
+#: src/elflint.c:3961
 #, c-format
 msgid "duplicate version index %d\n"
 msgstr ""
 
-#: src/elflint.c:3912
+#: src/elflint.c:3975
 #, c-format
 msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
 msgstr ""
 
-#: src/elflint.c:3961
+#: src/elflint.c:4024
 #, c-format
 msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
 msgstr ""
 
-#: src/elflint.c:3965
+#: src/elflint.c:4028
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
 msgstr ""
 
-#: src/elflint.c:3988
+#: src/elflint.c:4051
 #, c-format
 msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
 msgstr ""
 
-#: src/elflint.c:3992
+#: src/elflint.c:4055
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
 msgstr ""
 
-#: src/elflint.c:4009
+#: src/elflint.c:4072
 #, c-format
 msgid "phdr[%d]: no note entries defined for the type of file\n"
 msgstr ""
 
-#: src/elflint.c:4028
+#: src/elflint.c:4091
 #, c-format
 msgid "phdr[%d]: cannot get content of note section: %s\n"
 msgstr ""
 
-#: src/elflint.c:4031
+#: src/elflint.c:4094
 #, c-format
 msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
 msgstr ""
 
-#: src/elflint.c:4052
+#: src/elflint.c:4115
 #, c-format
 msgid "section [%2d] '%s': no note entries defined for the type of file\n"
 msgstr ""
 
-#: src/elflint.c:4059
+#: src/elflint.c:4122
 #, c-format
 msgid "section [%2d] '%s': cannot get content of note section\n"
 msgstr ""
 
-#: src/elflint.c:4062
+#: src/elflint.c:4125
 #, c-format
 msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
 msgstr ""
 
-#: src/elflint.c:4080
+#: src/elflint.c:4143
 #, c-format
 msgid ""
 "only executables, shared objects, and core files can have program headers\n"
 msgstr ""
 
-#: src/elflint.c:4095
+#: src/elflint.c:4158
 #, c-format
 msgid "cannot get program header entry %d: %s\n"
 msgstr ""
 
-#: src/elflint.c:4104
+#: src/elflint.c:4167
 #, c-format
 msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:4115
+#: src/elflint.c:4178
 #, c-format
 msgid "more than one INTERP entry in program header\n"
 msgstr ""
 
-#: src/elflint.c:4123
+#: src/elflint.c:4186
 #, c-format
 msgid "more than one TLS entry in program header\n"
 msgstr ""
 
-#: src/elflint.c:4130
+#: src/elflint.c:4193
 #, c-format
 msgid "static executable cannot have dynamic sections\n"
 msgstr ""
 
-#: src/elflint.c:4144
+#: src/elflint.c:4207
 #, c-format
 msgid "dynamic section reference in program header has wrong offset\n"
 msgstr ""
 
-#: src/elflint.c:4147
+#: src/elflint.c:4210
 #, c-format
 msgid "dynamic section size mismatch in program and section header\n"
 msgstr ""
 
-#: src/elflint.c:4157
+#: src/elflint.c:4220
 #, c-format
 msgid "more than one GNU_RELRO entry in program header\n"
 msgstr ""
 
-#: src/elflint.c:4178
+#: src/elflint.c:4241
 #, c-format
 msgid "loadable segment GNU_RELRO applies to is not writable\n"
 msgstr ""
 
-#: src/elflint.c:4181
+#: src/elflint.c:4244
 #, c-format
 msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
 msgstr ""
 
-#: src/elflint.c:4189 src/elflint.c:4212
+#: src/elflint.c:4252 src/elflint.c:4275
 #, c-format
 msgid "%s segment not contained in a loaded segment\n"
 msgstr ""
 
-#: src/elflint.c:4218
+#: src/elflint.c:4281
 #, c-format
 msgid "program header offset in ELF header and PHDR entry do not match"
 msgstr ""
 
-#: src/elflint.c:4242
+#: src/elflint.c:4305
 #, c-format
 msgid "call frame search table reference in program header has wrong offset\n"
 msgstr ""
 
-#: src/elflint.c:4245
+#: src/elflint.c:4308
 #, c-format
 msgid "call frame search table size mismatch in program and section header\n"
 msgstr ""
 
-#: src/elflint.c:4258
+#: src/elflint.c:4321
 #, c-format
 msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
 msgstr ""
 
-#: src/elflint.c:4266
+#: src/elflint.c:4329
 #, c-format
 msgid "call frame search table must be allocated\n"
 msgstr ""
 
-#: src/elflint.c:4269
+#: src/elflint.c:4332
 #, c-format
 msgid "section [%2zu] '%s' must be allocated\n"
 msgstr ""
 
-#: src/elflint.c:4273
+#: src/elflint.c:4336
 #, c-format
 msgid "call frame search table must not be writable\n"
 msgstr ""
 
-#: src/elflint.c:4276
+#: src/elflint.c:4339
 #, c-format
 msgid "section [%2zu] '%s' must not be writable\n"
 msgstr ""
 
-#: src/elflint.c:4281
+#: src/elflint.c:4344
 #, c-format
 msgid "call frame search table must not be executable\n"
 msgstr ""
 
-#: src/elflint.c:4284
+#: src/elflint.c:4347
 #, c-format
 msgid "section [%2zu] '%s' must not be executable\n"
 msgstr ""
 
-#: src/elflint.c:4295
+#: src/elflint.c:4358
 #, c-format
 msgid "program header entry %d: file size greater than memory size\n"
 msgstr ""
 
-#: src/elflint.c:4302
+#: src/elflint.c:4365
 #, c-format
 msgid "program header entry %d: alignment not a power of 2\n"
 msgstr ""
 
-#: src/elflint.c:4305
+#: src/elflint.c:4368
 #, c-format
 msgid ""
 "program header entry %d: file offset and virtual address not module of "
 "alignment\n"
 msgstr ""
 
-#: src/elflint.c:4318
+#: src/elflint.c:4381
 #, c-format
 msgid ""
 "executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
 "program header entry"
 msgstr ""
 
-#: src/elflint.c:4352
+#: src/elflint.c:4415
 #, c-format
 msgid "cannot read ELF header: %s\n"
 msgstr ""
 
-#: src/elflint.c:4378
+#: src/elflint.c:4441
 #, c-format
 msgid "text relocation flag set but not needed\n"
 msgstr ""
@@ -3251,7 +3317,8 @@ msgstr ""
 msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
 msgstr ""
 
-#: src/ldgeneric.c:651 src/ldgeneric.c:1112 src/readelf.c:640 src/strip.c:562
+#: src/ldgeneric.c:651 src/ldgeneric.c:1112 src/readelf.c:527
+#: src/readelf.c:829 src/strip.c:563
 #, c-format
 msgid "cannot determine number of sections: %s"
 msgstr ""
@@ -3482,7 +3549,7 @@ msgstr ""
 msgid "cannot get header of 0th section: %s"
 msgstr ""
 
-#: src/ldgeneric.c:6930 src/unstrip.c:1810
+#: src/ldgeneric.c:6930 src/unstrip.c:1818
 #, c-format
 msgid "cannot update ELF header: %s"
 msgstr ""
@@ -3644,7 +3711,7 @@ msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
 msgstr ""
 
 #: src/nm.c:398 src/nm.c:410 src/size.c:309 src/size.c:318 src/size.c:329
-#: src/strip.c:2124
+#: src/strip.c:2155
 #, c-format
 msgid "while closing '%s'"
 msgstr ""
@@ -3685,17 +3752,17 @@ msgstr ""
 msgid "cannot create search tree"
 msgstr ""
 
-#: src/nm.c:757 src/nm.c:1156 src/objdump.c:787 src/readelf.c:896
-#: src/readelf.c:1039 src/readelf.c:1187 src/readelf.c:1369 src/readelf.c:1569
-#: src/readelf.c:1755 src/readelf.c:1965 src/readelf.c:2219 src/readelf.c:2285
-#: src/readelf.c:2363 src/readelf.c:2861 src/readelf.c:2897 src/readelf.c:2959
-#: src/readelf.c:7270 src/readelf.c:8176 src/readelf.c:8323 src/readelf.c:8391
-#: src/size.c:417 src/size.c:491 src/strip.c:502
+#: src/nm.c:757 src/nm.c:1163 src/objdump.c:787 src/readelf.c:536
+#: src/readelf.c:1085 src/readelf.c:1245 src/readelf.c:1393 src/readelf.c:1579
+#: src/readelf.c:1785 src/readelf.c:1972 src/readelf.c:2196 src/readelf.c:2454
+#: src/readelf.c:2524 src/readelf.c:2606 src/readelf.c:3117 src/readelf.c:3153
+#: src/readelf.c:3216 src/readelf.c:7920 src/readelf.c:9002 src/readelf.c:9149
+#: src/readelf.c:9217 src/size.c:417 src/size.c:487 src/strip.c:503
 #, c-format
 msgid "cannot get section header string table index"
 msgstr ""
 
-#: src/nm.c:782
+#: src/nm.c:784
 #, c-format
 msgid ""
 "\n"
@@ -3704,29 +3771,29 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/nm.c:785
+#: src/nm.c:787
 #, c-format
 msgid ""
 "%*s%-*s %-*s Class  Type     %-*s %*s Section\n"
 "\n"
 msgstr ""
 
-#: src/nm.c:1166
+#: src/nm.c:1173
 #, c-format
 msgid "%s: entry size in section `%s' is not what we expect"
 msgstr ""
 
-#: src/nm.c:1170
+#: src/nm.c:1177
 #, c-format
 msgid "%s: size of section `%s' is not multiple of entry size"
 msgstr ""
 
-#: src/nm.c:1428
+#: src/nm.c:1435
 #, c-format
 msgid "%s%s%s%s: Invalid operation"
 msgstr ""
 
-#: src/nm.c:1485
+#: src/nm.c:1492
 #, c-format
 msgid "%s%s%s: no symbols"
 msgstr ""
@@ -3759,7 +3826,7 @@ msgstr ""
 msgid "Show information from FILEs (a.out by default)."
 msgstr ""
 
-#: src/objdump.c:236 src/readelf.c:439
+#: src/objdump.c:236 src/readelf.c:473
 msgid "No operation specified.\n"
 msgstr ""
 
@@ -3768,11 +3835,11 @@ msgstr ""
 msgid "while close `%s'"
 msgstr ""
 
-#: src/objdump.c:379 src/readelf.c:1664 src/readelf.c:1838
+#: src/objdump.c:379 src/readelf.c:1880 src/readelf.c:2069
 msgid "INVALID SYMBOL"
 msgstr ""
 
-#: src/objdump.c:394 src/readelf.c:1695 src/readelf.c:1871
+#: src/objdump.c:394 src/readelf.c:1911 src/readelf.c:2102
 msgid "INVALID SECTION"
 msgstr ""
 
@@ -3826,384 +3893,429 @@ msgstr ""
 msgid "error while freeing sub-ELF descriptor: %s"
 msgstr ""
 
-#: src/readelf.c:67
+#: src/readelf.c:71
+msgid "ELF input selection:"
+msgstr ""
+
+#: src/readelf.c:73
+msgid ""
+"Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data"
+msgstr ""
+
+#: src/readelf.c:75
 msgid "ELF output selection:"
 msgstr ""
 
-#: src/readelf.c:69
+#: src/readelf.c:77
 msgid "All these plus -p .strtab -p .dynstr -p .comment"
 msgstr ""
 
-#: src/readelf.c:70
+#: src/readelf.c:78
 msgid "Display the dynamic segment"
 msgstr ""
 
-#: src/readelf.c:71
+#: src/readelf.c:79
 msgid "Display the ELF file header"
 msgstr ""
 
-#: src/readelf.c:73
+#: src/readelf.c:81
 msgid "Display histogram of bucket list lengths"
 msgstr ""
 
-#: src/readelf.c:74
+#: src/readelf.c:82
 msgid "Display the program headers"
 msgstr ""
 
-#: src/readelf.c:76
+#: src/readelf.c:84
 msgid "Display relocations"
 msgstr ""
 
-#: src/readelf.c:77
+#: src/readelf.c:85
 msgid "Display the sections' headers"
 msgstr ""
 
-#: src/readelf.c:79
+#: src/readelf.c:87
 msgid "Display the symbol table"
 msgstr ""
 
-#: src/readelf.c:80
+#: src/readelf.c:88
 msgid "Display versioning information"
 msgstr ""
 
-#: src/readelf.c:81
+#: src/readelf.c:89
 msgid "Display the ELF notes"
 msgstr ""
 
-#: src/readelf.c:83
+#: src/readelf.c:91
 msgid "Display architecture specific information, if any"
 msgstr ""
 
-#: src/readelf.c:85
+#: src/readelf.c:93
 msgid "Display sections for exception handling"
 msgstr ""
 
-#: src/readelf.c:87
+#: src/readelf.c:95
 msgid "Additional output selection:"
 msgstr ""
 
-#: src/readelf.c:89
+#: src/readelf.c:97
 msgid ""
 "Display DWARF section content.  SECTION can be one of abbrev, aranges, "
-"frame, gdb_index, info, loc, line, ranges, pubnames, str, macinfo, macro or "
-"exception"
+"decodedaranges, frame, gdb_index, info, loc, line, decodedline, ranges, "
+"pubnames, str, macinfo, macro or exception"
 msgstr ""
 
-#: src/readelf.c:93
+#: src/readelf.c:101
 msgid "Dump the uninterpreted contents of SECTION, by number or name"
 msgstr ""
 
-#: src/readelf.c:95
+#: src/readelf.c:103
 msgid "Print string contents of sections"
 msgstr ""
 
-#: src/readelf.c:98
+#: src/readelf.c:106
 msgid "Display the symbol index of an archive"
 msgstr ""
 
-#: src/readelf.c:100
+#: src/readelf.c:108
 msgid "Output control:"
 msgstr ""
 
-#: src/readelf.c:102
+#: src/readelf.c:110
 msgid "Do not find symbol names for addresses in DWARF data"
 msgstr ""
 
-#: src/readelf.c:104
+#: src/readelf.c:112
+msgid ""
+"Display just offsets instead of resolving values to addresses in DWARF data"
+msgstr ""
+
+#: src/readelf.c:114
 msgid "Ignored for compatibility (lines always wide)"
 msgstr ""
 
-#: src/readelf.c:109
+#: src/readelf.c:119
 msgid "Print information from ELF file in human-readable form."
 msgstr ""
 
-#: src/readelf.c:410
+#: src/readelf.c:441
 #, c-format
 msgid "Unknown DWARF debug section `%s'.\n"
 msgstr ""
 
-#: src/readelf.c:476
+#: src/readelf.c:520 src/readelf.c:631
 #, c-format
 msgid "cannot generate Elf descriptor: %s"
 msgstr ""
 
-#: src/readelf.c:488
+#: src/readelf.c:545 src/readelf.c:1099 src/readelf.c:1269
 #, c-format
-msgid "'%s' is not an archive, cannot print archive index"
+msgid "cannot get section: %s"
+msgstr ""
+
+#: src/readelf.c:554 src/readelf.c:1106 src/readelf.c:1277 src/readelf.c:9169
+#: src/unstrip.c:352 src/unstrip.c:383 src/unstrip.c:432 src/unstrip.c:540
+#: src/unstrip.c:557 src/unstrip.c:593 src/unstrip.c:791 src/unstrip.c:1059
+#: src/unstrip.c:1250 src/unstrip.c:1310 src/unstrip.c:1431 src/unstrip.c:1484
+#: src/unstrip.c:1591 src/unstrip.c:1780
+#, c-format
+msgid "cannot get section header: %s"
+msgstr ""
+
+#: src/readelf.c:562
+#, c-format
+msgid "cannot get section name"
+msgstr ""
+
+#: src/readelf.c:571 src/readelf.c:5221 src/readelf.c:7414 src/readelf.c:7516
+#: src/readelf.c:7674
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr ""
+
+#: src/readelf.c:587
+#, c-format
+msgid "cannot create temp file '%s'"
+msgstr ""
+
+#: src/readelf.c:596
+#, c-format
+msgid "cannot write section data"
 msgstr ""
 
-#: src/readelf.c:493
+#: src/readelf.c:602 src/readelf.c:619 src/readelf.c:648
 #, c-format
 msgid "error while closing Elf descriptor: %s"
 msgstr ""
 
-#: src/readelf.c:585
+#: src/readelf.c:609
+#, c-format
+msgid "error while rewinding file descriptor"
+msgstr ""
+
+#: src/readelf.c:643
+#, c-format
+msgid "'%s' is not an archive, cannot print archive index"
+msgstr ""
+
+#: src/readelf.c:742
+#, c-format
+msgid "No such section '%s' in '%s'"
+msgstr ""
+
+#: src/readelf.c:769
 #, c-format
 msgid "cannot stat input file"
 msgstr ""
 
-#: src/readelf.c:587
+#: src/readelf.c:771
 #, c-format
 msgid "input file is empty"
 msgstr ""
 
-#: src/readelf.c:589
+#: src/readelf.c:773
 #, c-format
 msgid "failed reading '%s': %s"
 msgstr ""
 
-#: src/readelf.c:625
+#: src/readelf.c:814
 #, c-format
 msgid "cannot read ELF header: %s"
 msgstr ""
 
-#: src/readelf.c:633
+#: src/readelf.c:822
 #, c-format
 msgid "cannot create EBL handle"
 msgstr ""
 
-#: src/readelf.c:646
+#: src/readelf.c:835
 #, c-format
 msgid "cannot determine number of program headers: %s"
 msgstr ""
 
-#: src/readelf.c:732
+#: src/readelf.c:921
 msgid "NONE (None)"
 msgstr ""
 
-#: src/readelf.c:733
+#: src/readelf.c:922
 msgid "REL (Relocatable file)"
 msgstr ""
 
-#: src/readelf.c:734
+#: src/readelf.c:923
 msgid "EXEC (Executable file)"
 msgstr ""
 
-#: src/readelf.c:735
+#: src/readelf.c:924
 msgid "DYN (Shared object file)"
 msgstr ""
 
-#: src/readelf.c:736
+#: src/readelf.c:925
 msgid "CORE (Core file)"
 msgstr ""
 
-#: src/readelf.c:741
+#: src/readelf.c:930
 #, c-format
 msgid "OS Specific: (%x)\n"
 msgstr ""
 
-#: src/readelf.c:743
+#: src/readelf.c:932
 #, c-format
 msgid "Processor Specific: (%x)\n"
 msgstr ""
 
-#: src/readelf.c:753
+#: src/readelf.c:942
 msgid ""
 "ELF Header:\n"
 "  Magic:  "
 msgstr ""
 
-#: src/readelf.c:757
+#: src/readelf.c:946
 #, c-format
 msgid ""
 "\n"
 "  Class:                             %s\n"
 msgstr ""
 
-#: src/readelf.c:762
+#: src/readelf.c:951
 #, c-format
 msgid "  Data:                              %s\n"
 msgstr ""
 
-#: src/readelf.c:768
+#: src/readelf.c:957
 #, c-format
 msgid "  Ident Version:                     %hhd %s\n"
 msgstr ""
 
-#: src/readelf.c:770 src/readelf.c:787
+#: src/readelf.c:959 src/readelf.c:976
 msgid "(current)"
 msgstr ""
 
-#: src/readelf.c:774
+#: src/readelf.c:963
 #, c-format
 msgid "  OS/ABI:                            %s\n"
 msgstr ""
 
-#: src/readelf.c:777
+#: src/readelf.c:966
 #, c-format
 msgid "  ABI Version:                       %hhd\n"
 msgstr ""
 
-#: src/readelf.c:780
+#: src/readelf.c:969
 msgid "  Type:                              "
 msgstr ""
 
-#: src/readelf.c:783
+#: src/readelf.c:972
 #, c-format
 msgid "  Machine:                           %s\n"
 msgstr ""
 
-#: src/readelf.c:785
+#: src/readelf.c:974
 #, c-format
 msgid "  Version:                           %d %s\n"
 msgstr ""
 
-#: src/readelf.c:789
+#: src/readelf.c:978
 #, c-format
 msgid "  Entry point address:               %#<PRIx64>\n"
 msgstr ""
 
-#: src/readelf.c:792
+#: src/readelf.c:981
 #, c-format
 msgid "  Start of program headers:          %<PRId64> %s\n"
 msgstr ""
 
-#: src/readelf.c:793 src/readelf.c:796
+#: src/readelf.c:982 src/readelf.c:985
 msgid "(bytes into file)"
 msgstr ""
 
-#: src/readelf.c:795
+#: src/readelf.c:984
 #, c-format
 msgid "  Start of section headers:          %<PRId64> %s\n"
 msgstr ""
 
-#: src/readelf.c:798
+#: src/readelf.c:987
 #, c-format
 msgid "  Flags:                             %s\n"
 msgstr ""
 
-#: src/readelf.c:801
+#: src/readelf.c:990
 #, c-format
 msgid "  Size of this header:               %<PRId16> %s\n"
 msgstr ""
 
-#: src/readelf.c:802 src/readelf.c:805 src/readelf.c:822
+#: src/readelf.c:991 src/readelf.c:994 src/readelf.c:1011
 msgid "(bytes)"
 msgstr ""
 
-#: src/readelf.c:804
+#: src/readelf.c:993
 #, c-format
 msgid "  Size of program header entries:    %<PRId16> %s\n"
 msgstr ""
 
-#: src/readelf.c:807
+#: src/readelf.c:996
 #, c-format
 msgid "  Number of program headers entries: %<PRId16>"
 msgstr ""
 
-#: src/readelf.c:814
+#: src/readelf.c:1003
 #, c-format
 msgid " (%<PRIu32> in [0].sh_info)"
 msgstr ""
 
-#: src/readelf.c:817 src/readelf.c:834 src/readelf.c:848
+#: src/readelf.c:1006 src/readelf.c:1023 src/readelf.c:1037
 msgid " ([0] not available)"
 msgstr ""
 
-#: src/readelf.c:821
+#: src/readelf.c:1010
 #, c-format
 msgid "  Size of section header entries:    %<PRId16> %s\n"
 msgstr ""
 
-#: src/readelf.c:824
+#: src/readelf.c:1013
 #, c-format
 msgid "  Number of section headers entries: %<PRId16>"
 msgstr ""
 
-#: src/readelf.c:831
+#: src/readelf.c:1020
 #, c-format
 msgid " (%<PRIu32> in [0].sh_size)"
 msgstr ""
 
-#: src/readelf.c:844
+#: src/readelf.c:1033
 #, c-format
 msgid " (%<PRIu32> in [0].sh_link)"
 msgstr ""
 
-#: src/readelf.c:852
+#: src/readelf.c:1041
 #, c-format
 msgid ""
 "  Section header string table index: XINDEX%s\n"
 "\n"
 msgstr ""
 
-#: src/readelf.c:856
+#: src/readelf.c:1045
 #, c-format
 msgid ""
 "  Section header string table index: %<PRId16>\n"
 "\n"
 msgstr ""
 
-#: src/readelf.c:888
+#: src/readelf.c:1077
 #, c-format
 msgid ""
 "There are %d section headers, starting at offset %#<PRIx64>:\n"
 "\n"
 msgstr ""
 
-#: src/readelf.c:898
+#: src/readelf.c:1087
 msgid "Section Headers:"
 msgstr ""
 
-#: src/readelf.c:901
+#: src/readelf.c:1090
 msgid ""
 "[Nr] Name                 Type         Addr     Off    Size   ES Flags Lk "
 "Inf Al"
 msgstr ""
 
-#: src/readelf.c:903
+#: src/readelf.c:1092
 msgid ""
 "[Nr] Name                 Type         Addr             Off      Size     ES "
 "Flags Lk Inf Al"
 msgstr ""
 
-#: src/readelf.c:910 src/readelf.c:1063
-#, c-format
-msgid "cannot get section: %s"
-msgstr ""
-
-#: src/readelf.c:917 src/readelf.c:1071 src/readelf.c:8343 src/unstrip.c:345
-#: src/unstrip.c:376 src/unstrip.c:425 src/unstrip.c:533 src/unstrip.c:550
-#: src/unstrip.c:586 src/unstrip.c:784 src/unstrip.c:1052 src/unstrip.c:1242
-#: src/unstrip.c:1302 src/unstrip.c:1423 src/unstrip.c:1476 src/unstrip.c:1583
-#: src/unstrip.c:1772
-#, c-format
-msgid "cannot get section header: %s"
-msgstr ""
-
-#: src/readelf.c:975
+#: src/readelf.c:1164
 msgid "Program Headers:"
 msgstr ""
 
-#: src/readelf.c:977
+#: src/readelf.c:1166
 msgid ""
 "  Type           Offset   VirtAddr   PhysAddr   FileSiz  MemSiz   Flg Align"
 msgstr ""
 
-#: src/readelf.c:980
+#: src/readelf.c:1169
 msgid ""
 "  Type           Offset   VirtAddr           PhysAddr           FileSiz  "
 "MemSiz   Flg Align"
 msgstr ""
 
-#: src/readelf.c:1020
+#: src/readelf.c:1226
 #, c-format
 msgid "\t[Requesting program interpreter: %s]\n"
 msgstr ""
 
-#: src/readelf.c:1041
+#: src/readelf.c:1247
 msgid ""
 "\n"
 " Section to Segment mapping:\n"
 "  Segment Sections..."
 msgstr ""
 
-#: src/readelf.c:1052 src/unstrip.c:1827 src/unstrip.c:1866 src/unstrip.c:1873
+#: src/readelf.c:1258 src/unstrip.c:1835 src/unstrip.c:1874 src/unstrip.c:1881
 #, c-format
 msgid "cannot get program header: %s"
 msgstr ""
 
-#: src/readelf.c:1193
+#: src/readelf.c:1401
 #, c-format
 msgid ""
 "\n"
@@ -4214,7 +4326,7 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:1198
+#: src/readelf.c:1406
 #, c-format
 msgid ""
 "\n"
@@ -4225,15 +4337,21 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:1206
+#: src/readelf.c:1414
 msgid "<INVALID SYMBOL>"
 msgstr ""
 
-#: src/readelf.c:1220
+#: src/readelf.c:1428
 msgid "<INVALID SECTION>"
 msgstr ""
 
-#: src/readelf.c:1371
+#: src/readelf.c:1585 src/readelf.c:2202 src/readelf.c:2460 src/readelf.c:2530
+#: src/readelf.c:2812 src/readelf.c:2885 src/readelf.c:4488
+#, c-format
+msgid "invalid sh_link value in section %Zu"
+msgstr ""
+
+#: src/readelf.c:1588
 #, c-format
 msgid ""
 "\n"
@@ -4246,43 +4364,43 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:1383
+#: src/readelf.c:1598
 msgid "  Type              Value\n"
 msgstr ""
 
-#: src/readelf.c:1407
+#: src/readelf.c:1622
 #, c-format
 msgid "Shared library: [%s]\n"
 msgstr ""
 
-#: src/readelf.c:1412
+#: src/readelf.c:1627
 #, c-format
 msgid "Library soname: [%s]\n"
 msgstr ""
 
-#: src/readelf.c:1417
+#: src/readelf.c:1632
 #, c-format
 msgid "Library rpath: [%s]\n"
 msgstr ""
 
-#: src/readelf.c:1422
+#: src/readelf.c:1637
 #, c-format
 msgid "Library runpath: [%s]\n"
 msgstr ""
 
-#: src/readelf.c:1442
+#: src/readelf.c:1657
 #, c-format
 msgid "%<PRId64> (bytes)\n"
 msgstr ""
 
-#: src/readelf.c:1554 src/readelf.c:1740
+#: src/readelf.c:1770 src/readelf.c:1957
 #, c-format
 msgid ""
 "\n"
 "Invalid symbol table at offset %#0<PRIx64>\n"
 msgstr ""
 
-#: src/readelf.c:1572 src/readelf.c:1757
+#: src/readelf.c:1788 src/readelf.c:1975
 #, c-format
 msgid ""
 "\n"
@@ -4295,7 +4413,7 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:1587
+#: src/readelf.c:1803 src/readelf.c:1990
 #, c-format
 msgid ""
 "\n"
@@ -4306,29 +4424,29 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:1597
+#: src/readelf.c:1813
 msgid "  Offset      Type                 Value       Name\n"
 msgstr ""
 
-#: src/readelf.c:1599
+#: src/readelf.c:1815
 msgid "  Offset              Type                 Value               Name\n"
 msgstr ""
 
-#: src/readelf.c:1652 src/readelf.c:1663 src/readelf.c:1676 src/readelf.c:1694
-#: src/readelf.c:1706 src/readelf.c:1825 src/readelf.c:1837 src/readelf.c:1851
-#: src/readelf.c:1870 src/readelf.c:1883
+#: src/readelf.c:1868 src/readelf.c:1879 src/readelf.c:1892 src/readelf.c:1910
+#: src/readelf.c:1922 src/readelf.c:2056 src/readelf.c:2068 src/readelf.c:2082
+#: src/readelf.c:2101 src/readelf.c:2114
 msgid "<INVALID RELOC>"
 msgstr ""
 
-#: src/readelf.c:1769
+#: src/readelf.c:2000
 msgid "  Offset      Type            Value       Addend Name\n"
 msgstr ""
 
-#: src/readelf.c:1771
+#: src/readelf.c:2002
 msgid "  Offset              Type            Value               Addend Name\n"
 msgstr ""
 
-#: src/readelf.c:1972
+#: src/readelf.c:2210
 #, c-format
 msgid ""
 "\n"
@@ -4339,40 +4457,40 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:1978
+#: src/readelf.c:2215
 #, 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:1988
+#: src/readelf.c:2223
 msgid "  Num:    Value   Size Type    Bind   Vis          Ndx Name\n"
 msgstr ""
 
-#: src/readelf.c:1990
+#: src/readelf.c:2225
 msgid "  Num:            Value   Size Type    Bind   Vis          Ndx Name\n"
 msgstr ""
 
-#: src/readelf.c:2010
+#: src/readelf.c:2245
 #, c-format
 msgid "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
 msgstr ""
 
-#: src/readelf.c:2098
+#: src/readelf.c:2333
 #, c-format
 msgid "bad dynamic symbol"
 msgstr ""
 
-#: src/readelf.c:2180
+#: src/readelf.c:2415
 msgid "none"
 msgstr ""
 
-#: src/readelf.c:2197
+#: src/readelf.c:2432
 msgid "| <unknown>"
 msgstr ""
 
-#: src/readelf.c:2222
+#: src/readelf.c:2463
 #, c-format
 msgid ""
 "\n"
@@ -4385,17 +4503,17 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:2245
+#: src/readelf.c:2484
 #, c-format
 msgid "  %#06x: Version: %hu  File: %s  Cnt: %hu\n"
 msgstr ""
 
-#: src/readelf.c:2258
+#: src/readelf.c:2497
 #, c-format
 msgid "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 msgstr ""
 
-#: src/readelf.c:2289
+#: src/readelf.c:2534
 #, c-format
 msgid ""
 "\n"
@@ -4408,17 +4526,17 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:2319
+#: src/readelf.c:2562
 #, c-format
 msgid "  %#06x: Version: %hd  Flags: %s  Index: %hd  Cnt: %hd  Name: %s\n"
 msgstr ""
 
-#: src/readelf.c:2334
+#: src/readelf.c:2577
 #, c-format
 msgid "  %#06x: Parent %d: %s\n"
 msgstr ""
 
-#: src/readelf.c:2566
+#: src/readelf.c:2816
 #, c-format
 msgid ""
 "\n"
@@ -4431,15 +4549,15 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:2596
+#: src/readelf.c:2844
 msgid "   0 *local*                     "
 msgstr ""
 
-#: src/readelf.c:2601
+#: src/readelf.c:2849
 msgid "   1 *global*                    "
 msgstr ""
 
-#: src/readelf.c:2632
+#: src/readelf.c:2890
 #, c-format
 msgid ""
 "\n"
@@ -4454,41 +4572,41 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:2656
+#: src/readelf.c:2912
 #, no-c-format
 msgid " Length  Number  % of total  Coverage\n"
 msgstr ""
 
-#: src/readelf.c:2658
+#: src/readelf.c:2914
 #, c-format
 msgid "      0  %6<PRIu32>      %5.1f%%\n"
 msgstr ""
 
-#: src/readelf.c:2665
+#: src/readelf.c:2921
 #, c-format
 msgid "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 msgstr ""
 
-#: src/readelf.c:2678
+#: src/readelf.c:2934
 #, c-format
 msgid ""
 " Average number of tests:   successful lookup: %f\n"
 "\t\t\t  unsuccessful lookup: %f\n"
 msgstr ""
 
-#: src/readelf.c:2696 src/readelf.c:2738 src/readelf.c:2779
+#: src/readelf.c:2952 src/readelf.c:2994 src/readelf.c:3035
 #, c-format
 msgid "cannot get data for section %d: %s"
 msgstr ""
 
-#: src/readelf.c:2833
+#: src/readelf.c:3089
 #, c-format
 msgid ""
 " Symbol Bias: %u\n"
 " Bitmask Size: %zu bytes  %<PRIuFAST32>%% bits set  2nd hash shift: %u\n"
 msgstr ""
 
-#: src/readelf.c:2907
+#: src/readelf.c:3164
 #, c-format
 msgid ""
 "\n"
@@ -4499,13 +4617,13 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:2921
+#: src/readelf.c:3178
 msgid ""
 "       Library                       Time Stamp          Checksum Version "
 "Flags"
 msgstr ""
 
-#: src/readelf.c:2971
+#: src/readelf.c:3228
 #, c-format
 msgid ""
 "\n"
@@ -4513,135 +4631,140 @@ msgid ""
 "%#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:2987
+#: src/readelf.c:3244
 msgid "  Owner          Size\n"
 msgstr ""
 
-#: src/readelf.c:3013
+#: src/readelf.c:3270
 #, c-format
 msgid "  %-13s  %4<PRIu32>\n"
 msgstr ""
 
-#: src/readelf.c:3045
+#: src/readelf.c:3302
 #, c-format
 msgid "    %-4u %12<PRIu32>\n"
 msgstr ""
 
-#: src/readelf.c:3050
+#: src/readelf.c:3307
 #, c-format
 msgid "    File: %11<PRIu32>\n"
 msgstr ""
 
-#: src/readelf.c:3085
+#: src/readelf.c:3342
 #, c-format
 msgid "      %s: %<PRId64>, %s\n"
 msgstr ""
 
-#: src/readelf.c:3088
+#: src/readelf.c:3345
 #, c-format
 msgid "      %s: %<PRId64>\n"
 msgstr ""
 
-#: src/readelf.c:3091
+#: src/readelf.c:3348
 #, c-format
 msgid "      %s: %s\n"
 msgstr ""
 
-#: src/readelf.c:3098
+#: src/readelf.c:3355
 #, c-format
 msgid "      %u: %<PRId64>\n"
 msgstr ""
 
-#: src/readelf.c:3101
+#: src/readelf.c:3358
 #, c-format
 msgid "      %u: %s\n"
 msgstr ""
 
-#: src/readelf.c:3137
+#: src/readelf.c:3403
 #, c-format
 msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 msgstr ""
 
-#: src/readelf.c:3140
+#: src/readelf.c:3406
 #, c-format
 msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
 msgstr ""
 
-#: src/readelf.c:3145
+#: src/readelf.c:3411
 #, c-format
 msgid "%#<PRIx64> <%s+%#<PRIx64>>"
 msgstr ""
 
-#: src/readelf.c:3148
+#: src/readelf.c:3414
 #, c-format
 msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
 msgstr ""
 
-#: src/readelf.c:3154
+#: src/readelf.c:3420
 #, c-format
 msgid "%s+%#<PRIx64> <%s>"
 msgstr ""
 
-#: src/readelf.c:3157
+#: src/readelf.c:3423
 #, c-format
 msgid "%s+%#0*<PRIx64> <%s>"
 msgstr ""
 
-#: src/readelf.c:3161
+#: src/readelf.c:3427
 #, c-format
 msgid "%#<PRIx64> <%s>"
 msgstr ""
 
-#: src/readelf.c:3164
+#: src/readelf.c:3430
 #, c-format
 msgid "%#0*<PRIx64> <%s>"
 msgstr ""
 
-#: src/readelf.c:3169
+#: src/readelf.c:3435
 #, c-format
 msgid "%s+%#<PRIx64>"
 msgstr ""
 
-#: src/readelf.c:3172
+#: src/readelf.c:3438
 #, c-format
 msgid "%s+%#0*<PRIx64>"
 msgstr ""
 
-#: src/readelf.c:3554
+#: src/readelf.c:3820
 msgid "empty block"
 msgstr ""
 
-#: src/readelf.c:3557
+#: src/readelf.c:3823
 #, c-format
 msgid "%zu byte block:"
 msgstr ""
 
-#: src/readelf.c:3934
+#: src/readelf.c:4217
 #, c-format
 msgid "%*s[%4<PRIuMAX>] %s  <TRUNCATED>\n"
 msgstr ""
 
-#: src/readelf.c:3970
+#: src/readelf.c:4274
 #, c-format
 msgid "%s %#<PRIx64> used with different address sizes"
 msgstr ""
 
-#: src/readelf.c:3977
+#: src/readelf.c:4281
 #, c-format
 msgid "%s %#<PRIx64> used with different offset sizes"
 msgstr ""
 
-#: src/readelf.c:4057
+#: src/readelf.c:4288
+#, c-format
+msgid "%s %#<PRIx64> used with different base addresses"
+msgstr ""
+
+#: src/readelf.c:4370
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE IN REST OF SECTION>\n"
 msgstr ""
 
-#: src/readelf.c:4065
+#: src/readelf.c:4378
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
 msgstr ""
 
-#: src/readelf.c:4087
+#: src/readelf.c:4404
 #, c-format
 msgid ""
 "\n"
@@ -4649,37 +4772,37 @@ msgid ""
 " [ Code]\n"
 msgstr ""
 
-#: src/readelf.c:4095
+#: src/readelf.c:4412
 #, c-format
 msgid ""
 "\n"
 "Abbreviation section at offset %<PRIu64>:\n"
 msgstr ""
 
-#: src/readelf.c:4108
+#: src/readelf.c:4425
 #, c-format
 msgid " *** error while reading abbreviation: %s\n"
 msgstr ""
 
-#: src/readelf.c:4124
+#: src/readelf.c:4441
 #, c-format
 msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
 msgstr ""
 
-#: src/readelf.c:4127
+#: src/readelf.c:4444
 msgid "yes"
 msgstr ""
 
-#: src/readelf.c:4127
+#: src/readelf.c:4444
 msgid "no"
 msgstr ""
 
-#: src/readelf.c:4162
+#: src/readelf.c:4478 src/readelf.c:4551
 #, c-format
 msgid "cannot get .debug_aranges content: %s"
 msgstr ""
 
-#: src/readelf.c:4167
+#: src/readelf.c:4493
 #, c-format
 msgid ""
 "\n"
@@ -4690,123 +4813,189 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:4198
+#: src/readelf.c:4524
 #, c-format
 msgid " [%*zu] ???\n"
 msgstr ""
 
-#: src/readelf.c:4200
+#: src/readelf.c:4526
 #, c-format
 msgid ""
 " [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
 msgstr ""
 
-#: src/readelf.c:4219
+#: src/readelf.c:4556 src/readelf.c:4710 src/readelf.c:5231 src/readelf.c:6145
+#: src/readelf.c:6646 src/readelf.c:6766 src/readelf.c:6922 src/readelf.c:7345
 #, c-format
-msgid "cannot get .debug_ranges content: %s"
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:4224 src/readelf.c:4728 src/readelf.c:5505 src/readelf.c:6006
-#: src/readelf.c:6121 src/readelf.c:6277 src/readelf.c:6699
+#: src/readelf.c:4569 src/readelf.c:6171
 #, c-format
 msgid ""
 "\n"
-"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+"Table at offset %Zu:\n"
 msgstr ""
 
-#: src/readelf.c:4248 src/readelf.c:6031
+#: src/readelf.c:4573 src/readelf.c:5255 src/readelf.c:6180
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr ""
+
+#: src/readelf.c:4589
+#, c-format
+msgid ""
+"\n"
+" Length:        %6<PRIu64>\n"
+msgstr ""
+
+#: src/readelf.c:4601
+#, c-format
+msgid " DWARF version: %6<PRIuFAST16>\n"
+msgstr ""
+
+#: src/readelf.c:4605
+#, c-format
+msgid "unsupported aranges version"
+msgstr ""
+
+#: src/readelf.c:4616
+#, c-format
+msgid " CU offset:     %6<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:4622
+#, c-format
+msgid " Address size:  %6<PRIu64>\n"
+msgstr ""
+
+#: src/readelf.c:4626
+#, c-format
+msgid "unsupported address size"
+msgstr ""
+
+#: src/readelf.c:4631
+#, c-format
+msgid ""
+" Segment size:  %6<PRIu64>\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:4635
+#, c-format
+msgid "unsupported segment size"
+msgstr ""
+
+#: src/readelf.c:4675
+#, c-format
+msgid "   %s..%s (%<PRIx64>)\n"
+msgstr ""
+
+#: src/readelf.c:4678
+#, c-format
+msgid "   %s..%s\n"
+msgstr ""
+
+#: src/readelf.c:4687
+#, c-format
+msgid "   %Zu padding bytes\n"
+msgstr ""
+
+#: src/readelf.c:4705
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr ""
+
+#: src/readelf.c:4735 src/readelf.c:6673
 #, c-format
 msgid " [%6tx]  <INVALID DATA>\n"
 msgstr ""
 
-#: src/readelf.c:4270 src/readelf.c:6053
+#: src/readelf.c:4757 src/readelf.c:6695
 #, c-format
 msgid " [%6tx]  base address %s\n"
 msgstr ""
 
-#: src/readelf.c:4276 src/readelf.c:6059
+#: src/readelf.c:4764 src/readelf.c:6702
 #, c-format
 msgid " [%6tx]  empty list\n"
 msgstr ""
 
-#: src/readelf.c:4285
+#: src/readelf.c:4775
 #, c-format
 msgid " [%6tx]  %s..%s\n"
 msgstr ""
 
-#: src/readelf.c:4287
+#: src/readelf.c:4777
 #, c-format
 msgid "           %s..%s\n"
 msgstr ""
 
-#: src/readelf.c:4717 src/readelf.c:6768 src/readelf.c:6870 src/readelf.c:7028
+#: src/readelf.c:5210
 #, c-format
-msgid "cannot get %s content: %s"
+msgid "cannot get ELF: %s"
 msgstr ""
 
-#: src/readelf.c:4724
+#: src/readelf.c:5227
 #, c-format
 msgid ""
 "\n"
 "Call frame information section [%2zu] '%s' at offset %#<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:4752 src/readelf.c:5540
-#, c-format
-msgid "invalid data in section [%zu] '%s'"
-msgstr ""
-
-#: src/readelf.c:4774
+#: src/readelf.c:5277
 #, c-format
 msgid ""
 "\n"
 " [%6tx] Zero terminator\n"
 msgstr ""
 
-#: src/readelf.c:4859
+#: src/readelf.c:5362
 #, c-format
 msgid "invalid augmentation length"
 msgstr ""
 
-#: src/readelf.c:4871
+#: src/readelf.c:5374
 msgid "FDE address encoding: "
 msgstr ""
 
-#: src/readelf.c:4877
+#: src/readelf.c:5380
 msgid "LSDA pointer encoding: "
 msgstr ""
 
-#: src/readelf.c:4975
+#: src/readelf.c:5491
 #, c-format
 msgid " (offset: %#<PRIx64>)"
 msgstr ""
 
-#: src/readelf.c:4982
+#: src/readelf.c:5498
 #, c-format
 msgid " (end offset: %#<PRIx64>)"
 msgstr ""
 
-#: src/readelf.c:5009
+#: src/readelf.c:5525
 #, c-format
 msgid "   %-26sLSDA pointer: %#<PRIx64>\n"
 msgstr ""
 
-#: src/readelf.c:5060
+#: src/readelf.c:5577
 #, c-format
 msgid "cannot get attribute code: %s"
 msgstr ""
 
-#: src/readelf.c:5069
+#: src/readelf.c:5586
 #, c-format
 msgid "cannot get attribute form: %s"
 msgstr ""
 
-#: src/readelf.c:5084
+#: src/readelf.c:5601
 #, c-format
 msgid "cannot get attribute value: %s"
 msgstr ""
 
-#: src/readelf.c:5342
+#: src/readelf.c:5894
 #, c-format
 msgid ""
 "\n"
@@ -4814,7 +5003,7 @@ msgid ""
 " [Offset]\n"
 msgstr ""
 
-#: src/readelf.c:5374
+#: src/readelf.c:5926
 #, c-format
 msgid ""
 " Type unit at offset %<PRIu64>:\n"
@@ -4823,7 +5012,7 @@ msgid ""
 " Type signature: %#<PRIx64>, Type offset: %#<PRIx64>\n"
 msgstr ""
 
-#: src/readelf.c:5383
+#: src/readelf.c:5935
 #, c-format
 msgid ""
 " Compilation unit at offset %<PRIu64>:\n"
@@ -4831,44 +5020,45 @@ msgid ""
 "%<PRIu8>, Offset size: %<PRIu8>\n"
 msgstr ""
 
-#: src/readelf.c:5409
+#: src/readelf.c:5960
 #, c-format
 msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
 msgstr ""
 
-#: src/readelf.c:5421
+#: src/readelf.c:5974
 #, c-format
 msgid "cannot get DIE offset: %s"
 msgstr ""
 
-#: src/readelf.c:5430
+#: src/readelf.c:5983
 #, c-format
 msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
 msgstr ""
 
-#: src/readelf.c:5461
+#: src/readelf.c:6015
 #, c-format
 msgid "cannot get next DIE: %s\n"
 msgstr ""
 
-#: src/readelf.c:5469
+#: src/readelf.c:6023
 #, c-format
 msgid "cannot get next DIE: %s"
 msgstr ""
 
-#: src/readelf.c:5518
+#: src/readelf.c:6059
 #, c-format
-msgid "cannot get line data section data: %s"
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+"\n"
 msgstr ""
 
-#: src/readelf.c:5531
+#: src/readelf.c:6158
 #, c-format
-msgid ""
-"\n"
-"Table at offset %Zu:\n"
+msgid "cannot get line data section data: %s"
 msgstr ""
 
-#: src/readelf.c:5586
+#: src/readelf.c:6226
 #, c-format
 msgid ""
 "\n"
@@ -4885,238 +5075,238 @@ msgid ""
 "Opcodes:\n"
 msgstr ""
 
-#: src/readelf.c:5607
+#: src/readelf.c:6247
 #, c-format
 msgid "invalid data at offset %tu in section [%zu] '%s'"
 msgstr ""
 
-#: src/readelf.c:5622
+#: src/readelf.c:6262
 #, c-format
 msgid "  [%*<PRIuFAST8>]  %hhu argument\n"
 msgid_plural "  [%*<PRIuFAST8>]  %hhu arguments\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:5630
+#: src/readelf.c:6270
 msgid ""
 "\n"
 "Directory table:"
 msgstr ""
 
-#: src/readelf.c:5646
+#: src/readelf.c:6286
 msgid ""
 "\n"
 "File name table:\n"
 " Entry Dir   Time      Size      Name"
 msgstr ""
 
-#: src/readelf.c:5675
+#: src/readelf.c:6315
 msgid ""
 "\n"
 "Line number statements:"
 msgstr ""
 
-#: src/readelf.c:5751
+#: src/readelf.c:6391
 #, c-format
 msgid " special opcode %u: address+%u = %s, op_index = %u, line%+d = %zu\n"
 msgstr ""
 
-#: src/readelf.c:5756
+#: src/readelf.c:6396
 #, c-format
 msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
 msgstr ""
 
-#: src/readelf.c:5776
+#: src/readelf.c:6416
 #, c-format
 msgid " extended opcode %u: "
 msgstr ""
 
-#: src/readelf.c:5781
+#: src/readelf.c:6421
 msgid " end of sequence"
 msgstr ""
 
-#: src/readelf.c:5798
+#: src/readelf.c:6438
 #, c-format
 msgid " set address to %s\n"
 msgstr ""
 
-#: src/readelf.c:5819
+#: src/readelf.c:6459
 #, c-format
 msgid " define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
 msgstr ""
 
-#: src/readelf.c:5832
+#: src/readelf.c:6472
 #, c-format
 msgid " set discriminator to %u\n"
 msgstr ""
 
-#: src/readelf.c:5837
+#: src/readelf.c:6477
 msgid " unknown opcode"
 msgstr ""
 
-#: src/readelf.c:5849
+#: src/readelf.c:6489
 msgid " copy"
 msgstr ""
 
-#: src/readelf.c:5860
+#: src/readelf.c:6500
 #, c-format
 msgid " advance address by %u to %s, op_index to %u\n"
 msgstr ""
 
-#: src/readelf.c:5864
+#: src/readelf.c:6504
 #, c-format
 msgid " advance address by %u to %s\n"
 msgstr ""
 
-#: src/readelf.c:5875
+#: src/readelf.c:6515
 #, c-format
 msgid " advance line by constant %d to %<PRId64>\n"
 msgstr ""
 
-#: src/readelf.c:5883
+#: src/readelf.c:6523
 #, c-format
 msgid " set file to %<PRIu64>\n"
 msgstr ""
 
-#: src/readelf.c:5893
+#: src/readelf.c:6533
 #, c-format
 msgid " set column to %<PRIu64>\n"
 msgstr ""
 
-#: src/readelf.c:5900
+#: src/readelf.c:6540
 #, c-format
 msgid " set '%s' to %<PRIuFAST8>\n"
 msgstr ""
 
-#: src/readelf.c:5906
+#: src/readelf.c:6546
 msgid " set basic block flag"
 msgstr ""
 
-#: src/readelf.c:5915
+#: src/readelf.c:6555
 #, c-format
 msgid " advance address by constant %u to %s, op_index to %u\n"
 msgstr ""
 
-#: src/readelf.c:5919
+#: src/readelf.c:6559
 #, c-format
 msgid " advance address by constant %u to %s\n"
 msgstr ""
 
-#: src/readelf.c:5937
+#: src/readelf.c:6577
 #, c-format
 msgid " advance address by fixed value %u to %s\n"
 msgstr ""
 
-#: src/readelf.c:5946
+#: src/readelf.c:6586
 msgid " set prologue end flag"
 msgstr ""
 
-#: src/readelf.c:5951
+#: src/readelf.c:6591
 msgid " set epilogue begin flag"
 msgstr ""
 
-#: src/readelf.c:5960
+#: src/readelf.c:6600
 #, c-format
 msgid " set isa to %u\n"
 msgstr ""
 
-#: src/readelf.c:5969
+#: src/readelf.c:6609
 #, c-format
 msgid " unknown opcode with %<PRIu8> parameter:"
 msgid_plural " unknown opcode with %<PRIu8> parameters:"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:6001
+#: src/readelf.c:6641
 #, c-format
 msgid "cannot get .debug_loc content: %s"
 msgstr ""
 
-#: src/readelf.c:6071
+#: src/readelf.c:6716
 #, c-format
 msgid " [%6tx]  %s..%s"
 msgstr ""
 
-#: src/readelf.c:6073
+#: src/readelf.c:6718
 #, c-format
 msgid "           %s..%s"
 msgstr ""
 
-#: src/readelf.c:6080
+#: src/readelf.c:6725
 msgid "   <INVALID DATA>\n"
 msgstr ""
 
-#: src/readelf.c:6132 src/readelf.c:6286
+#: src/readelf.c:6777 src/readelf.c:6931
 #, c-format
 msgid "cannot get macro information section data: %s"
 msgstr ""
 
-#: src/readelf.c:6211
+#: src/readelf.c:6856
 #, c-format
 msgid "%*s*** non-terminated string at end of section"
 msgstr ""
 
-#: src/readelf.c:6327
+#: src/readelf.c:6972
 #, c-format
 msgid " Offset:             0x%<PRIx64>\n"
 msgstr ""
 
-#: src/readelf.c:6339
+#: src/readelf.c:6984
 #, c-format
 msgid " Version:            %<PRIu16>\n"
 msgstr ""
 
-#: src/readelf.c:6345 src/readelf.c:7055
+#: src/readelf.c:6990 src/readelf.c:7703
 #, c-format
 msgid "  unknown version, cannot parse section\n"
 msgstr ""
 
-#: src/readelf.c:6352
+#: src/readelf.c:6997
 #, c-format
 msgid " Flag:               0x%<PRIx8>\n"
 msgstr ""
 
-#: src/readelf.c:6355
+#: src/readelf.c:7000
 #, c-format
 msgid " Offset length:      %<PRIu8>\n"
 msgstr ""
 
-#: src/readelf.c:6363
+#: src/readelf.c:7008
 #, c-format
 msgid " .debug_line offset: 0x%<PRIx64>\n"
 msgstr ""
 
-#: src/readelf.c:6375
+#: src/readelf.c:7021
 #, c-format
 msgid "  extension opcode table, %<PRIu8> items:\n"
 msgstr ""
 
-#: src/readelf.c:6382
+#: src/readelf.c:7028
 #, c-format
 msgid "    [%<PRIx8>]"
 msgstr ""
 
-#: src/readelf.c:6394
+#: src/readelf.c:7040
 #, c-format
 msgid " %<PRIu8> arguments:"
 msgstr ""
 
-#: src/readelf.c:6422
+#: src/readelf.c:7068
 #, c-format
 msgid " no arguments."
 msgstr ""
 
-#: src/readelf.c:6657
+#: src/readelf.c:7303
 #, c-format
 msgid "vendor opcode not verified?"
 msgstr ""
 
-#: src/readelf.c:6685
+#: src/readelf.c:7331
 #, c-format
 msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
 msgstr ""
 
-#: src/readelf.c:6726
+#: src/readelf.c:7372
 #, c-format
 msgid ""
 "\n"
@@ -5124,47 +5314,47 @@ msgid ""
 " %*s  String\n"
 msgstr ""
 
-#: src/readelf.c:6740
+#: src/readelf.c:7386
 #, c-format
 msgid " *** error while reading strings: %s\n"
 msgstr ""
 
-#: src/readelf.c:6760
+#: src/readelf.c:7406
 #, c-format
 msgid ""
 "\n"
 "Call frame search table section [%2zu] '.eh_frame_hdr':\n"
 msgstr ""
 
-#: src/readelf.c:6862
+#: src/readelf.c:7508
 #, c-format
 msgid ""
 "\n"
 "Exception handling table section [%2zu] '.gcc_except_table':\n"
 msgstr ""
 
-#: src/readelf.c:6885
+#: src/readelf.c:7531
 #, c-format
 msgid " LPStart encoding:    %#x "
 msgstr ""
 
-#: src/readelf.c:6897
+#: src/readelf.c:7543
 #, c-format
 msgid " TType encoding:      %#x "
 msgstr ""
 
-#: src/readelf.c:6911
+#: src/readelf.c:7557
 #, c-format
 msgid " Call site encoding:  %#x "
 msgstr ""
 
-#: src/readelf.c:6924
+#: src/readelf.c:7570
 msgid ""
 "\n"
 " Call site table:"
 msgstr ""
 
-#: src/readelf.c:6938
+#: src/readelf.c:7584
 #, c-format
 msgid ""
 " [%4u] Call site start:   %#<PRIx64>\n"
@@ -5173,193 +5363,193 @@ msgid ""
 "        Action:            %u\n"
 msgstr ""
 
-#: src/readelf.c:6998
+#: src/readelf.c:7644
 #, c-format
 msgid "invalid TType encoding"
 msgstr ""
 
-#: src/readelf.c:7019
+#: src/readelf.c:7665
 #, c-format
 msgid ""
 "\n"
 "GDB section [%2zu] '%s' at offset %#<PRIx64> contains %<PRId64> bytes :\n"
 msgstr ""
 
-#: src/readelf.c:7048
+#: src/readelf.c:7694
 #, c-format
 msgid " Version:         %<PRId32>\n"
 msgstr ""
 
-#: src/readelf.c:7064
+#: src/readelf.c:7712
 #, c-format
 msgid " CU offset:       %#<PRIx32>\n"
 msgstr ""
 
-#: src/readelf.c:7071
+#: src/readelf.c:7719
 #, c-format
 msgid " TU offset:       %#<PRIx32>\n"
 msgstr ""
 
-#: src/readelf.c:7078
+#: src/readelf.c:7726
 #, c-format
 msgid " address offset:  %#<PRIx32>\n"
 msgstr ""
 
-#: src/readelf.c:7085
+#: src/readelf.c:7733
 #, c-format
 msgid " symbol offset:   %#<PRIx32>\n"
 msgstr ""
 
-#: src/readelf.c:7092
+#: src/readelf.c:7740
 #, c-format
 msgid " constant offset: %#<PRIx32>\n"
 msgstr ""
 
-#: src/readelf.c:7099
+#: src/readelf.c:7747
 #, c-format
 msgid ""
 "\n"
 " CU list at offset %#<PRIx32> contains %zu entries:\n"
 msgstr ""
 
-#: src/readelf.c:7121
+#: src/readelf.c:7769
 #, c-format
 msgid ""
 "\n"
 " TU list at offset %#<PRIx32> contains %zu entries:\n"
 msgstr ""
 
-#: src/readelf.c:7147
+#: src/readelf.c:7795
 #, c-format
 msgid ""
 "\n"
 " Address list at offset %#<PRIx32> contains %zu entries:\n"
 msgstr ""
 
-#: src/readelf.c:7174
+#: src/readelf.c:7824
 #, c-format
 msgid ""
 "\n"
 " Symbol table at offset %#<PRIx32> contains %zu slots:\n"
 msgstr ""
 
-#: src/readelf.c:7259
+#: src/readelf.c:7909
 #, c-format
 msgid "cannot get debug context descriptor: %s"
 msgstr ""
 
-#: src/readelf.c:7409 src/readelf.c:8010
+#: src/readelf.c:8069 src/readelf.c:8675 src/readelf.c:8786 src/readelf.c:8844
 #, c-format
 msgid "cannot convert core note data: %s"
 msgstr ""
 
-#: src/readelf.c:7750
+#: src/readelf.c:8416
 #, c-format
 msgid ""
 "\n"
 "%*s... <repeats %u more times> ..."
 msgstr ""
 
-#: src/readelf.c:8109
+#: src/readelf.c:8919
 msgid "  Owner          Data size  Type\n"
 msgstr ""
 
-#: src/readelf.c:8127
+#: src/readelf.c:8937
 #, c-format
 msgid "  %-13.*s  %9<PRId32>  %s\n"
 msgstr ""
 
-#: src/readelf.c:8161
+#: src/readelf.c:8987
 #, c-format
 msgid "cannot get content of note section: %s"
 msgstr ""
 
-#: src/readelf.c:8188
+#: src/readelf.c:9014
 #, c-format
 msgid ""
 "\n"
 "Note section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:8211
+#: src/readelf.c:9037
 #, c-format
 msgid ""
 "\n"
 "Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:8257
+#: src/readelf.c:9083
 #, c-format
 msgid ""
 "\n"
 "Section [%Zu] '%s' has no data to dump.\n"
 msgstr ""
 
-#: src/readelf.c:8263 src/readelf.c:8286
+#: src/readelf.c:9089 src/readelf.c:9112
 #, c-format
 msgid "cannot get data for section [%Zu] '%s': %s"
 msgstr ""
 
-#: src/readelf.c:8267
+#: src/readelf.c:9093
 #, c-format
 msgid ""
 "\n"
 "Hex dump of section [%Zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:8280
+#: src/readelf.c:9106
 #, c-format
 msgid ""
 "\n"
 "Section [%Zu] '%s' has no strings to dump.\n"
 msgstr ""
 
-#: src/readelf.c:8290
+#: src/readelf.c:9116
 #, c-format
 msgid ""
 "\n"
 "String section [%Zu] '%s' contains %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:8338
+#: src/readelf.c:9164
 #, c-format
 msgid ""
 "\n"
 "section [%lu] does not exist"
 msgstr ""
 
-#: src/readelf.c:8367
+#: src/readelf.c:9193
 #, c-format
 msgid ""
 "\n"
 "section '%s' does not exist"
 msgstr ""
 
-#: src/readelf.c:8424
+#: src/readelf.c:9250
 #, c-format
 msgid "cannot get symbol index of archive '%s': %s"
 msgstr ""
 
-#: src/readelf.c:8427
+#: src/readelf.c:9253
 #, c-format
 msgid ""
 "\n"
 "Archive '%s' has no symbol index\n"
 msgstr ""
 
-#: src/readelf.c:8431
+#: src/readelf.c:9257
 #, c-format
 msgid ""
 "\n"
 "Index of archive '%s' has %Zu entries:\n"
 msgstr ""
 
-#: src/readelf.c:8449
+#: src/readelf.c:9275
 #, c-format
 msgid "cannot extract member at offset %Zu in '%s': %s"
 msgstr ""
 
-#: src/readelf.c:8454
+#: src/readelf.c:9280
 #, c-format
 msgid "Archive member '%s' contains:\n"
 msgstr ""
@@ -5421,12 +5611,12 @@ msgstr ""
 msgid "%s: file format not recognized"
 msgstr ""
 
-#: src/size.c:438 src/size.c:581
+#: src/size.c:438 src/size.c:571
 #, c-format
 msgid " (ex %s)"
 msgstr ""
 
-#: src/size.c:606
+#: src/size.c:596
 msgid "(TOTALS)\n"
 msgstr ""
 
@@ -5464,27 +5654,27 @@ msgstr ""
 msgid "Print the strings of printable characters in files."
 msgstr ""
 
-#: src/strings.c:260 src/strings.c:295
+#: src/strings.c:267 src/strings.c:302
 #, c-format
 msgid "invalid value '%s' for %s parameter"
 msgstr ""
 
-#: src/strings.c:306
+#: src/strings.c:313
 #, c-format
 msgid "invalid minimum length of matched string size"
 msgstr ""
 
-#: src/strings.c:591
+#: src/strings.c:596
 #, c-format
 msgid "lseek64 failed"
 msgstr ""
 
-#: src/strings.c:608 src/strings.c:672
+#: src/strings.c:613 src/strings.c:677
 #, c-format
 msgid "re-mmap failed"
 msgstr ""
 
-#: src/strings.c:645
+#: src/strings.c:650
 #, c-format
 msgid "mprotect failed"
 msgstr ""
@@ -5552,7 +5742,7 @@ msgstr ""
 msgid "-F option specified twice"
 msgstr ""
 
-#: src/strip.c:249 src/unstrip.c:117
+#: src/strip.c:249 src/unstrip.c:121
 #, c-format
 msgid "-o option specified twice"
 msgstr ""
@@ -5577,87 +5767,87 @@ msgstr ""
 msgid "%s: cannot use -o or -f when stripping archive"
 msgstr ""
 
-#: src/strip.c:467
+#: src/strip.c:468
 #, c-format
 msgid "cannot open EBL backend"
 msgstr ""
 
-#: src/strip.c:517 src/strip.c:541
+#: src/strip.c:518 src/strip.c:542
 #, c-format
 msgid "cannot create new file '%s': %s"
 msgstr ""
 
-#: src/strip.c:601
+#: src/strip.c:608
 #, c-format
 msgid "illformed file '%s'"
 msgstr ""
 
-#: src/strip.c:905 src/strip.c:994
+#: src/strip.c:930 src/strip.c:1019
 #, c-format
 msgid "while generating output file: %s"
 msgstr ""
 
-#: src/strip.c:967 src/strip.c:1929
+#: src/strip.c:992 src/strip.c:1957
 #, c-format
 msgid "%s: error while creating ELF header: %s"
 msgstr ""
 
-#: src/strip.c:981
+#: src/strip.c:1006
 #, c-format
 msgid "while preparing output for '%s'"
 msgstr ""
 
-#: src/strip.c:1032 src/strip.c:1088
+#: src/strip.c:1057 src/strip.c:1114
 #, c-format
 msgid "while create section header section: %s"
 msgstr ""
 
-#: src/strip.c:1038
+#: src/strip.c:1063
 #, c-format
 msgid "cannot allocate section data: %s"
 msgstr ""
 
-#: src/strip.c:1097
+#: src/strip.c:1123
 #, c-format
 msgid "while create section header string table: %s"
 msgstr ""
 
-#: src/strip.c:1724
+#: src/strip.c:1752
 #, c-format
 msgid "bad relocation"
 msgstr ""
 
-#: src/strip.c:1841 src/strip.c:1951
+#: src/strip.c:1869 src/strip.c:1979
 #, c-format
 msgid "while writing '%s': %s"
 msgstr ""
 
-#: src/strip.c:1852
+#: src/strip.c:1880
 #, c-format
 msgid "while creating '%s'"
 msgstr ""
 
-#: src/strip.c:1874
+#: src/strip.c:1902
 #, c-format
 msgid "while computing checksum for debug information"
 msgstr ""
 
-#: src/strip.c:1937
+#: src/strip.c:1965
 #, c-format
 msgid "%s: error while reading the file: %s"
 msgstr ""
 
-#: src/strip.c:1976 src/strip.c:1996
+#: src/strip.c:2004 src/strip.c:2024
 #, c-format
 msgid "while writing '%s'"
 msgstr ""
 
-#: src/strip.c:2030 src/strip.c:2037
+#: src/strip.c:2061 src/strip.c:2068
 #, c-format
 msgid "error while finishing '%s': %s"
 msgstr ""
 
-#: src/strip.c:2060 src/strip.c:2117
+#: src/strip.c:2091 src/strip.c:2148
 #, c-format
 msgid "cannot set access and modification date of '%s'"
 msgstr ""
@@ -5694,265 +5884,288 @@ msgstr ""
 msgid "Only list module and file names, build IDs"
 msgstr ""
 
-#: src/unstrip.c:126
+#: src/unstrip.c:86
+msgid "Force combining files even if some ELF headers don't seem to match"
+msgstr ""
+
+#: src/unstrip.c:130
 #, c-format
 msgid "-d option specified twice"
 msgstr ""
 
-#: src/unstrip.c:158
+#: src/unstrip.c:165
 #, c-format
 msgid "only one of -o or -d allowed"
 msgstr ""
 
-#: src/unstrip.c:167
+#: src/unstrip.c:174
 #, c-format
 msgid "-n cannot be used with explicit files or -o or -d"
 msgstr ""
 
-#: src/unstrip.c:182
+#: src/unstrip.c:189
 #, c-format
 msgid "output directory '%s'"
 msgstr ""
 
-#: src/unstrip.c:191
+#: src/unstrip.c:198
 #, c-format
 msgid "exactly two file arguments are required"
 msgstr ""
 
-#: src/unstrip.c:197
+#: src/unstrip.c:204
 #, c-format
 msgid "-m, -a, -R, and -i options not allowed with explicit files"
 msgstr ""
 
-#: src/unstrip.c:210
+#: src/unstrip.c:217
 #, c-format
 msgid "-o or -d is required when using implicit files"
 msgstr ""
 
-#: src/unstrip.c:246
+#: src/unstrip.c:253
 #, c-format
 msgid "cannot create ELF header: %s"
 msgstr ""
 
-#: src/unstrip.c:251
+#: src/unstrip.c:258
 #, c-format
 msgid "cannot copy ELF header: %s"
 msgstr ""
 
-#: src/unstrip.c:256 src/unstrip.c:1820
+#: src/unstrip.c:263 src/unstrip.c:1828
 #, c-format
 msgid "cannot create program headers: %s"
 msgstr ""
 
-#: src/unstrip.c:262
+#: src/unstrip.c:269
 #, c-format
 msgid "cannot copy program header: %s"
 msgstr ""
 
-#: src/unstrip.c:272
+#: src/unstrip.c:279
 #, c-format
 msgid "cannot copy section header: %s"
 msgstr ""
 
-#: src/unstrip.c:275 src/unstrip.c:1501
+#: src/unstrip.c:282 src/unstrip.c:1509
 #, c-format
 msgid "cannot get section data: %s"
 msgstr ""
 
-#: src/unstrip.c:277 src/unstrip.c:1503
+#: src/unstrip.c:284 src/unstrip.c:1511
 #, c-format
 msgid "cannot copy section data: %s"
 msgstr ""
 
-#: src/unstrip.c:301
+#: src/unstrip.c:308
 #, c-format
 msgid "cannot create directory '%s'"
 msgstr ""
 
-#: src/unstrip.c:341 src/unstrip.c:758 src/unstrip.c:1535
+#: src/unstrip.c:348 src/unstrip.c:765 src/unstrip.c:1543
 #, c-format
 msgid "cannot get symbol table entry: %s"
 msgstr ""
 
-#: src/unstrip.c:357 src/unstrip.c:575 src/unstrip.c:596 src/unstrip.c:608
-#: src/unstrip.c:1556 src/unstrip.c:1686 src/unstrip.c:1710
+#: src/unstrip.c:364 src/unstrip.c:582 src/unstrip.c:603 src/unstrip.c:615
+#: src/unstrip.c:1564 src/unstrip.c:1694 src/unstrip.c:1718
 #, c-format
 msgid "cannot update symbol table: %s"
 msgstr ""
 
-#: src/unstrip.c:367
+#: src/unstrip.c:374
 #, c-format
 msgid "cannot update section header: %s"
 msgstr ""
 
-#: src/unstrip.c:406 src/unstrip.c:417
+#: src/unstrip.c:413 src/unstrip.c:424
 #, c-format
 msgid "cannot update relocation: %s"
 msgstr ""
 
-#: src/unstrip.c:504
+#: src/unstrip.c:511
 #, c-format
 msgid "cannot get symbol version: %s"
 msgstr ""
 
-#: src/unstrip.c:516
+#: src/unstrip.c:523
 #, c-format
 msgid "unexpected section type in [%Zu] with sh_link to symtab"
 msgstr ""
 
-#: src/unstrip.c:764
+#: src/unstrip.c:771
 #, c-format
 msgid "invalid string offset in symbol [%Zu]"
 msgstr ""
 
-#: src/unstrip.c:906 src/unstrip.c:1246
+#: src/unstrip.c:913 src/unstrip.c:1254
 #, c-format
 msgid "cannot read section [%Zu] name: %s"
 msgstr ""
 
-#: src/unstrip.c:947 src/unstrip.c:966 src/unstrip.c:999
+#: src/unstrip.c:954 src/unstrip.c:973 src/unstrip.c:1006
 #, c-format
 msgid "cannot read '.gnu.prelink_undo' section: %s"
 msgstr ""
 
-#: src/unstrip.c:987
+#: src/unstrip.c:994
 #, c-format
 msgid "invalid contents in '%s' section"
 msgstr ""
 
-#: src/unstrip.c:1042 src/unstrip.c:1366
+#: src/unstrip.c:1049 src/unstrip.c:1374
 #, c-format
 msgid "cannot find matching section for [%Zu] '%s'"
 msgstr ""
 
-#: src/unstrip.c:1166 src/unstrip.c:1181 src/unstrip.c:1447
+#: src/unstrip.c:1174 src/unstrip.c:1189 src/unstrip.c:1455
 #, c-format
 msgid "cannot add section name to string table: %s"
 msgstr ""
 
-#: src/unstrip.c:1190
+#: src/unstrip.c:1198
 #, c-format
 msgid "cannot update section header string table data: %s"
 msgstr ""
 
-#: src/unstrip.c:1217 src/unstrip.c:1221
+#: src/unstrip.c:1225 src/unstrip.c:1229
 #, c-format
 msgid "cannot get section header string table section index: %s"
 msgstr ""
 
-#: src/unstrip.c:1225 src/unstrip.c:1229 src/unstrip.c:1462
+#: src/unstrip.c:1233 src/unstrip.c:1237 src/unstrip.c:1470
 #, c-format
 msgid "cannot get section count: %s"
 msgstr ""
 
-#: src/unstrip.c:1232
+#: src/unstrip.c:1240
 #, c-format
 msgid "more sections in stripped file than debug file -- arguments reversed?"
 msgstr ""
 
-#: src/unstrip.c:1291 src/unstrip.c:1381
+#: src/unstrip.c:1299 src/unstrip.c:1389
 #, c-format
 msgid "cannot read section header string table: %s"
 msgstr ""
 
-#: src/unstrip.c:1441
+#: src/unstrip.c:1449
 #, c-format
 msgid "cannot add new section: %s"
 msgstr ""
 
-#: src/unstrip.c:1543
+#: src/unstrip.c:1551
 #, c-format
 msgid "symbol [%Zu] has invalid section index"
 msgstr ""
 
-#: src/unstrip.c:1781
+#: src/unstrip.c:1789
 #, c-format
 msgid "cannot read section data: %s"
 msgstr ""
 
-#: src/unstrip.c:1802
+#: src/unstrip.c:1810
 #, c-format
 msgid "cannot get ELF header: %s"
 msgstr ""
 
-#: src/unstrip.c:1830
+#: src/unstrip.c:1838
 #, c-format
 msgid "cannot update program header: %s"
 msgstr ""
 
-#: src/unstrip.c:1835 src/unstrip.c:1914
+#: src/unstrip.c:1843 src/unstrip.c:1922
 #, c-format
 msgid "cannot write output file: %s"
 msgstr ""
 
-#: src/unstrip.c:1883
+#: src/unstrip.c:1891
 #, c-format
 msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
 msgstr ""
 
-#: src/unstrip.c:1886
+#: src/unstrip.c:1894
 #, c-format
 msgid ""
 "DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
 msgstr ""
 
-#: src/unstrip.c:1905 src/unstrip.c:1945 src/unstrip.c:1957 src/unstrip.c:2037
+#: src/unstrip.c:1913 src/unstrip.c:1964 src/unstrip.c:1976 src/unstrip.c:2062
 #, c-format
 msgid "cannot create ELF descriptor: %s"
 msgstr ""
 
-#: src/unstrip.c:1963
-#, c-format
-msgid "'%s' and '%s' do not seem to match"
+#: src/unstrip.c:1955
+msgid "WARNING: "
+msgstr ""
+
+#: src/unstrip.c:1957
+msgid ", use --force"
+msgstr ""
+
+#: src/unstrip.c:1980
+msgid "ELF header identification (e_ident) different"
+msgstr ""
+
+#: src/unstrip.c:1983
+msgid "ELF header type (e_type) different"
+msgstr ""
+
+#: src/unstrip.c:1986
+msgid "ELF header machine type (e_machine) different"
+msgstr ""
+
+#: src/unstrip.c:1989
+msgid "stripped program header (e_phnum) smaller than unstripped"
 msgstr ""
 
-#: src/unstrip.c:1994
+#: src/unstrip.c:2019
 #, c-format
 msgid "cannot find stripped file for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:1998
+#: src/unstrip.c:2023
 #, c-format
 msgid "cannot open stripped file '%s' for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2013
+#: src/unstrip.c:2038
 #, c-format
 msgid "cannot find debug file for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2017
+#: src/unstrip.c:2042
 #, c-format
 msgid "cannot open debug file '%s' for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2030
+#: src/unstrip.c:2055
 #, c-format
 msgid "module '%s' file '%s' is not stripped"
 msgstr ""
 
-#: src/unstrip.c:2061
+#: src/unstrip.c:2086
 #, c-format
 msgid "cannot cache section addresses for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2194
+#: src/unstrip.c:2219
 #, c-format
 msgid "no matching modules found"
 msgstr ""
 
-#: src/unstrip.c:2203
+#: src/unstrip.c:2228
 #, c-format
 msgid "matched more than one module"
 msgstr ""
 
-#: src/unstrip.c:2250
+#: src/unstrip.c:2275
 msgid ""
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
 msgstr ""
 
-#: src/unstrip.c:2251
+#: src/unstrip.c:2276
 msgid ""
 "Combine stripped files with separate symbols and debug information.\vThe "
 "first form puts the result in DEBUG-FILE if -o was not given.\n"
index a1aa1b5..5f177e7 100644 (file)
Binary files a/po/en@boldquot.gmo and b/po/en@boldquot.gmo differ
index e6320e1..9bc2a9e 100644 (file)
@@ -1,7 +1,7 @@
 # English translations for elfutils package.
-# Copyright (C) 2012 Red Hat, Inc.
+# Copyright (C) 2014 Red Hat, Inc.
 # This file is distributed under the same license as the elfutils package.
-# Automatically generated, 2012.
+# Automatically generated, 2014.
 #
 # All this catalog "translates" are quotation characters.
 # The msgids must be ASCII and therefore cannot contain real quotation
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: elfutils 0.155\n"
+"Project-Id-Version: elfutils 0.160\n"
 "Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
-"POT-Creation-Date: 2012-08-27 20:34+0200\n"
-"PO-Revision-Date: 2012-08-27 20:34+0200\n"
+"POT-Creation-Date: 2014-08-27 11:26+0200\n"
+"PO-Revision-Date: 2014-08-27 11:26+0200\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
-"Language: en\n"
+"Language: en@boldquot\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: lib/xmalloc.c:54 lib/xmalloc.c:68 lib/xmalloc.c:82 src/readelf.c:2842
-#: src/readelf.c:3181 src/unstrip.c:2090 src/unstrip.c:2298
+#: lib/xmalloc.c:54 lib/xmalloc.c:68 lib/xmalloc.c:82 src/readelf.c:3098
+#: src/readelf.c:3447 src/readelf.c:8018 src/unstrip.c:2115 src/unstrip.c:2323
 #, c-format
 msgid "memory exhausted"
 msgstr "memory exhausted"
 
-#: libasm/asm_error.c:65 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:49
+#: libasm/asm_error.c:65 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:53
 #: libelf/elf_error.c:60
 msgid "no error"
 msgstr "no error"
 
-#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:51
+#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:55
 #: libelf/elf_error.c:91
 msgid "out of memory"
 msgstr "out of memory"
@@ -92,7 +92,7 @@ msgstr "error during output of data"
 msgid "no backend support available"
 msgstr "no backend support available"
 
-#: libasm/asm_error.c:84 libdw/dwarf_error.c:59 libdwfl/libdwflP.h:50
+#: libasm/asm_error.c:84 libdw/dwarf_error.c:59 libdwfl/libdwflP.h:54
 #: libelf/elf_error.c:63
 msgid "unknown error"
 msgstr "unknown error"
@@ -189,7 +189,7 @@ msgstr "invalid DWARF version"
 msgid "invalid directory index"
 msgstr "invalid directory index"
 
-#: libdw/dwarf_error.c:84 libdwfl/libdwflP.h:70
+#: libdw/dwarf_error.c:84 libdwfl/libdwflP.h:74
 msgid "address out of range"
 msgstr "address out of range"
 
@@ -209,7 +209,7 @@ msgstr "invalid line index"
 msgid "invalid address range index"
 msgstr "invalid address range index"
 
-#: libdw/dwarf_error.c:89 libdwfl/libdwflP.h:71
+#: libdw/dwarf_error.c:89 libdwfl/libdwflP.h:75
 msgid "no matching address range"
 msgstr "no matching address range"
 
@@ -233,7 +233,7 @@ msgstr "invalid CFI section"
 msgid "no alternative debug link found"
 msgstr "no alternative debug link found"
 
-#: libdwfl/argp-std.c:46 src/unstrip.c:2240
+#: libdwfl/argp-std.c:46 src/unstrip.c:2265
 msgid "Input selection options:"
 msgstr "Input selection options:"
 
@@ -269,132 +269,188 @@ msgstr "Kernel with all modules"
 msgid "Search path for separate debuginfo files"
 msgstr "Search path for separate debuginfo files"
 
-#: libdwfl/argp-std.c:142
+#: libdwfl/argp-std.c:157
 msgid "only one of -e, -p, -k, -K, or --core allowed"
 msgstr "only one of -e, -p, -k, -K, or --core allowed"
 
-#: libdwfl/argp-std.c:202
-#, c-format
-msgid "cannot read ELF core file: %s"
-msgstr "cannot read ELF core file: %s"
-
-#: libdwfl/argp-std.c:220
-msgid "No modules recognized in core file"
-msgstr "No modules recognized in core file"
-
-#: libdwfl/argp-std.c:232
+#: libdwfl/argp-std.c:230
 msgid "cannot load kernel symbols"
 msgstr "cannot load kernel symbols"
 
-#: libdwfl/argp-std.c:236
+#: libdwfl/argp-std.c:234
 msgid "cannot find kernel modules"
 msgstr "cannot find kernel modules"
 
-#: libdwfl/argp-std.c:250
+#: libdwfl/argp-std.c:251
 msgid "cannot find kernel or modules"
 msgstr "cannot find kernel or modules"
 
-#: libdwfl/libdwflP.h:52
+#: libdwfl/argp-std.c:290
+#, c-format
+msgid "cannot read ELF core file: %s"
+msgstr "cannot read ELF core file: %s"
+
+#: libdwfl/argp-std.c:311
+msgid "No modules recognized in core file"
+msgstr "No modules recognized in core file"
+
+#: libdwfl/libdwflP.h:56
 msgid "See errno"
 msgstr "See errno"
 
-#: libdwfl/libdwflP.h:53
+#: libdwfl/libdwflP.h:57
 msgid "See elf_errno"
 msgstr "See elf_errno"
 
-#: libdwfl/libdwflP.h:54
+#: libdwfl/libdwflP.h:58
 msgid "See dwarf_errno"
 msgstr "See dwarf_errno"
 
-#: libdwfl/libdwflP.h:55
+#: libdwfl/libdwflP.h:59
 msgid "See ebl_errno (XXX missing)"
 msgstr "See ebl_errno (XXX missing)"
 
-#: libdwfl/libdwflP.h:56
+#: libdwfl/libdwflP.h:60
 msgid "gzip decompression failed"
 msgstr "gzip decompression failed"
 
-#: libdwfl/libdwflP.h:57
+#: libdwfl/libdwflP.h:61
 msgid "bzip2 decompression failed"
 msgstr "bzip2 decompression failed"
 
-#: libdwfl/libdwflP.h:58
+#: libdwfl/libdwflP.h:62
 msgid "LZMA decompression failed"
 msgstr "LZMA decompression failed"
 
-#: libdwfl/libdwflP.h:59
+#: libdwfl/libdwflP.h:63
 msgid "no support library found for machine"
 msgstr "no support library found for machine"
 
-#: libdwfl/libdwflP.h:60
+#: libdwfl/libdwflP.h:64
 msgid "Callbacks missing for ET_REL file"
 msgstr "Callbacks missing for ET_REL file"
 
-#: libdwfl/libdwflP.h:61
+#: libdwfl/libdwflP.h:65
 msgid "Unsupported relocation type"
 msgstr "Unsupported relocation type"
 
-#: libdwfl/libdwflP.h:62
+#: libdwfl/libdwflP.h:66
 msgid "r_offset is bogus"
 msgstr "r_offset is bogus"
 
-#: libdwfl/libdwflP.h:63 libelf/elf_error.c:111 libelf/elf_error.c:171
+#: libdwfl/libdwflP.h:67 libelf/elf_error.c:111 libelf/elf_error.c:171
 msgid "offset out of range"
 msgstr "offset out of range"
 
-#: libdwfl/libdwflP.h:64
+#: libdwfl/libdwflP.h:68
 msgid "relocation refers to undefined symbol"
 msgstr "relocation refers to undefined symbol"
 
-#: libdwfl/libdwflP.h:65
+#: libdwfl/libdwflP.h:69
 msgid "Callback returned failure"
 msgstr "Callback returned failure"
 
-#: libdwfl/libdwflP.h:66
+#: libdwfl/libdwflP.h:70
 msgid "No DWARF information found"
 msgstr "No DWARF information found"
 
-#: libdwfl/libdwflP.h:67
+#: libdwfl/libdwflP.h:71
 msgid "No symbol table found"
 msgstr "No symbol table found"
 
-#: libdwfl/libdwflP.h:68
+#: libdwfl/libdwflP.h:72
 msgid "No ELF program headers"
 msgstr "No ELF program headers"
 
-#: libdwfl/libdwflP.h:69
+#: libdwfl/libdwflP.h:73
 msgid "address range overlaps an existing module"
 msgstr "address range overlaps an existing module"
 
-#: libdwfl/libdwflP.h:72
+#: libdwfl/libdwflP.h:76
 msgid "image truncated"
 msgstr "image truncated"
 
-#: libdwfl/libdwflP.h:73
+#: libdwfl/libdwflP.h:77
 msgid "ELF file opened"
 msgstr "ELF file opened"
 
-#: libdwfl/libdwflP.h:74
+#: libdwfl/libdwflP.h:78
 msgid "not a valid ELF file"
 msgstr "not a valid ELF file"
 
-#: libdwfl/libdwflP.h:75
+#: libdwfl/libdwflP.h:79
 msgid "cannot handle DWARF type description"
 msgstr "cannot handle DWARF type description"
 
-#: libdwfl/libdwflP.h:76
+#: libdwfl/libdwflP.h:80
 msgid "ELF file does not match build ID"
 msgstr "ELF file does not match build ID"
 
-#: libdwfl/libdwflP.h:77
+#: libdwfl/libdwflP.h:81
 msgid "corrupt .gnu.prelink_undo section data"
 msgstr "corrupt .gnu.prelink_undo section data"
 
+#: libdwfl/libdwflP.h:82
+msgid "Internal error due to ebl"
+msgstr "Internal error due to ebl"
+
+#: libdwfl/libdwflP.h:83
+msgid "Missing data in core file"
+msgstr "Missing data in core file"
+
+#: libdwfl/libdwflP.h:84
+msgid "Invalid register"
+msgstr "Invalid register"
+
+#: libdwfl/libdwflP.h:85
+msgid "Error reading process memory"
+msgstr "Error reading process memory"
+
+#: libdwfl/libdwflP.h:86
+msgid "Couldn't find architecture of any ELF"
+msgstr "Couldn't find architecture of any ELF"
+
+#: libdwfl/libdwflP.h:87
+msgid "Error parsing /proc filesystem"
+msgstr "Error parsing /proc filesystem"
+
+#: libdwfl/libdwflP.h:88
+msgid "Invalid DWARF"
+msgstr "Invalid DWARF"
+
+#: libdwfl/libdwflP.h:89
+msgid "Unsupported DWARF"
+msgstr "Unsupported DWARF"
+
+#: libdwfl/libdwflP.h:90
+msgid "Unable to find more threads"
+msgstr "Unable to find more threads"
+
+#: libdwfl/libdwflP.h:91
+msgid "Dwfl already has attached state"
+msgstr "Dwfl already has attached state"
+
+#: libdwfl/libdwflP.h:92
+msgid "Dwfl has no attached state"
+msgstr "Dwfl has no attached state"
+
+#: libdwfl/libdwflP.h:93
+msgid "Unwinding not supported for this architecture"
+msgstr "Unwinding not supported for this architecture"
+
+#: libdwfl/libdwflP.h:94
+msgid "Invalid argument"
+msgstr "Invalid argument"
+
+#: libdwfl/libdwflP.h:95
+msgid "Not an ET_CORE ELF file"
+msgstr "Not an ET_CORE ELF file"
+
 #: libebl/eblbackendname.c:42
 msgid "No backend"
 msgstr "No backend"
 
-#: libebl/eblcorenotetypename.c:86 libebl/eblobjecttypename.c:57
+#: libebl/eblcorenotetypename.c:102 libebl/eblobjecttypename.c:57
 #: libebl/eblobjnotetypename.c:73 libebl/eblosabiname.c:77
 #: libebl/eblsectionname.c:89 libebl/eblsectiontypename.c:119
 #: libebl/eblsegmenttypename.c:83
@@ -490,7 +546,7 @@ msgstr "invalid size of source operand"
 msgid "invalid size of destination operand"
 msgstr "invalid size of destination operand"
 
-#: libelf/elf_error.c:87 src/readelf.c:4697
+#: libelf/elf_error.c:87 src/readelf.c:5190
 #, c-format
 msgid "invalid encoding"
 msgstr "invalid encoding"
@@ -571,8 +627,8 @@ msgstr "data/scn mismatch"
 msgid "invalid section header"
 msgstr "invalid section header"
 
-#: libelf/elf_error.c:187 src/readelf.c:6335 src/readelf.c:6780
-#: src/readelf.c:6881 src/readelf.c:7043
+#: libelf/elf_error.c:187 src/readelf.c:6980 src/readelf.c:7426
+#: src/readelf.c:7527 src/readelf.c:7689
 #, c-format
 msgid "invalid data"
 msgstr "invalid data"
@@ -636,32 +692,44 @@ msgid "Also show symbol or section names"
 msgstr "Also show symbol or section names"
 
 #: src/addr2line.c:64
+msgid "Also show symbol and the section names"
+msgstr "Also show symbol and the section names"
+
+#: src/addr2line.c:65
 msgid "Also show line table flags"
 msgstr "Also show line table flags"
 
-#: src/addr2line.c:66
+#: src/addr2line.c:67
 msgid "Treat addresses as offsets relative to NAME section."
 msgstr "Treat addresses as offsets relative to NAME section."
 
-#: src/addr2line.c:68 src/elfcmp.c:72 src/findtextrel.c:67 src/nm.c:100
+#: src/addr2line.c:69
+msgid ""
+"Show all source locations that caused inline expansion of subroutines at the "
+"address."
+msgstr ""
+"Show all source locations that caused inline expansion of subroutines at the "
+"address."
+
+#: src/addr2line.c:72 src/elfcmp.c:72 src/findtextrel.c:67 src/nm.c:100
 #: src/strings.c:75
 msgid "Miscellaneous:"
 msgstr "Miscellaneous:"
 
-#: src/addr2line.c:77
+#: src/addr2line.c:81
 msgid ""
 "Locate source files and line information for ADDRs (in a.out by default)."
 msgstr ""
 "Locate source files and line information for ADDRs (in a.out by default)."
 
-#: src/addr2line.c:81
+#: src/addr2line.c:85
 msgid "[ADDR...]"
 msgstr "[ADDR...]"
 
-#: src/addr2line.c:181 src/ar.c:289 src/elfcmp.c:662 src/elflint.c:231
+#: src/addr2line.c:196 src/ar.c:289 src/elfcmp.c:662 src/elflint.c:235
 #: src/findtextrel.c:162 src/ld.c:949 src/nm.c:265 src/objdump.c:181
-#: src/ranlib.c:128 src/readelf.c:460 src/size.c:211 src/strings.c:219
-#: src/strip.c:213 src/unstrip.c:226
+#: src/ranlib.c:128 src/readelf.c:500 src/size.c:211 src/strings.c:226
+#: src/strip.c:213 src/unstrip.c:233
 #, c-format
 msgid ""
 "Copyright (C) %s Red Hat, Inc.\n"
@@ -672,30 +740,30 @@ 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"
 
-#: src/addr2line.c:186 src/ar.c:294 src/elfcmp.c:667 src/elflint.c:236
+#: src/addr2line.c:201 src/ar.c:294 src/elfcmp.c:667 src/elflint.c:240
 #: src/findtextrel.c:167 src/ld.c:954 src/nm.c:270 src/objdump.c:186
-#: src/ranlib.c:133 src/readelf.c:465 src/size.c:216 src/strings.c:224
-#: src/strip.c:218 src/unstrip.c:231
+#: src/ranlib.c:133 src/readelf.c:505 src/size.c:216 src/strings.c:231
+#: src/strip.c:218 src/unstrip.c:238
 #, c-format
 msgid "Written by %s.\n"
 msgstr "Written by %s.\n"
 
-#: src/addr2line.c:405
+#: src/addr2line.c:474
 #, c-format
 msgid "Section syntax requires exactly one module"
 msgstr "Section syntax requires exactly one module"
 
-#: src/addr2line.c:428
+#: src/addr2line.c:497
 #, c-format
 msgid "offset %#<PRIxMAX> lies outside section '%s'"
 msgstr "offset %#<PRIxMAX> lies outside section ‘\e[1m%s\e[0m’"
 
-#: src/addr2line.c:469
+#: src/addr2line.c:563
 #, c-format
 msgid "cannot find symbol '%s'"
 msgstr "cannot find symbol ‘\e[1m%s\e[0m’"
 
-#: src/addr2line.c:474
+#: src/addr2line.c:568
 #, c-format
 msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
 msgstr "offset %#<PRIxMAX> lies outside contents of ‘\e[1m%s\e[0m’"
@@ -1136,8 +1204,8 @@ msgstr "Invalid value ‘\e[1m%s\e[0m’ for --gaps parameter."
 
 #: src/elfcmp.c:722 src/findtextrel.c:221 src/ldgeneric.c:1757
 #: src/ldgeneric.c:4247 src/nm.c:381 src/ranlib.c:161 src/size.c:293
-#: src/strings.c:175 src/strip.c:450 src/strip.c:487 src/unstrip.c:1903
-#: src/unstrip.c:1932
+#: src/strings.c:182 src/strip.c:451 src/strip.c:488 src/unstrip.c:1911
+#: src/unstrip.c:1940
 #, c-format
 msgid "cannot open '%s'"
 msgstr "cannot open ‘\e[1m%s\e[0m’"
@@ -1191,159 +1259,159 @@ msgstr ""
 msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
 msgstr "Pedantic checking of ELF files compliance with gABI/psABI spec."
 
-#: src/elflint.c:78 src/readelf.c:113
+#: src/elflint.c:78 src/readelf.c:123
 msgid "FILE..."
 msgstr "FILE..."
 
-#: src/elflint.c:151 src/readelf.c:271
+#: src/elflint.c:155 src/readelf.c:292
 #, c-format
 msgid "cannot open input file"
 msgstr "cannot open input file"
 
-#: src/elflint.c:158
+#: src/elflint.c:162
 #, c-format
 msgid "cannot generate Elf descriptor: %s\n"
 msgstr "cannot generate Elf descriptor: %s\n"
 
-#: src/elflint.c:177
+#: src/elflint.c:181
 #, c-format
 msgid "error while closing Elf descriptor: %s\n"
 msgstr "error while closing Elf descriptor: %s\n"
 
-#: src/elflint.c:181
+#: src/elflint.c:185
 msgid "No errors"
 msgstr "No errors"
 
-#: src/elflint.c:215 src/readelf.c:434
+#: src/elflint.c:219 src/readelf.c:468
 msgid "Missing file name.\n"
 msgstr "Missing file name.\n"
 
-#: src/elflint.c:294
+#: src/elflint.c:298
 #, c-format
 msgid " error while freeing sub-ELF descriptor: %s\n"
 msgstr " error while freeing sub-ELF descriptor: %s\n"
 
-#: src/elflint.c:302
+#: src/elflint.c:306
 #, c-format
 msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
 msgstr "Not an ELF file - it has the wrong magic bytes at the start\n"
 
-#: src/elflint.c:363
+#: src/elflint.c:371
 #, c-format
 msgid "e_ident[%d] == %d is no known class\n"
 msgstr "e_ident[%d] == %d is no known class\n"
 
-#: src/elflint.c:368
+#: src/elflint.c:376
 #, c-format
 msgid "e_ident[%d] == %d is no known data encoding\n"
 msgstr "e_ident[%d] == %d is no known data encoding\n"
 
-#: src/elflint.c:372
+#: src/elflint.c:380
 #, c-format
 msgid "unknown ELF header version number e_ident[%d] == %d\n"
 msgstr "unknown ELF header version number e_ident[%d] == %d\n"
 
-#: src/elflint.c:378
+#: src/elflint.c:386
 #, c-format
 msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
 msgstr "unsupported OS ABI e_ident[%d] == ‘\e[1m%s\e[0m’\n"
 
-#: src/elflint.c:384
+#: src/elflint.c:392
 #, c-format
 msgid "unsupport ABI version e_ident[%d] == %d\n"
 msgstr "unsupport ABI version e_ident[%d] == %d\n"
 
-#: src/elflint.c:389
+#: src/elflint.c:397
 #, c-format
 msgid "e_ident[%zu] is not zero\n"
 msgstr "e_ident[%zu] is not zero\n"
 
-#: src/elflint.c:394
+#: src/elflint.c:402
 #, c-format
 msgid "unknown object file type %d\n"
 msgstr "unknown object file type %d\n"
 
-#: src/elflint.c:401
+#: src/elflint.c:409
 #, c-format
 msgid "unknown machine type %d\n"
 msgstr "unknown machine type %d\n"
 
-#: src/elflint.c:405
+#: src/elflint.c:413
 #, c-format
 msgid "unknown object file version\n"
 msgstr "unknown object file version\n"
 
-#: src/elflint.c:411
+#: src/elflint.c:419
 #, c-format
 msgid "invalid program header offset\n"
 msgstr "invalid program header offset\n"
 
-#: src/elflint.c:413
+#: src/elflint.c:421
 #, c-format
 msgid "executables and DSOs cannot have zero program header offset\n"
 msgstr "executables and DSOs cannot have zero program header offset\n"
 
-#: src/elflint.c:417
+#: src/elflint.c:425
 #, c-format
 msgid "invalid number of program header entries\n"
 msgstr "invalid number of program header entries\n"
 
-#: src/elflint.c:425
+#: src/elflint.c:433
 #, c-format
 msgid "invalid section header table offset\n"
 msgstr "invalid section header table offset\n"
 
-#: src/elflint.c:428
+#: src/elflint.c:436
 #, c-format
 msgid "section header table must be present\n"
 msgstr "section header table must be present\n"
 
-#: src/elflint.c:442
+#: src/elflint.c:450
 #, c-format
 msgid "invalid number of section header table entries\n"
 msgstr "invalid number of section header table entries\n"
 
-#: src/elflint.c:459
+#: src/elflint.c:467
 #, c-format
 msgid "invalid section header index\n"
 msgstr "invalid section header index\n"
 
-#: src/elflint.c:473
+#: src/elflint.c:481
 #, c-format
 msgid "invalid number of program header table entries\n"
 msgstr "invalid number of program header table entries\n"
 
-#: src/elflint.c:482
+#: src/elflint.c:490
 #, c-format
 msgid "invalid machine flags: %s\n"
 msgstr "invalid machine flags: %s\n"
 
-#: src/elflint.c:489 src/elflint.c:506
+#: src/elflint.c:497 src/elflint.c:514
 #, c-format
 msgid "invalid ELF header size: %hd\n"
 msgstr "invalid ELF header size: %hd\n"
 
-#: src/elflint.c:492 src/elflint.c:509
+#: src/elflint.c:500 src/elflint.c:517
 #, c-format
 msgid "invalid program header size: %hd\n"
 msgstr "invalid program header size: %hd\n"
 
-#: src/elflint.c:495 src/elflint.c:512
+#: src/elflint.c:503 src/elflint.c:520
 #, c-format
 msgid "invalid program header position or size\n"
 msgstr "invalid program header position or size\n"
 
-#: src/elflint.c:498 src/elflint.c:515
+#: src/elflint.c:506 src/elflint.c:523
 #, c-format
 msgid "invalid section header size: %hd\n"
 msgstr "invalid section header size: %hd\n"
 
-#: src/elflint.c:501 src/elflint.c:518
+#: src/elflint.c:509 src/elflint.c:526
 #, c-format
 msgid "invalid section header position or size\n"
 msgstr "invalid section header position or size\n"
 
-#: src/elflint.c:562
+#: src/elflint.c:570
 #, c-format
 msgid ""
 "section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
@@ -1352,7 +1420,7 @@ msgstr ""
 "section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
 "group\n"
 
-#: src/elflint.c:566
+#: src/elflint.c:574
 #, c-format
 msgid ""
 "section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
@@ -1360,14 +1428,14 @@ msgstr ""
 "section [%2d] '%s': section group [%2zu] ‘\e[1m%s\e[0m’ does not precede group "
 "member\n"
 
-#: src/elflint.c:582 src/elflint.c:1426 src/elflint.c:1476 src/elflint.c:1581
-#: src/elflint.c:2166 src/elflint.c:2680 src/elflint.c:2841 src/elflint.c:2971
-#: src/elflint.c:3143 src/elflint.c:4045
+#: src/elflint.c:590 src/elflint.c:1457 src/elflint.c:1508 src/elflint.c:1614
+#: src/elflint.c:1939 src/elflint.c:2228 src/elflint.c:2742 src/elflint.c:2904
+#: src/elflint.c:3034 src/elflint.c:3206 src/elflint.c:4108
 #, c-format
 msgid "section [%2d] '%s': cannot get section data\n"
 msgstr "section [%2d] '%s': cannot get section data\n"
 
-#: src/elflint.c:595 src/elflint.c:1588
+#: src/elflint.c:603 src/elflint.c:1621
 #, c-format
 msgid ""
 "section [%2d] '%s': referenced as string table for section [%2d] '%s' but "
@@ -1376,7 +1444,7 @@ msgstr ""
 "section [%2d] '%s': referenced as string table for section [%2d] ‘\e[1m%s\e[0m’ "
 "but type is not SHT_STRTAB\n"
 
-#: src/elflint.c:618
+#: src/elflint.c:626
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol table cannot have more than one extended index "
@@ -1385,38 +1453,38 @@ msgstr ""
 "section [%2d] '%s': symbol table cannot have more than one extended index "
 "section\n"
 
-#: src/elflint.c:629
+#: src/elflint.c:638
 #, c-format
 msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
 msgstr "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
 
-#: src/elflint.c:638
+#: src/elflint.c:647
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
 msgstr "section [%2d] '%s': cannot get symbol %d: %s\n"
 
-#: src/elflint.c:643 src/elflint.c:646 src/elflint.c:649 src/elflint.c:652
-#: src/elflint.c:655 src/elflint.c:658
+#: src/elflint.c:652 src/elflint.c:655 src/elflint.c:658 src/elflint.c:661
+#: src/elflint.c:664 src/elflint.c:667
 #, c-format
 msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
 msgstr "section [%2d] '%s': ‘\e[1m%s\e[0m’ in zeroth entry not zero\n"
 
-#: src/elflint.c:661
+#: src/elflint.c:670
 #, c-format
 msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
 msgstr "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
 
-#: src/elflint.c:671
+#: src/elflint.c:680
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
 msgstr "section [%2d] '%s': cannot get symbol %zu: %s\n"
 
-#: src/elflint.c:680
+#: src/elflint.c:689
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
 msgstr "section [%2d] '%s': symbol %zu: invalid name value\n"
 
-#: src/elflint.c:694
+#: src/elflint.c:704
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: too large section index but no extended "
@@ -1425,7 +1493,7 @@ msgstr ""
 "section [%2d] '%s': symbol %zu: too large section index but no extended "
 "section index section\n"
 
-#: src/elflint.c:700
+#: src/elflint.c:710
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
@@ -1434,51 +1502,51 @@ msgstr ""
 "section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
 "st_shndx (%<PRIu32>)\n"
 
-#: src/elflint.c:712
+#: src/elflint.c:722
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
 msgstr "section [%2d] '%s': symbol %zu: invalid section index\n"
 
-#: src/elflint.c:720
+#: src/elflint.c:730
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown type\n"
 msgstr "section [%2d] '%s': symbol %zu: unknown type\n"
 
-#: src/elflint.c:726
+#: src/elflint.c:736
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
 msgstr "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
 
-#: src/elflint.c:731
+#: src/elflint.c:741
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
 msgstr "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
 
-#: src/elflint.c:739
+#: src/elflint.c:749
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
 msgstr ""
 "section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
 
-#: src/elflint.c:743
+#: src/elflint.c:753
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
 msgstr "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
 
-#: src/elflint.c:747
+#: src/elflint.c:757
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
 msgstr ""
 "section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
 
-#: src/elflint.c:779
+#: src/elflint.c:804
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
 msgstr "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
 
-#: src/elflint.c:785 src/elflint.c:810 src/elflint.c:853
+#: src/elflint.c:810 src/elflint.c:835 src/elflint.c:878
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu does not fit completely in referenced section "
@@ -1487,7 +1555,7 @@ msgstr ""
 "section [%2d] '%s': symbol %zu does not fit completely in referenced section "
 "[%2d] ‘\e[1m%s\e[0m’\n"
 
-#: src/elflint.c:794
+#: src/elflint.c:819
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
@@ -1496,7 +1564,7 @@ msgstr ""
 "section [%2d] '%s': symbol %zu: referenced section [%2d] ‘\e[1m%s\e[0m’ does not "
 "have SHF_TLS flag set\n"
 
-#: src/elflint.c:804 src/elflint.c:846
+#: src/elflint.c:829 src/elflint.c:871
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
@@ -1505,14 +1573,14 @@ msgstr ""
 "section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
 "[%2d] ‘\e[1m%s\e[0m’\n"
 
-#: src/elflint.c:831
+#: src/elflint.c:856
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
 msgstr ""
 "section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
 
-#: src/elflint.c:839
+#: src/elflint.c:864
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] "
@@ -1521,7 +1589,7 @@ msgstr ""
 "section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] "
 "‘\e[1m%s\e[0m’\n"
 
-#: src/elflint.c:866
+#: src/elflint.c:891
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: local symbol outside range described in "
@@ -1530,7 +1598,7 @@ msgstr ""
 "section [%2d] '%s': symbol %zu: local symbol outside range described in "
 "sh_info\n"
 
-#: src/elflint.c:873
+#: src/elflint.c:898
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
@@ -1539,12 +1607,12 @@ msgstr ""
 "section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
 "sh_info\n"
 
-#: src/elflint.c:880
+#: src/elflint.c:905
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
 msgstr "section [%2d] '%s': symbol %zu: non-local section symbol\n"
 
-#: src/elflint.c:930
+#: src/elflint.c:955
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section "
@@ -1553,7 +1621,7 @@ msgstr ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section "
 "[%2d]\n"
 
-#: src/elflint.c:937
+#: src/elflint.c:962
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] "
@@ -1562,7 +1630,7 @@ msgstr ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] ‘\e[1m"
 "%s\e[0m’\n"
 
-#: src/elflint.c:953
+#: src/elflint.c:978
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
@@ -1571,7 +1639,7 @@ msgstr ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
 "match %s section address %#<PRIx64>\n"
 
-#: src/elflint.c:960
+#: src/elflint.c:985
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
@@ -1580,7 +1648,7 @@ msgstr ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
 "match %s section size %<PRIu64>\n"
 
-#: src/elflint.c:968
+#: src/elflint.c:993
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
@@ -1589,7 +1657,7 @@ msgstr ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
 "section\n"
 
-#: src/elflint.c:984
+#: src/elflint.c:1009
 #, c-format
 msgid ""
 "section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
@@ -1598,7 +1666,7 @@ msgstr ""
 "section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
 "segment address %#<PRIx64>\n"
 
-#: src/elflint.c:991
+#: src/elflint.c:1016
 #, c-format
 msgid ""
 "section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
@@ -1607,7 +1675,7 @@ msgstr ""
 "section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
 "segment size %<PRIu64>\n"
 
-#: src/elflint.c:1004
+#: src/elflint.c:1029
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
@@ -1616,22 +1684,22 @@ msgstr ""
 "section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
 "default visibility\n"
 
-#: src/elflint.c:1008
+#: src/elflint.c:1033
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
 msgstr "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
 
-#: src/elflint.c:1053
+#: src/elflint.c:1082
 #, c-format
 msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
 msgstr "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
 
-#: src/elflint.c:1062 src/elflint.c:1114
+#: src/elflint.c:1093 src/elflint.c:1145
 #, c-format
 msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
 msgstr "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
 
-#: src/elflint.c:1087 src/elflint.c:1139
+#: src/elflint.c:1118 src/elflint.c:1170
 #, c-format
 msgid ""
 "section [%2d] '%s': relative relocations after index %d as specified by "
@@ -1640,7 +1708,7 @@ msgstr ""
 "section [%2d] '%s': relative relocations after index %d as specified by "
 "DT_RELCOUNT\n"
 
-#: src/elflint.c:1093 src/elflint.c:1145
+#: src/elflint.c:1124 src/elflint.c:1176
 #, c-format
 msgid ""
 "section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
@@ -1649,47 +1717,47 @@ msgstr ""
 "section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
 "specified %d relative relocations\n"
 
-#: src/elflint.c:1105
+#: src/elflint.c:1136
 #, c-format
 msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
 msgstr "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
 
-#: src/elflint.c:1187
+#: src/elflint.c:1218
 #, c-format
 msgid "section [%2d] '%s': invalid destination section index\n"
 msgstr "section [%2d] '%s': invalid destination section index\n"
 
-#: src/elflint.c:1200
+#: src/elflint.c:1230
 #, c-format
 msgid "section [%2d] '%s': invalid destination section type\n"
 msgstr "section [%2d] '%s': invalid destination section type\n"
 
-#: src/elflint.c:1208
+#: src/elflint.c:1238
 #, c-format
 msgid "section [%2d] '%s': sh_info should be zero\n"
 msgstr "section [%2d] '%s': sh_info should be zero\n"
 
-#: src/elflint.c:1215
+#: src/elflint.c:1245
 #, c-format
 msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
 msgstr "section [%2d] '%s': no relocations for merge-able sections possible\n"
 
-#: src/elflint.c:1222
+#: src/elflint.c:1253
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
 msgstr "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
 
-#: src/elflint.c:1282
+#: src/elflint.c:1313
 #, c-format
 msgid "text relocation flag set but there is no read-only segment\n"
 msgstr "text relocation flag set but there is no read-only segment\n"
 
-#: src/elflint.c:1309
+#: src/elflint.c:1340
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: invalid type\n"
 msgstr "section [%2d] '%s': relocation %zu: invalid type\n"
 
-#: src/elflint.c:1317
+#: src/elflint.c:1348
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: relocation type invalid for the file "
@@ -1698,26 +1766,26 @@ msgstr ""
 "section [%2d] '%s': relocation %zu: relocation type invalid for the file "
 "type\n"
 
-#: src/elflint.c:1325
+#: src/elflint.c:1356
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
 msgstr "section [%2d] '%s': relocation %zu: invalid symbol index\n"
 
-#: src/elflint.c:1343
+#: src/elflint.c:1374
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
 "be used with %s\n"
 msgstr ""
-"section [%2d] '%s': relocation %zu: only symbol \e[1m_GLOBAL_OFFSET_TABLE_\e"
-"[0m’ can be used with %s\n"
+"section [%2d] '%s': relocation %zu: only symbol "
+"\e[1m_GLOBAL_OFFSET_TABLE_\e[0m’ can be used with %s\n"
 
-#: src/elflint.c:1360
+#: src/elflint.c:1391
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
 msgstr "section [%2d] '%s': relocation %zu: offset out of bounds\n"
 
-#: src/elflint.c:1375
+#: src/elflint.c:1406
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: copy relocation against symbol of type "
@@ -1726,7 +1794,7 @@ msgstr ""
 "section [%2d] '%s': relocation %zu: copy relocation against symbol of type "
 "%s\n"
 
-#: src/elflint.c:1396
+#: src/elflint.c:1427
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: read-only section modified but text "
@@ -1735,64 +1803,64 @@ msgstr ""
 "section [%2d] '%s': relocation %zu: read-only section modified but text "
 "relocation flag not set\n"
 
-#: src/elflint.c:1411
+#: src/elflint.c:1442
 #, c-format
 msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
 msgstr "section [%2d] '%s': relocations are against loaded and unloaded data\n"
 
-#: src/elflint.c:1450 src/elflint.c:1500
+#: src/elflint.c:1482 src/elflint.c:1533
 #, c-format
 msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
 msgstr "section [%2d] '%s': cannot get relocation %zu: %s\n"
 
-#: src/elflint.c:1576
+#: src/elflint.c:1609
 #, c-format
 msgid "more than one dynamic section present\n"
 msgstr "more than one dynamic section present\n"
 
-#: src/elflint.c:1594
+#: src/elflint.c:1628
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
 msgstr "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
 
-#: src/elflint.c:1599 src/elflint.c:1882
+#: src/elflint.c:1633 src/elflint.c:1918
 #, c-format
 msgid "section [%2d] '%s': sh_info not zero\n"
 msgstr "section [%2d] '%s': sh_info not zero\n"
 
-#: src/elflint.c:1609
+#: src/elflint.c:1643
 #, c-format
 msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
 msgstr "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
 
-#: src/elflint.c:1617
+#: src/elflint.c:1651
 #, c-format
 msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
 msgstr "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
 
-#: src/elflint.c:1624
+#: src/elflint.c:1658
 #, c-format
 msgid "section [%2d] '%s': entry %zu: unknown tag\n"
 msgstr "section [%2d] '%s': entry %zu: unknown tag\n"
 
-#: src/elflint.c:1635
+#: src/elflint.c:1669
 #, c-format
 msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
 msgstr "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
 
-#: src/elflint.c:1645
+#: src/elflint.c:1679
 #, c-format
 msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
 msgstr "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
 
-#: src/elflint.c:1663
+#: src/elflint.c:1697
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
 msgstr ""
 "section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
 
-#: src/elflint.c:1676
+#: src/elflint.c:1710
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: pointer does not match address of section "
@@ -1801,14 +1869,14 @@ msgstr ""
 "section [%2d] '%s': entry %zu: pointer does not match address of section "
 "[%2d] ‘\e[1m%s\e[0m’ referenced by sh_link\n"
 
-#: src/elflint.c:1719
+#: src/elflint.c:1753
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
 msgstr ""
 "section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
 
-#: src/elflint.c:1734
+#: src/elflint.c:1768
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: %s value must be valid offset in section "
@@ -1817,71 +1885,71 @@ msgstr ""
 "section [%2d] '%s': entry %zu: %s value must be valid offset in section "
 "[%2d] ‘\e[1m%s\e[0m’\n"
 
-#: src/elflint.c:1754 src/elflint.c:1782
+#: src/elflint.c:1788 src/elflint.c:1816
 #, c-format
 msgid "section [%2d] '%s': contains %s entry but not %s\n"
 msgstr "section [%2d] '%s': contains %s entry but not %s\n"
 
-#: src/elflint.c:1766
+#: src/elflint.c:1800
 #, c-format
 msgid "section [%2d] '%s': mandatory tag %s not present\n"
 msgstr "section [%2d] '%s': mandatory tag %s not present\n"
 
-#: src/elflint.c:1775
+#: src/elflint.c:1809
 #, c-format
 msgid "section [%2d] '%s': no hash section present\n"
 msgstr "section [%2d] '%s': no hash section present\n"
 
-#: src/elflint.c:1790 src/elflint.c:1797
+#: src/elflint.c:1824 src/elflint.c:1831
 #, c-format
 msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
 msgstr "section [%2d] '%s': not all of %s, %s, and %s are present\n"
 
-#: src/elflint.c:1807 src/elflint.c:1811
+#: src/elflint.c:1841 src/elflint.c:1845
 #, c-format
 msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
 msgstr "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
 
-#: src/elflint.c:1817
+#: src/elflint.c:1851
 #, c-format
 msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
 msgstr "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
 
-#: src/elflint.c:1828 src/elflint.c:1832 src/elflint.c:1836 src/elflint.c:1840
+#: src/elflint.c:1862 src/elflint.c:1866 src/elflint.c:1870 src/elflint.c:1874
 #, c-format
 msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
 msgstr "section [%2d] '%s': %s tag missing in prelinked executable\n"
 
-#: src/elflint.c:1852
+#: src/elflint.c:1886
 #, c-format
 msgid ""
 "section [%2d] '%s': only relocatable files can have extended section index\n"
 msgstr ""
 "section [%2d] '%s': only relocatable files can have extended section index\n"
 
-#: src/elflint.c:1862
+#: src/elflint.c:1896
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index section not for symbol table\n"
 msgstr ""
 "section [%2d] '%s': extended section index section not for symbol table\n"
 
-#: src/elflint.c:1867
+#: src/elflint.c:1901
 #, c-format
 msgid "cannot get data for symbol section\n"
 msgstr "cannot get data for symbol section\n"
 
-#: src/elflint.c:1870
+#: src/elflint.c:1904
 #, c-format
 msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
 msgstr "section [%2d] '%s': entry size does not match Elf32_Word\n"
 
-#: src/elflint.c:1877
+#: src/elflint.c:1913
 #, c-format
 msgid "section [%2d] '%s': extended index table too small for symbol table\n"
 msgstr "section [%2d] '%s': extended index table too small for symbol table\n"
 
-#: src/elflint.c:1892
+#: src/elflint.c:1928
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
@@ -1890,75 +1958,75 @@ msgstr ""
 "section [%2d] '%s': extended section index in section [%2zu] ‘\e[1m%s\e[0m’ "
 "refers to same symbol table\n"
 
-#: src/elflint.c:1903
+#: src/elflint.c:1945
 #, c-format
 msgid "symbol 0 should have zero extended section index\n"
 msgstr "symbol 0 should have zero extended section index\n"
 
-#: src/elflint.c:1915
+#: src/elflint.c:1957
 #, c-format
 msgid "cannot get data for symbol %zu\n"
 msgstr "cannot get data for symbol %zu\n"
 
-#: src/elflint.c:1920
+#: src/elflint.c:1962
 #, c-format
 msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
 msgstr "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
 
-#: src/elflint.c:1936 src/elflint.c:1977
+#: src/elflint.c:1978 src/elflint.c:2029
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
 msgstr ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
 
-#: src/elflint.c:1948 src/elflint.c:1989
+#: src/elflint.c:1990 src/elflint.c:2041
 #, c-format
 msgid "section [%2d] '%s': chain array too large\n"
 msgstr "section [%2d] '%s': chain array too large\n"
 
-#: src/elflint.c:1957 src/elflint.c:1998
+#: src/elflint.c:2004 src/elflint.c:2055
 #, c-format
 msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
 msgstr "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
 
-#: src/elflint.c:1963
+#: src/elflint.c:2014
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
 msgstr "section [%2d] '%s': hash chain reference %zu out of bounds\n"
 
-#: src/elflint.c:2004
+#: src/elflint.c:2065
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
 msgstr "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
 
-#: src/elflint.c:2019
+#: src/elflint.c:2081
 #, c-format
 msgid "section [%2d] '%s': bitmask size not power of 2: %u\n"
 msgstr "section [%2d] '%s': bitmask size not power of 2: %u\n"
 
-#: src/elflint.c:2030
+#: src/elflint.c:2092
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected at "
-"least%ld)\n"
+"least %ld)\n"
 msgstr ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected at "
-"least%ld)\n"
+"least %ld)\n"
 
-#: src/elflint.c:2038
+#: src/elflint.c:2100
 #, c-format
 msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
 msgstr "section [%2d] '%s': 2nd hash function shift too big: %u\n"
 
-#: src/elflint.c:2070
+#: src/elflint.c:2132
 #, c-format
 msgid ""
 "section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
 msgstr ""
 "section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
 
-#: src/elflint.c:2091
+#: src/elflint.c:2153
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
@@ -1967,51 +2035,51 @@ msgstr ""
 "section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
 "undefined\n"
 
-#: src/elflint.c:2102
+#: src/elflint.c:2164
 #, c-format
 msgid ""
 "section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
 msgstr ""
 "section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
 
-#: src/elflint.c:2133
+#: src/elflint.c:2195
 #, c-format
 msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
 msgstr "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
 
-#: src/elflint.c:2138
+#: src/elflint.c:2200
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
 msgstr ""
 "section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
 
-#: src/elflint.c:2144
+#: src/elflint.c:2206
 #, c-format
 msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
 msgstr "section [%2d] '%s': bitmask does not match names in the hash table\n"
 
-#: src/elflint.c:2157
+#: src/elflint.c:2219
 #, c-format
 msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
 msgstr "section [%2d] '%s': relocatable files cannot have hash tables\n"
 
-#: src/elflint.c:2175
+#: src/elflint.c:2237
 #, c-format
 msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
 msgstr "section [%2d] '%s': hash table not for dynamic symbol table\n"
 
-#: src/elflint.c:2183
+#: src/elflint.c:2245
 #, c-format
 msgid "section [%2d] '%s': hash table entry size incorrect\n"
 msgstr "section [%2d] '%s': hash table entry size incorrect\n"
 
-#: src/elflint.c:2188
+#: src/elflint.c:2250
 #, c-format
 msgid "section [%2d] '%s': not marked to be allocated\n"
 msgstr "section [%2d] '%s': not marked to be allocated\n"
 
-#: src/elflint.c:2193
+#: src/elflint.c:2255
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table has not even room for initial administrative "
@@ -2020,19 +2088,19 @@ msgstr ""
 "section [%2d] '%s': hash table has not even room for initial administrative "
 "entries\n"
 
-#: src/elflint.c:2241
+#: src/elflint.c:2303
 #, c-format
 msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
 msgstr ""
 "sh_link in hash sections [%2zu] ‘\e[1m%s\e[0m’ and [%2zu] ‘\e[1m%s\e[0m’ not "
 "identical\n"
 
-#: src/elflint.c:2319 src/elflint.c:2323
+#: src/elflint.c:2381 src/elflint.c:2385
 #, c-format
 msgid "section [%2zu] '%s': reference to symbol index 0\n"
 msgstr "section [%2zu] '%s': reference to symbol index 0\n"
 
-#: src/elflint.c:2330
+#: src/elflint.c:2392
 #, c-format
 msgid ""
 "symbol %d referenced in new hash table in [%2zu] '%s' but not in old hash "
@@ -2041,7 +2109,7 @@ msgstr ""
 "symbol %d referenced in new hash table in [%2zu] ‘\e[1m%s\e[0m’ but not in old "
 "hash table in [%2zu] ‘\e[1m%s\e[0m’\n"
 
-#: src/elflint.c:2342
+#: src/elflint.c:2404
 #, c-format
 msgid ""
 "symbol %d referenced in old hash table in [%2zu] '%s' but not in new hash "
@@ -2050,100 +2118,100 @@ msgstr ""
 "symbol %d referenced in old hash table in [%2zu] ‘\e[1m%s\e[0m’ but not in new "
 "hash table in [%2zu] ‘\e[1m%s\e[0m’\n"
 
-#: src/elflint.c:2358
+#: src/elflint.c:2420
 #, c-format
 msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
 msgstr "section [%2d] '%s': nonzero sh_%s for NULL section\n"
 
-#: src/elflint.c:2378
+#: src/elflint.c:2440
 #, c-format
 msgid ""
 "section [%2d] '%s': section groups only allowed in relocatable object files\n"
 msgstr ""
 "section [%2d] '%s': section groups only allowed in relocatable object files\n"
 
-#: src/elflint.c:2389
+#: src/elflint.c:2451
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol table: %s\n"
 msgstr "section [%2d] '%s': cannot get symbol table: %s\n"
 
-#: src/elflint.c:2394
+#: src/elflint.c:2456
 #, c-format
 msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
 msgstr "section [%2d] '%s': section reference in sh_link is no symbol table\n"
 
-#: src/elflint.c:2400
+#: src/elflint.c:2462
 #, c-format
 msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
 msgstr "section [%2d] '%s': invalid symbol index in sh_info\n"
 
-#: src/elflint.c:2405
+#: src/elflint.c:2467
 #, c-format
 msgid "section [%2d] '%s': sh_flags not zero\n"
 msgstr "section [%2d] '%s': sh_flags not zero\n"
 
-#: src/elflint.c:2412
+#: src/elflint.c:2474
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol for signature\n"
 msgstr "section [%2d] '%s': cannot get symbol for signature\n"
 
-#: src/elflint.c:2417
+#: src/elflint.c:2479
 #, c-format
 msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
 msgstr "section [%2d] '%s': signature symbol cannot be empty string\n"
 
-#: src/elflint.c:2423
+#: src/elflint.c:2485
 #, c-format
 msgid "section [%2d] '%s': sh_flags not set correctly\n"
 msgstr "section [%2d] '%s': sh_flags not set correctly\n"
 
-#: src/elflint.c:2429
+#: src/elflint.c:2491
 #, c-format
 msgid "section [%2d] '%s': cannot get data: %s\n"
 msgstr "section [%2d] '%s': cannot get data: %s\n"
 
-#: src/elflint.c:2438
+#: src/elflint.c:2500
 #, c-format
 msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
 msgstr "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
 
-#: src/elflint.c:2443
+#: src/elflint.c:2505
 #, c-format
 msgid "section [%2d] '%s': section group without flags word\n"
 msgstr "section [%2d] '%s': section group without flags word\n"
 
-#: src/elflint.c:2449
+#: src/elflint.c:2511
 #, c-format
 msgid "section [%2d] '%s': section group without member\n"
 msgstr "section [%2d] '%s': section group without member\n"
 
-#: src/elflint.c:2453
+#: src/elflint.c:2515
 #, c-format
 msgid "section [%2d] '%s': section group with only one member\n"
 msgstr "section [%2d] '%s': section group with only one member\n"
 
-#: src/elflint.c:2464
+#: src/elflint.c:2526
 #, c-format
 msgid "section [%2d] '%s': unknown section group flags\n"
 msgstr "section [%2d] '%s': unknown section group flags\n"
 
-#: src/elflint.c:2476
+#: src/elflint.c:2538
 #, c-format
 msgid "section [%2d] '%s': section index %Zu out of range\n"
 msgstr "section [%2d] '%s': section index %Zu out of range\n"
 
-#: src/elflint.c:2485
+#: src/elflint.c:2547
 #, c-format
 msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
 msgstr "section [%2d] '%s': cannot get section header for element %zu: %s\n"
 
-#: src/elflint.c:2492
+#: src/elflint.c:2554
 #, c-format
 msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
 msgstr ""
 "section [%2d] '%s': section group contains another group [%2d] ‘\e[1m%s\e[0m’\n"
 
-#: src/elflint.c:2498
+#: src/elflint.c:2560
 #, c-format
 msgid ""
 "section [%2d] '%s': element %Zu references section [%2d] '%s' without "
@@ -2152,12 +2220,12 @@ msgstr ""
 "section [%2d] '%s': element %Zu references section [%2d] ‘\e[1m%s\e[0m’ without "
 "SHF_GROUP flag set\n"
 
-#: src/elflint.c:2505
+#: src/elflint.c:2567
 #, c-format
 msgid "section [%2d] '%s' is contained in more than one section group\n"
 msgstr "section [%2d] ‘\e[1m%s\e[0m’ is contained in more than one section group\n"
 
-#: src/elflint.c:2694
+#: src/elflint.c:2756
 #, c-format
 msgid ""
 "section [%2d] '%s' refers in sh_link to section [%2d] '%s' which is no "
@@ -2166,7 +2234,7 @@ msgstr ""
 "section [%2d] ‘\e[1m%s\e[0m’ refers in sh_link to section [%2d] ‘\e[1m%s\e[0m’ which "
 "is no dynamic symbol table\n"
 
-#: src/elflint.c:2705
+#: src/elflint.c:2768
 #, c-format
 msgid ""
 "section [%2d] '%s' has different number of entries than symbol table [%2d] "
@@ -2175,76 +2243,76 @@ msgstr ""
 "section [%2d] ‘\e[1m%s\e[0m’ has different number of entries than symbol table "
 "[%2d] ‘\e[1m%s\e[0m’\n"
 
-#: src/elflint.c:2721
+#: src/elflint.c:2784
 #, c-format
 msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
 msgstr "section [%2d] '%s': symbol %d: cannot read version data\n"
 
-#: src/elflint.c:2737
+#: src/elflint.c:2800
 #, c-format
 msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
 msgstr "section [%2d] '%s': symbol %d: local symbol with global scope\n"
 
-#: src/elflint.c:2745
+#: src/elflint.c:2808
 #, c-format
 msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
 msgstr "section [%2d] '%s': symbol %d: local symbol with version\n"
 
-#: src/elflint.c:2759
+#: src/elflint.c:2822
 #, c-format
 msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
 msgstr "section [%2d] '%s': symbol %d: invalid version index %d\n"
 
-#: src/elflint.c:2764
+#: src/elflint.c:2827
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: version index %d is for defined version\n"
 msgstr ""
 "section [%2d] '%s': symbol %d: version index %d is for defined version\n"
 
-#: src/elflint.c:2774
+#: src/elflint.c:2837
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: version index %d is for requested version\n"
 msgstr ""
 "section [%2d] '%s': symbol %d: version index %d is for requested version\n"
 
-#: src/elflint.c:2826
+#: src/elflint.c:2889
 #, c-format
 msgid "more than one version reference section present\n"
 msgstr "more than one version reference section present\n"
 
-#: src/elflint.c:2834 src/elflint.c:2963
+#: src/elflint.c:2897 src/elflint.c:3026
 #, c-format
 msgid "section [%2d] '%s': sh_link does not link to string table\n"
 msgstr "section [%2d] '%s': sh_link does not link to string table\n"
 
-#: src/elflint.c:2857 src/elflint.c:3015
+#: src/elflint.c:2920 src/elflint.c:3078
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong version %d\n"
 msgstr "section [%2d] '%s': entry %d has wrong version %d\n"
 
-#: src/elflint.c:2863 src/elflint.c:3021
+#: src/elflint.c:2926 src/elflint.c:3084
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
 msgstr "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
 
-#: src/elflint.c:2871
+#: src/elflint.c:2934
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid file reference\n"
 msgstr "section [%2d] '%s': entry %d has invalid file reference\n"
 
-#: src/elflint.c:2879
+#: src/elflint.c:2942
 #, c-format
 msgid "section [%2d] '%s': entry %d references unknown dependency\n"
 msgstr "section [%2d] '%s': entry %d references unknown dependency\n"
 
-#: src/elflint.c:2891
+#: src/elflint.c:2954
 #, c-format
 msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
 msgstr "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
 
-#: src/elflint.c:2898
+#: src/elflint.c:2961
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
@@ -2253,7 +2321,7 @@ msgstr ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
 "reference\n"
 
-#: src/elflint.c:2905
+#: src/elflint.c:2968
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: "
@@ -2262,7 +2330,7 @@ msgstr ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: "
 "%#x, expected %#x\n"
 
-#: src/elflint.c:2915
+#: src/elflint.c:2978
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
@@ -2271,210 +2339,210 @@ msgstr ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
 "name ‘\e[1m%s\e[0m’\n"
 
-#: src/elflint.c:2926
+#: src/elflint.c:2989
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
 msgstr ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
 
-#: src/elflint.c:2942 src/elflint.c:3100
+#: src/elflint.c:3005 src/elflint.c:3163
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
 msgstr "section [%2d] '%s': entry %d has invalid offset to next entry\n"
 
-#: src/elflint.c:2955
+#: src/elflint.c:3018
 #, c-format
 msgid "more than one version definition section present\n"
 msgstr "more than one version definition section present\n"
 
-#: src/elflint.c:3000
+#: src/elflint.c:3063
 #, c-format
 msgid "section [%2d] '%s': more than one BASE definition\n"
 msgstr "section [%2d] '%s': more than one BASE definition\n"
 
-#: src/elflint.c:3004
+#: src/elflint.c:3067
 #, c-format
 msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
 msgstr "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
 
-#: src/elflint.c:3010
+#: src/elflint.c:3073
 #, c-format
 msgid "section [%2d] '%s': entry %d has unknown flag\n"
 msgstr "section [%2d] '%s': entry %d has unknown flag\n"
 
-#: src/elflint.c:3034
+#: src/elflint.c:3097
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid name reference\n"
 msgstr "section [%2d] '%s': entry %d has invalid name reference\n"
 
-#: src/elflint.c:3041
+#: src/elflint.c:3104
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
 msgstr "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
 
-#: src/elflint.c:3050
+#: src/elflint.c:3113
 #, c-format
 msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
 msgstr "section [%2d] '%s': entry %d has duplicate version name ‘\e[1m%s\e[0m’\n"
 
-#: src/elflint.c:3069
+#: src/elflint.c:3132
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
 msgstr ""
 "section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
 
-#: src/elflint.c:3084
+#: src/elflint.c:3147
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
 msgstr "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
 
-#: src/elflint.c:3106
+#: src/elflint.c:3169
 #, c-format
 msgid "section [%2d] '%s': no BASE definition\n"
 msgstr "section [%2d] '%s': no BASE definition\n"
 
-#: src/elflint.c:3122
+#: src/elflint.c:3185
 #, c-format
 msgid "section [%2d] '%s': unknown parent version '%s'\n"
 msgstr "section [%2d] '%s': unknown parent version ‘\e[1m%s\e[0m’\n"
 
-#: src/elflint.c:3135
+#: src/elflint.c:3198
 #, c-format
 msgid "section [%2d] '%s': empty object attributes section\n"
 msgstr "section [%2d] '%s': empty object attributes section\n"
 
-#: src/elflint.c:3156
+#: src/elflint.c:3219
 #, c-format
 msgid "section [%2d] '%s': unrecognized attribute format\n"
 msgstr "section [%2d] '%s': unrecognized attribute format\n"
 
-#: src/elflint.c:3172
+#: src/elflint.c:3235
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
 msgstr ""
 "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
 
-#: src/elflint.c:3181
+#: src/elflint.c:3244
 #, c-format
 msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
 msgstr "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
 
-#: src/elflint.c:3193
+#: src/elflint.c:3256
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
 msgstr "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
 
-#: src/elflint.c:3210
+#: src/elflint.c:3273
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
 msgstr ""
 "section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
 
-#: src/elflint.c:3219
+#: src/elflint.c:3282
 #, c-format
 msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
 msgstr "section [%2d] '%s': offset %zu: truncated attribute section\n"
 
-#: src/elflint.c:3228
+#: src/elflint.c:3291
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
 msgstr ""
 "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
 
-#: src/elflint.c:3241
+#: src/elflint.c:3304
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
 msgstr ""
 "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
 
-#: src/elflint.c:3252
+#: src/elflint.c:3315
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
 msgstr ""
 "section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
 
-#: src/elflint.c:3270
+#: src/elflint.c:3333
 #, c-format
 msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
 msgstr "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
 
-#: src/elflint.c:3281
+#: src/elflint.c:3344
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
 msgstr "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
 
-#: src/elflint.c:3294
+#: src/elflint.c:3357
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
 msgstr "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
 
-#: src/elflint.c:3298
+#: src/elflint.c:3361
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
 msgstr ""
 "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
 
-#: src/elflint.c:3308
+#: src/elflint.c:3371
 #, c-format
 msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
 msgstr "section [%2d] '%s': offset %zu: vendor ‘\e[1m%s\e[0m’ unknown\n"
 
-#: src/elflint.c:3314
+#: src/elflint.c:3377
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
 msgstr ""
 "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
 
-#: src/elflint.c:3403
+#: src/elflint.c:3466
 #, c-format
 msgid "cannot get section header of zeroth section\n"
 msgstr "cannot get section header of zeroth section\n"
 
-#: src/elflint.c:3407
+#: src/elflint.c:3470
 #, c-format
 msgid "zeroth section has nonzero name\n"
 msgstr "zeroth section has nonzero name\n"
 
-#: src/elflint.c:3409
+#: src/elflint.c:3472
 #, c-format
 msgid "zeroth section has nonzero type\n"
 msgstr "zeroth section has nonzero type\n"
 
-#: src/elflint.c:3411
+#: src/elflint.c:3474
 #, c-format
 msgid "zeroth section has nonzero flags\n"
 msgstr "zeroth section has nonzero flags\n"
 
-#: src/elflint.c:3413
+#: src/elflint.c:3476
 #, c-format
 msgid "zeroth section has nonzero address\n"
 msgstr "zeroth section has nonzero address\n"
 
-#: src/elflint.c:3415
+#: src/elflint.c:3478
 #, c-format
 msgid "zeroth section has nonzero offset\n"
 msgstr "zeroth section has nonzero offset\n"
 
-#: src/elflint.c:3417
+#: src/elflint.c:3480
 #, c-format
 msgid "zeroth section has nonzero align value\n"
 msgstr "zeroth section has nonzero align value\n"
 
-#: src/elflint.c:3419
+#: src/elflint.c:3482
 #, c-format
 msgid "zeroth section has nonzero entry size value\n"
 msgstr "zeroth section has nonzero entry size value\n"
 
-#: src/elflint.c:3422
+#: src/elflint.c:3485
 #, c-format
 msgid ""
 "zeroth section has nonzero size value while ELF header has nonzero shnum "
@@ -2483,7 +2551,7 @@ msgstr ""
 "zeroth section has nonzero size value while ELF header has nonzero shnum "
 "value\n"
 
-#: src/elflint.c:3426
+#: src/elflint.c:3489
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
@@ -2492,7 +2560,7 @@ msgstr ""
 "zeroth section has nonzero link value while ELF header does not signal "
 "overflow in shstrndx\n"
 
-#: src/elflint.c:3430
+#: src/elflint.c:3493
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
@@ -2501,27 +2569,27 @@ msgstr ""
 "zeroth section has nonzero link value while ELF header does not signal "
 "overflow in phnum\n"
 
-#: src/elflint.c:3447
+#: src/elflint.c:3510
 #, c-format
 msgid "cannot get section header for section [%2zu] '%s': %s\n"
 msgstr "cannot get section header for section [%2zu] '%s': %s\n"
 
-#: src/elflint.c:3456
+#: src/elflint.c:3519
 #, c-format
 msgid "section [%2zu]: invalid name\n"
 msgstr "section [%2zu]: invalid name\n"
 
-#: src/elflint.c:3483
+#: src/elflint.c:3546
 #, c-format
 msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
 msgstr "section [%2d] ‘\e[1m%s\e[0m’ has wrong type: expected %s, is %s\n"
 
-#: src/elflint.c:3499
+#: src/elflint.c:3562
 #, c-format
 msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
 msgstr "section [%2zu] ‘\e[1m%s\e[0m’ has wrong flags: expected %s, is %s\n"
 
-#: src/elflint.c:3516
+#: src/elflint.c:3579
 #, c-format
 msgid ""
 "section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
@@ -2529,12 +2597,12 @@ msgstr ""
 "section [%2zu] ‘\e[1m%s\e[0m’ has wrong flags: expected %s and possibly %s, is "
 "%s\n"
 
-#: src/elflint.c:3534
+#: src/elflint.c:3597
 #, c-format
 msgid "section [%2zu] '%s' present in object file\n"
 msgstr "section [%2zu] ‘\e[1m%s\e[0m’ present in object file\n"
 
-#: src/elflint.c:3540 src/elflint.c:3572
+#: src/elflint.c:3603 src/elflint.c:3635
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
@@ -2542,7 +2610,7 @@ msgstr ""
 "section [%2zu] ‘\e[1m%s\e[0m’ has SHF_ALLOC flag set but there is no loadable "
 "segment\n"
 
-#: src/elflint.c:3545 src/elflint.c:3577
+#: src/elflint.c:3608 src/elflint.c:3640
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
@@ -2551,7 +2619,7 @@ msgstr ""
 "section [%2zu] ‘\e[1m%s\e[0m’ has SHF_ALLOC flag not set but there are loadable "
 "segments\n"
 
-#: src/elflint.c:3553
+#: src/elflint.c:3616
 #, c-format
 msgid ""
 "section [%2zu] '%s' is extension section index table in non-object file\n"
@@ -2559,22 +2627,22 @@ msgstr ""
 "section [%2zu] ‘\e[1m%s\e[0m’ is extension section index table in non-object "
 "file\n"
 
-#: src/elflint.c:3596
+#: src/elflint.c:3659
 #, c-format
 msgid "section [%2zu] '%s': size not multiple of entry size\n"
 msgstr "section [%2zu] '%s': size not multiple of entry size\n"
 
-#: src/elflint.c:3601
+#: src/elflint.c:3664
 #, c-format
 msgid "cannot get section header\n"
 msgstr "cannot get section header\n"
 
-#: src/elflint.c:3611
+#: src/elflint.c:3674
 #, c-format
 msgid "section [%2zu] '%s' has unsupported type %d\n"
 msgstr "section [%2zu] ‘\e[1m%s\e[0m’ has unsupported type %d\n"
 
-#: src/elflint.c:3625
+#: src/elflint.c:3688
 #, c-format
 msgid ""
 "section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
@@ -2582,48 +2650,48 @@ msgstr ""
 "section [%2zu] ‘\e[1m%s\e[0m’ contains invalid processor-specific flag(s) "
 "%#<PRIx64>\n"
 
-#: src/elflint.c:3632
+#: src/elflint.c:3695
 #, c-format
 msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
 msgstr "section [%2zu] ‘\e[1m%s\e[0m’ contains unknown flag(s) %#<PRIx64>\n"
 
-#: src/elflint.c:3640
+#: src/elflint.c:3703
 #, c-format
 msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
 msgstr "section [%2zu] '%s': thread-local data sections address not zero\n"
 
-#: src/elflint.c:3648
+#: src/elflint.c:3711
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in link value\n"
 msgstr "section [%2zu] '%s': invalid section reference in link value\n"
 
-#: src/elflint.c:3653
+#: src/elflint.c:3716
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in info value\n"
 msgstr "section [%2zu] '%s': invalid section reference in info value\n"
 
-#: src/elflint.c:3660
+#: src/elflint.c:3723
 #, c-format
 msgid "section [%2zu] '%s': strings flag set without merge flag\n"
 msgstr "section [%2zu] '%s': strings flag set without merge flag\n"
 
-#: src/elflint.c:3665
+#: src/elflint.c:3728
 #, c-format
 msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
 msgstr "section [%2zu] '%s': merge flag set but entry size is zero\n"
 
-#: src/elflint.c:3683
+#: src/elflint.c:3746
 #, c-format
 msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
 msgstr ""
 "section [%2zu] ‘\e[1m%s\e[0m’ has unexpected type %d for an executable section\n"
 
-#: src/elflint.c:3692
+#: src/elflint.c:3755
 #, c-format
 msgid "section [%2zu] '%s' is both executable and writable\n"
 msgstr "section [%2zu] ‘\e[1m%s\e[0m’ is both executable and writable\n"
 
-#: src/elflint.c:3721
+#: src/elflint.c:3784
 #, c-format
 msgid ""
 "section [%2zu] '%s' not fully contained in segment of program header entry "
@@ -2632,7 +2700,7 @@ msgstr ""
 "section [%2zu] ‘\e[1m%s\e[0m’ not fully contained in segment of program header "
 "entry %d\n"
 
-#: src/elflint.c:3729
+#: src/elflint.c:3792
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
@@ -2641,7 +2709,7 @@ msgstr ""
 "section [%2zu] ‘\e[1m%s\e[0m’ has type NOBITS but is read from the file in "
 "segment of program header entry %d\n"
 
-#: src/elflint.c:3738
+#: src/elflint.c:3801
 #, c-format
 msgid ""
 "section [%2zu] '%s' has not type NOBITS but is not read from the file in "
@@ -2650,24 +2718,24 @@ msgstr ""
 "section [%2zu] ‘\e[1m%s\e[0m’ has not type NOBITS but is not read from the file "
 "in segment of program header entry %d\n"
 
-#: src/elflint.c:3749
+#: src/elflint.c:3812
 #, c-format
 msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
 msgstr "section [%2zu] ‘\e[1m%s\e[0m’ is executable in nonexecutable segment %d\n"
 
-#: src/elflint.c:3759
+#: src/elflint.c:3822
 #, c-format
 msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
 msgstr "section [%2zu] ‘\e[1m%s\e[0m’ is writable in unwritable segment %d\n"
 
-#: src/elflint.c:3769
+#: src/elflint.c:3832
 #, c-format
 msgid ""
 "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
 msgstr ""
 "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
 
-#: src/elflint.c:3775
+#: src/elflint.c:3838
 #, c-format
 msgid ""
 "section [%2zu] '%s': ELF header says this is the section header string table "
@@ -2676,36 +2744,36 @@ msgstr ""
 "section [%2zu] '%s': ELF header says this is the section header string table "
 "but type is not SHT_TYPE\n"
 
-#: src/elflint.c:3783
+#: src/elflint.c:3846
 #, c-format
 msgid ""
 "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
 msgstr ""
 "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
 
-#: src/elflint.c:3834
+#: src/elflint.c:3897
 #, c-format
 msgid "more than one version symbol table present\n"
 msgstr "more than one version symbol table present\n"
 
-#: src/elflint.c:3857
+#: src/elflint.c:3920
 #, c-format
 msgid "INTERP program header entry but no .interp section\n"
 msgstr "INTERP program header entry but no .interp section\n"
 
-#: src/elflint.c:3868
+#: src/elflint.c:3931
 #, c-format
 msgid ""
 "loadable segment [%u] is executable but contains no executable sections\n"
 msgstr ""
 "loadable segment [%u] is executable but contains no executable sections\n"
 
-#: src/elflint.c:3874
+#: src/elflint.c:3937
 #, c-format
 msgid "loadable segment [%u] is writable but contains no writable sections\n"
 msgstr "loadable segment [%u] is writable but contains no writable sections\n"
 
-#: src/elflint.c:3885
+#: src/elflint.c:3948
 #, c-format
 msgid ""
 "no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
@@ -2714,194 +2782,194 @@ msgstr ""
 "no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
 "exist\n"
 
-#: src/elflint.c:3898
+#: src/elflint.c:3961
 #, c-format
 msgid "duplicate version index %d\n"
 msgstr "duplicate version index %d\n"
 
-#: src/elflint.c:3912
+#: src/elflint.c:3975
 #, c-format
 msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
 msgstr ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
 
-#: src/elflint.c:3961
+#: src/elflint.c:4024
 #, c-format
 msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
 msgstr "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
 
-#: src/elflint.c:3965
+#: src/elflint.c:4028
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
 msgstr ""
 "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
 
-#: src/elflint.c:3988
+#: src/elflint.c:4051
 #, c-format
 msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
 msgstr "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
 
-#: src/elflint.c:3992
+#: src/elflint.c:4055
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
 msgstr ""
 "section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
 
-#: src/elflint.c:4009
+#: src/elflint.c:4072
 #, c-format
 msgid "phdr[%d]: no note entries defined for the type of file\n"
 msgstr "phdr[%d]: no note entries defined for the type of file\n"
 
-#: src/elflint.c:4028
+#: src/elflint.c:4091
 #, c-format
 msgid "phdr[%d]: cannot get content of note section: %s\n"
 msgstr "phdr[%d]: cannot get content of note section: %s\n"
 
-#: src/elflint.c:4031
+#: src/elflint.c:4094
 #, c-format
 msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
 msgstr "phdr[%d]: extra %<PRIu64> bytes after last note\n"
 
-#: src/elflint.c:4052
+#: src/elflint.c:4115
 #, c-format
 msgid "section [%2d] '%s': no note entries defined for the type of file\n"
 msgstr "section [%2d] '%s': no note entries defined for the type of file\n"
 
-#: src/elflint.c:4059
+#: src/elflint.c:4122
 #, c-format
 msgid "section [%2d] '%s': cannot get content of note section\n"
 msgstr "section [%2d] '%s': cannot get content of note section\n"
 
-#: src/elflint.c:4062
+#: src/elflint.c:4125
 #, c-format
 msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
 msgstr "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
 
-#: src/elflint.c:4080
+#: src/elflint.c:4143
 #, c-format
 msgid ""
 "only executables, shared objects, and core files can have program headers\n"
 msgstr ""
 "only executables, shared objects, and core files can have program headers\n"
 
-#: src/elflint.c:4095
+#: src/elflint.c:4158
 #, c-format
 msgid "cannot get program header entry %d: %s\n"
 msgstr "cannot get program header entry %d: %s\n"
 
-#: src/elflint.c:4104
+#: src/elflint.c:4167
 #, c-format
 msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
 msgstr ""
 "program header entry %d: unknown program header entry type %#<PRIx64>\n"
 
-#: src/elflint.c:4115
+#: src/elflint.c:4178
 #, c-format
 msgid "more than one INTERP entry in program header\n"
 msgstr "more than one INTERP entry in program header\n"
 
-#: src/elflint.c:4123
+#: src/elflint.c:4186
 #, c-format
 msgid "more than one TLS entry in program header\n"
 msgstr "more than one TLS entry in program header\n"
 
-#: src/elflint.c:4130
+#: src/elflint.c:4193
 #, c-format
 msgid "static executable cannot have dynamic sections\n"
 msgstr "static executable cannot have dynamic sections\n"
 
-#: src/elflint.c:4144
+#: src/elflint.c:4207
 #, c-format
 msgid "dynamic section reference in program header has wrong offset\n"
 msgstr "dynamic section reference in program header has wrong offset\n"
 
-#: src/elflint.c:4147
+#: src/elflint.c:4210
 #, c-format
 msgid "dynamic section size mismatch in program and section header\n"
 msgstr "dynamic section size mismatch in program and section header\n"
 
-#: src/elflint.c:4157
+#: src/elflint.c:4220
 #, c-format
 msgid "more than one GNU_RELRO entry in program header\n"
 msgstr "more than one GNU_RELRO entry in program header\n"
 
-#: src/elflint.c:4178
+#: src/elflint.c:4241
 #, c-format
 msgid "loadable segment GNU_RELRO applies to is not writable\n"
 msgstr "loadable segment GNU_RELRO applies to is not writable\n"
 
-#: src/elflint.c:4181
+#: src/elflint.c:4244
 #, c-format
 msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
 msgstr "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
 
-#: src/elflint.c:4189 src/elflint.c:4212
+#: src/elflint.c:4252 src/elflint.c:4275
 #, c-format
 msgid "%s segment not contained in a loaded segment\n"
 msgstr "%s segment not contained in a loaded segment\n"
 
-#: src/elflint.c:4218
+#: src/elflint.c:4281
 #, c-format
 msgid "program header offset in ELF header and PHDR entry do not match"
 msgstr "program header offset in ELF header and PHDR entry do not match"
 
-#: src/elflint.c:4242
+#: src/elflint.c:4305
 #, c-format
 msgid "call frame search table reference in program header has wrong offset\n"
 msgstr "call frame search table reference in program header has wrong offset\n"
 
-#: src/elflint.c:4245
+#: src/elflint.c:4308
 #, c-format
 msgid "call frame search table size mismatch in program and section header\n"
 msgstr "call frame search table size mismatch in program and section header\n"
 
-#: src/elflint.c:4258
+#: src/elflint.c:4321
 #, c-format
 msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
 msgstr "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
 
-#: src/elflint.c:4266
+#: src/elflint.c:4329
 #, c-format
 msgid "call frame search table must be allocated\n"
 msgstr "call frame search table must be allocated\n"
 
-#: src/elflint.c:4269
+#: src/elflint.c:4332
 #, c-format
 msgid "section [%2zu] '%s' must be allocated\n"
 msgstr "section [%2zu] ‘\e[1m%s\e[0m’ must be allocated\n"
 
-#: src/elflint.c:4273
+#: src/elflint.c:4336
 #, c-format
 msgid "call frame search table must not be writable\n"
 msgstr "call frame search table must not be writable\n"
 
-#: src/elflint.c:4276
+#: src/elflint.c:4339
 #, c-format
 msgid "section [%2zu] '%s' must not be writable\n"
 msgstr "section [%2zu] ‘\e[1m%s\e[0m’ must not be writable\n"
 
-#: src/elflint.c:4281
+#: src/elflint.c:4344
 #, c-format
 msgid "call frame search table must not be executable\n"
 msgstr "call frame search table must not be executable\n"
 
-#: src/elflint.c:4284
+#: src/elflint.c:4347
 #, c-format
 msgid "section [%2zu] '%s' must not be executable\n"
 msgstr "section [%2zu] ‘\e[1m%s\e[0m’ must not be executable\n"
 
-#: src/elflint.c:4295
+#: src/elflint.c:4358
 #, c-format
 msgid "program header entry %d: file size greater than memory size\n"
 msgstr "program header entry %d: file size greater than memory size\n"
 
-#: src/elflint.c:4302
+#: src/elflint.c:4365
 #, c-format
 msgid "program header entry %d: alignment not a power of 2\n"
 msgstr "program header entry %d: alignment not a power of 2\n"
 
-#: src/elflint.c:4305
+#: src/elflint.c:4368
 #, c-format
 msgid ""
 "program header entry %d: file offset and virtual address not module of "
@@ -2910,7 +2978,7 @@ msgstr ""
 "program header entry %d: file offset and virtual address not module of "
 "alignment\n"
 
-#: src/elflint.c:4318
+#: src/elflint.c:4381
 #, c-format
 msgid ""
 "executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
@@ -2919,12 +2987,12 @@ msgstr ""
 "executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
 "program header entry"
 
-#: src/elflint.c:4352
+#: src/elflint.c:4415
 #, c-format
 msgid "cannot read ELF header: %s\n"
 msgstr "cannot read ELF header: %s\n"
 
-#: src/elflint.c:4378
+#: src/elflint.c:4441
 #, c-format
 msgid "text relocation flag set but not needed\n"
 msgstr "text relocation flag set but not needed\n"
@@ -3441,7 +3509,8 @@ msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
 msgstr ""
 "Warning: size of ‘\e[1m%s\e[0m’ changed from %<PRIu64> in %s to %<PRIu64> in %s"
 
-#: src/ldgeneric.c:651 src/ldgeneric.c:1112 src/readelf.c:640 src/strip.c:562
+#: src/ldgeneric.c:651 src/ldgeneric.c:1112 src/readelf.c:527
+#: src/readelf.c:829 src/strip.c:563
 #, c-format
 msgid "cannot determine number of sections: %s"
 msgstr "cannot determine number of sections: %s"
@@ -3677,7 +3746,7 @@ msgstr "internal error: non-nobits section follows nobits section"
 msgid "cannot get header of 0th section: %s"
 msgstr "cannot get header of 0th section: %s"
 
-#: src/ldgeneric.c:6930 src/unstrip.c:1810
+#: src/ldgeneric.c:6930 src/unstrip.c:1818
 #, c-format
 msgid "cannot update ELF header: %s"
 msgstr "cannot update ELF header: %s"
@@ -3843,7 +3912,7 @@ msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
 msgstr "%s: INTERNAL ERROR %d (%s-%s): %s"
 
 #: src/nm.c:398 src/nm.c:410 src/size.c:309 src/size.c:318 src/size.c:329
-#: src/strip.c:2124
+#: src/strip.c:2155
 #, c-format
 msgid "while closing '%s'"
 msgstr "while closing ‘\e[1m%s\e[0m’"
@@ -3886,17 +3955,17 @@ msgstr "%s%s%s: file format not recognized"
 msgid "cannot create search tree"
 msgstr "cannot create search tree"
 
-#: src/nm.c:757 src/nm.c:1156 src/objdump.c:787 src/readelf.c:896
-#: src/readelf.c:1039 src/readelf.c:1187 src/readelf.c:1369 src/readelf.c:1569
-#: src/readelf.c:1755 src/readelf.c:1965 src/readelf.c:2219 src/readelf.c:2285
-#: src/readelf.c:2363 src/readelf.c:2861 src/readelf.c:2897 src/readelf.c:2959
-#: src/readelf.c:7270 src/readelf.c:8176 src/readelf.c:8323 src/readelf.c:8391
-#: src/size.c:417 src/size.c:491 src/strip.c:502
+#: src/nm.c:757 src/nm.c:1163 src/objdump.c:787 src/readelf.c:536
+#: src/readelf.c:1085 src/readelf.c:1245 src/readelf.c:1393 src/readelf.c:1579
+#: src/readelf.c:1785 src/readelf.c:1972 src/readelf.c:2196 src/readelf.c:2454
+#: src/readelf.c:2524 src/readelf.c:2606 src/readelf.c:3117 src/readelf.c:3153
+#: src/readelf.c:3216 src/readelf.c:7920 src/readelf.c:9002 src/readelf.c:9149
+#: src/readelf.c:9217 src/size.c:417 src/size.c:487 src/strip.c:503
 #, c-format
 msgid "cannot get section header string table index"
 msgstr "cannot get section header string table index"
 
-#: src/nm.c:782
+#: src/nm.c:784
 #, c-format
 msgid ""
 "\n"
@@ -3909,7 +3978,7 @@ msgstr ""
 "Symbols from %s:\n"
 "\n"
 
-#: src/nm.c:785
+#: src/nm.c:787
 #, c-format
 msgid ""
 "%*s%-*s %-*s Class  Type     %-*s %*s Section\n"
@@ -3918,22 +3987,22 @@ msgstr ""
 "%*s%-*s %-*s Class  Type     %-*s %*s Section\n"
 "\n"
 
-#: src/nm.c:1166
+#: src/nm.c:1173
 #, c-format
 msgid "%s: entry size in section `%s' is not what we expect"
 msgstr "%s: entry size in section ‘\e[1m%s\e[0m’ is not what we expect"
 
-#: src/nm.c:1170
+#: src/nm.c:1177
 #, c-format
 msgid "%s: size of section `%s' is not multiple of entry size"
 msgstr "%s: size of section ‘\e[1m%s\e[0m’ is not multiple of entry size"
 
-#: src/nm.c:1428
+#: src/nm.c:1435
 #, c-format
 msgid "%s%s%s%s: Invalid operation"
 msgstr "%s%s%s%s: Invalid operation"
 
-#: src/nm.c:1485
+#: src/nm.c:1492
 #, c-format
 msgid "%s%s%s: no symbols"
 msgstr "%s%s%s: no symbols"
@@ -3966,7 +4035,7 @@ msgstr "Only display information for section NAME."
 msgid "Show information from FILEs (a.out by default)."
 msgstr "Show information from FILEs (a.out by default)."
 
-#: src/objdump.c:236 src/readelf.c:439
+#: src/objdump.c:236 src/readelf.c:473
 msgid "No operation specified.\n"
 msgstr "No operation specified.\n"
 
@@ -3975,11 +4044,11 @@ msgstr "No operation specified.\n"
 msgid "while close `%s'"
 msgstr "while close ‘\e[1m%s\e[0m’"
 
-#: src/objdump.c:379 src/readelf.c:1664 src/readelf.c:1838
+#: src/objdump.c:379 src/readelf.c:1880 src/readelf.c:2069
 msgid "INVALID SYMBOL"
 msgstr "INVALID SYMBOL"
 
-#: src/objdump.c:394 src/readelf.c:1695 src/readelf.c:1871
+#: src/objdump.c:394 src/readelf.c:1911 src/readelf.c:2102
 msgid "INVALID SECTION"
 msgstr "INVALID SECTION"
 
@@ -4036,181 +4105,242 @@ msgstr "‘\e[1m%s\e[0m’ is no archive"
 msgid "error while freeing sub-ELF descriptor: %s"
 msgstr "error while freeing sub-ELF descriptor: %s"
 
-#: src/readelf.c:67
+#: src/readelf.c:71
+msgid "ELF input selection:"
+msgstr "ELF input selection:"
+
+#: src/readelf.c:73
+msgid ""
+"Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data"
+msgstr ""
+"Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data"
+
+#: src/readelf.c:75
 msgid "ELF output selection:"
 msgstr "ELF output selection:"
 
-#: src/readelf.c:69
+#: src/readelf.c:77
 msgid "All these plus -p .strtab -p .dynstr -p .comment"
 msgstr "All these plus -p .strtab -p .dynstr -p .comment"
 
-#: src/readelf.c:70
+#: src/readelf.c:78
 msgid "Display the dynamic segment"
 msgstr "Display the dynamic segment"
 
-#: src/readelf.c:71
+#: src/readelf.c:79
 msgid "Display the ELF file header"
 msgstr "Display the ELF file header"
 
-#: src/readelf.c:73
+#: src/readelf.c:81
 msgid "Display histogram of bucket list lengths"
 msgstr "Display histogram of bucket list lengths"
 
-#: src/readelf.c:74
+#: src/readelf.c:82
 msgid "Display the program headers"
 msgstr "Display the program headers"
 
-#: src/readelf.c:76
+#: src/readelf.c:84
 msgid "Display relocations"
 msgstr "Display relocations"
 
-#: src/readelf.c:77
+#: src/readelf.c:85
 msgid "Display the sections' headers"
 msgstr "Display the sections' headers"
 
-#: src/readelf.c:79
+#: src/readelf.c:87
 msgid "Display the symbol table"
 msgstr "Display the symbol table"
 
-#: src/readelf.c:80
+#: src/readelf.c:88
 msgid "Display versioning information"
 msgstr "Display versioning information"
 
-#: src/readelf.c:81
+#: src/readelf.c:89
 msgid "Display the ELF notes"
 msgstr "Display the ELF notes"
 
-#: src/readelf.c:83
+#: src/readelf.c:91
 msgid "Display architecture specific information, if any"
 msgstr "Display architecture specific information, if any"
 
-#: src/readelf.c:85
+#: src/readelf.c:93
 msgid "Display sections for exception handling"
 msgstr "Display sections for exception handling"
 
-#: src/readelf.c:87
+#: src/readelf.c:95
 msgid "Additional output selection:"
 msgstr "Additional output selection:"
 
-#: src/readelf.c:89
+#: src/readelf.c:97
 msgid ""
 "Display DWARF section content.  SECTION can be one of abbrev, aranges, "
-"frame, gdb_index, info, loc, line, ranges, pubnames, str, macinfo, macro or "
-"exception"
+"decodedaranges, frame, gdb_index, info, loc, line, decodedline, ranges, "
+"pubnames, str, macinfo, macro or exception"
 msgstr ""
 "Display DWARF section content.  SECTION can be one of abbrev, aranges, "
-"frame, gdb_index, info, loc, line, ranges, pubnames, str, macinfo, macro or "
-"exception"
+"decodedaranges, frame, gdb_index, info, loc, line, decodedline, ranges, "
+"pubnames, str, macinfo, macro or exception"
 
-#: src/readelf.c:93
+#: src/readelf.c:101
 msgid "Dump the uninterpreted contents of SECTION, by number or name"
 msgstr "Dump the uninterpreted contents of SECTION, by number or name"
 
-#: src/readelf.c:95
+#: src/readelf.c:103
 msgid "Print string contents of sections"
 msgstr "Print string contents of sections"
 
-#: src/readelf.c:98
+#: src/readelf.c:106
 msgid "Display the symbol index of an archive"
 msgstr "Display the symbol index of an archive"
 
-#: src/readelf.c:100
+#: src/readelf.c:108
 msgid "Output control:"
 msgstr "Output control:"
 
-#: src/readelf.c:102
+#: src/readelf.c:110
 msgid "Do not find symbol names for addresses in DWARF data"
 msgstr "Do not find symbol names for addresses in DWARF data"
 
-#: src/readelf.c:104
+#: src/readelf.c:112
+msgid ""
+"Display just offsets instead of resolving values to addresses in DWARF data"
+msgstr ""
+"Display just offsets instead of resolving values to addresses in DWARF data"
+
+#: src/readelf.c:114
 msgid "Ignored for compatibility (lines always wide)"
 msgstr "Ignored for compatibility (lines always wide)"
 
-#: src/readelf.c:109
+#: src/readelf.c:119
 msgid "Print information from ELF file in human-readable form."
 msgstr "Print information from ELF file in human-readable form."
 
-#: src/readelf.c:410
+#: src/readelf.c:441
 #, c-format
 msgid "Unknown DWARF debug section `%s'.\n"
 msgstr "Unknown DWARF debug section ‘\e[1m%s\e[0m’.\n"
 
-#: src/readelf.c:476
+#: src/readelf.c:520 src/readelf.c:631
 #, c-format
 msgid "cannot generate Elf descriptor: %s"
 msgstr "cannot generate Elf descriptor: %s"
 
-#: src/readelf.c:488
+#: src/readelf.c:545 src/readelf.c:1099 src/readelf.c:1269
 #, c-format
-msgid "'%s' is not an archive, cannot print archive index"
-msgstr "‘\e[1m%s\e[0m’ is not an archive, cannot print archive index"
+msgid "cannot get section: %s"
+msgstr "cannot get section: %s"
+
+#: src/readelf.c:554 src/readelf.c:1106 src/readelf.c:1277 src/readelf.c:9169
+#: src/unstrip.c:352 src/unstrip.c:383 src/unstrip.c:432 src/unstrip.c:540
+#: src/unstrip.c:557 src/unstrip.c:593 src/unstrip.c:791 src/unstrip.c:1059
+#: src/unstrip.c:1250 src/unstrip.c:1310 src/unstrip.c:1431 src/unstrip.c:1484
+#: src/unstrip.c:1591 src/unstrip.c:1780
+#, c-format
+msgid "cannot get section header: %s"
+msgstr "cannot get section header: %s"
 
-#: src/readelf.c:493
+#: src/readelf.c:562
+#, c-format
+msgid "cannot get section name"
+msgstr "cannot get section name"
+
+#: src/readelf.c:571 src/readelf.c:5221 src/readelf.c:7414 src/readelf.c:7516
+#: src/readelf.c:7674
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr "cannot get %s content: %s"
+
+#: src/readelf.c:587
+#, c-format
+msgid "cannot create temp file '%s'"
+msgstr "cannot create temp file ‘\e[1m%s\e[0m’"
+
+#: src/readelf.c:596
+#, c-format
+msgid "cannot write section data"
+msgstr "cannot write section data"
+
+#: src/readelf.c:602 src/readelf.c:619 src/readelf.c:648
 #, c-format
 msgid "error while closing Elf descriptor: %s"
 msgstr "error while closing Elf descriptor: %s"
 
-#: src/readelf.c:585
+#: src/readelf.c:609
+#, c-format
+msgid "error while rewinding file descriptor"
+msgstr "error while rewinding file descriptor"
+
+#: src/readelf.c:643
+#, c-format
+msgid "'%s' is not an archive, cannot print archive index"
+msgstr "‘\e[1m%s\e[0m’ is not an archive, cannot print archive index"
+
+#: src/readelf.c:742
+#, c-format
+msgid "No such section '%s' in '%s'"
+msgstr "No such section ‘\e[1m%s\e[0m’ in ‘\e[1m%s\e[0m’"
+
+#: src/readelf.c:769
 #, c-format
 msgid "cannot stat input file"
 msgstr "cannot stat input file"
 
-#: src/readelf.c:587
+#: src/readelf.c:771
 #, c-format
 msgid "input file is empty"
 msgstr "input file is empty"
 
-#: src/readelf.c:589
+#: src/readelf.c:773
 #, c-format
 msgid "failed reading '%s': %s"
 msgstr "failed reading '%s': %s"
 
-#: src/readelf.c:625
+#: src/readelf.c:814
 #, c-format
 msgid "cannot read ELF header: %s"
 msgstr "cannot read ELF header: %s"
 
-#: src/readelf.c:633
+#: src/readelf.c:822
 #, c-format
 msgid "cannot create EBL handle"
 msgstr "cannot create EBL handle"
 
-#: src/readelf.c:646
+#: src/readelf.c:835
 #, c-format
 msgid "cannot determine number of program headers: %s"
 msgstr "cannot determine number of program headers: %s"
 
-#: src/readelf.c:732
+#: src/readelf.c:921
 msgid "NONE (None)"
 msgstr "NONE (None)"
 
-#: src/readelf.c:733
+#: src/readelf.c:922
 msgid "REL (Relocatable file)"
 msgstr "REL (Relocatable file)"
 
-#: src/readelf.c:734
+#: src/readelf.c:923
 msgid "EXEC (Executable file)"
 msgstr "EXEC (Executable file)"
 
-#: src/readelf.c:735
+#: src/readelf.c:924
 msgid "DYN (Shared object file)"
 msgstr "DYN (Shared object file)"
 
-#: src/readelf.c:736
+#: src/readelf.c:925
 msgid "CORE (Core file)"
 msgstr "CORE (Core file)"
 
-#: src/readelf.c:741
+#: src/readelf.c:930
 #, c-format
 msgid "OS Specific: (%x)\n"
 msgstr "OS Specific: (%x)\n"
 
-#: src/readelf.c:743
+#: src/readelf.c:932
 #, c-format
 msgid "Processor Specific: (%x)\n"
 msgstr "Processor Specific: (%x)\n"
 
-#: src/readelf.c:753
+#: src/readelf.c:942
 msgid ""
 "ELF Header:\n"
 "  Magic:  "
@@ -4218,7 +4348,7 @@ msgstr ""
 "ELF Header:\n"
 "  Magic:  "
 
-#: src/readelf.c:757
+#: src/readelf.c:946
 #, c-format
 msgid ""
 "\n"
@@ -4227,117 +4357,117 @@ msgstr ""
 "\n"
 "  Class:                             %s\n"
 
-#: src/readelf.c:762
+#: src/readelf.c:951
 #, c-format
 msgid "  Data:                              %s\n"
 msgstr "  Data:                              %s\n"
 
-#: src/readelf.c:768
+#: src/readelf.c:957
 #, c-format
 msgid "  Ident Version:                     %hhd %s\n"
 msgstr "  Ident Version:                     %hhd %s\n"
 
-#: src/readelf.c:770 src/readelf.c:787
+#: src/readelf.c:959 src/readelf.c:976
 msgid "(current)"
 msgstr "(current)"
 
-#: src/readelf.c:774
+#: src/readelf.c:963
 #, c-format
 msgid "  OS/ABI:                            %s\n"
 msgstr "  OS/ABI:                            %s\n"
 
-#: src/readelf.c:777
+#: src/readelf.c:966
 #, c-format
 msgid "  ABI Version:                       %hhd\n"
 msgstr "  ABI Version:                       %hhd\n"
 
-#: src/readelf.c:780
+#: src/readelf.c:969
 msgid "  Type:                              "
 msgstr "  Type:                              "
 
-#: src/readelf.c:783
+#: src/readelf.c:972
 #, c-format
 msgid "  Machine:                           %s\n"
 msgstr "  Machine:                           %s\n"
 
-#: src/readelf.c:785
+#: src/readelf.c:974
 #, c-format
 msgid "  Version:                           %d %s\n"
 msgstr "  Version:                           %d %s\n"
 
-#: src/readelf.c:789
+#: src/readelf.c:978
 #, c-format
 msgid "  Entry point address:               %#<PRIx64>\n"
 msgstr "  Entry point address:               %#<PRIx64>\n"
 
-#: src/readelf.c:792
+#: src/readelf.c:981
 #, c-format
 msgid "  Start of program headers:          %<PRId64> %s\n"
 msgstr "  Start of program headers:          %<PRId64> %s\n"
 
-#: src/readelf.c:793 src/readelf.c:796
+#: src/readelf.c:982 src/readelf.c:985
 msgid "(bytes into file)"
 msgstr "(bytes into file)"
 
-#: src/readelf.c:795
+#: src/readelf.c:984
 #, c-format
 msgid "  Start of section headers:          %<PRId64> %s\n"
 msgstr "  Start of section headers:          %<PRId64> %s\n"
 
-#: src/readelf.c:798
+#: src/readelf.c:987
 #, c-format
 msgid "  Flags:                             %s\n"
 msgstr "  Flags:                             %s\n"
 
-#: src/readelf.c:801
+#: src/readelf.c:990
 #, c-format
 msgid "  Size of this header:               %<PRId16> %s\n"
 msgstr "  Size of this header:               %<PRId16> %s\n"
 
-#: src/readelf.c:802 src/readelf.c:805 src/readelf.c:822
+#: src/readelf.c:991 src/readelf.c:994 src/readelf.c:1011
 msgid "(bytes)"
 msgstr "(bytes)"
 
-#: src/readelf.c:804
+#: src/readelf.c:993
 #, c-format
 msgid "  Size of program header entries:    %<PRId16> %s\n"
 msgstr "  Size of program header entries:    %<PRId16> %s\n"
 
-#: src/readelf.c:807
+#: src/readelf.c:996
 #, c-format
 msgid "  Number of program headers entries: %<PRId16>"
 msgstr "  Number of program headers entries: %<PRId16>"
 
-#: src/readelf.c:814
+#: src/readelf.c:1003
 #, c-format
 msgid " (%<PRIu32> in [0].sh_info)"
 msgstr " (%<PRIu32> in [0].sh_info)"
 
-#: src/readelf.c:817 src/readelf.c:834 src/readelf.c:848
+#: src/readelf.c:1006 src/readelf.c:1023 src/readelf.c:1037
 msgid " ([0] not available)"
 msgstr " ([0] not available)"
 
-#: src/readelf.c:821
+#: src/readelf.c:1010
 #, c-format
 msgid "  Size of section header entries:    %<PRId16> %s\n"
 msgstr "  Size of section header entries:    %<PRId16> %s\n"
 
-#: src/readelf.c:824
+#: src/readelf.c:1013
 #, c-format
 msgid "  Number of section headers entries: %<PRId16>"
 msgstr "  Number of section headers entries: %<PRId16>"
 
-#: src/readelf.c:831
+#: src/readelf.c:1020
 #, c-format
 msgid " (%<PRIu32> in [0].sh_size)"
 msgstr " (%<PRIu32> in [0].sh_size)"
 
-#: src/readelf.c:844
+#: src/readelf.c:1033
 #, c-format
 msgid " (%<PRIu32> in [0].sh_link)"
 msgstr " (%<PRIu32> in [0].sh_link)"
 
-#: src/readelf.c:852
+#: src/readelf.c:1041
 #, c-format
 msgid ""
 "  Section header string table index: XINDEX%s\n"
@@ -4346,7 +4476,7 @@ msgstr ""
 "  Section header string table index: XINDEX%s\n"
 "\n"
 
-#: src/readelf.c:856
+#: src/readelf.c:1045
 #, c-format
 msgid ""
 "  Section header string table index: %<PRId16>\n"
@@ -4355,7 +4485,7 @@ msgstr ""
 "  Section header string table index: %<PRId16>\n"
 "\n"
 
-#: src/readelf.c:888
+#: src/readelf.c:1077
 #, c-format
 msgid ""
 "There are %d section headers, starting at offset %#<PRIx64>:\n"
@@ -4364,11 +4494,11 @@ msgstr ""
 "There are %d section headers, starting at offset %#<PRIx64>:\n"
 "\n"
 
-#: src/readelf.c:898
+#: src/readelf.c:1087
 msgid "Section Headers:"
 msgstr "Section Headers:"
 
-#: src/readelf.c:901
+#: src/readelf.c:1090
 msgid ""
 "[Nr] Name                 Type         Addr     Off    Size   ES Flags Lk "
 "Inf Al"
@@ -4376,7 +4506,7 @@ msgstr ""
 "[Nr] Name                 Type         Addr     Off    Size   ES Flags Lk "
 "Inf Al"
 
-#: src/readelf.c:903
+#: src/readelf.c:1092
 msgid ""
 "[Nr] Name                 Type         Addr             Off      Size     ES "
 "Flags Lk Inf Al"
@@ -4384,31 +4514,17 @@ msgstr ""
 "[Nr] Name                 Type         Addr             Off      Size     ES "
 "Flags Lk Inf Al"
 
-#: src/readelf.c:910 src/readelf.c:1063
-#, c-format
-msgid "cannot get section: %s"
-msgstr "cannot get section: %s"
-
-#: src/readelf.c:917 src/readelf.c:1071 src/readelf.c:8343 src/unstrip.c:345
-#: src/unstrip.c:376 src/unstrip.c:425 src/unstrip.c:533 src/unstrip.c:550
-#: src/unstrip.c:586 src/unstrip.c:784 src/unstrip.c:1052 src/unstrip.c:1242
-#: src/unstrip.c:1302 src/unstrip.c:1423 src/unstrip.c:1476 src/unstrip.c:1583
-#: src/unstrip.c:1772
-#, c-format
-msgid "cannot get section header: %s"
-msgstr "cannot get section header: %s"
-
-#: src/readelf.c:975
+#: src/readelf.c:1164
 msgid "Program Headers:"
 msgstr "Program Headers:"
 
-#: src/readelf.c:977
+#: src/readelf.c:1166
 msgid ""
 "  Type           Offset   VirtAddr   PhysAddr   FileSiz  MemSiz   Flg Align"
 msgstr ""
 "  Type           Offset   VirtAddr   PhysAddr   FileSiz  MemSiz   Flg Align"
 
-#: src/readelf.c:980
+#: src/readelf.c:1169
 msgid ""
 "  Type           Offset   VirtAddr           PhysAddr           FileSiz  "
 "MemSiz   Flg Align"
@@ -4416,12 +4532,12 @@ msgstr ""
 "  Type           Offset   VirtAddr           PhysAddr           FileSiz  "
 "MemSiz   Flg Align"
 
-#: src/readelf.c:1020
+#: src/readelf.c:1226
 #, c-format
 msgid "\t[Requesting program interpreter: %s]\n"
 msgstr "\t[Requesting program interpreter: %s]\n"
 
-#: src/readelf.c:1041
+#: src/readelf.c:1247
 msgid ""
 "\n"
 " Section to Segment mapping:\n"
@@ -4431,12 +4547,12 @@ msgstr ""
 " Section to Segment mapping:\n"
 "  Segment Sections..."
 
-#: src/readelf.c:1052 src/unstrip.c:1827 src/unstrip.c:1866 src/unstrip.c:1873
+#: src/readelf.c:1258 src/unstrip.c:1835 src/unstrip.c:1874 src/unstrip.c:1881
 #, c-format
 msgid "cannot get program header: %s"
 msgstr "cannot get program header: %s"
 
-#: src/readelf.c:1193
+#: src/readelf.c:1401
 #, c-format
 msgid ""
 "\n"
@@ -4453,7 +4569,7 @@ msgstr[1] ""
 "COMDAT section group [%2zu] ‘\e[1m%s\e[0m’ with signature ‘\e[1m%s\e[0m’ contains "
 "%zu entries:\n"
 
-#: src/readelf.c:1198
+#: src/readelf.c:1406
 #, c-format
 msgid ""
 "\n"
@@ -4470,15 +4586,21 @@ msgstr[1] ""
 "Section group [%2zu] ‘\e[1m%s\e[0m’ with signature ‘\e[1m%s\e[0m’ contains %zu "
 "entries:\n"
 
-#: src/readelf.c:1206
+#: src/readelf.c:1414
 msgid "<INVALID SYMBOL>"
 msgstr "<INVALID SYMBOL>"
 
-#: src/readelf.c:1220
+#: src/readelf.c:1428
 msgid "<INVALID SECTION>"
 msgstr "<INVALID SECTION>"
 
-#: src/readelf.c:1371
+#: src/readelf.c:1585 src/readelf.c:2202 src/readelf.c:2460 src/readelf.c:2530
+#: src/readelf.c:2812 src/readelf.c:2885 src/readelf.c:4488
+#, c-format
+msgid "invalid sh_link value in section %Zu"
+msgstr "invalid sh_link value in section %Zu"
+
+#: src/readelf.c:1588
 #, c-format
 msgid ""
 "\n"
@@ -4491,44 +4613,44 @@ msgid_plural ""
 msgstr[0] ""
 "\n"
 "Dynamic segment contains %lu entry:\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m%s\e"
-"[0m’\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m"
+"%s\e[0m’\n"
 msgstr[1] ""
 "\n"
 "Dynamic segment contains %lu entries:\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m%s\e"
-"[0m’\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m"
+"%s\e[0m’\n"
 
-#: src/readelf.c:1383
+#: src/readelf.c:1598
 msgid "  Type              Value\n"
 msgstr "  Type              Value\n"
 
-#: src/readelf.c:1407
+#: src/readelf.c:1622
 #, c-format
 msgid "Shared library: [%s]\n"
 msgstr "Shared library: [%s]\n"
 
-#: src/readelf.c:1412
+#: src/readelf.c:1627
 #, c-format
 msgid "Library soname: [%s]\n"
 msgstr "Library soname: [%s]\n"
 
-#: src/readelf.c:1417
+#: src/readelf.c:1632
 #, c-format
 msgid "Library rpath: [%s]\n"
 msgstr "Library rpath: [%s]\n"
 
-#: src/readelf.c:1422
+#: src/readelf.c:1637
 #, c-format
 msgid "Library runpath: [%s]\n"
 msgstr "Library runpath: [%s]\n"
 
-#: src/readelf.c:1442
+#: src/readelf.c:1657
 #, c-format
 msgid "%<PRId64> (bytes)\n"
 msgstr "%<PRId64> (bytes)\n"
 
-#: src/readelf.c:1554 src/readelf.c:1740
+#: src/readelf.c:1770 src/readelf.c:1957
 #, c-format
 msgid ""
 "\n"
@@ -4537,7 +4659,7 @@ msgstr ""
 "\n"
 "Invalid symbol table at offset %#0<PRIx64>\n"
 
-#: src/readelf.c:1572 src/readelf.c:1757
+#: src/readelf.c:1788 src/readelf.c:1975
 #, c-format
 msgid ""
 "\n"
@@ -4556,7 +4678,7 @@ msgstr[1] ""
 "Relocation section [%2zu] ‘\e[1m%s\e[0m’ for section [%2u] ‘\e[1m%s\e[0m’ at offset "
 "%#0<PRIx64> contains %d entries:\n"
 
-#: src/readelf.c:1587
+#: src/readelf.c:1803 src/readelf.c:1990
 #, c-format
 msgid ""
 "\n"
@@ -4573,30 +4695,30 @@ msgstr[1] ""
 "Relocation section [%2u] ‘\e[1m%s\e[0m’ at offset %#0<PRIx64> contains %d "
 "entries:\n"
 
-#: src/readelf.c:1597
+#: src/readelf.c:1813
 msgid "  Offset      Type                 Value       Name\n"
 msgstr "  Offset      Type                 Value       Name\n"
 
-#: src/readelf.c:1599
+#: src/readelf.c:1815
 msgid "  Offset              Type                 Value               Name\n"
 msgstr "  Offset              Type                 Value               Name\n"
 
-#: src/readelf.c:1652 src/readelf.c:1663 src/readelf.c:1676 src/readelf.c:1694
-#: src/readelf.c:1706 src/readelf.c:1825 src/readelf.c:1837 src/readelf.c:1851
-#: src/readelf.c:1870 src/readelf.c:1883
+#: src/readelf.c:1868 src/readelf.c:1879 src/readelf.c:1892 src/readelf.c:1910
+#: src/readelf.c:1922 src/readelf.c:2056 src/readelf.c:2068 src/readelf.c:2082
+#: src/readelf.c:2101 src/readelf.c:2114
 msgid "<INVALID RELOC>"
 msgstr "<INVALID RELOC>"
 
-#: src/readelf.c:1769
+#: src/readelf.c:2000
 msgid "  Offset      Type            Value       Addend Name\n"
 msgstr "  Offset      Type            Value       Addend Name\n"
 
-#: src/readelf.c:1771
+#: src/readelf.c:2002
 msgid "  Offset              Type            Value               Addend Name\n"
 msgstr ""
 "  Offset              Type            Value               Addend Name\n"
 
-#: src/readelf.c:1972
+#: src/readelf.c:2210
 #, c-format
 msgid ""
 "\n"
@@ -4611,40 +4733,40 @@ msgstr[1] ""
 "\n"
 "Symbol table [%2u] ‘\e[1m%s\e[0m’ contains %u entries:\n"
 
-#: src/readelf.c:1978
+#: src/readelf.c:2215
 #, c-format
 msgid " %lu local symbol  String table: [%2u] '%s'\n"
 msgid_plural " %lu local symbols  String table: [%2u] '%s'\n"
 msgstr[0] " %lu local symbol  String table: [%2u] ‘\e[1m%s\e[0m’\n"
 msgstr[1] " %lu local symbols  String table: [%2u] ‘\e[1m%s\e[0m’\n"
 
-#: src/readelf.c:1988
+#: src/readelf.c:2223
 msgid "  Num:    Value   Size Type    Bind   Vis          Ndx Name\n"
 msgstr "  Num:    Value   Size Type    Bind   Vis          Ndx Name\n"
 
-#: src/readelf.c:1990
+#: src/readelf.c:2225
 msgid "  Num:            Value   Size Type    Bind   Vis          Ndx Name\n"
 msgstr "  Num:            Value   Size Type    Bind   Vis          Ndx Name\n"
 
-#: src/readelf.c:2010
+#: src/readelf.c:2245
 #, 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:2098
+#: src/readelf.c:2333
 #, c-format
 msgid "bad dynamic symbol"
 msgstr "bad dynamic symbol"
 
-#: src/readelf.c:2180
+#: src/readelf.c:2415
 msgid "none"
 msgstr "none"
 
-#: src/readelf.c:2197
+#: src/readelf.c:2432
 msgid "| <unknown>"
 msgstr "| <unknown>"
 
-#: src/readelf.c:2222
+#: src/readelf.c:2463
 #, c-format
 msgid ""
 "\n"
@@ -4657,25 +4779,25 @@ msgid_plural ""
 msgstr[0] ""
 "\n"
 "Version needs section [%2u] ‘\e[1m%s\e[0m’ contains %d entry:\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m%s\e"
-"[0m’\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m"
+"%s\e[0m’\n"
 msgstr[1] ""
 "\n"
 "Version needs section [%2u] ‘\e[1m%s\e[0m’ contains %d entries:\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m%s\e"
-"[0m’\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m"
+"%s\e[0m’\n"
 
-#: src/readelf.c:2245
+#: src/readelf.c:2484
 #, c-format
 msgid "  %#06x: Version: %hu  File: %s  Cnt: %hu\n"
 msgstr "  %#06x: Version: %hu  File: %s  Cnt: %hu\n"
 
-#: src/readelf.c:2258
+#: src/readelf.c:2497
 #, c-format
 msgid "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 msgstr "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 
-#: src/readelf.c:2289
+#: src/readelf.c:2534
 #, c-format
 msgid ""
 "\n"
@@ -4688,25 +4810,25 @@ msgid_plural ""
 msgstr[0] ""
 "\n"
 "Version definition section [%2u] ‘\e[1m%s\e[0m’ contains %d entry:\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m%s\e"
-"[0m’\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m"
+"%s\e[0m’\n"
 msgstr[1] ""
 "\n"
 "Version definition section [%2u] ‘\e[1m%s\e[0m’ contains %d entries:\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m%s\e"
-"[0m’\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m"
+"%s\e[0m’\n"
 
-#: src/readelf.c:2319
+#: src/readelf.c:2562
 #, c-format
 msgid "  %#06x: Version: %hd  Flags: %s  Index: %hd  Cnt: %hd  Name: %s\n"
 msgstr "  %#06x: Version: %hd  Flags: %s  Index: %hd  Cnt: %hd  Name: %s\n"
 
-#: src/readelf.c:2334
+#: src/readelf.c:2577
 #, c-format
 msgid "  %#06x: Parent %d: %s\n"
 msgstr "  %#06x: Parent %d: %s\n"
 
-#: src/readelf.c:2566
+#: src/readelf.c:2816
 #, c-format
 msgid ""
 "\n"
@@ -4725,15 +4847,15 @@ msgstr[1] ""
 "Version symbols section [%2u] ‘\e[1m%s\e[0m’ contains %d entries:\n"
 " Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m%s\e[0m’"
 
-#: src/readelf.c:2596
+#: src/readelf.c:2844
 msgid "   0 *local*                     "
 msgstr "   0 *local*                     "
 
-#: src/readelf.c:2601
+#: src/readelf.c:2849
 msgid "   1 *global*                    "
 msgstr "   1 *global*                    "
 
-#: src/readelf.c:2632
+#: src/readelf.c:2890
 #, c-format
 msgid ""
 "\n"
@@ -4749,31 +4871,31 @@ msgstr[0] ""
 "\n"
 "Histogram for bucket list length in section [%2u] ‘\e[1m%s\e[0m’ (total of %d "
 "bucket):\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m%s\e"
-"[0m’\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m"
+"%s\e[0m’\n"
 msgstr[1] ""
 "\n"
 "Histogram for bucket list length in section [%2u] ‘\e[1m%s\e[0m’ (total of %d "
 "buckets):\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m%s\e"
-"[0m’\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘\e[1m"
+"%s\e[0m’\n"
 
-#: src/readelf.c:2656
+#: src/readelf.c:2912
 #, no-c-format
 msgid " Length  Number  % of total  Coverage\n"
 msgstr " Length  Number  % of total  Coverage\n"
 
-#: src/readelf.c:2658
+#: src/readelf.c:2914
 #, c-format
 msgid "      0  %6<PRIu32>      %5.1f%%\n"
 msgstr "      0  %6<PRIu32>      %5.1f%%\n"
 
-#: src/readelf.c:2665
+#: src/readelf.c:2921
 #, c-format
 msgid "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 msgstr "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 
-#: src/readelf.c:2678
+#: src/readelf.c:2934
 #, c-format
 msgid ""
 " Average number of tests:   successful lookup: %f\n"
@@ -4782,12 +4904,12 @@ msgstr ""
 " Average number of tests:   successful lookup: %f\n"
 "\t\t\t  unsuccessful lookup: %f\n"
 
-#: src/readelf.c:2696 src/readelf.c:2738 src/readelf.c:2779
+#: src/readelf.c:2952 src/readelf.c:2994 src/readelf.c:3035
 #, c-format
 msgid "cannot get data for section %d: %s"
 msgstr "cannot get data for section %d: %s"
 
-#: src/readelf.c:2833
+#: src/readelf.c:3089
 #, c-format
 msgid ""
 " Symbol Bias: %u\n"
@@ -4796,7 +4918,7 @@ msgstr ""
 " Symbol Bias: %u\n"
 " Bitmask Size: %zu bytes  %<PRIuFAST32>%% bits set  2nd hash shift: %u\n"
 
-#: src/readelf.c:2907
+#: src/readelf.c:3164
 #, c-format
 msgid ""
 "\n"
@@ -4813,7 +4935,7 @@ msgstr[1] ""
 "Library list section [%2zu] ‘\e[1m%s\e[0m’ at offset %#0<PRIx64> contains %d "
 "entries:\n"
 
-#: src/readelf.c:2921
+#: src/readelf.c:3178
 msgid ""
 "       Library                       Time Stamp          Checksum Version "
 "Flags"
@@ -4821,7 +4943,7 @@ msgstr ""
 "       Library                       Time Stamp          Checksum Version "
 "Flags"
 
-#: src/readelf.c:2971
+#: src/readelf.c:3228
 #, c-format
 msgid ""
 "\n"
@@ -4832,135 +4954,140 @@ msgstr ""
 "Object attributes section [%2zu] ‘\e[1m%s\e[0m’ of %<PRIu64> bytes at offset "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:2987
+#: src/readelf.c:3244
 msgid "  Owner          Size\n"
 msgstr "  Owner          Size\n"
 
-#: src/readelf.c:3013
+#: src/readelf.c:3270
 #, c-format
 msgid "  %-13s  %4<PRIu32>\n"
 msgstr "  %-13s  %4<PRIu32>\n"
 
-#: src/readelf.c:3045
+#: src/readelf.c:3302
 #, c-format
 msgid "    %-4u %12<PRIu32>\n"
 msgstr "    %-4u %12<PRIu32>\n"
 
-#: src/readelf.c:3050
+#: src/readelf.c:3307
 #, c-format
 msgid "    File: %11<PRIu32>\n"
 msgstr "    File: %11<PRIu32>\n"
 
-#: src/readelf.c:3085
+#: src/readelf.c:3342
 #, c-format
 msgid "      %s: %<PRId64>, %s\n"
 msgstr "      %s: %<PRId64>, %s\n"
 
-#: src/readelf.c:3088
+#: src/readelf.c:3345
 #, c-format
 msgid "      %s: %<PRId64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:3091
+#: src/readelf.c:3348
 #, c-format
 msgid "      %s: %s\n"
 msgstr "      %s: %s\n"
 
-#: src/readelf.c:3098
+#: src/readelf.c:3355
 #, c-format
 msgid "      %u: %<PRId64>\n"
 msgstr "      %u: %<PRId64>\n"
 
-#: src/readelf.c:3101
+#: src/readelf.c:3358
 #, c-format
 msgid "      %u: %s\n"
 msgstr "      %u: %s\n"
 
-#: src/readelf.c:3137
+#: src/readelf.c:3403
 #, c-format
 msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3140
+#: src/readelf.c:3406
 #, c-format
 msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3145
+#: src/readelf.c:3411
 #, c-format
 msgid "%#<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%#<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3148
+#: src/readelf.c:3414
 #, c-format
 msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%#0*<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3154
+#: src/readelf.c:3420
 #, c-format
 msgid "%s+%#<PRIx64> <%s>"
 msgstr "%s+%#<PRIx64> <%s>"
 
-#: src/readelf.c:3157
+#: src/readelf.c:3423
 #, c-format
 msgid "%s+%#0*<PRIx64> <%s>"
 msgstr "%s+%#0*<PRIx64> <%s>"
 
-#: src/readelf.c:3161
+#: src/readelf.c:3427
 #, c-format
 msgid "%#<PRIx64> <%s>"
 msgstr "%#<PRIx64> <%s>"
 
-#: src/readelf.c:3164
+#: src/readelf.c:3430
 #, c-format
 msgid "%#0*<PRIx64> <%s>"
 msgstr "%#0*<PRIx64> <%s>"
 
-#: src/readelf.c:3169
+#: src/readelf.c:3435
 #, c-format
 msgid "%s+%#<PRIx64>"
 msgstr "%s+%#<PRIx64>"
 
-#: src/readelf.c:3172
+#: src/readelf.c:3438
 #, c-format
 msgid "%s+%#0*<PRIx64>"
 msgstr "%s+%#0*<PRIx64>"
 
-#: src/readelf.c:3554
+#: src/readelf.c:3820
 msgid "empty block"
 msgstr "empty block"
 
-#: src/readelf.c:3557
+#: src/readelf.c:3823
 #, c-format
 msgid "%zu byte block:"
 msgstr "%zu byte block:"
 
-#: src/readelf.c:3934
+#: src/readelf.c:4217
 #, c-format
 msgid "%*s[%4<PRIuMAX>] %s  <TRUNCATED>\n"
 msgstr "%*s[%4<PRIuMAX>] %s  <TRUNCATED>\n"
 
-#: src/readelf.c:3970
+#: src/readelf.c:4274
 #, c-format
 msgid "%s %#<PRIx64> used with different address sizes"
 msgstr "%s %#<PRIx64> used with different address sizes"
 
-#: src/readelf.c:3977
+#: src/readelf.c:4281
 #, c-format
 msgid "%s %#<PRIx64> used with different offset sizes"
 msgstr "%s %#<PRIx64> used with different offset sizes"
 
-#: src/readelf.c:4057
+#: src/readelf.c:4288
+#, c-format
+msgid "%s %#<PRIx64> used with different base addresses"
+msgstr "%s %#<PRIx64> used with different base addresses"
+
+#: src/readelf.c:4370
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE IN REST OF SECTION>\n"
 msgstr " [%6tx]  <UNUSED GARBAGE IN REST OF SECTION>\n"
 
-#: src/readelf.c:4065
+#: src/readelf.c:4378
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
 msgstr " [%6tx]  <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
 
-#: src/readelf.c:4087
+#: src/readelf.c:4404
 #, c-format
 msgid ""
 "\n"
@@ -4971,7 +5098,7 @@ msgstr ""
 "DWARF section [%2zu] ‘\e[1m%s\e[0m’ at offset %#<PRIx64>:\n"
 " [ Code]\n"
 
-#: src/readelf.c:4095
+#: src/readelf.c:4412
 #, c-format
 msgid ""
 "\n"
@@ -4980,30 +5107,30 @@ msgstr ""
 "\n"
 "Abbreviation section at offset %<PRIu64>:\n"
 
-#: src/readelf.c:4108
+#: src/readelf.c:4425
 #, c-format
 msgid " *** error while reading abbreviation: %s\n"
 msgstr " *** error while reading abbreviation: %s\n"
 
-#: src/readelf.c:4124
+#: src/readelf.c:4441
 #, c-format
 msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
 msgstr " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
 
-#: src/readelf.c:4127
+#: src/readelf.c:4444
 msgid "yes"
 msgstr "yes"
 
-#: src/readelf.c:4127
+#: src/readelf.c:4444
 msgid "no"
 msgstr "no"
 
-#: src/readelf.c:4162
+#: src/readelf.c:4478 src/readelf.c:4551
 #, c-format
 msgid "cannot get .debug_aranges content: %s"
 msgstr "cannot get .debug_aranges content: %s"
 
-#: src/readelf.c:4167
+#: src/readelf.c:4493
 #, c-format
 msgid ""
 "\n"
@@ -5018,25 +5145,20 @@ msgstr[1] ""
 "\n"
 "DWARF section [%2zu] ‘\e[1m%s\e[0m’ at offset %#<PRIx64> contains %zu entries:\n"
 
-#: src/readelf.c:4198
+#: src/readelf.c:4524
 #, c-format
 msgid " [%*zu] ???\n"
 msgstr " [%*zu] ???\n"
 
-#: src/readelf.c:4200
+#: src/readelf.c:4526
 #, c-format
 msgid ""
 " [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
 msgstr ""
 " [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
 
-#: src/readelf.c:4219
-#, c-format
-msgid "cannot get .debug_ranges content: %s"
-msgstr "cannot get .debug_ranges content: %s"
-
-#: src/readelf.c:4224 src/readelf.c:4728 src/readelf.c:5505 src/readelf.c:6006
-#: src/readelf.c:6121 src/readelf.c:6277 src/readelf.c:6699
+#: src/readelf.c:4556 src/readelf.c:4710 src/readelf.c:5231 src/readelf.c:6145
+#: src/readelf.c:6646 src/readelf.c:6766 src/readelf.c:6922 src/readelf.c:7345
 #, c-format
 msgid ""
 "\n"
@@ -5045,37 +5167,119 @@ msgstr ""
 "\n"
 "DWARF section [%2zu] ‘\e[1m%s\e[0m’ at offset %#<PRIx64>:\n"
 
-#: src/readelf.c:4248 src/readelf.c:6031
+#: src/readelf.c:4569 src/readelf.c:6171
+#, c-format
+msgid ""
+"\n"
+"Table at offset %Zu:\n"
+msgstr ""
+"\n"
+"Table at offset %Zu:\n"
+
+#: src/readelf.c:4573 src/readelf.c:5255 src/readelf.c:6180
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr "invalid data in section [%zu] ‘\e[1m%s\e[0m’"
+
+#: src/readelf.c:4589
+#, c-format
+msgid ""
+"\n"
+" Length:        %6<PRIu64>\n"
+msgstr ""
+"\n"
+" Length:        %6<PRIu64>\n"
+
+#: src/readelf.c:4601
+#, c-format
+msgid " DWARF version: %6<PRIuFAST16>\n"
+msgstr " DWARF version: %6<PRIuFAST16>\n"
+
+#: src/readelf.c:4605
+#, c-format
+msgid "unsupported aranges version"
+msgstr "unsupported aranges version"
+
+#: src/readelf.c:4616
+#, c-format
+msgid " CU offset:     %6<PRIx64>\n"
+msgstr " CU offset:     %6<PRIx64>\n"
+
+#: src/readelf.c:4622
+#, c-format
+msgid " Address size:  %6<PRIu64>\n"
+msgstr " Address size:  %6<PRIu64>\n"
+
+#: src/readelf.c:4626
+#, c-format
+msgid "unsupported address size"
+msgstr "unsupported address size"
+
+#: src/readelf.c:4631
+#, c-format
+msgid ""
+" Segment size:  %6<PRIu64>\n"
+"\n"
+msgstr ""
+" Segment size:  %6<PRIu64>\n"
+"\n"
+
+#: src/readelf.c:4635
+#, c-format
+msgid "unsupported segment size"
+msgstr "unsupported segment size"
+
+#: src/readelf.c:4675
+#, c-format
+msgid "   %s..%s (%<PRIx64>)\n"
+msgstr "   %s..%s (%<PRIx64>)\n"
+
+#: src/readelf.c:4678
+#, c-format
+msgid "   %s..%s\n"
+msgstr "   %s..%s\n"
+
+#: src/readelf.c:4687
+#, c-format
+msgid "   %Zu padding bytes\n"
+msgstr "   %Zu padding bytes\n"
+
+#: src/readelf.c:4705
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr "cannot get .debug_ranges content: %s"
+
+#: src/readelf.c:4735 src/readelf.c:6673
 #, c-format
 msgid " [%6tx]  <INVALID DATA>\n"
 msgstr " [%6tx]  <INVALID DATA>\n"
 
-#: src/readelf.c:4270 src/readelf.c:6053
+#: src/readelf.c:4757 src/readelf.c:6695
 #, c-format
 msgid " [%6tx]  base address %s\n"
 msgstr " [%6tx]  base address %s\n"
 
-#: src/readelf.c:4276 src/readelf.c:6059
+#: src/readelf.c:4764 src/readelf.c:6702
 #, c-format
 msgid " [%6tx]  empty list\n"
 msgstr " [%6tx]  empty list\n"
 
-#: src/readelf.c:4285
+#: src/readelf.c:4775
 #, c-format
 msgid " [%6tx]  %s..%s\n"
 msgstr " [%6tx]  %s..%s\n"
 
-#: src/readelf.c:4287
+#: src/readelf.c:4777
 #, c-format
 msgid "           %s..%s\n"
 msgstr "           %s..%s\n"
 
-#: src/readelf.c:4717 src/readelf.c:6768 src/readelf.c:6870 src/readelf.c:7028
+#: src/readelf.c:5210
 #, c-format
-msgid "cannot get %s content: %s"
-msgstr "cannot get %s content: %s"
+msgid "cannot get ELF: %s"
+msgstr "cannot get ELF: %s"
 
-#: src/readelf.c:4724
+#: src/readelf.c:5227
 #, c-format
 msgid ""
 "\n"
@@ -5084,12 +5288,7 @@ msgstr ""
 "\n"
 "Call frame information section [%2zu] ‘\e[1m%s\e[0m’ at offset %#<PRIx64>:\n"
 
-#: src/readelf.c:4752 src/readelf.c:5540
-#, c-format
-msgid "invalid data in section [%zu] '%s'"
-msgstr "invalid data in section [%zu] ‘\e[1m%s\e[0m’"
-
-#: src/readelf.c:4774
+#: src/readelf.c:5277
 #, c-format
 msgid ""
 "\n"
@@ -5098,50 +5297,50 @@ msgstr ""
 "\n"
 " [%6tx] Zero terminator\n"
 
-#: src/readelf.c:4859
+#: src/readelf.c:5362
 #, c-format
 msgid "invalid augmentation length"
 msgstr "invalid augmentation length"
 
-#: src/readelf.c:4871
+#: src/readelf.c:5374
 msgid "FDE address encoding: "
 msgstr "FDE address encoding: "
 
-#: src/readelf.c:4877
+#: src/readelf.c:5380
 msgid "LSDA pointer encoding: "
 msgstr "LSDA pointer encoding: "
 
-#: src/readelf.c:4975
+#: src/readelf.c:5491
 #, c-format
 msgid " (offset: %#<PRIx64>)"
 msgstr " (offset: %#<PRIx64>)"
 
-#: src/readelf.c:4982
+#: src/readelf.c:5498
 #, c-format
 msgid " (end offset: %#<PRIx64>)"
 msgstr " (end offset: %#<PRIx64>)"
 
-#: src/readelf.c:5009
+#: src/readelf.c:5525
 #, c-format
 msgid "   %-26sLSDA pointer: %#<PRIx64>\n"
 msgstr "   %-26sLSDA pointer: %#<PRIx64>\n"
 
-#: src/readelf.c:5060
+#: src/readelf.c:5577
 #, c-format
 msgid "cannot get attribute code: %s"
 msgstr "cannot get attribute code: %s"
 
-#: src/readelf.c:5069
+#: src/readelf.c:5586
 #, c-format
 msgid "cannot get attribute form: %s"
 msgstr "cannot get attribute form: %s"
 
-#: src/readelf.c:5084
+#: src/readelf.c:5601
 #, c-format
 msgid "cannot get attribute value: %s"
 msgstr "cannot get attribute value: %s"
 
-#: src/readelf.c:5342
+#: src/readelf.c:5894
 #, c-format
 msgid ""
 "\n"
@@ -5152,7 +5351,7 @@ msgstr ""
 "DWARF section [%2zu] ‘\e[1m%s\e[0m’ at offset %#<PRIx64>:\n"
 " [Offset]\n"
 
-#: src/readelf.c:5374
+#: src/readelf.c:5926
 #, c-format
 msgid ""
 " Type unit at offset %<PRIu64>:\n"
@@ -5165,7 +5364,7 @@ msgstr ""
 "%<PRIu8>, Offset size: %<PRIu8>\n"
 " Type signature: %#<PRIx64>, Type offset: %#<PRIx64>\n"
 
-#: src/readelf.c:5383
+#: src/readelf.c:5935
 #, c-format
 msgid ""
 " Compilation unit at offset %<PRIu64>:\n"
@@ -5176,46 +5375,48 @@ msgstr ""
 " Version: %<PRIu16>, Abbreviation section offset: %<PRIu64>, Address size: "
 "%<PRIu8>, Offset size: %<PRIu8>\n"
 
-#: src/readelf.c:5409
+#: src/readelf.c:5960
 #, c-format
 msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
 msgstr "cannot get DIE at offset %<PRIu64> in section '%s': %s"
 
-#: src/readelf.c:5421
+#: src/readelf.c:5974
 #, c-format
 msgid "cannot get DIE offset: %s"
 msgstr "cannot get DIE offset: %s"
 
-#: src/readelf.c:5430
+#: src/readelf.c:5983
 #, c-format
 msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
 msgstr "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
 
-#: src/readelf.c:5461
+#: src/readelf.c:6015
 #, c-format
 msgid "cannot get next DIE: %s\n"
 msgstr "cannot get next DIE: %s\n"
 
-#: src/readelf.c:5469
+#: src/readelf.c:6023
 #, c-format
 msgid "cannot get next DIE: %s"
 msgstr "cannot get next DIE: %s"
 
-#: src/readelf.c:5518
-#, c-format
-msgid "cannot get line data section data: %s"
-msgstr "cannot get line data section data: %s"
-
-#: src/readelf.c:5531
+#: src/readelf.c:6059
 #, c-format
 msgid ""
 "\n"
-"Table at offset %Zu:\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+"\n"
 msgstr ""
 "\n"
-"Table at offset %Zu:\n"
+"DWARF section [%2zu] ‘\e[1m%s\e[0m’ at offset %#<PRIx64>:\n"
+"\n"
 
-#: src/readelf.c:5586
+#: src/readelf.c:6158
+#, c-format
+msgid "cannot get line data section data: %s"
+msgstr "cannot get line data section data: %s"
+
+#: src/readelf.c:6226
 #, c-format
 msgid ""
 "\n"
@@ -5244,19 +5445,19 @@ msgstr ""
 "\n"
 "Opcodes:\n"
 
-#: src/readelf.c:5607
+#: src/readelf.c:6247
 #, c-format
 msgid "invalid data at offset %tu in section [%zu] '%s'"
 msgstr "invalid data at offset %tu in section [%zu] ‘\e[1m%s\e[0m’"
 
-#: src/readelf.c:5622
+#: src/readelf.c:6262
 #, c-format
 msgid "  [%*<PRIuFAST8>]  %hhu argument\n"
 msgid_plural "  [%*<PRIuFAST8>]  %hhu arguments\n"
 msgstr[0] "  [%*<PRIuFAST8>]  %hhu argument\n"
 msgstr[1] "  [%*<PRIuFAST8>]  %hhu arguments\n"
 
-#: src/readelf.c:5630
+#: src/readelf.c:6270
 msgid ""
 "\n"
 "Directory table:"
@@ -5264,7 +5465,7 @@ msgstr ""
 "\n"
 "Directory table:"
 
-#: src/readelf.c:5646
+#: src/readelf.c:6286
 msgid ""
 "\n"
 "File name table:\n"
@@ -5274,7 +5475,7 @@ msgstr ""
 "File name table:\n"
 " Entry Dir   Time      Size      Name"
 
-#: src/readelf.c:5675
+#: src/readelf.c:6315
 msgid ""
 "\n"
 "Line number statements:"
@@ -5282,207 +5483,207 @@ msgstr ""
 "\n"
 "Line number statements:"
 
-#: src/readelf.c:5751
+#: src/readelf.c:6391
 #, c-format
 msgid " special opcode %u: address+%u = %s, op_index = %u, line%+d = %zu\n"
 msgstr " special opcode %u: address+%u = %s, op_index = %u, line%+d = %zu\n"
 
-#: src/readelf.c:5756
+#: src/readelf.c:6396
 #, c-format
 msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
 msgstr " special opcode %u: address+%u = %s, line%+d = %zu\n"
 
-#: src/readelf.c:5776
+#: src/readelf.c:6416
 #, c-format
 msgid " extended opcode %u: "
 msgstr " extended opcode %u: "
 
-#: src/readelf.c:5781
+#: src/readelf.c:6421
 msgid " end of sequence"
 msgstr " end of sequence"
 
-#: src/readelf.c:5798
+#: src/readelf.c:6438
 #, c-format
 msgid " set address to %s\n"
 msgstr " set address to %s\n"
 
-#: src/readelf.c:5819
+#: src/readelf.c:6459
 #, c-format
 msgid " define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
 msgstr " define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
 
-#: src/readelf.c:5832
+#: src/readelf.c:6472
 #, c-format
 msgid " set discriminator to %u\n"
 msgstr " set discriminator to %u\n"
 
-#: src/readelf.c:5837
+#: src/readelf.c:6477
 msgid " unknown opcode"
 msgstr " unknown opcode"
 
-#: src/readelf.c:5849
+#: src/readelf.c:6489
 msgid " copy"
 msgstr " copy"
 
-#: src/readelf.c:5860
+#: src/readelf.c:6500
 #, c-format
 msgid " advance address by %u to %s, op_index to %u\n"
 msgstr " advance address by %u to %s, op_index to %u\n"
 
-#: src/readelf.c:5864
+#: src/readelf.c:6504
 #, c-format
 msgid " advance address by %u to %s\n"
 msgstr " advance address by %u to %s\n"
 
-#: src/readelf.c:5875
+#: src/readelf.c:6515
 #, c-format
 msgid " advance line by constant %d to %<PRId64>\n"
 msgstr " advance line by constant %d to %<PRId64>\n"
 
-#: src/readelf.c:5883
+#: src/readelf.c:6523
 #, c-format
 msgid " set file to %<PRIu64>\n"
 msgstr " set file to %<PRIu64>\n"
 
-#: src/readelf.c:5893
+#: src/readelf.c:6533
 #, c-format
 msgid " set column to %<PRIu64>\n"
 msgstr " set column to %<PRIu64>\n"
 
-#: src/readelf.c:5900
+#: src/readelf.c:6540
 #, c-format
 msgid " set '%s' to %<PRIuFAST8>\n"
 msgstr " set ‘\e[1m%s\e[0m’ to %<PRIuFAST8>\n"
 
-#: src/readelf.c:5906
+#: src/readelf.c:6546
 msgid " set basic block flag"
 msgstr " set basic block flag"
 
-#: src/readelf.c:5915
+#: src/readelf.c:6555
 #, c-format
 msgid " advance address by constant %u to %s, op_index to %u\n"
 msgstr " advance address by constant %u to %s, op_index to %u\n"
 
-#: src/readelf.c:5919
+#: src/readelf.c:6559
 #, c-format
 msgid " advance address by constant %u to %s\n"
 msgstr " advance address by constant %u to %s\n"
 
-#: src/readelf.c:5937
+#: src/readelf.c:6577
 #, c-format
 msgid " advance address by fixed value %u to %s\n"
 msgstr " advance address by fixed value %u to %s\n"
 
-#: src/readelf.c:5946
+#: src/readelf.c:6586
 msgid " set prologue end flag"
 msgstr " set prologue end flag"
 
-#: src/readelf.c:5951
+#: src/readelf.c:6591
 msgid " set epilogue begin flag"
 msgstr " set epilogue begin flag"
 
-#: src/readelf.c:5960
+#: src/readelf.c:6600
 #, c-format
 msgid " set isa to %u\n"
 msgstr " set isa to %u\n"
 
-#: src/readelf.c:5969
+#: src/readelf.c:6609
 #, c-format
 msgid " unknown opcode with %<PRIu8> parameter:"
 msgid_plural " unknown opcode with %<PRIu8> parameters:"
 msgstr[0] " unknown opcode with %<PRIu8> parameter:"
 msgstr[1] " unknown opcode with %<PRIu8> parameters:"
 
-#: src/readelf.c:6001
+#: src/readelf.c:6641
 #, c-format
 msgid "cannot get .debug_loc content: %s"
 msgstr "cannot get .debug_loc content: %s"
 
-#: src/readelf.c:6071
+#: src/readelf.c:6716
 #, c-format
 msgid " [%6tx]  %s..%s"
 msgstr " [%6tx]  %s..%s"
 
-#: src/readelf.c:6073
+#: src/readelf.c:6718
 #, c-format
 msgid "           %s..%s"
 msgstr "           %s..%s"
 
-#: src/readelf.c:6080
+#: src/readelf.c:6725
 msgid "   <INVALID DATA>\n"
 msgstr "   <INVALID DATA>\n"
 
-#: src/readelf.c:6132 src/readelf.c:6286
+#: src/readelf.c:6777 src/readelf.c:6931
 #, c-format
 msgid "cannot get macro information section data: %s"
 msgstr "cannot get macro information section data: %s"
 
-#: src/readelf.c:6211
+#: src/readelf.c:6856
 #, c-format
 msgid "%*s*** non-terminated string at end of section"
 msgstr "%*s*** non-terminated string at end of section"
 
-#: src/readelf.c:6327
+#: src/readelf.c:6972
 #, c-format
 msgid " Offset:             0x%<PRIx64>\n"
 msgstr " Offset:             0x%<PRIx64>\n"
 
-#: src/readelf.c:6339
+#: src/readelf.c:6984
 #, c-format
 msgid " Version:            %<PRIu16>\n"
 msgstr " Version:            %<PRIu16>\n"
 
-#: src/readelf.c:6345 src/readelf.c:7055
+#: src/readelf.c:6990 src/readelf.c:7703
 #, c-format
 msgid "  unknown version, cannot parse section\n"
 msgstr "  unknown version, cannot parse section\n"
 
-#: src/readelf.c:6352
+#: src/readelf.c:6997
 #, c-format
 msgid " Flag:               0x%<PRIx8>\n"
 msgstr " Flag:               0x%<PRIx8>\n"
 
-#: src/readelf.c:6355
+#: src/readelf.c:7000
 #, c-format
 msgid " Offset length:      %<PRIu8>\n"
 msgstr " Offset length:      %<PRIu8>\n"
 
-#: src/readelf.c:6363
+#: src/readelf.c:7008
 #, c-format
 msgid " .debug_line offset: 0x%<PRIx64>\n"
 msgstr " .debug_line offset: 0x%<PRIx64>\n"
 
-#: src/readelf.c:6375
+#: src/readelf.c:7021
 #, c-format
 msgid "  extension opcode table, %<PRIu8> items:\n"
 msgstr "  extension opcode table, %<PRIu8> items:\n"
 
-#: src/readelf.c:6382
+#: src/readelf.c:7028
 #, c-format
 msgid "    [%<PRIx8>]"
 msgstr "    [%<PRIx8>]"
 
-#: src/readelf.c:6394
+#: src/readelf.c:7040
 #, c-format
 msgid " %<PRIu8> arguments:"
 msgstr " %<PRIu8> arguments:"
 
-#: src/readelf.c:6422
+#: src/readelf.c:7068
 #, c-format
 msgid " no arguments."
 msgstr " no arguments."
 
-#: src/readelf.c:6657
+#: src/readelf.c:7303
 #, c-format
 msgid "vendor opcode not verified?"
 msgstr "vendor opcode not verified?"
 
-#: src/readelf.c:6685
+#: src/readelf.c:7331
 #, c-format
 msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
 msgstr " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
 
-#: src/readelf.c:6726
+#: src/readelf.c:7372
 #, c-format
 msgid ""
 "\n"
@@ -5493,12 +5694,12 @@ msgstr ""
 "DWARF section [%2zu] ‘\e[1m%s\e[0m’ at offset %#<PRIx64>:\n"
 " %*s  String\n"
 
-#: src/readelf.c:6740
+#: src/readelf.c:7386
 #, c-format
 msgid " *** error while reading strings: %s\n"
 msgstr " *** error while reading strings: %s\n"
 
-#: src/readelf.c:6760
+#: src/readelf.c:7406
 #, c-format
 msgid ""
 "\n"
@@ -5507,7 +5708,7 @@ msgstr ""
 "\n"
 "Call frame search table section [%2zu] '.eh_frame_hdr':\n"
 
-#: src/readelf.c:6862
+#: src/readelf.c:7508
 #, c-format
 msgid ""
 "\n"
@@ -5516,22 +5717,22 @@ msgstr ""
 "\n"
 "Exception handling table section [%2zu] '.gcc_except_table':\n"
 
-#: src/readelf.c:6885
+#: src/readelf.c:7531
 #, c-format
 msgid " LPStart encoding:    %#x "
 msgstr " LPStart encoding:    %#x "
 
-#: src/readelf.c:6897
+#: src/readelf.c:7543
 #, c-format
 msgid " TType encoding:      %#x "
 msgstr " TType encoding:      %#x "
 
-#: src/readelf.c:6911
+#: src/readelf.c:7557
 #, c-format
 msgid " Call site encoding:  %#x "
 msgstr " Call site encoding:  %#x "
 
-#: src/readelf.c:6924
+#: src/readelf.c:7570
 msgid ""
 "\n"
 " Call site table:"
@@ -5539,7 +5740,7 @@ msgstr ""
 "\n"
 " Call site table:"
 
-#: src/readelf.c:6938
+#: src/readelf.c:7584
 #, c-format
 msgid ""
 " [%4u] Call site start:   %#<PRIx64>\n"
@@ -5552,12 +5753,12 @@ msgstr ""
 "        Landing pad:       %#<PRIx64>\n"
 "        Action:            %u\n"
 
-#: src/readelf.c:6998
+#: src/readelf.c:7644
 #, c-format
 msgid "invalid TType encoding"
 msgstr "invalid TType encoding"
 
-#: src/readelf.c:7019
+#: src/readelf.c:7665
 #, c-format
 msgid ""
 "\n"
@@ -5567,37 +5768,37 @@ msgstr ""
 "GDB section [%2zu] ‘\e[1m%s\e[0m’ at offset %#<PRIx64> contains %<PRId64> "
 "bytes :\n"
 
-#: src/readelf.c:7048
+#: src/readelf.c:7694
 #, c-format
 msgid " Version:         %<PRId32>\n"
 msgstr " Version:         %<PRId32>\n"
 
-#: src/readelf.c:7064
+#: src/readelf.c:7712
 #, c-format
 msgid " CU offset:       %#<PRIx32>\n"
 msgstr " CU offset:       %#<PRIx32>\n"
 
-#: src/readelf.c:7071
+#: src/readelf.c:7719
 #, c-format
 msgid " TU offset:       %#<PRIx32>\n"
 msgstr " TU offset:       %#<PRIx32>\n"
 
-#: src/readelf.c:7078
+#: src/readelf.c:7726
 #, c-format
 msgid " address offset:  %#<PRIx32>\n"
 msgstr " address offset:  %#<PRIx32>\n"
 
-#: src/readelf.c:7085
+#: src/readelf.c:7733
 #, c-format
 msgid " symbol offset:   %#<PRIx32>\n"
 msgstr " symbol offset:   %#<PRIx32>\n"
 
-#: src/readelf.c:7092
+#: src/readelf.c:7740
 #, c-format
 msgid " constant offset: %#<PRIx32>\n"
 msgstr " constant offset: %#<PRIx32>\n"
 
-#: src/readelf.c:7099
+#: src/readelf.c:7747
 #, c-format
 msgid ""
 "\n"
@@ -5606,7 +5807,7 @@ msgstr ""
 "\n"
 " CU list at offset %#<PRIx32> contains %zu entries:\n"
 
-#: src/readelf.c:7121
+#: src/readelf.c:7769
 #, c-format
 msgid ""
 "\n"
@@ -5615,7 +5816,7 @@ msgstr ""
 "\n"
 " TU list at offset %#<PRIx32> contains %zu entries:\n"
 
-#: src/readelf.c:7147
+#: src/readelf.c:7795
 #, c-format
 msgid ""
 "\n"
@@ -5624,7 +5825,7 @@ msgstr ""
 "\n"
 " Address list at offset %#<PRIx32> contains %zu entries:\n"
 
-#: src/readelf.c:7174
+#: src/readelf.c:7824
 #, c-format
 msgid ""
 "\n"
@@ -5633,17 +5834,17 @@ msgstr ""
 "\n"
 " Symbol table at offset %#<PRIx32> contains %zu slots:\n"
 
-#: src/readelf.c:7259
+#: src/readelf.c:7909
 #, c-format
 msgid "cannot get debug context descriptor: %s"
 msgstr "cannot get debug context descriptor: %s"
 
-#: src/readelf.c:7409 src/readelf.c:8010
+#: src/readelf.c:8069 src/readelf.c:8675 src/readelf.c:8786 src/readelf.c:8844
 #, c-format
 msgid "cannot convert core note data: %s"
 msgstr "cannot convert core note data: %s"
 
-#: src/readelf.c:7750
+#: src/readelf.c:8416
 #, c-format
 msgid ""
 "\n"
@@ -5652,21 +5853,21 @@ msgstr ""
 "\n"
 "%*s... <repeats %u more times> ..."
 
-#: src/readelf.c:8109
+#: src/readelf.c:8919
 msgid "  Owner          Data size  Type\n"
 msgstr "  Owner          Data size  Type\n"
 
-#: src/readelf.c:8127
+#: src/readelf.c:8937
 #, c-format
 msgid "  %-13.*s  %9<PRId32>  %s\n"
 msgstr "  %-13.*s  %9<PRId32>  %s\n"
 
-#: src/readelf.c:8161
+#: src/readelf.c:8987
 #, c-format
 msgid "cannot get content of note section: %s"
 msgstr "cannot get content of note section: %s"
 
-#: src/readelf.c:8188
+#: src/readelf.c:9014
 #, c-format
 msgid ""
 "\n"
@@ -5675,7 +5876,7 @@ msgstr ""
 "\n"
 "Note section [%2zu] ‘\e[1m%s\e[0m’ of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 
-#: src/readelf.c:8211
+#: src/readelf.c:9037
 #, c-format
 msgid ""
 "\n"
@@ -5684,7 +5885,7 @@ msgstr ""
 "\n"
 "Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 
-#: src/readelf.c:8257
+#: src/readelf.c:9083
 #, c-format
 msgid ""
 "\n"
@@ -5693,12 +5894,12 @@ msgstr ""
 "\n"
 "Section [%Zu] ‘\e[1m%s\e[0m’ has no data to dump.\n"
 
-#: src/readelf.c:8263 src/readelf.c:8286
+#: src/readelf.c:9089 src/readelf.c:9112
 #, c-format
 msgid "cannot get data for section [%Zu] '%s': %s"
 msgstr "cannot get data for section [%Zu] '%s': %s"
 
-#: src/readelf.c:8267
+#: src/readelf.c:9093
 #, c-format
 msgid ""
 "\n"
@@ -5707,7 +5908,7 @@ msgstr ""
 "\n"
 "Hex dump of section [%Zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 
-#: src/readelf.c:8280
+#: src/readelf.c:9106
 #, c-format
 msgid ""
 "\n"
@@ -5716,7 +5917,7 @@ msgstr ""
 "\n"
 "Section [%Zu] ‘\e[1m%s\e[0m’ has no strings to dump.\n"
 
-#: src/readelf.c:8290
+#: src/readelf.c:9116
 #, c-format
 msgid ""
 "\n"
@@ -5726,7 +5927,7 @@ msgstr ""
 "String section [%Zu] ‘\e[1m%s\e[0m’ contains %<PRIu64> bytes at offset "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:8338
+#: src/readelf.c:9164
 #, c-format
 msgid ""
 "\n"
@@ -5735,7 +5936,7 @@ msgstr ""
 "\n"
 "section [%lu] does not exist"
 
-#: src/readelf.c:8367
+#: src/readelf.c:9193
 #, c-format
 msgid ""
 "\n"
@@ -5744,12 +5945,12 @@ msgstr ""
 "\n"
 "section ‘\e[1m%s\e[0m’ does not exist"
 
-#: src/readelf.c:8424
+#: src/readelf.c:9250
 #, c-format
 msgid "cannot get symbol index of archive '%s': %s"
 msgstr "cannot get symbol index of archive '%s': %s"
 
-#: src/readelf.c:8427
+#: src/readelf.c:9253
 #, c-format
 msgid ""
 "\n"
@@ -5758,7 +5959,7 @@ msgstr ""
 "\n"
 "Archive ‘\e[1m%s\e[0m’ has no symbol index\n"
 
-#: src/readelf.c:8431
+#: src/readelf.c:9257
 #, c-format
 msgid ""
 "\n"
@@ -5767,12 +5968,12 @@ msgstr ""
 "\n"
 "Index of archive ‘\e[1m%s\e[0m’ has %Zu entries:\n"
 
-#: src/readelf.c:8449
+#: src/readelf.c:9275
 #, c-format
 msgid "cannot extract member at offset %Zu in '%s': %s"
 msgstr "cannot extract member at offset %Zu in '%s': %s"
 
-#: src/readelf.c:8454
+#: src/readelf.c:9280
 #, c-format
 msgid "Archive member '%s' contains:\n"
 msgstr "Archive member ‘\e[1m%s\e[0m’ contains:\n"
@@ -5836,12 +6037,12 @@ msgstr "Invalid radix: %s"
 msgid "%s: file format not recognized"
 msgstr "%s: file format not recognized"
 
-#: src/size.c:438 src/size.c:581
+#: src/size.c:438 src/size.c:571
 #, c-format
 msgid " (ex %s)"
 msgstr " (ex %s)"
 
-#: src/size.c:606
+#: src/size.c:596
 msgid "(TOTALS)\n"
 msgstr "(TOTALS)\n"
 
@@ -5882,27 +6083,27 @@ msgstr "Alias for --radix=o"
 msgid "Print the strings of printable characters in files."
 msgstr "Print the strings of printable characters in files."
 
-#: src/strings.c:260 src/strings.c:295
+#: src/strings.c:267 src/strings.c:302
 #, c-format
 msgid "invalid value '%s' for %s parameter"
 msgstr "invalid value ‘\e[1m%s\e[0m’ for %s parameter"
 
-#: src/strings.c:306
+#: src/strings.c:313
 #, c-format
 msgid "invalid minimum length of matched string size"
 msgstr "invalid minimum length of matched string size"
 
-#: src/strings.c:591
+#: src/strings.c:596
 #, c-format
 msgid "lseek64 failed"
 msgstr "lseek64 failed"
 
-#: src/strings.c:608 src/strings.c:672
+#: src/strings.c:613 src/strings.c:677
 #, c-format
 msgid "re-mmap failed"
 msgstr "re-mmap failed"
 
-#: src/strings.c:645
+#: src/strings.c:650
 #, c-format
 msgid "mprotect failed"
 msgstr "mprotect failed"
@@ -5973,7 +6174,7 @@ msgstr "-f option specified twice"
 msgid "-F option specified twice"
 msgstr "-F option specified twice"
 
-#: src/strip.c:249 src/unstrip.c:117
+#: src/strip.c:249 src/unstrip.c:121
 #, c-format
 msgid "-o option specified twice"
 msgstr "-o option specified twice"
@@ -5998,87 +6199,87 @@ msgstr "while opening ‘\e[1m%s\e[0m’"
 msgid "%s: cannot use -o or -f when stripping archive"
 msgstr "%s: cannot use -o or -f when stripping archive"
 
-#: src/strip.c:467
+#: src/strip.c:468
 #, c-format
 msgid "cannot open EBL backend"
 msgstr "cannot open EBL backend"
 
-#: src/strip.c:517 src/strip.c:541
+#: src/strip.c:518 src/strip.c:542
 #, c-format
 msgid "cannot create new file '%s': %s"
 msgstr "cannot create new file '%s': %s"
 
-#: src/strip.c:601
+#: src/strip.c:608
 #, c-format
 msgid "illformed file '%s'"
 msgstr "illformed file ‘\e[1m%s\e[0m’"
 
-#: src/strip.c:905 src/strip.c:994
+#: src/strip.c:930 src/strip.c:1019
 #, c-format
 msgid "while generating output file: %s"
 msgstr "while generating output file: %s"
 
-#: src/strip.c:967 src/strip.c:1929
+#: src/strip.c:992 src/strip.c:1957
 #, c-format
 msgid "%s: error while creating ELF header: %s"
 msgstr "%s: error while creating ELF header: %s"
 
-#: src/strip.c:981
+#: src/strip.c:1006
 #, c-format
 msgid "while preparing output for '%s'"
 msgstr "while preparing output for ‘\e[1m%s\e[0m’"
 
-#: src/strip.c:1032 src/strip.c:1088
+#: src/strip.c:1057 src/strip.c:1114
 #, c-format
 msgid "while create section header section: %s"
 msgstr "while create section header section: %s"
 
-#: src/strip.c:1038
+#: src/strip.c:1063
 #, c-format
 msgid "cannot allocate section data: %s"
 msgstr "cannot allocate section data: %s"
 
-#: src/strip.c:1097
+#: src/strip.c:1123
 #, c-format
 msgid "while create section header string table: %s"
 msgstr "while create section header string table: %s"
 
-#: src/strip.c:1724
+#: src/strip.c:1752
 #, c-format
 msgid "bad relocation"
 msgstr "bad relocation"
 
-#: src/strip.c:1841 src/strip.c:1951
+#: src/strip.c:1869 src/strip.c:1979
 #, c-format
 msgid "while writing '%s': %s"
 msgstr "while writing '%s': %s"
 
-#: src/strip.c:1852
+#: src/strip.c:1880
 #, c-format
 msgid "while creating '%s'"
 msgstr "while creating ‘\e[1m%s\e[0m’"
 
-#: src/strip.c:1874
+#: src/strip.c:1902
 #, c-format
 msgid "while computing checksum for debug information"
 msgstr "while computing checksum for debug information"
 
-#: src/strip.c:1937
+#: src/strip.c:1965
 #, c-format
 msgid "%s: error while reading the file: %s"
 msgstr "%s: error while reading the file: %s"
 
-#: src/strip.c:1976 src/strip.c:1996
+#: src/strip.c:2004 src/strip.c:2024
 #, c-format
 msgid "while writing '%s'"
 msgstr "while writing ‘\e[1m%s\e[0m’"
 
-#: src/strip.c:2030 src/strip.c:2037
+#: src/strip.c:2061 src/strip.c:2068
 #, c-format
 msgid "error while finishing '%s': %s"
 msgstr "error while finishing '%s': %s"
 
-#: src/strip.c:2060 src/strip.c:2117
+#: src/strip.c:2091 src/strip.c:2148
 #, c-format
 msgid "cannot set access and modification date of '%s'"
 msgstr "cannot set access and modification date of ‘\e[1m%s\e[0m’"
@@ -6115,203 +6316,207 @@ msgstr "Apply relocations to section contents in ET_REL files"
 msgid "Only list module and file names, build IDs"
 msgstr "Only list module and file names, build IDs"
 
-#: src/unstrip.c:126
+#: src/unstrip.c:86
+msgid "Force combining files even if some ELF headers don't seem to match"
+msgstr "Force combining files even if some ELF headers don't seem to match"
+
+#: src/unstrip.c:130
 #, c-format
 msgid "-d option specified twice"
 msgstr "-d option specified twice"
 
-#: src/unstrip.c:158
+#: src/unstrip.c:165
 #, c-format
 msgid "only one of -o or -d allowed"
 msgstr "only one of -o or -d allowed"
 
-#: src/unstrip.c:167
+#: src/unstrip.c:174
 #, c-format
 msgid "-n cannot be used with explicit files or -o or -d"
 msgstr "-n cannot be used with explicit files or -o or -d"
 
-#: src/unstrip.c:182
+#: src/unstrip.c:189
 #, c-format
 msgid "output directory '%s'"
 msgstr "output directory ‘\e[1m%s\e[0m’"
 
-#: src/unstrip.c:191
+#: src/unstrip.c:198
 #, c-format
 msgid "exactly two file arguments are required"
 msgstr "exactly two file arguments are required"
 
-#: src/unstrip.c:197
+#: src/unstrip.c:204
 #, c-format
 msgid "-m, -a, -R, and -i options not allowed with explicit files"
 msgstr "-m, -a, -R, and -i options not allowed with explicit files"
 
-#: src/unstrip.c:210
+#: src/unstrip.c:217
 #, c-format
 msgid "-o or -d is required when using implicit files"
 msgstr "-o or -d is required when using implicit files"
 
-#: src/unstrip.c:246
+#: src/unstrip.c:253
 #, c-format
 msgid "cannot create ELF header: %s"
 msgstr "cannot create ELF header: %s"
 
-#: src/unstrip.c:251
+#: src/unstrip.c:258
 #, c-format
 msgid "cannot copy ELF header: %s"
 msgstr "cannot copy ELF header: %s"
 
-#: src/unstrip.c:256 src/unstrip.c:1820
+#: src/unstrip.c:263 src/unstrip.c:1828
 #, c-format
 msgid "cannot create program headers: %s"
 msgstr "cannot create program headers: %s"
 
-#: src/unstrip.c:262
+#: src/unstrip.c:269
 #, c-format
 msgid "cannot copy program header: %s"
 msgstr "cannot copy program header: %s"
 
-#: src/unstrip.c:272
+#: src/unstrip.c:279
 #, c-format
 msgid "cannot copy section header: %s"
 msgstr "cannot copy section header: %s"
 
-#: src/unstrip.c:275 src/unstrip.c:1501
+#: src/unstrip.c:282 src/unstrip.c:1509
 #, c-format
 msgid "cannot get section data: %s"
 msgstr "cannot get section data: %s"
 
-#: src/unstrip.c:277 src/unstrip.c:1503
+#: src/unstrip.c:284 src/unstrip.c:1511
 #, c-format
 msgid "cannot copy section data: %s"
 msgstr "cannot copy section data: %s"
 
-#: src/unstrip.c:301
+#: src/unstrip.c:308
 #, c-format
 msgid "cannot create directory '%s'"
 msgstr "cannot create directory ‘\e[1m%s\e[0m’"
 
-#: src/unstrip.c:341 src/unstrip.c:758 src/unstrip.c:1535
+#: src/unstrip.c:348 src/unstrip.c:765 src/unstrip.c:1543
 #, c-format
 msgid "cannot get symbol table entry: %s"
 msgstr "cannot get symbol table entry: %s"
 
-#: src/unstrip.c:357 src/unstrip.c:575 src/unstrip.c:596 src/unstrip.c:608
-#: src/unstrip.c:1556 src/unstrip.c:1686 src/unstrip.c:1710
+#: src/unstrip.c:364 src/unstrip.c:582 src/unstrip.c:603 src/unstrip.c:615
+#: src/unstrip.c:1564 src/unstrip.c:1694 src/unstrip.c:1718
 #, c-format
 msgid "cannot update symbol table: %s"
 msgstr "cannot update symbol table: %s"
 
-#: src/unstrip.c:367
+#: src/unstrip.c:374
 #, c-format
 msgid "cannot update section header: %s"
 msgstr "cannot update section header: %s"
 
-#: src/unstrip.c:406 src/unstrip.c:417
+#: src/unstrip.c:413 src/unstrip.c:424
 #, c-format
 msgid "cannot update relocation: %s"
 msgstr "cannot update relocation: %s"
 
-#: src/unstrip.c:504
+#: src/unstrip.c:511
 #, c-format
 msgid "cannot get symbol version: %s"
 msgstr "cannot get symbol version: %s"
 
-#: src/unstrip.c:516
+#: src/unstrip.c:523
 #, c-format
 msgid "unexpected section type in [%Zu] with sh_link to symtab"
 msgstr "unexpected section type in [%Zu] with sh_link to symtab"
 
-#: src/unstrip.c:764
+#: src/unstrip.c:771
 #, c-format
 msgid "invalid string offset in symbol [%Zu]"
 msgstr "invalid string offset in symbol [%Zu]"
 
-#: src/unstrip.c:906 src/unstrip.c:1246
+#: src/unstrip.c:913 src/unstrip.c:1254
 #, c-format
 msgid "cannot read section [%Zu] name: %s"
 msgstr "cannot read section [%Zu] name: %s"
 
-#: src/unstrip.c:947 src/unstrip.c:966 src/unstrip.c:999
+#: src/unstrip.c:954 src/unstrip.c:973 src/unstrip.c:1006
 #, c-format
 msgid "cannot read '.gnu.prelink_undo' section: %s"
 msgstr "cannot read ‘\e[1m.gnu.prelink_undo\e[0m’ section: %s"
 
-#: src/unstrip.c:987
+#: src/unstrip.c:994
 #, c-format
 msgid "invalid contents in '%s' section"
 msgstr "invalid contents in ‘\e[1m%s\e[0m’ section"
 
-#: src/unstrip.c:1042 src/unstrip.c:1366
+#: src/unstrip.c:1049 src/unstrip.c:1374
 #, c-format
 msgid "cannot find matching section for [%Zu] '%s'"
 msgstr "cannot find matching section for [%Zu] ‘\e[1m%s\e[0m’"
 
-#: src/unstrip.c:1166 src/unstrip.c:1181 src/unstrip.c:1447
+#: src/unstrip.c:1174 src/unstrip.c:1189 src/unstrip.c:1455
 #, c-format
 msgid "cannot add section name to string table: %s"
 msgstr "cannot add section name to string table: %s"
 
-#: src/unstrip.c:1190
+#: src/unstrip.c:1198
 #, c-format
 msgid "cannot update section header string table data: %s"
 msgstr "cannot update section header string table data: %s"
 
-#: src/unstrip.c:1217 src/unstrip.c:1221
+#: src/unstrip.c:1225 src/unstrip.c:1229
 #, c-format
 msgid "cannot get section header string table section index: %s"
 msgstr "cannot get section header string table section index: %s"
 
-#: src/unstrip.c:1225 src/unstrip.c:1229 src/unstrip.c:1462
+#: src/unstrip.c:1233 src/unstrip.c:1237 src/unstrip.c:1470
 #, c-format
 msgid "cannot get section count: %s"
 msgstr "cannot get section count: %s"
 
-#: src/unstrip.c:1232
+#: src/unstrip.c:1240
 #, c-format
 msgid "more sections in stripped file than debug file -- arguments reversed?"
 msgstr "more sections in stripped file than debug file -- arguments reversed?"
 
-#: src/unstrip.c:1291 src/unstrip.c:1381
+#: src/unstrip.c:1299 src/unstrip.c:1389
 #, c-format
 msgid "cannot read section header string table: %s"
 msgstr "cannot read section header string table: %s"
 
-#: src/unstrip.c:1441
+#: src/unstrip.c:1449
 #, c-format
 msgid "cannot add new section: %s"
 msgstr "cannot add new section: %s"
 
-#: src/unstrip.c:1543
+#: src/unstrip.c:1551
 #, c-format
 msgid "symbol [%Zu] has invalid section index"
 msgstr "symbol [%Zu] has invalid section index"
 
-#: src/unstrip.c:1781
+#: src/unstrip.c:1789
 #, c-format
 msgid "cannot read section data: %s"
 msgstr "cannot read section data: %s"
 
-#: src/unstrip.c:1802
+#: src/unstrip.c:1810
 #, c-format
 msgid "cannot get ELF header: %s"
 msgstr "cannot get ELF header: %s"
 
-#: src/unstrip.c:1830
+#: src/unstrip.c:1838
 #, c-format
 msgid "cannot update program header: %s"
 msgstr "cannot update program header: %s"
 
-#: src/unstrip.c:1835 src/unstrip.c:1914
+#: src/unstrip.c:1843 src/unstrip.c:1922
 #, c-format
 msgid "cannot write output file: %s"
 msgstr "cannot write output file: %s"
 
-#: src/unstrip.c:1883
+#: src/unstrip.c:1891
 #, c-format
 msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
 msgstr "DWARF data not adjusted for prelinking bias; consider prelink -u"
 
-#: src/unstrip.c:1886
+#: src/unstrip.c:1894
 #, c-format
 msgid ""
 "DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
@@ -6319,57 +6524,76 @@ msgstr ""
 "DWARF data in ‘\e[1m%s\e[0m’ not adjusted for prelinking bias; consider prelink -"
 "u"
 
-#: src/unstrip.c:1905 src/unstrip.c:1945 src/unstrip.c:1957 src/unstrip.c:2037
+#: src/unstrip.c:1913 src/unstrip.c:1964 src/unstrip.c:1976 src/unstrip.c:2062
 #, c-format
 msgid "cannot create ELF descriptor: %s"
 msgstr "cannot create ELF descriptor: %s"
 
-#: src/unstrip.c:1963
-#, c-format
-msgid "'%s' and '%s' do not seem to match"
-msgstr "‘\e[1m%s\e[0m’ and ‘\e[1m%s\e[0m’ do not seem to match"
+#: src/unstrip.c:1955
+msgid "WARNING: "
+msgstr "WARNING: "
+
+#: src/unstrip.c:1957
+msgid ", use --force"
+msgstr ", use --force"
+
+#: src/unstrip.c:1980
+msgid "ELF header identification (e_ident) different"
+msgstr "ELF header identification (e_ident) different"
+
+#: src/unstrip.c:1983
+msgid "ELF header type (e_type) different"
+msgstr "ELF header type (e_type) different"
+
+#: src/unstrip.c:1986
+msgid "ELF header machine type (e_machine) different"
+msgstr "ELF header machine type (e_machine) different"
+
+#: src/unstrip.c:1989
+msgid "stripped program header (e_phnum) smaller than unstripped"
+msgstr "stripped program header (e_phnum) smaller than unstripped"
 
-#: src/unstrip.c:1994
+#: src/unstrip.c:2019
 #, c-format
 msgid "cannot find stripped file for module '%s': %s"
 msgstr "cannot find stripped file for module '%s': %s"
 
-#: src/unstrip.c:1998
+#: src/unstrip.c:2023
 #, c-format
 msgid "cannot open stripped file '%s' for module '%s': %s"
 msgstr "cannot open stripped file ‘\e[1m%s\e[0m’ for module '%s': %s"
 
-#: src/unstrip.c:2013
+#: src/unstrip.c:2038
 #, c-format
 msgid "cannot find debug file for module '%s': %s"
 msgstr "cannot find debug file for module '%s': %s"
 
-#: src/unstrip.c:2017
+#: src/unstrip.c:2042
 #, c-format
 msgid "cannot open debug file '%s' for module '%s': %s"
 msgstr "cannot open debug file ‘\e[1m%s\e[0m’ for module '%s': %s"
 
-#: src/unstrip.c:2030
+#: src/unstrip.c:2055
 #, c-format
 msgid "module '%s' file '%s' is not stripped"
 msgstr "module ‘\e[1m%s\e[0m’ file ‘\e[1m%s\e[0m’ is not stripped"
 
-#: src/unstrip.c:2061
+#: src/unstrip.c:2086
 #, c-format
 msgid "cannot cache section addresses for module '%s': %s"
 msgstr "cannot cache section addresses for module '%s': %s"
 
-#: src/unstrip.c:2194
+#: src/unstrip.c:2219
 #, c-format
 msgid "no matching modules found"
 msgstr "no matching modules found"
 
-#: src/unstrip.c:2203
+#: src/unstrip.c:2228
 #, c-format
 msgid "matched more than one module"
 msgstr "matched more than one module"
 
-#: src/unstrip.c:2250
+#: src/unstrip.c:2275
 msgid ""
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
@@ -6377,7 +6601,7 @@ msgstr ""
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
 
-#: src/unstrip.c:2251
+#: src/unstrip.c:2276
 msgid ""
 "Combine stripped files with separate symbols and debug information.\vThe "
 "first form puts the result in DEBUG-FILE if -o was not given.\n"
index 6ccef26..33da5ab 100644 (file)
Binary files a/po/en@quot.gmo and b/po/en@quot.gmo differ
index b0d24d7..c598904 100644 (file)
@@ -1,7 +1,7 @@
 # English translations for elfutils package.
-# Copyright (C) 2012 Red Hat, Inc.
+# Copyright (C) 2014 Red Hat, Inc.
 # This file is distributed under the same license as the elfutils package.
-# Automatically generated, 2012.
+# Automatically generated, 2014.
 #
 # All this catalog "translates" are quotation characters.
 # The msgids must be ASCII and therefore cannot contain real quotation
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: elfutils 0.155\n"
+"Project-Id-Version: elfutils 0.160\n"
 "Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
-"POT-Creation-Date: 2012-08-27 20:34+0200\n"
-"PO-Revision-Date: 2012-08-27 20:34+0200\n"
+"POT-Creation-Date: 2014-08-27 11:26+0200\n"
+"PO-Revision-Date: 2014-08-27 11:26+0200\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
-"Language: en\n"
+"Language: en@quot\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: lib/xmalloc.c:54 lib/xmalloc.c:68 lib/xmalloc.c:82 src/readelf.c:2842
-#: src/readelf.c:3181 src/unstrip.c:2090 src/unstrip.c:2298
+#: lib/xmalloc.c:54 lib/xmalloc.c:68 lib/xmalloc.c:82 src/readelf.c:3098
+#: src/readelf.c:3447 src/readelf.c:8018 src/unstrip.c:2115 src/unstrip.c:2323
 #, c-format
 msgid "memory exhausted"
 msgstr "memory exhausted"
 
-#: libasm/asm_error.c:65 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:49
+#: libasm/asm_error.c:65 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:53
 #: libelf/elf_error.c:60
 msgid "no error"
 msgstr "no error"
 
-#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:51
+#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:55
 #: libelf/elf_error.c:91
 msgid "out of memory"
 msgstr "out of memory"
@@ -89,7 +89,7 @@ msgstr "error during output of data"
 msgid "no backend support available"
 msgstr "no backend support available"
 
-#: libasm/asm_error.c:84 libdw/dwarf_error.c:59 libdwfl/libdwflP.h:50
+#: libasm/asm_error.c:84 libdw/dwarf_error.c:59 libdwfl/libdwflP.h:54
 #: libelf/elf_error.c:63
 msgid "unknown error"
 msgstr "unknown error"
@@ -186,7 +186,7 @@ msgstr "invalid DWARF version"
 msgid "invalid directory index"
 msgstr "invalid directory index"
 
-#: libdw/dwarf_error.c:84 libdwfl/libdwflP.h:70
+#: libdw/dwarf_error.c:84 libdwfl/libdwflP.h:74
 msgid "address out of range"
 msgstr "address out of range"
 
@@ -206,7 +206,7 @@ msgstr "invalid line index"
 msgid "invalid address range index"
 msgstr "invalid address range index"
 
-#: libdw/dwarf_error.c:89 libdwfl/libdwflP.h:71
+#: libdw/dwarf_error.c:89 libdwfl/libdwflP.h:75
 msgid "no matching address range"
 msgstr "no matching address range"
 
@@ -230,7 +230,7 @@ msgstr "invalid CFI section"
 msgid "no alternative debug link found"
 msgstr "no alternative debug link found"
 
-#: libdwfl/argp-std.c:46 src/unstrip.c:2240
+#: libdwfl/argp-std.c:46 src/unstrip.c:2265
 msgid "Input selection options:"
 msgstr "Input selection options:"
 
@@ -266,132 +266,188 @@ msgstr "Kernel with all modules"
 msgid "Search path for separate debuginfo files"
 msgstr "Search path for separate debuginfo files"
 
-#: libdwfl/argp-std.c:142
+#: libdwfl/argp-std.c:157
 msgid "only one of -e, -p, -k, -K, or --core allowed"
 msgstr "only one of -e, -p, -k, -K, or --core allowed"
 
-#: libdwfl/argp-std.c:202
-#, c-format
-msgid "cannot read ELF core file: %s"
-msgstr "cannot read ELF core file: %s"
-
-#: libdwfl/argp-std.c:220
-msgid "No modules recognized in core file"
-msgstr "No modules recognized in core file"
-
-#: libdwfl/argp-std.c:232
+#: libdwfl/argp-std.c:230
 msgid "cannot load kernel symbols"
 msgstr "cannot load kernel symbols"
 
-#: libdwfl/argp-std.c:236
+#: libdwfl/argp-std.c:234
 msgid "cannot find kernel modules"
 msgstr "cannot find kernel modules"
 
-#: libdwfl/argp-std.c:250
+#: libdwfl/argp-std.c:251
 msgid "cannot find kernel or modules"
 msgstr "cannot find kernel or modules"
 
-#: libdwfl/libdwflP.h:52
+#: libdwfl/argp-std.c:290
+#, c-format
+msgid "cannot read ELF core file: %s"
+msgstr "cannot read ELF core file: %s"
+
+#: libdwfl/argp-std.c:311
+msgid "No modules recognized in core file"
+msgstr "No modules recognized in core file"
+
+#: libdwfl/libdwflP.h:56
 msgid "See errno"
 msgstr "See errno"
 
-#: libdwfl/libdwflP.h:53
+#: libdwfl/libdwflP.h:57
 msgid "See elf_errno"
 msgstr "See elf_errno"
 
-#: libdwfl/libdwflP.h:54
+#: libdwfl/libdwflP.h:58
 msgid "See dwarf_errno"
 msgstr "See dwarf_errno"
 
-#: libdwfl/libdwflP.h:55
+#: libdwfl/libdwflP.h:59
 msgid "See ebl_errno (XXX missing)"
 msgstr "See ebl_errno (XXX missing)"
 
-#: libdwfl/libdwflP.h:56
+#: libdwfl/libdwflP.h:60
 msgid "gzip decompression failed"
 msgstr "gzip decompression failed"
 
-#: libdwfl/libdwflP.h:57
+#: libdwfl/libdwflP.h:61
 msgid "bzip2 decompression failed"
 msgstr "bzip2 decompression failed"
 
-#: libdwfl/libdwflP.h:58
+#: libdwfl/libdwflP.h:62
 msgid "LZMA decompression failed"
 msgstr "LZMA decompression failed"
 
-#: libdwfl/libdwflP.h:59
+#: libdwfl/libdwflP.h:63
 msgid "no support library found for machine"
 msgstr "no support library found for machine"
 
-#: libdwfl/libdwflP.h:60
+#: libdwfl/libdwflP.h:64
 msgid "Callbacks missing for ET_REL file"
 msgstr "Callbacks missing for ET_REL file"
 
-#: libdwfl/libdwflP.h:61
+#: libdwfl/libdwflP.h:65
 msgid "Unsupported relocation type"
 msgstr "Unsupported relocation type"
 
-#: libdwfl/libdwflP.h:62
+#: libdwfl/libdwflP.h:66
 msgid "r_offset is bogus"
 msgstr "r_offset is bogus"
 
-#: libdwfl/libdwflP.h:63 libelf/elf_error.c:111 libelf/elf_error.c:171
+#: libdwfl/libdwflP.h:67 libelf/elf_error.c:111 libelf/elf_error.c:171
 msgid "offset out of range"
 msgstr "offset out of range"
 
-#: libdwfl/libdwflP.h:64
+#: libdwfl/libdwflP.h:68
 msgid "relocation refers to undefined symbol"
 msgstr "relocation refers to undefined symbol"
 
-#: libdwfl/libdwflP.h:65
+#: libdwfl/libdwflP.h:69
 msgid "Callback returned failure"
 msgstr "Callback returned failure"
 
-#: libdwfl/libdwflP.h:66
+#: libdwfl/libdwflP.h:70
 msgid "No DWARF information found"
 msgstr "No DWARF information found"
 
-#: libdwfl/libdwflP.h:67
+#: libdwfl/libdwflP.h:71
 msgid "No symbol table found"
 msgstr "No symbol table found"
 
-#: libdwfl/libdwflP.h:68
+#: libdwfl/libdwflP.h:72
 msgid "No ELF program headers"
 msgstr "No ELF program headers"
 
-#: libdwfl/libdwflP.h:69
+#: libdwfl/libdwflP.h:73
 msgid "address range overlaps an existing module"
 msgstr "address range overlaps an existing module"
 
-#: libdwfl/libdwflP.h:72
+#: libdwfl/libdwflP.h:76
 msgid "image truncated"
 msgstr "image truncated"
 
-#: libdwfl/libdwflP.h:73
+#: libdwfl/libdwflP.h:77
 msgid "ELF file opened"
 msgstr "ELF file opened"
 
-#: libdwfl/libdwflP.h:74
+#: libdwfl/libdwflP.h:78
 msgid "not a valid ELF file"
 msgstr "not a valid ELF file"
 
-#: libdwfl/libdwflP.h:75
+#: libdwfl/libdwflP.h:79
 msgid "cannot handle DWARF type description"
 msgstr "cannot handle DWARF type description"
 
-#: libdwfl/libdwflP.h:76
+#: libdwfl/libdwflP.h:80
 msgid "ELF file does not match build ID"
 msgstr "ELF file does not match build ID"
 
-#: libdwfl/libdwflP.h:77
+#: libdwfl/libdwflP.h:81
 msgid "corrupt .gnu.prelink_undo section data"
 msgstr "corrupt .gnu.prelink_undo section data"
 
+#: libdwfl/libdwflP.h:82
+msgid "Internal error due to ebl"
+msgstr "Internal error due to ebl"
+
+#: libdwfl/libdwflP.h:83
+msgid "Missing data in core file"
+msgstr "Missing data in core file"
+
+#: libdwfl/libdwflP.h:84
+msgid "Invalid register"
+msgstr "Invalid register"
+
+#: libdwfl/libdwflP.h:85
+msgid "Error reading process memory"
+msgstr "Error reading process memory"
+
+#: libdwfl/libdwflP.h:86
+msgid "Couldn't find architecture of any ELF"
+msgstr "Couldn't find architecture of any ELF"
+
+#: libdwfl/libdwflP.h:87
+msgid "Error parsing /proc filesystem"
+msgstr "Error parsing /proc filesystem"
+
+#: libdwfl/libdwflP.h:88
+msgid "Invalid DWARF"
+msgstr "Invalid DWARF"
+
+#: libdwfl/libdwflP.h:89
+msgid "Unsupported DWARF"
+msgstr "Unsupported DWARF"
+
+#: libdwfl/libdwflP.h:90
+msgid "Unable to find more threads"
+msgstr "Unable to find more threads"
+
+#: libdwfl/libdwflP.h:91
+msgid "Dwfl already has attached state"
+msgstr "Dwfl already has attached state"
+
+#: libdwfl/libdwflP.h:92
+msgid "Dwfl has no attached state"
+msgstr "Dwfl has no attached state"
+
+#: libdwfl/libdwflP.h:93
+msgid "Unwinding not supported for this architecture"
+msgstr "Unwinding not supported for this architecture"
+
+#: libdwfl/libdwflP.h:94
+msgid "Invalid argument"
+msgstr "Invalid argument"
+
+#: libdwfl/libdwflP.h:95
+msgid "Not an ET_CORE ELF file"
+msgstr "Not an ET_CORE ELF file"
+
 #: libebl/eblbackendname.c:42
 msgid "No backend"
 msgstr "No backend"
 
-#: libebl/eblcorenotetypename.c:86 libebl/eblobjecttypename.c:57
+#: libebl/eblcorenotetypename.c:102 libebl/eblobjecttypename.c:57
 #: libebl/eblobjnotetypename.c:73 libebl/eblosabiname.c:77
 #: libebl/eblsectionname.c:89 libebl/eblsectiontypename.c:119
 #: libebl/eblsegmenttypename.c:83
@@ -487,7 +543,7 @@ msgstr "invalid size of source operand"
 msgid "invalid size of destination operand"
 msgstr "invalid size of destination operand"
 
-#: libelf/elf_error.c:87 src/readelf.c:4697
+#: libelf/elf_error.c:87 src/readelf.c:5190
 #, c-format
 msgid "invalid encoding"
 msgstr "invalid encoding"
@@ -568,8 +624,8 @@ msgstr "data/scn mismatch"
 msgid "invalid section header"
 msgstr "invalid section header"
 
-#: libelf/elf_error.c:187 src/readelf.c:6335 src/readelf.c:6780
-#: src/readelf.c:6881 src/readelf.c:7043
+#: libelf/elf_error.c:187 src/readelf.c:6980 src/readelf.c:7426
+#: src/readelf.c:7527 src/readelf.c:7689
 #, c-format
 msgid "invalid data"
 msgstr "invalid data"
@@ -633,32 +689,44 @@ msgid "Also show symbol or section names"
 msgstr "Also show symbol or section names"
 
 #: src/addr2line.c:64
+msgid "Also show symbol and the section names"
+msgstr "Also show symbol and the section names"
+
+#: src/addr2line.c:65
 msgid "Also show line table flags"
 msgstr "Also show line table flags"
 
-#: src/addr2line.c:66
+#: src/addr2line.c:67
 msgid "Treat addresses as offsets relative to NAME section."
 msgstr "Treat addresses as offsets relative to NAME section."
 
-#: src/addr2line.c:68 src/elfcmp.c:72 src/findtextrel.c:67 src/nm.c:100
+#: src/addr2line.c:69
+msgid ""
+"Show all source locations that caused inline expansion of subroutines at the "
+"address."
+msgstr ""
+"Show all source locations that caused inline expansion of subroutines at the "
+"address."
+
+#: src/addr2line.c:72 src/elfcmp.c:72 src/findtextrel.c:67 src/nm.c:100
 #: src/strings.c:75
 msgid "Miscellaneous:"
 msgstr "Miscellaneous:"
 
-#: src/addr2line.c:77
+#: src/addr2line.c:81
 msgid ""
 "Locate source files and line information for ADDRs (in a.out by default)."
 msgstr ""
 "Locate source files and line information for ADDRs (in a.out by default)."
 
-#: src/addr2line.c:81
+#: src/addr2line.c:85
 msgid "[ADDR...]"
 msgstr "[ADDR...]"
 
-#: src/addr2line.c:181 src/ar.c:289 src/elfcmp.c:662 src/elflint.c:231
+#: src/addr2line.c:196 src/ar.c:289 src/elfcmp.c:662 src/elflint.c:235
 #: src/findtextrel.c:162 src/ld.c:949 src/nm.c:265 src/objdump.c:181
-#: src/ranlib.c:128 src/readelf.c:460 src/size.c:211 src/strings.c:219
-#: src/strip.c:213 src/unstrip.c:226
+#: src/ranlib.c:128 src/readelf.c:500 src/size.c:211 src/strings.c:226
+#: src/strip.c:213 src/unstrip.c:233
 #, c-format
 msgid ""
 "Copyright (C) %s Red Hat, Inc.\n"
@@ -669,30 +737,30 @@ 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"
 
-#: src/addr2line.c:186 src/ar.c:294 src/elfcmp.c:667 src/elflint.c:236
+#: src/addr2line.c:201 src/ar.c:294 src/elfcmp.c:667 src/elflint.c:240
 #: src/findtextrel.c:167 src/ld.c:954 src/nm.c:270 src/objdump.c:186
-#: src/ranlib.c:133 src/readelf.c:465 src/size.c:216 src/strings.c:224
-#: src/strip.c:218 src/unstrip.c:231
+#: src/ranlib.c:133 src/readelf.c:505 src/size.c:216 src/strings.c:231
+#: src/strip.c:218 src/unstrip.c:238
 #, c-format
 msgid "Written by %s.\n"
 msgstr "Written by %s.\n"
 
-#: src/addr2line.c:405
+#: src/addr2line.c:474
 #, c-format
 msgid "Section syntax requires exactly one module"
 msgstr "Section syntax requires exactly one module"
 
-#: src/addr2line.c:428
+#: src/addr2line.c:497
 #, c-format
 msgid "offset %#<PRIxMAX> lies outside section '%s'"
 msgstr "offset %#<PRIxMAX> lies outside section ‘%s’"
 
-#: src/addr2line.c:469
+#: src/addr2line.c:563
 #, c-format
 msgid "cannot find symbol '%s'"
 msgstr "cannot find symbol ‘%s’"
 
-#: src/addr2line.c:474
+#: src/addr2line.c:568
 #, c-format
 msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
 msgstr "offset %#<PRIxMAX> lies outside contents of ‘%s’"
@@ -1131,8 +1199,8 @@ msgstr "Invalid value ‘%s’ for --gaps parameter."
 
 #: src/elfcmp.c:722 src/findtextrel.c:221 src/ldgeneric.c:1757
 #: src/ldgeneric.c:4247 src/nm.c:381 src/ranlib.c:161 src/size.c:293
-#: src/strings.c:175 src/strip.c:450 src/strip.c:487 src/unstrip.c:1903
-#: src/unstrip.c:1932
+#: src/strings.c:182 src/strip.c:451 src/strip.c:488 src/unstrip.c:1911
+#: src/unstrip.c:1940
 #, c-format
 msgid "cannot open '%s'"
 msgstr "cannot open ‘%s’"
@@ -1186,159 +1254,159 @@ msgstr ""
 msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
 msgstr "Pedantic checking of ELF files compliance with gABI/psABI spec."
 
-#: src/elflint.c:78 src/readelf.c:113
+#: src/elflint.c:78 src/readelf.c:123
 msgid "FILE..."
 msgstr "FILE..."
 
-#: src/elflint.c:151 src/readelf.c:271
+#: src/elflint.c:155 src/readelf.c:292
 #, c-format
 msgid "cannot open input file"
 msgstr "cannot open input file"
 
-#: src/elflint.c:158
+#: src/elflint.c:162
 #, c-format
 msgid "cannot generate Elf descriptor: %s\n"
 msgstr "cannot generate Elf descriptor: %s\n"
 
-#: src/elflint.c:177
+#: src/elflint.c:181
 #, c-format
 msgid "error while closing Elf descriptor: %s\n"
 msgstr "error while closing Elf descriptor: %s\n"
 
-#: src/elflint.c:181
+#: src/elflint.c:185
 msgid "No errors"
 msgstr "No errors"
 
-#: src/elflint.c:215 src/readelf.c:434
+#: src/elflint.c:219 src/readelf.c:468
 msgid "Missing file name.\n"
 msgstr "Missing file name.\n"
 
-#: src/elflint.c:294
+#: src/elflint.c:298
 #, c-format
 msgid " error while freeing sub-ELF descriptor: %s\n"
 msgstr " error while freeing sub-ELF descriptor: %s\n"
 
-#: src/elflint.c:302
+#: src/elflint.c:306
 #, c-format
 msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
 msgstr "Not an ELF file - it has the wrong magic bytes at the start\n"
 
-#: src/elflint.c:363
+#: src/elflint.c:371
 #, c-format
 msgid "e_ident[%d] == %d is no known class\n"
 msgstr "e_ident[%d] == %d is no known class\n"
 
-#: src/elflint.c:368
+#: src/elflint.c:376
 #, c-format
 msgid "e_ident[%d] == %d is no known data encoding\n"
 msgstr "e_ident[%d] == %d is no known data encoding\n"
 
-#: src/elflint.c:372
+#: src/elflint.c:380
 #, c-format
 msgid "unknown ELF header version number e_ident[%d] == %d\n"
 msgstr "unknown ELF header version number e_ident[%d] == %d\n"
 
-#: src/elflint.c:378
+#: src/elflint.c:386
 #, c-format
 msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
 msgstr "unsupported OS ABI e_ident[%d] == ‘%s’\n"
 
-#: src/elflint.c:384
+#: src/elflint.c:392
 #, c-format
 msgid "unsupport ABI version e_ident[%d] == %d\n"
 msgstr "unsupport ABI version e_ident[%d] == %d\n"
 
-#: src/elflint.c:389
+#: src/elflint.c:397
 #, c-format
 msgid "e_ident[%zu] is not zero\n"
 msgstr "e_ident[%zu] is not zero\n"
 
-#: src/elflint.c:394
+#: src/elflint.c:402
 #, c-format
 msgid "unknown object file type %d\n"
 msgstr "unknown object file type %d\n"
 
-#: src/elflint.c:401
+#: src/elflint.c:409
 #, c-format
 msgid "unknown machine type %d\n"
 msgstr "unknown machine type %d\n"
 
-#: src/elflint.c:405
+#: src/elflint.c:413
 #, c-format
 msgid "unknown object file version\n"
 msgstr "unknown object file version\n"
 
-#: src/elflint.c:411
+#: src/elflint.c:419
 #, c-format
 msgid "invalid program header offset\n"
 msgstr "invalid program header offset\n"
 
-#: src/elflint.c:413
+#: src/elflint.c:421
 #, c-format
 msgid "executables and DSOs cannot have zero program header offset\n"
 msgstr "executables and DSOs cannot have zero program header offset\n"
 
-#: src/elflint.c:417
+#: src/elflint.c:425
 #, c-format
 msgid "invalid number of program header entries\n"
 msgstr "invalid number of program header entries\n"
 
-#: src/elflint.c:425
+#: src/elflint.c:433
 #, c-format
 msgid "invalid section header table offset\n"
 msgstr "invalid section header table offset\n"
 
-#: src/elflint.c:428
+#: src/elflint.c:436
 #, c-format
 msgid "section header table must be present\n"
 msgstr "section header table must be present\n"
 
-#: src/elflint.c:442
+#: src/elflint.c:450
 #, c-format
 msgid "invalid number of section header table entries\n"
 msgstr "invalid number of section header table entries\n"
 
-#: src/elflint.c:459
+#: src/elflint.c:467
 #, c-format
 msgid "invalid section header index\n"
 msgstr "invalid section header index\n"
 
-#: src/elflint.c:473
+#: src/elflint.c:481
 #, c-format
 msgid "invalid number of program header table entries\n"
 msgstr "invalid number of program header table entries\n"
 
-#: src/elflint.c:482
+#: src/elflint.c:490
 #, c-format
 msgid "invalid machine flags: %s\n"
 msgstr "invalid machine flags: %s\n"
 
-#: src/elflint.c:489 src/elflint.c:506
+#: src/elflint.c:497 src/elflint.c:514
 #, c-format
 msgid "invalid ELF header size: %hd\n"
 msgstr "invalid ELF header size: %hd\n"
 
-#: src/elflint.c:492 src/elflint.c:509
+#: src/elflint.c:500 src/elflint.c:517
 #, c-format
 msgid "invalid program header size: %hd\n"
 msgstr "invalid program header size: %hd\n"
 
-#: src/elflint.c:495 src/elflint.c:512
+#: src/elflint.c:503 src/elflint.c:520
 #, c-format
 msgid "invalid program header position or size\n"
 msgstr "invalid program header position or size\n"
 
-#: src/elflint.c:498 src/elflint.c:515
+#: src/elflint.c:506 src/elflint.c:523
 #, c-format
 msgid "invalid section header size: %hd\n"
 msgstr "invalid section header size: %hd\n"
 
-#: src/elflint.c:501 src/elflint.c:518
+#: src/elflint.c:509 src/elflint.c:526
 #, c-format
 msgid "invalid section header position or size\n"
 msgstr "invalid section header position or size\n"
 
-#: src/elflint.c:562
+#: src/elflint.c:570
 #, c-format
 msgid ""
 "section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
@@ -1347,21 +1415,21 @@ msgstr ""
 "section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
 "group\n"
 
-#: src/elflint.c:566
+#: src/elflint.c:574
 #, c-format
 msgid ""
 "section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
 msgstr ""
 "section [%2d] '%s': section group [%2zu] ‘%s’ does not precede group member\n"
 
-#: src/elflint.c:582 src/elflint.c:1426 src/elflint.c:1476 src/elflint.c:1581
-#: src/elflint.c:2166 src/elflint.c:2680 src/elflint.c:2841 src/elflint.c:2971
-#: src/elflint.c:3143 src/elflint.c:4045
+#: src/elflint.c:590 src/elflint.c:1457 src/elflint.c:1508 src/elflint.c:1614
+#: src/elflint.c:1939 src/elflint.c:2228 src/elflint.c:2742 src/elflint.c:2904
+#: src/elflint.c:3034 src/elflint.c:3206 src/elflint.c:4108
 #, c-format
 msgid "section [%2d] '%s': cannot get section data\n"
 msgstr "section [%2d] '%s': cannot get section data\n"
 
-#: src/elflint.c:595 src/elflint.c:1588
+#: src/elflint.c:603 src/elflint.c:1621
 #, c-format
 msgid ""
 "section [%2d] '%s': referenced as string table for section [%2d] '%s' but "
@@ -1370,7 +1438,7 @@ msgstr ""
 "section [%2d] '%s': referenced as string table for section [%2d] ‘%s’ but "
 "type is not SHT_STRTAB\n"
 
-#: src/elflint.c:618
+#: src/elflint.c:626
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol table cannot have more than one extended index "
@@ -1379,38 +1447,38 @@ msgstr ""
 "section [%2d] '%s': symbol table cannot have more than one extended index "
 "section\n"
 
-#: src/elflint.c:629
+#: src/elflint.c:638
 #, c-format
 msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
 msgstr "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
 
-#: src/elflint.c:638
+#: src/elflint.c:647
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
 msgstr "section [%2d] '%s': cannot get symbol %d: %s\n"
 
-#: src/elflint.c:643 src/elflint.c:646 src/elflint.c:649 src/elflint.c:652
-#: src/elflint.c:655 src/elflint.c:658
+#: src/elflint.c:652 src/elflint.c:655 src/elflint.c:658 src/elflint.c:661
+#: src/elflint.c:664 src/elflint.c:667
 #, c-format
 msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
 msgstr "section [%2d] '%s': ‘%s’ in zeroth entry not zero\n"
 
-#: src/elflint.c:661
+#: src/elflint.c:670
 #, c-format
 msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
 msgstr "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
 
-#: src/elflint.c:671
+#: src/elflint.c:680
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
 msgstr "section [%2d] '%s': cannot get symbol %zu: %s\n"
 
-#: src/elflint.c:680
+#: src/elflint.c:689
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
 msgstr "section [%2d] '%s': symbol %zu: invalid name value\n"
 
-#: src/elflint.c:694
+#: src/elflint.c:704
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: too large section index but no extended "
@@ -1419,7 +1487,7 @@ msgstr ""
 "section [%2d] '%s': symbol %zu: too large section index but no extended "
 "section index section\n"
 
-#: src/elflint.c:700
+#: src/elflint.c:710
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
@@ -1428,51 +1496,51 @@ msgstr ""
 "section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
 "st_shndx (%<PRIu32>)\n"
 
-#: src/elflint.c:712
+#: src/elflint.c:722
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
 msgstr "section [%2d] '%s': symbol %zu: invalid section index\n"
 
-#: src/elflint.c:720
+#: src/elflint.c:730
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown type\n"
 msgstr "section [%2d] '%s': symbol %zu: unknown type\n"
 
-#: src/elflint.c:726
+#: src/elflint.c:736
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
 msgstr "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
 
-#: src/elflint.c:731
+#: src/elflint.c:741
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
 msgstr "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
 
-#: src/elflint.c:739
+#: src/elflint.c:749
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
 msgstr ""
 "section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
 
-#: src/elflint.c:743
+#: src/elflint.c:753
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
 msgstr "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
 
-#: src/elflint.c:747
+#: src/elflint.c:757
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
 msgstr ""
 "section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
 
-#: src/elflint.c:779
+#: src/elflint.c:804
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
 msgstr "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
 
-#: src/elflint.c:785 src/elflint.c:810 src/elflint.c:853
+#: src/elflint.c:810 src/elflint.c:835 src/elflint.c:878
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu does not fit completely in referenced section "
@@ -1481,7 +1549,7 @@ msgstr ""
 "section [%2d] '%s': symbol %zu does not fit completely in referenced section "
 "[%2d] ‘%s’\n"
 
-#: src/elflint.c:794
+#: src/elflint.c:819
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
@@ -1490,7 +1558,7 @@ msgstr ""
 "section [%2d] '%s': symbol %zu: referenced section [%2d] ‘%s’ does not have "
 "SHF_TLS flag set\n"
 
-#: src/elflint.c:804 src/elflint.c:846
+#: src/elflint.c:829 src/elflint.c:871
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
@@ -1499,14 +1567,14 @@ msgstr ""
 "section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
 "[%2d] ‘%s’\n"
 
-#: src/elflint.c:831
+#: src/elflint.c:856
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
 msgstr ""
 "section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
 
-#: src/elflint.c:839
+#: src/elflint.c:864
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] "
@@ -1515,7 +1583,7 @@ msgstr ""
 "section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] "
 "‘%s’\n"
 
-#: src/elflint.c:866
+#: src/elflint.c:891
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: local symbol outside range described in "
@@ -1524,7 +1592,7 @@ msgstr ""
 "section [%2d] '%s': symbol %zu: local symbol outside range described in "
 "sh_info\n"
 
-#: src/elflint.c:873
+#: src/elflint.c:898
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
@@ -1533,12 +1601,12 @@ msgstr ""
 "section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
 "sh_info\n"
 
-#: src/elflint.c:880
+#: src/elflint.c:905
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
 msgstr "section [%2d] '%s': symbol %zu: non-local section symbol\n"
 
-#: src/elflint.c:930
+#: src/elflint.c:955
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section "
@@ -1547,7 +1615,7 @@ msgstr ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section "
 "[%2d]\n"
 
-#: src/elflint.c:937
+#: src/elflint.c:962
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] "
@@ -1556,7 +1624,7 @@ msgstr ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] "
 "‘%s’\n"
 
-#: src/elflint.c:953
+#: src/elflint.c:978
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
@@ -1565,7 +1633,7 @@ msgstr ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
 "match %s section address %#<PRIx64>\n"
 
-#: src/elflint.c:960
+#: src/elflint.c:985
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
@@ -1574,7 +1642,7 @@ msgstr ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
 "match %s section size %<PRIu64>\n"
 
-#: src/elflint.c:968
+#: src/elflint.c:993
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
@@ -1583,7 +1651,7 @@ msgstr ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
 "section\n"
 
-#: src/elflint.c:984
+#: src/elflint.c:1009
 #, c-format
 msgid ""
 "section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
@@ -1592,7 +1660,7 @@ msgstr ""
 "section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
 "segment address %#<PRIx64>\n"
 
-#: src/elflint.c:991
+#: src/elflint.c:1016
 #, c-format
 msgid ""
 "section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
@@ -1601,7 +1669,7 @@ msgstr ""
 "section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
 "segment size %<PRIu64>\n"
 
-#: src/elflint.c:1004
+#: src/elflint.c:1029
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
@@ -1610,22 +1678,22 @@ msgstr ""
 "section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
 "default visibility\n"
 
-#: src/elflint.c:1008
+#: src/elflint.c:1033
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
 msgstr "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
 
-#: src/elflint.c:1053
+#: src/elflint.c:1082
 #, c-format
 msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
 msgstr "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
 
-#: src/elflint.c:1062 src/elflint.c:1114
+#: src/elflint.c:1093 src/elflint.c:1145
 #, c-format
 msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
 msgstr "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
 
-#: src/elflint.c:1087 src/elflint.c:1139
+#: src/elflint.c:1118 src/elflint.c:1170
 #, c-format
 msgid ""
 "section [%2d] '%s': relative relocations after index %d as specified by "
@@ -1634,7 +1702,7 @@ msgstr ""
 "section [%2d] '%s': relative relocations after index %d as specified by "
 "DT_RELCOUNT\n"
 
-#: src/elflint.c:1093 src/elflint.c:1145
+#: src/elflint.c:1124 src/elflint.c:1176
 #, c-format
 msgid ""
 "section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
@@ -1643,47 +1711,47 @@ msgstr ""
 "section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
 "specified %d relative relocations\n"
 
-#: src/elflint.c:1105
+#: src/elflint.c:1136
 #, c-format
 msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
 msgstr "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
 
-#: src/elflint.c:1187
+#: src/elflint.c:1218
 #, c-format
 msgid "section [%2d] '%s': invalid destination section index\n"
 msgstr "section [%2d] '%s': invalid destination section index\n"
 
-#: src/elflint.c:1200
+#: src/elflint.c:1230
 #, c-format
 msgid "section [%2d] '%s': invalid destination section type\n"
 msgstr "section [%2d] '%s': invalid destination section type\n"
 
-#: src/elflint.c:1208
+#: src/elflint.c:1238
 #, c-format
 msgid "section [%2d] '%s': sh_info should be zero\n"
 msgstr "section [%2d] '%s': sh_info should be zero\n"
 
-#: src/elflint.c:1215
+#: src/elflint.c:1245
 #, c-format
 msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
 msgstr "section [%2d] '%s': no relocations for merge-able sections possible\n"
 
-#: src/elflint.c:1222
+#: src/elflint.c:1253
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
 msgstr "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
 
-#: src/elflint.c:1282
+#: src/elflint.c:1313
 #, c-format
 msgid "text relocation flag set but there is no read-only segment\n"
 msgstr "text relocation flag set but there is no read-only segment\n"
 
-#: src/elflint.c:1309
+#: src/elflint.c:1340
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: invalid type\n"
 msgstr "section [%2d] '%s': relocation %zu: invalid type\n"
 
-#: src/elflint.c:1317
+#: src/elflint.c:1348
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: relocation type invalid for the file "
@@ -1692,12 +1760,12 @@ msgstr ""
 "section [%2d] '%s': relocation %zu: relocation type invalid for the file "
 "type\n"
 
-#: src/elflint.c:1325
+#: src/elflint.c:1356
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
 msgstr "section [%2d] '%s': relocation %zu: invalid symbol index\n"
 
-#: src/elflint.c:1343
+#: src/elflint.c:1374
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
@@ -1706,12 +1774,12 @@ msgstr ""
 "section [%2d] '%s': relocation %zu: only symbol ‘_GLOBAL_OFFSET_TABLE_’ can "
 "be used with %s\n"
 
-#: src/elflint.c:1360
+#: src/elflint.c:1391
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
 msgstr "section [%2d] '%s': relocation %zu: offset out of bounds\n"
 
-#: src/elflint.c:1375
+#: src/elflint.c:1406
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: copy relocation against symbol of type "
@@ -1720,7 +1788,7 @@ msgstr ""
 "section [%2d] '%s': relocation %zu: copy relocation against symbol of type "
 "%s\n"
 
-#: src/elflint.c:1396
+#: src/elflint.c:1427
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: read-only section modified but text "
@@ -1729,64 +1797,64 @@ msgstr ""
 "section [%2d] '%s': relocation %zu: read-only section modified but text "
 "relocation flag not set\n"
 
-#: src/elflint.c:1411
+#: src/elflint.c:1442
 #, c-format
 msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
 msgstr "section [%2d] '%s': relocations are against loaded and unloaded data\n"
 
-#: src/elflint.c:1450 src/elflint.c:1500
+#: src/elflint.c:1482 src/elflint.c:1533
 #, c-format
 msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
 msgstr "section [%2d] '%s': cannot get relocation %zu: %s\n"
 
-#: src/elflint.c:1576
+#: src/elflint.c:1609
 #, c-format
 msgid "more than one dynamic section present\n"
 msgstr "more than one dynamic section present\n"
 
-#: src/elflint.c:1594
+#: src/elflint.c:1628
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
 msgstr "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
 
-#: src/elflint.c:1599 src/elflint.c:1882
+#: src/elflint.c:1633 src/elflint.c:1918
 #, c-format
 msgid "section [%2d] '%s': sh_info not zero\n"
 msgstr "section [%2d] '%s': sh_info not zero\n"
 
-#: src/elflint.c:1609
+#: src/elflint.c:1643
 #, c-format
 msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
 msgstr "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
 
-#: src/elflint.c:1617
+#: src/elflint.c:1651
 #, c-format
 msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
 msgstr "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
 
-#: src/elflint.c:1624
+#: src/elflint.c:1658
 #, c-format
 msgid "section [%2d] '%s': entry %zu: unknown tag\n"
 msgstr "section [%2d] '%s': entry %zu: unknown tag\n"
 
-#: src/elflint.c:1635
+#: src/elflint.c:1669
 #, c-format
 msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
 msgstr "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
 
-#: src/elflint.c:1645
+#: src/elflint.c:1679
 #, c-format
 msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
 msgstr "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
 
-#: src/elflint.c:1663
+#: src/elflint.c:1697
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
 msgstr ""
 "section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
 
-#: src/elflint.c:1676
+#: src/elflint.c:1710
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: pointer does not match address of section "
@@ -1795,14 +1863,14 @@ msgstr ""
 "section [%2d] '%s': entry %zu: pointer does not match address of section "
 "[%2d] ‘%s’ referenced by sh_link\n"
 
-#: src/elflint.c:1719
+#: src/elflint.c:1753
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
 msgstr ""
 "section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
 
-#: src/elflint.c:1734
+#: src/elflint.c:1768
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: %s value must be valid offset in section "
@@ -1811,71 +1879,71 @@ msgstr ""
 "section [%2d] '%s': entry %zu: %s value must be valid offset in section "
 "[%2d] ‘%s’\n"
 
-#: src/elflint.c:1754 src/elflint.c:1782
+#: src/elflint.c:1788 src/elflint.c:1816
 #, c-format
 msgid "section [%2d] '%s': contains %s entry but not %s\n"
 msgstr "section [%2d] '%s': contains %s entry but not %s\n"
 
-#: src/elflint.c:1766
+#: src/elflint.c:1800
 #, c-format
 msgid "section [%2d] '%s': mandatory tag %s not present\n"
 msgstr "section [%2d] '%s': mandatory tag %s not present\n"
 
-#: src/elflint.c:1775
+#: src/elflint.c:1809
 #, c-format
 msgid "section [%2d] '%s': no hash section present\n"
 msgstr "section [%2d] '%s': no hash section present\n"
 
-#: src/elflint.c:1790 src/elflint.c:1797
+#: src/elflint.c:1824 src/elflint.c:1831
 #, c-format
 msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
 msgstr "section [%2d] '%s': not all of %s, %s, and %s are present\n"
 
-#: src/elflint.c:1807 src/elflint.c:1811
+#: src/elflint.c:1841 src/elflint.c:1845
 #, c-format
 msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
 msgstr "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
 
-#: src/elflint.c:1817
+#: src/elflint.c:1851
 #, c-format
 msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
 msgstr "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
 
-#: src/elflint.c:1828 src/elflint.c:1832 src/elflint.c:1836 src/elflint.c:1840
+#: src/elflint.c:1862 src/elflint.c:1866 src/elflint.c:1870 src/elflint.c:1874
 #, c-format
 msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
 msgstr "section [%2d] '%s': %s tag missing in prelinked executable\n"
 
-#: src/elflint.c:1852
+#: src/elflint.c:1886
 #, c-format
 msgid ""
 "section [%2d] '%s': only relocatable files can have extended section index\n"
 msgstr ""
 "section [%2d] '%s': only relocatable files can have extended section index\n"
 
-#: src/elflint.c:1862
+#: src/elflint.c:1896
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index section not for symbol table\n"
 msgstr ""
 "section [%2d] '%s': extended section index section not for symbol table\n"
 
-#: src/elflint.c:1867
+#: src/elflint.c:1901
 #, c-format
 msgid "cannot get data for symbol section\n"
 msgstr "cannot get data for symbol section\n"
 
-#: src/elflint.c:1870
+#: src/elflint.c:1904
 #, c-format
 msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
 msgstr "section [%2d] '%s': entry size does not match Elf32_Word\n"
 
-#: src/elflint.c:1877
+#: src/elflint.c:1913
 #, c-format
 msgid "section [%2d] '%s': extended index table too small for symbol table\n"
 msgstr "section [%2d] '%s': extended index table too small for symbol table\n"
 
-#: src/elflint.c:1892
+#: src/elflint.c:1928
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
@@ -1884,75 +1952,75 @@ msgstr ""
 "section [%2d] '%s': extended section index in section [%2zu] ‘%s’ refers to "
 "same symbol table\n"
 
-#: src/elflint.c:1903
+#: src/elflint.c:1945
 #, c-format
 msgid "symbol 0 should have zero extended section index\n"
 msgstr "symbol 0 should have zero extended section index\n"
 
-#: src/elflint.c:1915
+#: src/elflint.c:1957
 #, c-format
 msgid "cannot get data for symbol %zu\n"
 msgstr "cannot get data for symbol %zu\n"
 
-#: src/elflint.c:1920
+#: src/elflint.c:1962
 #, c-format
 msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
 msgstr "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
 
-#: src/elflint.c:1936 src/elflint.c:1977
+#: src/elflint.c:1978 src/elflint.c:2029
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
 msgstr ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
 
-#: src/elflint.c:1948 src/elflint.c:1989
+#: src/elflint.c:1990 src/elflint.c:2041
 #, c-format
 msgid "section [%2d] '%s': chain array too large\n"
 msgstr "section [%2d] '%s': chain array too large\n"
 
-#: src/elflint.c:1957 src/elflint.c:1998
+#: src/elflint.c:2004 src/elflint.c:2055
 #, c-format
 msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
 msgstr "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
 
-#: src/elflint.c:1963
+#: src/elflint.c:2014
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
 msgstr "section [%2d] '%s': hash chain reference %zu out of bounds\n"
 
-#: src/elflint.c:2004
+#: src/elflint.c:2065
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
 msgstr "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
 
-#: src/elflint.c:2019
+#: src/elflint.c:2081
 #, c-format
 msgid "section [%2d] '%s': bitmask size not power of 2: %u\n"
 msgstr "section [%2d] '%s': bitmask size not power of 2: %u\n"
 
-#: src/elflint.c:2030
+#: src/elflint.c:2092
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected at "
-"least%ld)\n"
+"least %ld)\n"
 msgstr ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected at "
-"least%ld)\n"
+"least %ld)\n"
 
-#: src/elflint.c:2038
+#: src/elflint.c:2100
 #, c-format
 msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
 msgstr "section [%2d] '%s': 2nd hash function shift too big: %u\n"
 
-#: src/elflint.c:2070
+#: src/elflint.c:2132
 #, c-format
 msgid ""
 "section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
 msgstr ""
 "section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
 
-#: src/elflint.c:2091
+#: src/elflint.c:2153
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
@@ -1961,51 +2029,51 @@ msgstr ""
 "section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
 "undefined\n"
 
-#: src/elflint.c:2102
+#: src/elflint.c:2164
 #, c-format
 msgid ""
 "section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
 msgstr ""
 "section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
 
-#: src/elflint.c:2133
+#: src/elflint.c:2195
 #, c-format
 msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
 msgstr "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
 
-#: src/elflint.c:2138
+#: src/elflint.c:2200
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
 msgstr ""
 "section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
 
-#: src/elflint.c:2144
+#: src/elflint.c:2206
 #, c-format
 msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
 msgstr "section [%2d] '%s': bitmask does not match names in the hash table\n"
 
-#: src/elflint.c:2157
+#: src/elflint.c:2219
 #, c-format
 msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
 msgstr "section [%2d] '%s': relocatable files cannot have hash tables\n"
 
-#: src/elflint.c:2175
+#: src/elflint.c:2237
 #, c-format
 msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
 msgstr "section [%2d] '%s': hash table not for dynamic symbol table\n"
 
-#: src/elflint.c:2183
+#: src/elflint.c:2245
 #, c-format
 msgid "section [%2d] '%s': hash table entry size incorrect\n"
 msgstr "section [%2d] '%s': hash table entry size incorrect\n"
 
-#: src/elflint.c:2188
+#: src/elflint.c:2250
 #, c-format
 msgid "section [%2d] '%s': not marked to be allocated\n"
 msgstr "section [%2d] '%s': not marked to be allocated\n"
 
-#: src/elflint.c:2193
+#: src/elflint.c:2255
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table has not even room for initial administrative "
@@ -2014,17 +2082,17 @@ msgstr ""
 "section [%2d] '%s': hash table has not even room for initial administrative "
 "entries\n"
 
-#: src/elflint.c:2241
+#: src/elflint.c:2303
 #, c-format
 msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
 msgstr "sh_link in hash sections [%2zu] ‘%s’ and [%2zu] ‘%s’ not identical\n"
 
-#: src/elflint.c:2319 src/elflint.c:2323
+#: src/elflint.c:2381 src/elflint.c:2385
 #, c-format
 msgid "section [%2zu] '%s': reference to symbol index 0\n"
 msgstr "section [%2zu] '%s': reference to symbol index 0\n"
 
-#: src/elflint.c:2330
+#: src/elflint.c:2392
 #, c-format
 msgid ""
 "symbol %d referenced in new hash table in [%2zu] '%s' but not in old hash "
@@ -2033,7 +2101,7 @@ msgstr ""
 "symbol %d referenced in new hash table in [%2zu] ‘%s’ but not in old hash "
 "table in [%2zu] ‘%s’\n"
 
-#: src/elflint.c:2342
+#: src/elflint.c:2404
 #, c-format
 msgid ""
 "symbol %d referenced in old hash table in [%2zu] '%s' but not in new hash "
@@ -2042,99 +2110,99 @@ msgstr ""
 "symbol %d referenced in old hash table in [%2zu] ‘%s’ but not in new hash "
 "table in [%2zu] ‘%s’\n"
 
-#: src/elflint.c:2358
+#: src/elflint.c:2420
 #, c-format
 msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
 msgstr "section [%2d] '%s': nonzero sh_%s for NULL section\n"
 
-#: src/elflint.c:2378
+#: src/elflint.c:2440
 #, c-format
 msgid ""
 "section [%2d] '%s': section groups only allowed in relocatable object files\n"
 msgstr ""
 "section [%2d] '%s': section groups only allowed in relocatable object files\n"
 
-#: src/elflint.c:2389
+#: src/elflint.c:2451
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol table: %s\n"
 msgstr "section [%2d] '%s': cannot get symbol table: %s\n"
 
-#: src/elflint.c:2394
+#: src/elflint.c:2456
 #, c-format
 msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
 msgstr "section [%2d] '%s': section reference in sh_link is no symbol table\n"
 
-#: src/elflint.c:2400
+#: src/elflint.c:2462
 #, c-format
 msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
 msgstr "section [%2d] '%s': invalid symbol index in sh_info\n"
 
-#: src/elflint.c:2405
+#: src/elflint.c:2467
 #, c-format
 msgid "section [%2d] '%s': sh_flags not zero\n"
 msgstr "section [%2d] '%s': sh_flags not zero\n"
 
-#: src/elflint.c:2412
+#: src/elflint.c:2474
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol for signature\n"
 msgstr "section [%2d] '%s': cannot get symbol for signature\n"
 
-#: src/elflint.c:2417
+#: src/elflint.c:2479
 #, c-format
 msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
 msgstr "section [%2d] '%s': signature symbol cannot be empty string\n"
 
-#: src/elflint.c:2423
+#: src/elflint.c:2485
 #, c-format
 msgid "section [%2d] '%s': sh_flags not set correctly\n"
 msgstr "section [%2d] '%s': sh_flags not set correctly\n"
 
-#: src/elflint.c:2429
+#: src/elflint.c:2491
 #, c-format
 msgid "section [%2d] '%s': cannot get data: %s\n"
 msgstr "section [%2d] '%s': cannot get data: %s\n"
 
-#: src/elflint.c:2438
+#: src/elflint.c:2500
 #, c-format
 msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
 msgstr "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
 
-#: src/elflint.c:2443
+#: src/elflint.c:2505
 #, c-format
 msgid "section [%2d] '%s': section group without flags word\n"
 msgstr "section [%2d] '%s': section group without flags word\n"
 
-#: src/elflint.c:2449
+#: src/elflint.c:2511
 #, c-format
 msgid "section [%2d] '%s': section group without member\n"
 msgstr "section [%2d] '%s': section group without member\n"
 
-#: src/elflint.c:2453
+#: src/elflint.c:2515
 #, c-format
 msgid "section [%2d] '%s': section group with only one member\n"
 msgstr "section [%2d] '%s': section group with only one member\n"
 
-#: src/elflint.c:2464
+#: src/elflint.c:2526
 #, c-format
 msgid "section [%2d] '%s': unknown section group flags\n"
 msgstr "section [%2d] '%s': unknown section group flags\n"
 
-#: src/elflint.c:2476
+#: src/elflint.c:2538
 #, c-format
 msgid "section [%2d] '%s': section index %Zu out of range\n"
 msgstr "section [%2d] '%s': section index %Zu out of range\n"
 
-#: src/elflint.c:2485
+#: src/elflint.c:2547
 #, c-format
 msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
 msgstr "section [%2d] '%s': cannot get section header for element %zu: %s\n"
 
-#: src/elflint.c:2492
+#: src/elflint.c:2554
 #, c-format
 msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
 msgstr "section [%2d] '%s': section group contains another group [%2d] ‘%s’\n"
 
-#: src/elflint.c:2498
+#: src/elflint.c:2560
 #, c-format
 msgid ""
 "section [%2d] '%s': element %Zu references section [%2d] '%s' without "
@@ -2143,12 +2211,12 @@ msgstr ""
 "section [%2d] '%s': element %Zu references section [%2d] ‘%s’ without "
 "SHF_GROUP flag set\n"
 
-#: src/elflint.c:2505
+#: src/elflint.c:2567
 #, c-format
 msgid "section [%2d] '%s' is contained in more than one section group\n"
 msgstr "section [%2d] ‘%s’ is contained in more than one section group\n"
 
-#: src/elflint.c:2694
+#: src/elflint.c:2756
 #, c-format
 msgid ""
 "section [%2d] '%s' refers in sh_link to section [%2d] '%s' which is no "
@@ -2157,7 +2225,7 @@ msgstr ""
 "section [%2d] ‘%s’ refers in sh_link to section [%2d] ‘%s’ which is no "
 "dynamic symbol table\n"
 
-#: src/elflint.c:2705
+#: src/elflint.c:2768
 #, c-format
 msgid ""
 "section [%2d] '%s' has different number of entries than symbol table [%2d] "
@@ -2166,76 +2234,76 @@ msgstr ""
 "section [%2d] ‘%s’ has different number of entries than symbol table [%2d] "
 "‘%s’\n"
 
-#: src/elflint.c:2721
+#: src/elflint.c:2784
 #, c-format
 msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
 msgstr "section [%2d] '%s': symbol %d: cannot read version data\n"
 
-#: src/elflint.c:2737
+#: src/elflint.c:2800
 #, c-format
 msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
 msgstr "section [%2d] '%s': symbol %d: local symbol with global scope\n"
 
-#: src/elflint.c:2745
+#: src/elflint.c:2808
 #, c-format
 msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
 msgstr "section [%2d] '%s': symbol %d: local symbol with version\n"
 
-#: src/elflint.c:2759
+#: src/elflint.c:2822
 #, c-format
 msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
 msgstr "section [%2d] '%s': symbol %d: invalid version index %d\n"
 
-#: src/elflint.c:2764
+#: src/elflint.c:2827
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: version index %d is for defined version\n"
 msgstr ""
 "section [%2d] '%s': symbol %d: version index %d is for defined version\n"
 
-#: src/elflint.c:2774
+#: src/elflint.c:2837
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: version index %d is for requested version\n"
 msgstr ""
 "section [%2d] '%s': symbol %d: version index %d is for requested version\n"
 
-#: src/elflint.c:2826
+#: src/elflint.c:2889
 #, c-format
 msgid "more than one version reference section present\n"
 msgstr "more than one version reference section present\n"
 
-#: src/elflint.c:2834 src/elflint.c:2963
+#: src/elflint.c:2897 src/elflint.c:3026
 #, c-format
 msgid "section [%2d] '%s': sh_link does not link to string table\n"
 msgstr "section [%2d] '%s': sh_link does not link to string table\n"
 
-#: src/elflint.c:2857 src/elflint.c:3015
+#: src/elflint.c:2920 src/elflint.c:3078
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong version %d\n"
 msgstr "section [%2d] '%s': entry %d has wrong version %d\n"
 
-#: src/elflint.c:2863 src/elflint.c:3021
+#: src/elflint.c:2926 src/elflint.c:3084
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
 msgstr "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
 
-#: src/elflint.c:2871
+#: src/elflint.c:2934
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid file reference\n"
 msgstr "section [%2d] '%s': entry %d has invalid file reference\n"
 
-#: src/elflint.c:2879
+#: src/elflint.c:2942
 #, c-format
 msgid "section [%2d] '%s': entry %d references unknown dependency\n"
 msgstr "section [%2d] '%s': entry %d references unknown dependency\n"
 
-#: src/elflint.c:2891
+#: src/elflint.c:2954
 #, c-format
 msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
 msgstr "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
 
-#: src/elflint.c:2898
+#: src/elflint.c:2961
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
@@ -2244,7 +2312,7 @@ msgstr ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
 "reference\n"
 
-#: src/elflint.c:2905
+#: src/elflint.c:2968
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: "
@@ -2253,7 +2321,7 @@ msgstr ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: "
 "%#x, expected %#x\n"
 
-#: src/elflint.c:2915
+#: src/elflint.c:2978
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
@@ -2262,210 +2330,210 @@ msgstr ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
 "name ‘%s’\n"
 
-#: src/elflint.c:2926
+#: src/elflint.c:2989
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
 msgstr ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
 
-#: src/elflint.c:2942 src/elflint.c:3100
+#: src/elflint.c:3005 src/elflint.c:3163
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
 msgstr "section [%2d] '%s': entry %d has invalid offset to next entry\n"
 
-#: src/elflint.c:2955
+#: src/elflint.c:3018
 #, c-format
 msgid "more than one version definition section present\n"
 msgstr "more than one version definition section present\n"
 
-#: src/elflint.c:3000
+#: src/elflint.c:3063
 #, c-format
 msgid "section [%2d] '%s': more than one BASE definition\n"
 msgstr "section [%2d] '%s': more than one BASE definition\n"
 
-#: src/elflint.c:3004
+#: src/elflint.c:3067
 #, c-format
 msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
 msgstr "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
 
-#: src/elflint.c:3010
+#: src/elflint.c:3073
 #, c-format
 msgid "section [%2d] '%s': entry %d has unknown flag\n"
 msgstr "section [%2d] '%s': entry %d has unknown flag\n"
 
-#: src/elflint.c:3034
+#: src/elflint.c:3097
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid name reference\n"
 msgstr "section [%2d] '%s': entry %d has invalid name reference\n"
 
-#: src/elflint.c:3041
+#: src/elflint.c:3104
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
 msgstr "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
 
-#: src/elflint.c:3050
+#: src/elflint.c:3113
 #, c-format
 msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
 msgstr "section [%2d] '%s': entry %d has duplicate version name ‘%s’\n"
 
-#: src/elflint.c:3069
+#: src/elflint.c:3132
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
 msgstr ""
 "section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
 
-#: src/elflint.c:3084
+#: src/elflint.c:3147
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
 msgstr "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
 
-#: src/elflint.c:3106
+#: src/elflint.c:3169
 #, c-format
 msgid "section [%2d] '%s': no BASE definition\n"
 msgstr "section [%2d] '%s': no BASE definition\n"
 
-#: src/elflint.c:3122
+#: src/elflint.c:3185
 #, c-format
 msgid "section [%2d] '%s': unknown parent version '%s'\n"
 msgstr "section [%2d] '%s': unknown parent version ‘%s’\n"
 
-#: src/elflint.c:3135
+#: src/elflint.c:3198
 #, c-format
 msgid "section [%2d] '%s': empty object attributes section\n"
 msgstr "section [%2d] '%s': empty object attributes section\n"
 
-#: src/elflint.c:3156
+#: src/elflint.c:3219
 #, c-format
 msgid "section [%2d] '%s': unrecognized attribute format\n"
 msgstr "section [%2d] '%s': unrecognized attribute format\n"
 
-#: src/elflint.c:3172
+#: src/elflint.c:3235
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
 msgstr ""
 "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
 
-#: src/elflint.c:3181
+#: src/elflint.c:3244
 #, c-format
 msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
 msgstr "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
 
-#: src/elflint.c:3193
+#: src/elflint.c:3256
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
 msgstr "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
 
-#: src/elflint.c:3210
+#: src/elflint.c:3273
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
 msgstr ""
 "section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
 
-#: src/elflint.c:3219
+#: src/elflint.c:3282
 #, c-format
 msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
 msgstr "section [%2d] '%s': offset %zu: truncated attribute section\n"
 
-#: src/elflint.c:3228
+#: src/elflint.c:3291
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
 msgstr ""
 "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
 
-#: src/elflint.c:3241
+#: src/elflint.c:3304
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
 msgstr ""
 "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
 
-#: src/elflint.c:3252
+#: src/elflint.c:3315
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
 msgstr ""
 "section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
 
-#: src/elflint.c:3270
+#: src/elflint.c:3333
 #, c-format
 msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
 msgstr "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
 
-#: src/elflint.c:3281
+#: src/elflint.c:3344
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
 msgstr "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
 
-#: src/elflint.c:3294
+#: src/elflint.c:3357
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
 msgstr "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
 
-#: src/elflint.c:3298
+#: src/elflint.c:3361
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
 msgstr ""
 "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
 
-#: src/elflint.c:3308
+#: src/elflint.c:3371
 #, c-format
 msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
 msgstr "section [%2d] '%s': offset %zu: vendor ‘%s’ unknown\n"
 
-#: src/elflint.c:3314
+#: src/elflint.c:3377
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
 msgstr ""
 "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
 
-#: src/elflint.c:3403
+#: src/elflint.c:3466
 #, c-format
 msgid "cannot get section header of zeroth section\n"
 msgstr "cannot get section header of zeroth section\n"
 
-#: src/elflint.c:3407
+#: src/elflint.c:3470
 #, c-format
 msgid "zeroth section has nonzero name\n"
 msgstr "zeroth section has nonzero name\n"
 
-#: src/elflint.c:3409
+#: src/elflint.c:3472
 #, c-format
 msgid "zeroth section has nonzero type\n"
 msgstr "zeroth section has nonzero type\n"
 
-#: src/elflint.c:3411
+#: src/elflint.c:3474
 #, c-format
 msgid "zeroth section has nonzero flags\n"
 msgstr "zeroth section has nonzero flags\n"
 
-#: src/elflint.c:3413
+#: src/elflint.c:3476
 #, c-format
 msgid "zeroth section has nonzero address\n"
 msgstr "zeroth section has nonzero address\n"
 
-#: src/elflint.c:3415
+#: src/elflint.c:3478
 #, c-format
 msgid "zeroth section has nonzero offset\n"
 msgstr "zeroth section has nonzero offset\n"
 
-#: src/elflint.c:3417
+#: src/elflint.c:3480
 #, c-format
 msgid "zeroth section has nonzero align value\n"
 msgstr "zeroth section has nonzero align value\n"
 
-#: src/elflint.c:3419
+#: src/elflint.c:3482
 #, c-format
 msgid "zeroth section has nonzero entry size value\n"
 msgstr "zeroth section has nonzero entry size value\n"
 
-#: src/elflint.c:3422
+#: src/elflint.c:3485
 #, c-format
 msgid ""
 "zeroth section has nonzero size value while ELF header has nonzero shnum "
@@ -2474,7 +2542,7 @@ msgstr ""
 "zeroth section has nonzero size value while ELF header has nonzero shnum "
 "value\n"
 
-#: src/elflint.c:3426
+#: src/elflint.c:3489
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
@@ -2483,7 +2551,7 @@ msgstr ""
 "zeroth section has nonzero link value while ELF header does not signal "
 "overflow in shstrndx\n"
 
-#: src/elflint.c:3430
+#: src/elflint.c:3493
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
@@ -2492,46 +2560,46 @@ msgstr ""
 "zeroth section has nonzero link value while ELF header does not signal "
 "overflow in phnum\n"
 
-#: src/elflint.c:3447
+#: src/elflint.c:3510
 #, c-format
 msgid "cannot get section header for section [%2zu] '%s': %s\n"
 msgstr "cannot get section header for section [%2zu] '%s': %s\n"
 
-#: src/elflint.c:3456
+#: src/elflint.c:3519
 #, c-format
 msgid "section [%2zu]: invalid name\n"
 msgstr "section [%2zu]: invalid name\n"
 
-#: src/elflint.c:3483
+#: src/elflint.c:3546
 #, c-format
 msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
 msgstr "section [%2d] ‘%s’ has wrong type: expected %s, is %s\n"
 
-#: src/elflint.c:3499
+#: src/elflint.c:3562
 #, c-format
 msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
 msgstr "section [%2zu] ‘%s’ has wrong flags: expected %s, is %s\n"
 
-#: src/elflint.c:3516
+#: src/elflint.c:3579
 #, c-format
 msgid ""
 "section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
 msgstr ""
 "section [%2zu] ‘%s’ has wrong flags: expected %s and possibly %s, is %s\n"
 
-#: src/elflint.c:3534
+#: src/elflint.c:3597
 #, c-format
 msgid "section [%2zu] '%s' present in object file\n"
 msgstr "section [%2zu] ‘%s’ present in object file\n"
 
-#: src/elflint.c:3540 src/elflint.c:3572
+#: src/elflint.c:3603 src/elflint.c:3635
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
 msgstr ""
 "section [%2zu] ‘%s’ has SHF_ALLOC flag set but there is no loadable segment\n"
 
-#: src/elflint.c:3545 src/elflint.c:3577
+#: src/elflint.c:3608 src/elflint.c:3640
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
@@ -2540,76 +2608,76 @@ msgstr ""
 "section [%2zu] ‘%s’ has SHF_ALLOC flag not set but there are loadable "
 "segments\n"
 
-#: src/elflint.c:3553
+#: src/elflint.c:3616
 #, c-format
 msgid ""
 "section [%2zu] '%s' is extension section index table in non-object file\n"
 msgstr ""
 "section [%2zu] ‘%s’ is extension section index table in non-object file\n"
 
-#: src/elflint.c:3596
+#: src/elflint.c:3659
 #, c-format
 msgid "section [%2zu] '%s': size not multiple of entry size\n"
 msgstr "section [%2zu] '%s': size not multiple of entry size\n"
 
-#: src/elflint.c:3601
+#: src/elflint.c:3664
 #, c-format
 msgid "cannot get section header\n"
 msgstr "cannot get section header\n"
 
-#: src/elflint.c:3611
+#: src/elflint.c:3674
 #, c-format
 msgid "section [%2zu] '%s' has unsupported type %d\n"
 msgstr "section [%2zu] ‘%s’ has unsupported type %d\n"
 
-#: src/elflint.c:3625
+#: src/elflint.c:3688
 #, c-format
 msgid ""
 "section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
 msgstr ""
 "section [%2zu] ‘%s’ contains invalid processor-specific flag(s) %#<PRIx64>\n"
 
-#: src/elflint.c:3632
+#: src/elflint.c:3695
 #, c-format
 msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
 msgstr "section [%2zu] ‘%s’ contains unknown flag(s) %#<PRIx64>\n"
 
-#: src/elflint.c:3640
+#: src/elflint.c:3703
 #, c-format
 msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
 msgstr "section [%2zu] '%s': thread-local data sections address not zero\n"
 
-#: src/elflint.c:3648
+#: src/elflint.c:3711
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in link value\n"
 msgstr "section [%2zu] '%s': invalid section reference in link value\n"
 
-#: src/elflint.c:3653
+#: src/elflint.c:3716
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in info value\n"
 msgstr "section [%2zu] '%s': invalid section reference in info value\n"
 
-#: src/elflint.c:3660
+#: src/elflint.c:3723
 #, c-format
 msgid "section [%2zu] '%s': strings flag set without merge flag\n"
 msgstr "section [%2zu] '%s': strings flag set without merge flag\n"
 
-#: src/elflint.c:3665
+#: src/elflint.c:3728
 #, c-format
 msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
 msgstr "section [%2zu] '%s': merge flag set but entry size is zero\n"
 
-#: src/elflint.c:3683
+#: src/elflint.c:3746
 #, c-format
 msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
 msgstr "section [%2zu] ‘%s’ has unexpected type %d for an executable section\n"
 
-#: src/elflint.c:3692
+#: src/elflint.c:3755
 #, c-format
 msgid "section [%2zu] '%s' is both executable and writable\n"
 msgstr "section [%2zu] ‘%s’ is both executable and writable\n"
 
-#: src/elflint.c:3721
+#: src/elflint.c:3784
 #, c-format
 msgid ""
 "section [%2zu] '%s' not fully contained in segment of program header entry "
@@ -2618,7 +2686,7 @@ msgstr ""
 "section [%2zu] ‘%s’ not fully contained in segment of program header entry "
 "%d\n"
 
-#: src/elflint.c:3729
+#: src/elflint.c:3792
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
@@ -2627,7 +2695,7 @@ msgstr ""
 "section [%2zu] ‘%s’ has type NOBITS but is read from the file in segment of "
 "program header entry %d\n"
 
-#: src/elflint.c:3738
+#: src/elflint.c:3801
 #, c-format
 msgid ""
 "section [%2zu] '%s' has not type NOBITS but is not read from the file in "
@@ -2636,24 +2704,24 @@ msgstr ""
 "section [%2zu] ‘%s’ has not type NOBITS but is not read from the file in "
 "segment of program header entry %d\n"
 
-#: src/elflint.c:3749
+#: src/elflint.c:3812
 #, c-format
 msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
 msgstr "section [%2zu] ‘%s’ is executable in nonexecutable segment %d\n"
 
-#: src/elflint.c:3759
+#: src/elflint.c:3822
 #, c-format
 msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
 msgstr "section [%2zu] ‘%s’ is writable in unwritable segment %d\n"
 
-#: src/elflint.c:3769
+#: src/elflint.c:3832
 #, c-format
 msgid ""
 "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
 msgstr ""
 "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
 
-#: src/elflint.c:3775
+#: src/elflint.c:3838
 #, c-format
 msgid ""
 "section [%2zu] '%s': ELF header says this is the section header string table "
@@ -2662,36 +2730,36 @@ msgstr ""
 "section [%2zu] '%s': ELF header says this is the section header string table "
 "but type is not SHT_TYPE\n"
 
-#: src/elflint.c:3783
+#: src/elflint.c:3846
 #, c-format
 msgid ""
 "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
 msgstr ""
 "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
 
-#: src/elflint.c:3834
+#: src/elflint.c:3897
 #, c-format
 msgid "more than one version symbol table present\n"
 msgstr "more than one version symbol table present\n"
 
-#: src/elflint.c:3857
+#: src/elflint.c:3920
 #, c-format
 msgid "INTERP program header entry but no .interp section\n"
 msgstr "INTERP program header entry but no .interp section\n"
 
-#: src/elflint.c:3868
+#: src/elflint.c:3931
 #, c-format
 msgid ""
 "loadable segment [%u] is executable but contains no executable sections\n"
 msgstr ""
 "loadable segment [%u] is executable but contains no executable sections\n"
 
-#: src/elflint.c:3874
+#: src/elflint.c:3937
 #, c-format
 msgid "loadable segment [%u] is writable but contains no writable sections\n"
 msgstr "loadable segment [%u] is writable but contains no writable sections\n"
 
-#: src/elflint.c:3885
+#: src/elflint.c:3948
 #, c-format
 msgid ""
 "no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
@@ -2700,194 +2768,194 @@ msgstr ""
 "no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
 "exist\n"
 
-#: src/elflint.c:3898
+#: src/elflint.c:3961
 #, c-format
 msgid "duplicate version index %d\n"
 msgstr "duplicate version index %d\n"
 
-#: src/elflint.c:3912
+#: src/elflint.c:3975
 #, c-format
 msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
 msgstr ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
 
-#: src/elflint.c:3961
+#: src/elflint.c:4024
 #, c-format
 msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
 msgstr "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
 
-#: src/elflint.c:3965
+#: src/elflint.c:4028
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
 msgstr ""
 "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
 
-#: src/elflint.c:3988
+#: src/elflint.c:4051
 #, c-format
 msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
 msgstr "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
 
-#: src/elflint.c:3992
+#: src/elflint.c:4055
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
 msgstr ""
 "section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
 
-#: src/elflint.c:4009
+#: src/elflint.c:4072
 #, c-format
 msgid "phdr[%d]: no note entries defined for the type of file\n"
 msgstr "phdr[%d]: no note entries defined for the type of file\n"
 
-#: src/elflint.c:4028
+#: src/elflint.c:4091
 #, c-format
 msgid "phdr[%d]: cannot get content of note section: %s\n"
 msgstr "phdr[%d]: cannot get content of note section: %s\n"
 
-#: src/elflint.c:4031
+#: src/elflint.c:4094
 #, c-format
 msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
 msgstr "phdr[%d]: extra %<PRIu64> bytes after last note\n"
 
-#: src/elflint.c:4052
+#: src/elflint.c:4115
 #, c-format
 msgid "section [%2d] '%s': no note entries defined for the type of file\n"
 msgstr "section [%2d] '%s': no note entries defined for the type of file\n"
 
-#: src/elflint.c:4059
+#: src/elflint.c:4122
 #, c-format
 msgid "section [%2d] '%s': cannot get content of note section\n"
 msgstr "section [%2d] '%s': cannot get content of note section\n"
 
-#: src/elflint.c:4062
+#: src/elflint.c:4125
 #, c-format
 msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
 msgstr "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
 
-#: src/elflint.c:4080
+#: src/elflint.c:4143
 #, c-format
 msgid ""
 "only executables, shared objects, and core files can have program headers\n"
 msgstr ""
 "only executables, shared objects, and core files can have program headers\n"
 
-#: src/elflint.c:4095
+#: src/elflint.c:4158
 #, c-format
 msgid "cannot get program header entry %d: %s\n"
 msgstr "cannot get program header entry %d: %s\n"
 
-#: src/elflint.c:4104
+#: src/elflint.c:4167
 #, c-format
 msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
 msgstr ""
 "program header entry %d: unknown program header entry type %#<PRIx64>\n"
 
-#: src/elflint.c:4115
+#: src/elflint.c:4178
 #, c-format
 msgid "more than one INTERP entry in program header\n"
 msgstr "more than one INTERP entry in program header\n"
 
-#: src/elflint.c:4123
+#: src/elflint.c:4186
 #, c-format
 msgid "more than one TLS entry in program header\n"
 msgstr "more than one TLS entry in program header\n"
 
-#: src/elflint.c:4130
+#: src/elflint.c:4193
 #, c-format
 msgid "static executable cannot have dynamic sections\n"
 msgstr "static executable cannot have dynamic sections\n"
 
-#: src/elflint.c:4144
+#: src/elflint.c:4207
 #, c-format
 msgid "dynamic section reference in program header has wrong offset\n"
 msgstr "dynamic section reference in program header has wrong offset\n"
 
-#: src/elflint.c:4147
+#: src/elflint.c:4210
 #, c-format
 msgid "dynamic section size mismatch in program and section header\n"
 msgstr "dynamic section size mismatch in program and section header\n"
 
-#: src/elflint.c:4157
+#: src/elflint.c:4220
 #, c-format
 msgid "more than one GNU_RELRO entry in program header\n"
 msgstr "more than one GNU_RELRO entry in program header\n"
 
-#: src/elflint.c:4178
+#: src/elflint.c:4241
 #, c-format
 msgid "loadable segment GNU_RELRO applies to is not writable\n"
 msgstr "loadable segment GNU_RELRO applies to is not writable\n"
 
-#: src/elflint.c:4181
+#: src/elflint.c:4244
 #, c-format
 msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
 msgstr "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
 
-#: src/elflint.c:4189 src/elflint.c:4212
+#: src/elflint.c:4252 src/elflint.c:4275
 #, c-format
 msgid "%s segment not contained in a loaded segment\n"
 msgstr "%s segment not contained in a loaded segment\n"
 
-#: src/elflint.c:4218
+#: src/elflint.c:4281
 #, c-format
 msgid "program header offset in ELF header and PHDR entry do not match"
 msgstr "program header offset in ELF header and PHDR entry do not match"
 
-#: src/elflint.c:4242
+#: src/elflint.c:4305
 #, c-format
 msgid "call frame search table reference in program header has wrong offset\n"
 msgstr "call frame search table reference in program header has wrong offset\n"
 
-#: src/elflint.c:4245
+#: src/elflint.c:4308
 #, c-format
 msgid "call frame search table size mismatch in program and section header\n"
 msgstr "call frame search table size mismatch in program and section header\n"
 
-#: src/elflint.c:4258
+#: src/elflint.c:4321
 #, c-format
 msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
 msgstr "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
 
-#: src/elflint.c:4266
+#: src/elflint.c:4329
 #, c-format
 msgid "call frame search table must be allocated\n"
 msgstr "call frame search table must be allocated\n"
 
-#: src/elflint.c:4269
+#: src/elflint.c:4332
 #, c-format
 msgid "section [%2zu] '%s' must be allocated\n"
 msgstr "section [%2zu] ‘%s’ must be allocated\n"
 
-#: src/elflint.c:4273
+#: src/elflint.c:4336
 #, c-format
 msgid "call frame search table must not be writable\n"
 msgstr "call frame search table must not be writable\n"
 
-#: src/elflint.c:4276
+#: src/elflint.c:4339
 #, c-format
 msgid "section [%2zu] '%s' must not be writable\n"
 msgstr "section [%2zu] ‘%s’ must not be writable\n"
 
-#: src/elflint.c:4281
+#: src/elflint.c:4344
 #, c-format
 msgid "call frame search table must not be executable\n"
 msgstr "call frame search table must not be executable\n"
 
-#: src/elflint.c:4284
+#: src/elflint.c:4347
 #, c-format
 msgid "section [%2zu] '%s' must not be executable\n"
 msgstr "section [%2zu] ‘%s’ must not be executable\n"
 
-#: src/elflint.c:4295
+#: src/elflint.c:4358
 #, c-format
 msgid "program header entry %d: file size greater than memory size\n"
 msgstr "program header entry %d: file size greater than memory size\n"
 
-#: src/elflint.c:4302
+#: src/elflint.c:4365
 #, c-format
 msgid "program header entry %d: alignment not a power of 2\n"
 msgstr "program header entry %d: alignment not a power of 2\n"
 
-#: src/elflint.c:4305
+#: src/elflint.c:4368
 #, c-format
 msgid ""
 "program header entry %d: file offset and virtual address not module of "
@@ -2896,7 +2964,7 @@ msgstr ""
 "program header entry %d: file offset and virtual address not module of "
 "alignment\n"
 
-#: src/elflint.c:4318
+#: src/elflint.c:4381
 #, c-format
 msgid ""
 "executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
@@ -2905,12 +2973,12 @@ msgstr ""
 "executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
 "program header entry"
 
-#: src/elflint.c:4352
+#: src/elflint.c:4415
 #, c-format
 msgid "cannot read ELF header: %s\n"
 msgstr "cannot read ELF header: %s\n"
 
-#: src/elflint.c:4378
+#: src/elflint.c:4441
 #, c-format
 msgid "text relocation flag set but not needed\n"
 msgstr "text relocation flag set but not needed\n"
@@ -3425,7 +3493,8 @@ msgstr "Warning: type of ‘%s’ changed from %s in %s to %s in %s"
 msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
 msgstr "Warning: size of ‘%s’ changed from %<PRIu64> in %s to %<PRIu64> in %s"
 
-#: src/ldgeneric.c:651 src/ldgeneric.c:1112 src/readelf.c:640 src/strip.c:562
+#: src/ldgeneric.c:651 src/ldgeneric.c:1112 src/readelf.c:527
+#: src/readelf.c:829 src/strip.c:563
 #, c-format
 msgid "cannot determine number of sections: %s"
 msgstr "cannot determine number of sections: %s"
@@ -3660,7 +3729,7 @@ msgstr "internal error: non-nobits section follows nobits section"
 msgid "cannot get header of 0th section: %s"
 msgstr "cannot get header of 0th section: %s"
 
-#: src/ldgeneric.c:6930 src/unstrip.c:1810
+#: src/ldgeneric.c:6930 src/unstrip.c:1818
 #, c-format
 msgid "cannot update ELF header: %s"
 msgstr "cannot update ELF header: %s"
@@ -3824,7 +3893,7 @@ msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
 msgstr "%s: INTERNAL ERROR %d (%s-%s): %s"
 
 #: src/nm.c:398 src/nm.c:410 src/size.c:309 src/size.c:318 src/size.c:329
-#: src/strip.c:2124
+#: src/strip.c:2155
 #, c-format
 msgid "while closing '%s'"
 msgstr "while closing ‘%s’"
@@ -3867,17 +3936,17 @@ msgstr "%s%s%s: file format not recognized"
 msgid "cannot create search tree"
 msgstr "cannot create search tree"
 
-#: src/nm.c:757 src/nm.c:1156 src/objdump.c:787 src/readelf.c:896
-#: src/readelf.c:1039 src/readelf.c:1187 src/readelf.c:1369 src/readelf.c:1569
-#: src/readelf.c:1755 src/readelf.c:1965 src/readelf.c:2219 src/readelf.c:2285
-#: src/readelf.c:2363 src/readelf.c:2861 src/readelf.c:2897 src/readelf.c:2959
-#: src/readelf.c:7270 src/readelf.c:8176 src/readelf.c:8323 src/readelf.c:8391
-#: src/size.c:417 src/size.c:491 src/strip.c:502
+#: src/nm.c:757 src/nm.c:1163 src/objdump.c:787 src/readelf.c:536
+#: src/readelf.c:1085 src/readelf.c:1245 src/readelf.c:1393 src/readelf.c:1579
+#: src/readelf.c:1785 src/readelf.c:1972 src/readelf.c:2196 src/readelf.c:2454
+#: src/readelf.c:2524 src/readelf.c:2606 src/readelf.c:3117 src/readelf.c:3153
+#: src/readelf.c:3216 src/readelf.c:7920 src/readelf.c:9002 src/readelf.c:9149
+#: src/readelf.c:9217 src/size.c:417 src/size.c:487 src/strip.c:503
 #, c-format
 msgid "cannot get section header string table index"
 msgstr "cannot get section header string table index"
 
-#: src/nm.c:782
+#: src/nm.c:784
 #, c-format
 msgid ""
 "\n"
@@ -3890,7 +3959,7 @@ msgstr ""
 "Symbols from %s:\n"
 "\n"
 
-#: src/nm.c:785
+#: src/nm.c:787
 #, c-format
 msgid ""
 "%*s%-*s %-*s Class  Type     %-*s %*s Section\n"
@@ -3899,22 +3968,22 @@ msgstr ""
 "%*s%-*s %-*s Class  Type     %-*s %*s Section\n"
 "\n"
 
-#: src/nm.c:1166
+#: src/nm.c:1173
 #, c-format
 msgid "%s: entry size in section `%s' is not what we expect"
 msgstr "%s: entry size in section ‘%s’ is not what we expect"
 
-#: src/nm.c:1170
+#: src/nm.c:1177
 #, c-format
 msgid "%s: size of section `%s' is not multiple of entry size"
 msgstr "%s: size of section ‘%s’ is not multiple of entry size"
 
-#: src/nm.c:1428
+#: src/nm.c:1435
 #, c-format
 msgid "%s%s%s%s: Invalid operation"
 msgstr "%s%s%s%s: Invalid operation"
 
-#: src/nm.c:1485
+#: src/nm.c:1492
 #, c-format
 msgid "%s%s%s: no symbols"
 msgstr "%s%s%s: no symbols"
@@ -3947,7 +4016,7 @@ msgstr "Only display information for section NAME."
 msgid "Show information from FILEs (a.out by default)."
 msgstr "Show information from FILEs (a.out by default)."
 
-#: src/objdump.c:236 src/readelf.c:439
+#: src/objdump.c:236 src/readelf.c:473
 msgid "No operation specified.\n"
 msgstr "No operation specified.\n"
 
@@ -3956,11 +4025,11 @@ msgstr "No operation specified.\n"
 msgid "while close `%s'"
 msgstr "while close ‘%s’"
 
-#: src/objdump.c:379 src/readelf.c:1664 src/readelf.c:1838
+#: src/objdump.c:379 src/readelf.c:1880 src/readelf.c:2069
 msgid "INVALID SYMBOL"
 msgstr "INVALID SYMBOL"
 
-#: src/objdump.c:394 src/readelf.c:1695 src/readelf.c:1871
+#: src/objdump.c:394 src/readelf.c:1911 src/readelf.c:2102
 msgid "INVALID SECTION"
 msgstr "INVALID SECTION"
 
@@ -4017,181 +4086,242 @@ msgstr "‘%s’ is no archive"
 msgid "error while freeing sub-ELF descriptor: %s"
 msgstr "error while freeing sub-ELF descriptor: %s"
 
-#: src/readelf.c:67
+#: src/readelf.c:71
+msgid "ELF input selection:"
+msgstr "ELF input selection:"
+
+#: src/readelf.c:73
+msgid ""
+"Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data"
+msgstr ""
+"Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data"
+
+#: src/readelf.c:75
 msgid "ELF output selection:"
 msgstr "ELF output selection:"
 
-#: src/readelf.c:69
+#: src/readelf.c:77
 msgid "All these plus -p .strtab -p .dynstr -p .comment"
 msgstr "All these plus -p .strtab -p .dynstr -p .comment"
 
-#: src/readelf.c:70
+#: src/readelf.c:78
 msgid "Display the dynamic segment"
 msgstr "Display the dynamic segment"
 
-#: src/readelf.c:71
+#: src/readelf.c:79
 msgid "Display the ELF file header"
 msgstr "Display the ELF file header"
 
-#: src/readelf.c:73
+#: src/readelf.c:81
 msgid "Display histogram of bucket list lengths"
 msgstr "Display histogram of bucket list lengths"
 
-#: src/readelf.c:74
+#: src/readelf.c:82
 msgid "Display the program headers"
 msgstr "Display the program headers"
 
-#: src/readelf.c:76
+#: src/readelf.c:84
 msgid "Display relocations"
 msgstr "Display relocations"
 
-#: src/readelf.c:77
+#: src/readelf.c:85
 msgid "Display the sections' headers"
 msgstr "Display the sections' headers"
 
-#: src/readelf.c:79
+#: src/readelf.c:87
 msgid "Display the symbol table"
 msgstr "Display the symbol table"
 
-#: src/readelf.c:80
+#: src/readelf.c:88
 msgid "Display versioning information"
 msgstr "Display versioning information"
 
-#: src/readelf.c:81
+#: src/readelf.c:89
 msgid "Display the ELF notes"
 msgstr "Display the ELF notes"
 
-#: src/readelf.c:83
+#: src/readelf.c:91
 msgid "Display architecture specific information, if any"
 msgstr "Display architecture specific information, if any"
 
-#: src/readelf.c:85
+#: src/readelf.c:93
 msgid "Display sections for exception handling"
 msgstr "Display sections for exception handling"
 
-#: src/readelf.c:87
+#: src/readelf.c:95
 msgid "Additional output selection:"
 msgstr "Additional output selection:"
 
-#: src/readelf.c:89
+#: src/readelf.c:97
 msgid ""
 "Display DWARF section content.  SECTION can be one of abbrev, aranges, "
-"frame, gdb_index, info, loc, line, ranges, pubnames, str, macinfo, macro or "
-"exception"
+"decodedaranges, frame, gdb_index, info, loc, line, decodedline, ranges, "
+"pubnames, str, macinfo, macro or exception"
 msgstr ""
 "Display DWARF section content.  SECTION can be one of abbrev, aranges, "
-"frame, gdb_index, info, loc, line, ranges, pubnames, str, macinfo, macro or "
-"exception"
+"decodedaranges, frame, gdb_index, info, loc, line, decodedline, ranges, "
+"pubnames, str, macinfo, macro or exception"
 
-#: src/readelf.c:93
+#: src/readelf.c:101
 msgid "Dump the uninterpreted contents of SECTION, by number or name"
 msgstr "Dump the uninterpreted contents of SECTION, by number or name"
 
-#: src/readelf.c:95
+#: src/readelf.c:103
 msgid "Print string contents of sections"
 msgstr "Print string contents of sections"
 
-#: src/readelf.c:98
+#: src/readelf.c:106
 msgid "Display the symbol index of an archive"
 msgstr "Display the symbol index of an archive"
 
-#: src/readelf.c:100
+#: src/readelf.c:108
 msgid "Output control:"
 msgstr "Output control:"
 
-#: src/readelf.c:102
+#: src/readelf.c:110
 msgid "Do not find symbol names for addresses in DWARF data"
 msgstr "Do not find symbol names for addresses in DWARF data"
 
-#: src/readelf.c:104
+#: src/readelf.c:112
+msgid ""
+"Display just offsets instead of resolving values to addresses in DWARF data"
+msgstr ""
+"Display just offsets instead of resolving values to addresses in DWARF data"
+
+#: src/readelf.c:114
 msgid "Ignored for compatibility (lines always wide)"
 msgstr "Ignored for compatibility (lines always wide)"
 
-#: src/readelf.c:109
+#: src/readelf.c:119
 msgid "Print information from ELF file in human-readable form."
 msgstr "Print information from ELF file in human-readable form."
 
-#: src/readelf.c:410
+#: src/readelf.c:441
 #, c-format
 msgid "Unknown DWARF debug section `%s'.\n"
 msgstr "Unknown DWARF debug section ‘%s’.\n"
 
-#: src/readelf.c:476
+#: src/readelf.c:520 src/readelf.c:631
 #, c-format
 msgid "cannot generate Elf descriptor: %s"
 msgstr "cannot generate Elf descriptor: %s"
 
-#: src/readelf.c:488
+#: src/readelf.c:545 src/readelf.c:1099 src/readelf.c:1269
 #, c-format
-msgid "'%s' is not an archive, cannot print archive index"
-msgstr "‘%s’ is not an archive, cannot print archive index"
+msgid "cannot get section: %s"
+msgstr "cannot get section: %s"
 
-#: src/readelf.c:493
+#: src/readelf.c:554 src/readelf.c:1106 src/readelf.c:1277 src/readelf.c:9169
+#: src/unstrip.c:352 src/unstrip.c:383 src/unstrip.c:432 src/unstrip.c:540
+#: src/unstrip.c:557 src/unstrip.c:593 src/unstrip.c:791 src/unstrip.c:1059
+#: src/unstrip.c:1250 src/unstrip.c:1310 src/unstrip.c:1431 src/unstrip.c:1484
+#: src/unstrip.c:1591 src/unstrip.c:1780
+#, c-format
+msgid "cannot get section header: %s"
+msgstr "cannot get section header: %s"
+
+#: src/readelf.c:562
+#, c-format
+msgid "cannot get section name"
+msgstr "cannot get section name"
+
+#: src/readelf.c:571 src/readelf.c:5221 src/readelf.c:7414 src/readelf.c:7516
+#: src/readelf.c:7674
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr "cannot get %s content: %s"
+
+#: src/readelf.c:587
+#, c-format
+msgid "cannot create temp file '%s'"
+msgstr "cannot create temp file ‘%s’"
+
+#: src/readelf.c:596
+#, c-format
+msgid "cannot write section data"
+msgstr "cannot write section data"
+
+#: src/readelf.c:602 src/readelf.c:619 src/readelf.c:648
 #, c-format
 msgid "error while closing Elf descriptor: %s"
 msgstr "error while closing Elf descriptor: %s"
 
-#: src/readelf.c:585
+#: src/readelf.c:609
+#, c-format
+msgid "error while rewinding file descriptor"
+msgstr "error while rewinding file descriptor"
+
+#: src/readelf.c:643
+#, c-format
+msgid "'%s' is not an archive, cannot print archive index"
+msgstr "‘%s’ is not an archive, cannot print archive index"
+
+#: src/readelf.c:742
+#, c-format
+msgid "No such section '%s' in '%s'"
+msgstr "No such section ‘%s’ in ‘%s’"
+
+#: src/readelf.c:769
 #, c-format
 msgid "cannot stat input file"
 msgstr "cannot stat input file"
 
-#: src/readelf.c:587
+#: src/readelf.c:771
 #, c-format
 msgid "input file is empty"
 msgstr "input file is empty"
 
-#: src/readelf.c:589
+#: src/readelf.c:773
 #, c-format
 msgid "failed reading '%s': %s"
 msgstr "failed reading '%s': %s"
 
-#: src/readelf.c:625
+#: src/readelf.c:814
 #, c-format
 msgid "cannot read ELF header: %s"
 msgstr "cannot read ELF header: %s"
 
-#: src/readelf.c:633
+#: src/readelf.c:822
 #, c-format
 msgid "cannot create EBL handle"
 msgstr "cannot create EBL handle"
 
-#: src/readelf.c:646
+#: src/readelf.c:835
 #, c-format
 msgid "cannot determine number of program headers: %s"
 msgstr "cannot determine number of program headers: %s"
 
-#: src/readelf.c:732
+#: src/readelf.c:921
 msgid "NONE (None)"
 msgstr "NONE (None)"
 
-#: src/readelf.c:733
+#: src/readelf.c:922
 msgid "REL (Relocatable file)"
 msgstr "REL (Relocatable file)"
 
-#: src/readelf.c:734
+#: src/readelf.c:923
 msgid "EXEC (Executable file)"
 msgstr "EXEC (Executable file)"
 
-#: src/readelf.c:735
+#: src/readelf.c:924
 msgid "DYN (Shared object file)"
 msgstr "DYN (Shared object file)"
 
-#: src/readelf.c:736
+#: src/readelf.c:925
 msgid "CORE (Core file)"
 msgstr "CORE (Core file)"
 
-#: src/readelf.c:741
+#: src/readelf.c:930
 #, c-format
 msgid "OS Specific: (%x)\n"
 msgstr "OS Specific: (%x)\n"
 
-#: src/readelf.c:743
+#: src/readelf.c:932
 #, c-format
 msgid "Processor Specific: (%x)\n"
 msgstr "Processor Specific: (%x)\n"
 
-#: src/readelf.c:753
+#: src/readelf.c:942
 msgid ""
 "ELF Header:\n"
 "  Magic:  "
@@ -4199,7 +4329,7 @@ msgstr ""
 "ELF Header:\n"
 "  Magic:  "
 
-#: src/readelf.c:757
+#: src/readelf.c:946
 #, c-format
 msgid ""
 "\n"
@@ -4208,117 +4338,117 @@ msgstr ""
 "\n"
 "  Class:                             %s\n"
 
-#: src/readelf.c:762
+#: src/readelf.c:951
 #, c-format
 msgid "  Data:                              %s\n"
 msgstr "  Data:                              %s\n"
 
-#: src/readelf.c:768
+#: src/readelf.c:957
 #, c-format
 msgid "  Ident Version:                     %hhd %s\n"
 msgstr "  Ident Version:                     %hhd %s\n"
 
-#: src/readelf.c:770 src/readelf.c:787
+#: src/readelf.c:959 src/readelf.c:976
 msgid "(current)"
 msgstr "(current)"
 
-#: src/readelf.c:774
+#: src/readelf.c:963
 #, c-format
 msgid "  OS/ABI:                            %s\n"
 msgstr "  OS/ABI:                            %s\n"
 
-#: src/readelf.c:777
+#: src/readelf.c:966
 #, c-format
 msgid "  ABI Version:                       %hhd\n"
 msgstr "  ABI Version:                       %hhd\n"
 
-#: src/readelf.c:780
+#: src/readelf.c:969
 msgid "  Type:                              "
 msgstr "  Type:                              "
 
-#: src/readelf.c:783
+#: src/readelf.c:972
 #, c-format
 msgid "  Machine:                           %s\n"
 msgstr "  Machine:                           %s\n"
 
-#: src/readelf.c:785
+#: src/readelf.c:974
 #, c-format
 msgid "  Version:                           %d %s\n"
 msgstr "  Version:                           %d %s\n"
 
-#: src/readelf.c:789
+#: src/readelf.c:978
 #, c-format
 msgid "  Entry point address:               %#<PRIx64>\n"
 msgstr "  Entry point address:               %#<PRIx64>\n"
 
-#: src/readelf.c:792
+#: src/readelf.c:981
 #, c-format
 msgid "  Start of program headers:          %<PRId64> %s\n"
 msgstr "  Start of program headers:          %<PRId64> %s\n"
 
-#: src/readelf.c:793 src/readelf.c:796
+#: src/readelf.c:982 src/readelf.c:985
 msgid "(bytes into file)"
 msgstr "(bytes into file)"
 
-#: src/readelf.c:795
+#: src/readelf.c:984
 #, c-format
 msgid "  Start of section headers:          %<PRId64> %s\n"
 msgstr "  Start of section headers:          %<PRId64> %s\n"
 
-#: src/readelf.c:798
+#: src/readelf.c:987
 #, c-format
 msgid "  Flags:                             %s\n"
 msgstr "  Flags:                             %s\n"
 
-#: src/readelf.c:801
+#: src/readelf.c:990
 #, c-format
 msgid "  Size of this header:               %<PRId16> %s\n"
 msgstr "  Size of this header:               %<PRId16> %s\n"
 
-#: src/readelf.c:802 src/readelf.c:805 src/readelf.c:822
+#: src/readelf.c:991 src/readelf.c:994 src/readelf.c:1011
 msgid "(bytes)"
 msgstr "(bytes)"
 
-#: src/readelf.c:804
+#: src/readelf.c:993
 #, c-format
 msgid "  Size of program header entries:    %<PRId16> %s\n"
 msgstr "  Size of program header entries:    %<PRId16> %s\n"
 
-#: src/readelf.c:807
+#: src/readelf.c:996
 #, c-format
 msgid "  Number of program headers entries: %<PRId16>"
 msgstr "  Number of program headers entries: %<PRId16>"
 
-#: src/readelf.c:814
+#: src/readelf.c:1003
 #, c-format
 msgid " (%<PRIu32> in [0].sh_info)"
 msgstr " (%<PRIu32> in [0].sh_info)"
 
-#: src/readelf.c:817 src/readelf.c:834 src/readelf.c:848
+#: src/readelf.c:1006 src/readelf.c:1023 src/readelf.c:1037
 msgid " ([0] not available)"
 msgstr " ([0] not available)"
 
-#: src/readelf.c:821
+#: src/readelf.c:1010
 #, c-format
 msgid "  Size of section header entries:    %<PRId16> %s\n"
 msgstr "  Size of section header entries:    %<PRId16> %s\n"
 
-#: src/readelf.c:824
+#: src/readelf.c:1013
 #, c-format
 msgid "  Number of section headers entries: %<PRId16>"
 msgstr "  Number of section headers entries: %<PRId16>"
 
-#: src/readelf.c:831
+#: src/readelf.c:1020
 #, c-format
 msgid " (%<PRIu32> in [0].sh_size)"
 msgstr " (%<PRIu32> in [0].sh_size)"
 
-#: src/readelf.c:844
+#: src/readelf.c:1033
 #, c-format
 msgid " (%<PRIu32> in [0].sh_link)"
 msgstr " (%<PRIu32> in [0].sh_link)"
 
-#: src/readelf.c:852
+#: src/readelf.c:1041
 #, c-format
 msgid ""
 "  Section header string table index: XINDEX%s\n"
@@ -4327,7 +4457,7 @@ msgstr ""
 "  Section header string table index: XINDEX%s\n"
 "\n"
 
-#: src/readelf.c:856
+#: src/readelf.c:1045
 #, c-format
 msgid ""
 "  Section header string table index: %<PRId16>\n"
@@ -4336,7 +4466,7 @@ msgstr ""
 "  Section header string table index: %<PRId16>\n"
 "\n"
 
-#: src/readelf.c:888
+#: src/readelf.c:1077
 #, c-format
 msgid ""
 "There are %d section headers, starting at offset %#<PRIx64>:\n"
@@ -4345,11 +4475,11 @@ msgstr ""
 "There are %d section headers, starting at offset %#<PRIx64>:\n"
 "\n"
 
-#: src/readelf.c:898
+#: src/readelf.c:1087
 msgid "Section Headers:"
 msgstr "Section Headers:"
 
-#: src/readelf.c:901
+#: src/readelf.c:1090
 msgid ""
 "[Nr] Name                 Type         Addr     Off    Size   ES Flags Lk "
 "Inf Al"
@@ -4357,7 +4487,7 @@ msgstr ""
 "[Nr] Name                 Type         Addr     Off    Size   ES Flags Lk "
 "Inf Al"
 
-#: src/readelf.c:903
+#: src/readelf.c:1092
 msgid ""
 "[Nr] Name                 Type         Addr             Off      Size     ES "
 "Flags Lk Inf Al"
@@ -4365,31 +4495,17 @@ msgstr ""
 "[Nr] Name                 Type         Addr             Off      Size     ES "
 "Flags Lk Inf Al"
 
-#: src/readelf.c:910 src/readelf.c:1063
-#, c-format
-msgid "cannot get section: %s"
-msgstr "cannot get section: %s"
-
-#: src/readelf.c:917 src/readelf.c:1071 src/readelf.c:8343 src/unstrip.c:345
-#: src/unstrip.c:376 src/unstrip.c:425 src/unstrip.c:533 src/unstrip.c:550
-#: src/unstrip.c:586 src/unstrip.c:784 src/unstrip.c:1052 src/unstrip.c:1242
-#: src/unstrip.c:1302 src/unstrip.c:1423 src/unstrip.c:1476 src/unstrip.c:1583
-#: src/unstrip.c:1772
-#, c-format
-msgid "cannot get section header: %s"
-msgstr "cannot get section header: %s"
-
-#: src/readelf.c:975
+#: src/readelf.c:1164
 msgid "Program Headers:"
 msgstr "Program Headers:"
 
-#: src/readelf.c:977
+#: src/readelf.c:1166
 msgid ""
 "  Type           Offset   VirtAddr   PhysAddr   FileSiz  MemSiz   Flg Align"
 msgstr ""
 "  Type           Offset   VirtAddr   PhysAddr   FileSiz  MemSiz   Flg Align"
 
-#: src/readelf.c:980
+#: src/readelf.c:1169
 msgid ""
 "  Type           Offset   VirtAddr           PhysAddr           FileSiz  "
 "MemSiz   Flg Align"
@@ -4397,12 +4513,12 @@ msgstr ""
 "  Type           Offset   VirtAddr           PhysAddr           FileSiz  "
 "MemSiz   Flg Align"
 
-#: src/readelf.c:1020
+#: src/readelf.c:1226
 #, c-format
 msgid "\t[Requesting program interpreter: %s]\n"
 msgstr "\t[Requesting program interpreter: %s]\n"
 
-#: src/readelf.c:1041
+#: src/readelf.c:1247
 msgid ""
 "\n"
 " Section to Segment mapping:\n"
@@ -4412,12 +4528,12 @@ msgstr ""
 " Section to Segment mapping:\n"
 "  Segment Sections..."
 
-#: src/readelf.c:1052 src/unstrip.c:1827 src/unstrip.c:1866 src/unstrip.c:1873
+#: src/readelf.c:1258 src/unstrip.c:1835 src/unstrip.c:1874 src/unstrip.c:1881
 #, c-format
 msgid "cannot get program header: %s"
 msgstr "cannot get program header: %s"
 
-#: src/readelf.c:1193
+#: src/readelf.c:1401
 #, c-format
 msgid ""
 "\n"
@@ -4432,7 +4548,7 @@ msgstr[1] ""
 "\n"
 "COMDAT section group [%2zu] ‘%s’ with signature ‘%s’ contains %zu entries:\n"
 
-#: src/readelf.c:1198
+#: src/readelf.c:1406
 #, c-format
 msgid ""
 "\n"
@@ -4447,15 +4563,21 @@ msgstr[1] ""
 "\n"
 "Section group [%2zu] ‘%s’ with signature ‘%s’ contains %zu entries:\n"
 
-#: src/readelf.c:1206
+#: src/readelf.c:1414
 msgid "<INVALID SYMBOL>"
 msgstr "<INVALID SYMBOL>"
 
-#: src/readelf.c:1220
+#: src/readelf.c:1428
 msgid "<INVALID SECTION>"
 msgstr "<INVALID SECTION>"
 
-#: src/readelf.c:1371
+#: src/readelf.c:1585 src/readelf.c:2202 src/readelf.c:2460 src/readelf.c:2530
+#: src/readelf.c:2812 src/readelf.c:2885 src/readelf.c:4488
+#, c-format
+msgid "invalid sh_link value in section %Zu"
+msgstr "invalid sh_link value in section %Zu"
+
+#: src/readelf.c:1588
 #, c-format
 msgid ""
 "\n"
@@ -4474,36 +4596,36 @@ msgstr[1] ""
 "Dynamic segment contains %lu entries:\n"
 " Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘%s’\n"
 
-#: src/readelf.c:1383
+#: src/readelf.c:1598
 msgid "  Type              Value\n"
 msgstr "  Type              Value\n"
 
-#: src/readelf.c:1407
+#: src/readelf.c:1622
 #, c-format
 msgid "Shared library: [%s]\n"
 msgstr "Shared library: [%s]\n"
 
-#: src/readelf.c:1412
+#: src/readelf.c:1627
 #, c-format
 msgid "Library soname: [%s]\n"
 msgstr "Library soname: [%s]\n"
 
-#: src/readelf.c:1417
+#: src/readelf.c:1632
 #, c-format
 msgid "Library rpath: [%s]\n"
 msgstr "Library rpath: [%s]\n"
 
-#: src/readelf.c:1422
+#: src/readelf.c:1637
 #, c-format
 msgid "Library runpath: [%s]\n"
 msgstr "Library runpath: [%s]\n"
 
-#: src/readelf.c:1442
+#: src/readelf.c:1657
 #, c-format
 msgid "%<PRId64> (bytes)\n"
 msgstr "%<PRId64> (bytes)\n"
 
-#: src/readelf.c:1554 src/readelf.c:1740
+#: src/readelf.c:1770 src/readelf.c:1957
 #, c-format
 msgid ""
 "\n"
@@ -4512,7 +4634,7 @@ msgstr ""
 "\n"
 "Invalid symbol table at offset %#0<PRIx64>\n"
 
-#: src/readelf.c:1572 src/readelf.c:1757
+#: src/readelf.c:1788 src/readelf.c:1975
 #, c-format
 msgid ""
 "\n"
@@ -4531,7 +4653,7 @@ msgstr[1] ""
 "Relocation section [%2zu] ‘%s’ for section [%2u] ‘%s’ at offset %#0<PRIx64> "
 "contains %d entries:\n"
 
-#: src/readelf.c:1587
+#: src/readelf.c:1803 src/readelf.c:1990
 #, c-format
 msgid ""
 "\n"
@@ -4546,30 +4668,30 @@ msgstr[1] ""
 "\n"
 "Relocation section [%2u] ‘%s’ at offset %#0<PRIx64> contains %d entries:\n"
 
-#: src/readelf.c:1597
+#: src/readelf.c:1813
 msgid "  Offset      Type                 Value       Name\n"
 msgstr "  Offset      Type                 Value       Name\n"
 
-#: src/readelf.c:1599
+#: src/readelf.c:1815
 msgid "  Offset              Type                 Value               Name\n"
 msgstr "  Offset              Type                 Value               Name\n"
 
-#: src/readelf.c:1652 src/readelf.c:1663 src/readelf.c:1676 src/readelf.c:1694
-#: src/readelf.c:1706 src/readelf.c:1825 src/readelf.c:1837 src/readelf.c:1851
-#: src/readelf.c:1870 src/readelf.c:1883
+#: src/readelf.c:1868 src/readelf.c:1879 src/readelf.c:1892 src/readelf.c:1910
+#: src/readelf.c:1922 src/readelf.c:2056 src/readelf.c:2068 src/readelf.c:2082
+#: src/readelf.c:2101 src/readelf.c:2114
 msgid "<INVALID RELOC>"
 msgstr "<INVALID RELOC>"
 
-#: src/readelf.c:1769
+#: src/readelf.c:2000
 msgid "  Offset      Type            Value       Addend Name\n"
 msgstr "  Offset      Type            Value       Addend Name\n"
 
-#: src/readelf.c:1771
+#: src/readelf.c:2002
 msgid "  Offset              Type            Value               Addend Name\n"
 msgstr ""
 "  Offset              Type            Value               Addend Name\n"
 
-#: src/readelf.c:1972
+#: src/readelf.c:2210
 #, c-format
 msgid ""
 "\n"
@@ -4584,40 +4706,40 @@ msgstr[1] ""
 "\n"
 "Symbol table [%2u] ‘%s’ contains %u entries:\n"
 
-#: src/readelf.c:1978
+#: src/readelf.c:2215
 #, c-format
 msgid " %lu local symbol  String table: [%2u] '%s'\n"
 msgid_plural " %lu local symbols  String table: [%2u] '%s'\n"
 msgstr[0] " %lu local symbol  String table: [%2u] ‘%s’\n"
 msgstr[1] " %lu local symbols  String table: [%2u] ‘%s’\n"
 
-#: src/readelf.c:1988
+#: src/readelf.c:2223
 msgid "  Num:    Value   Size Type    Bind   Vis          Ndx Name\n"
 msgstr "  Num:    Value   Size Type    Bind   Vis          Ndx Name\n"
 
-#: src/readelf.c:1990
+#: src/readelf.c:2225
 msgid "  Num:            Value   Size Type    Bind   Vis          Ndx Name\n"
 msgstr "  Num:            Value   Size Type    Bind   Vis          Ndx Name\n"
 
-#: src/readelf.c:2010
+#: src/readelf.c:2245
 #, 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:2098
+#: src/readelf.c:2333
 #, c-format
 msgid "bad dynamic symbol"
 msgstr "bad dynamic symbol"
 
-#: src/readelf.c:2180
+#: src/readelf.c:2415
 msgid "none"
 msgstr "none"
 
-#: src/readelf.c:2197
+#: src/readelf.c:2432
 msgid "| <unknown>"
 msgstr "| <unknown>"
 
-#: src/readelf.c:2222
+#: src/readelf.c:2463
 #, c-format
 msgid ""
 "\n"
@@ -4636,17 +4758,17 @@ msgstr[1] ""
 "Version needs section [%2u] ‘%s’ contains %d entries:\n"
 " Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘%s’\n"
 
-#: src/readelf.c:2245
+#: src/readelf.c:2484
 #, c-format
 msgid "  %#06x: Version: %hu  File: %s  Cnt: %hu\n"
 msgstr "  %#06x: Version: %hu  File: %s  Cnt: %hu\n"
 
-#: src/readelf.c:2258
+#: src/readelf.c:2497
 #, c-format
 msgid "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 msgstr "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 
-#: src/readelf.c:2289
+#: src/readelf.c:2534
 #, c-format
 msgid ""
 "\n"
@@ -4665,17 +4787,17 @@ msgstr[1] ""
 "Version definition section [%2u] ‘%s’ contains %d entries:\n"
 " Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘%s’\n"
 
-#: src/readelf.c:2319
+#: src/readelf.c:2562
 #, c-format
 msgid "  %#06x: Version: %hd  Flags: %s  Index: %hd  Cnt: %hd  Name: %s\n"
 msgstr "  %#06x: Version: %hd  Flags: %s  Index: %hd  Cnt: %hd  Name: %s\n"
 
-#: src/readelf.c:2334
+#: src/readelf.c:2577
 #, c-format
 msgid "  %#06x: Parent %d: %s\n"
 msgstr "  %#06x: Parent %d: %s\n"
 
-#: src/readelf.c:2566
+#: src/readelf.c:2816
 #, c-format
 msgid ""
 "\n"
@@ -4694,15 +4816,15 @@ msgstr[1] ""
 "Version symbols section [%2u] ‘%s’ contains %d entries:\n"
 " Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘%s’"
 
-#: src/readelf.c:2596
+#: src/readelf.c:2844
 msgid "   0 *local*                     "
 msgstr "   0 *local*                     "
 
-#: src/readelf.c:2601
+#: src/readelf.c:2849
 msgid "   1 *global*                    "
 msgstr "   1 *global*                    "
 
-#: src/readelf.c:2632
+#: src/readelf.c:2890
 #, c-format
 msgid ""
 "\n"
@@ -4725,22 +4847,22 @@ msgstr[1] ""
 "buckets):\n"
 " Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] ‘%s’\n"
 
-#: src/readelf.c:2656
+#: src/readelf.c:2912
 #, no-c-format
 msgid " Length  Number  % of total  Coverage\n"
 msgstr " Length  Number  % of total  Coverage\n"
 
-#: src/readelf.c:2658
+#: src/readelf.c:2914
 #, c-format
 msgid "      0  %6<PRIu32>      %5.1f%%\n"
 msgstr "      0  %6<PRIu32>      %5.1f%%\n"
 
-#: src/readelf.c:2665
+#: src/readelf.c:2921
 #, c-format
 msgid "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 msgstr "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 
-#: src/readelf.c:2678
+#: src/readelf.c:2934
 #, c-format
 msgid ""
 " Average number of tests:   successful lookup: %f\n"
@@ -4749,12 +4871,12 @@ msgstr ""
 " Average number of tests:   successful lookup: %f\n"
 "\t\t\t  unsuccessful lookup: %f\n"
 
-#: src/readelf.c:2696 src/readelf.c:2738 src/readelf.c:2779
+#: src/readelf.c:2952 src/readelf.c:2994 src/readelf.c:3035
 #, c-format
 msgid "cannot get data for section %d: %s"
 msgstr "cannot get data for section %d: %s"
 
-#: src/readelf.c:2833
+#: src/readelf.c:3089
 #, c-format
 msgid ""
 " Symbol Bias: %u\n"
@@ -4763,7 +4885,7 @@ msgstr ""
 " Symbol Bias: %u\n"
 " Bitmask Size: %zu bytes  %<PRIuFAST32>%% bits set  2nd hash shift: %u\n"
 
-#: src/readelf.c:2907
+#: src/readelf.c:3164
 #, c-format
 msgid ""
 "\n"
@@ -4778,7 +4900,7 @@ msgstr[1] ""
 "\n"
 "Library list section [%2zu] ‘%s’ at offset %#0<PRIx64> contains %d entries:\n"
 
-#: src/readelf.c:2921
+#: src/readelf.c:3178
 msgid ""
 "       Library                       Time Stamp          Checksum Version "
 "Flags"
@@ -4786,7 +4908,7 @@ msgstr ""
 "       Library                       Time Stamp          Checksum Version "
 "Flags"
 
-#: src/readelf.c:2971
+#: src/readelf.c:3228
 #, c-format
 msgid ""
 "\n"
@@ -4797,135 +4919,140 @@ msgstr ""
 "Object attributes section [%2zu] ‘%s’ of %<PRIu64> bytes at offset "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:2987
+#: src/readelf.c:3244
 msgid "  Owner          Size\n"
 msgstr "  Owner          Size\n"
 
-#: src/readelf.c:3013
+#: src/readelf.c:3270
 #, c-format
 msgid "  %-13s  %4<PRIu32>\n"
 msgstr "  %-13s  %4<PRIu32>\n"
 
-#: src/readelf.c:3045
+#: src/readelf.c:3302
 #, c-format
 msgid "    %-4u %12<PRIu32>\n"
 msgstr "    %-4u %12<PRIu32>\n"
 
-#: src/readelf.c:3050
+#: src/readelf.c:3307
 #, c-format
 msgid "    File: %11<PRIu32>\n"
 msgstr "    File: %11<PRIu32>\n"
 
-#: src/readelf.c:3085
+#: src/readelf.c:3342
 #, c-format
 msgid "      %s: %<PRId64>, %s\n"
 msgstr "      %s: %<PRId64>, %s\n"
 
-#: src/readelf.c:3088
+#: src/readelf.c:3345
 #, c-format
 msgid "      %s: %<PRId64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:3091
+#: src/readelf.c:3348
 #, c-format
 msgid "      %s: %s\n"
 msgstr "      %s: %s\n"
 
-#: src/readelf.c:3098
+#: src/readelf.c:3355
 #, c-format
 msgid "      %u: %<PRId64>\n"
 msgstr "      %u: %<PRId64>\n"
 
-#: src/readelf.c:3101
+#: src/readelf.c:3358
 #, c-format
 msgid "      %u: %s\n"
 msgstr "      %u: %s\n"
 
-#: src/readelf.c:3137
+#: src/readelf.c:3403
 #, c-format
 msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3140
+#: src/readelf.c:3406
 #, c-format
 msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3145
+#: src/readelf.c:3411
 #, c-format
 msgid "%#<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%#<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3148
+#: src/readelf.c:3414
 #, c-format
 msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%#0*<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3154
+#: src/readelf.c:3420
 #, c-format
 msgid "%s+%#<PRIx64> <%s>"
 msgstr "%s+%#<PRIx64> <%s>"
 
-#: src/readelf.c:3157
+#: src/readelf.c:3423
 #, c-format
 msgid "%s+%#0*<PRIx64> <%s>"
 msgstr "%s+%#0*<PRIx64> <%s>"
 
-#: src/readelf.c:3161
+#: src/readelf.c:3427
 #, c-format
 msgid "%#<PRIx64> <%s>"
 msgstr "%#<PRIx64> <%s>"
 
-#: src/readelf.c:3164
+#: src/readelf.c:3430
 #, c-format
 msgid "%#0*<PRIx64> <%s>"
 msgstr "%#0*<PRIx64> <%s>"
 
-#: src/readelf.c:3169
+#: src/readelf.c:3435
 #, c-format
 msgid "%s+%#<PRIx64>"
 msgstr "%s+%#<PRIx64>"
 
-#: src/readelf.c:3172
+#: src/readelf.c:3438
 #, c-format
 msgid "%s+%#0*<PRIx64>"
 msgstr "%s+%#0*<PRIx64>"
 
-#: src/readelf.c:3554
+#: src/readelf.c:3820
 msgid "empty block"
 msgstr "empty block"
 
-#: src/readelf.c:3557
+#: src/readelf.c:3823
 #, c-format
 msgid "%zu byte block:"
 msgstr "%zu byte block:"
 
-#: src/readelf.c:3934
+#: src/readelf.c:4217
 #, c-format
 msgid "%*s[%4<PRIuMAX>] %s  <TRUNCATED>\n"
 msgstr "%*s[%4<PRIuMAX>] %s  <TRUNCATED>\n"
 
-#: src/readelf.c:3970
+#: src/readelf.c:4274
 #, c-format
 msgid "%s %#<PRIx64> used with different address sizes"
 msgstr "%s %#<PRIx64> used with different address sizes"
 
-#: src/readelf.c:3977
+#: src/readelf.c:4281
 #, c-format
 msgid "%s %#<PRIx64> used with different offset sizes"
 msgstr "%s %#<PRIx64> used with different offset sizes"
 
-#: src/readelf.c:4057
+#: src/readelf.c:4288
+#, c-format
+msgid "%s %#<PRIx64> used with different base addresses"
+msgstr "%s %#<PRIx64> used with different base addresses"
+
+#: src/readelf.c:4370
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE IN REST OF SECTION>\n"
 msgstr " [%6tx]  <UNUSED GARBAGE IN REST OF SECTION>\n"
 
-#: src/readelf.c:4065
+#: src/readelf.c:4378
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
 msgstr " [%6tx]  <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
 
-#: src/readelf.c:4087
+#: src/readelf.c:4404
 #, c-format
 msgid ""
 "\n"
@@ -4936,7 +5063,7 @@ msgstr ""
 "DWARF section [%2zu] ‘%s’ at offset %#<PRIx64>:\n"
 " [ Code]\n"
 
-#: src/readelf.c:4095
+#: src/readelf.c:4412
 #, c-format
 msgid ""
 "\n"
@@ -4945,30 +5072,30 @@ msgstr ""
 "\n"
 "Abbreviation section at offset %<PRIu64>:\n"
 
-#: src/readelf.c:4108
+#: src/readelf.c:4425
 #, c-format
 msgid " *** error while reading abbreviation: %s\n"
 msgstr " *** error while reading abbreviation: %s\n"
 
-#: src/readelf.c:4124
+#: src/readelf.c:4441
 #, c-format
 msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
 msgstr " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
 
-#: src/readelf.c:4127
+#: src/readelf.c:4444
 msgid "yes"
 msgstr "yes"
 
-#: src/readelf.c:4127
+#: src/readelf.c:4444
 msgid "no"
 msgstr "no"
 
-#: src/readelf.c:4162
+#: src/readelf.c:4478 src/readelf.c:4551
 #, c-format
 msgid "cannot get .debug_aranges content: %s"
 msgstr "cannot get .debug_aranges content: %s"
 
-#: src/readelf.c:4167
+#: src/readelf.c:4493
 #, c-format
 msgid ""
 "\n"
@@ -4983,25 +5110,20 @@ msgstr[1] ""
 "\n"
 "DWARF section [%2zu] ‘%s’ at offset %#<PRIx64> contains %zu entries:\n"
 
-#: src/readelf.c:4198
+#: src/readelf.c:4524
 #, c-format
 msgid " [%*zu] ???\n"
 msgstr " [%*zu] ???\n"
 
-#: src/readelf.c:4200
+#: src/readelf.c:4526
 #, c-format
 msgid ""
 " [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
 msgstr ""
 " [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
 
-#: src/readelf.c:4219
-#, c-format
-msgid "cannot get .debug_ranges content: %s"
-msgstr "cannot get .debug_ranges content: %s"
-
-#: src/readelf.c:4224 src/readelf.c:4728 src/readelf.c:5505 src/readelf.c:6006
-#: src/readelf.c:6121 src/readelf.c:6277 src/readelf.c:6699
+#: src/readelf.c:4556 src/readelf.c:4710 src/readelf.c:5231 src/readelf.c:6145
+#: src/readelf.c:6646 src/readelf.c:6766 src/readelf.c:6922 src/readelf.c:7345
 #, c-format
 msgid ""
 "\n"
@@ -5010,37 +5132,119 @@ msgstr ""
 "\n"
 "DWARF section [%2zu] ‘%s’ at offset %#<PRIx64>:\n"
 
-#: src/readelf.c:4248 src/readelf.c:6031
+#: src/readelf.c:4569 src/readelf.c:6171
+#, c-format
+msgid ""
+"\n"
+"Table at offset %Zu:\n"
+msgstr ""
+"\n"
+"Table at offset %Zu:\n"
+
+#: src/readelf.c:4573 src/readelf.c:5255 src/readelf.c:6180
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr "invalid data in section [%zu] ‘%s’"
+
+#: src/readelf.c:4589
+#, c-format
+msgid ""
+"\n"
+" Length:        %6<PRIu64>\n"
+msgstr ""
+"\n"
+" Length:        %6<PRIu64>\n"
+
+#: src/readelf.c:4601
+#, c-format
+msgid " DWARF version: %6<PRIuFAST16>\n"
+msgstr " DWARF version: %6<PRIuFAST16>\n"
+
+#: src/readelf.c:4605
+#, c-format
+msgid "unsupported aranges version"
+msgstr "unsupported aranges version"
+
+#: src/readelf.c:4616
+#, c-format
+msgid " CU offset:     %6<PRIx64>\n"
+msgstr " CU offset:     %6<PRIx64>\n"
+
+#: src/readelf.c:4622
+#, c-format
+msgid " Address size:  %6<PRIu64>\n"
+msgstr " Address size:  %6<PRIu64>\n"
+
+#: src/readelf.c:4626
+#, c-format
+msgid "unsupported address size"
+msgstr "unsupported address size"
+
+#: src/readelf.c:4631
+#, c-format
+msgid ""
+" Segment size:  %6<PRIu64>\n"
+"\n"
+msgstr ""
+" Segment size:  %6<PRIu64>\n"
+"\n"
+
+#: src/readelf.c:4635
+#, c-format
+msgid "unsupported segment size"
+msgstr "unsupported segment size"
+
+#: src/readelf.c:4675
+#, c-format
+msgid "   %s..%s (%<PRIx64>)\n"
+msgstr "   %s..%s (%<PRIx64>)\n"
+
+#: src/readelf.c:4678
+#, c-format
+msgid "   %s..%s\n"
+msgstr "   %s..%s\n"
+
+#: src/readelf.c:4687
+#, c-format
+msgid "   %Zu padding bytes\n"
+msgstr "   %Zu padding bytes\n"
+
+#: src/readelf.c:4705
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr "cannot get .debug_ranges content: %s"
+
+#: src/readelf.c:4735 src/readelf.c:6673
 #, c-format
 msgid " [%6tx]  <INVALID DATA>\n"
 msgstr " [%6tx]  <INVALID DATA>\n"
 
-#: src/readelf.c:4270 src/readelf.c:6053
+#: src/readelf.c:4757 src/readelf.c:6695
 #, c-format
 msgid " [%6tx]  base address %s\n"
 msgstr " [%6tx]  base address %s\n"
 
-#: src/readelf.c:4276 src/readelf.c:6059
+#: src/readelf.c:4764 src/readelf.c:6702
 #, c-format
 msgid " [%6tx]  empty list\n"
 msgstr " [%6tx]  empty list\n"
 
-#: src/readelf.c:4285
+#: src/readelf.c:4775
 #, c-format
 msgid " [%6tx]  %s..%s\n"
 msgstr " [%6tx]  %s..%s\n"
 
-#: src/readelf.c:4287
+#: src/readelf.c:4777
 #, c-format
 msgid "           %s..%s\n"
 msgstr "           %s..%s\n"
 
-#: src/readelf.c:4717 src/readelf.c:6768 src/readelf.c:6870 src/readelf.c:7028
+#: src/readelf.c:5210
 #, c-format
-msgid "cannot get %s content: %s"
-msgstr "cannot get %s content: %s"
+msgid "cannot get ELF: %s"
+msgstr "cannot get ELF: %s"
 
-#: src/readelf.c:4724
+#: src/readelf.c:5227
 #, c-format
 msgid ""
 "\n"
@@ -5049,12 +5253,7 @@ msgstr ""
 "\n"
 "Call frame information section [%2zu] ‘%s’ at offset %#<PRIx64>:\n"
 
-#: src/readelf.c:4752 src/readelf.c:5540
-#, c-format
-msgid "invalid data in section [%zu] '%s'"
-msgstr "invalid data in section [%zu] ‘%s’"
-
-#: src/readelf.c:4774
+#: src/readelf.c:5277
 #, c-format
 msgid ""
 "\n"
@@ -5063,50 +5262,50 @@ msgstr ""
 "\n"
 " [%6tx] Zero terminator\n"
 
-#: src/readelf.c:4859
+#: src/readelf.c:5362
 #, c-format
 msgid "invalid augmentation length"
 msgstr "invalid augmentation length"
 
-#: src/readelf.c:4871
+#: src/readelf.c:5374
 msgid "FDE address encoding: "
 msgstr "FDE address encoding: "
 
-#: src/readelf.c:4877
+#: src/readelf.c:5380
 msgid "LSDA pointer encoding: "
 msgstr "LSDA pointer encoding: "
 
-#: src/readelf.c:4975
+#: src/readelf.c:5491
 #, c-format
 msgid " (offset: %#<PRIx64>)"
 msgstr " (offset: %#<PRIx64>)"
 
-#: src/readelf.c:4982
+#: src/readelf.c:5498
 #, c-format
 msgid " (end offset: %#<PRIx64>)"
 msgstr " (end offset: %#<PRIx64>)"
 
-#: src/readelf.c:5009
+#: src/readelf.c:5525
 #, c-format
 msgid "   %-26sLSDA pointer: %#<PRIx64>\n"
 msgstr "   %-26sLSDA pointer: %#<PRIx64>\n"
 
-#: src/readelf.c:5060
+#: src/readelf.c:5577
 #, c-format
 msgid "cannot get attribute code: %s"
 msgstr "cannot get attribute code: %s"
 
-#: src/readelf.c:5069
+#: src/readelf.c:5586
 #, c-format
 msgid "cannot get attribute form: %s"
 msgstr "cannot get attribute form: %s"
 
-#: src/readelf.c:5084
+#: src/readelf.c:5601
 #, c-format
 msgid "cannot get attribute value: %s"
 msgstr "cannot get attribute value: %s"
 
-#: src/readelf.c:5342
+#: src/readelf.c:5894
 #, c-format
 msgid ""
 "\n"
@@ -5117,7 +5316,7 @@ msgstr ""
 "DWARF section [%2zu] ‘%s’ at offset %#<PRIx64>:\n"
 " [Offset]\n"
 
-#: src/readelf.c:5374
+#: src/readelf.c:5926
 #, c-format
 msgid ""
 " Type unit at offset %<PRIu64>:\n"
@@ -5130,7 +5329,7 @@ msgstr ""
 "%<PRIu8>, Offset size: %<PRIu8>\n"
 " Type signature: %#<PRIx64>, Type offset: %#<PRIx64>\n"
 
-#: src/readelf.c:5383
+#: src/readelf.c:5935
 #, c-format
 msgid ""
 " Compilation unit at offset %<PRIu64>:\n"
@@ -5141,46 +5340,48 @@ msgstr ""
 " Version: %<PRIu16>, Abbreviation section offset: %<PRIu64>, Address size: "
 "%<PRIu8>, Offset size: %<PRIu8>\n"
 
-#: src/readelf.c:5409
+#: src/readelf.c:5960
 #, c-format
 msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
 msgstr "cannot get DIE at offset %<PRIu64> in section '%s': %s"
 
-#: src/readelf.c:5421
+#: src/readelf.c:5974
 #, c-format
 msgid "cannot get DIE offset: %s"
 msgstr "cannot get DIE offset: %s"
 
-#: src/readelf.c:5430
+#: src/readelf.c:5983
 #, c-format
 msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
 msgstr "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
 
-#: src/readelf.c:5461
+#: src/readelf.c:6015
 #, c-format
 msgid "cannot get next DIE: %s\n"
 msgstr "cannot get next DIE: %s\n"
 
-#: src/readelf.c:5469
+#: src/readelf.c:6023
 #, c-format
 msgid "cannot get next DIE: %s"
 msgstr "cannot get next DIE: %s"
 
-#: src/readelf.c:5518
-#, c-format
-msgid "cannot get line data section data: %s"
-msgstr "cannot get line data section data: %s"
-
-#: src/readelf.c:5531
+#: src/readelf.c:6059
 #, c-format
 msgid ""
 "\n"
-"Table at offset %Zu:\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+"\n"
 msgstr ""
 "\n"
-"Table at offset %Zu:\n"
+"DWARF section [%2zu] ‘%s’ at offset %#<PRIx64>:\n"
+"\n"
 
-#: src/readelf.c:5586
+#: src/readelf.c:6158
+#, c-format
+msgid "cannot get line data section data: %s"
+msgstr "cannot get line data section data: %s"
+
+#: src/readelf.c:6226
 #, c-format
 msgid ""
 "\n"
@@ -5209,19 +5410,19 @@ msgstr ""
 "\n"
 "Opcodes:\n"
 
-#: src/readelf.c:5607
+#: src/readelf.c:6247
 #, c-format
 msgid "invalid data at offset %tu in section [%zu] '%s'"
 msgstr "invalid data at offset %tu in section [%zu] ‘%s’"
 
-#: src/readelf.c:5622
+#: src/readelf.c:6262
 #, c-format
 msgid "  [%*<PRIuFAST8>]  %hhu argument\n"
 msgid_plural "  [%*<PRIuFAST8>]  %hhu arguments\n"
 msgstr[0] "  [%*<PRIuFAST8>]  %hhu argument\n"
 msgstr[1] "  [%*<PRIuFAST8>]  %hhu arguments\n"
 
-#: src/readelf.c:5630
+#: src/readelf.c:6270
 msgid ""
 "\n"
 "Directory table:"
@@ -5229,7 +5430,7 @@ msgstr ""
 "\n"
 "Directory table:"
 
-#: src/readelf.c:5646
+#: src/readelf.c:6286
 msgid ""
 "\n"
 "File name table:\n"
@@ -5239,7 +5440,7 @@ msgstr ""
 "File name table:\n"
 " Entry Dir   Time      Size      Name"
 
-#: src/readelf.c:5675
+#: src/readelf.c:6315
 msgid ""
 "\n"
 "Line number statements:"
@@ -5247,207 +5448,207 @@ msgstr ""
 "\n"
 "Line number statements:"
 
-#: src/readelf.c:5751
+#: src/readelf.c:6391
 #, c-format
 msgid " special opcode %u: address+%u = %s, op_index = %u, line%+d = %zu\n"
 msgstr " special opcode %u: address+%u = %s, op_index = %u, line%+d = %zu\n"
 
-#: src/readelf.c:5756
+#: src/readelf.c:6396
 #, c-format
 msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
 msgstr " special opcode %u: address+%u = %s, line%+d = %zu\n"
 
-#: src/readelf.c:5776
+#: src/readelf.c:6416
 #, c-format
 msgid " extended opcode %u: "
 msgstr " extended opcode %u: "
 
-#: src/readelf.c:5781
+#: src/readelf.c:6421
 msgid " end of sequence"
 msgstr " end of sequence"
 
-#: src/readelf.c:5798
+#: src/readelf.c:6438
 #, c-format
 msgid " set address to %s\n"
 msgstr " set address to %s\n"
 
-#: src/readelf.c:5819
+#: src/readelf.c:6459
 #, c-format
 msgid " define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
 msgstr " define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
 
-#: src/readelf.c:5832
+#: src/readelf.c:6472
 #, c-format
 msgid " set discriminator to %u\n"
 msgstr " set discriminator to %u\n"
 
-#: src/readelf.c:5837
+#: src/readelf.c:6477
 msgid " unknown opcode"
 msgstr " unknown opcode"
 
-#: src/readelf.c:5849
+#: src/readelf.c:6489
 msgid " copy"
 msgstr " copy"
 
-#: src/readelf.c:5860
+#: src/readelf.c:6500
 #, c-format
 msgid " advance address by %u to %s, op_index to %u\n"
 msgstr " advance address by %u to %s, op_index to %u\n"
 
-#: src/readelf.c:5864
+#: src/readelf.c:6504
 #, c-format
 msgid " advance address by %u to %s\n"
 msgstr " advance address by %u to %s\n"
 
-#: src/readelf.c:5875
+#: src/readelf.c:6515
 #, c-format
 msgid " advance line by constant %d to %<PRId64>\n"
 msgstr " advance line by constant %d to %<PRId64>\n"
 
-#: src/readelf.c:5883
+#: src/readelf.c:6523
 #, c-format
 msgid " set file to %<PRIu64>\n"
 msgstr " set file to %<PRIu64>\n"
 
-#: src/readelf.c:5893
+#: src/readelf.c:6533
 #, c-format
 msgid " set column to %<PRIu64>\n"
 msgstr " set column to %<PRIu64>\n"
 
-#: src/readelf.c:5900
+#: src/readelf.c:6540
 #, c-format
 msgid " set '%s' to %<PRIuFAST8>\n"
 msgstr " set ‘%s’ to %<PRIuFAST8>\n"
 
-#: src/readelf.c:5906
+#: src/readelf.c:6546
 msgid " set basic block flag"
 msgstr " set basic block flag"
 
-#: src/readelf.c:5915
+#: src/readelf.c:6555
 #, c-format
 msgid " advance address by constant %u to %s, op_index to %u\n"
 msgstr " advance address by constant %u to %s, op_index to %u\n"
 
-#: src/readelf.c:5919
+#: src/readelf.c:6559
 #, c-format
 msgid " advance address by constant %u to %s\n"
 msgstr " advance address by constant %u to %s\n"
 
-#: src/readelf.c:5937
+#: src/readelf.c:6577
 #, c-format
 msgid " advance address by fixed value %u to %s\n"
 msgstr " advance address by fixed value %u to %s\n"
 
-#: src/readelf.c:5946
+#: src/readelf.c:6586
 msgid " set prologue end flag"
 msgstr " set prologue end flag"
 
-#: src/readelf.c:5951
+#: src/readelf.c:6591
 msgid " set epilogue begin flag"
 msgstr " set epilogue begin flag"
 
-#: src/readelf.c:5960
+#: src/readelf.c:6600
 #, c-format
 msgid " set isa to %u\n"
 msgstr " set isa to %u\n"
 
-#: src/readelf.c:5969
+#: src/readelf.c:6609
 #, c-format
 msgid " unknown opcode with %<PRIu8> parameter:"
 msgid_plural " unknown opcode with %<PRIu8> parameters:"
 msgstr[0] " unknown opcode with %<PRIu8> parameter:"
 msgstr[1] " unknown opcode with %<PRIu8> parameters:"
 
-#: src/readelf.c:6001
+#: src/readelf.c:6641
 #, c-format
 msgid "cannot get .debug_loc content: %s"
 msgstr "cannot get .debug_loc content: %s"
 
-#: src/readelf.c:6071
+#: src/readelf.c:6716
 #, c-format
 msgid " [%6tx]  %s..%s"
 msgstr " [%6tx]  %s..%s"
 
-#: src/readelf.c:6073
+#: src/readelf.c:6718
 #, c-format
 msgid "           %s..%s"
 msgstr "           %s..%s"
 
-#: src/readelf.c:6080
+#: src/readelf.c:6725
 msgid "   <INVALID DATA>\n"
 msgstr "   <INVALID DATA>\n"
 
-#: src/readelf.c:6132 src/readelf.c:6286
+#: src/readelf.c:6777 src/readelf.c:6931
 #, c-format
 msgid "cannot get macro information section data: %s"
 msgstr "cannot get macro information section data: %s"
 
-#: src/readelf.c:6211
+#: src/readelf.c:6856
 #, c-format
 msgid "%*s*** non-terminated string at end of section"
 msgstr "%*s*** non-terminated string at end of section"
 
-#: src/readelf.c:6327
+#: src/readelf.c:6972
 #, c-format
 msgid " Offset:             0x%<PRIx64>\n"
 msgstr " Offset:             0x%<PRIx64>\n"
 
-#: src/readelf.c:6339
+#: src/readelf.c:6984
 #, c-format
 msgid " Version:            %<PRIu16>\n"
 msgstr " Version:            %<PRIu16>\n"
 
-#: src/readelf.c:6345 src/readelf.c:7055
+#: src/readelf.c:6990 src/readelf.c:7703
 #, c-format
 msgid "  unknown version, cannot parse section\n"
 msgstr "  unknown version, cannot parse section\n"
 
-#: src/readelf.c:6352
+#: src/readelf.c:6997
 #, c-format
 msgid " Flag:               0x%<PRIx8>\n"
 msgstr " Flag:               0x%<PRIx8>\n"
 
-#: src/readelf.c:6355
+#: src/readelf.c:7000
 #, c-format
 msgid " Offset length:      %<PRIu8>\n"
 msgstr " Offset length:      %<PRIu8>\n"
 
-#: src/readelf.c:6363
+#: src/readelf.c:7008
 #, c-format
 msgid " .debug_line offset: 0x%<PRIx64>\n"
 msgstr " .debug_line offset: 0x%<PRIx64>\n"
 
-#: src/readelf.c:6375
+#: src/readelf.c:7021
 #, c-format
 msgid "  extension opcode table, %<PRIu8> items:\n"
 msgstr "  extension opcode table, %<PRIu8> items:\n"
 
-#: src/readelf.c:6382
+#: src/readelf.c:7028
 #, c-format
 msgid "    [%<PRIx8>]"
 msgstr "    [%<PRIx8>]"
 
-#: src/readelf.c:6394
+#: src/readelf.c:7040
 #, c-format
 msgid " %<PRIu8> arguments:"
 msgstr " %<PRIu8> arguments:"
 
-#: src/readelf.c:6422
+#: src/readelf.c:7068
 #, c-format
 msgid " no arguments."
 msgstr " no arguments."
 
-#: src/readelf.c:6657
+#: src/readelf.c:7303
 #, c-format
 msgid "vendor opcode not verified?"
 msgstr "vendor opcode not verified?"
 
-#: src/readelf.c:6685
+#: src/readelf.c:7331
 #, c-format
 msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
 msgstr " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
 
-#: src/readelf.c:6726
+#: src/readelf.c:7372
 #, c-format
 msgid ""
 "\n"
@@ -5458,12 +5659,12 @@ msgstr ""
 "DWARF section [%2zu] ‘%s’ at offset %#<PRIx64>:\n"
 " %*s  String\n"
 
-#: src/readelf.c:6740
+#: src/readelf.c:7386
 #, c-format
 msgid " *** error while reading strings: %s\n"
 msgstr " *** error while reading strings: %s\n"
 
-#: src/readelf.c:6760
+#: src/readelf.c:7406
 #, c-format
 msgid ""
 "\n"
@@ -5472,7 +5673,7 @@ msgstr ""
 "\n"
 "Call frame search table section [%2zu] '.eh_frame_hdr':\n"
 
-#: src/readelf.c:6862
+#: src/readelf.c:7508
 #, c-format
 msgid ""
 "\n"
@@ -5481,22 +5682,22 @@ msgstr ""
 "\n"
 "Exception handling table section [%2zu] '.gcc_except_table':\n"
 
-#: src/readelf.c:6885
+#: src/readelf.c:7531
 #, c-format
 msgid " LPStart encoding:    %#x "
 msgstr " LPStart encoding:    %#x "
 
-#: src/readelf.c:6897
+#: src/readelf.c:7543
 #, c-format
 msgid " TType encoding:      %#x "
 msgstr " TType encoding:      %#x "
 
-#: src/readelf.c:6911
+#: src/readelf.c:7557
 #, c-format
 msgid " Call site encoding:  %#x "
 msgstr " Call site encoding:  %#x "
 
-#: src/readelf.c:6924
+#: src/readelf.c:7570
 msgid ""
 "\n"
 " Call site table:"
@@ -5504,7 +5705,7 @@ msgstr ""
 "\n"
 " Call site table:"
 
-#: src/readelf.c:6938
+#: src/readelf.c:7584
 #, c-format
 msgid ""
 " [%4u] Call site start:   %#<PRIx64>\n"
@@ -5517,12 +5718,12 @@ msgstr ""
 "        Landing pad:       %#<PRIx64>\n"
 "        Action:            %u\n"
 
-#: src/readelf.c:6998
+#: src/readelf.c:7644
 #, c-format
 msgid "invalid TType encoding"
 msgstr "invalid TType encoding"
 
-#: src/readelf.c:7019
+#: src/readelf.c:7665
 #, c-format
 msgid ""
 "\n"
@@ -5531,37 +5732,37 @@ msgstr ""
 "\n"
 "GDB section [%2zu] ‘%s’ at offset %#<PRIx64> contains %<PRId64> bytes :\n"
 
-#: src/readelf.c:7048
+#: src/readelf.c:7694
 #, c-format
 msgid " Version:         %<PRId32>\n"
 msgstr " Version:         %<PRId32>\n"
 
-#: src/readelf.c:7064
+#: src/readelf.c:7712
 #, c-format
 msgid " CU offset:       %#<PRIx32>\n"
 msgstr " CU offset:       %#<PRIx32>\n"
 
-#: src/readelf.c:7071
+#: src/readelf.c:7719
 #, c-format
 msgid " TU offset:       %#<PRIx32>\n"
 msgstr " TU offset:       %#<PRIx32>\n"
 
-#: src/readelf.c:7078
+#: src/readelf.c:7726
 #, c-format
 msgid " address offset:  %#<PRIx32>\n"
 msgstr " address offset:  %#<PRIx32>\n"
 
-#: src/readelf.c:7085
+#: src/readelf.c:7733
 #, c-format
 msgid " symbol offset:   %#<PRIx32>\n"
 msgstr " symbol offset:   %#<PRIx32>\n"
 
-#: src/readelf.c:7092
+#: src/readelf.c:7740
 #, c-format
 msgid " constant offset: %#<PRIx32>\n"
 msgstr " constant offset: %#<PRIx32>\n"
 
-#: src/readelf.c:7099
+#: src/readelf.c:7747
 #, c-format
 msgid ""
 "\n"
@@ -5570,7 +5771,7 @@ msgstr ""
 "\n"
 " CU list at offset %#<PRIx32> contains %zu entries:\n"
 
-#: src/readelf.c:7121
+#: src/readelf.c:7769
 #, c-format
 msgid ""
 "\n"
@@ -5579,7 +5780,7 @@ msgstr ""
 "\n"
 " TU list at offset %#<PRIx32> contains %zu entries:\n"
 
-#: src/readelf.c:7147
+#: src/readelf.c:7795
 #, c-format
 msgid ""
 "\n"
@@ -5588,7 +5789,7 @@ msgstr ""
 "\n"
 " Address list at offset %#<PRIx32> contains %zu entries:\n"
 
-#: src/readelf.c:7174
+#: src/readelf.c:7824
 #, c-format
 msgid ""
 "\n"
@@ -5597,17 +5798,17 @@ msgstr ""
 "\n"
 " Symbol table at offset %#<PRIx32> contains %zu slots:\n"
 
-#: src/readelf.c:7259
+#: src/readelf.c:7909
 #, c-format
 msgid "cannot get debug context descriptor: %s"
 msgstr "cannot get debug context descriptor: %s"
 
-#: src/readelf.c:7409 src/readelf.c:8010
+#: src/readelf.c:8069 src/readelf.c:8675 src/readelf.c:8786 src/readelf.c:8844
 #, c-format
 msgid "cannot convert core note data: %s"
 msgstr "cannot convert core note data: %s"
 
-#: src/readelf.c:7750
+#: src/readelf.c:8416
 #, c-format
 msgid ""
 "\n"
@@ -5616,21 +5817,21 @@ msgstr ""
 "\n"
 "%*s... <repeats %u more times> ..."
 
-#: src/readelf.c:8109
+#: src/readelf.c:8919
 msgid "  Owner          Data size  Type\n"
 msgstr "  Owner          Data size  Type\n"
 
-#: src/readelf.c:8127
+#: src/readelf.c:8937
 #, c-format
 msgid "  %-13.*s  %9<PRId32>  %s\n"
 msgstr "  %-13.*s  %9<PRId32>  %s\n"
 
-#: src/readelf.c:8161
+#: src/readelf.c:8987
 #, c-format
 msgid "cannot get content of note section: %s"
 msgstr "cannot get content of note section: %s"
 
-#: src/readelf.c:8188
+#: src/readelf.c:9014
 #, c-format
 msgid ""
 "\n"
@@ -5639,7 +5840,7 @@ msgstr ""
 "\n"
 "Note section [%2zu] ‘%s’ of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 
-#: src/readelf.c:8211
+#: src/readelf.c:9037
 #, c-format
 msgid ""
 "\n"
@@ -5648,7 +5849,7 @@ msgstr ""
 "\n"
 "Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 
-#: src/readelf.c:8257
+#: src/readelf.c:9083
 #, c-format
 msgid ""
 "\n"
@@ -5657,12 +5858,12 @@ msgstr ""
 "\n"
 "Section [%Zu] ‘%s’ has no data to dump.\n"
 
-#: src/readelf.c:8263 src/readelf.c:8286
+#: src/readelf.c:9089 src/readelf.c:9112
 #, c-format
 msgid "cannot get data for section [%Zu] '%s': %s"
 msgstr "cannot get data for section [%Zu] '%s': %s"
 
-#: src/readelf.c:8267
+#: src/readelf.c:9093
 #, c-format
 msgid ""
 "\n"
@@ -5671,7 +5872,7 @@ msgstr ""
 "\n"
 "Hex dump of section [%Zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 
-#: src/readelf.c:8280
+#: src/readelf.c:9106
 #, c-format
 msgid ""
 "\n"
@@ -5680,7 +5881,7 @@ msgstr ""
 "\n"
 "Section [%Zu] ‘%s’ has no strings to dump.\n"
 
-#: src/readelf.c:8290
+#: src/readelf.c:9116
 #, c-format
 msgid ""
 "\n"
@@ -5689,7 +5890,7 @@ msgstr ""
 "\n"
 "String section [%Zu] ‘%s’ contains %<PRIu64> bytes at offset %#0<PRIx64>:\n"
 
-#: src/readelf.c:8338
+#: src/readelf.c:9164
 #, c-format
 msgid ""
 "\n"
@@ -5698,7 +5899,7 @@ msgstr ""
 "\n"
 "section [%lu] does not exist"
 
-#: src/readelf.c:8367
+#: src/readelf.c:9193
 #, c-format
 msgid ""
 "\n"
@@ -5707,12 +5908,12 @@ msgstr ""
 "\n"
 "section ‘%s’ does not exist"
 
-#: src/readelf.c:8424
+#: src/readelf.c:9250
 #, c-format
 msgid "cannot get symbol index of archive '%s': %s"
 msgstr "cannot get symbol index of archive '%s': %s"
 
-#: src/readelf.c:8427
+#: src/readelf.c:9253
 #, c-format
 msgid ""
 "\n"
@@ -5721,7 +5922,7 @@ msgstr ""
 "\n"
 "Archive ‘%s’ has no symbol index\n"
 
-#: src/readelf.c:8431
+#: src/readelf.c:9257
 #, c-format
 msgid ""
 "\n"
@@ -5730,12 +5931,12 @@ msgstr ""
 "\n"
 "Index of archive ‘%s’ has %Zu entries:\n"
 
-#: src/readelf.c:8449
+#: src/readelf.c:9275
 #, c-format
 msgid "cannot extract member at offset %Zu in '%s': %s"
 msgstr "cannot extract member at offset %Zu in '%s': %s"
 
-#: src/readelf.c:8454
+#: src/readelf.c:9280
 #, c-format
 msgid "Archive member '%s' contains:\n"
 msgstr "Archive member ‘%s’ contains:\n"
@@ -5799,12 +6000,12 @@ msgstr "Invalid radix: %s"
 msgid "%s: file format not recognized"
 msgstr "%s: file format not recognized"
 
-#: src/size.c:438 src/size.c:581
+#: src/size.c:438 src/size.c:571
 #, c-format
 msgid " (ex %s)"
 msgstr " (ex %s)"
 
-#: src/size.c:606
+#: src/size.c:596
 msgid "(TOTALS)\n"
 msgstr "(TOTALS)\n"
 
@@ -5845,27 +6046,27 @@ msgstr "Alias for --radix=o"
 msgid "Print the strings of printable characters in files."
 msgstr "Print the strings of printable characters in files."
 
-#: src/strings.c:260 src/strings.c:295
+#: src/strings.c:267 src/strings.c:302
 #, c-format
 msgid "invalid value '%s' for %s parameter"
 msgstr "invalid value ‘%s’ for %s parameter"
 
-#: src/strings.c:306
+#: src/strings.c:313
 #, c-format
 msgid "invalid minimum length of matched string size"
 msgstr "invalid minimum length of matched string size"
 
-#: src/strings.c:591
+#: src/strings.c:596
 #, c-format
 msgid "lseek64 failed"
 msgstr "lseek64 failed"
 
-#: src/strings.c:608 src/strings.c:672
+#: src/strings.c:613 src/strings.c:677
 #, c-format
 msgid "re-mmap failed"
 msgstr "re-mmap failed"
 
-#: src/strings.c:645
+#: src/strings.c:650
 #, c-format
 msgid "mprotect failed"
 msgstr "mprotect failed"
@@ -5936,7 +6137,7 @@ msgstr "-f option specified twice"
 msgid "-F option specified twice"
 msgstr "-F option specified twice"
 
-#: src/strip.c:249 src/unstrip.c:117
+#: src/strip.c:249 src/unstrip.c:121
 #, c-format
 msgid "-o option specified twice"
 msgstr "-o option specified twice"
@@ -5961,87 +6162,87 @@ msgstr "while opening ‘%s’"
 msgid "%s: cannot use -o or -f when stripping archive"
 msgstr "%s: cannot use -o or -f when stripping archive"
 
-#: src/strip.c:467
+#: src/strip.c:468
 #, c-format
 msgid "cannot open EBL backend"
 msgstr "cannot open EBL backend"
 
-#: src/strip.c:517 src/strip.c:541
+#: src/strip.c:518 src/strip.c:542
 #, c-format
 msgid "cannot create new file '%s': %s"
 msgstr "cannot create new file '%s': %s"
 
-#: src/strip.c:601
+#: src/strip.c:608
 #, c-format
 msgid "illformed file '%s'"
 msgstr "illformed file ‘%s’"
 
-#: src/strip.c:905 src/strip.c:994
+#: src/strip.c:930 src/strip.c:1019
 #, c-format
 msgid "while generating output file: %s"
 msgstr "while generating output file: %s"
 
-#: src/strip.c:967 src/strip.c:1929
+#: src/strip.c:992 src/strip.c:1957
 #, c-format
 msgid "%s: error while creating ELF header: %s"
 msgstr "%s: error while creating ELF header: %s"
 
-#: src/strip.c:981
+#: src/strip.c:1006
 #, c-format
 msgid "while preparing output for '%s'"
 msgstr "while preparing output for ‘%s’"
 
-#: src/strip.c:1032 src/strip.c:1088
+#: src/strip.c:1057 src/strip.c:1114
 #, c-format
 msgid "while create section header section: %s"
 msgstr "while create section header section: %s"
 
-#: src/strip.c:1038
+#: src/strip.c:1063
 #, c-format
 msgid "cannot allocate section data: %s"
 msgstr "cannot allocate section data: %s"
 
-#: src/strip.c:1097
+#: src/strip.c:1123
 #, c-format
 msgid "while create section header string table: %s"
 msgstr "while create section header string table: %s"
 
-#: src/strip.c:1724
+#: src/strip.c:1752
 #, c-format
 msgid "bad relocation"
 msgstr "bad relocation"
 
-#: src/strip.c:1841 src/strip.c:1951
+#: src/strip.c:1869 src/strip.c:1979
 #, c-format
 msgid "while writing '%s': %s"
 msgstr "while writing '%s': %s"
 
-#: src/strip.c:1852
+#: src/strip.c:1880
 #, c-format
 msgid "while creating '%s'"
 msgstr "while creating ‘%s’"
 
-#: src/strip.c:1874
+#: src/strip.c:1902
 #, c-format
 msgid "while computing checksum for debug information"
 msgstr "while computing checksum for debug information"
 
-#: src/strip.c:1937
+#: src/strip.c:1965
 #, c-format
 msgid "%s: error while reading the file: %s"
 msgstr "%s: error while reading the file: %s"
 
-#: src/strip.c:1976 src/strip.c:1996
+#: src/strip.c:2004 src/strip.c:2024
 #, c-format
 msgid "while writing '%s'"
 msgstr "while writing ‘%s’"
 
-#: src/strip.c:2030 src/strip.c:2037
+#: src/strip.c:2061 src/strip.c:2068
 #, c-format
 msgid "error while finishing '%s': %s"
 msgstr "error while finishing '%s': %s"
 
-#: src/strip.c:2060 src/strip.c:2117
+#: src/strip.c:2091 src/strip.c:2148
 #, c-format
 msgid "cannot set access and modification date of '%s'"
 msgstr "cannot set access and modification date of ‘%s’"
@@ -6078,260 +6279,283 @@ msgstr "Apply relocations to section contents in ET_REL files"
 msgid "Only list module and file names, build IDs"
 msgstr "Only list module and file names, build IDs"
 
-#: src/unstrip.c:126
+#: src/unstrip.c:86
+msgid "Force combining files even if some ELF headers don't seem to match"
+msgstr "Force combining files even if some ELF headers don't seem to match"
+
+#: src/unstrip.c:130
 #, c-format
 msgid "-d option specified twice"
 msgstr "-d option specified twice"
 
-#: src/unstrip.c:158
+#: src/unstrip.c:165
 #, c-format
 msgid "only one of -o or -d allowed"
 msgstr "only one of -o or -d allowed"
 
-#: src/unstrip.c:167
+#: src/unstrip.c:174
 #, c-format
 msgid "-n cannot be used with explicit files or -o or -d"
 msgstr "-n cannot be used with explicit files or -o or -d"
 
-#: src/unstrip.c:182
+#: src/unstrip.c:189
 #, c-format
 msgid "output directory '%s'"
 msgstr "output directory ‘%s’"
 
-#: src/unstrip.c:191
+#: src/unstrip.c:198
 #, c-format
 msgid "exactly two file arguments are required"
 msgstr "exactly two file arguments are required"
 
-#: src/unstrip.c:197
+#: src/unstrip.c:204
 #, c-format
 msgid "-m, -a, -R, and -i options not allowed with explicit files"
 msgstr "-m, -a, -R, and -i options not allowed with explicit files"
 
-#: src/unstrip.c:210
+#: src/unstrip.c:217
 #, c-format
 msgid "-o or -d is required when using implicit files"
 msgstr "-o or -d is required when using implicit files"
 
-#: src/unstrip.c:246
+#: src/unstrip.c:253
 #, c-format
 msgid "cannot create ELF header: %s"
 msgstr "cannot create ELF header: %s"
 
-#: src/unstrip.c:251
+#: src/unstrip.c:258
 #, c-format
 msgid "cannot copy ELF header: %s"
 msgstr "cannot copy ELF header: %s"
 
-#: src/unstrip.c:256 src/unstrip.c:1820
+#: src/unstrip.c:263 src/unstrip.c:1828
 #, c-format
 msgid "cannot create program headers: %s"
 msgstr "cannot create program headers: %s"
 
-#: src/unstrip.c:262
+#: src/unstrip.c:269
 #, c-format
 msgid "cannot copy program header: %s"
 msgstr "cannot copy program header: %s"
 
-#: src/unstrip.c:272
+#: src/unstrip.c:279
 #, c-format
 msgid "cannot copy section header: %s"
 msgstr "cannot copy section header: %s"
 
-#: src/unstrip.c:275 src/unstrip.c:1501
+#: src/unstrip.c:282 src/unstrip.c:1509
 #, c-format
 msgid "cannot get section data: %s"
 msgstr "cannot get section data: %s"
 
-#: src/unstrip.c:277 src/unstrip.c:1503
+#: src/unstrip.c:284 src/unstrip.c:1511
 #, c-format
 msgid "cannot copy section data: %s"
 msgstr "cannot copy section data: %s"
 
-#: src/unstrip.c:301
+#: src/unstrip.c:308
 #, c-format
 msgid "cannot create directory '%s'"
 msgstr "cannot create directory ‘%s’"
 
-#: src/unstrip.c:341 src/unstrip.c:758 src/unstrip.c:1535
+#: src/unstrip.c:348 src/unstrip.c:765 src/unstrip.c:1543
 #, c-format
 msgid "cannot get symbol table entry: %s"
 msgstr "cannot get symbol table entry: %s"
 
-#: src/unstrip.c:357 src/unstrip.c:575 src/unstrip.c:596 src/unstrip.c:608
-#: src/unstrip.c:1556 src/unstrip.c:1686 src/unstrip.c:1710
+#: src/unstrip.c:364 src/unstrip.c:582 src/unstrip.c:603 src/unstrip.c:615
+#: src/unstrip.c:1564 src/unstrip.c:1694 src/unstrip.c:1718
 #, c-format
 msgid "cannot update symbol table: %s"
 msgstr "cannot update symbol table: %s"
 
-#: src/unstrip.c:367
+#: src/unstrip.c:374
 #, c-format
 msgid "cannot update section header: %s"
 msgstr "cannot update section header: %s"
 
-#: src/unstrip.c:406 src/unstrip.c:417
+#: src/unstrip.c:413 src/unstrip.c:424
 #, c-format
 msgid "cannot update relocation: %s"
 msgstr "cannot update relocation: %s"
 
-#: src/unstrip.c:504
+#: src/unstrip.c:511
 #, c-format
 msgid "cannot get symbol version: %s"
 msgstr "cannot get symbol version: %s"
 
-#: src/unstrip.c:516
+#: src/unstrip.c:523
 #, c-format
 msgid "unexpected section type in [%Zu] with sh_link to symtab"
 msgstr "unexpected section type in [%Zu] with sh_link to symtab"
 
-#: src/unstrip.c:764
+#: src/unstrip.c:771
 #, c-format
 msgid "invalid string offset in symbol [%Zu]"
 msgstr "invalid string offset in symbol [%Zu]"
 
-#: src/unstrip.c:906 src/unstrip.c:1246
+#: src/unstrip.c:913 src/unstrip.c:1254
 #, c-format
 msgid "cannot read section [%Zu] name: %s"
 msgstr "cannot read section [%Zu] name: %s"
 
-#: src/unstrip.c:947 src/unstrip.c:966 src/unstrip.c:999
+#: src/unstrip.c:954 src/unstrip.c:973 src/unstrip.c:1006
 #, c-format
 msgid "cannot read '.gnu.prelink_undo' section: %s"
 msgstr "cannot read ‘.gnu.prelink_undo’ section: %s"
 
-#: src/unstrip.c:987
+#: src/unstrip.c:994
 #, c-format
 msgid "invalid contents in '%s' section"
 msgstr "invalid contents in ‘%s’ section"
 
-#: src/unstrip.c:1042 src/unstrip.c:1366
+#: src/unstrip.c:1049 src/unstrip.c:1374
 #, c-format
 msgid "cannot find matching section for [%Zu] '%s'"
 msgstr "cannot find matching section for [%Zu] ‘%s’"
 
-#: src/unstrip.c:1166 src/unstrip.c:1181 src/unstrip.c:1447
+#: src/unstrip.c:1174 src/unstrip.c:1189 src/unstrip.c:1455
 #, c-format
 msgid "cannot add section name to string table: %s"
 msgstr "cannot add section name to string table: %s"
 
-#: src/unstrip.c:1190
+#: src/unstrip.c:1198
 #, c-format
 msgid "cannot update section header string table data: %s"
 msgstr "cannot update section header string table data: %s"
 
-#: src/unstrip.c:1217 src/unstrip.c:1221
+#: src/unstrip.c:1225 src/unstrip.c:1229
 #, c-format
 msgid "cannot get section header string table section index: %s"
 msgstr "cannot get section header string table section index: %s"
 
-#: src/unstrip.c:1225 src/unstrip.c:1229 src/unstrip.c:1462
+#: src/unstrip.c:1233 src/unstrip.c:1237 src/unstrip.c:1470
 #, c-format
 msgid "cannot get section count: %s"
 msgstr "cannot get section count: %s"
 
-#: src/unstrip.c:1232
+#: src/unstrip.c:1240
 #, c-format
 msgid "more sections in stripped file than debug file -- arguments reversed?"
 msgstr "more sections in stripped file than debug file -- arguments reversed?"
 
-#: src/unstrip.c:1291 src/unstrip.c:1381
+#: src/unstrip.c:1299 src/unstrip.c:1389
 #, c-format
 msgid "cannot read section header string table: %s"
 msgstr "cannot read section header string table: %s"
 
-#: src/unstrip.c:1441
+#: src/unstrip.c:1449
 #, c-format
 msgid "cannot add new section: %s"
 msgstr "cannot add new section: %s"
 
-#: src/unstrip.c:1543
+#: src/unstrip.c:1551
 #, c-format
 msgid "symbol [%Zu] has invalid section index"
 msgstr "symbol [%Zu] has invalid section index"
 
-#: src/unstrip.c:1781
+#: src/unstrip.c:1789
 #, c-format
 msgid "cannot read section data: %s"
 msgstr "cannot read section data: %s"
 
-#: src/unstrip.c:1802
+#: src/unstrip.c:1810
 #, c-format
 msgid "cannot get ELF header: %s"
 msgstr "cannot get ELF header: %s"
 
-#: src/unstrip.c:1830
+#: src/unstrip.c:1838
 #, c-format
 msgid "cannot update program header: %s"
 msgstr "cannot update program header: %s"
 
-#: src/unstrip.c:1835 src/unstrip.c:1914
+#: src/unstrip.c:1843 src/unstrip.c:1922
 #, c-format
 msgid "cannot write output file: %s"
 msgstr "cannot write output file: %s"
 
-#: src/unstrip.c:1883
+#: src/unstrip.c:1891
 #, c-format
 msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
 msgstr "DWARF data not adjusted for prelinking bias; consider prelink -u"
 
-#: src/unstrip.c:1886
+#: src/unstrip.c:1894
 #, c-format
 msgid ""
 "DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
 msgstr ""
 "DWARF data in ‘%s’ not adjusted for prelinking bias; consider prelink -u"
 
-#: src/unstrip.c:1905 src/unstrip.c:1945 src/unstrip.c:1957 src/unstrip.c:2037
+#: src/unstrip.c:1913 src/unstrip.c:1964 src/unstrip.c:1976 src/unstrip.c:2062
 #, c-format
 msgid "cannot create ELF descriptor: %s"
 msgstr "cannot create ELF descriptor: %s"
 
-#: src/unstrip.c:1963
-#, c-format
-msgid "'%s' and '%s' do not seem to match"
-msgstr "‘%s’ and ‘%s’ do not seem to match"
+#: src/unstrip.c:1955
+msgid "WARNING: "
+msgstr "WARNING: "
+
+#: src/unstrip.c:1957
+msgid ", use --force"
+msgstr ", use --force"
+
+#: src/unstrip.c:1980
+msgid "ELF header identification (e_ident) different"
+msgstr "ELF header identification (e_ident) different"
+
+#: src/unstrip.c:1983
+msgid "ELF header type (e_type) different"
+msgstr "ELF header type (e_type) different"
+
+#: src/unstrip.c:1986
+msgid "ELF header machine type (e_machine) different"
+msgstr "ELF header machine type (e_machine) different"
+
+#: src/unstrip.c:1989
+msgid "stripped program header (e_phnum) smaller than unstripped"
+msgstr "stripped program header (e_phnum) smaller than unstripped"
 
-#: src/unstrip.c:1994
+#: src/unstrip.c:2019
 #, c-format
 msgid "cannot find stripped file for module '%s': %s"
 msgstr "cannot find stripped file for module '%s': %s"
 
-#: src/unstrip.c:1998
+#: src/unstrip.c:2023
 #, c-format
 msgid "cannot open stripped file '%s' for module '%s': %s"
 msgstr "cannot open stripped file ‘%s’ for module '%s': %s"
 
-#: src/unstrip.c:2013
+#: src/unstrip.c:2038
 #, c-format
 msgid "cannot find debug file for module '%s': %s"
 msgstr "cannot find debug file for module '%s': %s"
 
-#: src/unstrip.c:2017
+#: src/unstrip.c:2042
 #, c-format
 msgid "cannot open debug file '%s' for module '%s': %s"
 msgstr "cannot open debug file ‘%s’ for module '%s': %s"
 
-#: src/unstrip.c:2030
+#: src/unstrip.c:2055
 #, c-format
 msgid "module '%s' file '%s' is not stripped"
 msgstr "module ‘%s’ file ‘%s’ is not stripped"
 
-#: src/unstrip.c:2061
+#: src/unstrip.c:2086
 #, c-format
 msgid "cannot cache section addresses for module '%s': %s"
 msgstr "cannot cache section addresses for module '%s': %s"
 
-#: src/unstrip.c:2194
+#: src/unstrip.c:2219
 #, c-format
 msgid "no matching modules found"
 msgstr "no matching modules found"
 
-#: src/unstrip.c:2203
+#: src/unstrip.c:2228
 #, c-format
 msgid "matched more than one module"
 msgstr "matched more than one module"
 
-#: src/unstrip.c:2250
+#: src/unstrip.c:2275
 msgid ""
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
@@ -6339,7 +6563,7 @@ msgstr ""
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
 
-#: src/unstrip.c:2251
+#: src/unstrip.c:2276
 msgid ""
 "Combine stripped files with separate symbols and debug information.\vThe "
 "first form puts the result in DEBUG-FILE if -o was not given.\n"
index 8ae7f9c..1485c39 100644 (file)
Binary files a/po/es.gmo and b/po/es.gmo differ
index 3286e90..84ba76a 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -10,12 +10,12 @@ msgid ""
 msgstr ""
 "Project-Id-Version: elfutils.master.es\n"
 "Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
-"POT-Creation-Date: 2012-08-27 20:34+0200\n"
+"POT-Creation-Date: 2014-08-27 11:26+0200\n"
 "PO-Revision-Date: 2011-01-10 15:17-0300\n"
 "Last-Translator: Claudio Rodrigo Pereyra Diaz <claudiorodrigo@pereyradiaz."
 "com.ar>\n"
 "Language-Team: Fedora Spanish <trans-es@lists.fedoraproject.org>\n"
-"Language: \n"
+"Language: es\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -24,18 +24,18 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Poedit-Country: ARGENTINA\n"
 
-#: lib/xmalloc.c:54 lib/xmalloc.c:68 lib/xmalloc.c:82 src/readelf.c:2842
-#: src/readelf.c:3181 src/unstrip.c:2090 src/unstrip.c:2298
+#: lib/xmalloc.c:54 lib/xmalloc.c:68 lib/xmalloc.c:82 src/readelf.c:3098
+#: src/readelf.c:3447 src/readelf.c:8018 src/unstrip.c:2115 src/unstrip.c:2323
 #, c-format
 msgid "memory exhausted"
 msgstr "memoria agotada"
 
-#: libasm/asm_error.c:65 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:49
+#: libasm/asm_error.c:65 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:53
 #: 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:51
+#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:55
 #: libelf/elf_error.c:91
 msgid "out of memory"
 msgstr "memoria agotada"
@@ -74,7 +74,7 @@ msgstr "error durante salida de datos"
 msgid "no backend support available"
 msgstr "No hay soporte de segundo plano"
 
-#: libasm/asm_error.c:84 libdw/dwarf_error.c:59 libdwfl/libdwflP.h:50
+#: libasm/asm_error.c:84 libdw/dwarf_error.c:59 libdwfl/libdwflP.h:54
 #: libelf/elf_error.c:63
 msgid "unknown error"
 msgstr "error desconocido"
@@ -171,7 +171,7 @@ msgstr "versión DWARF inválida"
 msgid "invalid directory index"
 msgstr "Índice de directorio inválido"
 
-#: libdw/dwarf_error.c:84 libdwfl/libdwflP.h:70
+#: libdw/dwarf_error.c:84 libdwfl/libdwflP.h:74
 msgid "address out of range"
 msgstr "dirección fuera de rango"
 
@@ -191,7 +191,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:89 libdwfl/libdwflP.h:71
+#: libdw/dwarf_error.c:89 libdwfl/libdwflP.h:75
 msgid "no matching address range"
 msgstr "dirección de rango no coincidente"
 
@@ -215,7 +215,7 @@ msgstr "sección CFI inválida"
 msgid "no alternative debug link found"
 msgstr ""
 
-#: libdwfl/argp-std.c:46 src/unstrip.c:2240
+#: libdwfl/argp-std.c:46 src/unstrip.c:2265
 msgid "Input selection options:"
 msgstr "Opciones de selección de entrada:"
 
@@ -251,133 +251,193 @@ msgstr "Kernel con todos los módulos"
 msgid "Search path for separate debuginfo files"
 msgstr "Ruta de búsqueda para archivos debugingfo independientes"
 
-#: libdwfl/argp-std.c:142
+#: libdwfl/argp-std.c:157
 msgid "only one of -e, -p, -k, -K, or --core allowed"
 msgstr "Sólo uno de -e, -p, -k, -K, ó --core está permitido"
 
-#: libdwfl/argp-std.c:202
-#, c-format
-msgid "cannot read ELF core file: %s"
-msgstr "No se puede leer archivo core ELF: %s"
-
-#: libdwfl/argp-std.c:220
-msgid "No modules recognized in core file"
-msgstr "No hay módulos reconocidos en el archivo core"
-
-#: libdwfl/argp-std.c:232
+#: libdwfl/argp-std.c:230
 msgid "cannot load kernel symbols"
 msgstr "No se pueden cargar símbolos de kernel"
 
-#: libdwfl/argp-std.c:236
+#: libdwfl/argp-std.c:234
 msgid "cannot find kernel modules"
 msgstr "no se pueden hallar módulos de kernel"
 
-#: libdwfl/argp-std.c:250
+#: libdwfl/argp-std.c:251
 msgid "cannot find kernel or modules"
 msgstr "imposible encontrar kernel o módulos"
 
-#: libdwfl/libdwflP.h:52
+#: libdwfl/argp-std.c:290
+#, c-format
+msgid "cannot read ELF core file: %s"
+msgstr "No se puede leer archivo core ELF: %s"
+
+#: libdwfl/argp-std.c:311
+msgid "No modules recognized in core file"
+msgstr "No hay módulos reconocidos en el archivo core"
+
+#: libdwfl/libdwflP.h:56
 msgid "See errno"
 msgstr "Ve errno"
 
-#: libdwfl/libdwflP.h:53
+#: libdwfl/libdwflP.h:57
 msgid "See elf_errno"
 msgstr "Ver elf_errno"
 
-#: libdwfl/libdwflP.h:54
+#: libdwfl/libdwflP.h:58
 msgid "See dwarf_errno"
 msgstr "Ver dwarf_errno"
 
-#: libdwfl/libdwflP.h:55
+#: libdwfl/libdwflP.h:59
 msgid "See ebl_errno (XXX missing)"
 msgstr "Ver ebl_errno (no se encuentra XXX)"
 
-#: libdwfl/libdwflP.h:56
+#: libdwfl/libdwflP.h:60
 msgid "gzip decompression failed"
 msgstr "falló la descompresión gzip"
 
-#: libdwfl/libdwflP.h:57
+#: libdwfl/libdwflP.h:61
 msgid "bzip2 decompression failed"
 msgstr "falló la descompresión bzip2"
 
-#: libdwfl/libdwflP.h:58
+#: libdwfl/libdwflP.h:62
 msgid "LZMA decompression failed"
 msgstr "falló la descompresión LZMA"
 
-#: libdwfl/libdwflP.h:59
+#: libdwfl/libdwflP.h:63
 msgid "no support library found for machine"
 msgstr "no se ha encontrado una biblioteca de soporte para la máquina"
 
-#: libdwfl/libdwflP.h:60
+#: libdwfl/libdwflP.h:64
 msgid "Callbacks missing for ET_REL file"
 msgstr "No se encuentran rellamadas para el archivo ET_REL"
 
-#: libdwfl/libdwflP.h:61
+#: libdwfl/libdwflP.h:65
 msgid "Unsupported relocation type"
 msgstr "Tipo de reubicación no soportada"
 
-#: libdwfl/libdwflP.h:62
+#: libdwfl/libdwflP.h:66
 msgid "r_offset is bogus"
 msgstr "r_offset se encuentra inutilizable"
 
-#: libdwfl/libdwflP.h:63 libelf/elf_error.c:111 libelf/elf_error.c:171
+#: libdwfl/libdwflP.h:67 libelf/elf_error.c:111 libelf/elf_error.c:171
 msgid "offset out of range"
 msgstr "desplazamiento fuera de rango"
 
-#: libdwfl/libdwflP.h:64
+#: libdwfl/libdwflP.h:68
 msgid "relocation refers to undefined symbol"
 msgstr "la reubicación hace referencia a un símbolo no definido"
 
-#: libdwfl/libdwflP.h:65
+#: libdwfl/libdwflP.h:69
 msgid "Callback returned failure"
 msgstr "La rellamada devolvió un fallo"
 
-#: libdwfl/libdwflP.h:66
+#: libdwfl/libdwflP.h:70
 msgid "No DWARF information found"
 msgstr "No se ha encontrado una información DWARF"
 
-#: libdwfl/libdwflP.h:67
+#: libdwfl/libdwflP.h:71
 msgid "No symbol table found"
 msgstr "No se ha encontrado una tabla simbólica"
 
-#: libdwfl/libdwflP.h:68
+#: libdwfl/libdwflP.h:72
 msgid "No ELF program headers"
 msgstr "No existen encabezados de programa ELF"
 
-#: libdwfl/libdwflP.h:69
+#: libdwfl/libdwflP.h:73
 msgid "address range overlaps an existing module"
 msgstr "el rango de dirección se superpone con un módulo existente"
 
-#: libdwfl/libdwflP.h:72
+#: libdwfl/libdwflP.h:76
 msgid "image truncated"
 msgstr "imagen truncada"
 
-#: libdwfl/libdwflP.h:73
+#: libdwfl/libdwflP.h:77
 msgid "ELF file opened"
 msgstr "Archivo ELF abierto"
 
-#: libdwfl/libdwflP.h:74
+#: libdwfl/libdwflP.h:78
 msgid "not a valid ELF file"
 msgstr "no es un archivo ELF válido"
 
-#: libdwfl/libdwflP.h:75
+#: libdwfl/libdwflP.h:79
 msgid "cannot handle DWARF type description"
 msgstr "no es posible manipular tipo de descripción DWARF"
 
-#: libdwfl/libdwflP.h:76
+#: libdwfl/libdwflP.h:80
 msgid "ELF file does not match build ID"
 msgstr "El archivo ELF no coincide con el ID construido"
 
-#: libdwfl/libdwflP.h:77
+#: libdwfl/libdwflP.h:81
 #, fuzzy
 msgid "corrupt .gnu.prelink_undo section data"
 msgstr "no se puede leer sección '.gnu.prelink_undo': %s"
 
+#: libdwfl/libdwflP.h:82
+msgid "Internal error due to ebl"
+msgstr ""
+
+#: libdwfl/libdwflP.h:83
+msgid "Missing data in core file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:84
+#, fuzzy
+msgid "Invalid register"
+msgstr "Parámetro inválido"
+
+#: libdwfl/libdwflP.h:85
+msgid "Error reading process memory"
+msgstr ""
+
+#: libdwfl/libdwflP.h:86
+msgid "Couldn't find architecture of any ELF"
+msgstr ""
+
+#: libdwfl/libdwflP.h:87
+msgid "Error parsing /proc filesystem"
+msgstr ""
+
+#: libdwfl/libdwflP.h:88
+#, fuzzy
+msgid "Invalid DWARF"
+msgstr "DWARF inválido"
+
+#: libdwfl/libdwflP.h:89
+msgid "Unsupported DWARF"
+msgstr ""
+
+#: libdwfl/libdwflP.h:90
+msgid "Unable to find more threads"
+msgstr ""
+
+#: libdwfl/libdwflP.h:91
+msgid "Dwfl already has attached state"
+msgstr ""
+
+#: libdwfl/libdwflP.h:92
+msgid "Dwfl has no attached state"
+msgstr ""
+
+#: libdwfl/libdwflP.h:93
+msgid "Unwinding not supported for this architecture"
+msgstr ""
+
+#: libdwfl/libdwflP.h:94
+#, fuzzy
+msgid "Invalid argument"
+msgstr "Parámetro inválido"
+
+#: libdwfl/libdwflP.h:95
+#, fuzzy
+msgid "Not an ET_CORE ELF file"
+msgstr "no es un archivo ELF válido"
+
 #: libebl/eblbackendname.c:42
 msgid "No backend"
 msgstr "No hay segundo plano (Backend)"
 
-#: libebl/eblcorenotetypename.c:86 libebl/eblobjecttypename.c:57
+#: libebl/eblcorenotetypename.c:102 libebl/eblobjecttypename.c:57
 #: libebl/eblobjnotetypename.c:73 libebl/eblosabiname.c:77
 #: libebl/eblsectionname.c:89 libebl/eblsectiontypename.c:119
 #: libebl/eblsegmenttypename.c:83
@@ -473,7 +533,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:4697
+#: libelf/elf_error.c:87 src/readelf.c:5190
 #, c-format
 msgid "invalid encoding"
 msgstr "codificación inválida"
@@ -554,8 +614,8 @@ msgstr "no coinciden los datos/scn"
 msgid "invalid section header"
 msgstr "encabezamiento de sección inválida"
 
-#: libelf/elf_error.c:187 src/readelf.c:6335 src/readelf.c:6780
-#: src/readelf.c:6881 src/readelf.c:7043
+#: libelf/elf_error.c:187 src/readelf.c:6980 src/readelf.c:7426
+#: src/readelf.c:7527 src/readelf.c:7689
 #, c-format
 msgid "invalid data"
 msgstr "datos inválidos"
@@ -621,33 +681,44 @@ msgid "Also show symbol or section names"
 msgstr "También mostrar símbolo o nombres de sección"
 
 #: src/addr2line.c:64
+#, fuzzy
+msgid "Also show symbol and the section names"
+msgstr "También mostrar símbolo o nombres de sección"
+
+#: src/addr2line.c:65
 msgid "Also show line table flags"
 msgstr "También mostrar marcas de líneas de tabla"
 
-#: src/addr2line.c:66
+#: src/addr2line.c:67
 msgid "Treat addresses as offsets relative to NAME section."
 msgstr "Manejar direcciones como compensaciones relativas a sección de NOMBRE."
 
-#: src/addr2line.c:68 src/elfcmp.c:72 src/findtextrel.c:67 src/nm.c:100
+#: src/addr2line.c:69
+msgid ""
+"Show all source locations that caused inline expansion of subroutines at the "
+"address."
+msgstr ""
+
+#: src/addr2line.c:72 src/elfcmp.c:72 src/findtextrel.c:67 src/nm.c:100
 #: src/strings.c:75
 msgid "Miscellaneous:"
 msgstr "Misceláneos:"
 
-#: src/addr2line.c:77
+#: src/addr2line.c:81
 msgid ""
 "Locate source files and line information for ADDRs (in a.out by default)."
 msgstr ""
 "Localizar archivos fuente e información de línea para DIRECCIONES (en a.out "
 "por defecto)."
 
-#: src/addr2line.c:81
+#: src/addr2line.c:85
 msgid "[ADDR...]"
 msgstr "[DIREC...]"
 
-#: src/addr2line.c:181 src/ar.c:289 src/elfcmp.c:662 src/elflint.c:231
+#: src/addr2line.c:196 src/ar.c:289 src/elfcmp.c:662 src/elflint.c:235
 #: src/findtextrel.c:162 src/ld.c:949 src/nm.c:265 src/objdump.c:181
-#: src/ranlib.c:128 src/readelf.c:460 src/size.c:211 src/strings.c:219
-#: src/strip.c:213 src/unstrip.c:226
+#: src/ranlib.c:128 src/readelf.c:500 src/size.c:211 src/strings.c:226
+#: src/strip.c:213 src/unstrip.c:233
 #, c-format
 msgid ""
 "Copyright (C) %s Red Hat, Inc.\n"
@@ -660,30 +731,30 @@ msgstr ""
 "garantía, ni siquiera para SU COMERCIALIZACIÓN o PARA SER USADO CON UN FIN "
 "DETERMINADO.\n"
 
-#: src/addr2line.c:186 src/ar.c:294 src/elfcmp.c:667 src/elflint.c:236
+#: src/addr2line.c:201 src/ar.c:294 src/elfcmp.c:667 src/elflint.c:240
 #: src/findtextrel.c:167 src/ld.c:954 src/nm.c:270 src/objdump.c:186
-#: src/ranlib.c:133 src/readelf.c:465 src/size.c:216 src/strings.c:224
-#: src/strip.c:218 src/unstrip.c:231
+#: src/ranlib.c:133 src/readelf.c:505 src/size.c:216 src/strings.c:231
+#: src/strip.c:218 src/unstrip.c:238
 #, c-format
 msgid "Written by %s.\n"
 msgstr "Escrito por %s.\n"
 
-#: src/addr2line.c:405
+#: src/addr2line.c:474
 #, c-format
 msgid "Section syntax requires exactly one module"
 msgstr "Sintaxis de sección requiere exactamente un módulo"
 
-#: src/addr2line.c:428
+#: src/addr2line.c:497
 #, c-format
 msgid "offset %#<PRIxMAX> lies outside section '%s'"
 msgstr "Compensación %#<PRIxMAX> se encuentra fuera de sección '%s'"
 
-#: src/addr2line.c:469
+#: src/addr2line.c:563
 #, c-format
 msgid "cannot find symbol '%s'"
 msgstr "no se puede encontrar símbolo '%s'"
 
-#: src/addr2line.c:474
+#: src/addr2line.c:568
 #, c-format
 msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
 msgstr "compensación %#<PRIxMAX> se encuentra fuera de contenido de '%s'"
@@ -1123,8 +1194,8 @@ msgstr "Valor inválido '%s' para parámetro --gaps"
 
 #: src/elfcmp.c:722 src/findtextrel.c:221 src/ldgeneric.c:1757
 #: src/ldgeneric.c:4247 src/nm.c:381 src/ranlib.c:161 src/size.c:293
-#: src/strings.c:175 src/strip.c:450 src/strip.c:487 src/unstrip.c:1903
-#: src/unstrip.c:1932
+#: src/strings.c:182 src/strip.c:451 src/strip.c:488 src/unstrip.c:1911
+#: src/unstrip.c:1940
 #, c-format
 msgid "cannot open '%s'"
 msgstr "Imposible abrir '%s'"
@@ -1178,163 +1249,163 @@ 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:78 src/readelf.c:113
+#: src/elflint.c:78 src/readelf.c:123
 msgid "FILE..."
 msgstr "FICHERO..."
 
-#: src/elflint.c:151 src/readelf.c:271
+#: src/elflint.c:155 src/readelf.c:292
 #, c-format
 msgid "cannot open input file"
 msgstr "no se puede abrir el fichero de entrada"
 
-#: src/elflint.c:158
+#: src/elflint.c:162
 #, c-format
 msgid "cannot generate Elf descriptor: %s\n"
 msgstr "no se puede crear descriptor ELF: %s\n"
 
-#: src/elflint.c:177
+#: src/elflint.c:181
 #, c-format
 msgid "error while closing Elf descriptor: %s\n"
 msgstr "error al cerrar el descriptor ELF: %s\n"
 
-#: src/elflint.c:181
+#: src/elflint.c:185
 msgid "No errors"
 msgstr "No hay errores"
 
-#: src/elflint.c:215 src/readelf.c:434
+#: src/elflint.c:219 src/readelf.c:468
 msgid "Missing file name.\n"
 msgstr "Falta el nombre de archivo.\n"
 
-#: src/elflint.c:294
+#: src/elflint.c:298
 #, c-format
 msgid " error while freeing sub-ELF descriptor: %s\n"
 msgstr " error al liberar descriptor sub-ELF: %s\n"
 
-#: src/elflint.c:302
+#: src/elflint.c:306
 #, c-format
 msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
 msgstr "No es un fichero ELF - tiene los bytes mágicos errados en el inicio\n"
 
-#: src/elflint.c:363
+#: src/elflint.c:371
 #, c-format
 msgid "e_ident[%d] == %d is no known class\n"
 msgstr "e_ident[%d] == %d es una clase desconocida\n"
 
-#: src/elflint.c:368
+#: src/elflint.c:376
 #, c-format
 msgid "e_ident[%d] == %d is no known data encoding\n"
 msgstr "e_ident[%d] == %d es una codificación de datos desconocida\n"
 
-#: src/elflint.c:372
+#: src/elflint.c:380
 #, c-format
 msgid "unknown ELF header version number e_ident[%d] == %d\n"
 msgstr ""
 "número de versión de encabezamiento ELF desconocido e_ident[%d] == %d\n"
 
-#: src/elflint.c:378
+#: src/elflint.c:386
 #, c-format
 msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
 msgstr "Sistema operativo OS ABI e_ident[%d] == '%s' incompatible\n"
 
-#: src/elflint.c:384
+#: src/elflint.c:392
 #, c-format
 msgid "unsupport ABI version e_ident[%d] == %d\n"
 msgstr "Versión incompatible ABI e_ident[%d] == %d\n"
 
-#: src/elflint.c:389
+#: src/elflint.c:397
 #, c-format
 msgid "e_ident[%zu] is not zero\n"
 msgstr "e_ident[%zu] no es cero\n"
 
-#: src/elflint.c:394
+#: src/elflint.c:402
 #, c-format
 msgid "unknown object file type %d\n"
 msgstr "tipo de fichero objeto desconocido %d\n"
 
-#: src/elflint.c:401
+#: src/elflint.c:409
 #, c-format
 msgid "unknown machine type %d\n"
 msgstr "tipo de máquina desconocido %d\n"
 
-#: src/elflint.c:405
+#: src/elflint.c:413
 #, c-format
 msgid "unknown object file version\n"
 msgstr "versión de fichero objeto desconocido\n"
 
-#: src/elflint.c:411
+#: src/elflint.c:419
 #, c-format
 msgid "invalid program header offset\n"
 msgstr "Compensación de encabezamiento de programa inválida\n"
 
-#: src/elflint.c:413
+#: src/elflint.c:421
 #, c-format
 msgid "executables and DSOs cannot have zero program header offset\n"
 msgstr ""
 "tanto los ejecutables como los DSO no pueden tener compensación de "
 "encabezamiento de programa cero\n"
 
-#: src/elflint.c:417
+#: src/elflint.c:425
 #, c-format
 msgid "invalid number of program header entries\n"
 msgstr "cantidad no válida de entradas del encabezamiento del programa\n"
 
-#: src/elflint.c:425
+#: src/elflint.c:433
 #, c-format
 msgid "invalid section header table offset\n"
 msgstr "compensación de sección de tabla de encabezamiento inválida\n"
 
-#: src/elflint.c:428
+#: src/elflint.c:436
 #, c-format
 msgid "section header table must be present\n"
 msgstr "tabla de encabezamiento de sección debe estar presente\n"
 
-#: src/elflint.c:442
+#: src/elflint.c:450
 #, c-format
 msgid "invalid number of section header table entries\n"
 msgstr ""
 "cantidad no válida de entradas en la tabla del encabezamiento de sección\n"
 
-#: src/elflint.c:459
+#: src/elflint.c:467
 #, c-format
 msgid "invalid section header index\n"
 msgstr "Índice de sección de encabezamiento inválido\n"
 
-#: src/elflint.c:473
+#: src/elflint.c:481
 #, c-format
 msgid "invalid number of program header table entries\n"
 msgstr "cantidad no válida de entradas de tabla de encabezado del programa\n"
 
-#: src/elflint.c:482
+#: src/elflint.c:490
 #, c-format
 msgid "invalid machine flags: %s\n"
 msgstr "Indicadores de máquina inválidos: %s\n"
 
-#: src/elflint.c:489 src/elflint.c:506
+#: src/elflint.c:497 src/elflint.c:514
 #, c-format
 msgid "invalid ELF header size: %hd\n"
 msgstr "tamaño inválido del encabezamiento ELF: %hd\n"
 
-#: src/elflint.c:492 src/elflint.c:509
+#: src/elflint.c:500 src/elflint.c:517
 #, c-format
 msgid "invalid program header size: %hd\n"
 msgstr "tamaño inválido del encabezamiento del programa: %hd\n"
 
-#: src/elflint.c:495 src/elflint.c:512
+#: src/elflint.c:503 src/elflint.c:520
 #, c-format
 msgid "invalid program header position or size\n"
 msgstr "tamaño o posición inválidos del encabezamiento del programa\n"
 
-#: src/elflint.c:498 src/elflint.c:515
+#: src/elflint.c:506 src/elflint.c:523
 #, c-format
 msgid "invalid section header size: %hd\n"
 msgstr "tamaño inválido del encabezamiento de sección: %hd\n"
 
-#: src/elflint.c:501 src/elflint.c:518
+#: src/elflint.c:509 src/elflint.c:526
 #, c-format
 msgid "invalid section header position or size\n"
 msgstr "tamaño o posición no válidos del encabezamiento de sección\n"
 
-#: src/elflint.c:562
+#: src/elflint.c:570
 #, c-format
 msgid ""
 "section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
@@ -1343,7 +1414,7 @@ msgstr ""
 "sección [%2d] '%s': sección con la bandera SHF_GROUP no es parte de una "
 "sección de grupo\n"
 
-#: src/elflint.c:566
+#: src/elflint.c:574
 #, c-format
 msgid ""
 "section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
@@ -1351,14 +1422,14 @@ msgstr ""
 "sección [%2d] '%s': el grupo de sección [%2zu] '%s' no precede al miembro de "
 "grupo\n"
 
-#: src/elflint.c:582 src/elflint.c:1426 src/elflint.c:1476 src/elflint.c:1581
-#: src/elflint.c:2166 src/elflint.c:2680 src/elflint.c:2841 src/elflint.c:2971
-#: src/elflint.c:3143 src/elflint.c:4045
+#: src/elflint.c:590 src/elflint.c:1457 src/elflint.c:1508 src/elflint.c:1614
+#: src/elflint.c:1939 src/elflint.c:2228 src/elflint.c:2742 src/elflint.c:2904
+#: src/elflint.c:3034 src/elflint.c:3206 src/elflint.c:4108
 #, c-format
 msgid "section [%2d] '%s': cannot get section data\n"
 msgstr "Sección [%2d] '%s': No se pueden obtener datos de sección\n"
 
-#: src/elflint.c:595 src/elflint.c:1588
+#: src/elflint.c:603 src/elflint.c:1621
 #, c-format
 msgid ""
 "section [%2d] '%s': referenced as string table for section [%2d] '%s' but "
@@ -1367,7 +1438,7 @@ msgstr ""
 "sección [%2d] '%s': nombrado como una tabla de cadena para la sección [%2d] "
 "'%s' pero el tipo no es SHT_STRTAB\n"
 
-#: src/elflint.c:618
+#: src/elflint.c:626
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol table cannot have more than one extended index "
@@ -1376,39 +1447,39 @@ msgstr ""
 "sección [%2d] '%s': la tabla de símbolo no puede tener más de una sección de "
 "índice extendido\n"
 
-#: src/elflint.c:629
+#: src/elflint.c:638
 #, c-format
 msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
 msgstr ""
 "sección [%2u] '%s': el tamaño de la entrada no coincide con ElfXX_Sym\n"
 
-#: src/elflint.c:638
+#: src/elflint.c:647
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
 msgstr "Sección [%2d] '%s': no se puede obtener símbolo %d: %s\n"
 
-#: src/elflint.c:643 src/elflint.c:646 src/elflint.c:649 src/elflint.c:652
-#: src/elflint.c:655 src/elflint.c:658
+#: src/elflint.c:652 src/elflint.c:655 src/elflint.c:658 src/elflint.c:661
+#: src/elflint.c:664 src/elflint.c:667
 #, c-format
 msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
 msgstr "Sección [%2d] '%s': '%s' en la entrada zeroth no es cero\n"
 
-#: src/elflint.c:661
+#: src/elflint.c:670
 #, c-format
 msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
 msgstr "sección [%2d] '%s': XINDEX en la entrada zeroth no es cero\n"
 
-#: src/elflint.c:671
+#: src/elflint.c:680
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
 msgstr "sección [%2d] '%s': no es posible obtener el símbolo %zu: %s\n"
 
-#: src/elflint.c:680
+#: src/elflint.c:689
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
 msgstr "sección [%2d] '%s': símbolo %zu: valor de nombre inválido\n"
 
-#: src/elflint.c:694
+#: src/elflint.c:704
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: too large section index but no extended "
@@ -1417,7 +1488,7 @@ msgstr ""
 "Sección [%2d] '%s': símbolo %zu: el índice de sección es demasiado extenso, "
 "pero no la sección extendida de la sección de índice\n"
 
-#: src/elflint.c:700
+#: src/elflint.c:710
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
@@ -1426,27 +1497,27 @@ msgstr ""
 "Sección [%2d] '%s': símbolo %zu: XINDEX es utilizado para índice que pueda "
 "caber en st_shndx (%<PRIu32>)\n"
 
-#: src/elflint.c:712
+#: src/elflint.c:722
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
 msgstr "sección [%2d] '%s': símbolo %zu: índice de sección inválido\n"
 
-#: src/elflint.c:720
+#: src/elflint.c:730
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown type\n"
 msgstr "sección [%2d] '%s': símbolo %zu: tipo desconocido\n"
 
-#: src/elflint.c:726
+#: src/elflint.c:736
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
 msgstr "sección [%2d] '%s': símbolo %zu: asociación de símbolo desconocida\n"
 
-#: src/elflint.c:731
+#: src/elflint.c:741
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
 msgstr "Sección [%2d] '%s': símbolo %zu: símbolo único no de tipo de objeto\n"
 
-#: src/elflint.c:739
+#: src/elflint.c:749
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
@@ -1454,25 +1525,25 @@ msgstr ""
 "sección [%2d] '%s': símbolo %zu: COMMON solo es permitido en archivos "
 "realojables\n"
 
-#: src/elflint.c:743
+#: src/elflint.c:753
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
 msgstr ""
 "Sección [%2d] '%s': símbolo %zu: símbolos locales COMMON no tienen sentido\n"
 
-#: src/elflint.c:747
+#: src/elflint.c:757
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
 msgstr ""
 "Sección [%2d] '%s': símbolo %zu: función en sección COMMON no tiene sentido\n"
 
-#: src/elflint.c:779
+#: src/elflint.c:804
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
 msgstr "sección [%2d] '%s': símbolo %zu: st_value fuera de límites\n"
 
-#: src/elflint.c:785 src/elflint.c:810 src/elflint.c:853
+#: src/elflint.c:810 src/elflint.c:835 src/elflint.c:878
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu does not fit completely in referenced section "
@@ -1481,7 +1552,7 @@ msgstr ""
 "Sección [%2d] '%s': símbolo %zu no se ajusta totalmente en la sección [%2d] "
 "'%s'\n"
 
-#: src/elflint.c:794
+#: src/elflint.c:819
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
@@ -1490,7 +1561,7 @@ msgstr ""
 "Sección [%2d] '%s': símbolo %zu: sección de referencia [%2d] '%s' no tiene "
 "establecida bandera SHF_TLS\n"
 
-#: src/elflint.c:804 src/elflint.c:846
+#: src/elflint.c:829 src/elflint.c:871
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
@@ -1499,7 +1570,7 @@ msgstr ""
 "Sección [%2d] '%s': símbolo %zu: st_value fuera de límites de sección de "
 "referencia [%2d] '%s'\n"
 
-#: src/elflint.c:831
+#: src/elflint.c:856
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
@@ -1507,7 +1578,7 @@ msgstr ""
 "Sección [%2d] '%s': símbolo %zu: símbolo TLS, pero no hay entrada de "
 "programa TLS\n"
 
-#: src/elflint.c:839
+#: src/elflint.c:864
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] "
@@ -1516,7 +1587,7 @@ msgstr ""
 "Sección [%2d] '%s': símbolo %zu: st_value falta sección de referencia [%2d] "
 "'%s'\n"
 
-#: src/elflint.c:866
+#: src/elflint.c:891
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: local symbol outside range described in "
@@ -1525,7 +1596,7 @@ msgstr ""
 "Sección [%2d] '%s': símbolo %zu: símbolo local fuera del rango descrito en "
 "sh_info\n"
 
-#: src/elflint.c:873
+#: src/elflint.c:898
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
@@ -1534,12 +1605,12 @@ msgstr ""
 "Sección [%2d] '%s': símbolo %zu: símbolo non-local fuera del rango descrito "
 "en sh_info\n"
 
-#: src/elflint.c:880
+#: src/elflint.c:905
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
 msgstr "Sección [%2d] '%s': símbolo %zu: símbolo de sección non-local\n"
 
-#: src/elflint.c:930
+#: src/elflint.c:955
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section "
@@ -1548,7 +1619,7 @@ msgstr ""
 "Sección [%2d] '%s': símbolo _GLOBAL_OFFSET_TABLE_ se refiere a sección "
 "errada [%2d]\n"
 
-#: src/elflint.c:937
+#: src/elflint.c:962
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] "
@@ -1557,7 +1628,7 @@ msgstr ""
 "Sección [%2d] '%s': símbolo _GLOBAL_OFFSET_TABLE_ se refiere a sección [%2d] "
 "'%s'\n"
 
-#: src/elflint.c:953
+#: src/elflint.c:978
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
@@ -1566,7 +1637,7 @@ msgstr ""
 "Sección [%2d] '%s': valor del símbolo _GLOBAL_OFFSET_TABLE_ %#<PRIx64> no "
 "coincide con dirección de sección %s %#<PRIx64>\n"
 
-#: src/elflint.c:960
+#: src/elflint.c:985
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
@@ -1575,7 +1646,7 @@ msgstr ""
 "Sección [%2d] '%s': tamaño de símbolo _GLOBAL_OFFSET_TABLE_ %<PRIu64> no "
 "coincide con tamaño de sección %s %<PRIu64>\n"
 
-#: src/elflint.c:968
+#: src/elflint.c:993
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
@@ -1584,7 +1655,7 @@ msgstr ""
 "Sección [%2d] '%s': símbolo _GLOBAL_OFFSET_TABLE_ presente, pero no. sección "
 "got\n"
 
-#: src/elflint.c:984
+#: src/elflint.c:1009
 #, c-format
 msgid ""
 "section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
@@ -1593,7 +1664,7 @@ msgstr ""
 "sección [%2d] '%s': Valor de símbolo _DYNAMIC_ %#<PRIx64> no coincide con la "
 "dirección de segmento%#<PRIx64>\n"
 
-#: src/elflint.c:991
+#: src/elflint.c:1016
 #, c-format
 msgid ""
 "section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
@@ -1602,7 +1673,7 @@ msgstr ""
 "Sección [%2d] '%s': tamaño de símbolo _DYNAMIC %<PRIu64> no coincide con "
 "tamaño de segmento %<PRIu64>\n"
 
-#: src/elflint.c:1004
+#: src/elflint.c:1029
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
@@ -1611,24 +1682,24 @@ msgstr ""
 "Sección [%2d] '%s': símbolo %zu: símbolo en tabla de símbolos dinámicos sin "
 "visibilidad predeterminada\n"
 
-#: src/elflint.c:1008
+#: src/elflint.c:1033
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
 msgstr ""
 "Sección [%2d] '%s': símbolo %zu: bit desconocido establecido en st_other\n"
 
-#: src/elflint.c:1053
+#: src/elflint.c:1082
 #, c-format
 msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
 msgstr "Sección [%2d] '%s': DT_RELCOUNT utilizada para esta sección RELA\n"
 
-#: src/elflint.c:1062 src/elflint.c:1114
+#: src/elflint.c:1093 src/elflint.c:1145
 #, c-format
 msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
 msgstr ""
 "Sección [%2d] '%s': valor DT_RELCOUNT %d demasiado alto para esta sección\n"
 
-#: src/elflint.c:1087 src/elflint.c:1139
+#: src/elflint.c:1118 src/elflint.c:1170
 #, c-format
 msgid ""
 "section [%2d] '%s': relative relocations after index %d as specified by "
@@ -1637,7 +1708,7 @@ msgstr ""
 "Sección [%2d] '%s': reubicaciones relativas después de que el %d de índice "
 "haya sido especificado por DT_RELCOUNT\n"
 
-#: src/elflint.c:1093 src/elflint.c:1145
+#: src/elflint.c:1124 src/elflint.c:1176
 #, c-format
 msgid ""
 "section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
@@ -1646,49 +1717,49 @@ msgstr ""
 "Sección [%2d] '%s': reubicación no-relativa en %zu de índice; DT_RELCOUNT "
 "especificado %d reubicaciones relativas\n"
 
-#: src/elflint.c:1105
+#: src/elflint.c:1136
 #, c-format
 msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
 msgstr "sección [%2d] '%s': DT_RELACOUNT utilizado para esta sección REL\n"
 
-#: src/elflint.c:1187
+#: src/elflint.c:1218
 #, c-format
 msgid "section [%2d] '%s': invalid destination section index\n"
 msgstr "Sección [%2d] '%s': índice de sección de destino inválido\n"
 
-#: src/elflint.c:1200
+#: src/elflint.c:1230
 #, c-format
 msgid "section [%2d] '%s': invalid destination section type\n"
 msgstr "Sección [%2d] '%s': tipo de sección de destino inválido\n"
 
-#: src/elflint.c:1208
+#: src/elflint.c:1238
 #, c-format
 msgid "section [%2d] '%s': sh_info should be zero\n"
 msgstr "Sección [%2d] '%s': sh_info debe ser cero\n"
 
-#: src/elflint.c:1215
+#: src/elflint.c:1245
 #, c-format
 msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
 msgstr ""
 "Sección [%2d] '%s': no reubicaciones para secciones de fusión posibles\n"
 
-#: src/elflint.c:1222
+#: src/elflint.c:1253
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
 msgstr ""
 "Sección [%2d] '%s': tamaño de entrada de sección no coincide con ElfXX_Rela\n"
 
-#: src/elflint.c:1282
+#: src/elflint.c:1313
 #, c-format
 msgid "text relocation flag set but there is no read-only segment\n"
 msgstr "Reubicación de bandera pero no hay segmento de sólo lectura\n"
 
-#: src/elflint.c:1309
+#: src/elflint.c:1340
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: invalid type\n"
 msgstr "Sección [%2d] '%s': reubicación %zu: tipo inválido\n"
 
-#: src/elflint.c:1317
+#: src/elflint.c:1348
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: relocation type invalid for the file "
@@ -1697,12 +1768,12 @@ msgstr ""
 "Sección [%2d] '%s': reubicación %zu: tipo de reubicación inválido para el "
 "tipo de archivo\n"
 
-#: src/elflint.c:1325
+#: src/elflint.c:1356
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
 msgstr "Sección [%2d] '%s': reubicación %zu: índice de símbolo inválido\n"
 
-#: src/elflint.c:1343
+#: src/elflint.c:1374
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
@@ -1711,12 +1782,12 @@ msgstr ""
 "Sección [%2d] '%s': reubicación %zu: sólo el símbolo '_GLOBAL_OFFSET_TABLE_' "
 "puede utilizarse con %s\n"
 
-#: src/elflint.c:1360
+#: src/elflint.c:1391
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
 msgstr "Sección [%2d] '%s': reubicación %zu: compensación fuera de límites\n"
 
-#: src/elflint.c:1375
+#: src/elflint.c:1406
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: copy relocation against symbol of type "
@@ -1725,7 +1796,7 @@ msgstr ""
 "Sección [%2d] '%s': reubicación %zu: reubicación de copia con símbolo de "
 "tipo %s\n"
 
-#: src/elflint.c:1396
+#: src/elflint.c:1427
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: read-only section modified but text "
@@ -1734,61 +1805,61 @@ msgstr ""
 "Sección [%2d] '%s': reubicación %zu: sección de sólo-lectura modificada, "
 "pero no se estableció bandera de reubicación\n"
 
-#: src/elflint.c:1411
+#: src/elflint.c:1442
 #, c-format
 msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
 msgstr ""
 "Sección [%2d] '%s': las reubicaciones se hacen con datos cargados y "
 "descargados\n"
 
-#: src/elflint.c:1450 src/elflint.c:1500
+#: src/elflint.c:1482 src/elflint.c:1533
 #, c-format
 msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
 msgstr "Sección [%2d] '%s': no puede obtener reubicación %zu: %s\n"
 
-#: src/elflint.c:1576
+#: src/elflint.c:1609
 #, c-format
 msgid "more than one dynamic section present\n"
 msgstr "más de una sección dinámica presente\n"
 
-#: src/elflint.c:1594
+#: src/elflint.c:1628
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
 msgstr ""
 "Sección [%2d] '%s': tamaño de entrada de sección no coincide con ElfXX_Dyn\n"
 
-#: src/elflint.c:1599 src/elflint.c:1882
+#: src/elflint.c:1633 src/elflint.c:1918
 #, c-format
 msgid "section [%2d] '%s': sh_info not zero\n"
 msgstr "Sección [%2d] '%s': sh_info no es cero\n"
 
-#: src/elflint.c:1609
+#: src/elflint.c:1643
 #, c-format
 msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
 msgstr ""
 "Sección [%2d] '%s': no puede obtener entrada de sección dinámica %zu: %s\n"
 
-#: src/elflint.c:1617
+#: src/elflint.c:1651
 #, c-format
 msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
 msgstr "Sección [%2d] '%s': entradas non-DT_NULL siguen a la entrada DT_NULL\n"
 
-#: src/elflint.c:1624
+#: src/elflint.c:1658
 #, c-format
 msgid "section [%2d] '%s': entry %zu: unknown tag\n"
 msgstr "Sección [%2d] '%s': entrada %zu: etiqueta desconocida\n"
 
-#: src/elflint.c:1635
+#: src/elflint.c:1669
 #, c-format
 msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
 msgstr "Sección [%2d] '%s': entrada %zu: más de una entrada con etiqueta %s\n"
 
-#: src/elflint.c:1645
+#: src/elflint.c:1679
 #, c-format
 msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
 msgstr "Sección [%2d] '%s': entrada %zu: nivel 2 etiqueta %s utilizada\n"
 
-#: src/elflint.c:1663
+#: src/elflint.c:1697
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
@@ -1796,7 +1867,7 @@ msgstr ""
 "Sección [%2d] '%s': entrada %zu: el valor DT_PLTREL debe ser DT_REL or "
 "DT_RELA\n"
 
-#: src/elflint.c:1676
+#: src/elflint.c:1710
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: pointer does not match address of section "
@@ -1805,14 +1876,14 @@ msgstr ""
 "Sección [%2d] '%s': entrada %zu: puntero no coincide con dirección de "
 "sección [%2d] '%s' al que hace referencia sh_link\n"
 
-#: src/elflint.c:1719
+#: src/elflint.c:1753
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
 msgstr ""
 "Sección [%2d] '%s': entrada %zu: valor %s debe apuntar en segmento cargado\n"
 
-#: src/elflint.c:1734
+#: src/elflint.c:1768
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: %s value must be valid offset in section "
@@ -1821,46 +1892,46 @@ msgstr ""
 "sección [%2d] '%s': entrada %zu: valor %s debe ser compensación válida en "
 "sección [%2d] '%s'\n"
 
-#: src/elflint.c:1754 src/elflint.c:1782
+#: src/elflint.c:1788 src/elflint.c:1816
 #, c-format
 msgid "section [%2d] '%s': contains %s entry but not %s\n"
 msgstr "Sección [%2d] '%s': contiene entrada %s pero no %s\n"
 
-#: src/elflint.c:1766
+#: src/elflint.c:1800
 #, c-format
 msgid "section [%2d] '%s': mandatory tag %s not present\n"
 msgstr "Sección [%2d] '%s': etiqueta obligatoria %s no está presente\n"
 
-#: src/elflint.c:1775
+#: src/elflint.c:1809
 #, c-format
 msgid "section [%2d] '%s': no hash section present\n"
 msgstr "Sección [%2d] '%s': no hay sección de dispersión presente\n"
 
-#: src/elflint.c:1790 src/elflint.c:1797
+#: src/elflint.c:1824 src/elflint.c:1831
 #, c-format
 msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
 msgstr "Sección [%2d] '%s': no todas las %s, %s, y %s están presentes\n"
 
-#: src/elflint.c:1807 src/elflint.c:1811
+#: src/elflint.c:1841 src/elflint.c:1845
 #, c-format
 msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
 msgstr ""
 "Sección [%2d] '%s': etiqueta %s faltante en DSO marcada durante el pre-"
 "enlace\n"
 
-#: src/elflint.c:1817
+#: src/elflint.c:1851
 #, c-format
 msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
 msgstr ""
 "Sección [%2d] '%s': archivo no-DSO marcado como dependencia durante el pre-"
 "enlace\n"
 
-#: src/elflint.c:1828 src/elflint.c:1832 src/elflint.c:1836 src/elflint.c:1840
+#: src/elflint.c:1862 src/elflint.c:1866 src/elflint.c:1870 src/elflint.c:1874
 #, c-format
 msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
 msgstr "Sección [%2d] '%s': etiqueta %s faltante en pre-enlace ejecutable\n"
 
-#: src/elflint.c:1852
+#: src/elflint.c:1886
 #, c-format
 msgid ""
 "section [%2d] '%s': only relocatable files can have extended section index\n"
@@ -1868,31 +1939,31 @@ msgstr ""
 "Sección [%2d] '%s': sólo los archivos reubicables pueden tener índice de "
 "sección extendido\n"
 
-#: src/elflint.c:1862
+#: src/elflint.c:1896
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index section not for symbol table\n"
 msgstr ""
 "Sección [%2d] '%s': índice de sección extendido no para tabla de símbolos\n"
 
-#: src/elflint.c:1867
+#: src/elflint.c:1901
 #, c-format
 msgid "cannot get data for symbol section\n"
 msgstr "no se puede obtener sección para símbolos\n"
 
-#: src/elflint.c:1870
+#: src/elflint.c:1904
 #, c-format
 msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
 msgstr "Sección [%2d] '%s': tamaño de entrada no coincide con Elf32_Word\n"
 
-#: src/elflint.c:1877
+#: src/elflint.c:1913
 #, c-format
 msgid "section [%2d] '%s': extended index table too small for symbol table\n"
 msgstr ""
 "Sección [%2d] '%s': tabla de índice extendida demasiado pequeña para tabla "
 "de símbolos\n"
 
-#: src/elflint.c:1892
+#: src/elflint.c:1928
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
@@ -1901,24 +1972,24 @@ msgstr ""
 "Sección [%2d] '%s': índice de sección extendida en sección [%2zu] '%s' se "
 "refiere a la misma tabla de símbolos\n"
 
-#: src/elflint.c:1903
+#: src/elflint.c:1945
 #, c-format
 msgid "symbol 0 should have zero extended section index\n"
 msgstr "símbolo 0 debe tener índice de sección extendida cero\n"
 
-#: src/elflint.c:1915
+#: src/elflint.c:1957
 #, c-format
 msgid "cannot get data for symbol %zu\n"
 msgstr "no puede obtener datos para símbolo %zu\n"
 
-#: src/elflint.c:1920
+#: src/elflint.c:1962
 #, c-format
 msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
 msgstr ""
 "índice de sección extendida es %<PRIu32> pero índice de símbolo no es "
 "XINDEX\n"
 
-#: src/elflint.c:1936 src/elflint.c:1977
+#: src/elflint.c:1978 src/elflint.c:2029
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
@@ -1926,53 +1997,53 @@ msgstr ""
 "Sección [%2d] '%s': sección de tabla de dispersión es demasiado pequeña (es "
 "%ld, se espera %ld)\n"
 
-#: src/elflint.c:1948 src/elflint.c:1989
+#: src/elflint.c:1990 src/elflint.c:2041
 #, c-format
 msgid "section [%2d] '%s': chain array too large\n"
 msgstr "Sección [%2d] '%s': índice de la cadena es demasiado grande\n"
 
-#: src/elflint.c:1957 src/elflint.c:1998
+#: src/elflint.c:2004 src/elflint.c:2055
 #, c-format
 msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
 msgstr ""
 "Sección [%2d] '%s': referencia de cubetas de dispersión %zu fuera de "
 "límites\n"
 
-#: src/elflint.c:1963
+#: src/elflint.c:2014
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
 msgstr ""
 "Sección [%2d] '%s': referencia de cadena de dispersión %zu fuera de límites\n"
 
-#: src/elflint.c:2004
+#: src/elflint.c:2065
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
 msgstr ""
 "Sección [%2d] '%s': referencia de cadena de dispersión %<PRIu64> fuera de "
 "límites\n"
 
-#: src/elflint.c:2019
+#: src/elflint.c:2081
 #, c-format
 msgid "section [%2d] '%s': bitmask size not power of 2: %u\n"
 msgstr "Sección [%2d] '%s': tamaño de bitmask no es potencia de 2: %u\n"
 
-#: src/elflint.c:2030
-#, c-format
+#: src/elflint.c:2092
+#, fuzzy, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected at "
-"least%ld)\n"
+"least %ld)\n"
 msgstr ""
 "Sección [%2d] '%s': sección de tabla de dispersión es demasiado pequeña (es "
 "%ld, se espera al menos least%ld)\n"
 
-#: src/elflint.c:2038
+#: src/elflint.c:2100
 #, c-format
 msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
 msgstr ""
 "Sección [%2d] '%s': segundo cambio de función de dispersión demasiado "
 "grande: %u\n"
 
-#: src/elflint.c:2070
+#: src/elflint.c:2132
 #, c-format
 msgid ""
 "section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
@@ -1980,7 +2051,7 @@ msgstr ""
 "Sección [%2d] '%s': cadena de dispersión para cubetas %zu inferior a "
 "polarización de índice de símbolo\n"
 
-#: src/elflint.c:2091
+#: src/elflint.c:2153
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
@@ -1989,7 +2060,7 @@ msgstr ""
 "Sección [%2d] '%s': el símbolo %u al que se hace referencia en cadena para "
 "cubeta %zu es indefinido\n"
 
-#: src/elflint.c:2102
+#: src/elflint.c:2164
 #, c-format
 msgid ""
 "section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
@@ -1997,13 +2068,13 @@ msgstr ""
 "Sección [%2d] '%s': valor de dispersión para símbolo %u en cadena para "
 "cubeta %zu está errado\n"
 
-#: src/elflint.c:2133
+#: src/elflint.c:2195
 #, c-format
 msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
 msgstr ""
 "Sección [%2d] '%s': cadena de dispersión para cubeta %zu fuera de limites\n"
 
-#: src/elflint.c:2138
+#: src/elflint.c:2200
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
@@ -2011,38 +2082,38 @@ msgstr ""
 "Sección [%2d] '%s': referencia de símbolo en cadena para cubeta %zu fuera de "
 "límites\n"
 
-#: src/elflint.c:2144
+#: src/elflint.c:2206
 #, c-format
 msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
 msgstr ""
 "Sección [%2d] '%s': bitmask no coincide con nombres en la tabla de "
 "dispersión\n"
 
-#: src/elflint.c:2157
+#: src/elflint.c:2219
 #, c-format
 msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
 msgstr ""
 "Sección [%2d] '%s': archivos reubicables no pueden tener tablas de "
 "dispersión\n"
 
-#: src/elflint.c:2175
+#: src/elflint.c:2237
 #, c-format
 msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
 msgstr ""
 "Sección [%2d] '%s': tabla de dispersión no para tabla de símbolos dinámicos\n"
 
-#: src/elflint.c:2183
+#: src/elflint.c:2245
 #, c-format
 msgid "section [%2d] '%s': hash table entry size incorrect\n"
 msgstr ""
 "Sección [%2d] '%s': tamaño incorrecto de entrada de tabla de dispersión\n"
 
-#: src/elflint.c:2188
+#: src/elflint.c:2250
 #, c-format
 msgid "section [%2d] '%s': not marked to be allocated\n"
 msgstr "Sección [%2d] '%s': no marcada para ser asignada\n"
 
-#: src/elflint.c:2193
+#: src/elflint.c:2255
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table has not even room for initial administrative "
@@ -2051,19 +2122,19 @@ msgstr ""
 "Sección [%2d] '%s': tabla de dispersión no tiene ni siquiera espacio para "
 "entradas administrativas iniciales\n"
 
-#: src/elflint.c:2241
+#: src/elflint.c:2303
 #, c-format
 msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
 msgstr ""
 "sh_link en secciones de dispersión [%2zu] '%s' y [%2zu] '%s' no son "
 "idénticas\n"
 
-#: src/elflint.c:2319 src/elflint.c:2323
+#: src/elflint.c:2381 src/elflint.c:2385
 #, c-format
 msgid "section [%2zu] '%s': reference to symbol index 0\n"
 msgstr "Sección [%2zu] '%s': referencia al índice de símbolo 0\n"
 
-#: src/elflint.c:2330
+#: src/elflint.c:2392
 #, c-format
 msgid ""
 "symbol %d referenced in new hash table in [%2zu] '%s' but not in old hash "
@@ -2072,7 +2143,7 @@ msgstr ""
 "Símbolo %d nombrado en nueva tabla de dispersión en [%2zu] '%s' pero no en "
 "la tabla de dispersión anterior en [%2zu] '%s'\n"
 
-#: src/elflint.c:2342
+#: src/elflint.c:2404
 #, c-format
 msgid ""
 "symbol %d referenced in old hash table in [%2zu] '%s' but not in new hash "
@@ -2081,12 +2152,12 @@ msgstr ""
 "Símbolo %d nombrado en la tabla de dispersión anterior en [%2zu] '%s' pero "
 "no en la nueva tabla de dispersión en [%2zu] '%s'\n"
 
-#: src/elflint.c:2358
+#: src/elflint.c:2420
 #, c-format
 msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
 msgstr "Sección [%2d] '%s': nonzero sh_%s para sección NULL\n"
 
-#: src/elflint.c:2378
+#: src/elflint.c:2440
 #, c-format
 msgid ""
 "section [%2d] '%s': section groups only allowed in relocatable object files\n"
@@ -2094,94 +2165,94 @@ msgstr ""
 "Sección [%2d] '%s': grupos de sección sólo permitidos en archivos de objeto "
 "reubicables\n"
 
-#: src/elflint.c:2389
+#: src/elflint.c:2451
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol table: %s\n"
 msgstr "Sección [%2d] '%s': no puede obtener tabla de símbolos: %s\n"
 
-#: src/elflint.c:2394
+#: src/elflint.c:2456
 #, c-format
 msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
 msgstr ""
 "Sección [%2d] '%s': referencia de sección en sh_link no es una tabla de "
 "símbolos\n"
 
-#: src/elflint.c:2400
+#: src/elflint.c:2462
 #, c-format
 msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
 msgstr "Sección [%2d] '%s': índice de símbolo inválido en sh_info\n"
 
-#: src/elflint.c:2405
+#: src/elflint.c:2467
 #, c-format
 msgid "section [%2d] '%s': sh_flags not zero\n"
 msgstr "Sección [%2d] '%s': sh_flags no cero\n"
 
-#: src/elflint.c:2412
+#: src/elflint.c:2474
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol for signature\n"
 msgstr "Sección [%2d] '%s': no puede obtener símbolo para firma\n"
 
-#: src/elflint.c:2417
+#: src/elflint.c:2479
 #, c-format
 msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
 msgstr ""
 "sección [%2d] '%s': el símbolo de firma no puede ser una cadena vacía\n"
 
-#: src/elflint.c:2423
+#: src/elflint.c:2485
 #, c-format
 msgid "section [%2d] '%s': sh_flags not set correctly\n"
 msgstr "Sección [%2d] '%s': sh_flags no establecida correctamente\n"
 
-#: src/elflint.c:2429
+#: src/elflint.c:2491
 #, c-format
 msgid "section [%2d] '%s': cannot get data: %s\n"
 msgstr "Sección [%2d] '%s': no puede obtener datos: %s\n"
 
-#: src/elflint.c:2438
+#: src/elflint.c:2500
 #, c-format
 msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
 msgstr ""
 "Sección [%2d] '%s': tamaño de sección no es múltiplo de tamaño de "
 "(Elf32_Word)\n"
 
-#: src/elflint.c:2443
+#: src/elflint.c:2505
 #, c-format
 msgid "section [%2d] '%s': section group without flags word\n"
 msgstr "Sección [%2d] '%s': grupo de sección sin palabra de banderas\n"
 
-#: src/elflint.c:2449
+#: src/elflint.c:2511
 #, c-format
 msgid "section [%2d] '%s': section group without member\n"
 msgstr "Sección [%2d] '%s': grupo de sección sin miembro\n"
 
-#: src/elflint.c:2453
+#: src/elflint.c:2515
 #, c-format
 msgid "section [%2d] '%s': section group with only one member\n"
 msgstr "Sección [%2d] '%s': grupo de sección con sólo un miembro\n"
 
-#: src/elflint.c:2464
+#: src/elflint.c:2526
 #, c-format
 msgid "section [%2d] '%s': unknown section group flags\n"
 msgstr "Sección [%2d] '%s': banderas de grupo de sección desconocido\n"
 
-#: src/elflint.c:2476
+#: src/elflint.c:2538
 #, c-format
 msgid "section [%2d] '%s': section index %Zu out of range\n"
 msgstr "Sección [%2d] '%s': índice de sección %Zu fuera de rango\n"
 
-#: src/elflint.c:2485
+#: src/elflint.c:2547
 #, c-format
 msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
 msgstr ""
 "Sección [%2d] '%s': no se puede obtener encabezamiento de sección para "
 "elemento %zu: %s\n"
 
-#: src/elflint.c:2492
+#: src/elflint.c:2554
 #, c-format
 msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
 msgstr "Sección [%2d] '%s': grupo de sección contiene otro grupo [%2d] '%s'\n"
 
-#: src/elflint.c:2498
+#: src/elflint.c:2560
 #, c-format
 msgid ""
 "section [%2d] '%s': element %Zu references section [%2d] '%s' without "
@@ -2190,12 +2261,12 @@ msgstr ""
 "Sección [%2d] '%s': elemento %Zu hace referencia a sección [%2d] '%s' sin "
 "establecer bandera SHF_GROUP\n"
 
-#: src/elflint.c:2505
+#: src/elflint.c:2567
 #, c-format
 msgid "section [%2d] '%s' is contained in more than one section group\n"
 msgstr "Sección [%2d] '%s' está contenida en más de un grupo de sección\n"
 
-#: src/elflint.c:2694
+#: src/elflint.c:2756
 #, c-format
 msgid ""
 "section [%2d] '%s' refers in sh_link to section [%2d] '%s' which is no "
@@ -2204,7 +2275,7 @@ msgstr ""
 "Sección [%2d] '%s' se refiere en sh_link a la sección [%2d] '%s' la cual no "
 "es una tabla de símbolos dinámicos\n"
 
-#: src/elflint.c:2705
+#: src/elflint.c:2768
 #, c-format
 msgid ""
 "section [%2d] '%s' has different number of entries than symbol table [%2d] "
@@ -2213,29 +2284,29 @@ msgstr ""
 "Sección [%2d] '%s' tiene un número diferente de entradas a la de la tabla de "
 "símbolos [%2d] '%s'\n"
 
-#: src/elflint.c:2721
+#: src/elflint.c:2784
 #, c-format
 msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
 msgstr ""
 "Sección [%2d] '%s': el símbolo %d: no se pueden leer datos de versión\n"
 
-#: src/elflint.c:2737
+#: src/elflint.c:2800
 #, c-format
 msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
 msgstr ""
 "Sección [%2d] '%s': el símbolo %d: el símbolo local con alcance mundial\n"
 
-#: src/elflint.c:2745
+#: src/elflint.c:2808
 #, c-format
 msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
 msgstr "Sección [%2d] '%s': símbolo %d: símbolo local con versión\n"
 
-#: src/elflint.c:2759
+#: src/elflint.c:2822
 #, c-format
 msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
 msgstr "Sección [%2d] '%s': símbolo %d: índice de versión inválida %d\n"
 
-#: src/elflint.c:2764
+#: src/elflint.c:2827
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: version index %d is for defined version\n"
@@ -2243,7 +2314,7 @@ msgstr ""
 "Sección [%2d] '%s': símbolo %d: índice de versión %d es para versión "
 "definida\n"
 
-#: src/elflint.c:2774
+#: src/elflint.c:2837
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: version index %d is for requested version\n"
@@ -2251,46 +2322,46 @@ msgstr ""
 "Sección [%2d] '%s': símbolo %d: índice de versión %d es para la versión "
 "solicitada\n"
 
-#: src/elflint.c:2826
+#: src/elflint.c:2889
 #, c-format
 msgid "more than one version reference section present\n"
 msgstr "Más de una sección de referencia de versión presente\n"
 
-#: src/elflint.c:2834 src/elflint.c:2963
+#: src/elflint.c:2897 src/elflint.c:3026
 #, c-format
 msgid "section [%2d] '%s': sh_link does not link to string table\n"
 msgstr "Sección [%2d] '%s': sh_link no se enlaza a la tabla de cadenas\n"
 
-#: src/elflint.c:2857 src/elflint.c:3015
+#: src/elflint.c:2920 src/elflint.c:3078
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong version %d\n"
 msgstr "Sección [%2d] '%s': entrada %d tiene versión %d errada\n"
 
-#: src/elflint.c:2863 src/elflint.c:3021
+#: src/elflint.c:2926 src/elflint.c:3084
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
 msgstr ""
 "Sección [%2d] '%s': entrada %d tiene compensación errada de datos "
 "auxiliares\n"
 
-#: src/elflint.c:2871
+#: src/elflint.c:2934
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid file reference\n"
 msgstr "Sección [%2d] '%s': entrada %d tiene referencia de archivo inválida\n"
 
-#: src/elflint.c:2879
+#: src/elflint.c:2942
 #, c-format
 msgid "section [%2d] '%s': entry %d references unknown dependency\n"
 msgstr "Sección [%2d] '%s': %d hace referencia a dependencia desconocida\n"
 
-#: src/elflint.c:2891
+#: src/elflint.c:2954
 #, c-format
 msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
 msgstr ""
 "sección [%2d] '%s': entrada auxiliar %d de entrada %d tiene bandera "
 "desconocida\n"
 
-#: src/elflint.c:2898
+#: src/elflint.c:2961
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
@@ -2299,7 +2370,7 @@ msgstr ""
 "Sección [%2d] '%s': entrada auxiliar %d de entrada %d tiene referencia de "
 "nombre inválida\n"
 
-#: src/elflint.c:2905
+#: src/elflint.c:2968
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: "
@@ -2308,7 +2379,7 @@ msgstr ""
 "Sección [%2d] '%s': entrada auxiliar %d de entrada %d tiene valor de "
 "dispersión: %#x, esperado %#x\n"
 
-#: src/elflint.c:2915
+#: src/elflint.c:2978
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
@@ -2317,7 +2388,7 @@ msgstr ""
 "sección [%2d] '%s': entrada auxiliar %d de entrada %d tiene nombre duplicado "
 "'%s'\n"
 
-#: src/elflint.c:2926
+#: src/elflint.c:2989
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
@@ -2325,53 +2396,53 @@ msgstr ""
 "sección [%2d] '%s': entrada auxiliar %d de entrada %d tiene próximo campo "
 "errado\n"
 
-#: src/elflint.c:2942 src/elflint.c:3100
+#: src/elflint.c:3005 src/elflint.c:3163
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
 msgstr ""
 "sección [%2d] '%s': entrada %d tiene compensación inválida para próxima "
 "entrada\n"
 
-#: src/elflint.c:2955
+#: src/elflint.c:3018
 #, c-format
 msgid "more than one version definition section present\n"
 msgstr "más de una definición de versión presente de sección\n"
 
-#: src/elflint.c:3000
+#: src/elflint.c:3063
 #, c-format
 msgid "section [%2d] '%s': more than one BASE definition\n"
 msgstr "Sección [%2d] '%s': más de una definición de BASE\n"
 
-#: src/elflint.c:3004
+#: src/elflint.c:3067
 #, c-format
 msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
 msgstr ""
 "Sección [%2d] '%s': definición de BASE debe tener índice VER_NDX_GLOBAL\n"
 
-#: src/elflint.c:3010
+#: src/elflint.c:3073
 #, c-format
 msgid "section [%2d] '%s': entry %d has unknown flag\n"
 msgstr "Sección [%2d] '%s': entrada %d tiene bandera desconocida\n"
 
-#: src/elflint.c:3034
+#: src/elflint.c:3097
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid name reference\n"
 msgstr "Sección [%2d] '%s': entrada %d tiene referencia de nombre inválida\n"
 
-#: src/elflint.c:3041
+#: src/elflint.c:3104
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
 msgstr ""
 "Sección [%2d] '%s': entrada %d tiene valor de dispersión errado: %#x, "
 "esperado %#x\n"
 
-#: src/elflint.c:3050
+#: src/elflint.c:3113
 #, c-format
 msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
 msgstr ""
 "Sección [%2d] '%s': entrada %d tiene nombre de versión duplicado '%s'\n"
 
-#: src/elflint.c:3069
+#: src/elflint.c:3132
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
@@ -2379,34 +2450,34 @@ msgstr ""
 "Sección [%2d] '%s': entrada %d tiene referencia de nombre inválida en datos "
 "auxiliares\n"
 
-#: src/elflint.c:3084
+#: src/elflint.c:3147
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
 msgstr ""
 "Sección [%2d] '%s': entrada %d tiene próximo campo errado en datos "
 "auxiliares\n"
 
-#: src/elflint.c:3106
+#: src/elflint.c:3169
 #, c-format
 msgid "section [%2d] '%s': no BASE definition\n"
 msgstr "Sección [%2d] '%s': no hay definición de BASE\n"
 
-#: src/elflint.c:3122
+#: src/elflint.c:3185
 #, c-format
 msgid "section [%2d] '%s': unknown parent version '%s'\n"
 msgstr "Sección [%2d] '%s': desconocida versión principal '%s'\n"
 
-#: src/elflint.c:3135
+#: src/elflint.c:3198
 #, c-format
 msgid "section [%2d] '%s': empty object attributes section\n"
 msgstr "Sección [%2d] '%s': sección de atributos de objeto vacío\n"
 
-#: src/elflint.c:3156
+#: src/elflint.c:3219
 #, c-format
 msgid "section [%2d] '%s': unrecognized attribute format\n"
 msgstr "Sección[%2d] '%s': formato de atributo no reconocido\n"
 
-#: src/elflint.c:3172
+#: src/elflint.c:3235
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
@@ -2414,21 +2485,21 @@ msgstr ""
 "Sección[%2d] '%s': compensación %zu: campo de longitud cero en sección de "
 "atributo\n"
 
-#: src/elflint.c:3181
+#: src/elflint.c:3244
 #, c-format
 msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
 msgstr ""
 "Sección[%2d] '%s': compensación %zu: longitud inválida en sección de "
 "atributo\n"
 
-#: src/elflint.c:3193
+#: src/elflint.c:3256
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
 msgstr ""
 "Sección[%2d] '%s': compensación %zu: cadena de nombre de proveedor sin "
 "terminar\n"
 
-#: src/elflint.c:3210
+#: src/elflint.c:3273
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
@@ -2436,12 +2507,12 @@ msgstr ""
 "Sección [%2d] '%s': compensación %zu: sin fin ULEB128 en etiqueta de sub-"
 "sección de atributo\n"
 
-#: src/elflint.c:3219
+#: src/elflint.c:3282
 #, c-format
 msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
 msgstr "Sección [%2d] '%s': compensación %zu: sección de atributo truncado\n"
 
-#: src/elflint.c:3228
+#: src/elflint.c:3291
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
@@ -2449,7 +2520,7 @@ msgstr ""
 "Sección [%2d] '%s': compensación %zu: campo de longitud cero length en sub-"
 "sección de atributo\n"
 
-#: src/elflint.c:3241
+#: src/elflint.c:3304
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
@@ -2457,7 +2528,7 @@ msgstr ""
 "Sección [%2d] '%s': compensación %zu: longitud inválida en sub-sección de "
 "atributo\n"
 
-#: src/elflint.c:3252
+#: src/elflint.c:3315
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
@@ -2465,26 +2536,26 @@ msgstr ""
 "Sección[%2d] '%s': compensación %zu: sub-sección de atributo tiene etiqueta "
 "inesperada %u\n"
 
-#: src/elflint.c:3270
+#: src/elflint.c:3333
 #, c-format
 msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
 msgstr ""
 "Sección[%2d] '%s': compensación %zu: sin fin ULEB128 en etiqueta de "
 "atributo\n"
 
-#: src/elflint.c:3281
+#: src/elflint.c:3344
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
 msgstr ""
 "Sección [%2d] '%s': compensación %zu: cadena sin terminar en atributo\n"
 
-#: src/elflint.c:3294
+#: src/elflint.c:3357
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
 msgstr ""
 "Sección [%2d] '%s': compensación %zu: etiqueta de atributo no reconocida %u\n"
 
-#: src/elflint.c:3298
+#: src/elflint.c:3361
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
@@ -2492,12 +2563,12 @@ msgstr ""
 "Sección [%2d] '%s': compensación %zu: no reconocido %s valor de atributo "
 "%<PRIu64>\n"
 
-#: src/elflint.c:3308
+#: src/elflint.c:3371
 #, c-format
 msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
 msgstr "Sección [%2d] '%s': compensación %zu: proveedor '%s' desconocido\n"
 
-#: src/elflint.c:3314
+#: src/elflint.c:3377
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
@@ -2505,47 +2576,47 @@ msgstr ""
 "Sección [%2d] '%s': compensación %zu: extra bytes después de la última "
 "sección de atributo\n"
 
-#: src/elflint.c:3403
+#: src/elflint.c:3466
 #, c-format
 msgid "cannot get section header of zeroth section\n"
 msgstr "no puede obtener encabezamiento de sección de sección zeroth\n"
 
-#: src/elflint.c:3407
+#: src/elflint.c:3470
 #, c-format
 msgid "zeroth section has nonzero name\n"
 msgstr "Sección zeroth tiene nombre nonzero\n"
 
-#: src/elflint.c:3409
+#: src/elflint.c:3472
 #, c-format
 msgid "zeroth section has nonzero type\n"
 msgstr "Sección zeroth tiene tipo nonzero\n"
 
-#: src/elflint.c:3411
+#: src/elflint.c:3474
 #, c-format
 msgid "zeroth section has nonzero flags\n"
 msgstr "Sección zeroth tiene banderas nonzero\n"
 
-#: src/elflint.c:3413
+#: src/elflint.c:3476
 #, c-format
 msgid "zeroth section has nonzero address\n"
 msgstr "Sección zeroth tiene dirección nonzero\n"
 
-#: src/elflint.c:3415
+#: src/elflint.c:3478
 #, c-format
 msgid "zeroth section has nonzero offset\n"
 msgstr "Sección zeroth tiene compensación nonzero\n"
 
-#: src/elflint.c:3417
+#: src/elflint.c:3480
 #, c-format
 msgid "zeroth section has nonzero align value\n"
 msgstr "Sección zeroth tiene valor de alineación nonzero\n"
 
-#: src/elflint.c:3419
+#: src/elflint.c:3482
 #, c-format
 msgid "zeroth section has nonzero entry size value\n"
 msgstr "Sección zeroth tiene valor de tamaño de entrada nonzero\n"
 
-#: src/elflint.c:3422
+#: src/elflint.c:3485
 #, c-format
 msgid ""
 "zeroth section has nonzero size value while ELF header has nonzero shnum "
@@ -2554,7 +2625,7 @@ msgstr ""
 "Sección zeroth tiene valor de tamaño nonzero mientras que el encabezamiento "
 "ELF tiene valor shnum nonzero\n"
 
-#: src/elflint.c:3426
+#: src/elflint.c:3489
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
@@ -2563,7 +2634,7 @@ msgstr ""
 "Sección zeroth tiene valor de enlace nonzero mientras que el encabezamiento "
 "ELF no señala sobreflujo en shstrndx\n"
 
-#: src/elflint.c:3430
+#: src/elflint.c:3493
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
@@ -2572,27 +2643,27 @@ msgstr ""
 "la sección zeroth tiene un valor de enlace distinto a cero mientras que el "
 "encabezamiento ELF no señala desbordamiento en phnum\n"
 
-#: src/elflint.c:3447
+#: src/elflint.c:3510
 #, c-format
 msgid "cannot get section header for section [%2zu] '%s': %s\n"
 msgstr "No se puede obtener encabezamiento para sección [%2zu] '%s': %s\n"
 
-#: src/elflint.c:3456
+#: src/elflint.c:3519
 #, c-format
 msgid "section [%2zu]: invalid name\n"
 msgstr "Sección [%2zu]: nombre inválido\n"
 
-#: src/elflint.c:3483
+#: src/elflint.c:3546
 #, c-format
 msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
 msgstr "Sección [%2d] '%s' tiene tipo errado: %s esperado, es %s\n"
 
-#: src/elflint.c:3499
+#: src/elflint.c:3562
 #, c-format
 msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
 msgstr "Sección [%2zu] '%s' tiene banderas erradas: %s esperado, es %s\n"
 
-#: src/elflint.c:3516
+#: src/elflint.c:3579
 #, c-format
 msgid ""
 "section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
@@ -2600,12 +2671,12 @@ msgstr ""
 "Sección [%2zu] '%s' tiene banderas erradas: %s esperado y posiblemente %s, "
 "es %s\n"
 
-#: src/elflint.c:3534
+#: src/elflint.c:3597
 #, c-format
 msgid "section [%2zu] '%s' present in object file\n"
 msgstr "Sección [%2zu] '%s' presente en archivo objeto\n"
 
-#: src/elflint.c:3540 src/elflint.c:3572
+#: src/elflint.c:3603 src/elflint.c:3635
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
@@ -2613,7 +2684,7 @@ msgstr ""
 "Sección [%2zu] '%s' tiene bandera SHF_ALLOC establecida pero no es un "
 "segmento cargable\n"
 
-#: src/elflint.c:3545 src/elflint.c:3577
+#: src/elflint.c:3608 src/elflint.c:3640
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
@@ -2622,7 +2693,7 @@ msgstr ""
 "Sección [%2zu] '%s' no tiene bandera SHF_ALLOC establecida pero hay "
 "segmentos cargables\n"
 
-#: src/elflint.c:3553
+#: src/elflint.c:3616
 #, c-format
 msgid ""
 "section [%2zu] '%s' is extension section index table in non-object file\n"
@@ -2630,22 +2701,22 @@ msgstr ""
 "Sección [%2zu] '%s' es tabla de índice de sección de extensión en archivo no-"
 "objeto\n"
 
-#: src/elflint.c:3596
+#: src/elflint.c:3659
 #, c-format
 msgid "section [%2zu] '%s': size not multiple of entry size\n"
 msgstr "Sección [%2zu] '%s': tamaño no es múltiplo de tamaño de entrada\n"
 
-#: src/elflint.c:3601
+#: src/elflint.c:3664
 #, c-format
 msgid "cannot get section header\n"
 msgstr "no se puede obtener encabezamiento de sección\n"
 
-#: src/elflint.c:3611
+#: src/elflint.c:3674
 #, c-format
 msgid "section [%2zu] '%s' has unsupported type %d\n"
 msgstr "sección [%2zu] '%s' tiene tipo %d incompatible \n"
 
-#: src/elflint.c:3625
+#: src/elflint.c:3688
 #, c-format
 msgid ""
 "section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
@@ -2653,54 +2724,54 @@ msgstr ""
 "Sección [%2zu] '%s' contiene bandera(s) de procesador-específico inválidas "
 "%#<PRIx64>\n"
 
-#: src/elflint.c:3632
+#: src/elflint.c:3695
 #, c-format
 msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
 msgstr "Sección [%2zu] '%s' contiene bandera(s) desconocidas %#<PRIx64>\n"
 
-#: src/elflint.c:3640
+#: src/elflint.c:3703
 #, c-format
 msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
 msgstr ""
 "Sección [%2zu] '%s': dirección de secciones de datos de hilo-local no cero\n"
 
-#: src/elflint.c:3648
+#: src/elflint.c:3711
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in link value\n"
 msgstr ""
 "Sección [%2zu] '%s': referencia de sección inválida en valor de enlace\n"
 
-#: src/elflint.c:3653
+#: src/elflint.c:3716
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in info value\n"
 msgstr ""
 "Sección [%2zu] '%s': referencia de sección inválida en valor de información\n"
 
-#: src/elflint.c:3660
+#: src/elflint.c:3723
 #, c-format
 msgid "section [%2zu] '%s': strings flag set without merge flag\n"
 msgstr ""
 "Sección [%2zu] '%s': bandera de cadenas establecida sin bandera de fusión\n"
 
-#: src/elflint.c:3665
+#: src/elflint.c:3728
 #, c-format
 msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
 msgstr ""
 "Sección [%2zu] '%s': bandera de fusión establecida pero tamaño de entrada es "
 "cero\n"
 
-#: src/elflint.c:3683
+#: src/elflint.c:3746
 #, c-format
 msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
 msgstr ""
 "Sección [%2zu] '%s' tiene un tipo %d inesperado para una sección ejecutable\n"
 
-#: src/elflint.c:3692
+#: src/elflint.c:3755
 #, c-format
 msgid "section [%2zu] '%s' is both executable and writable\n"
 msgstr "Sección [%2zu] '%s' es tanto de ejecución como de escritura\n"
 
-#: src/elflint.c:3721
+#: src/elflint.c:3784
 #, c-format
 msgid ""
 "section [%2zu] '%s' not fully contained in segment of program header entry "
@@ -2709,7 +2780,7 @@ msgstr ""
 "Sección [%2zu] '%s' no contenida totalmente en segmento de entrada de "
 "encabezamiento de programa %d\n"
 
-#: src/elflint.c:3729
+#: src/elflint.c:3792
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
@@ -2718,7 +2789,7 @@ msgstr ""
 "Sección [%2zu] '%s' no tiene tipo NOBITS pero es leída desde el archivo en "
 "segmento de entrada de encabezamiento de programa %d\n"
 
-#: src/elflint.c:3738
+#: src/elflint.c:3801
 #, c-format
 msgid ""
 "section [%2zu] '%s' has not type NOBITS but is not read from the file in "
@@ -2727,18 +2798,18 @@ msgstr ""
 "Sección [%2zu] '%s' no tiene tipo NOBITS pero no es leída desde el fichero "
 "en segmento de entrada de encabezamiento de programa %d\n"
 
-#: src/elflint.c:3749
+#: src/elflint.c:3812
 #, c-format
 msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
 msgstr "Sección [%2zu] '%s' es ejecutable en segmento no ejecutable %d\n"
 
-#: src/elflint.c:3759
+#: src/elflint.c:3822
 #, c-format
 msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
 msgstr ""
 "Sección [%2zu] '%s' es de escritura en segmento que no es de escritura %d\n"
 
-#: src/elflint.c:3769
+#: src/elflint.c:3832
 #, c-format
 msgid ""
 "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
@@ -2746,7 +2817,7 @@ msgstr ""
 "Sección [%2zu] '%s': asignación de bandera establecida pero sección no en "
 "ningún segmento cargado\n"
 
-#: src/elflint.c:3775
+#: src/elflint.c:3838
 #, c-format
 msgid ""
 "section [%2zu] '%s': ELF header says this is the section header string table "
@@ -2755,7 +2826,7 @@ msgstr ""
 "Sección [%2zu] '%s': encabezamiento ELF dice esta es la tabla de cadena de "
 "encabezamiento de sección, pero el tipo no es SHT_TYPE\n"
 
-#: src/elflint.c:3783
+#: src/elflint.c:3846
 #, c-format
 msgid ""
 "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
@@ -2763,32 +2834,32 @@ msgstr ""
 "sección [%2zu] '%s': ficheros reubicables no pueden tener tablas de símbolos "
 "dinámicos\n"
 
-#: src/elflint.c:3834
+#: src/elflint.c:3897
 #, c-format
 msgid "more than one version symbol table present\n"
 msgstr "Más de una tabla de símbolos presente\n"
 
-#: src/elflint.c:3857
+#: src/elflint.c:3920
 #, c-format
 msgid "INTERP program header entry but no .interp section\n"
 msgstr ""
 "Entrada de encabezamiento de programa INTERP pero no la sección .interp\n"
 
-#: src/elflint.c:3868
+#: src/elflint.c:3931
 #, c-format
 msgid ""
 "loadable segment [%u] is executable but contains no executable sections\n"
 msgstr ""
 "segmento cargable [%u] es ejecutable pero no contiene secciones ejecutables\n"
 
-#: src/elflint.c:3874
+#: src/elflint.c:3937
 #, c-format
 msgid "loadable segment [%u] is writable but contains no writable sections\n"
 msgstr ""
 "segmento cargable [%u] es de escritura pero contiene secciones protegidas "
 "contra escritura\n"
 
-#: src/elflint.c:3885
+#: src/elflint.c:3948
 #, c-format
 msgid ""
 "no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
@@ -2797,26 +2868,26 @@ msgstr ""
 "Sección no .gnu.versym presente, pero la sección .gnu.versym_d o la sección ."
 "gnu.versym_r existen\n"
 
-#: src/elflint.c:3898
+#: src/elflint.c:3961
 #, c-format
 msgid "duplicate version index %d\n"
 msgstr "Duplicar índice de versión %d\n"
 
-#: src/elflint.c:3912
+#: src/elflint.c:3975
 #, c-format
 msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
 msgstr ""
 "Sección .gnu.versym presente sin las secciones .gnu.versym_d o .gnu."
 "versym_r\n"
 
-#: src/elflint.c:3961
+#: src/elflint.c:4024
 #, c-format
 msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
 msgstr ""
 "phdr[%d]: tipo de nota de fichero core desconocido %<PRIu32> en compensación "
 "%<PRIu64>\n"
 
-#: src/elflint.c:3965
+#: src/elflint.c:4028
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
@@ -2824,14 +2895,14 @@ msgstr ""
 "Sección [%2d] '%s': tipo de nota de fichero core desconocido %<PRIu32> en "
 "compensación %Zu\n"
 
-#: src/elflint.c:3988
+#: src/elflint.c:4051
 #, c-format
 msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
 msgstr ""
 "phdr[%d]: tipo de nota de fichero objeto desconocido %<PRIu32> en "
 "compensación %Zu\n"
 
-#: src/elflint.c:3992
+#: src/elflint.c:4055
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
@@ -2839,40 +2910,40 @@ msgstr ""
 "Sección [%2d] '%s': tipo de nota de fichero objeto desconocido %<PRIu32> en "
 "compensación %Zu\n"
 
-#: src/elflint.c:4009
+#: src/elflint.c:4072
 #, c-format
 msgid "phdr[%d]: no note entries defined for the type of file\n"
 msgstr "phdr[%d]: no hay entradas de nota definidas para el tipo de archivo\n"
 
-#: src/elflint.c:4028
+#: src/elflint.c:4091
 #, c-format
 msgid "phdr[%d]: cannot get content of note section: %s\n"
 msgstr "phdr[%d]: no puede obtener contenido de sección de nota: %s\n"
 
-#: src/elflint.c:4031
+#: src/elflint.c:4094
 #, c-format
 msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
 msgstr "phdr[%d]: extra %<PRIu64> bytes después de la última nota\n"
 
-#: src/elflint.c:4052
+#: src/elflint.c:4115
 #, c-format
 msgid "section [%2d] '%s': no note entries defined for the type of file\n"
 msgstr ""
 "Sección [%2d] '%s': no hay entradas de nota definidas para el tipo de "
 "archivo\n"
 
-#: src/elflint.c:4059
+#: src/elflint.c:4122
 #, c-format
 msgid "section [%2d] '%s': cannot get content of note section\n"
 msgstr ""
 "Sección[%2d] '%s': no se puede obtener el contenido de sección de nota\n"
 
-#: src/elflint.c:4062
+#: src/elflint.c:4125
 #, c-format
 msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
 msgstr "Sección[%2d] '%s': extra %<PRIu64> bytes después de la última nota\n"
 
-#: src/elflint.c:4080
+#: src/elflint.c:4143
 #, c-format
 msgid ""
 "only executables, shared objects, and core files can have program headers\n"
@@ -2880,139 +2951,139 @@ msgstr ""
 "Sólo ejecutables, objetos compartidos y ficheros core pueden tener "
 "encabezamientos de programas\n"
 
-#: src/elflint.c:4095
+#: src/elflint.c:4158
 #, c-format
 msgid "cannot get program header entry %d: %s\n"
 msgstr "no se puede obtener entrada de encabezamiento %d: %s\n"
 
-#: src/elflint.c:4104
+#: src/elflint.c:4167
 #, c-format
 msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
 msgstr ""
 "entrada de encabezamiento de programa %d: tipo %#<PRIx64> de entrada de "
 "encabezamiento de programa desconocido\n"
 
-#: src/elflint.c:4115
+#: src/elflint.c:4178
 #, c-format
 msgid "more than one INTERP entry in program header\n"
 msgstr "Más de una entrada INTERP en encabezamiento de programa\n"
 
-#: src/elflint.c:4123
+#: src/elflint.c:4186
 #, c-format
 msgid "more than one TLS entry in program header\n"
 msgstr "más de una entrada TLS en encabezamiento de programa\n"
 
-#: src/elflint.c:4130
+#: src/elflint.c:4193
 #, c-format
 msgid "static executable cannot have dynamic sections\n"
 msgstr "ejecutable estático no puede tener secciones dinámicas\n"
 
-#: src/elflint.c:4144
+#: src/elflint.c:4207
 #, c-format
 msgid "dynamic section reference in program header has wrong offset\n"
 msgstr ""
 "Referencia de sección dinámica en encabezamiento de programa tiene "
 "compensación errada\n"
 
-#: src/elflint.c:4147
+#: src/elflint.c:4210
 #, c-format
 msgid "dynamic section size mismatch in program and section header\n"
 msgstr ""
 "No coinciden tamaño de sección dinámica en programa y encabezamiento de "
 "sección\n"
 
-#: src/elflint.c:4157
+#: src/elflint.c:4220
 #, c-format
 msgid "more than one GNU_RELRO entry in program header\n"
 msgstr "Más de una entrada GNU_RELRO en encabezamiento de programa\n"
 
-#: src/elflint.c:4178
+#: src/elflint.c:4241
 #, c-format
 msgid "loadable segment GNU_RELRO applies to is not writable\n"
 msgstr "Segmento cargable GNU_RELRO que se aplica no es de escritura\n"
 
-#: src/elflint.c:4181
+#: src/elflint.c:4244
 #, c-format
 msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
 msgstr ""
 "Banderas de segmento cargable [%u] no coinciden con banderas GNU_RELRO [%u]\n"
 
-#: src/elflint.c:4189 src/elflint.c:4212
+#: src/elflint.c:4252 src/elflint.c:4275
 #, c-format
 msgid "%s segment not contained in a loaded segment\n"
 msgstr "Segmento %s no contenido en un segmento cargable\n"
 
-#: src/elflint.c:4218
+#: src/elflint.c:4281
 #, c-format
 msgid "program header offset in ELF header and PHDR entry do not match"
 msgstr ""
 "Compensación de encabezamiento de programa en encabezamiento ELF y entrada "
 "PHDR no coinciden"
 
-#: src/elflint.c:4242
+#: src/elflint.c:4305
 #, c-format
 msgid "call frame search table reference in program header has wrong offset\n"
 msgstr ""
 "Referencia de tabla de búsqueda de marco de llamada en encabezamiento de "
 "programa tiene una compensación errada\n"
 
-#: src/elflint.c:4245
+#: src/elflint.c:4308
 #, c-format
 msgid "call frame search table size mismatch in program and section header\n"
 msgstr ""
 "Tamaño de tabla de búsqueda de marco de llamada no coincide con programa y "
 "encabezamiento de sección\n"
 
-#: src/elflint.c:4258
+#: src/elflint.c:4321
 #, c-format
 msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
 msgstr "PT_GNU_EH_FRAME presente pero no la sección.eh_frame_hdr\n"
 
-#: src/elflint.c:4266
+#: src/elflint.c:4329
 #, c-format
 msgid "call frame search table must be allocated\n"
 msgstr "tabla de búsqueda de marco de llamada debe ser asignada\n"
 
-#: src/elflint.c:4269
+#: src/elflint.c:4332
 #, c-format
 msgid "section [%2zu] '%s' must be allocated\n"
 msgstr "sección [%2zu] '%s' debe ser asignada\n"
 
-#: src/elflint.c:4273
+#: src/elflint.c:4336
 #, c-format
 msgid "call frame search table must not be writable\n"
 msgstr ""
 "tabla de búsqueda de marco de llamada no debe tener permiso de escritura\n"
 
-#: src/elflint.c:4276
+#: src/elflint.c:4339
 #, c-format
 msgid "section [%2zu] '%s' must not be writable\n"
 msgstr "sección [%2zu] '%s' no debe tener permiso de escritura\n"
 
-#: src/elflint.c:4281
+#: src/elflint.c:4344
 #, c-format
 msgid "call frame search table must not be executable\n"
 msgstr "tabla de búsqueda de marco de llamada no debe ser ejecutable\n"
 
-#: src/elflint.c:4284
+#: src/elflint.c:4347
 #, c-format
 msgid "section [%2zu] '%s' must not be executable\n"
 msgstr "sección [%2zu] '%s' no debe ser ejecutable\n"
 
-#: src/elflint.c:4295
+#: src/elflint.c:4358
 #, c-format
 msgid "program header entry %d: file size greater than memory size\n"
 msgstr ""
 "entrada de encabezamiento de programa %d: tamaño de fichero mayor que el "
 "tamaño de memoria\n"
 
-#: src/elflint.c:4302
+#: src/elflint.c:4365
 #, c-format
 msgid "program header entry %d: alignment not a power of 2\n"
 msgstr ""
 "entrada de encabezamiento de programa %d: alineamiento no es potencia de 2\n"
 
-#: src/elflint.c:4305
+#: src/elflint.c:4368
 #, c-format
 msgid ""
 "program header entry %d: file offset and virtual address not module of "
@@ -3021,7 +3092,7 @@ msgstr ""
 "entrada de encabezamiento de programa %d: compensación de fichero y "
 "dirección virtual no módulo de alineación\n"
 
-#: src/elflint.c:4318
+#: src/elflint.c:4381
 #, c-format
 msgid ""
 "executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
@@ -3030,12 +3101,12 @@ msgstr ""
 "ejecutable/DSO con sección .eh_frame_hdr no tiene una entrada de "
 "encabezamiento de programa PT_GNU_EH_FRAME"
 
-#: src/elflint.c:4352
+#: src/elflint.c:4415
 #, c-format
 msgid "cannot read ELF header: %s\n"
 msgstr "No se puede leer encabezamiento ELF: %s\n"
 
-#: src/elflint.c:4378
+#: src/elflint.c:4441
 #, c-format
 msgid "text relocation flag set but not needed\n"
 msgstr "Bandera de reubicación de texto establecida pero no necesaria\n"
@@ -3569,7 +3640,8 @@ msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
 msgstr ""
 "Advertencia: el tamaño de `%s' cambió de %<PRIu64> en %s a %<PRIu64> en %s"
 
-#: src/ldgeneric.c:651 src/ldgeneric.c:1112 src/readelf.c:640 src/strip.c:562
+#: src/ldgeneric.c:651 src/ldgeneric.c:1112 src/readelf.c:527
+#: src/readelf.c:829 src/strip.c:563
 #, c-format
 msgid "cannot determine number of sections: %s"
 msgstr "no se pudieron determinar el número de secciones: %s"
@@ -3825,7 +3897,7 @@ msgstr "error interno: sección non-nobits sigue a sección nobits"
 msgid "cannot get header of 0th section: %s"
 msgstr "No se puede obtener encabezamiento de sección 0th: %s"
 
-#: src/ldgeneric.c:6930 src/unstrip.c:1810
+#: src/ldgeneric.c:6930 src/unstrip.c:1818
 #, c-format
 msgid "cannot update ELF header: %s"
 msgstr "No se puede actualizar encabezamiento ELF: %s"
@@ -3996,7 +4068,7 @@ msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
 msgstr "%s: ERROR INTERNO %d (%s-%s): %s"
 
 #: src/nm.c:398 src/nm.c:410 src/size.c:309 src/size.c:318 src/size.c:329
-#: src/strip.c:2124
+#: src/strip.c:2155
 #, c-format
 msgid "while closing '%s'"
 msgstr "error al cerrar '%s'"
@@ -4040,17 +4112,17 @@ 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:757 src/nm.c:1156 src/objdump.c:787 src/readelf.c:896
-#: src/readelf.c:1039 src/readelf.c:1187 src/readelf.c:1369 src/readelf.c:1569
-#: src/readelf.c:1755 src/readelf.c:1965 src/readelf.c:2219 src/readelf.c:2285
-#: src/readelf.c:2363 src/readelf.c:2861 src/readelf.c:2897 src/readelf.c:2959
-#: src/readelf.c:7270 src/readelf.c:8176 src/readelf.c:8323 src/readelf.c:8391
-#: src/size.c:417 src/size.c:491 src/strip.c:502
+#: src/nm.c:757 src/nm.c:1163 src/objdump.c:787 src/readelf.c:536
+#: src/readelf.c:1085 src/readelf.c:1245 src/readelf.c:1393 src/readelf.c:1579
+#: src/readelf.c:1785 src/readelf.c:1972 src/readelf.c:2196 src/readelf.c:2454
+#: src/readelf.c:2524 src/readelf.c:2606 src/readelf.c:3117 src/readelf.c:3153
+#: src/readelf.c:3216 src/readelf.c:7920 src/readelf.c:9002 src/readelf.c:9149
+#: src/readelf.c:9217 src/size.c:417 src/size.c:487 src/strip.c:503
 #, c-format
 msgid "cannot get section header string table index"
 msgstr "no se puede obtener índice de cadena de encabezamiento de sección"
 
-#: src/nm.c:782
+#: src/nm.c:784
 #, c-format
 msgid ""
 "\n"
@@ -4063,7 +4135,7 @@ msgstr ""
 "Símbolos de %s:\n"
 "\n"
 
-#: src/nm.c:785
+#: src/nm.c:787
 #, c-format
 msgid ""
 "%*s%-*s %-*s Class  Type     %-*s %*s Section\n"
@@ -4072,23 +4144,23 @@ msgstr ""
 "%*s%-*s %-*s Clase  Tipo     %-*s %*s Sección\n"
 "\n"
 
-#: src/nm.c:1166
+#: src/nm.c:1173
 #, c-format
 msgid "%s: entry size in section `%s' is not what we expect"
 msgstr ""
 "%s: el tamaño de la entrada en la sección `%s' no es el que esperábamos "
 
-#: src/nm.c:1170
+#: src/nm.c:1177
 #, c-format
 msgid "%s: size of section `%s' is not multiple of entry size"
 msgstr "%s: Tamaño de sección `%s' no es múltiplo de tamaño de entrada"
 
-#: src/nm.c:1428
+#: src/nm.c:1435
 #, c-format
 msgid "%s%s%s%s: Invalid operation"
 msgstr "%s%s%s%s: Operación inválida"
 
-#: src/nm.c:1485
+#: src/nm.c:1492
 #, c-format
 msgid "%s%s%s: no symbols"
 msgstr "%s%s%s: No hay símbolos"
@@ -4122,7 +4194,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:236 src/readelf.c:439
+#: src/objdump.c:236 src/readelf.c:473
 msgid "No operation specified.\n"
 msgstr "No se especificó una operación.\n"
 
@@ -4131,11 +4203,11 @@ msgstr "No se especificó una operación.\n"
 msgid "while close `%s'"
 msgstr "mientras cierra `%s'"
 
-#: src/objdump.c:379 src/readelf.c:1664 src/readelf.c:1838
+#: src/objdump.c:379 src/readelf.c:1880 src/readelf.c:2069
 msgid "INVALID SYMBOL"
 msgstr "SÍMBOLO INVÁLIDO"
 
-#: src/objdump.c:394 src/readelf.c:1695 src/readelf.c:1871
+#: src/objdump.c:394 src/readelf.c:1911 src/readelf.c:2102
 msgid "INVALID SECTION"
 msgstr "SECCIÓN INVÁLIDA"
 
@@ -4192,185 +4264,247 @@ 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:67
+#: src/readelf.c:71
+#, fuzzy
+msgid "ELF input selection:"
+msgstr "Selección de salida de ELF:"
+
+#: src/readelf.c:73
+msgid ""
+"Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data"
+msgstr ""
+
+#: src/readelf.c:75
 msgid "ELF output selection:"
 msgstr "Selección de salida de ELF:"
 
-#: src/readelf.c:69
+#: src/readelf.c:77
 msgid "All these plus -p .strtab -p .dynstr -p .comment"
 msgstr "Todo esto mas -p .strtab -p .dynstr -p .comment"
 
-#: src/readelf.c:70
+#: src/readelf.c:78
 msgid "Display the dynamic segment"
 msgstr "Mostrar el segmento dinámico"
 
-#: src/readelf.c:71
+#: src/readelf.c:79
 msgid "Display the ELF file header"
 msgstr "Mostrar el encabezamiento del fichero ELF"
 
-#: src/readelf.c:73
+#: src/readelf.c:81
 msgid "Display histogram of bucket list lengths"
 msgstr "Mostrar histograma de las longitudes de las listas de cubetas"
 
-#: src/readelf.c:74
+#: src/readelf.c:82
 msgid "Display the program headers"
 msgstr "Mostrar encabezamientos de programa"
 
-#: src/readelf.c:76
+#: src/readelf.c:84
 msgid "Display relocations"
 msgstr "Mostrar reubicaciones"
 
-#: src/readelf.c:77
+#: src/readelf.c:85
 msgid "Display the sections' headers"
 msgstr "Mostrar los encabezados de las secciones"
 
-#: src/readelf.c:79
+#: src/readelf.c:87
 msgid "Display the symbol table"
 msgstr "Mostrar la tabla de símbolos"
 
-#: src/readelf.c:80
+#: src/readelf.c:88
 msgid "Display versioning information"
 msgstr "Mostrar información de versión"
 
-#: src/readelf.c:81
+#: src/readelf.c:89
 msgid "Display the ELF notes"
 msgstr "Mostrar las notas ELF"
 
-#: src/readelf.c:83
+#: src/readelf.c:91
 msgid "Display architecture specific information, if any"
 msgstr "Mostrar información específica de la arquitectura (si es que la hay)"
 
-#: src/readelf.c:85
+#: src/readelf.c:93
 msgid "Display sections for exception handling"
 msgstr "Muestra secciones para manejo de excepciones"
 
-#: src/readelf.c:87
+#: src/readelf.c:95
 msgid "Additional output selection:"
 msgstr "Selección de salida adicional:"
 
-#: src/readelf.c:89
+#: src/readelf.c:97
 #, fuzzy
 msgid ""
 "Display DWARF section content.  SECTION can be one of abbrev, aranges, "
-"frame, gdb_index, info, loc, line, ranges, pubnames, str, macinfo, macro or "
-"exception"
+"decodedaranges, frame, gdb_index, info, loc, line, decodedline, ranges, "
+"pubnames, str, macinfo, macro or exception"
 msgstr ""
 "Mostrar el contenido de la sección DWARF. SECCIÓN puede ser algo de lo "
 "siguiente: abbrev, aranges, frame, info, loc, line, ranges, pubnames, str, "
 "macinfo, o exception"
 
-#: src/readelf.c:93
+#: src/readelf.c:101
 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:95
+#: src/readelf.c:103
 msgid "Print string contents of sections"
 msgstr "Imprime contenido de cadena de secciones"
 
-#: src/readelf.c:98
+#: src/readelf.c:106
 msgid "Display the symbol index of an archive"
 msgstr "Muestra el índice de símbolos de un archivo"
 
-#: src/readelf.c:100
+#: src/readelf.c:108
 msgid "Output control:"
 msgstr "Control de salida:"
 
-#: src/readelf.c:102
+#: src/readelf.c:110
 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:104
+#: src/readelf.c:112
+#, 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:114
 msgid "Ignored for compatibility (lines always wide)"
 msgstr ""
 
-#: src/readelf.c:109
+#: src/readelf.c:119
 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."
 
-#: src/readelf.c:410
+#: src/readelf.c:441
 #, c-format
 msgid "Unknown DWARF debug section `%s'.\n"
 msgstr "Sección de depuración DWARF desconocida `%s'.\n"
 
-#: src/readelf.c:476
+#: src/readelf.c:520 src/readelf.c:631
 #, c-format
 msgid "cannot generate Elf descriptor: %s"
 msgstr "no se puede crear descriptor ELF: %s"
 
-#: src/readelf.c:488
+#: src/readelf.c:545 src/readelf.c:1099 src/readelf.c:1269
 #, 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"
+msgid "cannot get section: %s"
+msgstr "No se puede encontrar la sección: %s"
+
+#: src/readelf.c:554 src/readelf.c:1106 src/readelf.c:1277 src/readelf.c:9169
+#: src/unstrip.c:352 src/unstrip.c:383 src/unstrip.c:432 src/unstrip.c:540
+#: src/unstrip.c:557 src/unstrip.c:593 src/unstrip.c:791 src/unstrip.c:1059
+#: src/unstrip.c:1250 src/unstrip.c:1310 src/unstrip.c:1431 src/unstrip.c:1484
+#: src/unstrip.c:1591 src/unstrip.c:1780
+#, c-format
+msgid "cannot get section header: %s"
+msgstr "No se puede obtener encabezamiento de sección: %s"
+
+#: src/readelf.c:562
+#, fuzzy, c-format
+msgid "cannot get section name"
+msgstr "no se puede obtener encabezamiento de sección\n"
+
+#: src/readelf.c:571 src/readelf.c:5221 src/readelf.c:7414 src/readelf.c:7516
+#: src/readelf.c:7674
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr "No se puede obtener el contenido %s: %s"
+
+#: src/readelf.c:587
+#, fuzzy, c-format
+msgid "cannot create temp file '%s'"
+msgstr "no se puede crear fichero nuevo '%s': %s"
+
+#: src/readelf.c:596
+#, fuzzy, c-format
+msgid "cannot write section data"
+msgstr "no se puede leer la sección de datos: %s"
 
-#: src/readelf.c:493
+#: src/readelf.c:602 src/readelf.c:619 src/readelf.c:648
 #, c-format
 msgid "error while closing Elf descriptor: %s"
 msgstr "error al cerrar el descriptor ELF: %s"
 
-#: src/readelf.c:585
+#: src/readelf.c:609
+#, fuzzy, c-format
+msgid "error while rewinding file descriptor"
+msgstr "error al cerrar el descriptor ELF: %s"
+
+#: src/readelf.c:643
+#, 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:742
+#, 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:769
 #, c-format
 msgid "cannot stat input file"
 msgstr "no sepudo stat archivo de entrada"
 
-#: src/readelf.c:587
+#: src/readelf.c:771
 #, c-format
 msgid "input file is empty"
 msgstr "archivo de entrada vacío"
 
-#: src/readelf.c:589
+#: src/readelf.c:773
 #, c-format
 msgid "failed reading '%s': %s"
 msgstr "Falló lectura de '%s': %s"
 
-#: src/readelf.c:625
+#: src/readelf.c:814
 #, c-format
 msgid "cannot read ELF header: %s"
 msgstr "no se pudo leer encabezamiento ELF: %s"
 
-#: src/readelf.c:633
+#: src/readelf.c:822
 #, c-format
 msgid "cannot create EBL handle"
 msgstr "no se puede crear EBL"
 
-#: src/readelf.c:646
+#: src/readelf.c:835
 #, 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:732
+#: src/readelf.c:921
 msgid "NONE (None)"
 msgstr "NONE (Ninguno)"
 
-#: src/readelf.c:733
+#: src/readelf.c:922
 msgid "REL (Relocatable file)"
 msgstr "REL (Fichero reubicable)"
 
-#: src/readelf.c:734
+#: src/readelf.c:923
 msgid "EXEC (Executable file)"
 msgstr "EXEC (Fichero ejecutable)"
 
-#: src/readelf.c:735
+#: src/readelf.c:924
 msgid "DYN (Shared object file)"
 msgstr "DYN (Fichero objeto compartido)"
 
-#: src/readelf.c:736
+#: src/readelf.c:925
 msgid "CORE (Core file)"
 msgstr "CORE (Fichero núcleo)"
 
-#: src/readelf.c:741
+#: src/readelf.c:930
 #, c-format
 msgid "OS Specific: (%x)\n"
 msgstr "OS Specific: (%x)\n"
 
-#: src/readelf.c:743
+#: src/readelf.c:932
 #, c-format
 msgid "Processor Specific: (%x)\n"
 msgstr "Específico del procesador: (%x)\n"
 
-#: src/readelf.c:753
+#: src/readelf.c:942
 msgid ""
 "ELF Header:\n"
 "  Magic:  "
@@ -4378,7 +4512,7 @@ msgstr ""
 "Encabezamiento ELF:\n"
 "  Mágico:  "
 
-#: src/readelf.c:757
+#: src/readelf.c:946
 #, c-format
 msgid ""
 "\n"
@@ -4387,119 +4521,119 @@ msgstr ""
 "\n"
 "  Clase:                             %s\n"
 
-#: src/readelf.c:762
+#: src/readelf.c:951
 #, c-format
 msgid "  Data:                              %s\n"
 msgstr "  Datos:                             %s\n"
 
-#: src/readelf.c:768
+#: src/readelf.c:957
 #, c-format
 msgid "  Ident Version:                     %hhd %s\n"
 msgstr "  Versión ident:                     %hhd %s\n"
 
-#: src/readelf.c:770 src/readelf.c:787
+#: src/readelf.c:959 src/readelf.c:976
 msgid "(current)"
 msgstr "(actual)"
 
-#: src/readelf.c:774
+#: src/readelf.c:963
 #, c-format
 msgid "  OS/ABI:                            %s\n"
 msgstr "  OS/ABI:                            %s\n"
 
-#: src/readelf.c:777
+#: src/readelf.c:966
 #, c-format
 msgid "  ABI Version:                       %hhd\n"
 msgstr "  Versión ABI:                       %hhd\n"
 
-#: src/readelf.c:780
+#: src/readelf.c:969
 msgid "  Type:                              "
 msgstr "  Tipo:                              "
 
-#: src/readelf.c:783
+#: src/readelf.c:972
 #, c-format
 msgid "  Machine:                           %s\n"
 msgstr "  Máquina:                           %s\n"
 
-#: src/readelf.c:785
+#: src/readelf.c:974
 #, c-format
 msgid "  Version:                           %d %s\n"
 msgstr "  Versión:                           %d %s\n"
 
-#: src/readelf.c:789
+#: src/readelf.c:978
 #, c-format
 msgid "  Entry point address:               %#<PRIx64>\n"
 msgstr "  Dirección de punto de entrada:               %#<PRIx64>\n"
 
-#: src/readelf.c:792
+#: src/readelf.c:981
 #, c-format
 msgid "  Start of program headers:          %<PRId64> %s\n"
 msgstr "  Inicio de encabezamientos de programa:          %<PRId64> %s\n"
 
-#: src/readelf.c:793 src/readelf.c:796
+#: src/readelf.c:982 src/readelf.c:985
 msgid "(bytes into file)"
 msgstr " (bytes en el archivo)"
 
-#: src/readelf.c:795
+#: src/readelf.c:984
 #, c-format
 msgid "  Start of section headers:          %<PRId64> %s\n"
 msgstr "  Inicio de encabezamientos de sección:          %<PRId64> %s\n"
 
-#: src/readelf.c:798
+#: src/readelf.c:987
 #, c-format
 msgid "  Flags:                             %s\n"
 msgstr "  Indicadores:                             %s\n"
 
-#: src/readelf.c:801
+#: src/readelf.c:990
 #, c-format
 msgid "  Size of this header:               %<PRId16> %s\n"
 msgstr "  Tamaño de este encabezamiento:               %<PRId16> %s\n"
 
-#: src/readelf.c:802 src/readelf.c:805 src/readelf.c:822
+#: src/readelf.c:991 src/readelf.c:994 src/readelf.c:1011
 msgid "(bytes)"
 msgstr "(bytes)"
 
-#: src/readelf.c:804
+#: src/readelf.c:993
 #, 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:807
+#: src/readelf.c:996
 #, c-format
 msgid "  Number of program headers entries: %<PRId16>"
 msgstr "  Cantidad de entradas de encabezados de programa: %<PRId16>"
 
-#: src/readelf.c:814
+#: src/readelf.c:1003
 #, c-format
 msgid " (%<PRIu32> in [0].sh_info)"
 msgstr " (%<PRIu32> in [0].sh_info)"
 
-#: src/readelf.c:817 src/readelf.c:834 src/readelf.c:848
+#: src/readelf.c:1006 src/readelf.c:1023 src/readelf.c:1037
 msgid " ([0] not available)"
 msgstr " ([0] no disponible)"
 
-#: src/readelf.c:821
+#: src/readelf.c:1010
 #, 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:824
+#: src/readelf.c:1013
 #, c-format
 msgid "  Number of section headers entries: %<PRId16>"
 msgstr "  Cantidad de entradas en los encabezamientos de sección: %<PRId16>"
 
-#: src/readelf.c:831
+#: src/readelf.c:1020
 #, c-format
 msgid " (%<PRIu32> in [0].sh_size)"
 msgstr " (%<PRIu32> en [0].sh_size)"
 
-#: src/readelf.c:844
+#: src/readelf.c:1033
 #, c-format
 msgid " (%<PRIu32> in [0].sh_link)"
 msgstr " (%<PRIu32> en [0].sh_link)"
 
-#: src/readelf.c:852
+#: src/readelf.c:1041
 #, c-format
 msgid ""
 "  Section header string table index: XINDEX%s\n"
@@ -4508,14 +4642,14 @@ msgstr ""
 "  Índice de tabla de cadenas de sección de encabezamiento de : XINDEX%s\n"
 "\n"
 
-#: src/readelf.c:856
+#: src/readelf.c:1045
 #, 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:888
+#: src/readelf.c:1077
 #, c-format
 msgid ""
 "There are %d section headers, starting at offset %#<PRIx64>:\n"
@@ -4524,11 +4658,11 @@ msgstr ""
 "Hay %d encabezamientos de sección, comenzando en compensación %#<PRIx64>:\n"
 "\n"
 
-#: src/readelf.c:898
+#: src/readelf.c:1087
 msgid "Section Headers:"
 msgstr "encabezamientos de sección:"
 
-#: src/readelf.c:901
+#: src/readelf.c:1090
 msgid ""
 "[Nr] Name                 Type         Addr     Off    Size   ES Flags Lk "
 "Inf Al"
@@ -4536,7 +4670,7 @@ msgstr ""
 "[Nr] Nombre            Tipo            Dirección    Off    Tamaño    Inf Al "
 "Enlace banderas ES"
 
-#: src/readelf.c:903
+#: src/readelf.c:1092
 msgid ""
 "[Nr] Name                 Type         Addr             Off      Size     ES "
 "Flags Lk Inf Al"
@@ -4544,32 +4678,18 @@ msgstr ""
 "[Nr] Name                 Type         Addr             Off      Size     ES "
 "Flags Lk Inf Al"
 
-#: src/readelf.c:910 src/readelf.c:1063
-#, c-format
-msgid "cannot get section: %s"
-msgstr "No se puede encontrar la sección: %s"
-
-#: src/readelf.c:917 src/readelf.c:1071 src/readelf.c:8343 src/unstrip.c:345
-#: src/unstrip.c:376 src/unstrip.c:425 src/unstrip.c:533 src/unstrip.c:550
-#: src/unstrip.c:586 src/unstrip.c:784 src/unstrip.c:1052 src/unstrip.c:1242
-#: src/unstrip.c:1302 src/unstrip.c:1423 src/unstrip.c:1476 src/unstrip.c:1583
-#: src/unstrip.c:1772
-#, c-format
-msgid "cannot get section header: %s"
-msgstr "No se puede obtener encabezamiento de sección: %s"
-
-#: src/readelf.c:975
+#: src/readelf.c:1164
 msgid "Program Headers:"
 msgstr "encabezamientos de programa:"
 
-#: src/readelf.c:977
+#: src/readelf.c:1166
 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:980
+#: src/readelf.c:1169
 msgid ""
 "  Type           Offset   VirtAddr           PhysAddr           FileSiz  "
 "MemSiz   Flg Align"
@@ -4577,12 +4697,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:1020
+#: src/readelf.c:1226
 #, c-format
 msgid "\t[Requesting program interpreter: %s]\n"
 msgstr "\t[Solicitando intérprete de programa: %s]\n"
 
-#: src/readelf.c:1041
+#: src/readelf.c:1247
 msgid ""
 "\n"
 " Section to Segment mapping:\n"
@@ -4592,12 +4712,12 @@ msgstr ""
 " Sección para asignación de segmento:\n"
 "  Secciones de segmento..."
 
-#: src/readelf.c:1052 src/unstrip.c:1827 src/unstrip.c:1866 src/unstrip.c:1873
+#: src/readelf.c:1258 src/unstrip.c:1835 src/unstrip.c:1874 src/unstrip.c:1881
 #, c-format
 msgid "cannot get program header: %s"
 msgstr "no se puede obtener memoria para encabezamiento del programa: %s"
 
-#: src/readelf.c:1193
+#: src/readelf.c:1401
 #, c-format
 msgid ""
 "\n"
@@ -4612,7 +4732,7 @@ msgstr[1] ""
 "\n"
 "Grupo de sección COMDAT [%2zu] '%s' con firma '%s' contiene entradas %zu:\n"
 
-#: src/readelf.c:1198
+#: src/readelf.c:1406
 #, c-format
 msgid ""
 "\n"
@@ -4627,15 +4747,21 @@ msgstr[1] ""
 "\n"
 "Grupo de sección [%2zu] '%s' con firma '%s' contiene entradas %zu:\n"
 
-#: src/readelf.c:1206
+#: src/readelf.c:1414
 msgid "<INVALID SYMBOL>"
 msgstr "<SÍMBOLO INVÁLIDO>"
 
-#: src/readelf.c:1220
+#: src/readelf.c:1428
 msgid "<INVALID SECTION>"
 msgstr "<SECCIÓN INVÁLIDA>"
 
-#: src/readelf.c:1371
+#: src/readelf.c:1585 src/readelf.c:2202 src/readelf.c:2460 src/readelf.c:2530
+#: src/readelf.c:2812 src/readelf.c:2885 src/readelf.c:4488
+#, fuzzy, c-format
+msgid "invalid sh_link value in section %Zu"
+msgstr ".debug_line section inválida"
+
+#: src/readelf.c:1588
 #, c-format
 msgid ""
 "\n"
@@ -4656,36 +4782,36 @@ msgstr[1] ""
 " Dirección: %#0*<PRIx64>  Compensación: %#08<PRIx64>  Enlace a sección: "
 "[%2u] '%s'\n"
 
-#: src/readelf.c:1383
+#: src/readelf.c:1598
 msgid "  Type              Value\n"
 msgstr "  Tipo              Valor\n"
 
-#: src/readelf.c:1407
+#: src/readelf.c:1622
 #, c-format
 msgid "Shared library: [%s]\n"
 msgstr "Biblioteca compartida: [%s]\n"
 
-#: src/readelf.c:1412
+#: src/readelf.c:1627
 #, c-format
 msgid "Library soname: [%s]\n"
 msgstr "Nombre-so de la biblioteca: [%s]\n"
 
-#: src/readelf.c:1417
+#: src/readelf.c:1632
 #, c-format
 msgid "Library rpath: [%s]\n"
 msgstr "Rpath de la biblioteca: [%s]\n"
 
-#: src/readelf.c:1422
+#: src/readelf.c:1637
 #, c-format
 msgid "Library runpath: [%s]\n"
 msgstr "Ruta de ejecución de la biblioteca: [%s]\n"
 
-#: src/readelf.c:1442
+#: src/readelf.c:1657
 #, c-format
 msgid "%<PRId64> (bytes)\n"
 msgstr "%<PRId64> (bytes)\n"
 
-#: src/readelf.c:1554 src/readelf.c:1740
+#: src/readelf.c:1770 src/readelf.c:1957
 #, c-format
 msgid ""
 "\n"
@@ -4694,7 +4820,7 @@ msgstr ""
 "\n"
 "Tabla de símbolos inválida en compensación %#0<PRIx64>\n"
 
-#: src/readelf.c:1572 src/readelf.c:1757
+#: src/readelf.c:1788 src/readelf.c:1975
 #, c-format
 msgid ""
 "\n"
@@ -4713,7 +4839,7 @@ msgstr[1] ""
 "Sección de reubicación [%2zu] '%s' para sección [%2u] '%s' en compensación "
 "%#0<PRIx64> contiene entradas %d:\n"
 
-#: src/readelf.c:1587
+#: src/readelf.c:1803 src/readelf.c:1990
 #, c-format
 msgid ""
 "\n"
@@ -4730,29 +4856,29 @@ msgstr[1] ""
 "Sección de reubicación [%2u] '%s' en compensación %#0<PRIx64> contiene "
 "entradas %d:\n"
 
-#: src/readelf.c:1597
+#: src/readelf.c:1813
 msgid "  Offset      Type                 Value       Name\n"
 msgstr "   Compensación           Tipo               Valor      Nombre\n"
 
-#: src/readelf.c:1599
+#: src/readelf.c:1815
 msgid "  Offset              Type                 Value               Name\n"
 msgstr "    Compensación           Tipo               Valor           Nombre\n"
 
-#: src/readelf.c:1652 src/readelf.c:1663 src/readelf.c:1676 src/readelf.c:1694
-#: src/readelf.c:1706 src/readelf.c:1825 src/readelf.c:1837 src/readelf.c:1851
-#: src/readelf.c:1870 src/readelf.c:1883
+#: src/readelf.c:1868 src/readelf.c:1879 src/readelf.c:1892 src/readelf.c:1910
+#: src/readelf.c:1922 src/readelf.c:2056 src/readelf.c:2068 src/readelf.c:2082
+#: src/readelf.c:2101 src/readelf.c:2114
 msgid "<INVALID RELOC>"
 msgstr "<REUBIC INVÁLIDA>"
 
-#: src/readelf.c:1769
+#: src/readelf.c:2000
 msgid "  Offset      Type            Value       Addend Name\n"
 msgstr "    Compensación            Tipo               Valor    Nombre Adend\n"
 
-#: src/readelf.c:1771
+#: src/readelf.c:2002
 msgid "  Offset              Type            Value               Addend Name\n"
 msgstr "    Compensación            Tipo               Valor   Nombre Adend\n"
 
-#: src/readelf.c:1972
+#: src/readelf.c:2210
 #, c-format
 msgid ""
 "\n"
@@ -4767,40 +4893,40 @@ msgstr[1] ""
 "\n"
 "La tabla de símbolos [%2u] '%s' contiene entradas %u:\n"
 
-#: src/readelf.c:1978
+#: src/readelf.c:2215
 #, 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:1988
+#: src/readelf.c:2223
 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:1990
+#: src/readelf.c:2225
 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:2010
+#: src/readelf.c:2245
 #, 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:2098
+#: src/readelf.c:2333
 #, c-format
 msgid "bad dynamic symbol"
 msgstr "símbolo dinámico erróneo"
 
-#: src/readelf.c:2180
+#: src/readelf.c:2415
 msgid "none"
 msgstr "nada"
 
-#: src/readelf.c:2197
+#: src/readelf.c:2432
 msgid "| <unknown>"
 msgstr "| <desconocido>"
 
-#: src/readelf.c:2222
+#: src/readelf.c:2463
 #, c-format
 msgid ""
 "\n"
@@ -4821,17 +4947,17 @@ msgstr[1] ""
 " Dirección: %#0*<PRIx64>  Compensación: %#08<PRIx64>  Enlace a sección: "
 "[%2u] '%s'\n"
 
-#: src/readelf.c:2245
+#: src/readelf.c:2484
 #, c-format
 msgid "  %#06x: Version: %hu  File: %s  Cnt: %hu\n"
 msgstr "  %#06x: Versión: %hu  Fichero: %s  Conteo: %hu\n"
 
-#: src/readelf.c:2258
+#: src/readelf.c:2497
 #, c-format
 msgid "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 msgstr "  %#06x: Nombre: %s  Banderas: %s  Versión: %hu\n"
 
-#: src/readelf.c:2289
+#: src/readelf.c:2534
 #, c-format
 msgid ""
 "\n"
@@ -4852,18 +4978,18 @@ msgstr[1] ""
 " Dirección: %#0*<PRIx64>  Compensación: %#08<PRIx64>  Enlace a sección: "
 "[%2u] '%s'\n"
 
-#: src/readelf.c:2319
+#: src/readelf.c:2562
 #, 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:2334
+#: src/readelf.c:2577
 #, c-format
 msgid "  %#06x: Parent %d: %s\n"
 msgstr "  %#06x: Principal %d: %s\n"
 
-#: src/readelf.c:2566
+#: src/readelf.c:2816
 #, c-format
 msgid ""
 "\n"
@@ -4884,15 +5010,15 @@ msgstr[1] ""
 " Dirección: %#0*<PRIx64>  Compensación: %#08<PRIx64>  Enlace a sección: "
 "[%2u] '%s'"
 
-#: src/readelf.c:2596
+#: src/readelf.c:2844
 msgid "   0 *local*                     "
 msgstr "   0 *local*                     "
 
-#: src/readelf.c:2601
+#: src/readelf.c:2849
 msgid "   1 *global*                    "
 msgstr "   1 *global*                    "
 
-#: src/readelf.c:2632
+#: src/readelf.c:2890
 #, c-format
 msgid ""
 "\n"
@@ -4917,22 +5043,22 @@ msgstr[1] ""
 " Dirección: %#0*<PRIx64>  Compensación: %#08<PRIx64>  Enlace a sección: "
 "[%2u] '%s'\n"
 
-#: src/readelf.c:2656
+#: src/readelf.c:2912
 #, no-c-format
 msgid " Length  Number  % of total  Coverage\n"
 msgstr " Longitud  Número  % of total  Cobertura\n"
 
-#: src/readelf.c:2658
+#: src/readelf.c:2914
 #, c-format
 msgid "      0  %6<PRIu32>      %5.1f%%\n"
 msgstr "      0  %6<PRIu32>      %5.1f%%\n"
 
-#: src/readelf.c:2665
+#: src/readelf.c:2921
 #, c-format
 msgid "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 msgstr "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 
-#: src/readelf.c:2678
+#: src/readelf.c:2934
 #, c-format
 msgid ""
 " Average number of tests:   successful lookup: %f\n"
@@ -4941,12 +5067,12 @@ msgstr ""
 " Número promedio de pruebas:   búsqueda exitosa: %f\n"
 "                          búsqueda sin éxito: %f\n"
 
-#: src/readelf.c:2696 src/readelf.c:2738 src/readelf.c:2779
+#: src/readelf.c:2952 src/readelf.c:2994 src/readelf.c:3035
 #, 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:2833
+#: src/readelf.c:3089
 #, c-format
 msgid ""
 " Symbol Bias: %u\n"
@@ -4956,7 +5082,7 @@ msgstr ""
 " Tamaño de Bitmask: %zu bytes  %<PRIuFAST32>%% bits establecen segundo "
 "cambio de dispersión: %u\n"
 
-#: src/readelf.c:2907
+#: src/readelf.c:3164
 #, c-format
 msgid ""
 "\n"
@@ -4973,7 +5099,7 @@ msgstr[1] ""
 "Sección de lista de biblioteca [%2zu] '%s' en compensación %#0<PRIx64> "
 "contiene entradas %d:\n"
 
-#: src/readelf.c:2921
+#: src/readelf.c:3178
 msgid ""
 "       Library                       Time Stamp          Checksum Version "
 "Flags"
@@ -4981,7 +5107,7 @@ msgstr ""
 "       Biblioteca                       Marca de tiempo          Indicadores "
 "de versión de suma de verificación"
 
-#: src/readelf.c:2971
+#: src/readelf.c:3228
 #, c-format
 msgid ""
 "\n"
@@ -4992,135 +5118,140 @@ msgstr ""
 "Sección de atributos de objeto [%2zu] '%s' de %<PRIu64> bytes con "
 "desplazamiento %#0<PRIx64>:\n"
 
-#: src/readelf.c:2987
+#: src/readelf.c:3244
 msgid "  Owner          Size\n"
 msgstr "  Propietario          Tamaño\n"
 
-#: src/readelf.c:3013
+#: src/readelf.c:3270
 #, c-format
 msgid "  %-13s  %4<PRIu32>\n"
 msgstr "  %-13s  %4<PRIu32>\n"
 
-#: src/readelf.c:3045
+#: src/readelf.c:3302
 #, c-format
 msgid "    %-4u %12<PRIu32>\n"
 msgstr "    %-4u %12<PRIu32>\n"
 
-#: src/readelf.c:3050
+#: src/readelf.c:3307
 #, c-format
 msgid "    File: %11<PRIu32>\n"
 msgstr "    File: %11<PRIu32>\n"
 
-#: src/readelf.c:3085
+#: src/readelf.c:3342
 #, c-format
 msgid "      %s: %<PRId64>, %s\n"
 msgstr "      %s: %<PRId64>, %s\n"
 
-#: src/readelf.c:3088
+#: src/readelf.c:3345
 #, c-format
 msgid "      %s: %<PRId64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:3091
+#: src/readelf.c:3348
 #, c-format
 msgid "      %s: %s\n"
 msgstr "      %s: %s\n"
 
-#: src/readelf.c:3098
+#: src/readelf.c:3355
 #, c-format
 msgid "      %u: %<PRId64>\n"
 msgstr "      %u: %<PRId64>\n"
 
-#: src/readelf.c:3101
+#: src/readelf.c:3358
 #, c-format
 msgid "      %u: %s\n"
 msgstr "      %u: %s\n"
 
-#: src/readelf.c:3137
+#: src/readelf.c:3403
 #, c-format
 msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3140
+#: src/readelf.c:3406
 #, c-format
 msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3145
+#: src/readelf.c:3411
 #, c-format
 msgid "%#<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%#<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3148
+#: src/readelf.c:3414
 #, c-format
 msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%#0*<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3154
+#: src/readelf.c:3420
 #, c-format
 msgid "%s+%#<PRIx64> <%s>"
 msgstr "%s+%#<PRIx64> <%s>"
 
-#: src/readelf.c:3157
+#: src/readelf.c:3423
 #, c-format
 msgid "%s+%#0*<PRIx64> <%s>"
 msgstr "%s+%#0*<PRIx64> <%s>"
 
-#: src/readelf.c:3161
+#: src/readelf.c:3427
 #, c-format
 msgid "%#<PRIx64> <%s>"
 msgstr "%#<PRIx64> <%s>"
 
-#: src/readelf.c:3164
+#: src/readelf.c:3430
 #, c-format
 msgid "%#0*<PRIx64> <%s>"
 msgstr "%#0*<PRIx64> <%s>"
 
-#: src/readelf.c:3169
+#: src/readelf.c:3435
 #, c-format
 msgid "%s+%#<PRIx64>"
 msgstr "%s+%#<PRIx64>"
 
-#: src/readelf.c:3172
+#: src/readelf.c:3438
 #, c-format
 msgid "%s+%#0*<PRIx64>"
 msgstr "%s+%#0*<PRIx64>"
 
-#: src/readelf.c:3554
+#: src/readelf.c:3820
 msgid "empty block"
 msgstr "bloque vacío"
 
-#: src/readelf.c:3557
+#: src/readelf.c:3823
 #, c-format
 msgid "%zu byte block:"
 msgstr "bloque de byte %zu:"
 
-#: src/readelf.c:3934
+#: src/readelf.c:4217
 #, c-format
 msgid "%*s[%4<PRIuMAX>] %s  <TRUNCATED>\n"
 msgstr "%*s[%4<PRIuMAX>] %s  <TRUNCATED>\n"
 
-#: src/readelf.c:3970
+#: src/readelf.c:4274
 #, c-format
 msgid "%s %#<PRIx64> used with different address sizes"
 msgstr "%s %#<PRIx64> utilizado con direcciones de diferente tamaño"
 
-#: src/readelf.c:3977
+#: src/readelf.c:4281
 #, c-format
 msgid "%s %#<PRIx64> used with different offset sizes"
 msgstr "%s %#<PRIx64> utilizado con offsetr de diferente tamaño"
 
-#: src/readelf.c:4057
+#: src/readelf.c:4288
+#, fuzzy, c-format
+msgid "%s %#<PRIx64> used with different base addresses"
+msgstr "%s %#<PRIx64> utilizado con direcciones de diferente tamaño"
+
+#: src/readelf.c:4370
 #, 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:4065
+#: src/readelf.c:4378
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
 msgstr " [%6tx]  <MATERIAL INUTIL NO UTILIZADO> ... %<PRIu64> bytes ...\n"
 
-#: src/readelf.c:4087
+#: src/readelf.c:4404
 #, c-format
 msgid ""
 "\n"
@@ -5131,7 +5262,7 @@ msgstr ""
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
 " [ Código]\n"
 
-#: src/readelf.c:4095
+#: src/readelf.c:4412
 #, c-format
 msgid ""
 "\n"
@@ -5140,30 +5271,30 @@ msgstr ""
 "\n"
 "Sección de abreviatura en compensación %<PRIu64>:\n"
 
-#: src/readelf.c:4108
+#: src/readelf.c:4425
 #, c-format
 msgid " *** error while reading abbreviation: %s\n"
 msgstr " *** error en lectura de abreviatura: %s\n"
 
-#: src/readelf.c:4124
+#: src/readelf.c:4441
 #, c-format
 msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
 msgstr " [%5u] compensación: %<PRId64>, hijos: %s, etiqueta: %s\n"
 
-#: src/readelf.c:4127
+#: src/readelf.c:4444
 msgid "yes"
 msgstr "sí"
 
-#: src/readelf.c:4127
+#: src/readelf.c:4444
 msgid "no"
 msgstr "no"
 
-#: src/readelf.c:4162
+#: src/readelf.c:4478 src/readelf.c:4551
 #, c-format
 msgid "cannot get .debug_aranges content: %s"
 msgstr "no se ha podido obtener contenido de .debug_aranges: %s"
 
-#: src/readelf.c:4167
+#: src/readelf.c:4493
 #, c-format
 msgid ""
 "\n"
@@ -5178,12 +5309,12 @@ msgstr[1] ""
 "\n"
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entradas %zu:\n"
 
-#: src/readelf.c:4198
+#: src/readelf.c:4524
 #, c-format
 msgid " [%*zu] ???\n"
 msgstr " [%*zu] ???\n"
 
-#: src/readelf.c:4200
+#: src/readelf.c:4526
 #, c-format
 msgid ""
 " [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
@@ -5191,13 +5322,8 @@ msgstr ""
 " Inicio [%*zu]: %0#*<PRIx64>, longitud: %5<PRIu64>, compensación CU DIE: "
 "%6<PRId64>\n"
 
-#: src/readelf.c:4219
-#, c-format
-msgid "cannot get .debug_ranges content: %s"
-msgstr "no se ha podido obtener contenido de .debug_ranges: %s"
-
-#: src/readelf.c:4224 src/readelf.c:4728 src/readelf.c:5505 src/readelf.c:6006
-#: src/readelf.c:6121 src/readelf.c:6277 src/readelf.c:6699
+#: src/readelf.c:4556 src/readelf.c:4710 src/readelf.c:5231 src/readelf.c:6145
+#: src/readelf.c:6646 src/readelf.c:6766 src/readelf.c:6922 src/readelf.c:7345
 #, c-format
 msgid ""
 "\n"
@@ -5206,37 +5332,115 @@ msgstr ""
 "\n"
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
 
-#: src/readelf.c:4248 src/readelf.c:6031
+#: src/readelf.c:4569 src/readelf.c:6171
+#, c-format
+msgid ""
+"\n"
+"Table at offset %Zu:\n"
+msgstr ""
+"\n"
+"Tabla en compensación %Zu:\n"
+
+#: src/readelf.c:4573 src/readelf.c:5255 src/readelf.c:6180
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr "Datos inválidos en sección [%zu] '%s'"
+
+#: src/readelf.c:4589
+#, fuzzy, c-format
+msgid ""
+"\n"
+" Length:        %6<PRIu64>\n"
+msgstr " (compensación: %#<PRIx64>)"
+
+#: src/readelf.c:4601
+#, fuzzy, c-format
+msgid " DWARF version: %6<PRIuFAST16>\n"
+msgstr "      %s: %<PRId64>\n"
+
+#: src/readelf.c:4605
+#, c-format
+msgid "unsupported aranges version"
+msgstr ""
+
+#: src/readelf.c:4616
+#, fuzzy, c-format
+msgid " CU offset:     %6<PRIx64>\n"
+msgstr " (compensación: %#<PRIx64>)"
+
+#: src/readelf.c:4622
+#, fuzzy, c-format
+msgid " Address size:  %6<PRIu64>\n"
+msgstr " (fin de compensación: %#<PRIx64>)"
+
+#: src/readelf.c:4626
+#, fuzzy, c-format
+msgid "unsupported address size"
+msgstr "no hay valor de dirección"
+
+#: src/readelf.c:4631
+#, fuzzy, c-format
+msgid ""
+" Segment size:  %6<PRIu64>\n"
+"\n"
+msgstr " establecer archivo a %<PRIu64>\n"
+
+#: src/readelf.c:4635
+#, c-format
+msgid "unsupported segment size"
+msgstr ""
+
+#: src/readelf.c:4675
+#, fuzzy, c-format
+msgid "   %s..%s (%<PRIx64>)\n"
+msgstr "      %s: %<PRId64>\n"
+
+#: src/readelf.c:4678
+#, fuzzy, c-format
+msgid "   %s..%s\n"
+msgstr " [%6tx]  %s..%s\n"
+
+#: src/readelf.c:4687
+#, c-format
+msgid "   %Zu padding bytes\n"
+msgstr ""
+
+#: src/readelf.c:4705
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr "no se ha podido obtener contenido de .debug_ranges: %s"
+
+#: src/readelf.c:4735 src/readelf.c:6673
 #, c-format
 msgid " [%6tx]  <INVALID DATA>\n"
 msgstr " [%6tx]  <DATOS INVÁLIDOS>\n"
 
-#: src/readelf.c:4270 src/readelf.c:6053
+#: src/readelf.c:4757 src/readelf.c:6695
 #, c-format
 msgid " [%6tx]  base address %s\n"
 msgstr " [%6tx]   (dirección base) %s\n"
 
-#: src/readelf.c:4276 src/readelf.c:6059
+#: src/readelf.c:4764 src/readelf.c:6702
 #, c-format
 msgid " [%6tx]  empty list\n"
 msgstr " [%6tx]  lista vacía\n"
 
-#: src/readelf.c:4285
+#: src/readelf.c:4775
 #, c-format
 msgid " [%6tx]  %s..%s\n"
 msgstr " [%6tx]  %s..%s\n"
 
-#: src/readelf.c:4287
+#: src/readelf.c:4777
 #, c-format
 msgid "           %s..%s\n"
 msgstr "           %s..%s\n"
 
-#: src/readelf.c:4717 src/readelf.c:6768 src/readelf.c:6870 src/readelf.c:7028
-#, c-format
-msgid "cannot get %s content: %s"
-msgstr "No se puede obtener el contenido %s: %s"
+#: src/readelf.c:5210
+#, fuzzy, c-format
+msgid "cannot get ELF: %s"
+msgstr "no se puede leer encabezamiento ELF: %s"
 
-#: src/readelf.c:4724
+#: src/readelf.c:5227
 #, c-format
 msgid ""
 "\n"
@@ -5246,12 +5450,7 @@ msgstr ""
 "Sección de información de marco de llamada [%2zu] '%s' en compensación "
 "%#<PRIx64>:\n"
 
-#: src/readelf.c:4752 src/readelf.c:5540
-#, c-format
-msgid "invalid data in section [%zu] '%s'"
-msgstr "Datos inválidos en sección [%zu] '%s'"
-
-#: src/readelf.c:4774
+#: src/readelf.c:5277
 #, c-format
 msgid ""
 "\n"
@@ -5260,50 +5459,50 @@ msgstr ""
 "\n"
 " [%6tx] Terminator cero\n"
 
-#: src/readelf.c:4859
+#: src/readelf.c:5362
 #, c-format
 msgid "invalid augmentation length"
 msgstr "longitud de aumento inválida"
 
-#: src/readelf.c:4871
+#: src/readelf.c:5374
 msgid "FDE address encoding: "
 msgstr "Codificación de dirección FDE:"
 
-#: src/readelf.c:4877
+#: src/readelf.c:5380
 msgid "LSDA pointer encoding: "
 msgstr "Codificación de puntero LSDA:"
 
-#: src/readelf.c:4975
+#: src/readelf.c:5491
 #, c-format
 msgid " (offset: %#<PRIx64>)"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:4982
+#: src/readelf.c:5498
 #, c-format
 msgid " (end offset: %#<PRIx64>)"
 msgstr " (fin de compensación: %#<PRIx64>)"
 
-#: src/readelf.c:5009
+#: src/readelf.c:5525
 #, c-format
 msgid "   %-26sLSDA pointer: %#<PRIx64>\n"
 msgstr "Puntero   %-26sLSDA: %#<PRIx64>\n"
 
-#: src/readelf.c:5060
+#: src/readelf.c:5577
 #, c-format
 msgid "cannot get attribute code: %s"
 msgstr "No se puede obtener código de atributo: %s"
 
-#: src/readelf.c:5069
+#: src/readelf.c:5586
 #, c-format
 msgid "cannot get attribute form: %s"
 msgstr "No se puede obtener forma de atributo: %s"
 
-#: src/readelf.c:5084
+#: src/readelf.c:5601
 #, c-format
 msgid "cannot get attribute value: %s"
 msgstr "No se puede obtener valor: %s"
 
-#: src/readelf.c:5342
+#: src/readelf.c:5894
 #, c-format
 msgid ""
 "\n"
@@ -5314,7 +5513,7 @@ msgstr ""
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
 " [Offset]\n"
 
-#: src/readelf.c:5374
+#: src/readelf.c:5926
 #, c-format
 msgid ""
 " Type unit at offset %<PRIu64>:\n"
@@ -5327,7 +5526,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:5383
+#: src/readelf.c:5935
 #, c-format
 msgid ""
 " Compilation unit at offset %<PRIu64>:\n"
@@ -5338,48 +5537,49 @@ 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:5409
+#: src/readelf.c:5960
 #, c-format
 msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
 msgstr "no se puede obtener DIE en compensación %<PRIu64> en sección '%s': %s"
 
-#: src/readelf.c:5421
+#: src/readelf.c:5974
 #, c-format
 msgid "cannot get DIE offset: %s"
 msgstr "no se puede obtener DIE en compensación: %s"
 
-#: src/readelf.c:5430
+#: src/readelf.c:5983
 #, c-format
 msgid "cannot get tag of DIE at offset %<PRIu64> 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:5461
+#: src/readelf.c:6015
 #, c-format
 msgid "cannot get next DIE: %s\n"
 msgstr "No se puede obtener próximo DIE: %s\n"
 
-#: src/readelf.c:5469
+#: src/readelf.c:6023
 #, c-format
 msgid "cannot get next DIE: %s"
 msgstr "No se puede obtener próximo DIE: %s"
 
-#: src/readelf.c:5518
-#, c-format
-msgid "cannot get line data section data: %s"
-msgstr "No se puede obtener sección de datos de línea: %s"
-
-#: src/readelf.c:5531
-#, c-format
+#: src/readelf.c:6059
+#, fuzzy, c-format
 msgid ""
 "\n"
-"Table at offset %Zu:\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+"\n"
 msgstr ""
 "\n"
-"Tabla en compensación %Zu:\n"
+"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
 
-#: src/readelf.c:5586
+#: src/readelf.c:6158
+#, c-format
+msgid "cannot get line data section data: %s"
+msgstr "No se puede obtener sección de datos de línea: %s"
+
+#: src/readelf.c:6226
 #, c-format
 msgid ""
 "\n"
@@ -5408,19 +5608,19 @@ msgstr ""
 "\n"
 "Códigos operativos:\n"
 
-#: src/readelf.c:5607
+#: src/readelf.c:6247
 #, 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:5622
+#: src/readelf.c:6262
 #, 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:5630
+#: src/readelf.c:6270
 msgid ""
 "\n"
 "Directory table:"
@@ -5428,7 +5628,7 @@ msgstr ""
 "\n"
 "Tabla de Directorio:"
 
-#: src/readelf.c:5646
+#: src/readelf.c:6286
 msgid ""
 "\n"
 "File name table:\n"
@@ -5438,7 +5638,7 @@ msgstr ""
 "Tabla de nombre de archivo:\n"
 " Directorio de entrada   Tiempo      Tamaño      Nombre"
 
-#: src/readelf.c:5675
+#: src/readelf.c:6315
 msgid ""
 "\n"
 "Line number statements:"
@@ -5446,214 +5646,214 @@ msgstr ""
 "\n"
 " Declaraciones de número de Línea:"
 
-#: src/readelf.c:5751
+#: src/readelf.c:6391
 #, c-format
 msgid " special opcode %u: address+%u = %s, 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:5756
+#: src/readelf.c:6396
 #, c-format
 msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
 msgstr " opcode especial %u: dirección+%u = %s, línea%+d = %zu\n"
 
-#: src/readelf.c:5776
+#: src/readelf.c:6416
 #, c-format
 msgid " extended opcode %u: "
 msgstr "  Código operativo extendido %u: "
 
-#: src/readelf.c:5781
+#: src/readelf.c:6421
 #, fuzzy
 msgid " end of sequence"
 msgstr "Fin de secuencia"
 
-#: src/readelf.c:5798
+#: src/readelf.c:6438
 #, fuzzy, c-format
 msgid " set address to %s\n"
 msgstr "Establecer dirección a %s\n"
 
-#: src/readelf.c:5819
+#: src/readelf.c:6459
 #, 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:5832
+#: src/readelf.c:6472
 #, c-format
 msgid " set discriminator to %u\n"
 msgstr " establecer discriminador a %u\n"
 
-#: src/readelf.c:5837
+#: src/readelf.c:6477
 #, fuzzy
 msgid " unknown opcode"
 msgstr "código operativo desconocido "
 
-#: src/readelf.c:5849
+#: src/readelf.c:6489
 msgid " copy"
 msgstr "Copiar"
 
-#: src/readelf.c:5860
+#: src/readelf.c:6500
 #, fuzzy, c-format
 msgid " advance address by %u to %s, op_index to %u\n"
 msgstr "dirección avanzada por %u a %s, op_index a %u\n"
 
-#: src/readelf.c:5864
+#: src/readelf.c:6504
 #, fuzzy, c-format
 msgid " advance address by %u to %s\n"
 msgstr "Dirección de avance por %u a %s\n"
 
-#: src/readelf.c:5875
+#: src/readelf.c:6515
 #, 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:5883
+#: src/readelf.c:6523
 #, c-format
 msgid " set file to %<PRIu64>\n"
 msgstr " establecer archivo a %<PRIu64>\n"
 
-#: src/readelf.c:5893
+#: src/readelf.c:6533
 #, c-format
 msgid " set column to %<PRIu64>\n"
 msgstr "  Establecer columna a %<PRIu64>\n"
 
-#: src/readelf.c:5900
+#: src/readelf.c:6540
 #, c-format
 msgid " set '%s' to %<PRIuFAST8>\n"
 msgstr "Establecer '%s' a %<PRIuFAST8>\n"
 
-#: src/readelf.c:5906
+#: src/readelf.c:6546
 msgid " set basic block flag"
 msgstr "Establecer bandera de bloque básico"
 
-#: src/readelf.c:5915
+#: src/readelf.c:6555
 #, fuzzy, c-format
 msgid " advance address by constant %u to %s, op_index to %u\n"
 msgstr "dirección avanzada por constante %u a %s, op_index a %u\n"
 
-#: src/readelf.c:5919
+#: src/readelf.c:6559
 #, fuzzy, c-format
 msgid " advance address by constant %u to %s\n"
 msgstr "Dirección de avance por constante %u a %s\n"
 
-#: src/readelf.c:5937
+#: src/readelf.c:6577
 #, fuzzy, c-format
 msgid " advance address by fixed value %u to %s\n"
 msgstr "dirección de avance por valor corregido %u a %s\n"
 
-#: src/readelf.c:5946
+#: src/readelf.c:6586
 msgid " set prologue end flag"
 msgstr " Establecer bandera prologue_end"
 
-#: src/readelf.c:5951
+#: src/readelf.c:6591
 msgid " set epilogue begin flag"
 msgstr " Establecer bandera epilogue_begin"
 
-#: src/readelf.c:5960
+#: src/readelf.c:6600
 #, c-format
 msgid " set isa to %u\n"
 msgstr " establecer isa para %u\n"
 
-#: src/readelf.c:5969
+#: src/readelf.c:6609
 #, 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:6001
+#: src/readelf.c:6641
 #, c-format
 msgid "cannot get .debug_loc content: %s"
 msgstr "no es posible obtener contenido de .debug_loc: %s"
 
-#: src/readelf.c:6071
+#: src/readelf.c:6716
 #, c-format
 msgid " [%6tx]  %s..%s"
 msgstr " [%6tx]  %s..%s"
 
-#: src/readelf.c:6073
+#: src/readelf.c:6718
 #, c-format
 msgid "           %s..%s"
 msgstr "           %s..%s"
 
-#: src/readelf.c:6080
+#: src/readelf.c:6725
 msgid "   <INVALID DATA>\n"
 msgstr "   <DATOS INVÁLIDOS>\n"
 
-#: src/readelf.c:6132 src/readelf.c:6286
+#: src/readelf.c:6777 src/readelf.c:6931
 #, 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:6211
+#: src/readelf.c:6856
 #, 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:6327
+#: src/readelf.c:6972
 #, fuzzy, c-format
 msgid " Offset:             0x%<PRIx64>\n"
 msgstr "  Propietario          Tamaño\n"
 
-#: src/readelf.c:6339
+#: src/readelf.c:6984
 #, fuzzy, c-format
 msgid " Version:            %<PRIu16>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:6345 src/readelf.c:7055
+#: src/readelf.c:6990 src/readelf.c:7703
 #, c-format
 msgid "  unknown version, cannot parse section\n"
 msgstr ""
 
-#: src/readelf.c:6352
+#: src/readelf.c:6997
 #, fuzzy, c-format
 msgid " Flag:               0x%<PRIx8>\n"
 msgstr "  Dirección de punto de entrada:               %#<PRIx64>\n"
 
-#: src/readelf.c:6355
+#: src/readelf.c:7000
 #, fuzzy, c-format
 msgid " Offset length:      %<PRIu8>\n"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:6363
+#: src/readelf.c:7008
 #, fuzzy, c-format
 msgid " .debug_line offset: 0x%<PRIx64>\n"
 msgstr " (fin de compensación: %#<PRIx64>)"
 
-#: src/readelf.c:6375
+#: src/readelf.c:7021
 #, fuzzy, c-format
 msgid "  extension opcode table, %<PRIu8> items:\n"
 msgstr " opcódigo con parámetro %<PRIu8> desconocido:"
 
-#: src/readelf.c:6382
+#: src/readelf.c:7028
 #, c-format
 msgid "    [%<PRIx8>]"
 msgstr ""
 
-#: src/readelf.c:6394
+#: src/readelf.c:7040
 #, fuzzy, c-format
 msgid " %<PRIu8> arguments:"
 msgstr "  [%*<PRIuFAST8>]  argumento %hhu \n"
 
-#: src/readelf.c:6422
+#: src/readelf.c:7068
 #, c-format
 msgid " no arguments."
 msgstr ""
 
-#: src/readelf.c:6657
+#: src/readelf.c:7303
 #, c-format
 msgid "vendor opcode not verified?"
 msgstr ""
 
-#: src/readelf.c:6685
+#: src/readelf.c:7331
 #, 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:6726
+#: src/readelf.c:7372
 #, c-format
 msgid ""
 "\n"
@@ -5664,12 +5864,12 @@ msgstr ""
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
 " %*s  String\n"
 
-#: src/readelf.c:6740
+#: src/readelf.c:7386
 #, c-format
 msgid " *** error while reading strings: %s\n"
 msgstr " *** error en lectura de cadenas: %s\n"
 
-#: src/readelf.c:6760
+#: src/readelf.c:7406
 #, c-format
 msgid ""
 "\n"
@@ -5678,7 +5878,7 @@ msgstr ""
 "\n"
 "Sección de tabla de búsqueda de marco de llamada [%2zu] '.eh_frame_hdr':\n"
 
-#: src/readelf.c:6862
+#: src/readelf.c:7508
 #, c-format
 msgid ""
 "\n"
@@ -5687,22 +5887,22 @@ msgstr ""
 "\n"
 "Excepción en el manejo de la sección de tabla [%2zu] '.gcc_except_table':\n"
 
-#: src/readelf.c:6885
+#: src/readelf.c:7531
 #, c-format
 msgid " LPStart encoding:    %#x "
 msgstr "Codificación LPStart:    %#x "
 
-#: src/readelf.c:6897
+#: src/readelf.c:7543
 #, c-format
 msgid " TType encoding:      %#x "
 msgstr "Codificación TType:      %#x "
 
-#: src/readelf.c:6911
+#: src/readelf.c:7557
 #, c-format
 msgid " Call site encoding:  %#x "
 msgstr "Codificación de sitio de llamada:  %#x "
 
-#: src/readelf.c:6924
+#: src/readelf.c:7570
 msgid ""
 "\n"
 " Call site table:"
@@ -5710,7 +5910,7 @@ msgstr ""
 "\n"
 " Tabla de sitio de llamada:"
 
-#: src/readelf.c:6938
+#: src/readelf.c:7584
 #, c-format
 msgid ""
 " [%4u] Call site start:   %#<PRIx64>\n"
@@ -5723,12 +5923,12 @@ msgstr ""
 "        Landing pad:       %#<PRIx64>\n"
 "        Action:            %u\n"
 
-#: src/readelf.c:6998
+#: src/readelf.c:7644
 #, c-format
 msgid "invalid TType encoding"
 msgstr "Codificación TType inválida"
 
-#: src/readelf.c:7019
+#: src/readelf.c:7665
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5737,37 +5937,37 @@ msgstr ""
 "\n"
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entrada %zu:\n"
 
-#: src/readelf.c:7048
+#: src/readelf.c:7694
 #, fuzzy, c-format
 msgid " Version:         %<PRId32>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:7064
+#: src/readelf.c:7712
 #, fuzzy, c-format
 msgid " CU offset:       %#<PRIx32>\n"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:7071
+#: src/readelf.c:7719
 #, fuzzy, c-format
 msgid " TU offset:       %#<PRIx32>\n"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:7078
+#: src/readelf.c:7726
 #, fuzzy, c-format
 msgid " address offset:  %#<PRIx32>\n"
 msgstr " (fin de compensación: %#<PRIx64>)"
 
-#: src/readelf.c:7085
+#: src/readelf.c:7733
 #, fuzzy, c-format
 msgid " symbol offset:   %#<PRIx32>\n"
 msgstr " (compensación: %#<PRIx64>)"
 
-#: src/readelf.c:7092
+#: src/readelf.c:7740
 #, fuzzy, c-format
 msgid " constant offset: %#<PRIx32>\n"
 msgstr " (fin de compensación: %#<PRIx64>)"
 
-#: src/readelf.c:7099
+#: src/readelf.c:7747
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5776,7 +5976,7 @@ msgstr ""
 "\n"
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entrada %zu:\n"
 
-#: src/readelf.c:7121
+#: src/readelf.c:7769
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5785,7 +5985,7 @@ msgstr ""
 "\n"
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entrada %zu:\n"
 
-#: src/readelf.c:7147
+#: src/readelf.c:7795
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5794,7 +5994,7 @@ msgstr ""
 "\n"
 "Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entrada %zu:\n"
 
-#: src/readelf.c:7174
+#: src/readelf.c:7824
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5803,17 +6003,17 @@ msgstr ""
 "\n"
 "Tabla de símbolos inválida en compensación %#0<PRIx64>\n"
 
-#: src/readelf.c:7259
+#: src/readelf.c:7909
 #, c-format
 msgid "cannot get debug context descriptor: %s"
 msgstr "no se puede depurar descriptor de contexto: %s"
 
-#: src/readelf.c:7409 src/readelf.c:8010
+#: src/readelf.c:8069 src/readelf.c:8675 src/readelf.c:8786 src/readelf.c:8844
 #, c-format
 msgid "cannot convert core note data: %s"
 msgstr "no es posible convertir datos de la nota principal: %s"
 
-#: src/readelf.c:7750
+#: src/readelf.c:8416
 #, c-format
 msgid ""
 "\n"
@@ -5822,21 +6022,21 @@ msgstr ""
 "\n"
 "%*s... <repeats %u more times> ..."
 
-#: src/readelf.c:8109
+#: src/readelf.c:8919
 msgid "  Owner          Data size  Type\n"
 msgstr "  Owner          Data size  Type\n"
 
-#: src/readelf.c:8127
+#: src/readelf.c:8937
 #, c-format
 msgid "  %-13.*s  %9<PRId32>  %s\n"
 msgstr "  %-13.*s  %9<PRId32>  %s\n"
 
-#: src/readelf.c:8161
+#: src/readelf.c:8987
 #, c-format
 msgid "cannot get content of note section: %s"
 msgstr "no se puede obtener el contenido de sección de nota: %s"
 
-#: src/readelf.c:8188
+#: src/readelf.c:9014
 #, c-format
 msgid ""
 "\n"
@@ -5845,7 +6045,7 @@ msgstr ""
 "\n"
 "Sección de nota [%2zu] '%s' de %<PRIu64> bytes en compensación %#0<PRIx64>:\n"
 
-#: src/readelf.c:8211
+#: src/readelf.c:9037
 #, c-format
 msgid ""
 "\n"
@@ -5854,7 +6054,7 @@ msgstr ""
 "\n"
 "Segmento de nota de %<PRIu64> bytes en compensación %#0<PRIx64>:\n"
 
-#: src/readelf.c:8257
+#: src/readelf.c:9083
 #, c-format
 msgid ""
 "\n"
@@ -5863,12 +6063,12 @@ msgstr ""
 "\n"
 "Sección [%Zu] '%s' no tiene datos para volcar.\n"
 
-#: src/readelf.c:8263 src/readelf.c:8286
+#: src/readelf.c:9089 src/readelf.c:9112
 #, 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:8267
+#: src/readelf.c:9093
 #, c-format
 msgid ""
 "\n"
@@ -5878,7 +6078,7 @@ msgstr ""
 "Volcado Hex de sección [%Zu] '%s', %<PRIu64> bytes en compensación "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:8280
+#: src/readelf.c:9106
 #, c-format
 msgid ""
 "\n"
@@ -5887,7 +6087,7 @@ msgstr ""
 "\n"
 "Sección [%Zu] '%s' no tiene datos para volcar.\n"
 
-#: src/readelf.c:8290
+#: src/readelf.c:9116
 #, c-format
 msgid ""
 "\n"
@@ -5897,7 +6097,7 @@ msgstr ""
 "Sección de cadena [%Zu] '%s' contiene %<PRIu64> bytes en compensación "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:8338
+#: src/readelf.c:9164
 #, c-format
 msgid ""
 "\n"
@@ -5906,7 +6106,7 @@ msgstr ""
 "\n"
 "sección [%lu] no existe"
 
-#: src/readelf.c:8367
+#: src/readelf.c:9193
 #, c-format
 msgid ""
 "\n"
@@ -5915,12 +6115,12 @@ msgstr ""
 "\n"
 "sección '%s' no existe"
 
-#: src/readelf.c:8424
+#: src/readelf.c:9250
 #, 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:8427
+#: src/readelf.c:9253
 #, c-format
 msgid ""
 "\n"
@@ -5929,7 +6129,7 @@ msgstr ""
 "\n"
 "Archivo '%s' no tiene índice de símbolo\n"
 
-#: src/readelf.c:8431
+#: src/readelf.c:9257
 #, c-format
 msgid ""
 "\n"
@@ -5938,12 +6138,12 @@ msgstr ""
 "\n"
 "Índice de archivo '%s' tiene %Zu entradas:\n"
 
-#: src/readelf.c:8449
+#: src/readelf.c:9275
 #, 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:8454
+#: src/readelf.c:9280
 #, c-format
 msgid "Archive member '%s' contains:\n"
 msgstr "Miembro de archivo contiene '%s':\n"
@@ -6009,12 +6209,12 @@ msgstr "Radical inválido: %s"
 msgid "%s: file format not recognized"
 msgstr "%s: No se reconoce el formato del fichero"
 
-#: src/size.c:438 src/size.c:581
+#: src/size.c:438 src/size.c:571
 #, c-format
 msgid " (ex %s)"
 msgstr " (ex %s)"
 
-#: src/size.c:606
+#: src/size.c:596
 msgid "(TOTALS)\n"
 msgstr "(TOTALES)\n"
 
@@ -6054,27 +6254,27 @@ msgstr "Alias para --radix=o"
 msgid "Print the strings of printable characters in files."
 msgstr "Imprimir las cadenas de caracteres imprimibles en archivos."
 
-#: src/strings.c:260 src/strings.c:295
+#: src/strings.c:267 src/strings.c:302
 #, c-format
 msgid "invalid value '%s' for %s parameter"
 msgstr "Valor inválido '%s' para parámetro %s"
 
-#: src/strings.c:306
+#: src/strings.c:313
 #, c-format
 msgid "invalid minimum length of matched string size"
 msgstr "longitud mínima inválida de tamaño de cadena coincidente"
 
-#: src/strings.c:591
+#: src/strings.c:596
 #, c-format
 msgid "lseek64 failed"
 msgstr "lseek64 falló"
 
-#: src/strings.c:608 src/strings.c:672
+#: src/strings.c:613 src/strings.c:677
 #, c-format
 msgid "re-mmap failed"
 msgstr "re-mmap falló"
 
-#: src/strings.c:645
+#: src/strings.c:650
 #, c-format
 msgid "mprotect failed"
 msgstr "mprotect falló"
@@ -6142,7 +6342,7 @@ msgstr "opción -f especificada dos veces"
 msgid "-F option specified twice"
 msgstr "opción -F especificada dos veces"
 
-#: src/strip.c:249 src/unstrip.c:117
+#: src/strip.c:249 src/unstrip.c:121
 #, c-format
 msgid "-o option specified twice"
 msgstr "opción -o especificada dos veces"
@@ -6167,87 +6367,87 @@ msgstr "mientras se abría '%s'"
 msgid "%s: cannot use -o or -f when stripping archive"
 msgstr "%s: no puede utilizarse -o o -f cuando se extrae un archivo"
 
-#: src/strip.c:467
+#: src/strip.c:468
 #, c-format
 msgid "cannot open EBL backend"
 msgstr "No se puede abrir el segundo plano EBL"
 
-#: src/strip.c:517 src/strip.c:541
+#: src/strip.c:518 src/strip.c:542
 #, c-format
 msgid "cannot create new file '%s': %s"
 msgstr "no se puede crear fichero nuevo '%s': %s"
 
-#: src/strip.c:601
+#: src/strip.c:608
 #, c-format
 msgid "illformed file '%s'"
 msgstr "Fichero illformed '%s'"
 
-#: src/strip.c:905 src/strip.c:994
+#: src/strip.c:930 src/strip.c:1019
 #, c-format
 msgid "while generating output file: %s"
 msgstr "al generar fichero de salida: %s"
 
-#: src/strip.c:967 src/strip.c:1929
+#: src/strip.c:992 src/strip.c:1957
 #, c-format
 msgid "%s: error while creating ELF header: %s"
 msgstr "%s: error al crear encabezamiento ELF: %s"
 
-#: src/strip.c:981
+#: src/strip.c:1006
 #, c-format
 msgid "while preparing output for '%s'"
 msgstr "al preparar salida para '%s'"
 
-#: src/strip.c:1032 src/strip.c:1088
+#: src/strip.c:1057 src/strip.c:1114
 #, c-format
 msgid "while create section header section: %s"
 msgstr "al crear sección de encabezamiento de sección: %s"
 
-#: src/strip.c:1038
+#: src/strip.c:1063
 #, c-format
 msgid "cannot allocate section data: %s"
 msgstr "no se puede asignar espacio para los datos: %s"
 
-#: src/strip.c:1097
+#: src/strip.c:1123
 #, c-format
 msgid "while create section header string table: %s"
 msgstr "al crear tabla de cadenas de encabezamiento de sección: %s"
 
-#: src/strip.c:1724
+#: src/strip.c:1752
 #, fuzzy, c-format
 msgid "bad relocation"
 msgstr "Mostrar reubicaciones"
 
-#: src/strip.c:1841 src/strip.c:1951
+#: src/strip.c:1869 src/strip.c:1979
 #, c-format
 msgid "while writing '%s': %s"
 msgstr "al escribir '%s': %s"
 
-#: src/strip.c:1852
+#: src/strip.c:1880
 #, c-format
 msgid "while creating '%s'"
 msgstr "al crear '%s'"
 
-#: src/strip.c:1874
+#: src/strip.c:1902
 #, c-format
 msgid "while computing checksum for debug information"
 msgstr "al computar la suma de verificación para información de depuración"
 
-#: src/strip.c:1937
+#: src/strip.c:1965
 #, c-format
 msgid "%s: error while reading the file: %s"
 msgstr "%s: error al leer el fichero: %s"
 
-#: src/strip.c:1976 src/strip.c:1996
+#: src/strip.c:2004 src/strip.c:2024
 #, c-format
 msgid "while writing '%s'"
 msgstr "al escribir '%s'"
 
-#: src/strip.c:2030 src/strip.c:2037
+#: src/strip.c:2061 src/strip.c:2068
 #, c-format
 msgid "error while finishing '%s': %s"
 msgstr "Error al terminar '%s': %s"
 
-#: src/strip.c:2060 src/strip.c:2117
+#: src/strip.c:2091 src/strip.c:2148
 #, c-format
 msgid "cannot set access and modification date of '%s'"
 msgstr "no es posible establecer acceso y fecha de modificación de '%s'"
@@ -6286,211 +6486,215 @@ msgstr "Aplicar reubicaciones a contenido de sección en archivos ET_REL"
 msgid "Only list module and file names, build IDs"
 msgstr "Solamente listar módulo y nombres de archivo, crear los ID"
 
-#: src/unstrip.c:126
+#: src/unstrip.c:86
+msgid "Force combining files even if some ELF headers don't seem to match"
+msgstr ""
+
+#: src/unstrip.c:130
 #, c-format
 msgid "-d option specified twice"
 msgstr "opción -d especificada dos veces"
 
-#: src/unstrip.c:158
+#: src/unstrip.c:165
 #, c-format
 msgid "only one of -o or -d allowed"
 msgstr "Sólo se permite usar -o ó -d "
 
-#: src/unstrip.c:167
+#: src/unstrip.c:174
 #, c-format
 msgid "-n cannot be used with explicit files or -o or -d"
 msgstr "-n no puede utilizarse con archivos explícitos o con -o ó -d"
 
-#: src/unstrip.c:182
+#: src/unstrip.c:189
 #, c-format
 msgid "output directory '%s'"
 msgstr "Directorio de salida '%s'"
 
-#: src/unstrip.c:191
+#: src/unstrip.c:198
 #, c-format
 msgid "exactly two file arguments are required"
 msgstr "dos argumentos de archivos se requieren exactamente"
 
-#: src/unstrip.c:197
+#: src/unstrip.c:204
 #, c-format
 msgid "-m, -a, -R, and -i options not allowed with explicit files"
 msgstr "No se permiten las opciones -m, -a, -R, ni -i con archivos explícitos"
 
-#: src/unstrip.c:210
+#: src/unstrip.c:217
 #, c-format
 msgid "-o or -d is required when using implicit files"
 msgstr "se requiere -o ó -d cuando se utilizan archivos implícitos"
 
-#: src/unstrip.c:246
+#: src/unstrip.c:253
 #, c-format
 msgid "cannot create ELF header: %s"
 msgstr "no se puede crear el encabezamiento ELF: %s"
 
-#: src/unstrip.c:251
+#: src/unstrip.c:258
 #, c-format
 msgid "cannot copy ELF header: %s"
 msgstr "no se puede copiar encabezamiento ELF: %s"
 
-#: src/unstrip.c:256 src/unstrip.c:1820
+#: src/unstrip.c:263 src/unstrip.c:1828
 #, c-format
 msgid "cannot create program headers: %s"
 msgstr "No pueden crear encabezamientos de programa: %s"
 
-#: src/unstrip.c:262
+#: src/unstrip.c:269
 #, c-format
 msgid "cannot copy program header: %s"
 msgstr "no puede copiar encabezamiento de programa: %s"
 
-#: src/unstrip.c:272
+#: src/unstrip.c:279
 #, c-format
 msgid "cannot copy section header: %s"
 msgstr "no se puede copiar encabezamiento de sección: %s"
 
-#: src/unstrip.c:275 src/unstrip.c:1501
+#: src/unstrip.c:282 src/unstrip.c:1509
 #, c-format
 msgid "cannot get section data: %s"
 msgstr "no se pueden obtener datos de sección: %s"
 
-#: src/unstrip.c:277 src/unstrip.c:1503
+#: src/unstrip.c:284 src/unstrip.c:1511
 #, c-format
 msgid "cannot copy section data: %s"
 msgstr "no pueden copiar datos de sección: %s"
 
-#: src/unstrip.c:301
+#: src/unstrip.c:308
 #, c-format
 msgid "cannot create directory '%s'"
 msgstr "no se puede crear el directorio '%s'"
 
-#: src/unstrip.c:341 src/unstrip.c:758 src/unstrip.c:1535
+#: src/unstrip.c:348 src/unstrip.c:765 src/unstrip.c:1543
 #, c-format
 msgid "cannot get symbol table entry: %s"
 msgstr "no se puede obtener entrada de tabla de símbolos: %s"
 
-#: src/unstrip.c:357 src/unstrip.c:575 src/unstrip.c:596 src/unstrip.c:608
-#: src/unstrip.c:1556 src/unstrip.c:1686 src/unstrip.c:1710
+#: src/unstrip.c:364 src/unstrip.c:582 src/unstrip.c:603 src/unstrip.c:615
+#: src/unstrip.c:1564 src/unstrip.c:1694 src/unstrip.c:1718
 #, c-format
 msgid "cannot update symbol table: %s"
 msgstr "no se puede actualizar tabla de símbolos: %s"
 
-#: src/unstrip.c:367
+#: src/unstrip.c:374
 #, c-format
 msgid "cannot update section header: %s"
 msgstr "no se puede actualizar encabezamiento de sección: %s"
 
-#: src/unstrip.c:406 src/unstrip.c:417
+#: src/unstrip.c:413 src/unstrip.c:424
 #, c-format
 msgid "cannot update relocation: %s"
 msgstr "no se puede actualizar reubicación: %s"
 
-#: src/unstrip.c:504
+#: src/unstrip.c:511
 #, c-format
 msgid "cannot get symbol version: %s"
 msgstr "no se puede obtener versión de símbolo: %s"
 
-#: src/unstrip.c:516
+#: src/unstrip.c:523
 #, 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:764
+#: src/unstrip.c:771
 #, c-format
 msgid "invalid string offset in symbol [%Zu]"
 msgstr "compensación de cadena inválida en símbolo [%Zu]"
 
-#: src/unstrip.c:906 src/unstrip.c:1246
+#: src/unstrip.c:913 src/unstrip.c:1254
 #, c-format
 msgid "cannot read section [%Zu] name: %s"
 msgstr "no se puede leer nombre [%Zu]: %s"
 
-#: src/unstrip.c:947 src/unstrip.c:966 src/unstrip.c:999
+#: src/unstrip.c:954 src/unstrip.c:973 src/unstrip.c:1006
 #, c-format
 msgid "cannot read '.gnu.prelink_undo' section: %s"
 msgstr "no se puede leer sección '.gnu.prelink_undo': %s"
 
-#: src/unstrip.c:987
+#: src/unstrip.c:994
 #, c-format
 msgid "invalid contents in '%s' section"
 msgstr "contenido inválido en sección '%s'"
 
-#: src/unstrip.c:1042 src/unstrip.c:1366
+#: src/unstrip.c:1049 src/unstrip.c:1374
 #, c-format
 msgid "cannot find matching section for [%Zu] '%s'"
 msgstr "no se puede hallar sección coincidente para [%Zu] '%s'"
 
-#: src/unstrip.c:1166 src/unstrip.c:1181 src/unstrip.c:1447
+#: src/unstrip.c:1174 src/unstrip.c:1189 src/unstrip.c:1455
 #, 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:1190
+#: src/unstrip.c:1198
 #, 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:1217 src/unstrip.c:1221
+#: src/unstrip.c:1225 src/unstrip.c:1229
 #, 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:1225 src/unstrip.c:1229 src/unstrip.c:1462
+#: src/unstrip.c:1233 src/unstrip.c:1237 src/unstrip.c:1470
 #, c-format
 msgid "cannot get section count: %s"
 msgstr "No se puede obtener cuenta de sección: %s"
 
-#: src/unstrip.c:1232
+#: src/unstrip.c:1240
 #, 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:1291 src/unstrip.c:1381
+#: src/unstrip.c:1299 src/unstrip.c:1389
 #, 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:1441
+#: src/unstrip.c:1449
 #, c-format
 msgid "cannot add new section: %s"
 msgstr "No se puede añadir nueva sección: %s"
 
-#: src/unstrip.c:1543
+#: src/unstrip.c:1551
 #, c-format
 msgid "symbol [%Zu] has invalid section index"
 msgstr "símbolo [%Zu] tiene índice de sección inválido"
 
-#: src/unstrip.c:1781
+#: src/unstrip.c:1789
 #, c-format
 msgid "cannot read section data: %s"
 msgstr "no se puede leer la sección de datos: %s"
 
-#: src/unstrip.c:1802
+#: src/unstrip.c:1810
 #, c-format
 msgid "cannot get ELF header: %s"
 msgstr "no se puede leer encabezamiento ELF: %s"
 
-#: src/unstrip.c:1830
+#: src/unstrip.c:1838
 #, c-format
 msgid "cannot update program header: %s"
 msgstr "no se puede actualizar encabezamiento de programa: %s"
 
-#: src/unstrip.c:1835 src/unstrip.c:1914
+#: src/unstrip.c:1843 src/unstrip.c:1922
 #, c-format
 msgid "cannot write output file: %s"
 msgstr "no se puede escribir al archivo de salida: %s"
 
-#: src/unstrip.c:1883
+#: src/unstrip.c:1891
 #, 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:1886
+#: src/unstrip.c:1894
 #, c-format
 msgid ""
 "DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
@@ -6498,58 +6702,77 @@ msgstr ""
 "Datos DWARF en '%s' no se ajustan a polarización de pre-enlace; considere "
 "prelink -u"
 
-#: src/unstrip.c:1905 src/unstrip.c:1945 src/unstrip.c:1957 src/unstrip.c:2037
+#: src/unstrip.c:1913 src/unstrip.c:1964 src/unstrip.c:1976 src/unstrip.c:2062
 #, c-format
 msgid "cannot create ELF descriptor: %s"
 msgstr "no se puede crear un descriptor ELF: %s"
 
-#: src/unstrip.c:1963
-#, c-format
-msgid "'%s' and '%s' do not seem to match"
-msgstr "Al parecer '%s' y '%s'no coinciden"
+#: src/unstrip.c:1955
+msgid "WARNING: "
+msgstr ""
+
+#: src/unstrip.c:1957
+msgid ", use --force"
+msgstr ""
+
+#: src/unstrip.c:1980
+msgid "ELF header identification (e_ident) different"
+msgstr ""
+
+#: src/unstrip.c:1983
+msgid "ELF header type (e_type) different"
+msgstr ""
 
-#: src/unstrip.c:1994
+#: src/unstrip.c:1986
+msgid "ELF header machine type (e_machine) different"
+msgstr ""
+
+#: src/unstrip.c:1989
+msgid "stripped program header (e_phnum) smaller than unstripped"
+msgstr ""
+
+#: src/unstrip.c:2019
 #, 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:1998
+#: src/unstrip.c:2023
 #, 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:2013
+#: src/unstrip.c:2038
 #, 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:2017
+#: src/unstrip.c:2042
 #, 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:2030
+#: src/unstrip.c:2055
 #, c-format
 msgid "module '%s' file '%s' is not stripped"
 msgstr "No se obtuvo el archivo '%s' de módulo '%s' "
 
-#: src/unstrip.c:2061
+#: src/unstrip.c:2086
 #, 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:2194
+#: src/unstrip.c:2219
 #, c-format
 msgid "no matching modules found"
 msgstr "No se encontraron módulos coincidentes"
 
-#: src/unstrip.c:2203
+#: src/unstrip.c:2228
 #, c-format
 msgid "matched more than one module"
 msgstr "coincidió con más de un módulo"
 
-#: src/unstrip.c:2250
+#: src/unstrip.c:2275
 msgid ""
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
@@ -6557,7 +6780,7 @@ msgstr ""
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
 
-#: src/unstrip.c:2251
+#: src/unstrip.c:2276
 msgid ""
 "Combine stripped files with separate symbols and debug information.\vThe "
 "first form puts the result in DEBUG-FILE if -o was not given.\n"
@@ -6607,6 +6830,17 @@ msgstr ""
 "file.  DEBUGFILE is the separate debuginfo file name, or - if no debuginfo "
 "was found, or . if FILE contains the debug information."
 
+#, fuzzy
+#~ msgid "cannot attach to process"
+#~ msgstr "No se puede crear el árbol de búsqueda"
+
+#, fuzzy
+#~ msgid "cannot attach to core"
+#~ msgstr "No se puede crear el árbol de búsqueda"
+
+#~ msgid "'%s' and '%s' do not seem to match"
+#~ msgstr "Al parecer '%s' y '%s'no coinciden"
+
 #~ msgid "unknown tag %hx"
 #~ msgstr "etiqueta %hx desconocida"
 
index 6a4151d..54d35b1 100644 (file)
Binary files a/po/ja.gmo and b/po/ja.gmo differ
index 0632bfd..3b9afaa 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ja\n"
 "Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
-"POT-Creation-Date: 2012-08-27 20:34+0200\n"
+"POT-Creation-Date: 2014-08-27 11:26+0200\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"
@@ -19,18 +19,18 @@ msgstr ""
 "X-Generator: KBabel 1.11.4\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: lib/xmalloc.c:54 lib/xmalloc.c:68 lib/xmalloc.c:82 src/readelf.c:2842
-#: src/readelf.c:3181 src/unstrip.c:2090 src/unstrip.c:2298
+#: lib/xmalloc.c:54 lib/xmalloc.c:68 lib/xmalloc.c:82 src/readelf.c:3098
+#: src/readelf.c:3447 src/readelf.c:8018 src/unstrip.c:2115 src/unstrip.c:2323
 #, c-format
 msgid "memory exhausted"
 msgstr "メモリー消費済み"
 
-#: libasm/asm_error.c:65 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:49
+#: libasm/asm_error.c:65 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:53
 #: libelf/elf_error.c:60
 msgid "no error"
 msgstr "エラー無し"
 
-#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:51
+#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:55
 #: libelf/elf_error.c:91
 msgid "out of memory"
 msgstr "メモリー不足"
@@ -69,7 +69,7 @@ msgstr "データの出力中にエラー"
 msgid "no backend support available"
 msgstr "バックエンドサポートが利用できません"
 
-#: libasm/asm_error.c:84 libdw/dwarf_error.c:59 libdwfl/libdwflP.h:50
+#: libasm/asm_error.c:84 libdw/dwarf_error.c:59 libdwfl/libdwflP.h:54
 #: libelf/elf_error.c:63
 msgid "unknown error"
 msgstr "不明なエラー"
@@ -166,7 +166,7 @@ msgstr "不当な DWARF バージョン"
 msgid "invalid directory index"
 msgstr "不当なディレクトリー索引"
 
-#: libdw/dwarf_error.c:84 libdwfl/libdwflP.h:70
+#: libdw/dwarf_error.c:84 libdwfl/libdwflP.h:74
 msgid "address out of range"
 msgstr "アドレスが範囲外です"
 
@@ -186,7 +186,7 @@ msgstr "不当な行索引"
 msgid "invalid address range index"
 msgstr "不当なアドレス範囲索引"
 
-#: libdw/dwarf_error.c:89 libdwfl/libdwflP.h:71
+#: libdw/dwarf_error.c:89 libdwfl/libdwflP.h:75
 msgid "no matching address range"
 msgstr "アドレス範囲に対応しません"
 
@@ -210,7 +210,7 @@ msgstr "不当な CFI セクション"
 msgid "no alternative debug link found"
 msgstr ""
 
-#: libdwfl/argp-std.c:46 src/unstrip.c:2240
+#: libdwfl/argp-std.c:46 src/unstrip.c:2265
 msgid "Input selection options:"
 msgstr "選択オプションを入力してください:"
 
@@ -246,139 +246,199 @@ msgstr "全てのモジュール付きのカーネル"
 msgid "Search path for separate debuginfo files"
 msgstr "分離した debuginfo ファイルべきパスを探す"
 
-#: libdwfl/argp-std.c:142
+#: libdwfl/argp-std.c:157
 msgid "only one of -e, -p, -k, -K, or --core allowed"
 msgstr "-e か、-p、-k、-K、--core のひとつだけが認められます"
 
-#: libdwfl/argp-std.c:202
-#, c-format
-msgid "cannot read ELF core file: %s"
-msgstr "ELF コアファイルを読めません: %s"
-
-#: libdwfl/argp-std.c:220
-msgid "No modules recognized in core file"
-msgstr "コアファイルの中にモジュールを認識できません"
-
-#: libdwfl/argp-std.c:232
+#: libdwfl/argp-std.c:230
 msgid "cannot load kernel symbols"
 msgstr "カーネルシンボルをロードできません"
 
-#: libdwfl/argp-std.c:236
+#: libdwfl/argp-std.c:234
 msgid "cannot find kernel modules"
 msgstr "カーネルモジュールを見つけられません"
 
-#: libdwfl/argp-std.c:250
+#: libdwfl/argp-std.c:251
 msgid "cannot find kernel or modules"
 msgstr "カーネルかモジュールを見つけられません"
 
-#: libdwfl/libdwflP.h:52
+#: libdwfl/argp-std.c:290
+#, c-format
+msgid "cannot read ELF core file: %s"
+msgstr "ELF コアファイルを読めません: %s"
+
+#: libdwfl/argp-std.c:311
+msgid "No modules recognized in core file"
+msgstr "コアファイルの中にモジュールを認識できません"
+
+#: libdwfl/libdwflP.h:56
 msgid "See errno"
 msgstr ""
 
-#: libdwfl/libdwflP.h:53
+#: libdwfl/libdwflP.h:57
 msgid "See elf_errno"
 msgstr ""
 
-#: libdwfl/libdwflP.h:54
+#: libdwfl/libdwflP.h:58
 msgid "See dwarf_errno"
 msgstr ""
 
-#: libdwfl/libdwflP.h:55
+#: libdwfl/libdwflP.h:59
 msgid "See ebl_errno (XXX missing)"
 msgstr ""
 
-#: libdwfl/libdwflP.h:56
+#: libdwfl/libdwflP.h:60
 msgid "gzip decompression failed"
 msgstr ""
 
-#: libdwfl/libdwflP.h:57
+#: libdwfl/libdwflP.h:61
 msgid "bzip2 decompression failed"
 msgstr ""
 
-#: libdwfl/libdwflP.h:58
+#: libdwfl/libdwflP.h:62
 msgid "LZMA decompression failed"
 msgstr ""
 
-#: libdwfl/libdwflP.h:59
+#: libdwfl/libdwflP.h:63
 msgid "no support library found for machine"
 msgstr ""
 
-#: libdwfl/libdwflP.h:60
+#: libdwfl/libdwflP.h:64
 msgid "Callbacks missing for ET_REL file"
 msgstr ""
 
-#: libdwfl/libdwflP.h:61
+#: libdwfl/libdwflP.h:65
 msgid "Unsupported relocation type"
 msgstr ""
 
-#: libdwfl/libdwflP.h:62
+#: libdwfl/libdwflP.h:66
 msgid "r_offset is bogus"
 msgstr ""
 
-#: libdwfl/libdwflP.h:63 libelf/elf_error.c:111 libelf/elf_error.c:171
+#: libdwfl/libdwflP.h:67 libelf/elf_error.c:111 libelf/elf_error.c:171
 msgid "offset out of range"
 msgstr "オフセットが範囲を越えている"
 
-#: libdwfl/libdwflP.h:64
+#: libdwfl/libdwflP.h:68
 #, fuzzy
 msgid "relocation refers to undefined symbol"
 msgstr "定義されたシンボルの印刷サイズ"
 
-#: libdwfl/libdwflP.h:65
+#: libdwfl/libdwflP.h:69
 msgid "Callback returned failure"
 msgstr ""
 
-#: libdwfl/libdwflP.h:66
+#: libdwfl/libdwflP.h:70
 #, fuzzy
 msgid "No DWARF information found"
 msgstr "DWARF 情報がありません"
 
-#: libdwfl/libdwflP.h:67
+#: libdwfl/libdwflP.h:71
 msgid "No symbol table found"
 msgstr ""
 
-#: libdwfl/libdwflP.h:68
+#: libdwfl/libdwflP.h:72
 #, fuzzy
 msgid "No ELF program headers"
 msgstr "プログラムヘッダーを得られません: %s"
 
-#: libdwfl/libdwflP.h:69
+#: libdwfl/libdwflP.h:73
 msgid "address range overlaps an existing module"
 msgstr ""
 
-#: libdwfl/libdwflP.h:72
+#: libdwfl/libdwflP.h:76
 msgid "image truncated"
 msgstr ""
 
-#: libdwfl/libdwflP.h:73
+#: libdwfl/libdwflP.h:77
 #, fuzzy
 msgid "ELF file opened"
 msgstr "ファイルのオープンを追跡します。"
 
-#: libdwfl/libdwflP.h:74
+#: libdwfl/libdwflP.h:78
 #, fuzzy
 msgid "not a valid ELF file"
 msgstr "不当な ELF ファイル"
 
-#: libdwfl/libdwflP.h:75
+#: libdwfl/libdwflP.h:79
 #, fuzzy
 msgid "cannot handle DWARF type description"
 msgstr "Elf 記述子を生成できません: %s"
 
-#: libdwfl/libdwflP.h:76
+#: libdwfl/libdwflP.h:80
 msgid "ELF file does not match build ID"
 msgstr ""
 
-#: libdwfl/libdwflP.h:77
+#: libdwfl/libdwflP.h:81
 #, fuzzy
 msgid "corrupt .gnu.prelink_undo section data"
 msgstr "ラインデータセクションデータを得られません: %s"
 
+#: libdwfl/libdwflP.h:82
+msgid "Internal error due to ebl"
+msgstr ""
+
+#: libdwfl/libdwflP.h:83
+msgid "Missing data in core file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:84
+#, fuzzy
+msgid "Invalid register"
+msgstr "不当なパラメーター"
+
+#: libdwfl/libdwflP.h:85
+msgid "Error reading process memory"
+msgstr ""
+
+#: libdwfl/libdwflP.h:86
+msgid "Couldn't find architecture of any ELF"
+msgstr ""
+
+#: libdwfl/libdwflP.h:87
+msgid "Error parsing /proc filesystem"
+msgstr ""
+
+#: libdwfl/libdwflP.h:88
+#, fuzzy
+msgid "Invalid DWARF"
+msgstr "不当な DWARF"
+
+#: libdwfl/libdwflP.h:89
+msgid "Unsupported DWARF"
+msgstr ""
+
+#: libdwfl/libdwflP.h:90
+msgid "Unable to find more threads"
+msgstr ""
+
+#: libdwfl/libdwflP.h:91
+msgid "Dwfl already has attached state"
+msgstr ""
+
+#: libdwfl/libdwflP.h:92
+msgid "Dwfl has no attached state"
+msgstr ""
+
+#: libdwfl/libdwflP.h:93
+msgid "Unwinding not supported for this architecture"
+msgstr ""
+
+#: libdwfl/libdwflP.h:94
+#, fuzzy
+msgid "Invalid argument"
+msgstr "不当なパラメーター"
+
+#: libdwfl/libdwflP.h:95
+#, fuzzy
+msgid "Not an ET_CORE ELF file"
+msgstr "不当な ELF ファイル"
+
 #: libebl/eblbackendname.c:42
 msgid "No backend"
 msgstr "バックエンドがありません"
 
-#: libebl/eblcorenotetypename.c:86 libebl/eblobjecttypename.c:57
+#: libebl/eblcorenotetypename.c:102 libebl/eblobjecttypename.c:57
 #: libebl/eblobjnotetypename.c:73 libebl/eblosabiname.c:77
 #: libebl/eblsectionname.c:89 libebl/eblsectiontypename.c:119
 #: libebl/eblsegmenttypename.c:83
@@ -474,7 +534,7 @@ msgstr "ソース演算子の大きさが無効"
 msgid "invalid size of destination operand"
 msgstr "宛先演算子の大きさが無効"
 
-#: libelf/elf_error.c:87 src/readelf.c:4697
+#: libelf/elf_error.c:87 src/readelf.c:5190
 #, c-format
 msgid "invalid encoding"
 msgstr "無効なエンコード"
@@ -556,8 +616,8 @@ msgstr "データ/scnが不整合です"
 msgid "invalid section header"
 msgstr "不当なセクションヘッダー"
 
-#: libelf/elf_error.c:187 src/readelf.c:6335 src/readelf.c:6780
-#: src/readelf.c:6881 src/readelf.c:7043
+#: libelf/elf_error.c:187 src/readelf.c:6980 src/readelf.c:7426
+#: src/readelf.c:7527 src/readelf.c:7689
 #, c-format
 msgid "invalid data"
 msgstr "不当なデータ"
@@ -622,31 +682,41 @@ msgid "Also show symbol or section names"
 msgstr ""
 
 #: src/addr2line.c:64
+msgid "Also show symbol and the section names"
+msgstr ""
+
+#: src/addr2line.c:65
 msgid "Also show line table flags"
 msgstr ""
 
-#: src/addr2line.c:66
+#: src/addr2line.c:67
 msgid "Treat addresses as offsets relative to NAME section."
 msgstr ""
 
-#: src/addr2line.c:68 src/elfcmp.c:72 src/findtextrel.c:67 src/nm.c:100
+#: src/addr2line.c:69
+msgid ""
+"Show all source locations that caused inline expansion of subroutines at the "
+"address."
+msgstr ""
+
+#: src/addr2line.c:72 src/elfcmp.c:72 src/findtextrel.c:67 src/nm.c:100
 #: src/strings.c:75
 msgid "Miscellaneous:"
 msgstr "雑則:"
 
-#: src/addr2line.c:77
+#: src/addr2line.c:81
 msgid ""
 "Locate source files and line information for ADDRs (in a.out by default)."
 msgstr ""
 
-#: src/addr2line.c:81
+#: src/addr2line.c:85
 msgid "[ADDR...]"
 msgstr ""
 
-#: src/addr2line.c:181 src/ar.c:289 src/elfcmp.c:662 src/elflint.c:231
+#: src/addr2line.c:196 src/ar.c:289 src/elfcmp.c:662 src/elflint.c:235
 #: src/findtextrel.c:162 src/ld.c:949 src/nm.c:265 src/objdump.c:181
-#: src/ranlib.c:128 src/readelf.c:460 src/size.c:211 src/strings.c:219
-#: src/strip.c:213 src/unstrip.c:226
+#: src/ranlib.c:128 src/readelf.c:500 src/size.c:211 src/strings.c:226
+#: src/strip.c:213 src/unstrip.c:233
 #, c-format
 msgid ""
 "Copyright (C) %s Red Hat, Inc.\n"
@@ -657,30 +727,30 @@ 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"
 
-#: src/addr2line.c:186 src/ar.c:294 src/elfcmp.c:667 src/elflint.c:236
+#: src/addr2line.c:201 src/ar.c:294 src/elfcmp.c:667 src/elflint.c:240
 #: src/findtextrel.c:167 src/ld.c:954 src/nm.c:270 src/objdump.c:186
-#: src/ranlib.c:133 src/readelf.c:465 src/size.c:216 src/strings.c:224
-#: src/strip.c:218 src/unstrip.c:231
+#: src/ranlib.c:133 src/readelf.c:505 src/size.c:216 src/strings.c:231
+#: src/strip.c:218 src/unstrip.c:238
 #, c-format
 msgid "Written by %s.\n"
 msgstr "%s によって書かれました。\n"
 
-#: src/addr2line.c:405
+#: src/addr2line.c:474
 #, c-format
 msgid "Section syntax requires exactly one module"
 msgstr ""
 
-#: src/addr2line.c:428
+#: src/addr2line.c:497
 #, c-format
 msgid "offset %#<PRIxMAX> lies outside section '%s'"
 msgstr ""
 
-#: src/addr2line.c:469
+#: src/addr2line.c:563
 #, c-format
 msgid "cannot find symbol '%s'"
 msgstr ""
 
-#: src/addr2line.c:474
+#: src/addr2line.c:568
 #, c-format
 msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
 msgstr ""
@@ -1117,8 +1187,8 @@ msgstr ""
 
 #: src/elfcmp.c:722 src/findtextrel.c:221 src/ldgeneric.c:1757
 #: src/ldgeneric.c:4247 src/nm.c:381 src/ranlib.c:161 src/size.c:293
-#: src/strings.c:175 src/strip.c:450 src/strip.c:487 src/unstrip.c:1903
-#: src/unstrip.c:1932
+#: src/strings.c:182 src/strip.c:451 src/strip.c:488 src/unstrip.c:1911
+#: src/unstrip.c:1940
 #, c-format
 msgid "cannot open '%s'"
 msgstr "'%s' を開けません"
@@ -1171,160 +1241,160 @@ msgstr ""
 msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
 msgstr "ELF ファイルが gABI/psABI 仕様へ準拠しているかの厳密なチェック。"
 
-#: src/elflint.c:78 src/readelf.c:113
+#: src/elflint.c:78 src/readelf.c:123
 msgid "FILE..."
 msgstr "ふぁいる..."
 
-#: src/elflint.c:151 src/readelf.c:271
+#: src/elflint.c:155 src/readelf.c:292
 #, c-format
 msgid "cannot open input file"
 msgstr "入力ファイルを開けません"
 
-#: src/elflint.c:158
+#: src/elflint.c:162
 #, c-format
 msgid "cannot generate Elf descriptor: %s\n"
 msgstr "Elf 記述子を生成できません: %s\n"
 
-#: src/elflint.c:177
+#: src/elflint.c:181
 #, c-format
 msgid "error while closing Elf descriptor: %s\n"
 msgstr "Elf 記述子を閉じている時にエラー: %s\n"
 
-#: src/elflint.c:181
+#: src/elflint.c:185
 msgid "No errors"
 msgstr "エラーはありません"
 
-#: src/elflint.c:215 src/readelf.c:434
+#: src/elflint.c:219 src/readelf.c:468
 msgid "Missing file name.\n"
 msgstr "ファイル名がありません。\n"
 
-#: src/elflint.c:294
+#: src/elflint.c:298
 #, c-format
 msgid " error while freeing sub-ELF descriptor: %s\n"
 msgstr "副-ELF 記述子を解放している時にエラー: %s\n"
 
-#: src/elflint.c:302
+#: src/elflint.c:306
 #, c-format
 msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
 msgstr "ELF ファイルではありません - 最初に誤ったマジックバイトがあります\n"
 
-#: src/elflint.c:363
+#: src/elflint.c:371
 #, c-format
 msgid "e_ident[%d] == %d is no known class\n"
 msgstr "e_ident[%d] == %d は既知のクラスではありません\n"
 
-#: src/elflint.c:368
+#: src/elflint.c:376
 #, c-format
 msgid "e_ident[%d] == %d is no known data encoding\n"
 msgstr "e_ident[%d] == %d は既知のデータエンコードではありません\n"
 
-#: src/elflint.c:372
+#: src/elflint.c:380
 #, c-format
 msgid "unknown ELF header version number e_ident[%d] == %d\n"
 msgstr "不明な ELF ヘッダーバージョン数 e_ident[%d] == %d\n"
 
-#: src/elflint.c:378
+#: src/elflint.c:386
 #, c-format
 msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
 msgstr "不明な OS ABI e_ident[%d] == '%s'\n"
 
-#: src/elflint.c:384
+#: src/elflint.c:392
 #, c-format
 msgid "unsupport ABI version e_ident[%d] == %d\n"
 msgstr "不明な ABI バージョン e_ident[%d] == %d\n"
 
-#: src/elflint.c:389
+#: src/elflint.c:397
 #, c-format
 msgid "e_ident[%zu] is not zero\n"
 msgstr "e_ident[%zu] がゼロではありません\n"
 
-#: src/elflint.c:394
+#: src/elflint.c:402
 #, c-format
 msgid "unknown object file type %d\n"
 msgstr "不明なオブジェクトファイルタイプ %d\n"
 
-#: src/elflint.c:401
+#: src/elflint.c:409
 #, c-format
 msgid "unknown machine type %d\n"
 msgstr "不明なマシンタイプ %d\n"
 
-#: src/elflint.c:405
+#: src/elflint.c:413
 #, c-format
 msgid "unknown object file version\n"
 msgstr "不明なオブジェクトファイルバージョン\n"
 
-#: src/elflint.c:411
+#: src/elflint.c:419
 #, c-format
 msgid "invalid program header offset\n"
 msgstr "不当なプログラムヘッダーオフセット\n"
 
-#: src/elflint.c:413
+#: src/elflint.c:421
 #, c-format
 msgid "executables and DSOs cannot have zero program header offset\n"
 msgstr ""
 "実行ファイルと DSO はプログラムヘッダーオフセットが 0 であってはいけません\n"
 
-#: src/elflint.c:417
+#: src/elflint.c:425
 #, c-format
 msgid "invalid number of program header entries\n"
 msgstr "プログラムヘッダー項目数として不当な数\n"
 
-#: src/elflint.c:425
+#: src/elflint.c:433
 #, c-format
 msgid "invalid section header table offset\n"
 msgstr "不当なセクションヘッダーテーブルオフセット\n"
 
-#: src/elflint.c:428
+#: src/elflint.c:436
 #, c-format
 msgid "section header table must be present\n"
 msgstr "セクションヘッダーテーブルがなければなりません\n"
 
-#: src/elflint.c:442
+#: src/elflint.c:450
 #, c-format
 msgid "invalid number of section header table entries\n"
 msgstr "セクションヘッダーテーブル項目数として不当な数\n"
 
-#: src/elflint.c:459
+#: src/elflint.c:467
 #, c-format
 msgid "invalid section header index\n"
 msgstr "不当なセクションヘッダーインデックス\n"
 
-#: src/elflint.c:473
+#: src/elflint.c:481
 #, fuzzy, c-format
 msgid "invalid number of program header table entries\n"
 msgstr "プログラムヘッダー項目数として不当な数\n"
 
-#: src/elflint.c:482
+#: src/elflint.c:490
 #, c-format
 msgid "invalid machine flags: %s\n"
 msgstr "不当なマシンフラグ: %s\n"
 
-#: src/elflint.c:489 src/elflint.c:506
+#: src/elflint.c:497 src/elflint.c:514
 #, c-format
 msgid "invalid ELF header size: %hd\n"
 msgstr "不当な ELF ヘッダーサイズ: %hd\n"
 
-#: src/elflint.c:492 src/elflint.c:509
+#: src/elflint.c:500 src/elflint.c:517
 #, c-format
 msgid "invalid program header size: %hd\n"
 msgstr "不当なプログラムヘッダーサイズ: %hd\n"
 
-#: src/elflint.c:495 src/elflint.c:512
+#: src/elflint.c:503 src/elflint.c:520
 #, c-format
 msgid "invalid program header position or size\n"
 msgstr "不当なプログラムヘッダー位置かサイズ\n"
 
-#: src/elflint.c:498 src/elflint.c:515
+#: src/elflint.c:506 src/elflint.c:523
 #, c-format
 msgid "invalid section header size: %hd\n"
 msgstr "不当なセクションヘッダーサイズ: %hd\n"
 
-#: src/elflint.c:501 src/elflint.c:518
+#: src/elflint.c:509 src/elflint.c:526
 #, c-format
 msgid "invalid section header position or size\n"
 msgstr "不当なセクションヘッダー位置かサイズ\n"
 
-#: src/elflint.c:562
+#: src/elflint.c:570
 #, c-format
 msgid ""
 "section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
@@ -1333,7 +1403,7 @@ msgstr ""
 "セクション [%2d] '%s': SHF_GROUP フラグのあるセクションにセクショングループの"
 "一部分が設定されていません\n"
 
-#: src/elflint.c:566
+#: src/elflint.c:574
 #, fuzzy, c-format
 msgid ""
 "section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
@@ -1341,14 +1411,14 @@ msgstr ""
 "セクション [%2d] '%s': セクショングループ [%2zu] '%s' がグループメンバーを継"
 "続していません\n"
 
-#: src/elflint.c:582 src/elflint.c:1426 src/elflint.c:1476 src/elflint.c:1581
-#: src/elflint.c:2166 src/elflint.c:2680 src/elflint.c:2841 src/elflint.c:2971
-#: src/elflint.c:3143 src/elflint.c:4045
+#: src/elflint.c:590 src/elflint.c:1457 src/elflint.c:1508 src/elflint.c:1614
+#: src/elflint.c:1939 src/elflint.c:2228 src/elflint.c:2742 src/elflint.c:2904
+#: src/elflint.c:3034 src/elflint.c:3206 src/elflint.c:4108
 #, c-format
 msgid "section [%2d] '%s': cannot get section data\n"
 msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
 
-#: src/elflint.c:595 src/elflint.c:1588
+#: src/elflint.c:603 src/elflint.c:1621
 #, c-format
 msgid ""
 "section [%2d] '%s': referenced as string table for section [%2d] '%s' but "
@@ -1357,7 +1427,7 @@ msgstr ""
 "セクション [%2d] '%s': セクション [%2d] '%s' 用の文字列テーブルとして参照され"
 "ていますが、タイプが SHT_STRTAB ではありません\n"
 
-#: src/elflint.c:618
+#: src/elflint.c:626
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol table cannot have more than one extended index "
@@ -1366,38 +1436,38 @@ msgstr ""
 "セクション [%2d] '%s': シンボルテーブルは 1 個を越える拡張インデックスセク"
 "ションを持てません\n"
 
-#: src/elflint.c:629
+#: src/elflint.c:638
 #, c-format
 msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
 msgstr "セクション [%2u] '%s': 項目サイズが ElfXX_Sym と一致しません\n"
 
-#: src/elflint.c:638
+#: src/elflint.c:647
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
 msgstr "セクション [%2d] '%s': シンボル %d を得られません: %s\n"
 
-#: src/elflint.c:643 src/elflint.c:646 src/elflint.c:649 src/elflint.c:652
-#: src/elflint.c:655 src/elflint.c:658
+#: src/elflint.c:652 src/elflint.c:655 src/elflint.c:658 src/elflint.c:661
+#: src/elflint.c:664 src/elflint.c:667
 #, c-format
 msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
 msgstr "セクション [%2d] '%s': 0番目の項目にある '%s' ゼロではありません\n"
 
-#: src/elflint.c:661
+#: src/elflint.c:670
 #, c-format
 msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
 msgstr "セクション [%2d] '%s': 0番目の項目用の XINDEX がゼロではありません\n"
 
-#: src/elflint.c:671
+#: src/elflint.c:680
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
 msgstr "セクション [%2d] '%s': シンボル %zu を得られません: %s\n"
 
-#: src/elflint.c:680
+#: src/elflint.c:689
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
 msgstr "セクション [%2d] '%s': シンボル %zu: 不当な名前の値\n"
 
-#: src/elflint.c:694
+#: src/elflint.c:704
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: too large section index but no extended "
@@ -1406,7 +1476,7 @@ msgstr ""
 "セクション [%2d] '%s': シンボル %zu: 大きすぎるセクションインデックスだが、拡"
 "張セクションインデックスセクションがありません\n"
 
-#: src/elflint.c:700
+#: src/elflint.c:710
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
@@ -1415,29 +1485,29 @@ msgstr ""
 "セクション [%2d] '%s': シンボル %zu: st_shndx (%<PRIu32>) に適合するインデッ"
 "クス用に使われる XINDEX\n"
 
-#: src/elflint.c:712
+#: src/elflint.c:722
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
 msgstr "セクション [%2d] '%s': シンボル %zu: 不当なセクションインデックス\n"
 
-#: src/elflint.c:720
+#: src/elflint.c:730
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown type\n"
 msgstr "セクション [%2d] '%s': シンボル %zu: 不明なタイプ\n"
 
-#: src/elflint.c:726
+#: src/elflint.c:736
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
 msgstr "セクション [%2d] '%s': シンボル %zu: 不明なシンボルバインディング\n"
 
-#: src/elflint.c:731
+#: src/elflint.c:741
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
 msgstr ""
 "セクション [%2d] '%s': シンボル %zu: オブジェクトタイプと異なる固有のシンボ"
 "ル\n"
 
-#: src/elflint.c:739
+#: src/elflint.c:749
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
@@ -1445,14 +1515,14 @@ msgstr ""
 "セクション [%2d] '%s': シンボル %zu: COMMON はリロケータブルファイル内のみで"
 "許されます\n"
 
-#: src/elflint.c:743
+#: src/elflint.c:753
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
 msgstr ""
 "セクション [%2d] '%s': シンボル %zu: ローカルな COMMON シンボルは意味がありま"
 "せん\n"
 
-#: src/elflint.c:747
+#: src/elflint.c:757
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
@@ -1460,12 +1530,12 @@ msgstr ""
 "セクション [%2d] '%s': シンボル %zu: COMMON セクションの機能は意味がありませ"
 "ん\n"
 
-#: src/elflint.c:779
+#: src/elflint.c:804
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
 msgstr "セクション [%2d] '%s': シンボル %zu: st_value 境界外\n"
 
-#: src/elflint.c:785 src/elflint.c:810 src/elflint.c:853
+#: src/elflint.c:810 src/elflint.c:835 src/elflint.c:878
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu does not fit completely in referenced section "
@@ -1474,7 +1544,7 @@ msgstr ""
 "セクション [%2d] '%s': シンボル %zu は参照されるセクション [%2d] '%s' とは完"
 "全に一致しません\n"
 
-#: src/elflint.c:794
+#: src/elflint.c:819
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
@@ -1483,7 +1553,7 @@ msgstr ""
 "セクション [%2d] '%s': シンボル %zu: 参照されるセクション [%2d] '%s' は "
 "SHF_TLS フラグが設定されていません\n"
 
-#: src/elflint.c:804 src/elflint.c:846
+#: src/elflint.c:829 src/elflint.c:871
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
@@ -1492,7 +1562,7 @@ msgstr ""
 "セクション [%2d] '%s': シンボル %zu: st_value 参照されるセクション [%2d] "
 "'%s' の境界外\n"
 
-#: src/elflint.c:831
+#: src/elflint.c:856
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
@@ -1500,7 +1570,7 @@ msgstr ""
 "セクション [%2d] '%s': シンボル %zu: TLS プログラムヘッダー項目がない TLS シ"
 "ンボル\n"
 
-#: src/elflint.c:839
+#: src/elflint.c:864
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] "
@@ -1509,7 +1579,7 @@ msgstr ""
 "セクション [%2d] '%s': シンボル %zu: 参照されるセクション [%2d] '%s' の"
 "st_value 不足\n"
 
-#: src/elflint.c:866
+#: src/elflint.c:891
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: local symbol outside range described in "
@@ -1518,7 +1588,7 @@ msgstr ""
 "セクション [%2d] '%s': シンボル %zu: sh_info に記述された範囲外のローカルシン"
 "ボル\n"
 
-#: src/elflint.c:873
+#: src/elflint.c:898
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
@@ -1527,12 +1597,12 @@ msgstr ""
 "セクション [%2d] '%s': シンボル %zu: sh_info に記述された範囲外の非ローカルシ"
 "ンボル\n"
 
-#: src/elflint.c:880
+#: src/elflint.c:905
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
 msgstr "セクション [%2d] '%s': シンボル %zu: 非ローカルセクションシンボル\n"
 
-#: src/elflint.c:930
+#: src/elflint.c:955
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section "
@@ -1541,7 +1611,7 @@ msgstr ""
 "セクション [%2d] '%s': _GLOBAL_OFFSET_TABLE_ シンボルが間違ったセクション "
 "[%2d] を参照しています\n"
 
-#: src/elflint.c:937
+#: src/elflint.c:962
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] "
@@ -1550,7 +1620,7 @@ msgstr ""
 "セクション [%2d] '%s': _GLOBAL_OFFSET_TABLE_ シンボルはセクション [%2d] '%s' "
 "を参照しています\n"
 
-#: src/elflint.c:953
+#: src/elflint.c:978
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
@@ -1559,7 +1629,7 @@ msgstr ""
 "セクション [%2d] '%s': _GLOBAL_OFFSET_TABLE_ シンボル値 %#<PRIx64> は %s のセ"
 "クションアドレス %#<PRIx64> と一致しません\n"
 
-#: src/elflint.c:960
+#: src/elflint.c:985
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
@@ -1568,7 +1638,7 @@ msgstr ""
 "セクション [%2d] '%s': _GLOBAL_OFFSET_TABLE_ シンボルサイズ %<PRIu64> は %s "
 "のセクションサイズ %<PRIu64> と一致しません\n"
 
-#: src/elflint.c:968
+#: src/elflint.c:993
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
@@ -1577,7 +1647,7 @@ msgstr ""
 "セクション [%2d] '%s': _GLOBAL_OFFSET_TABLE_ シンボルはありますが、.got セク"
 "ションがありません\n"
 
-#: src/elflint.c:984
+#: src/elflint.c:1009
 #, c-format
 msgid ""
 "section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
@@ -1586,7 +1656,7 @@ msgstr ""
 "セクション [%2d] '%s': _DYNAMIC_ シンボル値 %#<PRIx64> は動的セグメントアドレ"
 "ス %#<PRIx64> と一致しません\n"
 
-#: src/elflint.c:991
+#: src/elflint.c:1016
 #, c-format
 msgid ""
 "section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
@@ -1595,7 +1665,7 @@ msgstr ""
 "セクション [%2d] '%s': _DYNAMIC シンボルサイズ %<PRIu64> は動的セグメントサイ"
 "ズ %<PRIu64> と一致しません\n"
 
-#: src/elflint.c:1004
+#: src/elflint.c:1029
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
@@ -1604,24 +1674,24 @@ msgstr ""
 "セクション [%2d] '%s': シンボル %zu: 省略以外の可視性を持った動的シンボルテー"
 "ブル中のシンボル\n"
 
-#: src/elflint.c:1008
+#: src/elflint.c:1033
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
 msgstr ""
 "セクション [%2d] '%s': シンボル %zu: st_other 中に設定された不明なビット\n"
 
-#: src/elflint.c:1053
+#: src/elflint.c:1082
 #, c-format
 msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
 msgstr "セクション [%2d] '%s': この RELA セクション用に使われる DT_RELCOUNT\n"
 
-#: src/elflint.c:1062 src/elflint.c:1114
+#: src/elflint.c:1093 src/elflint.c:1145
 #, c-format
 msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
 msgstr ""
 "セクション [%2d] '%s': このセクション用には高すぎる DT_RELCOUNT 値 %d\n"
 
-#: src/elflint.c:1087 src/elflint.c:1139
+#: src/elflint.c:1118 src/elflint.c:1170
 #, c-format
 msgid ""
 "section [%2d] '%s': relative relocations after index %d as specified by "
@@ -1630,7 +1700,7 @@ msgstr ""
 "セクション [%2d] '%s': UT_RELOCOUNT で指定されたインデックス %d 後の相対リロ"
 "ケーション\n"
 
-#: src/elflint.c:1093 src/elflint.c:1145
+#: src/elflint.c:1124 src/elflint.c:1176
 #, c-format
 msgid ""
 "section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
@@ -1639,51 +1709,51 @@ msgstr ""
 "セクション [%2d] '%s': インデックス %zu での非相対リロケーション;  %d 相対リ"
 "ロケーションで指定された DT_RELCOUNT\n"
 
-#: src/elflint.c:1105
+#: src/elflint.c:1136
 #, c-format
 msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
 msgstr "セクション [%2d] '%s': この REL セクション用に使われる DT_RELACOUNT\n"
 
-#: src/elflint.c:1187
+#: src/elflint.c:1218
 #, c-format
 msgid "section [%2d] '%s': invalid destination section index\n"
 msgstr "セクション [%2d] '%s': 不当な宛先セクションインデックス\n"
 
-#: src/elflint.c:1200
+#: src/elflint.c:1230
 #, c-format
 msgid "section [%2d] '%s': invalid destination section type\n"
 msgstr "セクション [%2d] '%s': 不当な宛先セクションタイプ\n"
 
-#: src/elflint.c:1208
+#: src/elflint.c:1238
 #, c-format
 msgid "section [%2d] '%s': sh_info should be zero\n"
 msgstr "セクション [%2d] '%s': sh_info はゼロでなければなりません\n"
 
-#: src/elflint.c:1215
+#: src/elflint.c:1245
 #, c-format
 msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
 msgstr ""
 "セクション [%2d] '%s': マージできるセクションのリロケーションは不可能です\n"
 
-#: src/elflint.c:1222
+#: src/elflint.c:1253
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
 msgstr ""
 "セクション [%2d] '%s': セクション項目サイズが ElfXX_Rela と一致しません\n"
 
-#: src/elflint.c:1282
+#: src/elflint.c:1313
 #, c-format
 msgid "text relocation flag set but there is no read-only segment\n"
 msgstr ""
 "テキストリロケーションフラグが設定されていますが、読込み専用セグメントがあり"
 "ません\n"
 
-#: src/elflint.c:1309
+#: src/elflint.c:1340
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: invalid type\n"
 msgstr "セクション [%2d] '%s': リロケーション %zu: 不当なタイプ\n"
 
-#: src/elflint.c:1317
+#: src/elflint.c:1348
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: relocation type invalid for the file "
@@ -1692,13 +1762,13 @@ msgstr ""
 "セクション [%2d] '%s': リロケーション %zu: このファイル用のリロケーションタイ"
 "プは不当です\n"
 
-#: src/elflint.c:1325
+#: src/elflint.c:1356
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
 msgstr ""
 "セクション [%2d] '%s': リロケーション %zu: 不当なシンボルインデックス\n"
 
-#: src/elflint.c:1343
+#: src/elflint.c:1374
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
@@ -1707,12 +1777,12 @@ msgstr ""
 "セクション [%2d] '%s': リロケーション %zu: シンボル '_GLOBAL_OFFSET_TABLE_' "
 "のみが %s と一緒に使用できます\n"
 
-#: src/elflint.c:1360
+#: src/elflint.c:1391
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
 msgstr "セクション [%2d] '%s': リロケーション %zu: オフセット境界外\n"
 
-#: src/elflint.c:1375
+#: src/elflint.c:1406
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: copy relocation against symbol of type "
@@ -1721,7 +1791,7 @@ msgstr ""
 "セクション [%2d] '%s': リロケーション %zu: タイプ %s のシンボルに対するコピー"
 "リロケーション\n"
 
-#: src/elflint.c:1396
+#: src/elflint.c:1427
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: read-only section modified but text "
@@ -1730,1109 +1800,1109 @@ msgstr ""
 "セクション [%2d] '%s': リロケーション %zu: 読込み専用セクションが変更されまし"
 "たが、テキストリロケーションフラグが設定されていません\n"
 
-#: src/elflint.c:1411
+#: src/elflint.c:1442
 #, c-format
 msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
 msgstr ""
 "セクション [%2d] '%s': リロケーションがロードされたデータとロードされなかった"
 "データに対してです\n"
 
-#: src/elflint.c:1450 src/elflint.c:1500
+#: src/elflint.c:1482 src/elflint.c:1533
 #, c-format
 msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
 msgstr ""
 
-#: src/elflint.c:1576
+#: src/elflint.c:1609
 #, c-format
 msgid "more than one dynamic section present\n"
 msgstr ""
 
-#: src/elflint.c:1594
+#: src/elflint.c:1628
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
 msgstr ""
 
-#: src/elflint.c:1599 src/elflint.c:1882
+#: src/elflint.c:1633 src/elflint.c:1918
 #, c-format
 msgid "section [%2d] '%s': sh_info not zero\n"
 msgstr ""
 
-#: src/elflint.c:1609
+#: src/elflint.c:1643
 #, c-format
 msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
 msgstr ""
 
-#: src/elflint.c:1617
+#: src/elflint.c:1651
 #, c-format
 msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
 msgstr ""
 
-#: src/elflint.c:1624
+#: src/elflint.c:1658
 #, c-format
 msgid "section [%2d] '%s': entry %zu: unknown tag\n"
 msgstr ""
 
-#: src/elflint.c:1635
+#: src/elflint.c:1669
 #, c-format
 msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
 msgstr ""
 
-#: src/elflint.c:1645
+#: src/elflint.c:1679
 #, c-format
 msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
 msgstr ""
 
-#: src/elflint.c:1663
+#: src/elflint.c:1697
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
 msgstr ""
 
-#: src/elflint.c:1676
+#: src/elflint.c:1710
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: pointer does not match address of section "
 "[%2d] '%s' referenced by sh_link\n"
 msgstr ""
 
-#: src/elflint.c:1719
+#: src/elflint.c:1753
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
 msgstr ""
 
-#: src/elflint.c:1734
+#: src/elflint.c:1768
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: %s value must be valid offset in section "
 "[%2d] '%s'\n"
 msgstr ""
 
-#: src/elflint.c:1754 src/elflint.c:1782
+#: src/elflint.c:1788 src/elflint.c:1816
 #, c-format
 msgid "section [%2d] '%s': contains %s entry but not %s\n"
 msgstr ""
 
-#: src/elflint.c:1766
+#: src/elflint.c:1800
 #, c-format
 msgid "section [%2d] '%s': mandatory tag %s not present\n"
 msgstr ""
 
-#: src/elflint.c:1775
+#: src/elflint.c:1809
 #, c-format
 msgid "section [%2d] '%s': no hash section present\n"
 msgstr ""
 
-#: src/elflint.c:1790 src/elflint.c:1797
+#: src/elflint.c:1824 src/elflint.c:1831
 #, c-format
 msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
 msgstr ""
 
-#: src/elflint.c:1807 src/elflint.c:1811
+#: src/elflint.c:1841 src/elflint.c:1845
 #, c-format
 msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
 msgstr ""
 
-#: src/elflint.c:1817
+#: src/elflint.c:1851
 #, c-format
 msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
 msgstr ""
 
-#: src/elflint.c:1828 src/elflint.c:1832 src/elflint.c:1836 src/elflint.c:1840
+#: src/elflint.c:1862 src/elflint.c:1866 src/elflint.c:1870 src/elflint.c:1874
 #, c-format
 msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
 msgstr ""
 
-#: src/elflint.c:1852
+#: src/elflint.c:1886
 #, c-format
 msgid ""
 "section [%2d] '%s': only relocatable files can have extended section index\n"
 msgstr ""
 
-#: src/elflint.c:1862
+#: src/elflint.c:1896
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index section not for symbol table\n"
 msgstr ""
 
-#: src/elflint.c:1867
+#: src/elflint.c:1901
 #, c-format
 msgid "cannot get data for symbol section\n"
 msgstr ""
 
-#: src/elflint.c:1870
+#: src/elflint.c:1904
 #, c-format
 msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
 msgstr ""
 
-#: src/elflint.c:1877
+#: src/elflint.c:1913
 #, c-format
 msgid "section [%2d] '%s': extended index table too small for symbol table\n"
 msgstr ""
 
-#: src/elflint.c:1892
+#: src/elflint.c:1928
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
 "same symbol table\n"
 msgstr ""
 
-#: src/elflint.c:1903
+#: src/elflint.c:1945
 #, c-format
 msgid "symbol 0 should have zero extended section index\n"
 msgstr ""
 
-#: src/elflint.c:1915
+#: src/elflint.c:1957
 #, c-format
 msgid "cannot get data for symbol %zu\n"
 msgstr ""
 
-#: src/elflint.c:1920
+#: src/elflint.c:1962
 #, c-format
 msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
 msgstr ""
 
-#: src/elflint.c:1936 src/elflint.c:1977
+#: src/elflint.c:1978 src/elflint.c:2029
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
 msgstr ""
 
-#: src/elflint.c:1948 src/elflint.c:1989
+#: src/elflint.c:1990 src/elflint.c:2041
 #, c-format
 msgid "section [%2d] '%s': chain array too large\n"
 msgstr ""
 
-#: src/elflint.c:1957 src/elflint.c:1998
+#: src/elflint.c:2004 src/elflint.c:2055
 #, c-format
 msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:1963
+#: src/elflint.c:2014
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:2004
+#: src/elflint.c:2065
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:2019
+#: src/elflint.c:2081
 #, c-format
 msgid "section [%2d] '%s': bitmask size not power of 2: %u\n"
 msgstr ""
 
-#: src/elflint.c:2030
+#: src/elflint.c:2092
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected at "
-"least%ld)\n"
+"least %ld)\n"
 msgstr ""
 
-#: src/elflint.c:2038
+#: src/elflint.c:2100
 #, c-format
 msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
 msgstr ""
 
-#: src/elflint.c:2070
+#: src/elflint.c:2132
 #, c-format
 msgid ""
 "section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
 msgstr ""
 
-#: src/elflint.c:2091
+#: src/elflint.c:2153
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
 "undefined\n"
 msgstr ""
 
-#: src/elflint.c:2102
+#: src/elflint.c:2164
 #, c-format
 msgid ""
 "section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
 msgstr ""
 
-#: src/elflint.c:2133
+#: src/elflint.c:2195
 #, c-format
 msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:2138
+#: src/elflint.c:2200
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
 msgstr ""
 
-#: src/elflint.c:2144
+#: src/elflint.c:2206
 #, c-format
 msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
 msgstr ""
 
-#: src/elflint.c:2157
+#: src/elflint.c:2219
 #, c-format
 msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
 msgstr ""
 
-#: src/elflint.c:2175
+#: src/elflint.c:2237
 #, c-format
 msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
 msgstr ""
 
-#: src/elflint.c:2183
+#: src/elflint.c:2245
 #, c-format
 msgid "section [%2d] '%s': hash table entry size incorrect\n"
 msgstr ""
 
-#: src/elflint.c:2188
+#: src/elflint.c:2250
 #, c-format
 msgid "section [%2d] '%s': not marked to be allocated\n"
 msgstr ""
 
-#: src/elflint.c:2193
+#: src/elflint.c:2255
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table has not even room for initial administrative "
 "entries\n"
 msgstr ""
 
-#: src/elflint.c:2241
+#: src/elflint.c:2303
 #, c-format
 msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
 msgstr ""
 
-#: src/elflint.c:2319 src/elflint.c:2323
+#: src/elflint.c:2381 src/elflint.c:2385
 #, c-format
 msgid "section [%2zu] '%s': reference to symbol index 0\n"
 msgstr ""
 
-#: src/elflint.c:2330
+#: src/elflint.c:2392
 #, c-format
 msgid ""
 "symbol %d referenced in new hash table in [%2zu] '%s' but not in old hash "
 "table in [%2zu] '%s'\n"
 msgstr ""
 
-#: src/elflint.c:2342
+#: src/elflint.c:2404
 #, c-format
 msgid ""
 "symbol %d referenced in old hash table in [%2zu] '%s' but not in new hash "
 "table in [%2zu] '%s'\n"
 msgstr ""
 
-#: src/elflint.c:2358
+#: src/elflint.c:2420
 #, c-format
 msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
 msgstr ""
 
-#: src/elflint.c:2378
+#: src/elflint.c:2440
 #, c-format
 msgid ""
 "section [%2d] '%s': section groups only allowed in relocatable object files\n"
 msgstr ""
 
-#: src/elflint.c:2389
+#: src/elflint.c:2451
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol table: %s\n"
 msgstr ""
 
-#: src/elflint.c:2394
+#: src/elflint.c:2456
 #, c-format
 msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
 msgstr ""
 
-#: src/elflint.c:2400
+#: src/elflint.c:2462
 #, c-format
 msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
 msgstr ""
 
-#: src/elflint.c:2405
+#: src/elflint.c:2467
 #, c-format
 msgid "section [%2d] '%s': sh_flags not zero\n"
 msgstr ""
 
-#: src/elflint.c:2412
+#: src/elflint.c:2474
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol for signature\n"
 msgstr ""
 
-#: src/elflint.c:2417
+#: src/elflint.c:2479
 #, fuzzy, c-format
 msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
 msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
 
-#: src/elflint.c:2423
+#: src/elflint.c:2485
 #, c-format
 msgid "section [%2d] '%s': sh_flags not set correctly\n"
 msgstr ""
 
-#: src/elflint.c:2429
+#: src/elflint.c:2491
 #, c-format
 msgid "section [%2d] '%s': cannot get data: %s\n"
 msgstr ""
 
-#: src/elflint.c:2438
+#: src/elflint.c:2500
 #, c-format
 msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
 msgstr ""
 
-#: src/elflint.c:2443
+#: src/elflint.c:2505
 #, c-format
 msgid "section [%2d] '%s': section group without flags word\n"
 msgstr ""
 
-#: src/elflint.c:2449
+#: src/elflint.c:2511
 #, c-format
 msgid "section [%2d] '%s': section group without member\n"
 msgstr ""
 
-#: src/elflint.c:2453
+#: src/elflint.c:2515
 #, c-format
 msgid "section [%2d] '%s': section group with only one member\n"
 msgstr ""
 
-#: src/elflint.c:2464
+#: src/elflint.c:2526
 #, c-format
 msgid "section [%2d] '%s': unknown section group flags\n"
 msgstr ""
 
-#: src/elflint.c:2476
+#: src/elflint.c:2538
 #, c-format
 msgid "section [%2d] '%s': section index %Zu out of range\n"
 msgstr ""
 
-#: src/elflint.c:2485
+#: src/elflint.c:2547
 #, c-format
 msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
 msgstr ""
 
-#: src/elflint.c:2492
+#: src/elflint.c:2554
 #, c-format
 msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
 msgstr ""
 
-#: src/elflint.c:2498
+#: src/elflint.c:2560
 #, c-format
 msgid ""
 "section [%2d] '%s': element %Zu references section [%2d] '%s' without "
 "SHF_GROUP flag set\n"
 msgstr ""
 
-#: src/elflint.c:2505
+#: src/elflint.c:2567
 #, c-format
 msgid "section [%2d] '%s' is contained in more than one section group\n"
 msgstr ""
 
-#: src/elflint.c:2694
+#: src/elflint.c:2756
 #, c-format
 msgid ""
 "section [%2d] '%s' refers in sh_link to section [%2d] '%s' which is no "
 "dynamic symbol table\n"
 msgstr ""
 
-#: src/elflint.c:2705
+#: src/elflint.c:2768
 #, c-format
 msgid ""
 "section [%2d] '%s' has different number of entries than symbol table [%2d] "
 "'%s'\n"
 msgstr ""
 
-#: src/elflint.c:2721
+#: src/elflint.c:2784
 #, c-format
 msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
 msgstr ""
 
-#: src/elflint.c:2737
+#: src/elflint.c:2800
 #, c-format
 msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
 msgstr ""
 
-#: src/elflint.c:2745
+#: src/elflint.c:2808
 #, c-format
 msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
 msgstr ""
 
-#: src/elflint.c:2759
+#: src/elflint.c:2822
 #, c-format
 msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
 msgstr ""
 
-#: src/elflint.c:2764
+#: src/elflint.c:2827
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: version index %d is for defined version\n"
 msgstr ""
 
-#: src/elflint.c:2774
+#: src/elflint.c:2837
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: version index %d is for requested version\n"
 msgstr ""
 
-#: src/elflint.c:2826
+#: src/elflint.c:2889
 #, c-format
 msgid "more than one version reference section present\n"
 msgstr ""
 
-#: src/elflint.c:2834 src/elflint.c:2963
+#: src/elflint.c:2897 src/elflint.c:3026
 #, c-format
 msgid "section [%2d] '%s': sh_link does not link to string table\n"
 msgstr ""
 
-#: src/elflint.c:2857 src/elflint.c:3015
+#: src/elflint.c:2920 src/elflint.c:3078
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong version %d\n"
 msgstr ""
 
-#: src/elflint.c:2863 src/elflint.c:3021
+#: src/elflint.c:2926 src/elflint.c:3084
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
 msgstr ""
 
-#: src/elflint.c:2871
+#: src/elflint.c:2934
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid file reference\n"
 msgstr ""
 
-#: src/elflint.c:2879
+#: src/elflint.c:2942
 #, c-format
 msgid "section [%2d] '%s': entry %d references unknown dependency\n"
 msgstr ""
 
-#: src/elflint.c:2891
+#: src/elflint.c:2954
 #, c-format
 msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
 msgstr ""
 
-#: src/elflint.c:2898
+#: src/elflint.c:2961
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
 "reference\n"
 msgstr ""
 
-#: src/elflint.c:2905
+#: src/elflint.c:2968
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: "
 "%#x, expected %#x\n"
 msgstr ""
 
-#: src/elflint.c:2915
+#: src/elflint.c:2978
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
 "name '%s'\n"
 msgstr ""
 
-#: src/elflint.c:2926
+#: src/elflint.c:2989
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
 msgstr ""
 
-#: src/elflint.c:2942 src/elflint.c:3100
+#: src/elflint.c:3005 src/elflint.c:3163
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
 msgstr ""
 
-#: src/elflint.c:2955
+#: src/elflint.c:3018
 #, c-format
 msgid "more than one version definition section present\n"
 msgstr ""
 
-#: src/elflint.c:3000
+#: src/elflint.c:3063
 #, c-format
 msgid "section [%2d] '%s': more than one BASE definition\n"
 msgstr ""
 
-#: src/elflint.c:3004
+#: src/elflint.c:3067
 #, c-format
 msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
 msgstr ""
 
-#: src/elflint.c:3010
+#: src/elflint.c:3073
 #, c-format
 msgid "section [%2d] '%s': entry %d has unknown flag\n"
 msgstr ""
 
-#: src/elflint.c:3034
+#: src/elflint.c:3097
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid name reference\n"
 msgstr ""
 
-#: src/elflint.c:3041
+#: src/elflint.c:3104
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
 msgstr ""
 
-#: src/elflint.c:3050
+#: src/elflint.c:3113
 #, c-format
 msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
 msgstr ""
 
-#: src/elflint.c:3069
+#: src/elflint.c:3132
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
 msgstr ""
 
-#: src/elflint.c:3084
+#: src/elflint.c:3147
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
 msgstr ""
 
-#: src/elflint.c:3106
+#: src/elflint.c:3169
 #, c-format
 msgid "section [%2d] '%s': no BASE definition\n"
 msgstr ""
 
-#: src/elflint.c:3122
+#: src/elflint.c:3185
 #, c-format
 msgid "section [%2d] '%s': unknown parent version '%s'\n"
 msgstr ""
 
-#: src/elflint.c:3135
+#: src/elflint.c:3198
 #, c-format
 msgid "section [%2d] '%s': empty object attributes section\n"
 msgstr ""
 
-#: src/elflint.c:3156
+#: src/elflint.c:3219
 #, c-format
 msgid "section [%2d] '%s': unrecognized attribute format\n"
 msgstr ""
 
-#: src/elflint.c:3172
+#: src/elflint.c:3235
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3181
+#: src/elflint.c:3244
 #, c-format
 msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3193
+#: src/elflint.c:3256
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
 msgstr ""
 
-#: src/elflint.c:3210
+#: src/elflint.c:3273
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
 msgstr ""
 
-#: src/elflint.c:3219
+#: src/elflint.c:3282
 #, c-format
 msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3228
+#: src/elflint.c:3291
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
 msgstr ""
 
-#: src/elflint.c:3241
+#: src/elflint.c:3304
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
 msgstr ""
 
-#: src/elflint.c:3252
+#: src/elflint.c:3315
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
 msgstr ""
 
-#: src/elflint.c:3270
+#: src/elflint.c:3333
 #, c-format
 msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
 msgstr ""
 
-#: src/elflint.c:3281
+#: src/elflint.c:3344
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
 msgstr ""
 
-#: src/elflint.c:3294
+#: src/elflint.c:3357
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
 msgstr ""
 
-#: src/elflint.c:3298
+#: src/elflint.c:3361
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
 msgstr ""
 
-#: src/elflint.c:3308
+#: src/elflint.c:3371
 #, c-format
 msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
 msgstr ""
 
-#: src/elflint.c:3314
+#: src/elflint.c:3377
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
 msgstr ""
 
-#: src/elflint.c:3403
+#: src/elflint.c:3466
 #, c-format
 msgid "cannot get section header of zeroth section\n"
 msgstr ""
 
-#: src/elflint.c:3407
+#: src/elflint.c:3470
 #, c-format
 msgid "zeroth section has nonzero name\n"
 msgstr ""
 
-#: src/elflint.c:3409
+#: src/elflint.c:3472
 #, c-format
 msgid "zeroth section has nonzero type\n"
 msgstr ""
 
-#: src/elflint.c:3411
+#: src/elflint.c:3474
 #, c-format
 msgid "zeroth section has nonzero flags\n"
 msgstr ""
 
-#: src/elflint.c:3413
+#: src/elflint.c:3476
 #, c-format
 msgid "zeroth section has nonzero address\n"
 msgstr ""
 
-#: src/elflint.c:3415
+#: src/elflint.c:3478
 #, c-format
 msgid "zeroth section has nonzero offset\n"
 msgstr ""
 
-#: src/elflint.c:3417
+#: src/elflint.c:3480
 #, c-format
 msgid "zeroth section has nonzero align value\n"
 msgstr ""
 
-#: src/elflint.c:3419
+#: src/elflint.c:3482
 #, c-format
 msgid "zeroth section has nonzero entry size value\n"
 msgstr ""
 
-#: src/elflint.c:3422
+#: src/elflint.c:3485
 #, c-format
 msgid ""
 "zeroth section has nonzero size value while ELF header has nonzero shnum "
 "value\n"
 msgstr ""
 
-#: src/elflint.c:3426
+#: src/elflint.c:3489
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
 "overflow in shstrndx\n"
 msgstr ""
 
-#: src/elflint.c:3430
+#: src/elflint.c:3493
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
 "overflow in phnum\n"
 msgstr ""
 
-#: src/elflint.c:3447
+#: src/elflint.c:3510
 #, c-format
 msgid "cannot get section header for section [%2zu] '%s': %s\n"
 msgstr ""
 
-#: src/elflint.c:3456
+#: src/elflint.c:3519
 #, c-format
 msgid "section [%2zu]: invalid name\n"
 msgstr ""
 
-#: src/elflint.c:3483
+#: src/elflint.c:3546
 #, c-format
 msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
 msgstr ""
 
-#: src/elflint.c:3499
+#: src/elflint.c:3562
 #, c-format
 msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
 msgstr ""
 
-#: src/elflint.c:3516
+#: src/elflint.c:3579
 #, c-format
 msgid ""
 "section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
 msgstr ""
 
-#: src/elflint.c:3534
+#: src/elflint.c:3597
 #, c-format
 msgid "section [%2zu] '%s' present in object file\n"
 msgstr ""
 
-#: src/elflint.c:3540 src/elflint.c:3572
+#: src/elflint.c:3603 src/elflint.c:3635
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
 msgstr ""
 
-#: src/elflint.c:3545 src/elflint.c:3577
+#: src/elflint.c:3608 src/elflint.c:3640
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
 "segments\n"
 msgstr ""
 
-#: src/elflint.c:3553
+#: src/elflint.c:3616
 #, c-format
 msgid ""
 "section [%2zu] '%s' is extension section index table in non-object file\n"
 msgstr ""
 
-#: src/elflint.c:3596
+#: src/elflint.c:3659
 #, c-format
 msgid "section [%2zu] '%s': size not multiple of entry size\n"
 msgstr ""
 
-#: src/elflint.c:3601
+#: src/elflint.c:3664
 #, c-format
 msgid "cannot get section header\n"
 msgstr ""
 
-#: src/elflint.c:3611
+#: src/elflint.c:3674
 #, c-format
 msgid "section [%2zu] '%s' has unsupported type %d\n"
 msgstr ""
 
-#: src/elflint.c:3625
+#: src/elflint.c:3688
 #, c-format
 msgid ""
 "section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:3632
+#: src/elflint.c:3695
 #, c-format
 msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:3640
+#: src/elflint.c:3703
 #, c-format
 msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
 msgstr ""
 
-#: src/elflint.c:3648
+#: src/elflint.c:3711
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in link value\n"
 msgstr ""
 
-#: src/elflint.c:3653
+#: src/elflint.c:3716
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in info value\n"
 msgstr ""
 
-#: src/elflint.c:3660
+#: src/elflint.c:3723
 #, c-format
 msgid "section [%2zu] '%s': strings flag set without merge flag\n"
 msgstr ""
 
-#: src/elflint.c:3665
+#: src/elflint.c:3728
 #, c-format
 msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
 msgstr ""
 
-#: src/elflint.c:3683
+#: src/elflint.c:3746
 #, c-format
 msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
 msgstr ""
 
-#: src/elflint.c:3692
+#: src/elflint.c:3755
 #, c-format
 msgid "section [%2zu] '%s' is both executable and writable\n"
 msgstr ""
 
-#: src/elflint.c:3721
+#: src/elflint.c:3784
 #, c-format
 msgid ""
 "section [%2zu] '%s' not fully contained in segment of program header entry "
 "%d\n"
 msgstr ""
 
-#: src/elflint.c:3729
+#: src/elflint.c:3792
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
 "program header entry %d\n"
 msgstr ""
 
-#: src/elflint.c:3738
+#: src/elflint.c:3801
 #, c-format
 msgid ""
 "section [%2zu] '%s' has not type NOBITS but is not read from the file in "
 "segment of program header entry %d\n"
 msgstr ""
 
-#: src/elflint.c:3749
+#: src/elflint.c:3812
 #, c-format
 msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
 msgstr ""
 
-#: src/elflint.c:3759
+#: src/elflint.c:3822
 #, c-format
 msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
 msgstr ""
 
-#: src/elflint.c:3769
+#: src/elflint.c:3832
 #, c-format
 msgid ""
 "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
 msgstr ""
 
-#: src/elflint.c:3775
+#: src/elflint.c:3838
 #, c-format
 msgid ""
 "section [%2zu] '%s': ELF header says this is the section header string table "
 "but type is not SHT_TYPE\n"
 msgstr ""
 
-#: src/elflint.c:3783
+#: src/elflint.c:3846
 #, c-format
 msgid ""
 "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
 msgstr ""
 
-#: src/elflint.c:3834
+#: src/elflint.c:3897
 #, c-format
 msgid "more than one version symbol table present\n"
 msgstr ""
 
-#: src/elflint.c:3857
+#: src/elflint.c:3920
 #, c-format
 msgid "INTERP program header entry but no .interp section\n"
 msgstr ""
 
-#: src/elflint.c:3868
+#: src/elflint.c:3931
 #, c-format
 msgid ""
 "loadable segment [%u] is executable but contains no executable sections\n"
 msgstr ""
 
-#: src/elflint.c:3874
+#: src/elflint.c:3937
 #, c-format
 msgid "loadable segment [%u] is writable but contains no writable sections\n"
 msgstr ""
 
-#: src/elflint.c:3885
+#: src/elflint.c:3948
 #, c-format
 msgid ""
 "no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
 "exist\n"
 msgstr ""
 
-#: src/elflint.c:3898
+#: src/elflint.c:3961
 #, c-format
 msgid "duplicate version index %d\n"
 msgstr ""
 
-#: src/elflint.c:3912
+#: src/elflint.c:3975
 #, c-format
 msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
 msgstr ""
 
-#: src/elflint.c:3961
+#: src/elflint.c:4024
 #, c-format
 msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
 msgstr ""
 
-#: src/elflint.c:3965
+#: src/elflint.c:4028
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
 msgstr ""
 
-#: src/elflint.c:3988
+#: src/elflint.c:4051
 #, c-format
 msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
 msgstr ""
 
-#: src/elflint.c:3992
+#: src/elflint.c:4055
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
 msgstr ""
 
-#: src/elflint.c:4009
+#: src/elflint.c:4072
 #, c-format
 msgid "phdr[%d]: no note entries defined for the type of file\n"
 msgstr ""
 
-#: src/elflint.c:4028
+#: src/elflint.c:4091
 #, c-format
 msgid "phdr[%d]: cannot get content of note section: %s\n"
 msgstr ""
 
-#: src/elflint.c:4031
+#: src/elflint.c:4094
 #, c-format
 msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
 msgstr ""
 
-#: src/elflint.c:4052
+#: src/elflint.c:4115
 #, c-format
 msgid "section [%2d] '%s': no note entries defined for the type of file\n"
 msgstr ""
 
-#: src/elflint.c:4059
+#: src/elflint.c:4122
 #, c-format
 msgid "section [%2d] '%s': cannot get content of note section\n"
 msgstr ""
 
-#: src/elflint.c:4062
+#: src/elflint.c:4125
 #, c-format
 msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
 msgstr ""
 
-#: src/elflint.c:4080
+#: src/elflint.c:4143
 #, c-format
 msgid ""
 "only executables, shared objects, and core files can have program headers\n"
 msgstr ""
 
-#: src/elflint.c:4095
+#: src/elflint.c:4158
 #, c-format
 msgid "cannot get program header entry %d: %s\n"
 msgstr ""
 
-#: src/elflint.c:4104
+#: src/elflint.c:4167
 #, c-format
 msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
 msgstr ""
 
-#: src/elflint.c:4115
+#: src/elflint.c:4178
 #, c-format
 msgid "more than one INTERP entry in program header\n"
 msgstr ""
 
-#: src/elflint.c:4123
+#: src/elflint.c:4186
 #, c-format
 msgid "more than one TLS entry in program header\n"
 msgstr ""
 
-#: src/elflint.c:4130
+#: src/elflint.c:4193
 #, c-format
 msgid "static executable cannot have dynamic sections\n"
 msgstr ""
 
-#: src/elflint.c:4144
+#: src/elflint.c:4207
 #, c-format
 msgid "dynamic section reference in program header has wrong offset\n"
 msgstr ""
 
-#: src/elflint.c:4147
+#: src/elflint.c:4210
 #, c-format
 msgid "dynamic section size mismatch in program and section header\n"
 msgstr ""
 
-#: src/elflint.c:4157
+#: src/elflint.c:4220
 #, c-format
 msgid "more than one GNU_RELRO entry in program header\n"
 msgstr ""
 
-#: src/elflint.c:4178
+#: src/elflint.c:4241
 #, c-format
 msgid "loadable segment GNU_RELRO applies to is not writable\n"
 msgstr ""
 
-#: src/elflint.c:4181
+#: src/elflint.c:4244
 #, c-format
 msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
 msgstr ""
 
-#: src/elflint.c:4189 src/elflint.c:4212
+#: src/elflint.c:4252 src/elflint.c:4275
 #, c-format
 msgid "%s segment not contained in a loaded segment\n"
 msgstr ""
 
-#: src/elflint.c:4218
+#: src/elflint.c:4281
 #, c-format
 msgid "program header offset in ELF header and PHDR entry do not match"
 msgstr ""
 
-#: src/elflint.c:4242
+#: src/elflint.c:4305
 #, c-format
 msgid "call frame search table reference in program header has wrong offset\n"
 msgstr ""
 
-#: src/elflint.c:4245
+#: src/elflint.c:4308
 #, c-format
 msgid "call frame search table size mismatch in program and section header\n"
 msgstr ""
 
-#: src/elflint.c:4258
+#: src/elflint.c:4321
 #, c-format
 msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
 msgstr ""
 
-#: src/elflint.c:4266
+#: src/elflint.c:4329
 #, c-format
 msgid "call frame search table must be allocated\n"
 msgstr ""
 
-#: src/elflint.c:4269
+#: src/elflint.c:4332
 #, c-format
 msgid "section [%2zu] '%s' must be allocated\n"
 msgstr ""
 
-#: src/elflint.c:4273
+#: src/elflint.c:4336
 #, c-format
 msgid "call frame search table must not be writable\n"
 msgstr ""
 
-#: src/elflint.c:4276
+#: src/elflint.c:4339
 #, c-format
 msgid "section [%2zu] '%s' must not be writable\n"
 msgstr ""
 
-#: src/elflint.c:4281
+#: src/elflint.c:4344
 #, c-format
 msgid "call frame search table must not be executable\n"
 msgstr ""
 
-#: src/elflint.c:4284
+#: src/elflint.c:4347
 #, c-format
 msgid "section [%2zu] '%s' must not be executable\n"
 msgstr ""
 
-#: src/elflint.c:4295
+#: src/elflint.c:4358
 #, c-format
 msgid "program header entry %d: file size greater than memory size\n"
 msgstr ""
 
-#: src/elflint.c:4302
+#: src/elflint.c:4365
 #, c-format
 msgid "program header entry %d: alignment not a power of 2\n"
 msgstr ""
 
-#: src/elflint.c:4305
+#: src/elflint.c:4368
 #, c-format
 msgid ""
 "program header entry %d: file offset and virtual address not module of "
 "alignment\n"
 msgstr ""
 
-#: src/elflint.c:4318
+#: src/elflint.c:4381
 #, c-format
 msgid ""
 "executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
 "program header entry"
 msgstr ""
 
-#: src/elflint.c:4352
+#: src/elflint.c:4415
 #, c-format
 msgid "cannot read ELF header: %s\n"
 msgstr ""
 
-#: src/elflint.c:4378
+#: src/elflint.c:4441
 #, c-format
 msgid "text relocation flag set but not needed\n"
 msgstr ""
@@ -3347,7 +3417,8 @@ msgstr ""
 "警告: `%1$s の大きさが %3$s の %2$<PRIu64> から %5$s の %4$<PRIu64> に変更さ"
 "れました"
 
-#: src/ldgeneric.c:651 src/ldgeneric.c:1112 src/readelf.c:640 src/strip.c:562
+#: src/ldgeneric.c:651 src/ldgeneric.c:1112 src/readelf.c:527
+#: src/readelf.c:829 src/strip.c:563
 #, c-format
 msgid "cannot determine number of sections: %s"
 msgstr "セクション数を決定できません: %s"
@@ -3585,7 +3656,7 @@ msgstr "内部エラー: 非 nobits セクションが nobits セクションに
 msgid "cannot get header of 0th section: %s"
 msgstr "0番目のセクションのヘッダーを得られません: %s"
 
-#: src/ldgeneric.c:6930 src/unstrip.c:1810
+#: src/ldgeneric.c:6930 src/unstrip.c:1818
 #, c-format
 msgid "cannot update ELF header: %s"
 msgstr "ELF ヘッダーを更新できません: %s"
@@ -3752,7 +3823,7 @@ msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
 msgstr "%s: 内部エラー %d (%s-%s): %s"
 
 #: src/nm.c:398 src/nm.c:410 src/size.c:309 src/size.c:318 src/size.c:329
-#: src/strip.c:2124
+#: src/strip.c:2155
 #, c-format
 msgid "while closing '%s'"
 msgstr "'%s' を閉じている最中"
@@ -3796,17 +3867,17 @@ msgstr "%s%s%s: ファイル形式を認識できません"
 msgid "cannot create search tree"
 msgstr "検索ツリーを生成できません"
 
-#: src/nm.c:757 src/nm.c:1156 src/objdump.c:787 src/readelf.c:896
-#: src/readelf.c:1039 src/readelf.c:1187 src/readelf.c:1369 src/readelf.c:1569
-#: src/readelf.c:1755 src/readelf.c:1965 src/readelf.c:2219 src/readelf.c:2285
-#: src/readelf.c:2363 src/readelf.c:2861 src/readelf.c:2897 src/readelf.c:2959
-#: src/readelf.c:7270 src/readelf.c:8176 src/readelf.c:8323 src/readelf.c:8391
-#: src/size.c:417 src/size.c:491 src/strip.c:502
+#: src/nm.c:757 src/nm.c:1163 src/objdump.c:787 src/readelf.c:536
+#: src/readelf.c:1085 src/readelf.c:1245 src/readelf.c:1393 src/readelf.c:1579
+#: src/readelf.c:1785 src/readelf.c:1972 src/readelf.c:2196 src/readelf.c:2454
+#: src/readelf.c:2524 src/readelf.c:2606 src/readelf.c:3117 src/readelf.c:3153
+#: src/readelf.c:3216 src/readelf.c:7920 src/readelf.c:9002 src/readelf.c:9149
+#: src/readelf.c:9217 src/size.c:417 src/size.c:487 src/strip.c:503
 #, c-format
 msgid "cannot get section header string table index"
 msgstr "セクションヘッダー文字列テーブル索引が得られません"
 
-#: src/nm.c:782
+#: src/nm.c:784
 #, c-format
 msgid ""
 "\n"
@@ -3819,7 +3890,7 @@ msgstr ""
 "%s からのシンボル:\n"
 "\n"
 
-#: src/nm.c:785
+#: src/nm.c:787
 #, c-format
 msgid ""
 "%*s%-*s %-*s Class  Type     %-*s %*s Section\n"
@@ -3828,22 +3899,22 @@ msgstr ""
 "%*s%-*s %-*s クラス タイプ   %-*s %*s セクション\n"
 "\n"
 
-#: src/nm.c:1166
+#: src/nm.c:1173
 #, c-format
 msgid "%s: entry size in section `%s' is not what we expect"
 msgstr "%s: セクションの項目の大きさ `%s' は予期したものとは異なります"
 
-#: src/nm.c:1170
+#: src/nm.c:1177
 #, c-format
 msgid "%s: size of section `%s' is not multiple of entry size"
 msgstr "%s: セクション `%s' の大きさは項目の大きさの整数倍ではありません"
 
-#: src/nm.c:1428
+#: src/nm.c:1435
 #, c-format
 msgid "%s%s%s%s: Invalid operation"
 msgstr "%s%s%s%s: 不当な操作"
 
-#: src/nm.c:1485
+#: src/nm.c:1492
 #, c-format
 msgid "%s%s%s: no symbols"
 msgstr "%s%s%s: シンボルがありません"
@@ -3877,7 +3948,7 @@ msgstr ""
 msgid "Show information from FILEs (a.out by default)."
 msgstr ""
 
-#: src/objdump.c:236 src/readelf.c:439
+#: src/objdump.c:236 src/readelf.c:473
 msgid "No operation specified.\n"
 msgstr "操作が指定されていません。\n"
 
@@ -3886,11 +3957,11 @@ msgstr "操作が指定されていません。\n"
 msgid "while close `%s'"
 msgstr ""
 
-#: src/objdump.c:379 src/readelf.c:1664 src/readelf.c:1838
+#: src/objdump.c:379 src/readelf.c:1880 src/readelf.c:2069
 msgid "INVALID SYMBOL"
 msgstr "不当なシンボル"
 
-#: src/objdump.c:394 src/readelf.c:1695 src/readelf.c:1871
+#: src/objdump.c:394 src/readelf.c:1911 src/readelf.c:2102
 msgid "INVALID SECTION"
 msgstr "不当なセクション"
 
@@ -3944,186 +4015,247 @@ msgstr ""
 msgid "error while freeing sub-ELF descriptor: %s"
 msgstr ""
 
-#: src/readelf.c:67
+#: src/readelf.c:71
+#, fuzzy
+msgid "ELF input selection:"
+msgstr "出力選択:"
+
+#: src/readelf.c:73
+msgid ""
+"Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data"
+msgstr ""
+
+#: src/readelf.c:75
 #, fuzzy
 msgid "ELF output selection:"
 msgstr "出力選択:"
 
-#: src/readelf.c:69
+#: src/readelf.c:77
 msgid "All these plus -p .strtab -p .dynstr -p .comment"
 msgstr ""
 
-#: src/readelf.c:70
+#: src/readelf.c:78
 msgid "Display the dynamic segment"
 msgstr "動的セグメントを表示"
 
-#: src/readelf.c:71
+#: src/readelf.c:79
 msgid "Display the ELF file header"
 msgstr "ELF ファイルヘッダーを表示"
 
-#: src/readelf.c:73
+#: src/readelf.c:81
 msgid "Display histogram of bucket list lengths"
 msgstr "バケットリスト長の柱状図を表示"
 
-#: src/readelf.c:74
+#: src/readelf.c:82
 msgid "Display the program headers"
 msgstr "プログラムヘッダーを表示"
 
-#: src/readelf.c:76
+#: src/readelf.c:84
 msgid "Display relocations"
 msgstr "リロケーションを表示"
 
-#: src/readelf.c:77
+#: src/readelf.c:85
 #, fuzzy
 msgid "Display the sections' headers"
 msgstr "セクションのヘッダーを表示"
 
-#: src/readelf.c:79
+#: src/readelf.c:87
 msgid "Display the symbol table"
 msgstr "シンボルテーブルを表示"
 
-#: src/readelf.c:80
+#: src/readelf.c:88
 msgid "Display versioning information"
 msgstr "バージョニング情報の表示"
 
-#: src/readelf.c:81
+#: src/readelf.c:89
 #, fuzzy
 msgid "Display the ELF notes"
 msgstr "コアノートを表示"
 
-#: src/readelf.c:83
+#: src/readelf.c:91
 #, fuzzy
 msgid "Display architecture specific information, if any"
 msgstr "(もしあれば)アーキテクチャー固有の情報を表示"
 
-#: src/readelf.c:85
+#: src/readelf.c:93
 msgid "Display sections for exception handling"
 msgstr "例外を取り扱うためのセクションを表示"
 
-#: src/readelf.c:87
+#: src/readelf.c:95
 #, fuzzy
 msgid "Additional output selection:"
 msgstr "出力選択:"
 
-#: src/readelf.c:89
+#: src/readelf.c:97
 #, fuzzy
 msgid ""
 "Display DWARF section content.  SECTION can be one of abbrev, aranges, "
-"frame, gdb_index, info, loc, line, ranges, pubnames, str, macinfo, macro or "
-"exception"
+"decodedaranges, frame, gdb_index, info, loc, line, decodedline, ranges, "
+"pubnames, str, macinfo, macro or exception"
 msgstr ""
 "DWARF セクションの内容を表示。SECTION は addrevか、aranges、frame、info、"
 "loc、ranges、pubnames、str、macinfo、exception のいずれかです"
 
-#: src/readelf.c:93
+#: src/readelf.c:101
 msgid "Dump the uninterpreted contents of SECTION, by number or name"
 msgstr "数字か名前で解釈できないセクションの内容をダンプする"
 
-#: src/readelf.c:95
+#: src/readelf.c:103
 msgid "Print string contents of sections"
 msgstr "セクションの文字列内容を印刷する"
 
-#: src/readelf.c:98
+#: src/readelf.c:106
 msgid "Display the symbol index of an archive"
 msgstr "アーカイブのシンボル索引を表示"
 
-#: src/readelf.c:100
+#: src/readelf.c:108
 msgid "Output control:"
 msgstr "出力制御:"
 
-#: src/readelf.c:102
+#: src/readelf.c:110
 msgid "Do not find symbol names for addresses in DWARF data"
 msgstr "DWARFデータ中のアドレスのためのシンボル名を探さない"
 
-#: src/readelf.c:104
+#: src/readelf.c:112
+#, fuzzy
+msgid ""
+"Display just offsets instead of resolving values to addresses in DWARF data"
+msgstr "DWARFデータ中のアドレスのためのシンボル名を探さない"
+
+#: src/readelf.c:114
 msgid "Ignored for compatibility (lines always wide)"
 msgstr ""
 
-#: src/readelf.c:109
+#: src/readelf.c:119
 msgid "Print information from ELF file in human-readable form."
 msgstr "ELF ファイルから人間が読める形で情報を印刷する。"
 
-#: src/readelf.c:410
+#: src/readelf.c:441
 #, c-format
 msgid "Unknown DWARF debug section `%s'.\n"
 msgstr "不明な DWARF デバッグセクション `%s'.\n"
 
-#: src/readelf.c:476
+#: src/readelf.c:520 src/readelf.c:631
 #, c-format
 msgid "cannot generate Elf descriptor: %s"
 msgstr "Elf 記述子を生成できません: %s"
 
-#: src/readelf.c:488
+#: src/readelf.c:545 src/readelf.c:1099 src/readelf.c:1269
 #, c-format
-msgid "'%s' is not an archive, cannot print archive index"
-msgstr "'%s' はアーカイブではなく、アーカイブ索引を印刷できません"
+msgid "cannot get section: %s"
+msgstr "セクションを得られません: %s"
+
+#: src/readelf.c:554 src/readelf.c:1106 src/readelf.c:1277 src/readelf.c:9169
+#: src/unstrip.c:352 src/unstrip.c:383 src/unstrip.c:432 src/unstrip.c:540
+#: src/unstrip.c:557 src/unstrip.c:593 src/unstrip.c:791 src/unstrip.c:1059
+#: src/unstrip.c:1250 src/unstrip.c:1310 src/unstrip.c:1431 src/unstrip.c:1484
+#: src/unstrip.c:1591 src/unstrip.c:1780
+#, c-format
+msgid "cannot get section header: %s"
+msgstr "セクションヘッダーを得られません: %s"
+
+#: src/readelf.c:562
+#, fuzzy, c-format
+msgid "cannot get section name"
+msgstr "セクションを得られません: %s"
+
+#: src/readelf.c:571 src/readelf.c:5221 src/readelf.c:7414 src/readelf.c:7516
+#: src/readelf.c:7674
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr "%s の内容を得られません: %s"
+
+#: src/readelf.c:587
+#, fuzzy, c-format
+msgid "cannot create temp file '%s'"
+msgstr "新しいファイル '%s' を生成できません: %s"
+
+#: src/readelf.c:596
+#, fuzzy, c-format
+msgid "cannot write section data"
+msgstr "セクションデータを割り当てられません: %s"
 
-#: src/readelf.c:493
+#: src/readelf.c:602 src/readelf.c:619 src/readelf.c:648
 #, c-format
 msgid "error while closing Elf descriptor: %s"
 msgstr "Elf 記述子を閉じている時にエラー: %s"
 
-#: src/readelf.c:585
+#: src/readelf.c:609
+#, fuzzy, c-format
+msgid "error while rewinding file descriptor"
+msgstr "Elf 記述子を閉じている時にエラー: %s"
+
+#: src/readelf.c:643
+#, c-format
+msgid "'%s' is not an archive, cannot print archive index"
+msgstr "'%s' はアーカイブではなく、アーカイブ索引を印刷できません"
+
+#: src/readelf.c:742
+#, fuzzy, c-format
+msgid "No such section '%s' in '%s'"
+msgstr "セクション [%Zu] '%s' からデータが得られません: %s"
+
+#: src/readelf.c:769
 #, c-format
 msgid "cannot stat input file"
 msgstr "入力ファイルを stat できません"
 
-#: src/readelf.c:587
+#: src/readelf.c:771
 #, c-format
 msgid "input file is empty"
 msgstr "入力ファイルが空です"
 
-#: src/readelf.c:589
+#: src/readelf.c:773
 #, c-format
 msgid "failed reading '%s': %s"
 msgstr "'%s' の読込みに失敗: %s"
 
-#: src/readelf.c:625
+#: src/readelf.c:814
 #, c-format
 msgid "cannot read ELF header: %s"
 msgstr "ELF ヘッダーが読めません: %s"
 
-#: src/readelf.c:633
+#: src/readelf.c:822
 #, c-format
 msgid "cannot create EBL handle"
 msgstr "EBL ヘッダーを生成できません"
 
-#: src/readelf.c:646
+#: src/readelf.c:835
 #, fuzzy, c-format
 msgid "cannot determine number of program headers: %s"
 msgstr "セクション数を決定できません: %s"
 
-#: src/readelf.c:732
+#: src/readelf.c:921
 msgid "NONE (None)"
 msgstr "なし (なし)"
 
-#: src/readelf.c:733
+#: src/readelf.c:922
 msgid "REL (Relocatable file)"
 msgstr "REL (リロケータブルファイル)"
 
-#: src/readelf.c:734
+#: src/readelf.c:923
 msgid "EXEC (Executable file)"
 msgstr "(EXEC (実行ファイル)"
 
-#: src/readelf.c:735
+#: src/readelf.c:924
 msgid "DYN (Shared object file)"
 msgstr "DYN (共用オブジェクトファイル)"
 
-#: src/readelf.c:736
+#: src/readelf.c:925
 msgid "CORE (Core file)"
 msgstr "CORE (コアファイル)"
 
-#: src/readelf.c:741
+#: src/readelf.c:930
 #, c-format
 msgid "OS Specific: (%x)\n"
 msgstr "OS 固有: (%x)\n"
 
-#: src/readelf.c:743
+#: src/readelf.c:932
 #, c-format
 msgid "Processor Specific: (%x)\n"
 msgstr "プロセッサー固有: (%x)\n"
 
-#: src/readelf.c:753
+#: src/readelf.c:942
 msgid ""
 "ELF Header:\n"
 "  Magic:  "
@@ -4131,7 +4263,7 @@ msgstr ""
 "ELF ヘッダー:\n"
 " マジック: "
 
-#: src/readelf.c:757
+#: src/readelf.c:946
 #, c-format
 msgid ""
 "\n"
@@ -4140,117 +4272,117 @@ msgstr ""
 "\n"
 "  クラス:                            %s\n"
 
-#: src/readelf.c:762
+#: src/readelf.c:951
 #, c-format
 msgid "  Data:                              %s\n"
 msgstr "  データ:                            %s\n"
 
-#: src/readelf.c:768
+#: src/readelf.c:957
 #, c-format
 msgid "  Ident Version:                     %hhd %s\n"
 msgstr "  識別バージョン:                    %hhd %s\n"
 
-#: src/readelf.c:770 src/readelf.c:787
+#: src/readelf.c:959 src/readelf.c:976
 msgid "(current)"
 msgstr "(現在)"
 
-#: src/readelf.c:774
+#: src/readelf.c:963
 #, c-format
 msgid "  OS/ABI:                            %s\n"
 msgstr "  OS/ABI:                            %s\n"
 
-#: src/readelf.c:777
+#: src/readelf.c:966
 #, c-format
 msgid "  ABI Version:                       %hhd\n"
 msgstr "  ABI バージョン:                    %hhd\n"
 
-#: src/readelf.c:780
+#: src/readelf.c:969
 msgid "  Type:                              "
 msgstr "  タイプ:                            "
 
-#: src/readelf.c:783
+#: src/readelf.c:972
 #, c-format
 msgid "  Machine:                           %s\n"
 msgstr "  マシン :                           %s\n"
 
-#: src/readelf.c:785
+#: src/readelf.c:974
 #, c-format
 msgid "  Version:                           %d %s\n"
 msgstr "  バージョン:                        %d %s\n"
 
-#: src/readelf.c:789
+#: src/readelf.c:978
 #, c-format
 msgid "  Entry point address:               %#<PRIx64>\n"
 msgstr "  入口点アドレス     :               %#<PRIx64>\n"
 
-#: src/readelf.c:792
+#: src/readelf.c:981
 #, c-format
 msgid "  Start of program headers:          %<PRId64> %s\n"
 msgstr "  プログラムヘッダーの開始:          %<PRId64> %s\n"
 
-#: src/readelf.c:793 src/readelf.c:796
+#: src/readelf.c:982 src/readelf.c:985
 msgid "(bytes into file)"
 msgstr "(ファイルへのバイト数)"
 
-#: src/readelf.c:795
+#: src/readelf.c:984
 #, c-format
 msgid "  Start of section headers:          %<PRId64> %s\n"
 msgstr "  セクションヘッダーの開始:          %<PRId64> %s\n"
 
-#: src/readelf.c:798
+#: src/readelf.c:987
 #, c-format
 msgid "  Flags:                             %s\n"
 msgstr "  フラグ:                            %s\n"
 
-#: src/readelf.c:801
+#: src/readelf.c:990
 #, c-format
 msgid "  Size of this header:               %<PRId16> %s\n"
 msgstr "  このヘッダーの大きさ:              %<PRId16> %s\n"
 
-#: src/readelf.c:802 src/readelf.c:805 src/readelf.c:822
+#: src/readelf.c:991 src/readelf.c:994 src/readelf.c:1011
 msgid "(bytes)"
 msgstr "(バイト)"
 
-#: src/readelf.c:804
+#: src/readelf.c:993
 #, c-format
 msgid "  Size of program header entries:    %<PRId16> %s\n"
 msgstr "  プログラムヘッダー項目の大きさ:%<PRId16> %s\n"
 
-#: src/readelf.c:807
+#: src/readelf.c:996
 #, fuzzy, c-format
 msgid "  Number of program headers entries: %<PRId16>"
 msgstr "  プログラムヘッダー項目の数 : %<PRId16>\n"
 
-#: src/readelf.c:814
+#: src/readelf.c:1003
 #, fuzzy, c-format
 msgid " (%<PRIu32> in [0].sh_info)"
 msgstr "([0].sh_link の %<PRIu32>)"
 
-#: src/readelf.c:817 src/readelf.c:834 src/readelf.c:848
+#: src/readelf.c:1006 src/readelf.c:1023 src/readelf.c:1037
 msgid " ([0] not available)"
 msgstr "([0]は使えません)"
 
-#: src/readelf.c:821
+#: src/readelf.c:1010
 #, c-format
 msgid "  Size of section header entries:    %<PRId16> %s\n"
 msgstr "  セクションヘッダー項目の大きさ:%<PRId16> %s\n"
 
-#: src/readelf.c:824
+#: src/readelf.c:1013
 #, c-format
 msgid "  Number of section headers entries: %<PRId16>"
 msgstr "  セクションヘッダー項目の数 : %<PRId16>"
 
-#: src/readelf.c:831
+#: src/readelf.c:1020
 #, c-format
 msgid " (%<PRIu32> in [0].sh_size)"
 msgstr " ([0].sh_size の %<PRIu32>)"
 
-#: src/readelf.c:844
+#: src/readelf.c:1033
 #, c-format
 msgid " (%<PRIu32> in [0].sh_link)"
 msgstr "([0].sh_link の %<PRIu32>)"
 
-#: src/readelf.c:852
+#: src/readelf.c:1041
 #, c-format
 msgid ""
 "  Section header string table index: XINDEX%s\n"
@@ -4259,7 +4391,7 @@ msgstr ""
 "  セクションヘッダー文字列テーブル索引: XINDEX%s\n"
 "\n"
 
-#: src/readelf.c:856
+#: src/readelf.c:1045
 #, c-format
 msgid ""
 "  Section header string table index: %<PRId16>\n"
@@ -4268,7 +4400,7 @@ msgstr ""
 "  セクションヘッダー文字列テーブル索引: %<PRId16>\n"
 "\n"
 
-#: src/readelf.c:888
+#: src/readelf.c:1077
 #, c-format
 msgid ""
 "There are %d section headers, starting at offset %#<PRIx64>:\n"
@@ -4277,11 +4409,11 @@ msgstr ""
 "オフセット %2$#<PRIx64> から始まる %1$d 個のセクションヘッダーがあります:\n"
 "\n"
 
-#: src/readelf.c:898
+#: src/readelf.c:1087
 msgid "Section Headers:"
 msgstr "セクションヘッダー:"
 
-#: src/readelf.c:901
+#: src/readelf.c:1090
 msgid ""
 "[Nr] Name                 Type         Addr     Off    Size   ES Flags Lk "
 "Inf Al"
@@ -4289,7 +4421,7 @@ msgstr ""
 "[番] 名前                 タイプ       アドレス オフセ 大きさ ES フラグLk "
 "Inf Al"
 
-#: src/readelf.c:903
+#: src/readelf.c:1092
 msgid ""
 "[Nr] Name                 Type         Addr             Off      Size     ES "
 "Flags Lk Inf Al"
@@ -4297,31 +4429,17 @@ msgstr ""
 "[番] 名前                 タイプ       アドレス         オフセ   大きさ   ES "
 "フラグLk Inf Al"
 
-#: src/readelf.c:910 src/readelf.c:1063
-#, c-format
-msgid "cannot get section: %s"
-msgstr "セクションを得られません: %s"
-
-#: src/readelf.c:917 src/readelf.c:1071 src/readelf.c:8343 src/unstrip.c:345
-#: src/unstrip.c:376 src/unstrip.c:425 src/unstrip.c:533 src/unstrip.c:550
-#: src/unstrip.c:586 src/unstrip.c:784 src/unstrip.c:1052 src/unstrip.c:1242
-#: src/unstrip.c:1302 src/unstrip.c:1423 src/unstrip.c:1476 src/unstrip.c:1583
-#: src/unstrip.c:1772
-#, c-format
-msgid "cannot get section header: %s"
-msgstr "セクションヘッダーを得られません: %s"
-
-#: src/readelf.c:975
+#: src/readelf.c:1164
 msgid "Program Headers:"
 msgstr "プログラムヘッダー:"
 
-#: src/readelf.c:977
+#: src/readelf.c:1166
 msgid ""
 "  Type           Offset   VirtAddr   PhysAddr   FileSiz  MemSiz   Flg Align"
 msgstr ""
 "  タイプ         オフセ   仮アドレス 物アドレス ファイ量 メモ量   Flg 調整 "
 
-#: src/readelf.c:980
+#: src/readelf.c:1169
 msgid ""
 "  Type           Offset   VirtAddr           PhysAddr           FileSiz  "
 "MemSiz   Flg Align"
@@ -4329,12 +4447,12 @@ msgstr ""
 "  タイプ         オフセ   仮想アドレス       物理アドレス      ファイル量メモ"
 "量   Flg 調整 "
 
-#: src/readelf.c:1020
+#: src/readelf.c:1226
 #, c-format
 msgid "\t[Requesting program interpreter: %s]\n"
 msgstr "\t[プログラム割込みを要求: %s]\n"
 
-#: src/readelf.c:1041
+#: src/readelf.c:1247
 msgid ""
 "\n"
 " Section to Segment mapping:\n"
@@ -4344,12 +4462,12 @@ msgstr ""
 " セクションからセグメントへのマッビング:\n"
 "  セグメント セクション..."
 
-#: src/readelf.c:1052 src/unstrip.c:1827 src/unstrip.c:1866 src/unstrip.c:1873
+#: src/readelf.c:1258 src/unstrip.c:1835 src/unstrip.c:1874 src/unstrip.c:1881
 #, c-format
 msgid "cannot get program header: %s"
 msgstr "プログラムヘッダーを得られません: %s"
 
-#: src/readelf.c:1193
+#: src/readelf.c:1401
 #, c-format
 msgid ""
 "\n"
@@ -4362,7 +4480,7 @@ msgstr[0] ""
 "署名 '%3$s' を持つ COMDAT セクショングループ [%1$2zu] '%2$s' には %4$zu 個の"
 "項目があります:\n"
 
-#: src/readelf.c:1198
+#: src/readelf.c:1406
 #, c-format
 msgid ""
 "\n"
@@ -4375,15 +4493,21 @@ msgstr[0] ""
 "署名 '%3$s' を持つセクショングループ [%1$2zu] '%2$s' には %4$zu 個の項目があ"
 "ります:\n"
 
-#: src/readelf.c:1206
+#: src/readelf.c:1414
 msgid "<INVALID SYMBOL>"
 msgstr "<不当なシンボル>"
 
-#: src/readelf.c:1220
+#: src/readelf.c:1428
 msgid "<INVALID SECTION>"
 msgstr "<不当なセクション>"
 
-#: src/readelf.c:1371
+#: src/readelf.c:1585 src/readelf.c:2202 src/readelf.c:2460 src/readelf.c:2530
+#: src/readelf.c:2812 src/readelf.c:2885 src/readelf.c:4488
+#, fuzzy, c-format
+msgid "invalid sh_link value in section %Zu"
+msgstr "不当な .debug_line セクション"
+
+#: src/readelf.c:1588
 #, c-format
 msgid ""
 "\n"
@@ -4399,36 +4523,36 @@ msgstr[0] ""
 " アドレス: %#0*<PRIx64>  オフセット: %#08<PRIx64>  セクションへのリンク: "
 "[%2u] '%s'\n"
 
-#: src/readelf.c:1383
+#: src/readelf.c:1598
 msgid "  Type              Value\n"
 msgstr "  タイプ            値\n"
 
-#: src/readelf.c:1407
+#: src/readelf.c:1622
 #, c-format
 msgid "Shared library: [%s]\n"
 msgstr "共用ライブラリー: [%s]\n"
 
-#: src/readelf.c:1412
+#: src/readelf.c:1627
 #, c-format
 msgid "Library soname: [%s]\n"
 msgstr "ライブラリー so 名: [%s]\n"
 
-#: src/readelf.c:1417
+#: src/readelf.c:1632
 #, c-format
 msgid "Library rpath: [%s]\n"
 msgstr "ライブラリー rパス: [%s]\n"
 
-#: src/readelf.c:1422
+#: src/readelf.c:1637
 #, c-format
 msgid "Library runpath: [%s]\n"
 msgstr "ライブラリー run パス: [%s]\n"
 
-#: src/readelf.c:1442
+#: src/readelf.c:1657
 #, c-format
 msgid "%<PRId64> (bytes)\n"
 msgstr "%<PRId64> (バイト)\n"
 
-#: src/readelf.c:1554 src/readelf.c:1740
+#: src/readelf.c:1770 src/readelf.c:1957
 #, c-format
 msgid ""
 "\n"
@@ -4437,7 +4561,7 @@ msgstr ""
 "\n"
 "オフセット %#0<PRIx64> に不当なシンボルテーブル\n"
 
-#: src/readelf.c:1572 src/readelf.c:1757
+#: src/readelf.c:1788 src/readelf.c:1975
 #, c-format
 msgid ""
 "\n"
@@ -4452,7 +4576,7 @@ msgstr[0] ""
 "オフセット %5$#0<PRIx64> のセクション [%3$2u] '%4$s' 用のリロケーションセク"
 "ション [%1$2zu] '%2$s' には %6$d 個の項目があります:\n"
 
-#: src/readelf.c:1587
+#: src/readelf.c:1803 src/readelf.c:1990
 #, c-format
 msgid ""
 "\n"
@@ -4465,29 +4589,29 @@ msgstr[0] ""
 "オフセット %3$#0<PRIx64> のリロケーションセクション [%1$2u] '%2$s' には %4$d "
 "個の項目があります:\n"
 
-#: src/readelf.c:1597
+#: src/readelf.c:1813
 msgid "  Offset      Type                 Value       Name\n"
 msgstr "  オフセット  タイプ               値          名前\n"
 
-#: src/readelf.c:1599
+#: src/readelf.c:1815
 msgid "  Offset              Type                 Value               Name\n"
 msgstr "  オフセット          タイプ               値                  名前\n"
 
-#: src/readelf.c:1652 src/readelf.c:1663 src/readelf.c:1676 src/readelf.c:1694
-#: src/readelf.c:1706 src/readelf.c:1825 src/readelf.c:1837 src/readelf.c:1851
-#: src/readelf.c:1870 src/readelf.c:1883
+#: src/readelf.c:1868 src/readelf.c:1879 src/readelf.c:1892 src/readelf.c:1910
+#: src/readelf.c:1922 src/readelf.c:2056 src/readelf.c:2068 src/readelf.c:2082
+#: src/readelf.c:2101 src/readelf.c:2114
 msgid "<INVALID RELOC>"
 msgstr "<不当なRELOC>"
 
-#: src/readelf.c:1769
+#: src/readelf.c:2000
 msgid "  Offset      Type            Value       Addend Name\n"
 msgstr "  オフセット  タイプ          値          付加名\n"
 
-#: src/readelf.c:1771
+#: src/readelf.c:2002
 msgid "  Offset              Type            Value               Addend Name\n"
 msgstr "  オフセット          タイプ          値                  付加名\n"
 
-#: src/readelf.c:1972
+#: src/readelf.c:2210
 #, c-format
 msgid ""
 "\n"
@@ -4499,39 +4623,39 @@ msgstr[0] ""
 "\n"
 "シンボルテーブル [%2u] '%s' には %u 個の項目があります:\n"
 
-#: src/readelf.c:1978
+#: src/readelf.c:2215
 #, 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:1988
+#: src/readelf.c:2223
 msgid "  Num:    Value   Size Type    Bind   Vis          Ndx Name\n"
 msgstr "  数 :    値      大き タイプ  Bind   Vis          Ndx 名前\n"
 
-#: src/readelf.c:1990
+#: src/readelf.c:2225
 msgid "  Num:            Value   Size Type    Bind   Vis          Ndx Name\n"
 msgstr "  数 :            値      大き タイプ  Bind   Vis          Ndx 名前\n"
 
-#: src/readelf.c:2010
+#: src/readelf.c:2245
 #, 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:2098
+#: src/readelf.c:2333
 #, c-format
 msgid "bad dynamic symbol"
 msgstr "不正な動的シンボル"
 
-#: src/readelf.c:2180
+#: src/readelf.c:2415
 msgid "none"
 msgstr "なし"
 
-#: src/readelf.c:2197
+#: src/readelf.c:2432
 msgid "| <unknown>"
 msgstr "| <不明>"
 
-#: src/readelf.c:2222
+#: src/readelf.c:2463
 #, c-format
 msgid ""
 "\n"
@@ -4547,17 +4671,17 @@ msgstr[0] ""
 " アドレス: %#0*<PRIx64>  オフセット: %#08<PRIx64>  セクションへのリンク: "
 "[%2u] '%s'\n"
 
-#: src/readelf.c:2245
+#: src/readelf.c:2484
 #, c-format
 msgid "  %#06x: Version: %hu  File: %s  Cnt: %hu\n"
 msgstr "  %#06x: バージョン: %hu  ファイル: %s  数: %hu\n"
 
-#: src/readelf.c:2258
+#: src/readelf.c:2497
 #, c-format
 msgid "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 msgstr "  %#06x: 名前: %s  フラグ: %s  バージョン: %hu\n"
 
-#: src/readelf.c:2289
+#: src/readelf.c:2534
 #, c-format
 msgid ""
 "\n"
@@ -4573,17 +4697,17 @@ msgstr[0] ""
 " アドレス: %#0*<PRIx64>  オフセット: %#08<PRIx64>  セクションへのリンク: "
 "[%2u] '%s'\n"
 
-#: src/readelf.c:2319
+#: src/readelf.c:2562
 #, 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:2334
+#: src/readelf.c:2577
 #, c-format
 msgid "  %#06x: Parent %d: %s\n"
 msgstr "  %#06x: 親 %d: %s\n"
 
-#: src/readelf.c:2566
+#: src/readelf.c:2816
 #, c-format
 msgid ""
 "\n"
@@ -4599,15 +4723,15 @@ msgstr[0] ""
 " アドレス: %#0*<PRIx64>  オフセット: %#08<PRIx64>  セクションへのリンク: "
 "[%2u] '%s'"
 
-#: src/readelf.c:2596
+#: src/readelf.c:2844
 msgid "   0 *local*                     "
 msgstr "   0 *ローカル*                  "
 
-#: src/readelf.c:2601
+#: src/readelf.c:2849
 msgid "   1 *global*                    "
 msgstr "   1 *グローバル*                "
 
-#: src/readelf.c:2632
+#: src/readelf.c:2890
 #, c-format
 msgid ""
 "\n"
@@ -4625,22 +4749,22 @@ msgstr[0] ""
 " アドレス: %#0*<PRIx64>  オフセット: %#08<PRIx64>  セクションへのリンク: "
 "[%2u] '%s'\n"
 
-#: src/readelf.c:2656
+#: src/readelf.c:2912
 #, fuzzy, no-c-format
 msgid " Length  Number  % of total  Coverage\n"
 msgstr " 長さ    数      全体の%     範囲    \n"
 
-#: src/readelf.c:2658
+#: src/readelf.c:2914
 #, c-format
 msgid "      0  %6<PRIu32>      %5.1f%%\n"
 msgstr "      0  %6<PRIu32>      %5.1f%%\n"
 
-#: src/readelf.c:2665
+#: src/readelf.c:2921
 #, c-format
 msgid "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 msgstr "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 
-#: src/readelf.c:2678
+#: src/readelf.c:2934
 #, fuzzy, c-format
 msgid ""
 " Average number of tests:   successful lookup: %f\n"
@@ -4649,12 +4773,12 @@ msgstr ""
 " テストの平均数: 検索成功: %f\n"
 "                 検索失敗: %f\n"
 
-#: src/readelf.c:2696 src/readelf.c:2738 src/readelf.c:2779
+#: src/readelf.c:2952 src/readelf.c:2994 src/readelf.c:3035
 #, c-format
 msgid "cannot get data for section %d: %s"
 msgstr "セクションからデータを得られません %d: %s"
 
-#: src/readelf.c:2833
+#: src/readelf.c:3089
 #, c-format
 msgid ""
 " Symbol Bias: %u\n"
@@ -4664,7 +4788,7 @@ msgstr ""
 " ビットマスクの大きさ: %zu バイト  %<PRIuFAST32>%% ビット設定 第2ハッシュシフ"
 "ト: %u\n"
 
-#: src/readelf.c:2907
+#: src/readelf.c:3164
 #, c-format
 msgid ""
 "\n"
@@ -4677,7 +4801,7 @@ msgstr[0] ""
 "オフセット %3$#0<PRIx64> のライブラリー一覧セクション [%1$2zu] '%2$s' には "
 "%4$d 個の項目があります:\n"
 
-#: src/readelf.c:2921
+#: src/readelf.c:3178
 msgid ""
 "       Library                       Time Stamp          Checksum Version "
 "Flags"
@@ -4685,7 +4809,7 @@ msgstr ""
 "       ライブラリー                  タイムスタンプ      チェックサム バー"
 "ジョン フラグ"
 
-#: src/readelf.c:2971
+#: src/readelf.c:3228
 #, c-format
 msgid ""
 "\n"
@@ -4696,135 +4820,140 @@ msgstr ""
 "オフセット %4$#0<PRIx64> の %3$<PRIu64> バイトのオブジェクト属性セクション "
 "[%1$2zu] '%2$s':\n"
 
-#: src/readelf.c:2987
+#: src/readelf.c:3244
 msgid "  Owner          Size\n"
 msgstr "  所有者         大きさ\n"
 
-#: src/readelf.c:3013
+#: src/readelf.c:3270
 #, c-format
 msgid "  %-13s  %4<PRIu32>\n"
 msgstr "  %-13s  %4<PRIu32>\n"
 
-#: src/readelf.c:3045
+#: src/readelf.c:3302
 #, c-format
 msgid "    %-4u %12<PRIu32>\n"
 msgstr "    %-4u %12<PRIu32>\n"
 
-#: src/readelf.c:3050
+#: src/readelf.c:3307
 #, c-format
 msgid "    File: %11<PRIu32>\n"
 msgstr "    ファイル: %11<PRIu32>\n"
 
-#: src/readelf.c:3085
+#: src/readelf.c:3342
 #, c-format
 msgid "      %s: %<PRId64>, %s\n"
 msgstr "      %s: %<PRId64>、%s\n"
 
-#: src/readelf.c:3088
+#: src/readelf.c:3345
 #, c-format
 msgid "      %s: %<PRId64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:3091
+#: src/readelf.c:3348
 #, c-format
 msgid "      %s: %s\n"
 msgstr "      %s: %s\n"
 
-#: src/readelf.c:3098
+#: src/readelf.c:3355
 #, c-format
 msgid "      %u: %<PRId64>\n"
 msgstr "      %u: %<PRId64>\n"
 
-#: src/readelf.c:3101
+#: src/readelf.c:3358
 #, c-format
 msgid "      %u: %s\n"
 msgstr "      %u: %s\n"
 
-#: src/readelf.c:3137
+#: src/readelf.c:3403
 #, c-format
 msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3140
+#: src/readelf.c:3406
 #, c-format
 msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3145
+#: src/readelf.c:3411
 #, c-format
 msgid "%#<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%#<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3148
+#: src/readelf.c:3414
 #, c-format
 msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%#0*<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3154
+#: src/readelf.c:3420
 #, c-format
 msgid "%s+%#<PRIx64> <%s>"
 msgstr "%s+%#<PRIx64> <%s>"
 
-#: src/readelf.c:3157
+#: src/readelf.c:3423
 #, c-format
 msgid "%s+%#0*<PRIx64> <%s>"
 msgstr "%s+%#0*<PRIx64> <%s>"
 
-#: src/readelf.c:3161
+#: src/readelf.c:3427
 #, c-format
 msgid "%#<PRIx64> <%s>"
 msgstr "%#<PRIx64> <%s>"
 
-#: src/readelf.c:3164
+#: src/readelf.c:3430
 #, c-format
 msgid "%#0*<PRIx64> <%s>"
 msgstr "%#0*<PRIx64> <%s>"
 
-#: src/readelf.c:3169
+#: src/readelf.c:3435
 #, c-format
 msgid "%s+%#<PRIx64>"
 msgstr "%s+%#<PRIx64>"
 
-#: src/readelf.c:3172
+#: src/readelf.c:3438
 #, c-format
 msgid "%s+%#0*<PRIx64>"
 msgstr "%s+%#0*<PRIx64>"
 
-#: src/readelf.c:3554
+#: src/readelf.c:3820
 msgid "empty block"
 msgstr "空ブロック"
 
-#: src/readelf.c:3557
+#: src/readelf.c:3823
 #, c-format
 msgid "%zu byte block:"
 msgstr "%zu バイトのブロック:"
 
-#: src/readelf.c:3934
+#: src/readelf.c:4217
 #, c-format
 msgid "%*s[%4<PRIuMAX>] %s  <TRUNCATED>\n"
 msgstr "%*s[%4<PRIuMAX>] %s  <TRUNCATED>\n"
 
-#: src/readelf.c:3970
+#: src/readelf.c:4274
 #, c-format
 msgid "%s %#<PRIx64> used with different address sizes"
 msgstr ""
 
-#: src/readelf.c:3977
+#: src/readelf.c:4281
 #, c-format
 msgid "%s %#<PRIx64> used with different offset sizes"
 msgstr ""
 
-#: src/readelf.c:4057
+#: src/readelf.c:4288
+#, c-format
+msgid "%s %#<PRIx64> used with different base addresses"
+msgstr ""
+
+#: src/readelf.c:4370
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE IN REST OF SECTION>\n"
 msgstr ""
 
-#: src/readelf.c:4065
+#: src/readelf.c:4378
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
 msgstr ""
 
-#: src/readelf.c:4087
+#: src/readelf.c:4404
 #, c-format
 msgid ""
 "\n"
@@ -4835,7 +4964,7 @@ msgstr ""
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
 " [ コード]\n"
 
-#: src/readelf.c:4095
+#: src/readelf.c:4412
 #, c-format
 msgid ""
 "\n"
@@ -4844,30 +4973,30 @@ msgstr ""
 "\n"
 "オフセット %<PRIu64> の略語セクション:\n"
 
-#: src/readelf.c:4108
+#: src/readelf.c:4425
 #, c-format
 msgid " *** error while reading abbreviation: %s\n"
 msgstr " *** 略語を読んでいる間にエラー: %s\n"
 
-#: src/readelf.c:4124
+#: src/readelf.c:4441
 #, c-format
 msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
 msgstr " [%5u] オフセット: %<PRId64>、子: %s、タグ: %s\n"
 
-#: src/readelf.c:4127
+#: src/readelf.c:4444
 msgid "yes"
 msgstr "はい"
 
-#: src/readelf.c:4127
+#: src/readelf.c:4444
 msgid "no"
 msgstr "いいえ"
 
-#: src/readelf.c:4162
+#: src/readelf.c:4478 src/readelf.c:4551
 #, c-format
 msgid "cannot get .debug_aranges content: %s"
 msgstr ".debug_aragnes の内容を得られません: %s"
 
-#: src/readelf.c:4167
+#: src/readelf.c:4493
 #, c-format
 msgid ""
 "\n"
@@ -4880,25 +5009,20 @@ msgstr[0] ""
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s' には %4$zu 個の項"
 "目があります:\n"
 
-#: src/readelf.c:4198
+#: src/readelf.c:4524
 #, c-format
 msgid " [%*zu] ???\n"
 msgstr " [%*zu] ???\n"
 
-#: src/readelf.c:4200
+#: src/readelf.c:4526
 #, 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:4219
-#, c-format
-msgid "cannot get .debug_ranges content: %s"
-msgstr ".degub_ranges の内容を得られません: %s"
-
-#: src/readelf.c:4224 src/readelf.c:4728 src/readelf.c:5505 src/readelf.c:6006
-#: src/readelf.c:6121 src/readelf.c:6277 src/readelf.c:6699
+#: src/readelf.c:4556 src/readelf.c:4710 src/readelf.c:5231 src/readelf.c:6145
+#: src/readelf.c:6646 src/readelf.c:6766 src/readelf.c:6922 src/readelf.c:7345
 #, c-format
 msgid ""
 "\n"
@@ -4907,39 +5031,117 @@ msgstr ""
 "\n"
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
 
-#: src/readelf.c:4248 src/readelf.c:6031
+#: src/readelf.c:4569 src/readelf.c:6171
+#, c-format
+msgid ""
+"\n"
+"Table at offset %Zu:\n"
+msgstr ""
+"\n"
+"オフセット %Zu のテーブル:\n"
+
+#: src/readelf.c:4573 src/readelf.c:5255 src/readelf.c:6180
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr "セクション [%zu] '%s' の不当なデータ"
+
+#: src/readelf.c:4589
+#, fuzzy, c-format
+msgid ""
+"\n"
+" Length:        %6<PRIu64>\n"
+msgstr " (オフセット: %#<PRIx64>)"
+
+#: src/readelf.c:4601
+#, fuzzy, c-format
+msgid " DWARF version: %6<PRIuFAST16>\n"
+msgstr "      %s: %<PRId64>\n"
+
+#: src/readelf.c:4605
+#, c-format
+msgid "unsupported aranges version"
+msgstr ""
+
+#: src/readelf.c:4616
+#, fuzzy, c-format
+msgid " CU offset:     %6<PRIx64>\n"
+msgstr " (オフセット: %#<PRIx64>)"
+
+#: src/readelf.c:4622
+#, fuzzy, c-format
+msgid " Address size:  %6<PRIu64>\n"
+msgstr " (終了オフセット: %#<PRIx64>)"
+
+#: src/readelf.c:4626
+#, fuzzy, c-format
+msgid "unsupported address size"
+msgstr "アドレス値ではありません"
+
+#: src/readelf.c:4631
+#, fuzzy, c-format
+msgid ""
+" Segment size:  %6<PRIu64>\n"
+"\n"
+msgstr " ファイルを %<PRIu64> に設定する\n"
+
+#: src/readelf.c:4635
+#, c-format
+msgid "unsupported segment size"
+msgstr ""
+
+#: src/readelf.c:4675
+#, fuzzy, c-format
+msgid "   %s..%s (%<PRIx64>)\n"
+msgstr "      %s: %<PRId64>\n"
+
+#: src/readelf.c:4678
+#, fuzzy, c-format
+msgid "   %s..%s\n"
+msgstr " [%6tx]  %s..%s\n"
+
+#: src/readelf.c:4687
+#, c-format
+msgid "   %Zu padding bytes\n"
+msgstr ""
+
+#: src/readelf.c:4705
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr ".degub_ranges の内容を得られません: %s"
+
+#: src/readelf.c:4735 src/readelf.c:6673
 #, c-format
 msgid " [%6tx]  <INVALID DATA>\n"
 msgstr " [%6tx]  <不当なデータ>\n"
 
-#: src/readelf.c:4270 src/readelf.c:6053
+#: src/readelf.c:4757 src/readelf.c:6695
 #, c-format
 msgid " [%6tx]  base address %s\n"
 msgstr " [%6tx]  ベースアドレス %s\n"
 
-#: src/readelf.c:4276 src/readelf.c:6059
+#: src/readelf.c:4764 src/readelf.c:6702
 #, fuzzy, c-format
 msgid " [%6tx]  empty list\n"
 msgstr ""
 "\n"
 " [%6tx] ゼロ終端\n"
 
-#: src/readelf.c:4285
+#: src/readelf.c:4775
 #, c-format
 msgid " [%6tx]  %s..%s\n"
 msgstr " [%6tx]  %s..%s\n"
 
-#: src/readelf.c:4287
+#: src/readelf.c:4777
 #, c-format
 msgid "           %s..%s\n"
 msgstr "           %s..%s\n"
 
-#: src/readelf.c:4717 src/readelf.c:6768 src/readelf.c:6870 src/readelf.c:7028
-#, c-format
-msgid "cannot get %s content: %s"
-msgstr "%s の内容を得られません: %s"
+#: src/readelf.c:5210
+#, fuzzy, c-format
+msgid "cannot get ELF: %s"
+msgstr "次の DIE を得られません: %s"
 
-#: src/readelf.c:4724
+#: src/readelf.c:5227
 #, c-format
 msgid ""
 "\n"
@@ -4948,12 +5150,7 @@ msgstr ""
 "\n"
 "オフセット %3$#<PRIx64> の フレーム情報呼出しセクション [%1$2zu] '%2$s':\n"
 
-#: src/readelf.c:4752 src/readelf.c:5540
-#, c-format
-msgid "invalid data in section [%zu] '%s'"
-msgstr "セクション [%zu] '%s' の不当なデータ"
-
-#: src/readelf.c:4774
+#: src/readelf.c:5277
 #, c-format
 msgid ""
 "\n"
@@ -4962,50 +5159,50 @@ msgstr ""
 "\n"
 " [%6tx] ゼロ終端\n"
 
-#: src/readelf.c:4859
+#: src/readelf.c:5362
 #, fuzzy, c-format
 msgid "invalid augmentation length"
 msgstr "不当な拡大エンコード"
 
-#: src/readelf.c:4871
+#: src/readelf.c:5374
 msgid "FDE address encoding: "
 msgstr "FDE アドレスエンコード"
 
-#: src/readelf.c:4877
+#: src/readelf.c:5380
 msgid "LSDA pointer encoding: "
 msgstr "LSDA ポインターエンコード:"
 
-#: src/readelf.c:4975
+#: src/readelf.c:5491
 #, c-format
 msgid " (offset: %#<PRIx64>)"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:4982
+#: src/readelf.c:5498
 #, c-format
 msgid " (end offset: %#<PRIx64>)"
 msgstr " (終了オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:5009
+#: src/readelf.c:5525
 #, c-format
 msgid "   %-26sLSDA pointer: %#<PRIx64>\n"
 msgstr "   %-26sLSDA ポインター: %#<PRIx64>\n"
 
-#: src/readelf.c:5060
+#: src/readelf.c:5577
 #, c-format
 msgid "cannot get attribute code: %s"
 msgstr "属性コードを得られません: %s"
 
-#: src/readelf.c:5069
+#: src/readelf.c:5586
 #, c-format
 msgid "cannot get attribute form: %s"
 msgstr "属性様式を得られません: %s"
 
-#: src/readelf.c:5084
+#: src/readelf.c:5601
 #, c-format
 msgid "cannot get attribute value: %s"
 msgstr "属性値を得られません: %s"
 
-#: src/readelf.c:5342
+#: src/readelf.c:5894
 #, c-format
 msgid ""
 "\n"
@@ -5016,7 +5213,7 @@ msgstr ""
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
 " [オフセット]\n"
 
-#: src/readelf.c:5374
+#: src/readelf.c:5926
 #, fuzzy, c-format
 msgid ""
 " Type unit at offset %<PRIu64>:\n"
@@ -5028,7 +5225,7 @@ msgstr ""
 " バージョン: %2$<PRIu16>、略語セクションオフセット: %3$<PRIu64>、アドレスの大"
 "きさ: %4$<PRIu8>、オフセットの大きさ: %5$<PRIu8>\n"
 
-#: src/readelf.c:5383
+#: src/readelf.c:5935
 #, c-format
 msgid ""
 " Compilation unit at offset %<PRIu64>:\n"
@@ -5039,49 +5236,50 @@ msgstr ""
 " バージョン: %2$<PRIu16>、略語セクションオフセット: %3$<PRIu64>、アドレスの大"
 "きさ: %4$<PRIu8>、オフセットの大きさ: %5$<PRIu8>\n"
 
-#: src/readelf.c:5409
+#: src/readelf.c:5960
 #, c-format
 msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
 msgstr ""
 "セクション '%2$s' の オフセット %1$<PRIu64> の DIE を得られません: %3$s"
 
-#: src/readelf.c:5421
+#: src/readelf.c:5974
 #, c-format
 msgid "cannot get DIE offset: %s"
 msgstr "DIE オフセットを得られません: %s"
 
-#: src/readelf.c:5430
+#: src/readelf.c:5983
 #, c-format
 msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
 msgstr ""
 "セクション '%2$s' 中のオフセット %1$<PRIu64> の DIE のタグを得られません: "
 "%3$s"
 
-#: src/readelf.c:5461
+#: src/readelf.c:6015
 #, c-format
 msgid "cannot get next DIE: %s\n"
 msgstr "次の DIE を得られません: %s\n"
 
-#: src/readelf.c:5469
+#: src/readelf.c:6023
 #, c-format
 msgid "cannot get next DIE: %s"
 msgstr "次の DIE を得られません: %s"
 
-#: src/readelf.c:5518
-#, c-format
-msgid "cannot get line data section data: %s"
-msgstr "ラインデータセクションデータを得られません: %s"
-
-#: src/readelf.c:5531
-#, c-format
+#: src/readelf.c:6059
+#, fuzzy, c-format
 msgid ""
 "\n"
-"Table at offset %Zu:\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+"\n"
 msgstr ""
 "\n"
-"オフセット %Zu のテーブル:\n"
+"オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
 
-#: src/readelf.c:5586
+#: src/readelf.c:6158
+#, c-format
+msgid "cannot get line data section data: %s"
+msgstr "ラインデータセクションデータを得られません: %s"
+
+#: src/readelf.c:6226
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5109,18 +5307,18 @@ msgstr ""
 "\n"
 "命令コード:\n"
 
-#: src/readelf.c:5607
+#: src/readelf.c:6247
 #, c-format
 msgid "invalid data at offset %tu in section [%zu] '%s'"
 msgstr "セクション [%2$zu] '%3$s' 中のオフセット %1$tu に不当なデータ"
 
-#: src/readelf.c:5622
+#: src/readelf.c:6262
 #, c-format
 msgid "  [%*<PRIuFAST8>]  %hhu argument\n"
 msgid_plural "  [%*<PRIuFAST8>]  %hhu arguments\n"
 msgstr[0] "  [%*<PRIuFAST8>]  %hhu パラメーター\n"
 
-#: src/readelf.c:5630
+#: src/readelf.c:6270
 msgid ""
 "\n"
 "Directory table:"
@@ -5128,7 +5326,7 @@ msgstr ""
 "\n"
 "ディレクトリーテーブル:"
 
-#: src/readelf.c:5646
+#: src/readelf.c:6286
 msgid ""
 "\n"
 "File name table:\n"
@@ -5138,7 +5336,7 @@ msgstr ""
 "ファイル名テーブル:\n"
 " Entry Dir   時刻     大きさ    名前"
 
-#: src/readelf.c:5675
+#: src/readelf.c:6315
 msgid ""
 "\n"
 "Line number statements:"
@@ -5146,205 +5344,205 @@ msgstr ""
 "\n"
 "行   番号   文:"
 
-#: src/readelf.c:5751
+#: src/readelf.c:6391
 #, fuzzy, c-format
 msgid " special opcode %u: address+%u = %s, op_index = %u, line%+d = %zu\n"
 msgstr " 特殊命令コード %u: アドレス+%u = %s, 行%+d = %zu\n"
 
-#: src/readelf.c:5756
+#: src/readelf.c:6396
 #, c-format
 msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
 msgstr " 特殊命令コード %u: アドレス+%u = %s, 行%+d = %zu\n"
 
-#: src/readelf.c:5776
+#: src/readelf.c:6416
 #, c-format
 msgid " extended opcode %u: "
 msgstr " 拡張命令コード %u: "
 
-#: src/readelf.c:5781
+#: src/readelf.c:6421
 #, fuzzy
 msgid " end of sequence"
 msgstr "列の終わり"
 
-#: src/readelf.c:5798
+#: src/readelf.c:6438
 #, fuzzy, c-format
 msgid " set address to %s\n"
 msgstr "アドレスを %s に設定する\n"
 
-#: src/readelf.c:5819
+#: src/readelf.c:6459
 #, 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:5832
+#: src/readelf.c:6472
 #, fuzzy, c-format
 msgid " set discriminator to %u\n"
 msgstr "カラムを %<PRIu64> に設定する\n"
 
-#: src/readelf.c:5837
+#: src/readelf.c:6477
 #, fuzzy
 msgid " unknown opcode"
 msgstr "不明な命令コード"
 
-#: src/readelf.c:5849
+#: src/readelf.c:6489
 msgid " copy"
 msgstr "複写"
 
-#: src/readelf.c:5860
+#: src/readelf.c:6500
 #, fuzzy, c-format
 msgid " advance address by %u to %s, op_index to %u\n"
 msgstr "アドレスを %u だけ進めて %s にする\n"
 
-#: src/readelf.c:5864
+#: src/readelf.c:6504
 #, fuzzy, c-format
 msgid " advance address by %u to %s\n"
 msgstr "アドレスを %u だけ進めて %s にする\n"
 
-#: src/readelf.c:5875
+#: src/readelf.c:6515
 #, c-format
 msgid " advance line by constant %d to %<PRId64>\n"
 msgstr "行を定数 %d だけ進めて %<PRId64> にする\n"
 
-#: src/readelf.c:5883
+#: src/readelf.c:6523
 #, c-format
 msgid " set file to %<PRIu64>\n"
 msgstr " ファイルを %<PRIu64> に設定する\n"
 
-#: src/readelf.c:5893
+#: src/readelf.c:6533
 #, c-format
 msgid " set column to %<PRIu64>\n"
 msgstr "カラムを %<PRIu64> に設定する\n"
 
-#: src/readelf.c:5900
+#: src/readelf.c:6540
 #, c-format
 msgid " set '%s' to %<PRIuFAST8>\n"
 msgstr " '%s' を %<PRIuFAST8> に設定する\n"
 
-#: src/readelf.c:5906
+#: src/readelf.c:6546
 msgid " set basic block flag"
 msgstr "基本ブロックフラグを設定する"
 
-#: src/readelf.c:5915
+#: src/readelf.c:6555
 #, fuzzy, c-format
 msgid " advance address by constant %u to %s, op_index to %u\n"
 msgstr "アドレスを定数 %u だけ済めて %s にする\n"
 
-#: src/readelf.c:5919
+#: src/readelf.c:6559
 #, fuzzy, c-format
 msgid " advance address by constant %u to %s\n"
 msgstr "アドレスを定数 %u だけ済めて %s にする\n"
 
-#: src/readelf.c:5937
+#: src/readelf.c:6577
 #, fuzzy, c-format
 msgid " advance address by fixed value %u to %s\n"
 msgstr "アドレスを固定値 %u だけ進めて %s にする\n"
 
-#: src/readelf.c:5946
+#: src/readelf.c:6586
 msgid " set prologue end flag"
 msgstr "プロローグ終了フラグを設定する"
 
-#: src/readelf.c:5951
+#: src/readelf.c:6591
 msgid " set epilogue begin flag"
 msgstr "エピローグ開始フラグを設定する"
 
-#: src/readelf.c:5960
+#: src/readelf.c:6600
 #, fuzzy, c-format
 msgid " set isa to %u\n"
 msgstr " ファイルを %<PRIu64> に設定する\n"
 
-#: src/readelf.c:5969
+#: src/readelf.c:6609
 #, c-format
 msgid " unknown opcode with %<PRIu8> parameter:"
 msgid_plural " unknown opcode with %<PRIu8> parameters:"
 msgstr[0] " %<PRIu8> 個のパラメーターのある不明な命令コード:"
 
-#: src/readelf.c:6001
+#: src/readelf.c:6641
 #, c-format
 msgid "cannot get .debug_loc content: %s"
 msgstr ".debug_loc の内容を得られません: %s"
 
-#: src/readelf.c:6071
+#: src/readelf.c:6716
 #, c-format
 msgid " [%6tx]  %s..%s"
 msgstr " [%6tx]  %s..%s"
 
-#: src/readelf.c:6073
+#: src/readelf.c:6718
 #, c-format
 msgid "           %s..%s"
 msgstr "           %s..%s"
 
-#: src/readelf.c:6080
+#: src/readelf.c:6725
 #, fuzzy
 msgid "   <INVALID DATA>\n"
 msgstr " [%6tx]  <不当なデータ>\n"
 
-#: src/readelf.c:6132 src/readelf.c:6286
+#: src/readelf.c:6777 src/readelf.c:6931
 #, c-format
 msgid "cannot get macro information section data: %s"
 msgstr "マクロ情報セクションのデータを得られません: %s"
 
-#: src/readelf.c:6211
+#: src/readelf.c:6856
 #, c-format
 msgid "%*s*** non-terminated string at end of section"
 msgstr "%*s*** 最後のセクションの終端していない文字列"
 
-#: src/readelf.c:6327
+#: src/readelf.c:6972
 #, fuzzy, c-format
 msgid " Offset:             0x%<PRIx64>\n"
 msgstr "  所有者         大きさ\n"
 
-#: src/readelf.c:6339
+#: src/readelf.c:6984
 #, fuzzy, c-format
 msgid " Version:            %<PRIu16>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:6345 src/readelf.c:7055
+#: src/readelf.c:6990 src/readelf.c:7703
 #, c-format
 msgid "  unknown version, cannot parse section\n"
 msgstr ""
 
-#: src/readelf.c:6352
+#: src/readelf.c:6997
 #, fuzzy, c-format
 msgid " Flag:               0x%<PRIx8>\n"
 msgstr "  入口点アドレス     :               %#<PRIx64>\n"
 
-#: src/readelf.c:6355
+#: src/readelf.c:7000
 #, fuzzy, c-format
 msgid " Offset length:      %<PRIu8>\n"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:6363
+#: src/readelf.c:7008
 #, fuzzy, c-format
 msgid " .debug_line offset: 0x%<PRIx64>\n"
 msgstr " (終了オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:6375
+#: src/readelf.c:7021
 #, fuzzy, c-format
 msgid "  extension opcode table, %<PRIu8> items:\n"
 msgstr " %<PRIu8> 個のパラメーターのある不明な命令コード:"
 
-#: src/readelf.c:6382
+#: src/readelf.c:7028
 #, c-format
 msgid "    [%<PRIx8>]"
 msgstr ""
 
-#: src/readelf.c:6394
+#: src/readelf.c:7040
 #, fuzzy, c-format
 msgid " %<PRIu8> arguments:"
 msgstr "  [%*<PRIuFAST8>]  %hhu パラメーター\n"
 
-#: src/readelf.c:6422
+#: src/readelf.c:7068
 #, c-format
 msgid " no arguments."
 msgstr ""
 
-#: src/readelf.c:6657
+#: src/readelf.c:7303
 #, c-format
 msgid "vendor opcode not verified?"
 msgstr ""
 
-#: src/readelf.c:6685
+#: src/readelf.c:7331
 #, c-format
 msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
 msgstr ""
@@ -5352,7 +5550,7 @@ msgstr ""
 
 # # "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
 # # " %4$*s  文字列\n" がエラーになるのは何故? 取り敢えず fuzzy扱い
-#: src/readelf.c:6726
+#: src/readelf.c:7372
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5363,12 +5561,12 @@ msgstr ""
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
 " %4$*s  文字列\n"
 
-#: src/readelf.c:6740
+#: src/readelf.c:7386
 #, c-format
 msgid " *** error while reading strings: %s\n"
 msgstr " *** 文字列の読込み中にエラー: %s\n"
 
-#: src/readelf.c:6760
+#: src/readelf.c:7406
 #, c-format
 msgid ""
 "\n"
@@ -5377,7 +5575,7 @@ msgstr ""
 "\n"
 "呼出しフレーム検索テーブルセクション [%2zu] '.eh_frame_hdr':\n"
 
-#: src/readelf.c:6862
+#: src/readelf.c:7508
 #, c-format
 msgid ""
 "\n"
@@ -5386,22 +5584,22 @@ msgstr ""
 "\n"
 "例外取扱いテーブルセクション [%2zu] '.gcc_except_table':\n"
 
-#: src/readelf.c:6885
+#: src/readelf.c:7531
 #, c-format
 msgid " LPStart encoding:    %#x "
 msgstr " LPStart コード化:    %#x "
 
-#: src/readelf.c:6897
+#: src/readelf.c:7543
 #, c-format
 msgid " TType encoding:      %#x "
 msgstr "TType コード化:       %#x "
 
-#: src/readelf.c:6911
+#: src/readelf.c:7557
 #, c-format
 msgid " Call site encoding:  %#x "
 msgstr "呼出しサイトコード化: %#x "
 
-#: src/readelf.c:6924
+#: src/readelf.c:7570
 msgid ""
 "\n"
 " Call site table:"
@@ -5409,7 +5607,7 @@ msgstr ""
 "\n"
 " 呼出しサイトテーブル:"
 
-#: src/readelf.c:6938
+#: src/readelf.c:7584
 #, c-format
 msgid ""
 " [%4u] Call site start:   %#<PRIx64>\n"
@@ -5422,12 +5620,12 @@ msgstr ""
 "        離着陸場:           %#<PRIx64>\n"
 "        行動:               %u\n"
 
-#: src/readelf.c:6998
+#: src/readelf.c:7644
 #, c-format
 msgid "invalid TType encoding"
 msgstr "不当な TType コード化"
 
-#: src/readelf.c:7019
+#: src/readelf.c:7665
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5437,37 +5635,37 @@ msgstr ""
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s' には %4$zu 個の項"
 "目があります:\n"
 
-#: src/readelf.c:7048
+#: src/readelf.c:7694
 #, fuzzy, c-format
 msgid " Version:         %<PRId32>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:7064
+#: src/readelf.c:7712
 #, fuzzy, c-format
 msgid " CU offset:       %#<PRIx32>\n"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:7071
+#: src/readelf.c:7719
 #, fuzzy, c-format
 msgid " TU offset:       %#<PRIx32>\n"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:7078
+#: src/readelf.c:7726
 #, fuzzy, c-format
 msgid " address offset:  %#<PRIx32>\n"
 msgstr " (終了オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:7085
+#: src/readelf.c:7733
 #, fuzzy, c-format
 msgid " symbol offset:   %#<PRIx32>\n"
 msgstr " (オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:7092
+#: src/readelf.c:7740
 #, fuzzy, c-format
 msgid " constant offset: %#<PRIx32>\n"
 msgstr " (終了オフセット: %#<PRIx64>)"
 
-#: src/readelf.c:7099
+#: src/readelf.c:7747
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5477,7 +5675,7 @@ msgstr ""
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s' には %4$zu 個の項"
 "目があります:\n"
 
-#: src/readelf.c:7121
+#: src/readelf.c:7769
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5487,7 +5685,7 @@ msgstr ""
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s' には %4$zu 個の項"
 "目があります:\n"
 
-#: src/readelf.c:7147
+#: src/readelf.c:7795
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5497,7 +5695,7 @@ msgstr ""
 "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s' には %4$zu 個の項"
 "目があります:\n"
 
-#: src/readelf.c:7174
+#: src/readelf.c:7824
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5506,17 +5704,17 @@ msgstr ""
 "\n"
 "オフセット %#0<PRIx64> に不当なシンボルテーブル\n"
 
-#: src/readelf.c:7259
+#: src/readelf.c:7909
 #, c-format
 msgid "cannot get debug context descriptor: %s"
 msgstr "デバッグ内容記述子を得られません: %s"
 
-#: src/readelf.c:7409 src/readelf.c:8010
+#: src/readelf.c:8069 src/readelf.c:8675 src/readelf.c:8786 src/readelf.c:8844
 #, c-format
 msgid "cannot convert core note data: %s"
 msgstr "コアノートデータの変換ができません: %s"
 
-#: src/readelf.c:7750
+#: src/readelf.c:8416
 #, c-format
 msgid ""
 "\n"
@@ -5525,21 +5723,21 @@ msgstr ""
 "\n"
 "%*s... < %u 回の繰返し> ..."
 
-#: src/readelf.c:8109
+#: src/readelf.c:8919
 msgid "  Owner          Data size  Type\n"
 msgstr "  所有者         データ大きさタイプ\n"
 
-#: src/readelf.c:8127
+#: src/readelf.c:8937
 #, c-format
 msgid "  %-13.*s  %9<PRId32>  %s\n"
 msgstr "  %-13.*s  %9<PRId32>  %s\n"
 
-#: src/readelf.c:8161
+#: src/readelf.c:8987
 #, c-format
 msgid "cannot get content of note section: %s"
 msgstr "ノートセクションの内容を得られません: %s"
 
-#: src/readelf.c:8188
+#: src/readelf.c:9014
 #, c-format
 msgid ""
 "\n"
@@ -5549,7 +5747,7 @@ msgstr ""
 "オフセット %4$#0<PRIx64> の %3$<PRIu64> バイトのノートセクション [%1$2zu] "
 "'%2$s':\n"
 
-#: src/readelf.c:8211
+#: src/readelf.c:9037
 #, c-format
 msgid ""
 "\n"
@@ -5558,7 +5756,7 @@ msgstr ""
 "\n"
 "オフセット %2$#0<PRIx64> の %1$<PRIu64> バイトのノートセグメント:\n"
 
-#: src/readelf.c:8257
+#: src/readelf.c:9083
 #, c-format
 msgid ""
 "\n"
@@ -5567,12 +5765,12 @@ msgstr ""
 "\n"
 "セクション [%Zu] '%s' にはダンプすべきデータがありません。\n"
 
-#: src/readelf.c:8263 src/readelf.c:8286
+#: src/readelf.c:9089 src/readelf.c:9112
 #, c-format
 msgid "cannot get data for section [%Zu] '%s': %s"
 msgstr "セクション [%Zu] '%s' からデータが得られません: %s"
 
-#: src/readelf.c:8267
+#: src/readelf.c:9093
 #, c-format
 msgid ""
 "\n"
@@ -5582,7 +5780,7 @@ msgstr ""
 "オフセット %4$#0<PRIx64> のセクション [%1$Zu] '%2$s' の16進ダン"
 "プ、%3$<PRIu64> バイト:\n"
 
-#: src/readelf.c:8280
+#: src/readelf.c:9106
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -5591,7 +5789,7 @@ msgstr ""
 "\n"
 "セクション [%Zu] '%s' にはダンプすべきデータがありません。\n"
 
-#: src/readelf.c:8290
+#: src/readelf.c:9116
 #, c-format
 msgid ""
 "\n"
@@ -5601,7 +5799,7 @@ msgstr ""
 "オフセット %4$#0<PRIx64> 文字列セクション [%1$Zu] '%2$s' には %3$<PRIu64> バ"
 "イトあります:\n"
 
-#: src/readelf.c:8338
+#: src/readelf.c:9164
 #, c-format
 msgid ""
 "\n"
@@ -5610,7 +5808,7 @@ msgstr ""
 "\n"
 "セクション [%lu] がありません"
 
-#: src/readelf.c:8367
+#: src/readelf.c:9193
 #, c-format
 msgid ""
 "\n"
@@ -5619,12 +5817,12 @@ msgstr ""
 "\n"
 "セクション '%s' がありません"
 
-#: src/readelf.c:8424
+#: src/readelf.c:9250
 #, c-format
 msgid "cannot get symbol index of archive '%s': %s"
 msgstr "アーカイブのシンボル索引 '%s' を得られません: %s"
 
-#: src/readelf.c:8427
+#: src/readelf.c:9253
 #, c-format
 msgid ""
 "\n"
@@ -5633,7 +5831,7 @@ msgstr ""
 "\n"
 "アーカイブ '%s' にはシンボル索引がありません\n"
 
-#: src/readelf.c:8431
+#: src/readelf.c:9257
 #, c-format
 msgid ""
 "\n"
@@ -5642,12 +5840,12 @@ msgstr ""
 "\n"
 "アーカイブ '%s' の索引には %Zu 項目あります:\n"
 
-#: src/readelf.c:8449
+#: src/readelf.c:9275
 #, c-format
 msgid "cannot extract member at offset %Zu in '%s': %s"
 msgstr "'%2$s' の オフセット %1$Zu のメンバーを抽出できません: %3$s"
 
-#: src/readelf.c:8454
+#: src/readelf.c:9280
 #, c-format
 msgid "Archive member '%s' contains:\n"
 msgstr "アーカイブメンバー '%s' には以下があります:\n"
@@ -5711,12 +5909,12 @@ msgstr "不当な基数: %s"
 msgid "%s: file format not recognized"
 msgstr "%s: ファイル形式を認識できません"
 
-#: src/size.c:438 src/size.c:581
+#: src/size.c:438 src/size.c:571
 #, c-format
 msgid " (ex %s)"
 msgstr " (ex %s)"
 
-#: src/size.c:606
+#: src/size.c:596
 msgid "(TOTALS)\n"
 msgstr "(合計)\n"
 
@@ -5754,27 +5952,27 @@ msgstr ""
 msgid "Print the strings of printable characters in files."
 msgstr ""
 
-#: src/strings.c:260 src/strings.c:295
+#: src/strings.c:267 src/strings.c:302
 #, c-format
 msgid "invalid value '%s' for %s parameter"
 msgstr ""
 
-#: src/strings.c:306
+#: src/strings.c:313
 #, c-format
 msgid "invalid minimum length of matched string size"
 msgstr ""
 
-#: src/strings.c:591
+#: src/strings.c:596
 #, c-format
 msgid "lseek64 failed"
 msgstr ""
 
-#: src/strings.c:608 src/strings.c:672
+#: src/strings.c:613 src/strings.c:677
 #, c-format
 msgid "re-mmap failed"
 msgstr ""
 
-#: src/strings.c:645
+#: src/strings.c:650
 #, c-format
 msgid "mprotect failed"
 msgstr ""
@@ -5842,7 +6040,7 @@ msgstr "-f オプションが 2 回指定されています"
 msgid "-F option specified twice"
 msgstr "-F オプションが 2 回指定されています"
 
-#: src/strip.c:249 src/unstrip.c:117
+#: src/strip.c:249 src/unstrip.c:121
 #, c-format
 msgid "-o option specified twice"
 msgstr "-o オプションが 2 回指定されています"
@@ -5867,87 +6065,87 @@ msgstr "'%s' を開いている間"
 msgid "%s: cannot use -o or -f when stripping archive"
 msgstr "%s: アーカイブから抜き出している時は -o や -f は使えません"
 
-#: src/strip.c:467
+#: src/strip.c:468
 #, c-format
 msgid "cannot open EBL backend"
 msgstr "EBL バックエンドを開けません"
 
-#: src/strip.c:517 src/strip.c:541
+#: src/strip.c:518 src/strip.c:542
 #, c-format
 msgid "cannot create new file '%s': %s"
 msgstr "新しいファイル '%s' を生成できません: %s"
 
-#: src/strip.c:601
+#: src/strip.c:608
 #, c-format
 msgid "illformed file '%s'"
 msgstr "不適格なファイル '%s'"
 
-#: src/strip.c:905 src/strip.c:994
+#: src/strip.c:930 src/strip.c:1019
 #, c-format
 msgid "while generating output file: %s"
 msgstr "出力ファイルを生成している間: %s"
 
-#: src/strip.c:967 src/strip.c:1929
+#: src/strip.c:992 src/strip.c:1957
 #, c-format
 msgid "%s: error while creating ELF header: %s"
 msgstr "%s: ELF ヘッダーを生成している間にエラー: %s"
 
-#: src/strip.c:981
+#: src/strip.c:1006
 #, c-format
 msgid "while preparing output for '%s'"
 msgstr "'%s' のための出力を準備している間"
 
-#: src/strip.c:1032 src/strip.c:1088
+#: src/strip.c:1057 src/strip.c:1114
 #, c-format
 msgid "while create section header section: %s"
 msgstr "セクションヘッダーセクションを生成している間: %s"
 
-#: src/strip.c:1038
+#: src/strip.c:1063
 #, c-format
 msgid "cannot allocate section data: %s"
 msgstr "セクションデータを割り当てられません: %s"
 
-#: src/strip.c:1097
+#: src/strip.c:1123
 #, c-format
 msgid "while create section header string table: %s"
 msgstr "セクションヘッダー文字列テーブルを生成中: %s"
 
-#: src/strip.c:1724
+#: src/strip.c:1752
 #, fuzzy, c-format
 msgid "bad relocation"
 msgstr "リロケーションを表示"
 
-#: src/strip.c:1841 src/strip.c:1951
+#: src/strip.c:1869 src/strip.c:1979
 #, c-format
 msgid "while writing '%s': %s"
 msgstr "'%s' を書込み中: %s"
 
-#: src/strip.c:1852
+#: src/strip.c:1880
 #, c-format
 msgid "while creating '%s'"
 msgstr "'%s' を生成中"
 
-#: src/strip.c:1874
+#: src/strip.c:1902
 #, c-format
 msgid "while computing checksum for debug information"
 msgstr "デバッグ情報のチェックサムを計算中"
 
-#: src/strip.c:1937
+#: src/strip.c:1965
 #, c-format
 msgid "%s: error while reading the file: %s"
 msgstr "%s: ファイルを読込み中にエラー: %s"
 
-#: src/strip.c:1976 src/strip.c:1996
+#: src/strip.c:2004 src/strip.c:2024
 #, fuzzy, c-format
 msgid "while writing '%s'"
 msgstr "'%s' を書込み中: %s"
 
-#: src/strip.c:2030 src/strip.c:2037
+#: src/strip.c:2061 src/strip.c:2068
 #, c-format
 msgid "error while finishing '%s': %s"
 msgstr "'%s' の終了中にエラー: %s"
 
-#: src/strip.c:2060 src/strip.c:2117
+#: src/strip.c:2091 src/strip.c:2148
 #, c-format
 msgid "cannot set access and modification date of '%s'"
 msgstr "'%s' のアクセスと変更日付を設定できません"
@@ -5984,265 +6182,288 @@ msgstr ""
 msgid "Only list module and file names, build IDs"
 msgstr ""
 
-#: src/unstrip.c:126
+#: src/unstrip.c:86
+msgid "Force combining files even if some ELF headers don't seem to match"
+msgstr ""
+
+#: src/unstrip.c:130
 #, c-format
 msgid "-d option specified twice"
 msgstr ""
 
-#: src/unstrip.c:158
+#: src/unstrip.c:165
 #, c-format
 msgid "only one of -o or -d allowed"
 msgstr ""
 
-#: src/unstrip.c:167
+#: src/unstrip.c:174
 #, c-format
 msgid "-n cannot be used with explicit files or -o or -d"
 msgstr ""
 
-#: src/unstrip.c:182
+#: src/unstrip.c:189
 #, c-format
 msgid "output directory '%s'"
 msgstr ""
 
-#: src/unstrip.c:191
+#: src/unstrip.c:198
 #, c-format
 msgid "exactly two file arguments are required"
 msgstr ""
 
-#: src/unstrip.c:197
+#: src/unstrip.c:204
 #, c-format
 msgid "-m, -a, -R, and -i options not allowed with explicit files"
 msgstr ""
 
-#: src/unstrip.c:210
+#: src/unstrip.c:217
 #, c-format
 msgid "-o or -d is required when using implicit files"
 msgstr ""
 
-#: src/unstrip.c:246
+#: src/unstrip.c:253
 #, c-format
 msgid "cannot create ELF header: %s"
 msgstr ""
 
-#: src/unstrip.c:251
+#: src/unstrip.c:258
 #, c-format
 msgid "cannot copy ELF header: %s"
 msgstr ""
 
-#: src/unstrip.c:256 src/unstrip.c:1820
+#: src/unstrip.c:263 src/unstrip.c:1828
 #, c-format
 msgid "cannot create program headers: %s"
 msgstr ""
 
-#: src/unstrip.c:262
+#: src/unstrip.c:269
 #, c-format
 msgid "cannot copy program header: %s"
 msgstr ""
 
-#: src/unstrip.c:272
+#: src/unstrip.c:279
 #, c-format
 msgid "cannot copy section header: %s"
 msgstr ""
 
-#: src/unstrip.c:275 src/unstrip.c:1501
+#: src/unstrip.c:282 src/unstrip.c:1509
 #, c-format
 msgid "cannot get section data: %s"
 msgstr ""
 
-#: src/unstrip.c:277 src/unstrip.c:1503
+#: src/unstrip.c:284 src/unstrip.c:1511
 #, c-format
 msgid "cannot copy section data: %s"
 msgstr ""
 
-#: src/unstrip.c:301
+#: src/unstrip.c:308
 #, c-format
 msgid "cannot create directory '%s'"
 msgstr ""
 
-#: src/unstrip.c:341 src/unstrip.c:758 src/unstrip.c:1535
+#: src/unstrip.c:348 src/unstrip.c:765 src/unstrip.c:1543
 #, c-format
 msgid "cannot get symbol table entry: %s"
 msgstr ""
 
-#: src/unstrip.c:357 src/unstrip.c:575 src/unstrip.c:596 src/unstrip.c:608
-#: src/unstrip.c:1556 src/unstrip.c:1686 src/unstrip.c:1710
+#: src/unstrip.c:364 src/unstrip.c:582 src/unstrip.c:603 src/unstrip.c:615
+#: src/unstrip.c:1564 src/unstrip.c:1694 src/unstrip.c:1718
 #, c-format
 msgid "cannot update symbol table: %s"
 msgstr ""
 
-#: src/unstrip.c:367
+#: src/unstrip.c:374
 #, c-format
 msgid "cannot update section header: %s"
 msgstr ""
 
-#: src/unstrip.c:406 src/unstrip.c:417
+#: src/unstrip.c:413 src/unstrip.c:424
 #, c-format
 msgid "cannot update relocation: %s"
 msgstr ""
 
-#: src/unstrip.c:504
+#: src/unstrip.c:511
 #, c-format
 msgid "cannot get symbol version: %s"
 msgstr ""
 
-#: src/unstrip.c:516
+#: src/unstrip.c:523
 #, c-format
 msgid "unexpected section type in [%Zu] with sh_link to symtab"
 msgstr ""
 
-#: src/unstrip.c:764
+#: src/unstrip.c:771
 #, c-format
 msgid "invalid string offset in symbol [%Zu]"
 msgstr ""
 
-#: src/unstrip.c:906 src/unstrip.c:1246
+#: src/unstrip.c:913 src/unstrip.c:1254
 #, c-format
 msgid "cannot read section [%Zu] name: %s"
 msgstr ""
 
-#: src/unstrip.c:947 src/unstrip.c:966 src/unstrip.c:999
+#: src/unstrip.c:954 src/unstrip.c:973 src/unstrip.c:1006
 #, c-format
 msgid "cannot read '.gnu.prelink_undo' section: %s"
 msgstr ""
 
-#: src/unstrip.c:987
+#: src/unstrip.c:994
 #, c-format
 msgid "invalid contents in '%s' section"
 msgstr ""
 
-#: src/unstrip.c:1042 src/unstrip.c:1366
+#: src/unstrip.c:1049 src/unstrip.c:1374
 #, c-format
 msgid "cannot find matching section for [%Zu] '%s'"
 msgstr ""
 
-#: src/unstrip.c:1166 src/unstrip.c:1181 src/unstrip.c:1447
+#: src/unstrip.c:1174 src/unstrip.c:1189 src/unstrip.c:1455
 #, c-format
 msgid "cannot add section name to string table: %s"
 msgstr ""
 
-#: src/unstrip.c:1190
+#: src/unstrip.c:1198
 #, c-format
 msgid "cannot update section header string table data: %s"
 msgstr ""
 
-#: src/unstrip.c:1217 src/unstrip.c:1221
+#: src/unstrip.c:1225 src/unstrip.c:1229
 #, c-format
 msgid "cannot get section header string table section index: %s"
 msgstr ""
 
-#: src/unstrip.c:1225 src/unstrip.c:1229 src/unstrip.c:1462
+#: src/unstrip.c:1233 src/unstrip.c:1237 src/unstrip.c:1470
 #, c-format
 msgid "cannot get section count: %s"
 msgstr ""
 
-#: src/unstrip.c:1232
+#: src/unstrip.c:1240
 #, c-format
 msgid "more sections in stripped file than debug file -- arguments reversed?"
 msgstr ""
 
-#: src/unstrip.c:1291 src/unstrip.c:1381
+#: src/unstrip.c:1299 src/unstrip.c:1389
 #, c-format
 msgid "cannot read section header string table: %s"
 msgstr ""
 
-#: src/unstrip.c:1441
+#: src/unstrip.c:1449
 #, c-format
 msgid "cannot add new section: %s"
 msgstr ""
 
-#: src/unstrip.c:1543
+#: src/unstrip.c:1551
 #, c-format
 msgid "symbol [%Zu] has invalid section index"
 msgstr ""
 
-#: src/unstrip.c:1781
+#: src/unstrip.c:1789
 #, fuzzy, c-format
 msgid "cannot read section data: %s"
 msgstr "セクションデータを割り当てられません: %s"
 
-#: src/unstrip.c:1802
+#: src/unstrip.c:1810
 #, c-format
 msgid "cannot get ELF header: %s"
 msgstr ""
 
-#: src/unstrip.c:1830
+#: src/unstrip.c:1838
 #, c-format
 msgid "cannot update program header: %s"
 msgstr ""
 
-#: src/unstrip.c:1835 src/unstrip.c:1914
+#: src/unstrip.c:1843 src/unstrip.c:1922
 #, c-format
 msgid "cannot write output file: %s"
 msgstr ""
 
-#: src/unstrip.c:1883
+#: src/unstrip.c:1891
 #, c-format
 msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
 msgstr ""
 
-#: src/unstrip.c:1886
+#: src/unstrip.c:1894
 #, c-format
 msgid ""
 "DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
 msgstr ""
 
-#: src/unstrip.c:1905 src/unstrip.c:1945 src/unstrip.c:1957 src/unstrip.c:2037
+#: src/unstrip.c:1913 src/unstrip.c:1964 src/unstrip.c:1976 src/unstrip.c:2062
 #, c-format
 msgid "cannot create ELF descriptor: %s"
 msgstr ""
 
-#: src/unstrip.c:1963
-#, c-format
-msgid "'%s' and '%s' do not seem to match"
+#: src/unstrip.c:1955
+msgid "WARNING: "
 msgstr ""
 
-#: src/unstrip.c:1994
+#: src/unstrip.c:1957
+msgid ", use --force"
+msgstr ""
+
+#: src/unstrip.c:1980
+msgid "ELF header identification (e_ident) different"
+msgstr ""
+
+#: src/unstrip.c:1983
+msgid "ELF header type (e_type) different"
+msgstr ""
+
+#: src/unstrip.c:1986
+msgid "ELF header machine type (e_machine) different"
+msgstr ""
+
+#: src/unstrip.c:1989
+msgid "stripped program header (e_phnum) smaller than unstripped"
+msgstr ""
+
+#: src/unstrip.c:2019
 #, c-format
 msgid "cannot find stripped file for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:1998
+#: src/unstrip.c:2023
 #, c-format
 msgid "cannot open stripped file '%s' for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2013
+#: src/unstrip.c:2038
 #, c-format
 msgid "cannot find debug file for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2017
+#: src/unstrip.c:2042
 #, c-format
 msgid "cannot open debug file '%s' for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2030
+#: src/unstrip.c:2055
 #, c-format
 msgid "module '%s' file '%s' is not stripped"
 msgstr ""
 
-#: src/unstrip.c:2061
+#: src/unstrip.c:2086
 #, c-format
 msgid "cannot cache section addresses for module '%s': %s"
 msgstr ""
 
-#: src/unstrip.c:2194
+#: src/unstrip.c:2219
 #, c-format
 msgid "no matching modules found"
 msgstr ""
 
-#: src/unstrip.c:2203
+#: src/unstrip.c:2228
 #, c-format
 msgid "matched more than one module"
 msgstr ""
 
-#: src/unstrip.c:2250
+#: src/unstrip.c:2275
 msgid ""
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
 msgstr ""
 
-#: src/unstrip.c:2251
+#: src/unstrip.c:2276
 msgid ""
 "Combine stripped files with separate symbols and debug information.\vThe "
 "first form puts the result in DEBUG-FILE if -o was not given.\n"
@@ -6269,6 +6490,14 @@ msgid ""
 "was found, or . if FILE contains the debug information."
 msgstr ""
 
+#, fuzzy
+#~ msgid "cannot attach to process"
+#~ msgstr "検索ツリーを生成できません"
+
+#, fuzzy
+#~ msgid "cannot attach to core"
+#~ msgstr "検索ツリーを生成できません"
+
 #~ msgid "unknown tag %hx"
 #~ msgstr "不明なタグ %hx"
 
index d381360..98d93d3 100644 (file)
Binary files a/po/pl.gmo and b/po/pl.gmo differ
index af0032a..b5224dc 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -1,13 +1,13 @@
 # translation of pl.po to Polish
 # Jakub Bogusz <qboosh@pld-linux.org>, 2003-2007.
-# Piotr Drąg <piotrdrag@gmail.com>, 2010.
+# Piotr Drąg <piotrdrag@gmail.com>, 2010-2012.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: pl\n"
 "Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
-"POT-Creation-Date: 2012-08-27 20:34+0200\n"
-"PO-Revision-Date: 2011-02-13 16:25+0100\n"
+"POT-Creation-Date: 2014-08-27 11:26+0200\n"
+"PO-Revision-Date: 2012-09-02 19:12+0200\n"
 "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
 "Language-Team: Polish <trans-pl@lists.fedoraproject.org>\n"
 "Language: pl\n"
@@ -17,18 +17,18 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
 "|| n%100>=20) ? 1 : 2);\n"
 
-#: lib/xmalloc.c:54 lib/xmalloc.c:68 lib/xmalloc.c:82 src/readelf.c:2842
-#: src/readelf.c:3181 src/unstrip.c:2090 src/unstrip.c:2298
+#: lib/xmalloc.c:54 lib/xmalloc.c:68 lib/xmalloc.c:82 src/readelf.c:3098
+#: src/readelf.c:3447 src/readelf.c:8018 src/unstrip.c:2115 src/unstrip.c:2323
 #, c-format
 msgid "memory exhausted"
 msgstr "pamięć wyczerpana"
 
-#: libasm/asm_error.c:65 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:49
+#: libasm/asm_error.c:65 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:53
 #: 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:51
+#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:55
 #: libelf/elf_error.c:91
 msgid "out of memory"
 msgstr "brak pamięci"
@@ -67,7 +67,7 @@ msgstr "błąd podczas wyprowadzania danych"
 msgid "no backend support available"
 msgstr "brak dostępnej obsługi zaplecza"
 
-#: libasm/asm_error.c:84 libdw/dwarf_error.c:59 libdwfl/libdwflP.h:50
+#: libasm/asm_error.c:84 libdw/dwarf_error.c:59 libdwfl/libdwflP.h:54
 #: libelf/elf_error.c:63
 msgid "unknown error"
 msgstr "nieznany błąd"
@@ -164,7 +164,7 @@ msgstr "nieprawidłowa wersja DWARF"
 msgid "invalid directory index"
 msgstr "nieprawidłowy indeks katalogu"
 
-#: libdw/dwarf_error.c:84 libdwfl/libdwflP.h:70
+#: libdw/dwarf_error.c:84 libdwfl/libdwflP.h:74
 msgid "address out of range"
 msgstr "adres jest spoza zakresu"
 
@@ -184,7 +184,7 @@ msgstr "nieprawidłowy indeks wiersza"
 msgid "invalid address range index"
 msgstr "nieprawidłowy indeks zakresu adresów"
 
-#: libdw/dwarf_error.c:89 libdwfl/libdwflP.h:71
+#: libdw/dwarf_error.c:89 libdwfl/libdwflP.h:75
 msgid "no matching address range"
 msgstr "brak pasującego zakresu adresów"
 
@@ -206,9 +206,9 @@ msgstr "nieprawidłowa wersja CFI"
 
 #: libdw/dwarf_error.c:94
 msgid "no alternative debug link found"
-msgstr ""
+msgstr "nie odnaleziono alternatywnego dowiązania debugowania"
 
-#: libdwfl/argp-std.c:46 src/unstrip.c:2240
+#: libdwfl/argp-std.c:46 src/unstrip.c:2265
 msgid "Input selection options:"
 msgstr "Opcje wyboru wejścia:"
 
@@ -244,132 +244,192 @@ msgstr "Jądro ze wszystkimi modułami"
 msgid "Search path for separate debuginfo files"
 msgstr "Wyszukuje ścieżkę dla oddzielnych plików debuginfo"
 
-#: libdwfl/argp-std.c:142
+#: libdwfl/argp-std.c:157
 msgid "only one of -e, -p, -k, -K, or --core allowed"
 msgstr "dopuszczalna jest tylko jedna z opcji -e, -p, -k, -K lub --core"
 
-#: libdwfl/argp-std.c:202
-#, c-format
-msgid "cannot read ELF core file: %s"
-msgstr "nie można odczytać pliku core ELF: %s"
-
-#: libdwfl/argp-std.c:220
-msgid "No modules recognized in core file"
-msgstr "Nie rozpoznano żadnych modułów w pliku core"
-
-#: libdwfl/argp-std.c:232
+#: libdwfl/argp-std.c:230
 msgid "cannot load kernel symbols"
 msgstr "nie można wczytać symboli jądra"
 
-#: libdwfl/argp-std.c:236
+#: libdwfl/argp-std.c:234
 msgid "cannot find kernel modules"
 msgstr "nie można odnaleźć modułów jądra"
 
-#: libdwfl/argp-std.c:250
+#: libdwfl/argp-std.c:251
 msgid "cannot find kernel or modules"
 msgstr "nie można odnaleźć jądra lub modułów"
 
-#: libdwfl/libdwflP.h:52
+#: libdwfl/argp-std.c:290
+#, c-format
+msgid "cannot read ELF core file: %s"
+msgstr "nie można odczytać pliku core ELF: %s"
+
+#: libdwfl/argp-std.c:311
+msgid "No modules recognized in core file"
+msgstr "Nie rozpoznano żadnych modułów w pliku core"
+
+#: libdwfl/libdwflP.h:56
 msgid "See errno"
 msgstr "Proszę zobaczyć errno"
 
-#: libdwfl/libdwflP.h:53
+#: libdwfl/libdwflP.h:57
 msgid "See elf_errno"
 msgstr "Proszę zobaczyć elf_errno"
 
-#: libdwfl/libdwflP.h:54
+#: libdwfl/libdwflP.h:58
 msgid "See dwarf_errno"
 msgstr "Proszę zobaczyć dwarf_errno"
 
-#: libdwfl/libdwflP.h:55
+#: libdwfl/libdwflP.h:59
 msgid "See ebl_errno (XXX missing)"
 msgstr "Proszę zobaczyć ebl_errno (brak XXX)"
 
-#: libdwfl/libdwflP.h:56
+#: libdwfl/libdwflP.h:60
 msgid "gzip decompression failed"
 msgstr "dekompresja gzip nie powiodła się"
 
-#: libdwfl/libdwflP.h:57
+#: libdwfl/libdwflP.h:61
 msgid "bzip2 decompression failed"
 msgstr "dekompresja bzip2 nie powiodła się"
 
-#: libdwfl/libdwflP.h:58
+#: libdwfl/libdwflP.h:62
 msgid "LZMA decompression failed"
 msgstr "dekompresja LZMA nie powiodła się"
 
-#: libdwfl/libdwflP.h:59
+#: libdwfl/libdwflP.h:63
 msgid "no support library found for machine"
 msgstr "nie odnaleziono biblioteki obsługi dla komputera"
 
-#: libdwfl/libdwflP.h:60
+#: libdwfl/libdwflP.h:64
 msgid "Callbacks missing for ET_REL file"
 msgstr "Brak wywołań zwrotnych dla pliku ET_REL"
 
-#: libdwfl/libdwflP.h:61
+#: libdwfl/libdwflP.h:65
 msgid "Unsupported relocation type"
 msgstr "Nieobsługiwany typ relokacji"
 
-#: libdwfl/libdwflP.h:62
+#: libdwfl/libdwflP.h:66
 msgid "r_offset is bogus"
 msgstr "r_offset jest fałszywe"
 
-#: libdwfl/libdwflP.h:63 libelf/elf_error.c:111 libelf/elf_error.c:171
+#: libdwfl/libdwflP.h:67 libelf/elf_error.c:111 libelf/elf_error.c:171
 msgid "offset out of range"
 msgstr "offset spoza zakresu"
 
-#: libdwfl/libdwflP.h:64
+#: libdwfl/libdwflP.h:68
 msgid "relocation refers to undefined symbol"
 msgstr "relokacja odnosi się do nieokreślonego symbolu"
 
-#: libdwfl/libdwflP.h:65
+#: libdwfl/libdwflP.h:69
 msgid "Callback returned failure"
 msgstr "Wywołanie zwrotne zwróciło niepowodzenie"
 
-#: libdwfl/libdwflP.h:66
+#: libdwfl/libdwflP.h:70
 msgid "No DWARF information found"
 msgstr "Nie odnaleziono informacji DWARF"
 
-#: libdwfl/libdwflP.h:67
+#: libdwfl/libdwflP.h:71
 msgid "No symbol table found"
 msgstr "Nie odnaleziono tabeli symboli"
 
-#: libdwfl/libdwflP.h:68
+#: libdwfl/libdwflP.h:72
 msgid "No ELF program headers"
 msgstr "Brak nagłówków programu ELF"
 
-#: libdwfl/libdwflP.h:69
+#: libdwfl/libdwflP.h:73
 msgid "address range overlaps an existing module"
 msgstr "zakres adresów pokrywa się z istniejącym modułem"
 
-#: libdwfl/libdwflP.h:72
+#: libdwfl/libdwflP.h:76
 msgid "image truncated"
 msgstr "skrócono obraz"
 
-#: libdwfl/libdwflP.h:73
+#: libdwfl/libdwflP.h:77
 msgid "ELF file opened"
 msgstr "otwarto plik ELF"
 
-#: libdwfl/libdwflP.h:74
+#: libdwfl/libdwflP.h:78
 msgid "not a valid ELF file"
 msgstr "nie jest prawidłowym plikiem ELF"
 
-#: libdwfl/libdwflP.h:75
+#: libdwfl/libdwflP.h:79
 msgid "cannot handle DWARF type description"
 msgstr "nie można obsłużyć opisu typu DWARF"
 
-#: libdwfl/libdwflP.h:76
+#: libdwfl/libdwflP.h:80
 msgid "ELF file does not match build ID"
 msgstr "plik ELF nie posiada pasującego identyfikatora kopii"
 
-#: libdwfl/libdwflP.h:77
+#: libdwfl/libdwflP.h:81
 msgid "corrupt .gnu.prelink_undo section data"
 msgstr "uszkodzone dane sekcji .gnu.prelink_undo"
 
+#: libdwfl/libdwflP.h:82
+msgid "Internal error due to ebl"
+msgstr ""
+
+#: libdwfl/libdwflP.h:83
+msgid "Missing data in core file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:84
+#, fuzzy
+msgid "Invalid register"
+msgstr "nieprawidłowy parametr"
+
+#: libdwfl/libdwflP.h:85
+msgid "Error reading process memory"
+msgstr ""
+
+#: libdwfl/libdwflP.h:86
+msgid "Couldn't find architecture of any ELF"
+msgstr ""
+
+#: libdwfl/libdwflP.h:87
+msgid "Error parsing /proc filesystem"
+msgstr ""
+
+#: libdwfl/libdwflP.h:88
+#, fuzzy
+msgid "Invalid DWARF"
+msgstr "nieprawidłowy DWARF"
+
+#: libdwfl/libdwflP.h:89
+msgid "Unsupported DWARF"
+msgstr ""
+
+#: libdwfl/libdwflP.h:90
+msgid "Unable to find more threads"
+msgstr ""
+
+#: libdwfl/libdwflP.h:91
+msgid "Dwfl already has attached state"
+msgstr ""
+
+#: libdwfl/libdwflP.h:92
+msgid "Dwfl has no attached state"
+msgstr ""
+
+#: libdwfl/libdwflP.h:93
+msgid "Unwinding not supported for this architecture"
+msgstr ""
+
+#: libdwfl/libdwflP.h:94
+#, fuzzy
+msgid "Invalid argument"
+msgstr "nieprawidłowy parametr"
+
+#: libdwfl/libdwflP.h:95
+#, fuzzy
+msgid "Not an ET_CORE ELF file"
+msgstr "nie jest prawidłowym plikiem ELF"
+
 #: libebl/eblbackendname.c:42
 msgid "No backend"
 msgstr "Brak zaplecza"
 
-#: libebl/eblcorenotetypename.c:86 libebl/eblobjecttypename.c:57
+#: libebl/eblcorenotetypename.c:102 libebl/eblobjecttypename.c:57
 #: libebl/eblobjnotetypename.c:73 libebl/eblosabiname.c:77
 #: libebl/eblsectionname.c:89 libebl/eblsectiontypename.c:119
 #: libebl/eblsegmenttypename.c:83
@@ -382,44 +442,44 @@ msgid "<unknown>: %#<PRIx64>"
 msgstr "<nieznany>: %#<PRIx64>"
 
 #: libebl/eblobjnote.c:55
-#, fuzzy, c-format
+#, c-format
 msgid "unknown SDT version %u\n"
-msgstr "nieznana wersja"
+msgstr "nieznana wersja SDT %u\n"
 
 #: libebl/eblobjnote.c:73
-#, fuzzy, c-format
+#, c-format
 msgid "invalid SDT probe descriptor\n"
-msgstr "nieprawidłowy deskryptor pliku"
+msgstr "nieprawidłowy deskryptor sondy SDT\n"
 
 #: libebl/eblobjnote.c:123
 #, c-format
 msgid "    PC: "
-msgstr ""
+msgstr "    PC: "
 
 #: libebl/eblobjnote.c:125
 #, c-format
 msgid " Base: "
-msgstr ""
+msgstr " Podstawa: "
 
 #: libebl/eblobjnote.c:127
 #, c-format
 msgid " Semaphore: "
-msgstr ""
+msgstr " Semafor: "
 
 #: libebl/eblobjnote.c:129
 #, c-format
 msgid "    Provider: "
-msgstr ""
+msgstr "    Dostawca: "
 
 #: libebl/eblobjnote.c:131
 #, c-format
 msgid " Name: "
-msgstr ""
+msgstr " Nazwa: "
 
 #: libebl/eblobjnote.c:133
 #, c-format
 msgid " Args: "
-msgstr ""
+msgstr " Parametry: "
 
 #: libebl/eblobjnote.c:143
 #, c-format
@@ -465,7 +525,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:4697
+#: libelf/elf_error.c:87 src/readelf.c:5190
 #, c-format
 msgid "invalid encoding"
 msgstr "nieprawidłowe kodowanie"
@@ -546,8 +606,8 @@ msgstr "dane/scn nie zgadzają się"
 msgid "invalid section header"
 msgstr "nieprawidłowy nagłówek sekcji"
 
-#: libelf/elf_error.c:187 src/readelf.c:6335 src/readelf.c:6780
-#: src/readelf.c:6881 src/readelf.c:7043
+#: libelf/elf_error.c:187 src/readelf.c:6980 src/readelf.c:7426
+#: src/readelf.c:7527 src/readelf.c:7689
 #, c-format
 msgid "invalid data"
 msgstr "nieprawidłowe dane"
@@ -612,33 +672,44 @@ msgid "Also show symbol or section names"
 msgstr "Wyświetla także nazwy symboli ub sekcji"
 
 #: src/addr2line.c:64
+#, fuzzy
+msgid "Also show symbol and the section names"
+msgstr "Wyświetla także nazwy symboli ub sekcji"
+
+#: src/addr2line.c:65
 msgid "Also show line table flags"
 msgstr "Wyświetla także flagi tabeli wierszy"
 
-#: src/addr2line.c:66
+#: src/addr2line.c:67
 msgid "Treat addresses as offsets relative to NAME section."
 msgstr "Traktuje adresy jako offsety względne do sekcji NAZWA."
 
-#: src/addr2line.c:68 src/elfcmp.c:72 src/findtextrel.c:67 src/nm.c:100
+#: src/addr2line.c:69
+msgid ""
+"Show all source locations that caused inline expansion of subroutines at the "
+"address."
+msgstr ""
+
+#: src/addr2line.c:72 src/elfcmp.c:72 src/findtextrel.c:67 src/nm.c:100
 #: src/strings.c:75
 msgid "Miscellaneous:"
 msgstr "Różne:"
 
-#: src/addr2line.c:77
+#: src/addr2line.c:81
 msgid ""
 "Locate source files and line information for ADDRs (in a.out by default)."
 msgstr ""
 "Odnajdywanie plików źródłowych i informacji o wierszu dla ADRESU (domyślne w "
 "a.out)."
 
-#: src/addr2line.c:81
+#: src/addr2line.c:85
 msgid "[ADDR...]"
 msgstr "[ADRES...]"
 
-#: src/addr2line.c:181 src/ar.c:289 src/elfcmp.c:662 src/elflint.c:231
+#: src/addr2line.c:196 src/ar.c:289 src/elfcmp.c:662 src/elflint.c:235
 #: src/findtextrel.c:162 src/ld.c:949 src/nm.c:265 src/objdump.c:181
-#: src/ranlib.c:128 src/readelf.c:460 src/size.c:211 src/strings.c:219
-#: src/strip.c:213 src/unstrip.c:226
+#: src/ranlib.c:128 src/readelf.c:500 src/size.c:211 src/strings.c:226
+#: src/strip.c:213 src/unstrip.c:233
 #, c-format
 msgid ""
 "Copyright (C) %s Red Hat, Inc.\n"
@@ -651,30 +722,30 @@ msgstr ""
 "BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI\n"
 "HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ.\n"
 
-#: src/addr2line.c:186 src/ar.c:294 src/elfcmp.c:667 src/elflint.c:236
+#: src/addr2line.c:201 src/ar.c:294 src/elfcmp.c:667 src/elflint.c:240
 #: src/findtextrel.c:167 src/ld.c:954 src/nm.c:270 src/objdump.c:186
-#: src/ranlib.c:133 src/readelf.c:465 src/size.c:216 src/strings.c:224
-#: src/strip.c:218 src/unstrip.c:231
+#: src/ranlib.c:133 src/readelf.c:505 src/size.c:216 src/strings.c:231
+#: src/strip.c:218 src/unstrip.c:238
 #, c-format
 msgid "Written by %s.\n"
 msgstr "Napisane przez %s.\n"
 
-#: src/addr2line.c:405
+#: src/addr2line.c:474
 #, c-format
 msgid "Section syntax requires exactly one module"
 msgstr "Składnia sekcji wymaga dokładnie jednego modułu"
 
-#: src/addr2line.c:428
+#: src/addr2line.c:497
 #, c-format
 msgid "offset %#<PRIxMAX> lies outside section '%s'"
 msgstr "offset %#<PRIxMAX> leży poza sekcją \"%s\""
 
-#: src/addr2line.c:469
+#: src/addr2line.c:563
 #, c-format
 msgid "cannot find symbol '%s'"
 msgstr "nie można odnaleźć symbolu \"%s\""
 
-#: src/addr2line.c:474
+#: src/addr2line.c:568
 #, c-format
 msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
 msgstr "offset %#<PRIxMAX> leży poza zawartością \"%s\""
@@ -809,7 +880,7 @@ msgstr "wymagana jest nazwa archiwum"
 #: src/ar.c:249
 #, c-format
 msgid "command option required"
-msgstr ""
+msgstr "wymagana jest opcja polecenia"
 
 #: src/ar.c:314
 #, c-format
@@ -958,7 +1029,7 @@ msgstr "Ignorowanie permutacji kubełków w sekcji SHT_HASH"
 
 #: src/elfcmp.c:69
 msgid "Ignore differences in build ID"
-msgstr "Ignorowanie różnic w identyfikatorze budowania"
+msgstr "Ignorowanie różnic w identyfikatorze kopii"
 
 #: src/elfcmp.c:70
 msgid "Output nothing; yield exit status only"
@@ -1059,12 +1130,12 @@ msgstr "%s %s różnią się: sekcja [%zu] \"%s\" notatka \"%s\" typ"
 #: src/elfcmp.c:462
 #, c-format
 msgid "%s %s differ: build ID length"
-msgstr "%s %s różnią się: długość identyfikatora budowania"
+msgstr "%s %s różnią się: długość identyfikatora kopii"
 
 #: src/elfcmp.c:470
 #, c-format
 msgid "%s %s differ: build ID content"
-msgstr "%s %s różnią się: zawartość identyfikatora budowania"
+msgstr "%s %s różnią się: zawartość identyfikatora kopii"
 
 #: src/elfcmp.c:479
 #, c-format
@@ -1113,8 +1184,8 @@ msgstr "Nieprawidłowa wartość \"%s\" dla parametru --gaps."
 
 #: src/elfcmp.c:722 src/findtextrel.c:221 src/ldgeneric.c:1757
 #: src/ldgeneric.c:4247 src/nm.c:381 src/ranlib.c:161 src/size.c:293
-#: src/strings.c:175 src/strip.c:450 src/strip.c:487 src/unstrip.c:1903
-#: src/unstrip.c:1932
+#: src/strings.c:182 src/strip.c:451 src/strip.c:488 src/unstrip.c:1911
+#: src/unstrip.c:1940
 #, c-format
 msgid "cannot open '%s'"
 msgstr "nie można otworzyć \"%s\""
@@ -1169,160 +1240,160 @@ 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:78 src/readelf.c:113
+#: src/elflint.c:78 src/readelf.c:123
 msgid "FILE..."
 msgstr "PLIK..."
 
-#: src/elflint.c:151 src/readelf.c:271
+#: src/elflint.c:155 src/readelf.c:292
 #, c-format
 msgid "cannot open input file"
 msgstr "nie można otworzyć pliku wejściowego"
 
-#: src/elflint.c:158
+#: src/elflint.c:162
 #, c-format
 msgid "cannot generate Elf descriptor: %s\n"
 msgstr "nie można utworzyć deskryptora ELF: %s\n"
 
-#: src/elflint.c:177
+#: src/elflint.c:181
 #, c-format
 msgid "error while closing Elf descriptor: %s\n"
 msgstr "błąd podczas zamykania deskryptora ELF: %s\n"
 
-#: src/elflint.c:181
+#: src/elflint.c:185
 msgid "No errors"
 msgstr "Brak błędów"
 
-#: src/elflint.c:215 src/readelf.c:434
+#: src/elflint.c:219 src/readelf.c:468
 msgid "Missing file name.\n"
 msgstr "Brak nazwy pliku.\n"
 
-#: src/elflint.c:294
+#: src/elflint.c:298
 #, c-format
 msgid " error while freeing sub-ELF descriptor: %s\n"
 msgstr " błąd podczas zwalniania deskryptora pod-ELF: %s\n"
 
-#: src/elflint.c:302
+#: src/elflint.c:306
 #, c-format
 msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
 msgstr "To nie jest plik ELF - posiada błędne bajty magiczne na początku\n"
 
-#: src/elflint.c:363
+#: src/elflint.c:371
 #, c-format
 msgid "e_ident[%d] == %d is no known class\n"
 msgstr "e_ident[%d] == %d nie jest znaną klasą\n"
 
-#: src/elflint.c:368
+#: src/elflint.c:376
 #, c-format
 msgid "e_ident[%d] == %d is no known data encoding\n"
 msgstr "e_ident[%d] == %d nie jest znanym kodowaniem danych\n"
 
-#: src/elflint.c:372
+#: src/elflint.c:380
 #, c-format
 msgid "unknown ELF header version number e_ident[%d] == %d\n"
 msgstr "nieznany numer wersji nagłówka ELF e_ident[%d] == %d\n"
 
-#: src/elflint.c:378
+#: src/elflint.c:386
 #, c-format
 msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
 msgstr "nieobsługiwane ABI systemu operacyjnego e_ident[%d] == \"%s\"\n"
 
-#: src/elflint.c:384
+#: src/elflint.c:392
 #, c-format
 msgid "unsupport ABI version e_ident[%d] == %d\n"
 msgstr "nieobsługiwana wersja ABI e_ident[%d] == %d\n"
 
-#: src/elflint.c:389
+#: src/elflint.c:397
 #, c-format
 msgid "e_ident[%zu] is not zero\n"
 msgstr "e_ident[%zu] nie wynosi zero\n"
 
-#: src/elflint.c:394
+#: src/elflint.c:402
 #, c-format
 msgid "unknown object file type %d\n"
 msgstr "nieznany typ pliku obiektu %d\n"
 
-#: src/elflint.c:401
+#: src/elflint.c:409
 #, c-format
 msgid "unknown machine type %d\n"
 msgstr "nieznany typ komputera %d\n"
 
-#: src/elflint.c:405
+#: src/elflint.c:413
 #, c-format
 msgid "unknown object file version\n"
 msgstr "nieznana wersja pliku obiektu\n"
 
-#: src/elflint.c:411
+#: src/elflint.c:419
 #, c-format
 msgid "invalid program header offset\n"
 msgstr "nieprawidłowy offset nagłówka programu\n"
 
-#: src/elflint.c:413
+#: src/elflint.c:421
 #, c-format
 msgid "executables and DSOs cannot have zero program header offset\n"
 msgstr ""
 "pliki wykonywalne i DSO nie mogą mieć zerowego offsetu nagłówka programu\n"
 
-#: src/elflint.c:417
+#: src/elflint.c:425
 #, c-format
 msgid "invalid number of program header entries\n"
 msgstr "nieprawidłowa liczba wpisów nagłówka programu\n"
 
-#: src/elflint.c:425
+#: src/elflint.c:433
 #, c-format
 msgid "invalid section header table offset\n"
 msgstr "nieprawidłowy offset tabeli nagłówków sekcji\n"
 
-#: src/elflint.c:428
+#: src/elflint.c:436
 #, c-format
 msgid "section header table must be present\n"
 msgstr "tabela nagłówków sekcji musi istnieć\n"
 
-#: src/elflint.c:442
+#: src/elflint.c:450
 #, c-format
 msgid "invalid number of section header table entries\n"
 msgstr "nieprawidłowa liczba wpisów tabeli nagłówków sekcji\n"
 
-#: src/elflint.c:459
+#: src/elflint.c:467
 #, c-format
 msgid "invalid section header index\n"
 msgstr "nieprawidłowy indeks nagłówka sekcji\n"
 
-#: src/elflint.c:473
+#: src/elflint.c:481
 #, c-format
 msgid "invalid number of program header table entries\n"
 msgstr "nieprawidłowa liczba wpisów tabeli nagłówka programu\n"
 
-#: src/elflint.c:482
+#: src/elflint.c:490
 #, c-format
 msgid "invalid machine flags: %s\n"
 msgstr "nieprawidłowe flagi komputera: %s\n"
 
-#: src/elflint.c:489 src/elflint.c:506
+#: src/elflint.c:497 src/elflint.c:514
 #, c-format
 msgid "invalid ELF header size: %hd\n"
 msgstr "nieprawidłowy rozmiar nagłówka ELF: %hd\n"
 
-#: src/elflint.c:492 src/elflint.c:509
+#: src/elflint.c:500 src/elflint.c:517
 #, c-format
 msgid "invalid program header size: %hd\n"
 msgstr "nieprawidłowa rozmiar nagłówka programu: %hd\n"
 
-#: src/elflint.c:495 src/elflint.c:512
+#: src/elflint.c:503 src/elflint.c:520
 #, c-format
 msgid "invalid program header position or size\n"
 msgstr "nieprawidłowe położenie lub rozmiar nagłówka programu\n"
 
-#: src/elflint.c:498 src/elflint.c:515
+#: src/elflint.c:506 src/elflint.c:523
 #, c-format
 msgid "invalid section header size: %hd\n"
 msgstr "nieprawidłowy rozmiar nagłówka sekcji: %hd\n"
 
-#: src/elflint.c:501 src/elflint.c:518
+#: src/elflint.c:509 src/elflint.c:526
 #, c-format
 msgid "invalid section header position or size\n"
 msgstr "nieprawidłowe położenie lub rozmiar nagłówka sekcji\n"
 
-#: src/elflint.c:562
+#: src/elflint.c:570
 #, c-format
 msgid ""
 "section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
@@ -1330,7 +1401,7 @@ msgid ""
 msgstr ""
 "sekcja [%2d] \"%s\": sekcja z flagą SHF_GROUP nie jest częścią grupy sekcji\n"
 
-#: src/elflint.c:566
+#: src/elflint.c:574
 #, c-format
 msgid ""
 "section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
@@ -1338,14 +1409,14 @@ msgstr ""
 "sekcja [%2d] \"%s\": grupa sekcji [%2zu] \"%s\" nie poprzedza elementu "
 "grupy\n"
 
-#: src/elflint.c:582 src/elflint.c:1426 src/elflint.c:1476 src/elflint.c:1581
-#: src/elflint.c:2166 src/elflint.c:2680 src/elflint.c:2841 src/elflint.c:2971
-#: src/elflint.c:3143 src/elflint.c:4045
+#: src/elflint.c:590 src/elflint.c:1457 src/elflint.c:1508 src/elflint.c:1614
+#: src/elflint.c:1939 src/elflint.c:2228 src/elflint.c:2742 src/elflint.c:2904
+#: src/elflint.c:3034 src/elflint.c:3206 src/elflint.c:4108
 #, c-format
 msgid "section [%2d] '%s': cannot get section data\n"
 msgstr "sekcja [%2d] \"%s\": nie można uzyskać danych sekcji\n"
 
-#: src/elflint.c:595 src/elflint.c:1588
+#: src/elflint.c:603 src/elflint.c:1621
 #, c-format
 msgid ""
 "section [%2d] '%s': referenced as string table for section [%2d] '%s' but "
@@ -1354,7 +1425,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": użyta jako tabela ciągów dla sekcji [%2d] \"%s\", ale "
 "nie jest typu SHT_STRTAB\n"
 
-#: src/elflint.c:618
+#: src/elflint.c:626
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol table cannot have more than one extended index "
@@ -1363,38 +1434,38 @@ msgstr ""
 "sekcja [%2d] \"%s\": tabela symboli nie może mieć więcej niż jednej "
 "rozszerzonej sekcji indeksów\n"
 
-#: src/elflint.c:629
+#: src/elflint.c:638
 #, c-format
 msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
 msgstr "sekcja [%2u] \"%s\": rozmiar wpisu nie zgadza się z ElfXX_Sym\n"
 
-#: src/elflint.c:638
+#: src/elflint.c:647
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
 msgstr "sekcja [%2d] \"%s\": nie można uzyskać symbolu %d: %s\n"
 
-#: src/elflint.c:643 src/elflint.c:646 src/elflint.c:649 src/elflint.c:652
-#: src/elflint.c:655 src/elflint.c:658
+#: src/elflint.c:652 src/elflint.c:655 src/elflint.c:658 src/elflint.c:661
+#: src/elflint.c:664 src/elflint.c:667
 #, c-format
 msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
 msgstr "sekcja [%2d] \"%s\": \"%s\" w zerowym wpisie nie jest zerem\n"
 
-#: src/elflint.c:661
+#: src/elflint.c:670
 #, c-format
 msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
 msgstr "sekcja [%2d] \"%s\": XINDEX dla zerowego wpisu nie jest zerem\n"
 
-#: src/elflint.c:671
+#: src/elflint.c:680
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
 msgstr "sekcja [%2d] \"%s\": nie można uzyskać symbolu %zu: %s\n"
 
-#: src/elflint.c:680
+#: src/elflint.c:689
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
 msgstr "sekcja [%2d] \"%s\": symbol %zu: nieprawidłowa wartość nazwy\n"
 
-#: src/elflint.c:694
+#: src/elflint.c:704
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: too large section index but no extended "
@@ -1403,7 +1474,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": symbol %zu: za duży indeks sekcji, ale nie posiada "
 "sekcji rozszerzonych indeksów sekcji\n"
 
-#: src/elflint.c:700
+#: src/elflint.c:710
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
@@ -1412,28 +1483,28 @@ msgstr ""
 "sekcja [%2d] \"%s\": symbol %zu: XINDEX użyty dla indeksu, który zmieściłby "
 "się w st_shndx (%<PRIu32>)\n"
 
-#: src/elflint.c:712
+#: src/elflint.c:722
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
 msgstr "sekcja [%2d] \"%s\": symbol %zu: nieprawidłowy indeks sekcji\n"
 
-#: src/elflint.c:720
+#: src/elflint.c:730
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown type\n"
 msgstr "sekcja [%2d] \"%s\": symbol %zu: nieznany typ\n"
 
-#: src/elflint.c:726
+#: src/elflint.c:736
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
 msgstr "sekcja [%2d] \"%s\": symbol %zu: nieznane dowiązanie symbolu\n"
 
-#: src/elflint.c:731
+#: src/elflint.c:741
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
 msgstr ""
 "sekcja [%2d] \"%s\": symbol %zu: unikalny symbol nie jest typem obiektu\n"
 
-#: src/elflint.c:739
+#: src/elflint.c:749
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
@@ -1441,23 +1512,23 @@ msgstr ""
 "sekcja [%2d] \"%s\": symbol %zu: COMMON jest dozwolone tylko w plikach "
 "relokowalnych\n"
 
-#: src/elflint.c:743
+#: src/elflint.c:753
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
 msgstr "sekcja [%2d] \"%s\": symbol %zu: lokalne symbole COMMON to nonsens\n"
 
-#: src/elflint.c:747
+#: src/elflint.c:757
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
 msgstr "sekcja [%2d] \"%s\": symbol %zu: funkcja w sekcji COMMON to nonsens\n"
 
-#: src/elflint.c:779
+#: src/elflint.c:804
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
 msgstr "sekcja [%2d] \"%s\": symbol %zu: st_value spoza zakresu\n"
 
-#: src/elflint.c:785 src/elflint.c:810 src/elflint.c:853
+#: src/elflint.c:810 src/elflint.c:835 src/elflint.c:878
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu does not fit completely in referenced section "
@@ -1466,7 +1537,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": symbol %zu nie mieści się w całości we wskazywanej "
 "sekcji [%2d] \"%s\"\n"
 
-#: src/elflint.c:794
+#: src/elflint.c:819
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
@@ -1475,7 +1546,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": symbol %zu: wskazywana sekcja [%2d] \"%s\" nie posiada "
 "ustawionej flagi SHF_TLS\n"
 
-#: src/elflint.c:804 src/elflint.c:846
+#: src/elflint.c:829 src/elflint.c:871
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
@@ -1484,7 +1555,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": symbol %zu: st_value spoza zakresu wskazywanej sekcji "
 "[%2d] \"%s\"\n"
 
-#: src/elflint.c:831
+#: src/elflint.c:856
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
@@ -1492,7 +1563,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": symbol %zu: symbol TLS, ale brak wpisu TLS nagłówka "
 "programu\n"
 
-#: src/elflint.c:839
+#: src/elflint.c:864
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] "
@@ -1501,7 +1572,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": symbol %zu: st_value pomija wskazywaną sekcję [%2d] \"%s"
 "\"\n"
 
-#: src/elflint.c:866
+#: src/elflint.c:891
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: local symbol outside range described in "
@@ -1510,7 +1581,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": symbol %zu: lokalny symbol spoza zakresu określonego w "
 "sh_info\n"
 
-#: src/elflint.c:873
+#: src/elflint.c:898
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
@@ -1519,12 +1590,12 @@ msgstr ""
 "sekcja [%2d] \"%s\": symbol %zu: nielokalny symbol spoza zakresu określonego "
 "w sh_info\n"
 
-#: src/elflint.c:880
+#: src/elflint.c:905
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
 msgstr "sekcja [%2d] \"%s\": symbol %zu: nielokalny symbol sekcji\n"
 
-#: src/elflint.c:930
+#: src/elflint.c:955
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section "
@@ -1533,7 +1604,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": symbol _GLOBAL_OFFSET_TABLE_ odnosi się do błędnej "
 "sekcji [%2d]\n"
 
-#: src/elflint.c:937
+#: src/elflint.c:962
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] "
@@ -1542,7 +1613,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": symbol _GLOBAL_OFFSET_TABLE_ odnosi się do sekcji [%2d] "
 "\"%s\"\n"
 
-#: src/elflint.c:953
+#: src/elflint.c:978
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
@@ -1551,7 +1622,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": wartość symbolu _GLOBAL_OFFSET_TABLE_ %#<PRIx64> nie "
 "pasuje do adresu sekcji %s %#<PRIx64>\n"
 
-#: src/elflint.c:960
+#: src/elflint.c:985
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
@@ -1560,7 +1631,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": rozmiar symbolu _GLOBAL_OFFSET_TABLE_ %<PRIu64> nie "
 "pasuje do rozmiaru sekcji %s %<PRIu64>\n"
 
-#: src/elflint.c:968
+#: src/elflint.c:993
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
@@ -1569,7 +1640,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": symbol _GLOBAL_OFFSET_TABLE_ istnieje, ale brak sekcji ."
 "got\n"
 
-#: src/elflint.c:984
+#: src/elflint.c:1009
 #, c-format
 msgid ""
 "section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
@@ -1578,7 +1649,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": wartość symbolu _DYNAMIC_ %#<PRIx64> nie pasuje do "
 "adresu segmentu dynamicznego %#<PRIx64>\n"
 
-#: src/elflint.c:991
+#: src/elflint.c:1016
 #, c-format
 msgid ""
 "section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
@@ -1587,7 +1658,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": rozmiar symbolu _DYNAMIC_ %<PRIu64> nie pasuje do "
 "rozmiaru segmentu dynamicznego %<PRIu64>\n"
 
-#: src/elflint.c:1004
+#: src/elflint.c:1029
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
@@ -1596,22 +1667,22 @@ msgstr ""
 "sekcja [%2d] \"%s\": symbol %zu: symbol w dynamicznej tabeli symboli z "
 "niedomyślną widocznością\n"
 
-#: src/elflint.c:1008
+#: src/elflint.c:1033
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
 msgstr "sekcja [%2d] \"%s\": symbol %zu: ustawiono nieznany bit w st_other\n"
 
-#: src/elflint.c:1053
+#: src/elflint.c:1082
 #, c-format
 msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
 msgstr "sekcja [%2d] \"%s\": DT_RELCOUNT użyte dla tej sekcji RELA\n"
 
-#: src/elflint.c:1062 src/elflint.c:1114
+#: src/elflint.c:1093 src/elflint.c:1145
 #, c-format
 msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
 msgstr "sekcja [%2d] \"%s\": DT_RELCOUNT %d za duże dla tej sekcji\n"
 
-#: src/elflint.c:1087 src/elflint.c:1139
+#: src/elflint.c:1118 src/elflint.c:1170
 #, c-format
 msgid ""
 "section [%2d] '%s': relative relocations after index %d as specified by "
@@ -1620,7 +1691,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": relokacje względne po indeksie %d podanym przez "
 "DT_RELCOUNT\n"
 
-#: src/elflint.c:1093 src/elflint.c:1145
+#: src/elflint.c:1124 src/elflint.c:1176
 #, c-format
 msgid ""
 "section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
@@ -1629,50 +1700,50 @@ msgstr ""
 "sekcja [%2d] \"%s\": relokacja bezwzględna pod indeksem %zu; DT_RELCOUNT "
 "podał %d relokacji względnych\n"
 
-#: src/elflint.c:1105
+#: src/elflint.c:1136
 #, c-format
 msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
 msgstr "sekcja [%2d] \"%s\": DT_RELACOUNT użyte dla tej sekcji REL\n"
 
-#: src/elflint.c:1187
+#: src/elflint.c:1218
 #, c-format
 msgid "section [%2d] '%s': invalid destination section index\n"
 msgstr "sekcja [%2d] \"%s\": nieprawidłowy indeks sekcji docelowej\n"
 
-#: src/elflint.c:1200
+#: src/elflint.c:1230
 #, c-format
 msgid "section [%2d] '%s': invalid destination section type\n"
 msgstr "sekcja [%2d] \"%s\": nieprawidłowy typ sekcji docelowej\n"
 
-#: src/elflint.c:1208
+#: src/elflint.c:1238
 #, c-format
 msgid "section [%2d] '%s': sh_info should be zero\n"
 msgstr "sekcja [%2d] \"%s\": sh_info powinno wynosić zero\n"
 
-#: src/elflint.c:1215
+#: src/elflint.c:1245
 #, c-format
 msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
 msgstr "sekcja [%2d] \"%s\": relokacje dla sekcji złączalnych są niemożliwe\n"
 
-#: src/elflint.c:1222
+#: src/elflint.c:1253
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
 msgstr ""
 "sekcja [%2d] \"%s\": rozmiar wpisu sekcji nie zgadza się z ElfXX_Rela\n"
 
-#: src/elflint.c:1282
+#: src/elflint.c:1313
 #, c-format
 msgid "text relocation flag set but there is no read-only segment\n"
 msgstr ""
 "flaga relokacji tekstu jest ustawiona, ale nie posiada segmentu tylko do "
 "odczytu\n"
 
-#: src/elflint.c:1309
+#: src/elflint.c:1340
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: invalid type\n"
 msgstr "sekcja [%2d] \"%s\": relokacja %zu: nieprawidłowy typ\n"
 
-#: src/elflint.c:1317
+#: src/elflint.c:1348
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: relocation type invalid for the file "
@@ -1681,12 +1752,12 @@ msgstr ""
 "sekcja [%2d] \"%s\": relokacja %zu: typ relokacji nieprawidłowy dla tego "
 "typu pliku\n"
 
-#: src/elflint.c:1325
+#: src/elflint.c:1356
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
 msgstr "sekcja [%2d] \"%s\": relokacja %zu: nieprawidłowy indeks symbolu\n"
 
-#: src/elflint.c:1343
+#: src/elflint.c:1374
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
@@ -1695,12 +1766,12 @@ msgstr ""
 "sekcja [%2d] \"%s\": relokacja %zu: z %s można użyć tylko symbolu "
 "\"_GLOBAL_OFFSET_TABLE_\"\n"
 
-#: src/elflint.c:1360
+#: src/elflint.c:1391
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
 msgstr "sekcja [%2d] \"%s\": relokacja %zu: offset spoza zakresu\n"
 
-#: src/elflint.c:1375
+#: src/elflint.c:1406
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: copy relocation against symbol of type "
@@ -1709,7 +1780,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": relokacja %zu: relokacja kopii względem symbolu typu "
 "%s\n"
 
-#: src/elflint.c:1396
+#: src/elflint.c:1427
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: read-only section modified but text "
@@ -1718,60 +1789,60 @@ msgstr ""
 "sekcja [%2d] \"%s\": relokacja %zu: sekcja tylko do odczytu została "
 "zmodyfikowana, ale nie ustawiono flagi relokacji tekstu\n"
 
-#: src/elflint.c:1411
+#: src/elflint.c:1442
 #, c-format
 msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
 msgstr ""
 "sekcja [%2d] \"%s\": relokacje względem wczytanych i niewczytanych danych\n"
 
-#: src/elflint.c:1450 src/elflint.c:1500
+#: src/elflint.c:1482 src/elflint.c:1533
 #, c-format
 msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
 msgstr "sekcja [%2d] \"%s\": nie można uzyskać relokacji %zu: %s\n"
 
-#: src/elflint.c:1576
+#: src/elflint.c:1609
 #, c-format
 msgid "more than one dynamic section present\n"
 msgstr "obecna jest więcej niż jedna sekcja dynamiczna\n"
 
-#: src/elflint.c:1594
+#: src/elflint.c:1628
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
 msgstr "sekcja [%2d] \"%s\": rozmiar wpisu sekcji nie zgadza się z ElfXX_Dyn\n"
 
-#: src/elflint.c:1599 src/elflint.c:1882
+#: src/elflint.c:1633 src/elflint.c:1918
 #, c-format
 msgid "section [%2d] '%s': sh_info not zero\n"
 msgstr "sekcja [%2d] \"%s\": sh_info nie wynosi zero\n"
 
-#: src/elflint.c:1609
+#: src/elflint.c:1643
 #, c-format
 msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
 msgstr ""
 "sekcja [%2d] \"%s\": nie można uzyskać wpisu %zu sekcji dynamicznej: %s\n"
 
-#: src/elflint.c:1617
+#: src/elflint.c:1651
 #, c-format
 msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
 msgstr "sekcja [%2d] \"%s\": wpisy nie-DT_NULL występują po wpisie DT_NULL\n"
 
-#: src/elflint.c:1624
+#: src/elflint.c:1658
 #, c-format
 msgid "section [%2d] '%s': entry %zu: unknown tag\n"
 msgstr "sekcja [%2d] \"%s\": wpis %zu: nieznany znacznik\n"
 
-#: src/elflint.c:1635
+#: src/elflint.c:1669
 #, c-format
 msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
 msgstr ""
 "sekcja [%2d] \"%s\": wpis %zu: więcej niż jeden wpis ze znacznikiem %s\n"
 
-#: src/elflint.c:1645
+#: src/elflint.c:1679
 #, c-format
 msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
 msgstr "sekcja [%2d] \"%s\": wpis %zu: użyto znacznika %s poziomu 2\n"
 
-#: src/elflint.c:1663
+#: src/elflint.c:1697
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
@@ -1779,7 +1850,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": wpis %zu: wartość DT_PLTREL musi wynosić DT_REL lub "
 "DT_RELA\n"
 
-#: src/elflint.c:1676
+#: src/elflint.c:1710
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: pointer does not match address of section "
@@ -1788,7 +1859,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": wpis %zu: wskaźnik nie pasuje do adresu sekcji [%2d] "
 "\"%s\" wskazywanej przez sh_link\n"
 
-#: src/elflint.c:1719
+#: src/elflint.c:1753
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
@@ -1796,7 +1867,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": wpis %zu: wartość %s musi wskazywać na wczytany "
 "segment\n"
 
-#: src/elflint.c:1734
+#: src/elflint.c:1768
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: %s value must be valid offset in section "
@@ -1805,48 +1876,48 @@ msgstr ""
 "sekcja [%2d] \"%s\": wpis %zu: wartość %s musi być prawidłowym offsetem w "
 "sekcji [%2d] \"%s\"\n"
 
-#: src/elflint.c:1754 src/elflint.c:1782
+#: src/elflint.c:1788 src/elflint.c:1816
 #, c-format
 msgid "section [%2d] '%s': contains %s entry but not %s\n"
 msgstr "sekcja [%2d] \"%s\": zawiera wpis %s, ale nie %s\n"
 
-#: src/elflint.c:1766
+#: src/elflint.c:1800
 #, c-format
 msgid "section [%2d] '%s': mandatory tag %s not present\n"
 msgstr "sekcja [%2d] \"%s\": brak obowiązkowego znacznika %s\n"
 
-#: src/elflint.c:1775
+#: src/elflint.c:1809
 #, c-format
 msgid "section [%2d] '%s': no hash section present\n"
 msgstr "sekcja [%2d] \"%s\": brak sekcji skrótów\n"
 
-#: src/elflint.c:1790 src/elflint.c:1797
+#: src/elflint.c:1824 src/elflint.c:1831
 #, c-format
 msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
 msgstr "sekcja [%2d] \"%s\": nie wszystkie z %s, %s i %s są obecne\n"
 
-#: src/elflint.c:1807 src/elflint.c:1811
+#: src/elflint.c:1841 src/elflint.c:1845
 #, c-format
 msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
 msgstr ""
 "sekcja [%2d] \"%s\": brak znacznika %s w DSO oznaczonym podczas wstępnej "
 "konsolidacji\n"
 
-#: src/elflint.c:1817
+#: src/elflint.c:1851
 #, c-format
 msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
 msgstr ""
 "sekcja [%2d] \"%s\": plik nie-DSO oznaczony jako zależność podczas wstępnej "
 "konsolidacji\n"
 
-#: src/elflint.c:1828 src/elflint.c:1832 src/elflint.c:1836 src/elflint.c:1840
+#: src/elflint.c:1862 src/elflint.c:1866 src/elflint.c:1870 src/elflint.c:1874
 #, c-format
 msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
 msgstr ""
 "sekcja [%2d] \"%s\": brak znacznika %s we wstępnie konsolidowanym pliku "
 "wykonywalnym\n"
 
-#: src/elflint.c:1852
+#: src/elflint.c:1886
 #, c-format
 msgid ""
 "section [%2d] '%s': only relocatable files can have extended section index\n"
@@ -1854,7 +1925,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": tylko pliki relokowalne mogą mieć rozszerzoną sekcję "
 "indeksów\n"
 
-#: src/elflint.c:1862
+#: src/elflint.c:1896
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index section not for symbol table\n"
@@ -1862,24 +1933,24 @@ msgstr ""
 "sekcja [%2d] \"%s\": sekcja rozszerzonych indeksów sekcji nie dla tabeli "
 "symboli\n"
 
-#: src/elflint.c:1867
+#: src/elflint.c:1901
 #, c-format
 msgid "cannot get data for symbol section\n"
 msgstr "nie można uzyskać danych dla sekcji symboli\n"
 
-#: src/elflint.c:1870
+#: src/elflint.c:1904
 #, c-format
 msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
 msgstr "sekcja [%2d] \"%s\": rozmiar wpisu nie zgadza się z Elf32_Word\n"
 
-#: src/elflint.c:1877
+#: src/elflint.c:1913
 #, c-format
 msgid "section [%2d] '%s': extended index table too small for symbol table\n"
 msgstr ""
 "sekcja [%2d] \"%s\": tabela rozszerzonych indeksów jest za mała dla tabeli "
 "symboli\n"
 
-#: src/elflint.c:1892
+#: src/elflint.c:1928
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
@@ -1888,24 +1959,24 @@ msgstr ""
 "sekcja [%2d] \"%s\": rozszerzony indeks sekcji w sekcji [%2zu] \"%s\" "
 "odwołuje się do tej samej tabeli symboli\n"
 
-#: src/elflint.c:1903
+#: src/elflint.c:1945
 #, c-format
 msgid "symbol 0 should have zero extended section index\n"
 msgstr "symbol 0 powinien mieć zerowy rozszerzony indeks sekcji\n"
 
-#: src/elflint.c:1915
+#: src/elflint.c:1957
 #, c-format
 msgid "cannot get data for symbol %zu\n"
 msgstr "nie można uzyskać danych dla symbolu %zu\n"
 
-#: src/elflint.c:1920
+#: src/elflint.c:1962
 #, c-format
 msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
 msgstr ""
 "rozszerzony indeks sekcji wynosi %<PRIu32>, ale indeks symbolu nie wynosi "
 "XINDEX\n"
 
-#: src/elflint.c:1936 src/elflint.c:1977
+#: src/elflint.c:1978 src/elflint.c:2029
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
@@ -1913,52 +1984,52 @@ msgstr ""
 "sekcja [%2d] \"%s\": sekcja tabeli mieszającej jest za mała (%ld, oczekiwano "
 "%ld)\n"
 
-#: src/elflint.c:1948 src/elflint.c:1989
+#: src/elflint.c:1990 src/elflint.c:2041
 #, c-format
 msgid "section [%2d] '%s': chain array too large\n"
 msgstr "sekcja [%2d] \"%s\": tabela łańcuchowa jest za duża\n"
 
-#: src/elflint.c:1957 src/elflint.c:1998
+#: src/elflint.c:2004 src/elflint.c:2055
 #, c-format
 msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
 msgstr ""
 "sekcja [%2d] \"%s\": odwołanie do kubełka skrótu %zu jest spoza zakresu\n"
 
-#: src/elflint.c:1963
+#: src/elflint.c:2014
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
 msgstr ""
 "sekcja [%2d] \"%s\": odwołanie do łańcucha skrótu %zu jest spoza zakresu\n"
 
-#: src/elflint.c:2004
+#: src/elflint.c:2065
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
 msgstr ""
 "sekcja [%2d] \"%s\": odwołanie do łańcucha skrótu %<PRIu64> jest spoza "
 "zakresu\n"
 
-#: src/elflint.c:2019
+#: src/elflint.c:2081
 #, c-format
 msgid "section [%2d] '%s': bitmask size not power of 2: %u\n"
 msgstr "sekcja [%2d] \"%s\": rozmiar maski bitowej nie jest potęgą 2: %u\n"
 
-#: src/elflint.c:2030
-#, c-format
+#: src/elflint.c:2092
+#, fuzzy, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected at "
-"least%ld)\n"
+"least %ld)\n"
 msgstr ""
 "sekcja [%2d] \"%s\": sekcja tabeli mieszającej jest za mała (%ld, oczekiwano "
 "co najmniej %ld)\n"
 
-#: src/elflint.c:2038
+#: src/elflint.c:2100
 #, c-format
 msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
 msgstr ""
 "sekcja [%2d] \"%s\": drugie przesunięcie funkcji mieszającej jest za duże: "
 "%u\n"
 
-#: src/elflint.c:2070
+#: src/elflint.c:2132
 #, c-format
 msgid ""
 "section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
@@ -1966,7 +2037,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": łańcuch mieszający dla kubełka %zu jest mniejszy niż "
 "przesunięcie indeksu symboli\n"
 
-#: src/elflint.c:2091
+#: src/elflint.c:2153
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
@@ -1975,7 +2046,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": symbol %u wskazywany w łańcuchu dla kubełka %zu jest "
 "nieokreślony\n"
 
-#: src/elflint.c:2102
+#: src/elflint.c:2164
 #, c-format
 msgid ""
 "section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
@@ -1983,13 +2054,13 @@ msgstr ""
 "sekcja [%2d] \"%s\": wartość skrótu dla symbolu %u w łańcuchu dla kubełka "
 "%zu jest błędna\n"
 
-#: src/elflint.c:2133
+#: src/elflint.c:2195
 #, c-format
 msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
 msgstr ""
 "sekcja [%2d] \"%s\": łańcuch skrótu dla kubełka %zu jest spoza zakresu\n"
 
-#: src/elflint.c:2138
+#: src/elflint.c:2200
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
@@ -1997,36 +2068,36 @@ msgstr ""
 "sekcja [%2d] \"%s\": odwołanie do symbolu w łańcuchu dla kubełka %zu jest "
 "spoza zakresu\n"
 
-#: src/elflint.c:2144
+#: src/elflint.c:2206
 #, c-format
 msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
 msgstr ""
 "sekcja [%2d] \"%s\": maska bitowa nie pasuje do nazw w tabeli mieszającej\n"
 
-#: src/elflint.c:2157
+#: src/elflint.c:2219
 #, c-format
 msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
 msgstr ""
 "sekcja [%2d] \"%s\": pliki relokowalne nie mogą posiadać tabeli "
 "mieszających\n"
 
-#: src/elflint.c:2175
+#: src/elflint.c:2237
 #, c-format
 msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
 msgstr ""
 "sekcja [%2d] \"%s\": tabela mieszająca nie dla tabeli dynamicznych symboli\n"
 
-#: src/elflint.c:2183
+#: src/elflint.c:2245
 #, c-format
 msgid "section [%2d] '%s': hash table entry size incorrect\n"
 msgstr "sekcja [%2d] \"%s\": niepoprawny rozmiar wpisu tabeli mieszającej\n"
 
-#: src/elflint.c:2188
+#: src/elflint.c:2250
 #, c-format
 msgid "section [%2d] '%s': not marked to be allocated\n"
 msgstr "sekcja [%2d] \"%s\": nieoznaczona do przydzielenia\n"
 
-#: src/elflint.c:2193
+#: src/elflint.c:2255
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table has not even room for initial administrative "
@@ -2035,18 +2106,18 @@ msgstr ""
 "sekcja [%2d] \"%s\": tabela mieszająca nie posiada miejsca nawet na "
 "początkowe wpisy administracyjne\n"
 
-#: src/elflint.c:2241
+#: src/elflint.c:2303
 #, c-format
 msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
 msgstr ""
 "sh_link w sekcjach skrótu [%2zu] \"%s\" i [%2zu] \"%s\" nie są identyczne\n"
 
-#: src/elflint.c:2319 src/elflint.c:2323
+#: src/elflint.c:2381 src/elflint.c:2385
 #, c-format
 msgid "section [%2zu] '%s': reference to symbol index 0\n"
 msgstr "sekcja [%2zu] \"%s\": odwołanie do symbolu o indeksie 0\n"
 
-#: src/elflint.c:2330
+#: src/elflint.c:2392
 #, c-format
 msgid ""
 "symbol %d referenced in new hash table in [%2zu] '%s' but not in old hash "
@@ -2055,7 +2126,7 @@ msgstr ""
 "symbol %d wymieniony w nowej tabeli mieszającej w [%2zu] \"%s\", ale nie w "
 "poprzedniej tabeli mieszającej [%2zu] \"%s\"\n"
 
-#: src/elflint.c:2342
+#: src/elflint.c:2404
 #, c-format
 msgid ""
 "symbol %d referenced in old hash table in [%2zu] '%s' but not in new hash "
@@ -2064,12 +2135,12 @@ msgstr ""
 "symbol %d wymieniony w poprzedniej tabeli mieszającej w [%2zu] \"%s\", ale "
 "nie w nowej tabeli mieszającej w [%2zu] \"%s\"\n"
 
-#: src/elflint.c:2358
+#: src/elflint.c:2420
 #, c-format
 msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
 msgstr "sekcja [%2d] \"%s\": niezerowe sh_%s dla sekcji NULL\n"
 
-#: src/elflint.c:2378
+#: src/elflint.c:2440
 #, c-format
 msgid ""
 "section [%2d] '%s': section groups only allowed in relocatable object files\n"
@@ -2077,92 +2148,92 @@ msgstr ""
 "sekcja [%2d] \"%s\": w plikach obiektów relokowalnych dozwolone są tylko "
 "grupy sekcji\n"
 
-#: src/elflint.c:2389
+#: src/elflint.c:2451
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol table: %s\n"
 msgstr "sekcja [%2d] \"%s\": nie można uzyskać tabeli symboli: %s\n"
 
-#: src/elflint.c:2394
+#: src/elflint.c:2456
 #, c-format
 msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
 msgstr ""
 "sekcja [%2d] \"%s\": odwołanie do sekcji w sh_link nie posiada tabeli "
 "symboli\n"
 
-#: src/elflint.c:2400
+#: src/elflint.c:2462
 #, c-format
 msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
 msgstr "sekcja [%2d] \"%s\": nieprawidłowy indeks symbolu w sh_info\n"
 
-#: src/elflint.c:2405
+#: src/elflint.c:2467
 #, c-format
 msgid "section [%2d] '%s': sh_flags not zero\n"
 msgstr "sekcja [%2d] \"%s\": niezerowe sh_flags\n"
 
-#: src/elflint.c:2412
+#: src/elflint.c:2474
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol for signature\n"
 msgstr "sekcja [%2d] \"%s\": nie można uzyskać symbolu dla podpisu\n"
 
-#: src/elflint.c:2417
+#: src/elflint.c:2479
 #, c-format
 msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
 msgstr "sekcja [%2d] \"%s\": symbol podpisu nie można być pustym ciągiem\n"
 
-#: src/elflint.c:2423
+#: src/elflint.c:2485
 #, c-format
 msgid "section [%2d] '%s': sh_flags not set correctly\n"
 msgstr "sekcja [%2d] \"%s\": sh_flags nie ustawione poprawnie\n"
 
-#: src/elflint.c:2429
+#: src/elflint.c:2491
 #, c-format
 msgid "section [%2d] '%s': cannot get data: %s\n"
 msgstr "sekcja [%2d] \"%s\": nie można uzyskać danych: %s\n"
 
-#: src/elflint.c:2438
+#: src/elflint.c:2500
 #, c-format
 msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
 msgstr ""
-"sekcja [%2d] \"%s\": rozmiar sekcji nie jest wielokrotnością sizeof"
-"(Elf32_Word)\n"
+"sekcja [%2d] \"%s\": rozmiar sekcji nie jest wielokrotnością "
+"sizeof(Elf32_Word)\n"
 
-#: src/elflint.c:2443
+#: src/elflint.c:2505
 #, c-format
 msgid "section [%2d] '%s': section group without flags word\n"
 msgstr "sekcja [%2d] \"%s\": grupa sekcji bez słowa flag\n"
 
-#: src/elflint.c:2449
+#: src/elflint.c:2511
 #, c-format
 msgid "section [%2d] '%s': section group without member\n"
 msgstr "sekcja [%2d] \"%s\": grupa sekcji bez elementów\n"
 
-#: src/elflint.c:2453
+#: src/elflint.c:2515
 #, c-format
 msgid "section [%2d] '%s': section group with only one member\n"
 msgstr "sekcja [%2d] \"%s\": grupa sekcji z tylko jednym elementem\n"
 
-#: src/elflint.c:2464
+#: src/elflint.c:2526
 #, c-format
 msgid "section [%2d] '%s': unknown section group flags\n"
 msgstr "sekcja [%2d] \"%s\": nieznane flagi grupy sekcji\n"
 
-#: src/elflint.c:2476
+#: src/elflint.c:2538
 #, c-format
 msgid "section [%2d] '%s': section index %Zu out of range\n"
 msgstr "sekcja [%2d] \"%s\": indeks sekcji %Zu jest spoza zakresu\n"
 
-#: src/elflint.c:2485
+#: src/elflint.c:2547
 #, c-format
 msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
 msgstr ""
 "sekcja [%2d] \"%s\": nie można uzyskać nagłówka sekcji dla elementu %zu: %s\n"
 
-#: src/elflint.c:2492
+#: src/elflint.c:2554
 #, c-format
 msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
 msgstr "sekcja [%2d] \"%s\": grupa sekcji zawiera inną grupę [%2d] \"%s\"\n"
 
-#: src/elflint.c:2498
+#: src/elflint.c:2560
 #, c-format
 msgid ""
 "section [%2d] '%s': element %Zu references section [%2d] '%s' without "
@@ -2171,12 +2242,12 @@ msgstr ""
 "sekcja [%2d] \"%s\": element %Zu odwołuje się do sekcji [%2d] \"%s\" bez "
 "flagi SHF_GROUP\n"
 
-#: src/elflint.c:2505
+#: src/elflint.c:2567
 #, c-format
 msgid "section [%2d] '%s' is contained in more than one section group\n"
 msgstr "sekcja [%2d] \"%s\" jest zawarta w więcej niż jednej grupie sekcji\n"
 
-#: src/elflint.c:2694
+#: src/elflint.c:2756
 #, c-format
 msgid ""
 "section [%2d] '%s' refers in sh_link to section [%2d] '%s' which is no "
@@ -2185,7 +2256,7 @@ msgstr ""
 "sekcja [%2d] \"%s\" odwołuje się w sh_link do sekcji [%2d] \"%s\", która nie "
 "jest tabelą symboli dynamicznych\n"
 
-#: src/elflint.c:2705
+#: src/elflint.c:2768
 #, c-format
 msgid ""
 "section [%2d] '%s' has different number of entries than symbol table [%2d] "
@@ -2194,78 +2265,78 @@ msgstr ""
 "sekcja [%2d] \"%s\" posiada inną liczbę wpisów niż tabela symboli [%2d] \"%s"
 "\"\n"
 
-#: src/elflint.c:2721
+#: src/elflint.c:2784
 #, c-format
 msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
 msgstr "sekcja [%2d] \"%s\": symbol %d: nie można odczytać danych wersji\n"
 
-#: src/elflint.c:2737
+#: src/elflint.c:2800
 #, c-format
 msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
 msgstr "sekcja [%2d] \"%s\": symbol %d: symbol lokalny z zakresem globalnym\n"
 
-#: src/elflint.c:2745
+#: src/elflint.c:2808
 #, c-format
 msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
 msgstr "sekcja [%2d] \"%s\": symbol %d: symbol lokalny z wersją\n"
 
-#: src/elflint.c:2759
+#: src/elflint.c:2822
 #, c-format
 msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
 msgstr "sekcja [%2d] \"%s\": symbol %d: nieprawidłowy indeks wersji %d\n"
 
-#: src/elflint.c:2764
+#: src/elflint.c:2827
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: version index %d is for defined version\n"
 msgstr ""
 "sekcja [%2d] \"%s\": symbol %d: indeks wersji %d jest dla wersji określonej\n"
 
-#: src/elflint.c:2774
+#: src/elflint.c:2837
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: version index %d is for requested version\n"
 msgstr ""
 "sekcja [%2d] \"%s\": symbol %d: indeks wersji %d jest dla wersji żądanej\n"
 
-#: src/elflint.c:2826
+#: src/elflint.c:2889
 #, c-format
 msgid "more than one version reference section present\n"
 msgstr "obecna jest więcej niż jedna sekcja odniesienia wersji\n"
 
-#: src/elflint.c:2834 src/elflint.c:2963
+#: src/elflint.c:2897 src/elflint.c:3026
 #, c-format
 msgid "section [%2d] '%s': sh_link does not link to string table\n"
 msgstr "sekcja [%2d] \"%s\": sh_link nie łączy się z tabelą ciągów\n"
 
-#: src/elflint.c:2857 src/elflint.c:3015
+#: src/elflint.c:2920 src/elflint.c:3078
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong version %d\n"
 msgstr "sekcja [%2d] \"%s\": wpis %d posiada błędną wersję %d\n"
 
-#: src/elflint.c:2863 src/elflint.c:3021
+#: src/elflint.c:2926 src/elflint.c:3084
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
 msgstr ""
 "sekcja [%2d] \"%s\": wpis %d posiada błędny offset dla danych dodatkowych\n"
 
-#: src/elflint.c:2871
+#: src/elflint.c:2934
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid file reference\n"
 msgstr "sekcja [%2d] \"%s\": symbol %d posiada błędne odniesienie do pliku\n"
 
-#: src/elflint.c:2879
+#: src/elflint.c:2942
 #, c-format
 msgid "section [%2d] '%s': entry %d references unknown dependency\n"
 msgstr "sekcja [%2d] \"%s\": wpis %d odnosi się do nieznanej zależności\n"
 
-#: src/elflint.c:2891
+#: src/elflint.c:2954
 #, c-format
 msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
 msgstr ""
 "sekcja [%2d] \"%s\": wpis dodatkowy %d do wpisu %d posiada nieznaną flagę\n"
 
-#: src/elflint.c:2898
+#: src/elflint.c:2961
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
@@ -2274,7 +2345,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": wpis dodatkowy %d do wpisu %d posiada nieprawidłowe "
 "odniesienie do nazwy\n"
 
-#: src/elflint.c:2905
+#: src/elflint.c:2968
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: "
@@ -2283,7 +2354,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": wpis dodatkowy %d do wpisu %d posiada błędną wartość "
 "skrótu: %#x, oczekiwano %#x\n"
 
-#: src/elflint.c:2915
+#: src/elflint.c:2978
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
@@ -2292,7 +2363,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": wpis dodatkowy %d do wpisu %d posiada powtórzoną nazwę "
 "wersji \"%s\"\n"
 
-#: src/elflint.c:2926
+#: src/elflint.c:2989
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
@@ -2300,52 +2371,52 @@ msgstr ""
 "sekcja [%2d] \"%s\": wpis dodatkowy %d do wpisu %d posiada błędne następne "
 "pole\n"
 
-#: src/elflint.c:2942 src/elflint.c:3100
+#: src/elflint.c:3005 src/elflint.c:3163
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
 msgstr ""
 "sekcja [%2d] \"%s\": wpis %d posiada błędny offset do następnego wpisu\n"
 
-#: src/elflint.c:2955
+#: src/elflint.c:3018
 #, c-format
 msgid "more than one version definition section present\n"
 msgstr "obecna jest więcej niż jedna sekcja definicji wersji\n"
 
-#: src/elflint.c:3000
+#: src/elflint.c:3063
 #, c-format
 msgid "section [%2d] '%s': more than one BASE definition\n"
 msgstr "sekcja [%2d] \"%s\": jest więcej niż jedna definicja BASE\n"
 
-#: src/elflint.c:3004
+#: src/elflint.c:3067
 #, c-format
 msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
 msgstr ""
 "sekcja [%2d] \"%s\": definicja BASE musi posiadać indeks VER_NDX_GLOBAL\n"
 
-#: src/elflint.c:3010
+#: src/elflint.c:3073
 #, c-format
 msgid "section [%2d] '%s': entry %d has unknown flag\n"
 msgstr "sekcja [%2d] \"%s\": wpis %d posiada nieznaną flagę\n"
 
-#: src/elflint.c:3034
+#: src/elflint.c:3097
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid name reference\n"
 msgstr ""
 "sekcja [%2d] \"%s\": wpis %d posiada nieprawidłowe odniesienie do nazwy\n"
 
-#: src/elflint.c:3041
+#: src/elflint.c:3104
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
 msgstr ""
 "sekcja [%2d] \"%s\": wpis %d posiada błędną wartość skrótu: %#x, oczekiwano "
 "%#x\n"
 
-#: src/elflint.c:3050
+#: src/elflint.c:3113
 #, c-format
 msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
 msgstr "sekcja [%2d] \"%s\": wpis %d posiada powtórzoną nazwę wersji \"%s\"\n"
 
-#: src/elflint.c:3069
+#: src/elflint.c:3132
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
@@ -2353,52 +2424,52 @@ msgstr ""
 "sekcja [%2d] \"%s\": wpis %d posiada nieprawidłowe odniesienie do nazwy w "
 "danych dodatkowych\n"
 
-#: src/elflint.c:3084
+#: src/elflint.c:3147
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
 msgstr ""
 "sekcja [%2d] \"%s\": wpis %d posiada błędne następne pole w danych "
 "dodatkowych\n"
 
-#: src/elflint.c:3106
+#: src/elflint.c:3169
 #, c-format
 msgid "section [%2d] '%s': no BASE definition\n"
 msgstr "sekcja [%2d] \"%s\": brak definicji BASE\n"
 
-#: src/elflint.c:3122
+#: src/elflint.c:3185
 #, c-format
 msgid "section [%2d] '%s': unknown parent version '%s'\n"
 msgstr "sekcja [%2d] \"%s\": nieznana wersja rodzica \"%s\"\n"
 
-#: src/elflint.c:3135
+#: src/elflint.c:3198
 #, c-format
 msgid "section [%2d] '%s': empty object attributes section\n"
 msgstr "sekcja [%2d] \"%s\": pusta sekcja atrybutów obiektu\n"
 
-#: src/elflint.c:3156
+#: src/elflint.c:3219
 #, c-format
 msgid "section [%2d] '%s': unrecognized attribute format\n"
 msgstr "sekcja [%2d] \"%s\": nierozpoznany format atrybutu\n"
 
-#: src/elflint.c:3172
+#: src/elflint.c:3235
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
 msgstr ""
 "sekcja [%2d] \"%s\": offset %zu: pole o zerowej długości w sekcji atrybutów\n"
 
-#: src/elflint.c:3181
+#: src/elflint.c:3244
 #, c-format
 msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
 msgstr ""
 "sekcja [%2d] \"%s\": offset %zu: nieprawidłowa długość w sekcji atrybutów\n"
 
-#: src/elflint.c:3193
+#: src/elflint.c:3256
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
 msgstr "sekcja [%2d] \"%s\": offset %zu: niezakończony ciąg nazwy producenta\n"
 
-#: src/elflint.c:3210
+#: src/elflint.c:3273
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
@@ -2406,12 +2477,12 @@ msgstr ""
 "sekcja [%2d] \"%s\": offset %zu: niekończące się ULEB128 w znaczniku "
 "podsekcji atrybutów\n"
 
-#: src/elflint.c:3219
+#: src/elflint.c:3282
 #, c-format
 msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
 msgstr "sekcja [%2d] \"%s\": offset %zu: skrócona sekcja atrybutów\n"
 
-#: src/elflint.c:3228
+#: src/elflint.c:3291
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
@@ -2419,7 +2490,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": offset %zu: zerowej długości pole w podsekcji "
 "atrybutów\n"
 
-#: src/elflint.c:3241
+#: src/elflint.c:3304
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
@@ -2427,7 +2498,7 @@ msgstr ""
 "sekcja [%2d] \"%s\": offset %zu: nieprawidłowa długość w podsekcji "
 "atrybutów\n"
 
-#: src/elflint.c:3252
+#: src/elflint.c:3315
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
@@ -2435,24 +2506,24 @@ msgstr ""
 "sekcja [%2d] \"%s\": offset %zu: podsekcja atrybutów posiada nieoczekiwany "
 "znacznik %u\n"
 
-#: src/elflint.c:3270
+#: src/elflint.c:3333
 #, c-format
 msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
 msgstr ""
 "sekcja [%2d] \"%s\": offset %zu: niekończące się ULEB128 w znaczniku "
 "atrybutu\n"
 
-#: src/elflint.c:3281
+#: src/elflint.c:3344
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
 msgstr "sekcja [%2d] \"%s\": offset %zu: niezakończony ciąg w atrybucie\n"
 
-#: src/elflint.c:3294
+#: src/elflint.c:3357
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
 msgstr "sekcja [%2d] \"%s\": offset %zu: nierozpoznany znacznik atrybutu %u\n"
 
-#: src/elflint.c:3298
+#: src/elflint.c:3361
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
@@ -2460,12 +2531,12 @@ msgstr ""
 "sekcja [%2d] \"%s\": offset %zu: atrybut %s posiada nierozpoznaną wartość "
 "%<PRIu64>\n"
 
-#: src/elflint.c:3308
+#: src/elflint.c:3371
 #, c-format
 msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
 msgstr "sekcja [%2d] \"%s\": offset %zu: producent \"%s\" jest nieznany\n"
 
-#: src/elflint.c:3314
+#: src/elflint.c:3377
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
@@ -2473,47 +2544,47 @@ msgstr ""
 "sekcja [%2d] \"%s\": offset %zu: dodatkowe bajty po ostatniej sekcji "
 "atrybutów\n"
 
-#: src/elflint.c:3403
+#: src/elflint.c:3466
 #, c-format
 msgid "cannot get section header of zeroth section\n"
 msgstr "nie można uzyskać nagłówka sekcji zerowej\n"
 
-#: src/elflint.c:3407
+#: src/elflint.c:3470
 #, c-format
 msgid "zeroth section has nonzero name\n"
 msgstr "sekcja zerowa posiada niezerową nazwę\n"
 
-#: src/elflint.c:3409
+#: src/elflint.c:3472
 #, c-format
 msgid "zeroth section has nonzero type\n"
 msgstr "sekcja zerowa posiada niezerowy typ\n"
 
-#: src/elflint.c:3411
+#: src/elflint.c:3474
 #, c-format
 msgid "zeroth section has nonzero flags\n"
 msgstr "sekcja zerowa posiada niezerowe flagi\n"
 
-#: src/elflint.c:3413
+#: src/elflint.c:3476
 #, c-format
 msgid "zeroth section has nonzero address\n"
 msgstr "sekcja zerowa posiada niezerowy adres\n"
 
-#: src/elflint.c:3415
+#: src/elflint.c:3478
 #, c-format
 msgid "zeroth section has nonzero offset\n"
 msgstr "sekcja zerowa posiada niezerowy offset\n"
 
-#: src/elflint.c:3417
+#: src/elflint.c:3480
 #, c-format
 msgid "zeroth section has nonzero align value\n"
 msgstr "sekcja zerowa posiada niezerową wartość wyrównania\n"
 
-#: src/elflint.c:3419
+#: src/elflint.c:3482
 #, c-format
 msgid "zeroth section has nonzero entry size value\n"
 msgstr "sekcja zerowa posiada niezerową wartość rozmiaru wpisu\n"
 
-#: src/elflint.c:3422
+#: src/elflint.c:3485
 #, c-format
 msgid ""
 "zeroth section has nonzero size value while ELF header has nonzero shnum "
@@ -2522,7 +2593,7 @@ msgstr ""
 "sekcja zerowa posiada niezerową wartość rozmiaru, a nagłówek ELF posiada "
 "niezerową wartość shnum\n"
 
-#: src/elflint.c:3426
+#: src/elflint.c:3489
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
@@ -2531,7 +2602,7 @@ msgstr ""
 "sekcja zerowa posiada niezerową wartość dowiązań, a nagłówek ELF nie "
 "wskazuje przepełnienia w shstrndx\n"
 
-#: src/elflint.c:3430
+#: src/elflint.c:3493
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
@@ -2540,27 +2611,27 @@ msgstr ""
 "sekcja zerowa posiada niezerową wartość dowiązań, a nagłówek ELF nie "
 "wskazuje przepełnienia w phnum\n"
 
-#: src/elflint.c:3447
+#: src/elflint.c:3510
 #, c-format
 msgid "cannot get section header for section [%2zu] '%s': %s\n"
 msgstr "nie można uzyskać nagłówka sekcji dla sekcji [%2zu] \"%s\": %s\n"
 
-#: src/elflint.c:3456
+#: src/elflint.c:3519
 #, c-format
 msgid "section [%2zu]: invalid name\n"
 msgstr "sekcja [%2zu]: nieprawidłowa nazwa\n"
 
-#: src/elflint.c:3483
+#: src/elflint.c:3546
 #, c-format
 msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
 msgstr "sekcja [%2d] \"%s\" posiada błędny typ: oczekiwano %s, jest %s\n"
 
-#: src/elflint.c:3499
+#: src/elflint.c:3562
 #, c-format
 msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
 msgstr "sekcja [%2zu] \"%s\" posiada błędne flagi: oczekiwano %s, jest %s\n"
 
-#: src/elflint.c:3516
+#: src/elflint.c:3579
 #, c-format
 msgid ""
 "section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
@@ -2568,12 +2639,12 @@ msgstr ""
 "sekcja [%2zu] \"%s\" posiada błędne flagi: oczekiwano %s i być może %s, jest "
 "%s\n"
 
-#: src/elflint.c:3534
+#: src/elflint.c:3597
 #, c-format
 msgid "section [%2zu] '%s' present in object file\n"
 msgstr "sekcja [%2zu] \"%s\" jest obecna w pliku obiektu\n"
 
-#: src/elflint.c:3540 src/elflint.c:3572
+#: src/elflint.c:3603 src/elflint.c:3635
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
@@ -2581,7 +2652,7 @@ msgstr ""
 "sekcja [%2zu] \"%s\" posiada flagę SHF_ALLOC, ale nie posiada segmentu "
 "wczytywalnego\n"
 
-#: src/elflint.c:3545 src/elflint.c:3577
+#: src/elflint.c:3608 src/elflint.c:3640
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
@@ -2590,7 +2661,7 @@ msgstr ""
 "sekcja [%2zu] \"%s\" nie posiada flagi SHF_ALLOC, ale są segmenty "
 "wczytywalne\n"
 
-#: src/elflint.c:3553
+#: src/elflint.c:3616
 #, c-format
 msgid ""
 "section [%2zu] '%s' is extension section index table in non-object file\n"
@@ -2598,23 +2669,23 @@ msgstr ""
 "sekcja [%2zu] \"%s\" jest tabelą indeksów sekcji rozszerzeń w pliku "
 "nieobiektowym\n"
 
-#: src/elflint.c:3596
+#: src/elflint.c:3659
 #, c-format
 msgid "section [%2zu] '%s': size not multiple of entry size\n"
 msgstr ""
 "sekcja [%2zu] \"%s\": rozmiar nie jest wielokrotnością rozmiaru wpisu\n"
 
-#: src/elflint.c:3601
+#: src/elflint.c:3664
 #, c-format
 msgid "cannot get section header\n"
 msgstr "nie można uzyskać nagłówka sekcji\n"
 
-#: src/elflint.c:3611
+#: src/elflint.c:3674
 #, c-format
 msgid "section [%2zu] '%s' has unsupported type %d\n"
 msgstr "sekcja [%2zu] \"%s\" posiada nieobsługiwany typ %d\n"
 
-#: src/elflint.c:3625
+#: src/elflint.c:3688
 #, c-format
 msgid ""
 "section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
@@ -2622,56 +2693,56 @@ msgstr ""
 "sekcja [%2zu] \"%s\" zawiera nieprawidłowe flagi specyficzne dla procesora "
 "%#<PRIx64>\n"
 
-#: src/elflint.c:3632
+#: src/elflint.c:3695
 #, c-format
 msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
 msgstr "sekcja [%2zu] \"%s\" zawiera nieznane flagi %#<PRIx64>\n"
 
-#: src/elflint.c:3640
+#: src/elflint.c:3703
 #, c-format
 msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
 msgstr ""
 "sekcja [%2zu] \"%s\": adres sekcji danych lokalnych dla wątków nie jest "
 "zerem\n"
 
-#: src/elflint.c:3648
+#: src/elflint.c:3711
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in link value\n"
 msgstr ""
 "sekcja [%2zu] \"%s\": nieprawidłowe odwołanie do sekcji w wartości "
 "dowiązania\n"
 
-#: src/elflint.c:3653
+#: src/elflint.c:3716
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in info value\n"
 msgstr ""
 "sekcja [%2zu] \"%s\": nieprawidłowe odwołanie do sekcji w wartości "
 "informacyjnej\n"
 
-#: src/elflint.c:3660
+#: src/elflint.c:3723
 #, c-format
 msgid "section [%2zu] '%s': strings flag set without merge flag\n"
 msgstr "sekcja [%2zu] \"%s\": flaga ciągów jest ustawiona bez flagi merge\n"
 
-#: src/elflint.c:3665
+#: src/elflint.c:3728
 #, c-format
 msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
 msgstr ""
 "sekcja [%2zu] \"%s\": flaga merge jest ustawiona, ale rozmiar wpisu jest "
 "zerowy\n"
 
-#: src/elflint.c:3683
+#: src/elflint.c:3746
 #, c-format
 msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
 msgstr ""
 "sekcja [%2zu] \"%s\" posiada nieoczekiwany typ %d dla sekcji wykonywalnej\n"
 
-#: src/elflint.c:3692
+#: src/elflint.c:3755
 #, c-format
 msgid "section [%2zu] '%s' is both executable and writable\n"
 msgstr "sekcja [%2zu] \"%s\" jest wykonywalne i zapisywalne\n"
 
-#: src/elflint.c:3721
+#: src/elflint.c:3784
 #, c-format
 msgid ""
 "section [%2zu] '%s' not fully contained in segment of program header entry "
@@ -2680,7 +2751,7 @@ msgstr ""
 "sekcja [%2zu] \"%s\" nie jest w całości zawarta w segmencie wpisu %d "
 "nagłówka programu\n"
 
-#: src/elflint.c:3729
+#: src/elflint.c:3792
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
@@ -2689,7 +2760,7 @@ msgstr ""
 "sekcja [%2zu] \"%s\" posiada typ NOBITS, a jest odczytywana z pliku w "
 "segmencie wpisu %d nagłówka programu\n"
 
-#: src/elflint.c:3738
+#: src/elflint.c:3801
 #, c-format
 msgid ""
 "section [%2zu] '%s' has not type NOBITS but is not read from the file in "
@@ -2698,17 +2769,17 @@ msgstr ""
 "sekcja [%2zu] \"%s\" nie posiada typu NOBITS, a nie jest odczytywana z pliku "
 "w segmencie wpisu %d nagłówka programu\n"
 
-#: src/elflint.c:3749
+#: src/elflint.c:3812
 #, c-format
 msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
 msgstr "sekcja [%2zu] \"%s\" jest wykonywalne w segmencie niewykonywalnym %d\n"
 
-#: src/elflint.c:3759
+#: src/elflint.c:3822
 #, c-format
 msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
 msgstr "sekcja [%2zu] \"%s\" jest zapisywalne w niezapisywalnym segmencie %d\n"
 
-#: src/elflint.c:3769
+#: src/elflint.c:3832
 #, c-format
 msgid ""
 "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
@@ -2716,7 +2787,7 @@ msgstr ""
 "sekcja [%2zu] \"%s\": posiada flagę alloc, ale sekcja nie jest w żadnym "
 "segmencie wczytywalnym\n"
 
-#: src/elflint.c:3775
+#: src/elflint.c:3838
 #, c-format
 msgid ""
 "section [%2zu] '%s': ELF header says this is the section header string table "
@@ -2725,7 +2796,7 @@ msgstr ""
 "sekcja [%2zu] \"%s\": według nagłówka ELF to jest tabela ciągów nagłówków "
 "sekcji, ale typ nie jest SHT_TYPE\n"
 
-#: src/elflint.c:3783
+#: src/elflint.c:3846
 #, c-format
 msgid ""
 "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
@@ -2733,17 +2804,17 @@ msgstr ""
 "sekcja [%2zu] \"%s\": pliki relokowalne nie mogą posiadać tabeli symboli "
 "dynamicznych\n"
 
-#: src/elflint.c:3834
+#: src/elflint.c:3897
 #, c-format
 msgid "more than one version symbol table present\n"
 msgstr "obecna jest więcej niż jedna tabela symboli wersji\n"
 
-#: src/elflint.c:3857
+#: src/elflint.c:3920
 #, c-format
 msgid "INTERP program header entry but no .interp section\n"
 msgstr "jest wpis nagłówka programu INTERP, ale nie posiada sekcji .interp\n"
 
-#: src/elflint.c:3868
+#: src/elflint.c:3931
 #, c-format
 msgid ""
 "loadable segment [%u] is executable but contains no executable sections\n"
@@ -2751,14 +2822,14 @@ msgstr ""
 "wczytywalny segment [%u] jest wykonywalny, ale nie zawiera wykonywalnych "
 "sekcji\n"
 
-#: src/elflint.c:3874
+#: src/elflint.c:3937
 #, c-format
 msgid "loadable segment [%u] is writable but contains no writable sections\n"
 msgstr ""
 "wczytywalny segment [%u] jest zapisywalny, ale nie zawiera zapisywalnych "
 "sekcji\n"
 
-#: src/elflint.c:3885
+#: src/elflint.c:3948
 #, c-format
 msgid ""
 "no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
@@ -2767,23 +2838,23 @@ msgstr ""
 "brak sekcji .gnu.versym, ale istnieje sekcja .gnu.versym_d lub .gnu."
 "versym_r\n"
 
-#: src/elflint.c:3898
+#: src/elflint.c:3961
 #, c-format
 msgid "duplicate version index %d\n"
 msgstr "powtórzony indeks wersji %d\n"
 
-#: src/elflint.c:3912
+#: src/elflint.c:3975
 #, c-format
 msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
 msgstr "sekcja .gnu.versym istnieje bez .gnu.versym_d lub .gnu.versym_r\n"
 
-#: src/elflint.c:3961
+#: src/elflint.c:4024
 #, c-format
 msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
 msgstr ""
 "phdr[%d]: nieznany typ notatki pliku core %<PRIu32> pod offsetem %<PRIu64>\n"
 
-#: src/elflint.c:3965
+#: src/elflint.c:4028
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
@@ -2791,13 +2862,13 @@ msgstr ""
 "phdr[%2d]: \"%s\": nieznany typ notatki pliku core %<PRIu32> pod offsetem "
 "%Zu\n"
 
-#: src/elflint.c:3988
+#: src/elflint.c:4051
 #, c-format
 msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
 msgstr ""
 "phdr[%d]: nieznany typ notatki pliku obiektu %<PRIu32> pod offsetem %Zu\n"
 
-#: src/elflint.c:3992
+#: src/elflint.c:4055
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
@@ -2805,37 +2876,37 @@ msgstr ""
 "phdr[%d]: \"%s\": nieznany typ notatki pliku obiektu %<PRIu32> pod offsetem "
 "%Zu\n"
 
-#: src/elflint.c:4009
+#: src/elflint.c:4072
 #, c-format
 msgid "phdr[%d]: no note entries defined for the type of file\n"
 msgstr "phdr[%d]: brak określonych wpisów notatek dla typu pliku\n"
 
-#: src/elflint.c:4028
+#: src/elflint.c:4091
 #, c-format
 msgid "phdr[%d]: cannot get content of note section: %s\n"
 msgstr "phdr[%d]: nie można uzyskać zawartości sekcji notatki: %s\n"
 
-#: src/elflint.c:4031
+#: src/elflint.c:4094
 #, c-format
 msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
 msgstr "phdr[%d]: dodatkowe %<PRIu64> bajtów po ostatniej notatce\n"
 
-#: src/elflint.c:4052
+#: src/elflint.c:4115
 #, c-format
 msgid "section [%2d] '%s': no note entries defined for the type of file\n"
 msgstr "sekcja [%2d] \"%s\": brak określonych wpisów notatek dla typu pliku\n"
 
-#: src/elflint.c:4059
+#: src/elflint.c:4122
 #, c-format
 msgid "section [%2d] '%s': cannot get content of note section\n"
 msgstr "sekcja [%2d] \"%s\": nie można uzyskać zawartości sekcji notatek\n"
 
-#: src/elflint.c:4062
+#: src/elflint.c:4125
 #, c-format
 msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
 msgstr "sekcja [%2d] \"%s\": dodatkowe %<PRIu64> bajtów po ostatniej notatce\n"
 
-#: src/elflint.c:4080
+#: src/elflint.c:4143
 #, c-format
 msgid ""
 "only executables, shared objects, and core files can have program headers\n"
@@ -2843,129 +2914,129 @@ msgstr ""
 "tylko pliki wykonywalne, obiekty współdzielone i pliki core mogą posiadać "
 "nagłówki programu\n"
 
-#: src/elflint.c:4095
+#: src/elflint.c:4158
 #, c-format
 msgid "cannot get program header entry %d: %s\n"
 msgstr "nie można uzyskać wpisu nagłówka programu %d: %s\n"
 
-#: src/elflint.c:4104
+#: src/elflint.c:4167
 #, c-format
 msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
 msgstr ""
 "wpis nagłówka programu %d: nieznany typ wpisu nagłówka programu %#<PRIx64>\n"
 
-#: src/elflint.c:4115
+#: src/elflint.c:4178
 #, c-format
 msgid "more than one INTERP entry in program header\n"
 msgstr "więcej niż jeden wpis INTERP w nagłówku programu\n"
 
-#: src/elflint.c:4123
+#: src/elflint.c:4186
 #, c-format
 msgid "more than one TLS entry in program header\n"
 msgstr "więcej niż jeden wpis TLS w nagłówku programu\n"
 
-#: src/elflint.c:4130
+#: src/elflint.c:4193
 #, c-format
 msgid "static executable cannot have dynamic sections\n"
 msgstr "statyczny plik wykonywalny nie może posiadać sekcji dynamicznych\n"
 
-#: src/elflint.c:4144
+#: src/elflint.c:4207
 #, c-format
 msgid "dynamic section reference in program header has wrong offset\n"
 msgstr ""
 "odniesienie sekcji dynamicznej w nagłówku programu posiada błędny offset\n"
 
-#: src/elflint.c:4147
+#: src/elflint.c:4210
 #, c-format
 msgid "dynamic section size mismatch in program and section header\n"
 msgstr "różne rozmiary sekcji dynamicznej w nagłówku programu i sekcji\n"
 
-#: src/elflint.c:4157
+#: src/elflint.c:4220
 #, c-format
 msgid "more than one GNU_RELRO entry in program header\n"
 msgstr "więcej niż jeden wpis GNU_RELRO w nagłówku programu\n"
 
-#: src/elflint.c:4178
+#: src/elflint.c:4241
 #, c-format
 msgid "loadable segment GNU_RELRO applies to is not writable\n"
 msgstr "wczytywalny segment wskazywany przez GNU_RELRO nie jest zapisywalny\n"
 
-#: src/elflint.c:4181
+#: src/elflint.c:4244
 #, c-format
 msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
 msgstr "flagi wczytywalnego segmentu [%u] nie pasują do flag GNU_RELRO [%u]\n"
 
-#: src/elflint.c:4189 src/elflint.c:4212
+#: src/elflint.c:4252 src/elflint.c:4275
 #, c-format
 msgid "%s segment not contained in a loaded segment\n"
 msgstr "segment %s nie zawiera się we wczytywalnym segmencie\n"
 
-#: src/elflint.c:4218
+#: src/elflint.c:4281
 #, c-format
 msgid "program header offset in ELF header and PHDR entry do not match"
 msgstr ""
 "offsety nagłówka programu w nagłówku ELF i wpisie PHDR nie zgadzają się"
 
-#: src/elflint.c:4242
+#: src/elflint.c:4305
 #, c-format
 msgid "call frame search table reference in program header has wrong offset\n"
 msgstr ""
 "odniesienie tabeli wyszukiwania ramki wywołania w nagłówku programu posiada "
 "błędny offset\n"
 
-#: src/elflint.c:4245
+#: src/elflint.c:4308
 #, c-format
 msgid "call frame search table size mismatch in program and section header\n"
 msgstr ""
 "różne rozmiary tabel wyszukiwania ramki wywołania w nagłówku programu i "
 "sekcji\n"
 
-#: src/elflint.c:4258
+#: src/elflint.c:4321
 #, c-format
 msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
 msgstr "PT_GNU_EH_FRAME jest obecne, ale brak sekcji .eh_frame_hdr\n"
 
-#: src/elflint.c:4266
+#: src/elflint.c:4329
 #, c-format
 msgid "call frame search table must be allocated\n"
 msgstr "tabela wyszukiwania ramki wywołania musi być przydzielona\n"
 
-#: src/elflint.c:4269
+#: src/elflint.c:4332
 #, c-format
 msgid "section [%2zu] '%s' must be allocated\n"
 msgstr "sekcja [%2zu] \"%s\": musi być przydzielona\n"
 
-#: src/elflint.c:4273
+#: src/elflint.c:4336
 #, c-format
 msgid "call frame search table must not be writable\n"
 msgstr "tabela wyszukiwania ramki wywołania nie może być zapisywalna\n"
 
-#: src/elflint.c:4276
+#: src/elflint.c:4339
 #, c-format
 msgid "section [%2zu] '%s' must not be writable\n"
 msgstr "sekcja [%2zu] \"%s\" nie może być zapisywalna\n"
 
-#: src/elflint.c:4281
+#: src/elflint.c:4344
 #, c-format
 msgid "call frame search table must not be executable\n"
 msgstr "tabela wyszukiwania ramki wywołania nie może być wykonywalna\n"
 
-#: src/elflint.c:4284
+#: src/elflint.c:4347
 #, c-format
 msgid "section [%2zu] '%s' must not be executable\n"
 msgstr "sekcja [%2zu] \"%s\" nie może być wykonywalna\n"
 
-#: src/elflint.c:4295
+#: src/elflint.c:4358
 #, c-format
 msgid "program header entry %d: file size greater than memory size\n"
 msgstr "wpis nagłówka programu %d: rozmiar pliku większy niż rozmiar pamięci\n"
 
-#: src/elflint.c:4302
+#: src/elflint.c:4365
 #, c-format
 msgid "program header entry %d: alignment not a power of 2\n"
 msgstr "wpis nagłówka programu %d: wyrównanie nie jest potęgą 2\n"
 
-#: src/elflint.c:4305
+#: src/elflint.c:4368
 #, c-format
 msgid ""
 "program header entry %d: file offset and virtual address not module of "
@@ -2974,7 +3045,7 @@ msgstr ""
 "wpis nagłówka programu %d: offset w pliku i adres wirtualny nie są "
 "wielokrotnością wyrównania\n"
 
-#: src/elflint.c:4318
+#: src/elflint.c:4381
 #, c-format
 msgid ""
 "executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
@@ -2983,12 +3054,12 @@ msgstr ""
 "plik wykonywalny/DSO z sekcją .eh_frame_hdr nie posiada wpisu nagłówka "
 "programu PT_GNU_EH_FRAME"
 
-#: src/elflint.c:4352
+#: src/elflint.c:4415
 #, c-format
 msgid "cannot read ELF header: %s\n"
 msgstr "nie można odczytać nagłówka ELF: %s\n"
 
-#: src/elflint.c:4378
+#: src/elflint.c:4441
 #, c-format
 msgid "text relocation flag set but not needed\n"
 msgstr "flaga relokacji tekstu jest ustawiona, ale niepotrzebna\n"
@@ -3321,7 +3392,7 @@ msgstr "Ustawia styl sum kontrolnych na sysv, gnu lub oba."
 
 #: src/ld.c:167
 msgid "Generate build ID note (md5, sha1 (default), uuid)."
-msgstr "Tworzy wpis identyfikatora budowania (md5, sha1 (domyślnie), uuid)."
+msgstr "Tworzy wpis identyfikatora kopii (md5, sha1 (domyślnie), uuid)."
 
 #: src/ld.c:169
 msgid "Linker Operation Control:"
@@ -3508,7 +3579,8 @@ msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
 msgstr ""
 "Ostrzeżenie: rozmiar \"%s\" zmienił się z %<PRIu64> w %s na %<PRIu64> w %s"
 
-#: src/ldgeneric.c:651 src/ldgeneric.c:1112 src/readelf.c:640 src/strip.c:562
+#: src/ldgeneric.c:651 src/ldgeneric.c:1112 src/readelf.c:527
+#: src/readelf.c:829 src/strip.c:563
 #, c-format
 msgid "cannot determine number of sections: %s"
 msgstr "nie można określić liczby sekcji: %s"
@@ -3672,7 +3744,7 @@ msgstr "nie można utworzyć sekcji tabeli mieszającej dla pliku wyjściowego:
 #: src/ldgeneric.c:4104
 #, c-format
 msgid "cannot create build ID section: %s"
-msgstr "nie można utworzyć sekcji identyfikatora budowania: %s"
+msgstr "nie można utworzyć sekcji identyfikatora kopii: %s"
 
 #: src/ldgeneric.c:4181
 #, c-format
@@ -3747,7 +3819,7 @@ msgstr "błąd wewnętrzny: sekcja nie będąca nobits po sekcji nobits"
 msgid "cannot get header of 0th section: %s"
 msgstr "nie można uzyskać nagłówka zerowej sekcji: %s"
 
-#: src/ldgeneric.c:6930 src/unstrip.c:1810
+#: src/ldgeneric.c:6930 src/unstrip.c:1818
 #, c-format
 msgid "cannot update ELF header: %s"
 msgstr "nie można zaktualizować nagłówka ELF: %s"
@@ -3876,9 +3948,8 @@ msgid "Use RADIX for printing symbol values"
 msgstr "Używa BAZY do wypisywania wartości symboli"
 
 #: src/nm.c:87
-#, fuzzy
 msgid "Mark special symbols"
-msgstr "Oznacza słabe symbole"
+msgstr "Oznacza specjalne symbole"
 
 #: src/nm.c:89
 msgid "Print size of defined symbols"
@@ -3902,16 +3973,15 @@ msgstr "Odwraca kierunek porządkowania"
 
 #: src/nm.c:98
 msgid "Decode low-level symbol names into source code names"
-msgstr ""
+msgstr "Dekoduje niskopoziomowe nazwy symboli na nazwy kodu źródłowego"
 
 #: src/nm.c:105
 msgid "List symbols from FILEs (a.out by default)."
 msgstr "Wyświetla listę symboli z PLIKU (domyślnie a.out)."
 
 #: src/nm.c:116 src/objdump.c:80
-#, fuzzy
 msgid "Output formatting"
-msgstr "Format wyjścia:"
+msgstr "Formatowanie wyjścia"
 
 #: src/nm.c:140 src/objdump.c:104 src/size.c:109 src/strip.c:120
 #, c-format
@@ -3919,7 +3989,7 @@ msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
 msgstr "%s: BŁĄD WEWNĘTRZNY %d (%s-%s): %s"
 
 #: src/nm.c:398 src/nm.c:410 src/size.c:309 src/size.c:318 src/size.c:329
-#: src/strip.c:2124
+#: src/strip.c:2155
 #, c-format
 msgid "while closing '%s'"
 msgstr "podczas zamykania \"%s\""
@@ -3930,13 +4000,12 @@ msgid "%s: File format not recognized"
 msgstr "%s: nie rozpoznano formatu pliku"
 
 #: src/nm.c:460
-#, fuzzy
 msgid ""
 "\n"
 "Archive index:\n"
 msgstr ""
 "\n"
-"Indeks archiwum:"
+"Indeks archiwum:\n"
 
 #: src/nm.c:469
 #, c-format
@@ -3963,17 +4032,17 @@ msgstr "%s%s%s: nie rozpoznano formatu pliku"
 msgid "cannot create search tree"
 msgstr "nie można utworzyć drzewa wyszukiwania"
 
-#: src/nm.c:757 src/nm.c:1156 src/objdump.c:787 src/readelf.c:896
-#: src/readelf.c:1039 src/readelf.c:1187 src/readelf.c:1369 src/readelf.c:1569
-#: src/readelf.c:1755 src/readelf.c:1965 src/readelf.c:2219 src/readelf.c:2285
-#: src/readelf.c:2363 src/readelf.c:2861 src/readelf.c:2897 src/readelf.c:2959
-#: src/readelf.c:7270 src/readelf.c:8176 src/readelf.c:8323 src/readelf.c:8391
-#: src/size.c:417 src/size.c:491 src/strip.c:502
+#: src/nm.c:757 src/nm.c:1163 src/objdump.c:787 src/readelf.c:536
+#: src/readelf.c:1085 src/readelf.c:1245 src/readelf.c:1393 src/readelf.c:1579
+#: src/readelf.c:1785 src/readelf.c:1972 src/readelf.c:2196 src/readelf.c:2454
+#: src/readelf.c:2524 src/readelf.c:2606 src/readelf.c:3117 src/readelf.c:3153
+#: src/readelf.c:3216 src/readelf.c:7920 src/readelf.c:9002 src/readelf.c:9149
+#: src/readelf.c:9217 src/size.c:417 src/size.c:487 src/strip.c:503
 #, c-format
 msgid "cannot get section header string table index"
 msgstr "nie można uzyskać indeksu tabeli ciągów nagłówków sekcji"
 
-#: src/nm.c:782
+#: src/nm.c:784
 #, c-format
 msgid ""
 "\n"
@@ -3986,7 +4055,7 @@ msgstr ""
 "Symbole z %s:\n"
 "\n"
 
-#: src/nm.c:785
+#: src/nm.c:787
 #, c-format
 msgid ""
 "%*s%-*s %-*s Class  Type     %-*s %*s Section\n"
@@ -3995,22 +4064,22 @@ msgstr ""
 "%*s%-*s %-*s Klasa  Typ      %-*s %*s Sekcja\n"
 "\n"
 
-#: src/nm.c:1166
+#: src/nm.c:1173
 #, c-format
 msgid "%s: entry size in section `%s' is not what we expect"
 msgstr "%s: rozmiar wpisu w sekcji \"%s\" nie jest tym, czego oczekiwano"
 
-#: src/nm.c:1170
+#: src/nm.c:1177
 #, c-format
 msgid "%s: size of section `%s' is not multiple of entry size"
 msgstr "%s: rozmiar sekcji \"%s\" nie jest wielokrotnością rozmiaru wpisu"
 
-#: src/nm.c:1428
+#: src/nm.c:1435
 #, c-format
 msgid "%s%s%s%s: Invalid operation"
 msgstr "%s%s%s%s: nieprawidłowe działanie"
 
-#: src/nm.c:1485
+#: src/nm.c:1492
 #, c-format
 msgid "%s%s%s: no symbols"
 msgstr "%s%s%s: brak symboli"
@@ -4032,9 +4101,8 @@ msgid "Display assembler code of executable sections"
 msgstr "Wyświetla kod asemblera sekcji wykonywalnych"
 
 #: src/objdump.c:60
-#, fuzzy
 msgid "Output content selection:"
-msgstr "Wybór opcji wyjścia:"
+msgstr "Wybór zawartości wyjścia:"
 
 #: src/objdump.c:62
 msgid "Only display information for section NAME."
@@ -4044,7 +4112,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:236 src/readelf.c:439
+#: src/objdump.c:236 src/readelf.c:473
 msgid "No operation specified.\n"
 msgstr "Nie podano działania.\n"
 
@@ -4053,11 +4121,11 @@ msgstr "Nie podano działania.\n"
 msgid "while close `%s'"
 msgstr "podczas zamykania \"%s\""
 
-#: src/objdump.c:379 src/readelf.c:1664 src/readelf.c:1838
+#: src/objdump.c:379 src/readelf.c:1880 src/readelf.c:2069
 msgid "INVALID SYMBOL"
 msgstr "NIEPRAWIDŁOWY SYMBOL"
 
-#: src/objdump.c:394 src/readelf.c:1695 src/readelf.c:1871
+#: src/objdump.c:394 src/readelf.c:1911 src/readelf.c:2102
 msgid "INVALID SECTION"
 msgstr "NIEPRAWIDŁOWA SEKCJA"
 
@@ -4087,9 +4155,9 @@ msgid "cannot disassemble"
 msgstr "nie można deasemblować"
 
 #: src/objdump.c:736
-#, fuzzy, c-format
+#, c-format
 msgid "cannot allocate memory"
-msgstr "nie można przydzielić sekcji PLT: %s"
+msgstr "nie można przydzielić pamięci"
 
 #: src/ranlib.c:66
 msgid "Generate an index to speed access to archives."
@@ -4114,181 +4182,243 @@ 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:67
+#: src/readelf.c:71
+#, fuzzy
+msgid "ELF input selection:"
+msgstr "Wybór wyjścia ELF:"
+
+#: src/readelf.c:73
+msgid ""
+"Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data"
+msgstr ""
+
+#: src/readelf.c:75
 msgid "ELF output selection:"
 msgstr "Wybór wyjścia ELF:"
 
-#: src/readelf.c:69
+#: src/readelf.c:77
 msgid "All these plus -p .strtab -p .dynstr -p .comment"
 msgstr "Wszystkie te plus -p .strtab -p .dynstr -p .comment"
 
-#: src/readelf.c:70
+#: src/readelf.c:78
 msgid "Display the dynamic segment"
 msgstr "Wyświetla segment dynamiczny"
 
-#: src/readelf.c:71
+#: src/readelf.c:79
 msgid "Display the ELF file header"
 msgstr "Wyświetla nagłówek pliku ELF"
 
-#: src/readelf.c:73
+#: src/readelf.c:81
 msgid "Display histogram of bucket list lengths"
 msgstr "Wyświetla histogram długości list kubełków"
 
-#: src/readelf.c:74
+#: src/readelf.c:82
 msgid "Display the program headers"
 msgstr "Wyświetla nagłówki programu"
 
-#: src/readelf.c:76
+#: src/readelf.c:84
 msgid "Display relocations"
 msgstr "Wyświetla relokacje"
 
-#: src/readelf.c:77
+#: src/readelf.c:85
 msgid "Display the sections' headers"
 msgstr "Wyświetla nagłówków sekcji"
 
-#: src/readelf.c:79
+#: src/readelf.c:87
 msgid "Display the symbol table"
 msgstr "Wyświetla tabelę symboli"
 
-#: src/readelf.c:80
+#: src/readelf.c:88
 msgid "Display versioning information"
 msgstr "Wyświetla informacje o wersjonowaniu"
 
-#: src/readelf.c:81
+#: src/readelf.c:89
 msgid "Display the ELF notes"
 msgstr "Wyświetla notatki ELF"
 
-#: src/readelf.c:83
+#: src/readelf.c:91
 msgid "Display architecture specific information, if any"
 msgstr "Wyświetla informacje specyficzne dla architektury, jeśli są"
 
-#: src/readelf.c:85
+#: src/readelf.c:93
 msgid "Display sections for exception handling"
 msgstr "Wyświetla sekcje do obsługi wyjątków"
 
-#: src/readelf.c:87
+#: src/readelf.c:95
 msgid "Additional output selection:"
 msgstr "Dodatkowy wybór wyjścia:"
 
-#: src/readelf.c:89
+#: src/readelf.c:97
 #, fuzzy
 msgid ""
 "Display DWARF section content.  SECTION can be one of abbrev, aranges, "
-"frame, gdb_index, info, loc, line, ranges, pubnames, str, macinfo, macro or "
-"exception"
+"decodedaranges, frame, gdb_index, info, loc, line, decodedline, ranges, "
+"pubnames, str, macinfo, macro or exception"
 msgstr ""
 "Wyświetla zawartość sekcji DWARF. SEKCJA może być jednym z abbrev, aranges, "
-"frame, info, loc, line, ranges, pubnames, str, macinfo lub exception."
+"frame, gdb_index, info, loc, line, ranges, pubnames, str, macinfo, macro lub "
+"exception."
 
-#: src/readelf.c:93
+#: src/readelf.c:101
 msgid "Dump the uninterpreted contents of SECTION, by number or name"
 msgstr "Zrzuca niezinterpretowaną zawartość SEKCJI, według liczny lub nazwy"
 
-#: src/readelf.c:95
+#: src/readelf.c:103
 msgid "Print string contents of sections"
 msgstr "Wyświetla zawartość ciągów sekcji"
 
-#: src/readelf.c:98
+#: src/readelf.c:106
 msgid "Display the symbol index of an archive"
 msgstr "Wyświetla indeks symboli archiwum"
 
-#: src/readelf.c:100
+#: src/readelf.c:108
 msgid "Output control:"
 msgstr "Kontrola wyjścia:"
 
-#: src/readelf.c:102
+#: src/readelf.c:110
 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:104
+#: src/readelf.c:112
+#, fuzzy
+msgid ""
+"Display just offsets instead of resolving values to addresses in DWARF data"
+msgstr "Bez odnajdywania nazw symboli dla adresów w danych DWARF"
+
+#: src/readelf.c:114
 msgid "Ignored for compatibility (lines always wide)"
-msgstr ""
+msgstr "Ignorowane dla zgodności (wiersze są zawsze szerokie)"
 
-#: src/readelf.c:109
+#: src/readelf.c:119
 msgid "Print information from ELF file in human-readable form."
 msgstr "Wyświetla informacje z pliku ELF w postaci czytelnej dla człowieka."
 
-#: src/readelf.c:410
+#: src/readelf.c:441
 #, c-format
 msgid "Unknown DWARF debug section `%s'.\n"
 msgstr "Nieznana sekcja debugowania DWARF \"%s\".\n"
 
-#: src/readelf.c:476
+#: src/readelf.c:520 src/readelf.c:631
 #, c-format
 msgid "cannot generate Elf descriptor: %s"
 msgstr "nie można utworzyć deskryptora ELF: %s"
 
-#: src/readelf.c:488
+#: src/readelf.c:545 src/readelf.c:1099 src/readelf.c:1269
 #, c-format
-msgid "'%s' is not an archive, cannot print archive index"
-msgstr "\"%s\" nie jest archiwum, nie można wyświetlić indeksu archiwum"
+msgid "cannot get section: %s"
+msgstr "nie można uzyskać sekcji: %s"
+
+#: src/readelf.c:554 src/readelf.c:1106 src/readelf.c:1277 src/readelf.c:9169
+#: src/unstrip.c:352 src/unstrip.c:383 src/unstrip.c:432 src/unstrip.c:540
+#: src/unstrip.c:557 src/unstrip.c:593 src/unstrip.c:791 src/unstrip.c:1059
+#: src/unstrip.c:1250 src/unstrip.c:1310 src/unstrip.c:1431 src/unstrip.c:1484
+#: src/unstrip.c:1591 src/unstrip.c:1780
+#, c-format
+msgid "cannot get section header: %s"
+msgstr "nie można uzyskać nagłówka sekcji: %s"
+
+#: src/readelf.c:562
+#, fuzzy, c-format
+msgid "cannot get section name"
+msgstr "nie można uzyskać nagłówka sekcji\n"
+
+#: src/readelf.c:571 src/readelf.c:5221 src/readelf.c:7414 src/readelf.c:7516
+#: src/readelf.c:7674
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr "nie można uzyskać zwartości %s: %s"
+
+#: src/readelf.c:587
+#, fuzzy, c-format
+msgid "cannot create temp file '%s'"
+msgstr "nie można utworzyć nowego pliku \"%s\": %s"
 
-#: src/readelf.c:493
+#: src/readelf.c:596
+#, fuzzy, c-format
+msgid "cannot write section data"
+msgstr "nie można odczytać danych sekcji: %s"
+
+#: src/readelf.c:602 src/readelf.c:619 src/readelf.c:648
 #, c-format
 msgid "error while closing Elf descriptor: %s"
 msgstr "błąd podczas zamykania deskryptora ELF: %s"
 
-#: src/readelf.c:585
+#: src/readelf.c:609
+#, fuzzy, c-format
+msgid "error while rewinding file descriptor"
+msgstr "błąd podczas zamykania deskryptora ELF: %s"
+
+#: src/readelf.c:643
+#, 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:742
+#, fuzzy, c-format
+msgid "No such section '%s' in '%s'"
+msgstr "nie można odczytać notatki sekcji [%zu] \"%s\" w \"%s\": %s"
+
+#: src/readelf.c:769
 #, c-format
 msgid "cannot stat input file"
 msgstr "nie można wykonać stat na pliku wejściowym"
 
-#: src/readelf.c:587
+#: src/readelf.c:771
 #, c-format
 msgid "input file is empty"
 msgstr "plik wejściowy jest pusty"
 
-#: src/readelf.c:589
+#: src/readelf.c:773
 #, c-format
 msgid "failed reading '%s': %s"
 msgstr "odczytanie \"%s\" nie powiodło się: %s"
 
-#: src/readelf.c:625
+#: src/readelf.c:814
 #, c-format
 msgid "cannot read ELF header: %s"
 msgstr "nie można odczytać nagłówka ELF: %s"
 
-#: src/readelf.c:633
+#: src/readelf.c:822
 #, c-format
 msgid "cannot create EBL handle"
 msgstr "nie można utworzyć uchwytu EBL"
 
-#: src/readelf.c:646
+#: src/readelf.c:835
 #, 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:732
+#: src/readelf.c:921
 msgid "NONE (None)"
 msgstr "NONE (żaden)"
 
-#: src/readelf.c:733
+#: src/readelf.c:922
 msgid "REL (Relocatable file)"
 msgstr "REL (plik relokowalny)"
 
-#: src/readelf.c:734
+#: src/readelf.c:923
 msgid "EXEC (Executable file)"
 msgstr "EXEC (plik wykonywalny)"
 
-#: src/readelf.c:735
+#: src/readelf.c:924
 msgid "DYN (Shared object file)"
 msgstr "DYN (plik obiektu współdzielonego)"
 
-#: src/readelf.c:736
+#: src/readelf.c:925
 msgid "CORE (Core file)"
 msgstr "CORE (plik core)"
 
-#: src/readelf.c:741
+#: src/readelf.c:930
 #, c-format
 msgid "OS Specific: (%x)\n"
 msgstr "Zależny od systemu: (%x)\n"
 
-#: src/readelf.c:743
+#: src/readelf.c:932
 #, c-format
 msgid "Processor Specific: (%x)\n"
 msgstr "Zależny od procesora: (%x)\n"
 
-#: src/readelf.c:753
+#: src/readelf.c:942
 msgid ""
 "ELF Header:\n"
 "  Magic:  "
@@ -4296,7 +4426,7 @@ msgstr ""
 "Nagłówek ELF:\n"
 "  Magic:  "
 
-#: src/readelf.c:757
+#: src/readelf.c:946
 #, c-format
 msgid ""
 "\n"
@@ -4305,117 +4435,117 @@ msgstr ""
 "\n"
 "  Klasa:                             %s\n"
 
-#: src/readelf.c:762
+#: src/readelf.c:951
 #, c-format
 msgid "  Data:                              %s\n"
 msgstr "  Dane:                              %s\n"
 
-#: src/readelf.c:768
+#: src/readelf.c:957
 #, c-format
 msgid "  Ident Version:                     %hhd %s\n"
 msgstr "  Wersja Ident:                      %hhd %s\n"
 
-#: src/readelf.c:770 src/readelf.c:787
+#: src/readelf.c:959 src/readelf.c:976
 msgid "(current)"
 msgstr "(bieżąca)"
 
-#: src/readelf.c:774
+#: src/readelf.c:963
 #, c-format
 msgid "  OS/ABI:                            %s\n"
 msgstr "  System operacyjny/ABI:             %s\n"
 
-#: src/readelf.c:777
+#: src/readelf.c:966
 #, c-format
 msgid "  ABI Version:                       %hhd\n"
 msgstr "  Wersja ABI:                        %hhd\n"
 
-#: src/readelf.c:780
+#: src/readelf.c:969
 msgid "  Type:                              "
 msgstr "  Typ:                               "
 
-#: src/readelf.c:783
+#: src/readelf.c:972
 #, c-format
 msgid "  Machine:                           %s\n"
 msgstr "  Komputer:                          %s\n"
 
-#: src/readelf.c:785
+#: src/readelf.c:974
 #, c-format
 msgid "  Version:                           %d %s\n"
 msgstr "  Wersja:                            %d %s\n"
 
-#: src/readelf.c:789
+#: src/readelf.c:978
 #, c-format
 msgid "  Entry point address:               %#<PRIx64>\n"
 msgstr "  Adres punktu wejściowego:          %#<PRIx64>\n"
 
-#: src/readelf.c:792
+#: src/readelf.c:981
 #, c-format
 msgid "  Start of program headers:          %<PRId64> %s\n"
 msgstr "  Początek nagłówków programu:       %<PRId64> %s\n"
 
-#: src/readelf.c:793 src/readelf.c:796
+#: src/readelf.c:982 src/readelf.c:985
 msgid "(bytes into file)"
 msgstr "(bajtów w pliku)"
 
-#: src/readelf.c:795
+#: src/readelf.c:984
 #, c-format
 msgid "  Start of section headers:          %<PRId64> %s\n"
 msgstr "  Początek nagłówków sekcji:         %<PRId64> %s\n"
 
-#: src/readelf.c:798
+#: src/readelf.c:987
 #, c-format
 msgid "  Flags:                             %s\n"
 msgstr "  Flagi:                             %s\n"
 
-#: src/readelf.c:801
+#: src/readelf.c:990
 #, c-format
 msgid "  Size of this header:               %<PRId16> %s\n"
 msgstr "  Rozmiar tego nagłówka:             %<PRId16> %s\n"
 
-#: src/readelf.c:802 src/readelf.c:805 src/readelf.c:822
+#: src/readelf.c:991 src/readelf.c:994 src/readelf.c:1011
 msgid "(bytes)"
 msgstr "(bajtów)"
 
-#: src/readelf.c:804
+#: src/readelf.c:993
 #, c-format
 msgid "  Size of program header entries:    %<PRId16> %s\n"
 msgstr "  Rozmiar wpisów nagłówka programu:  %<PRId16> %s\n"
 
-#: src/readelf.c:807
+#: src/readelf.c:996
 #, c-format
 msgid "  Number of program headers entries: %<PRId16>"
 msgstr "  Liczba wpisów nagłówków programu: %<PRId16>"
 
-#: src/readelf.c:814
+#: src/readelf.c:1003
 #, c-format
 msgid " (%<PRIu32> in [0].sh_info)"
 msgstr " (%<PRIu32> w [0].sh_info)"
 
-#: src/readelf.c:817 src/readelf.c:834 src/readelf.c:848
+#: src/readelf.c:1006 src/readelf.c:1023 src/readelf.c:1037
 msgid " ([0] not available)"
 msgstr " ([0] niedostępny)"
 
-#: src/readelf.c:821
+#: src/readelf.c:1010
 #, c-format
 msgid "  Size of section header entries:    %<PRId16> %s\n"
 msgstr "  Rozmiar wpisów nagłówka sekcji:    %<PRId16> %s\n"
 
-#: src/readelf.c:824
+#: src/readelf.c:1013
 #, c-format
 msgid "  Number of section headers entries: %<PRId16>"
 msgstr "  Liczba wpisów nagłówków sekcji:    %<PRId16>"
 
-#: src/readelf.c:831
+#: src/readelf.c:1020
 #, c-format
 msgid " (%<PRIu32> in [0].sh_size)"
 msgstr " (%<PRIu32> w [0].sh_size)"
 
-#: src/readelf.c:844
+#: src/readelf.c:1033
 #, c-format
 msgid " (%<PRIu32> in [0].sh_link)"
 msgstr " (%<PRIu32> w [0].sh_link)"
 
-#: src/readelf.c:852
+#: src/readelf.c:1041
 #, c-format
 msgid ""
 "  Section header string table index: XINDEX%s\n"
@@ -4424,7 +4554,7 @@ msgstr ""
 "  Indeks tabeli ciągów nagłówków sekcji: XINDEX%s\n"
 "\n"
 
-#: src/readelf.c:856
+#: src/readelf.c:1045
 #, c-format
 msgid ""
 "  Section header string table index: %<PRId16>\n"
@@ -4433,7 +4563,7 @@ msgstr ""
 "  Indeks tabeli ciągów nagłówków sekcji: %<PRId16>\n"
 "\n"
 
-#: src/readelf.c:888
+#: src/readelf.c:1077
 #, c-format
 msgid ""
 "There are %d section headers, starting at offset %#<PRIx64>:\n"
@@ -4442,11 +4572,11 @@ msgstr ""
 "Jest %d nagłówków sekcji, rozpoczynających się od offsetu %#<PRIx64>:\n"
 "\n"
 
-#: src/readelf.c:898
+#: src/readelf.c:1087
 msgid "Section Headers:"
 msgstr "Nagłówki sekcji:"
 
-#: src/readelf.c:901
+#: src/readelf.c:1090
 msgid ""
 "[Nr] Name                 Type         Addr     Off    Size   ES Flags Lk "
 "Inf Al"
@@ -4454,7 +4584,7 @@ msgstr ""
 "[Nr] Nazwa                Typ          Adres    Offset Rozm   ES Flagi Lk "
 "Inf Al"
 
-#: src/readelf.c:903
+#: src/readelf.c:1092
 msgid ""
 "[Nr] Name                 Type         Addr             Off      Size     ES "
 "Flags Lk Inf Al"
@@ -4462,32 +4592,18 @@ msgstr ""
 "[Nr] Nazwa                Typ          Adres            Offset   Rozmiar  ES "
 "Flagi Lk Inf Al"
 
-#: src/readelf.c:910 src/readelf.c:1063
-#, c-format
-msgid "cannot get section: %s"
-msgstr "nie można uzyskać sekcji: %s"
-
-#: src/readelf.c:917 src/readelf.c:1071 src/readelf.c:8343 src/unstrip.c:345
-#: src/unstrip.c:376 src/unstrip.c:425 src/unstrip.c:533 src/unstrip.c:550
-#: src/unstrip.c:586 src/unstrip.c:784 src/unstrip.c:1052 src/unstrip.c:1242
-#: src/unstrip.c:1302 src/unstrip.c:1423 src/unstrip.c:1476 src/unstrip.c:1583
-#: src/unstrip.c:1772
-#, c-format
-msgid "cannot get section header: %s"
-msgstr "nie można uzyskać nagłówka sekcji: %s"
-
-#: src/readelf.c:975
+#: src/readelf.c:1164
 msgid "Program Headers:"
 msgstr "Nagłówki programu:"
 
-#: src/readelf.c:977
+#: src/readelf.c:1166
 msgid ""
 "  Type           Offset   VirtAddr   PhysAddr   FileSiz  MemSiz   Flg Align"
 msgstr ""
 "  Typ            Offset   AdresWirt  AdresFiz   RozmPlik RozmPam  Flg "
 "Wyrównanie"
 
-#: src/readelf.c:980
+#: src/readelf.c:1169
 msgid ""
 "  Type           Offset   VirtAddr           PhysAddr           FileSiz  "
 "MemSiz   Flg Align"
@@ -4495,12 +4611,12 @@ msgstr ""
 "  Typ            Offset   AdresWirtualny     AdresFizyczny      RozmPlik "
 "RozmPam  Flg Wyrównanie"
 
-#: src/readelf.c:1020
+#: src/readelf.c:1226
 #, c-format
 msgid "\t[Requesting program interpreter: %s]\n"
 msgstr "\t[Wywołanie interpretera programu: %s]\n"
 
-#: src/readelf.c:1041
+#: src/readelf.c:1247
 msgid ""
 "\n"
 " Section to Segment mapping:\n"
@@ -4510,12 +4626,12 @@ msgstr ""
 " mapowanie sekcji do segmentów:\n"
 "  Segment sekcji..."
 
-#: src/readelf.c:1052 src/unstrip.c:1827 src/unstrip.c:1866 src/unstrip.c:1873
+#: src/readelf.c:1258 src/unstrip.c:1835 src/unstrip.c:1874 src/unstrip.c:1881
 #, c-format
 msgid "cannot get program header: %s"
 msgstr "nie można uzyskać nagłówka programu: %s"
 
-#: src/readelf.c:1193
+#: src/readelf.c:1401
 #, c-format
 msgid ""
 "\n"
@@ -4533,7 +4649,7 @@ msgstr[2] ""
 "\n"
 "Grupa sekcji COMDAT [%2zu] \"%s\" z podpisem \"%s\" zawiera %zu wpisów:\n"
 
-#: src/readelf.c:1198
+#: src/readelf.c:1406
 #, c-format
 msgid ""
 "\n"
@@ -4551,15 +4667,21 @@ msgstr[2] ""
 "\n"
 "Grupa sekcji [%2zu] \"%s\" z podpisem \"%s\" zawiera %zu wpisów:\n"
 
-#: src/readelf.c:1206
+#: src/readelf.c:1414
 msgid "<INVALID SYMBOL>"
 msgstr "<NIEPRAWIDŁOWY SYMBOL>"
 
-#: src/readelf.c:1220
+#: src/readelf.c:1428
 msgid "<INVALID SECTION>"
 msgstr "<NIEPRAWIDŁOWY SEKCJA>"
 
-#: src/readelf.c:1371
+#: src/readelf.c:1585 src/readelf.c:2202 src/readelf.c:2460 src/readelf.c:2530
+#: src/readelf.c:2812 src/readelf.c:2885 src/readelf.c:4488
+#, fuzzy, c-format
+msgid "invalid sh_link value in section %Zu"
+msgstr "nieprawidłowa sekcja .debug_line"
+
+#: src/readelf.c:1588
 #, c-format
 msgid ""
 "\n"
@@ -4585,36 +4707,36 @@ msgstr[2] ""
 " Adres: %#0*<PRIx64>  Offset: %#08<PRIx64>  Dowiązanie do sekcji: [%2u] "
 "'%s'\n"
 
-#: src/readelf.c:1383
+#: src/readelf.c:1598
 msgid "  Type              Value\n"
 msgstr "  Typ               Wartość\n"
 
-#: src/readelf.c:1407
+#: src/readelf.c:1622
 #, c-format
 msgid "Shared library: [%s]\n"
 msgstr "Biblioteka współdzielona: [%s]\n"
 
-#: src/readelf.c:1412
+#: src/readelf.c:1627
 #, c-format
 msgid "Library soname: [%s]\n"
 msgstr "soname biblioteki: [%s]\n"
 
-#: src/readelf.c:1417
+#: src/readelf.c:1632
 #, c-format
 msgid "Library rpath: [%s]\n"
 msgstr "rpath biblioteki: [%s]\n"
 
-#: src/readelf.c:1422
+#: src/readelf.c:1637
 #, c-format
 msgid "Library runpath: [%s]\n"
 msgstr "runpath biblioteki: [%s]\n"
 
-#: src/readelf.c:1442
+#: src/readelf.c:1657
 #, c-format
 msgid "%<PRId64> (bytes)\n"
 msgstr "%<PRId64> (bajtów)\n"
 
-#: src/readelf.c:1554 src/readelf.c:1740
+#: src/readelf.c:1770 src/readelf.c:1957
 #, c-format
 msgid ""
 "\n"
@@ -4623,7 +4745,7 @@ msgstr ""
 "\n"
 "Nieprawidłowa tabela symboli pod offsetem %#0<PRIx64>\n"
 
-#: src/readelf.c:1572 src/readelf.c:1757
+#: src/readelf.c:1788 src/readelf.c:1975
 #, c-format
 msgid ""
 "\n"
@@ -4646,7 +4768,7 @@ msgstr[2] ""
 "Sekcja relokacji [%2zu] \"%s\" dla sekcji [%2u] \"%s\" pod offsetem "
 "%#0<PRIx64> zawiera %d wpisów:\n"
 
-#: src/readelf.c:1587
+#: src/readelf.c:1803 src/readelf.c:1990
 #, c-format
 msgid ""
 "\n"
@@ -4664,30 +4786,30 @@ msgstr[2] ""
 "\n"
 "Sekcja relokacji [%2u] \"%s\" pod offsetem %#0<PRIx64> zawiera %d wpisów:\n"
 
-#: src/readelf.c:1597
+#: src/readelf.c:1813
 msgid "  Offset      Type                 Value       Name\n"
 msgstr "  Offset      Typ                  Wartość     Nazwa\n"
 
-#: src/readelf.c:1599
+#: src/readelf.c:1815
 msgid "  Offset              Type                 Value               Name\n"
 msgstr "  Offset              Typ                  Wartość             Nazwa\n"
 
-#: src/readelf.c:1652 src/readelf.c:1663 src/readelf.c:1676 src/readelf.c:1694
-#: src/readelf.c:1706 src/readelf.c:1825 src/readelf.c:1837 src/readelf.c:1851
-#: src/readelf.c:1870 src/readelf.c:1883
+#: src/readelf.c:1868 src/readelf.c:1879 src/readelf.c:1892 src/readelf.c:1910
+#: src/readelf.c:1922 src/readelf.c:2056 src/readelf.c:2068 src/readelf.c:2082
+#: src/readelf.c:2101 src/readelf.c:2114
 msgid "<INVALID RELOC>"
 msgstr "<NIEPRAWIDŁOWA RELOKACJA>"
 
-#: src/readelf.c:1769
+#: src/readelf.c:2000
 msgid "  Offset      Type            Value       Addend Name\n"
 msgstr "  Offset      Typ             Wartość     Koniec Nazwa\n"
 
-#: src/readelf.c:1771
+#: src/readelf.c:2002
 msgid "  Offset              Type            Value               Addend Name\n"
 msgstr ""
 "  Offset              Typ             Wartość             Koniec Nazwa\n"
 
-#: src/readelf.c:1972
+#: src/readelf.c:2210
 #, c-format
 msgid ""
 "\n"
@@ -4705,7 +4827,7 @@ msgstr[2] ""
 "\n"
 "Tabela symboli [%2u] \"%s\" zawiera %u wpisów:\n"
 
-#: src/readelf.c:1978
+#: src/readelf.c:2215
 #, c-format
 msgid " %lu local symbol  String table: [%2u] '%s'\n"
 msgid_plural " %lu local symbols  String table: [%2u] '%s'\n"
@@ -4713,33 +4835,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:1988
+#: src/readelf.c:2223
 msgid "  Num:    Value   Size Type    Bind   Vis          Ndx Name\n"
 msgstr "  Numer:  Wartość Rozm Typ     Bind   Widoczność   Ndx Nazwa\n"
 
-#: src/readelf.c:1990
+#: src/readelf.c:2225
 msgid "  Num:            Value   Size Type    Bind   Vis          Ndx Name\n"
 msgstr "  Numer:          Wartość Rozm Typ     Bind   Widoczność   Ndx Nazwa\n"
 
-#: src/readelf.c:2010
+#: src/readelf.c:2245
 #, 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:2098
+#: src/readelf.c:2333
 #, c-format
 msgid "bad dynamic symbol"
 msgstr "błędny symbol dynamiczny"
 
-#: src/readelf.c:2180
+#: src/readelf.c:2415
 msgid "none"
 msgstr "brak"
 
-#: src/readelf.c:2197
+#: src/readelf.c:2432
 msgid "| <unknown>"
 msgstr "| <nieznany>"
 
-#: src/readelf.c:2222
+#: src/readelf.c:2463
 #, c-format
 msgid ""
 "\n"
@@ -4765,17 +4887,17 @@ msgstr[2] ""
 " Adres: %#0*<PRIx64>  Offset: %#08<PRIx64>  Dowiązanie do sekcji: [%2u] \"%s"
 "\"\n"
 
-#: src/readelf.c:2245
+#: src/readelf.c:2484
 #, c-format
 msgid "  %#06x: Version: %hu  File: %s  Cnt: %hu\n"
 msgstr "  %#06x: Wersja: %hu  Plik: %s  Licznik: %hu\n"
 
-#: src/readelf.c:2258
+#: src/readelf.c:2497
 #, c-format
 msgid "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 msgstr "  %#06x: Nazwa: %s  Flagi: %s  Wersja: %hu\n"
 
-#: src/readelf.c:2289
+#: src/readelf.c:2534
 #, c-format
 msgid ""
 "\n"
@@ -4801,18 +4923,18 @@ msgstr[2] ""
 " Adres: %#0*<PRIx64>  Offset: %#08<PRIx64>  Dowiązanie do sekcji: [%2u] \"%s"
 "\"\n"
 
-#: src/readelf.c:2319
+#: src/readelf.c:2562
 #, 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:2334
+#: src/readelf.c:2577
 #, c-format
 msgid "  %#06x: Parent %d: %s\n"
 msgstr "  %#06x: Rodzic %d: %s\n"
 
-#: src/readelf.c:2566
+#: src/readelf.c:2816
 #, c-format
 msgid ""
 "\n"
@@ -4838,15 +4960,15 @@ msgstr[2] ""
 " Adres: %#0*<PRIx64>  Offset: %#08<PRIx64>  Dowiązanie do sekcji: [%2u] \"%s"
 "\""
 
-#: src/readelf.c:2596
+#: src/readelf.c:2844
 msgid "   0 *local*                     "
 msgstr "   0 *lokalny*                   "
 
-#: src/readelf.c:2601
+#: src/readelf.c:2849
 msgid "   1 *global*                    "
 msgstr "   1 *globalny*                  "
 
-#: src/readelf.c:2632
+#: src/readelf.c:2890
 #, c-format
 msgid ""
 "\n"
@@ -4877,22 +4999,22 @@ msgstr[2] ""
 " Adres: %#0*<PRIx64>  Offset: %#08<PRIx64>  Dowiązanie do sekcji: [%2u] \"%s"
 "\"\n"
 
-#: src/readelf.c:2656
+#: src/readelf.c:2912
 #, no-c-format
 msgid " Length  Number  % of total  Coverage\n"
 msgstr " Długość Liczba  % całości   Pokrycie\n"
 
-#: src/readelf.c:2658
+#: src/readelf.c:2914
 #, c-format
 msgid "      0  %6<PRIu32>      %5.1f%%\n"
 msgstr "      0  %6<PRIu32>      %5.1f%%\n"
 
-#: src/readelf.c:2665
+#: src/readelf.c:2921
 #, c-format
 msgid "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 msgstr "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 
-#: src/readelf.c:2678
+#: src/readelf.c:2934
 #, c-format
 msgid ""
 " Average number of tests:   successful lookup: %f\n"
@@ -4901,12 +5023,12 @@ msgstr ""
 " Średnia liczba testów:   udane wyszukania: %f\n"
 "\t\t\t  nieudane wyszukania: %f\n"
 
-#: src/readelf.c:2696 src/readelf.c:2738 src/readelf.c:2779
+#: src/readelf.c:2952 src/readelf.c:2994 src/readelf.c:3035
 #, c-format
 msgid "cannot get data for section %d: %s"
 msgstr "nie można uzyskać danych dla sekcji %d: %s"
 
-#: src/readelf.c:2833
+#: src/readelf.c:3089
 #, c-format
 msgid ""
 " Symbol Bias: %u\n"
@@ -4916,7 +5038,7 @@ msgstr ""
 " Rozmiar maski bitowej: %zu bajtów  %<PRIuFAST32>%% bitów ustawionych  "
 "drugie przesunięcie skrótu: %u\n"
 
-#: src/readelf.c:2907
+#: src/readelf.c:3164
 #, c-format
 msgid ""
 "\n"
@@ -4937,7 +5059,7 @@ msgstr[2] ""
 "Sekcja listy bibliotek [%2zu] \"%s\" pod offsetem %#0<PRIx64> zawiera %d "
 "wpisów:\n"
 
-#: src/readelf.c:2921
+#: src/readelf.c:3178
 msgid ""
 "       Library                       Time Stamp          Checksum Version "
 "Flags"
@@ -4945,7 +5067,7 @@ msgstr ""
 "       Biblioteka                    Oznaczenie czasu    Suma k.  Wersja  "
 "Flagi"
 
-#: src/readelf.c:2971
+#: src/readelf.c:3228
 #, c-format
 msgid ""
 "\n"
@@ -4956,135 +5078,140 @@ msgstr ""
 "Sekcja atrybutów obiektu [%2zu] \"%s\" %<PRIu64> bajtów pod offsetem "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:2987
+#: src/readelf.c:3244
 msgid "  Owner          Size\n"
 msgstr "  Właściciel          Rozmiar\n"
 
-#: src/readelf.c:3013
+#: src/readelf.c:3270
 #, c-format
 msgid "  %-13s  %4<PRIu32>\n"
 msgstr "  %-13s  %4<PRIu32>\n"
 
-#: src/readelf.c:3045
+#: src/readelf.c:3302
 #, c-format
 msgid "    %-4u %12<PRIu32>\n"
 msgstr "    %-4u %12<PRIu32>\n"
 
-#: src/readelf.c:3050
+#: src/readelf.c:3307
 #, c-format
 msgid "    File: %11<PRIu32>\n"
 msgstr "    Plik: %11<PRIu32>\n"
 
-#: src/readelf.c:3085
+#: src/readelf.c:3342
 #, c-format
 msgid "      %s: %<PRId64>, %s\n"
 msgstr "      %s: %<PRId64>, %s\n"
 
-#: src/readelf.c:3088
+#: src/readelf.c:3345
 #, c-format
 msgid "      %s: %<PRId64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:3091
+#: src/readelf.c:3348
 #, c-format
 msgid "      %s: %s\n"
 msgstr "      %s: %s\n"
 
-#: src/readelf.c:3098
+#: src/readelf.c:3355
 #, c-format
 msgid "      %u: %<PRId64>\n"
 msgstr "      %u: %<PRId64>\n"
 
-#: src/readelf.c:3101
+#: src/readelf.c:3358
 #, c-format
 msgid "      %u: %s\n"
 msgstr "      %u: %s\n"
 
-#: src/readelf.c:3137
+#: src/readelf.c:3403
 #, c-format
 msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3140
+#: src/readelf.c:3406
 #, c-format
 msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3145
+#: src/readelf.c:3411
 #, c-format
 msgid "%#<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%#<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3148
+#: src/readelf.c:3414
 #, c-format
 msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%#0*<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3154
+#: src/readelf.c:3420
 #, c-format
 msgid "%s+%#<PRIx64> <%s>"
 msgstr "%s+%#<PRIx64> <%s>"
 
-#: src/readelf.c:3157
+#: src/readelf.c:3423
 #, c-format
 msgid "%s+%#0*<PRIx64> <%s>"
 msgstr "%s+%#0*<PRIx64> <%s>"
 
-#: src/readelf.c:3161
+#: src/readelf.c:3427
 #, c-format
 msgid "%#<PRIx64> <%s>"
 msgstr "%#<PRIx64> <%s>"
 
-#: src/readelf.c:3164
+#: src/readelf.c:3430
 #, c-format
 msgid "%#0*<PRIx64> <%s>"
 msgstr "%#0*<PRIx64> <%s>"
 
-#: src/readelf.c:3169
+#: src/readelf.c:3435
 #, c-format
 msgid "%s+%#<PRIx64>"
 msgstr "%s+%#<PRIx64>"
 
-#: src/readelf.c:3172
+#: src/readelf.c:3438
 #, c-format
 msgid "%s+%#0*<PRIx64>"
 msgstr "%s+%#0*<PRIx64>"
 
-#: src/readelf.c:3554
+#: src/readelf.c:3820
 msgid "empty block"
 msgstr "pusty blok"
 
-#: src/readelf.c:3557
+#: src/readelf.c:3823
 #, c-format
 msgid "%zu byte block:"
 msgstr "%zu bajtowy blok:"
 
-#: src/readelf.c:3934
+#: src/readelf.c:4217
 #, c-format
 msgid "%*s[%4<PRIuMAX>] %s  <TRUNCATED>\n"
 msgstr "%*s[%4<PRIuMAX>] %s  <SKRÓCONE>\n"
 
-#: src/readelf.c:3970
+#: src/readelf.c:4274
 #, 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:3977
+#: src/readelf.c:4281
 #, 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:4057
+#: src/readelf.c:4288
+#, fuzzy, c-format
+msgid "%s %#<PRIx64> used with different base addresses"
+msgstr "%s %#<PRIx64> zostało użyte z różnymi rozmiarami adresu"
+
+#: src/readelf.c:4370
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE IN REST OF SECTION>\n"
 msgstr " [%6tx]  <NIEUŻYWANE ŚMIECIE W RESZCIE SEKCJI>\n"
 
-#: src/readelf.c:4065
+#: src/readelf.c:4378
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
 msgstr " [%6tx]  <NIEUŻYWANE ŚMIECIE>... %<PRIu64> bajtów...\n"
 
-#: src/readelf.c:4087
+#: src/readelf.c:4404
 #, c-format
 msgid ""
 "\n"
@@ -5095,7 +5222,7 @@ msgstr ""
 "Sekcja DWARF [%2zu] \"%s\" pod offsetem %#<PRIx64>:\n"
 " [ Kod]\n"
 
-#: src/readelf.c:4095
+#: src/readelf.c:4412
 #, c-format
 msgid ""
 "\n"
@@ -5104,30 +5231,30 @@ msgstr ""
 "\n"
 "Sekcja skrótów pod offsetem %<PRIu64>:\n"
 
-#: src/readelf.c:4108
+#: src/readelf.c:4425
 #, c-format
 msgid " *** error while reading abbreviation: %s\n"
 msgstr " *** błąd podczas odczytywania skrótu: %s\n"
 
-#: src/readelf.c:4124
+#: src/readelf.c:4441
 #, c-format
 msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
 msgstr " [%5u] offset: %<PRId64>, potomek: %s, znacznik: %s\n"
 
-#: src/readelf.c:4127
+#: src/readelf.c:4444
 msgid "yes"
 msgstr "tak"
 
-#: src/readelf.c:4127
+#: src/readelf.c:4444
 msgid "no"
 msgstr "nie"
 
-#: src/readelf.c:4162
+#: src/readelf.c:4478 src/readelf.c:4551
 #, c-format
 msgid "cannot get .debug_aranges content: %s"
 msgstr "nie można uzyskać zawartości .debug_aranges: %s"
 
-#: src/readelf.c:4167
+#: src/readelf.c:4493
 #, c-format
 msgid ""
 "\n"
@@ -5145,12 +5272,12 @@ msgstr[2] ""
 "\n"
 "Sekcja DWARF [%2zu] \"%s\" pod offsetem %#<PRIx64> zawiera %zu wpisów:\n"
 
-#: src/readelf.c:4198
+#: src/readelf.c:4524
 #, c-format
 msgid " [%*zu] ???\n"
 msgstr " [%*zu] ???\n"
 
-#: src/readelf.c:4200
+#: src/readelf.c:4526
 #, c-format
 msgid ""
 " [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
@@ -5158,13 +5285,8 @@ msgstr ""
 " [%*zu] początek: %0#*<PRIx64>, długość: %5<PRIu64>, offset CU DIE: "
 "%6<PRId64>\n"
 
-#: src/readelf.c:4219
-#, c-format
-msgid "cannot get .debug_ranges content: %s"
-msgstr "nie można uzyskać zawartości .debug_ranges: %s"
-
-#: src/readelf.c:4224 src/readelf.c:4728 src/readelf.c:5505 src/readelf.c:6006
-#: src/readelf.c:6121 src/readelf.c:6277 src/readelf.c:6699
+#: src/readelf.c:4556 src/readelf.c:4710 src/readelf.c:5231 src/readelf.c:6145
+#: src/readelf.c:6646 src/readelf.c:6766 src/readelf.c:6922 src/readelf.c:7345
 #, c-format
 msgid ""
 "\n"
@@ -5173,37 +5295,115 @@ msgstr ""
 "\n"
 "Sekcja DWARF [%2zu] \"%s\" pod offsetem %#<PRIx64>:\n"
 
-#: src/readelf.c:4248 src/readelf.c:6031
+#: src/readelf.c:4569 src/readelf.c:6171
+#, c-format
+msgid ""
+"\n"
+"Table at offset %Zu:\n"
+msgstr ""
+"\n"
+"Tabela pod offsetem %Zu:\n"
+
+#: src/readelf.c:4573 src/readelf.c:5255 src/readelf.c:6180
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr "nieprawidłowe dane w sekcji [%zu] \"%s\""
+
+#: src/readelf.c:4589
+#, fuzzy, c-format
+msgid ""
+"\n"
+" Length:        %6<PRIu64>\n"
+msgstr " Długość offsetu:      %<PRIu8>\n"
+
+#: src/readelf.c:4601
+#, fuzzy, c-format
+msgid " DWARF version: %6<PRIuFAST16>\n"
+msgstr " Wersja:            %<PRIu16>\n"
+
+#: src/readelf.c:4605
+#, c-format
+msgid "unsupported aranges version"
+msgstr ""
+
+#: src/readelf.c:4616
+#, fuzzy, c-format
+msgid " CU offset:     %6<PRIx64>\n"
+msgstr " offset CU:       %#<PRIx32>\n"
+
+#: src/readelf.c:4622
+#, fuzzy, c-format
+msgid " Address size:  %6<PRIu64>\n"
+msgstr " offset adresu:  %#<PRIx32>\n"
+
+#: src/readelf.c:4626
+#, fuzzy, c-format
+msgid "unsupported address size"
+msgstr "brak wartości adresu"
+
+#: src/readelf.c:4631
+#, fuzzy, c-format
+msgid ""
+" Segment size:  %6<PRIu64>\n"
+"\n"
+msgstr " ustawienie pliku na %<PRIu64>\n"
+
+#: src/readelf.c:4635
+#, c-format
+msgid "unsupported segment size"
+msgstr ""
+
+#: src/readelf.c:4675
+#, fuzzy, c-format
+msgid "   %s..%s (%<PRIx64>)\n"
+msgstr "      %s: %<PRId64>\n"
+
+#: src/readelf.c:4678
+#, fuzzy, c-format
+msgid "   %s..%s\n"
+msgstr " [%6tx]  %s...%s\n"
+
+#: src/readelf.c:4687
+#, c-format
+msgid "   %Zu padding bytes\n"
+msgstr ""
+
+#: src/readelf.c:4705
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr "nie można uzyskać zawartości .debug_ranges: %s"
+
+#: src/readelf.c:4735 src/readelf.c:6673
 #, c-format
 msgid " [%6tx]  <INVALID DATA>\n"
 msgstr " [%6tx]  <NIEPRAWIDŁOWE DANE>\n"
 
-#: src/readelf.c:4270 src/readelf.c:6053
+#: src/readelf.c:4757 src/readelf.c:6695
 #, c-format
 msgid " [%6tx]  base address %s\n"
 msgstr " [%6tx]  adres podstawowy %s\n"
 
-#: src/readelf.c:4276 src/readelf.c:6059
+#: src/readelf.c:4764 src/readelf.c:6702
 #, c-format
 msgid " [%6tx]  empty list\n"
 msgstr " [%6tx]  pusta lista\n"
 
-#: src/readelf.c:4285
+#: src/readelf.c:4775
 #, c-format
 msgid " [%6tx]  %s..%s\n"
 msgstr " [%6tx]  %s...%s\n"
 
-#: src/readelf.c:4287
+#: src/readelf.c:4777
 #, c-format
 msgid "           %s..%s\n"
 msgstr "           %s...%s\n"
 
-#: src/readelf.c:4717 src/readelf.c:6768 src/readelf.c:6870 src/readelf.c:7028
-#, c-format
-msgid "cannot get %s content: %s"
-msgstr "nie można uzyskać zwartości %s: %s"
+#: src/readelf.c:5210
+#, fuzzy, c-format
+msgid "cannot get ELF: %s"
+msgstr "nie można uzyskać nagłówka ELF: %s"
 
-#: src/readelf.c:4724
+#: src/readelf.c:5227
 #, c-format
 msgid ""
 "\n"
@@ -5212,12 +5412,7 @@ msgstr ""
 "\n"
 "Sekcja informacji o ramce wywołania [%2zu] \"%s\" pod offsetem %#0<PRIx64>:\n"
 
-#: src/readelf.c:4752 src/readelf.c:5540
-#, c-format
-msgid "invalid data in section [%zu] '%s'"
-msgstr "nieprawidłowe dane w sekcji [%zu] \"%s\""
-
-#: src/readelf.c:4774
+#: src/readelf.c:5277
 #, c-format
 msgid ""
 "\n"
@@ -5226,50 +5421,50 @@ msgstr ""
 "\n"
 " [%6tx] Zerowy koniec\n"
 
-#: src/readelf.c:4859
+#: src/readelf.c:5362
 #, c-format
 msgid "invalid augmentation length"
 msgstr "nieprawidłowa długość powiększenia"
 
-#: src/readelf.c:4871
+#: src/readelf.c:5374
 msgid "FDE address encoding: "
 msgstr "Kodowanie adresu FDE: "
 
-#: src/readelf.c:4877
+#: src/readelf.c:5380
 msgid "LSDA pointer encoding: "
 msgstr "Kodowanie wskaźnika LSDA: "
 
-#: src/readelf.c:4975
+#: src/readelf.c:5491
 #, c-format
 msgid " (offset: %#<PRIx64>)"
 msgstr " (offset: %#<PRIx64>)"
 
-#: src/readelf.c:4982
+#: src/readelf.c:5498
 #, c-format
 msgid " (end offset: %#<PRIx64>)"
 msgstr " (kończący offset: %#<PRIx64>)"
 
-#: src/readelf.c:5009
+#: src/readelf.c:5525
 #, c-format
 msgid "   %-26sLSDA pointer: %#<PRIx64>\n"
 msgstr "   %-26sWskaźnik LSDA: %#<PRIx64>\n"
 
-#: src/readelf.c:5060
+#: src/readelf.c:5577
 #, c-format
 msgid "cannot get attribute code: %s"
 msgstr "nie można uzyskać kodu atrybutu: %s"
 
-#: src/readelf.c:5069
+#: src/readelf.c:5586
 #, c-format
 msgid "cannot get attribute form: %s"
 msgstr "nie można uzyskać formy atrybutu: %s"
 
-#: src/readelf.c:5084
+#: src/readelf.c:5601
 #, c-format
 msgid "cannot get attribute value: %s"
 msgstr "nie można uzyskać wartości atrybutu: %s"
 
-#: src/readelf.c:5342
+#: src/readelf.c:5894
 #, c-format
 msgid ""
 "\n"
@@ -5280,7 +5475,7 @@ msgstr ""
 "Sekcja DWARF [%2zu] \"%s\" pod offsetem %#<PRIx64>:\n"
 " [Offset]\n"
 
-#: src/readelf.c:5374
+#: src/readelf.c:5926
 #, c-format
 msgid ""
 " Type unit at offset %<PRIu64>:\n"
@@ -5293,7 +5488,7 @@ msgstr ""
 "%<PRIu8>, rozmiar offsetu: %<PRIu8>\n"
 " Podpis typu: %#<PRIx64>, offset typu: %#<PRIx64>\n"
 
-#: src/readelf.c:5383
+#: src/readelf.c:5935
 #, c-format
 msgid ""
 " Compilation unit at offset %<PRIu64>:\n"
@@ -5304,47 +5499,48 @@ msgstr ""
 " Wersja: %<PRIu16>, offset sekcji skrótów: %<PRIu64>, rozmiar adresu: "
 "%<PRIu8>, rozmiar offsetu: %<PRIu8>\n"
 
-#: src/readelf.c:5409
+#: src/readelf.c:5960
 #, c-format
 msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
 msgstr "nie można uzyskać DIE pod offsetem %<PRIu64> w sekcji \"%s\": %s"
 
-#: src/readelf.c:5421
+#: src/readelf.c:5974
 #, c-format
 msgid "cannot get DIE offset: %s"
 msgstr "nie można uzyskać offsetu DIE: %s"
 
-#: src/readelf.c:5430
+#: src/readelf.c:5983
 #, c-format
 msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
 msgstr ""
 "nie można uzyskać znacznika DIE pod offsetem %<PRIu64> w sekcji \"%s\": %s"
 
-#: src/readelf.c:5461
+#: src/readelf.c:6015
 #, c-format
 msgid "cannot get next DIE: %s\n"
 msgstr "nie można uzyskać następnego DIE: %s\n"
 
-#: src/readelf.c:5469
+#: src/readelf.c:6023
 #, c-format
 msgid "cannot get next DIE: %s"
 msgstr "nie można uzyskać następnego DIE: %s"
 
-#: src/readelf.c:5518
-#, c-format
-msgid "cannot get line data section data: %s"
-msgstr "nie można uzyskać danych sekcji danych wiersza: %s"
-
-#: src/readelf.c:5531
-#, c-format
+#: src/readelf.c:6059
+#, fuzzy, c-format
 msgid ""
 "\n"
-"Table at offset %Zu:\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+"\n"
 msgstr ""
 "\n"
-"Tabela pod offsetem %Zu:\n"
+"Sekcja DWARF [%2zu] \"%s\" pod offsetem %#<PRIx64>:\n"
 
-#: src/readelf.c:5586
+#: src/readelf.c:6158
+#, c-format
+msgid "cannot get line data section data: %s"
+msgstr "nie można uzyskać danych sekcji danych wiersza: %s"
+
+#: src/readelf.c:6226
 #, c-format
 msgid ""
 "\n"
@@ -5373,12 +5569,12 @@ msgstr ""
 "\n"
 "Instrukcje:\n"
 
-#: src/readelf.c:5607
+#: src/readelf.c:6247
 #, 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:5622
+#: src/readelf.c:6262
 #, c-format
 msgid "  [%*<PRIuFAST8>]  %hhu argument\n"
 msgid_plural "  [%*<PRIuFAST8>]  %hhu arguments\n"
@@ -5386,7 +5582,7 @@ msgstr[0] "  [%*<PRIuFAST8>]  %hhu parametr\n"
 msgstr[1] "  [%*<PRIuFAST8>]  %hhu parametry\n"
 msgstr[2] "  [%*<PRIuFAST8>]  %hhu parametrów\n"
 
-#: src/readelf.c:5630
+#: src/readelf.c:6270
 msgid ""
 "\n"
 "Directory table:"
@@ -5394,7 +5590,7 @@ msgstr ""
 "\n"
 "Tabela katalogu:"
 
-#: src/readelf.c:5646
+#: src/readelf.c:6286
 msgid ""
 "\n"
 "File name table:\n"
@@ -5404,7 +5600,7 @@ msgstr ""
 "Tabela nazw plików:\n"
 " Wpis Kat    Czas      Rozmiar   Nazwa"
 
-#: src/readelf.c:5675
+#: src/readelf.c:6315
 msgid ""
 "\n"
 "Line number statements:"
@@ -5412,118 +5608,114 @@ msgstr ""
 "\n"
 "Instrukcje numerów wierszy:"
 
-#: src/readelf.c:5751
+#: src/readelf.c:6391
 #, c-format
 msgid " special opcode %u: address+%u = %s, op_index = %u, line%+d = %zu\n"
 msgstr ""
 " instrukcja specjalna %u: adres+%u = %s, op_index = %u, wiersz%+d = %zu\n"
 
-#: src/readelf.c:5756
+#: src/readelf.c:6396
 #, c-format
 msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
 msgstr " instrukcja specjalna %u: adres+%u = %s, wiersz%+d = %zu\n"
 
-#: src/readelf.c:5776
+#: src/readelf.c:6416
 #, c-format
 msgid " extended opcode %u: "
 msgstr " instrukcja rozszerzona %u: "
 
-#: src/readelf.c:5781
-#, fuzzy
+#: src/readelf.c:6421
 msgid " end of sequence"
-msgstr "koniec sekwencji"
+msgstr " koniec sekwencji"
 
-#: src/readelf.c:5798
-#, fuzzy, c-format
+#: src/readelf.c:6438
+#, c-format
 msgid " set address to %s\n"
-msgstr "ustawienie adresu na %s\n"
+msgstr " ustawienie adresu na %s\n"
 
-#: src/readelf.c:5819
-#, fuzzy, c-format
+#: src/readelf.c:6459
+#, 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="
+" definicja nowego pliku: dir=%u, mtime=%<PRIu64>, długość=%<PRIu64>, nazwa="
 "%s\n"
 
-#: src/readelf.c:5832
+#: src/readelf.c:6472
 #, c-format
 msgid " set discriminator to %u\n"
 msgstr " ustawienie dyskryminatora na %u\n"
 
-#: src/readelf.c:5837
-#, fuzzy
+#: src/readelf.c:6477
 msgid " unknown opcode"
-msgstr "nieznana instrukcja"
+msgstr " nieznana instrukcja"
 
-#: src/readelf.c:5849
+#: src/readelf.c:6489
 msgid " copy"
 msgstr " kopiowanie"
 
-#: src/readelf.c:5860
-#, fuzzy, c-format
+#: src/readelf.c:6500
+#, c-format
 msgid " advance address by %u to %s, op_index to %u\n"
-msgstr ""
-"zwiększenie adresu o %u do %s, op_index do %u\n"
-"\n"
+msgstr " zwiększenie adresu o %u do %s, op_index do %u\n"
 
-#: src/readelf.c:5864
-#, fuzzy, c-format
+#: src/readelf.c:6504
+#, c-format
 msgid " advance address by %u to %s\n"
-msgstr "zwiększenie adresu o %u do %s\n"
+msgstr " zwiększenie adresu o %u do %s\n"
 
-#: src/readelf.c:5875
+#: src/readelf.c:6515
 #, c-format
 msgid " advance line by constant %d to %<PRId64>\n"
 msgstr " zwiększenie wiersza o stałą %d do %<PRId64>\n"
 
-#: src/readelf.c:5883
+#: src/readelf.c:6523
 #, c-format
 msgid " set file to %<PRIu64>\n"
 msgstr " ustawienie pliku na %<PRIu64>\n"
 
-#: src/readelf.c:5893
+#: src/readelf.c:6533
 #, c-format
 msgid " set column to %<PRIu64>\n"
 msgstr " ustawienie kolumny na %<PRIu64>\n"
 
-#: src/readelf.c:5900
+#: src/readelf.c:6540
 #, c-format
 msgid " set '%s' to %<PRIuFAST8>\n"
 msgstr " ustawienie \"%s\" na %<PRIuFAST8>\n"
 
-#: src/readelf.c:5906
+#: src/readelf.c:6546
 msgid " set basic block flag"
 msgstr " ustawienie podstawowej flagi bloku"
 
-#: src/readelf.c:5915
-#, fuzzy, c-format
+#: src/readelf.c:6555
+#, c-format
 msgid " advance address by constant %u to %s, op_index to %u\n"
-msgstr "zwiększenie adresu o stałą %u do %s, op_index do %u\n"
+msgstr " zwiększenie adresu o stałą %u do %s, op_index do %u\n"
 
-#: src/readelf.c:5919
-#, fuzzy, c-format
+#: src/readelf.c:6559
+#, c-format
 msgid " advance address by constant %u to %s\n"
-msgstr "zwiększenie adresu o stałą %u do %s\n"
+msgstr " zwiększenie adresu o stałą %u do %s\n"
 
-#: src/readelf.c:5937
-#, fuzzy, c-format
+#: src/readelf.c:6577
+#, c-format
 msgid " advance address by fixed value %u to %s\n"
-msgstr "zwiększenie adresu o stałą wartość %u do %s\n"
+msgstr " zwiększenie adresu o stałą wartość %u do %s\n"
 
-#: src/readelf.c:5946
+#: src/readelf.c:6586
 msgid " set prologue end flag"
 msgstr " ustawienie flagi końca prologu"
 
-#: src/readelf.c:5951
+#: src/readelf.c:6591
 msgid " set epilogue begin flag"
 msgstr " ustawienie flagi początku epilogu"
 
-#: src/readelf.c:5960
+#: src/readelf.c:6600
 #, c-format
 msgid " set isa to %u\n"
 msgstr " ustawienie isa na %u\n"
 
-#: src/readelf.c:5969
+#: src/readelf.c:6609
 #, c-format
 msgid " unknown opcode with %<PRIu8> parameter:"
 msgid_plural " unknown opcode with %<PRIu8> parameters:"
@@ -5531,96 +5723,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:6001
+#: src/readelf.c:6641
 #, c-format
 msgid "cannot get .debug_loc content: %s"
 msgstr "nie można uzyskać zawartości .debug_log: %s"
 
-#: src/readelf.c:6071
+#: src/readelf.c:6716
 #, c-format
 msgid " [%6tx]  %s..%s"
 msgstr " [%6tx]  %s...%s"
 
-#: src/readelf.c:6073
+#: src/readelf.c:6718
 #, c-format
 msgid "           %s..%s"
 msgstr "           %s...%s"
 
-#: src/readelf.c:6080
+#: src/readelf.c:6725
 msgid "   <INVALID DATA>\n"
 msgstr "   <NIEPRAWIDŁOWE DANE>\n"
 
-#: src/readelf.c:6132 src/readelf.c:6286
+#: src/readelf.c:6777 src/readelf.c:6931
 #, c-format
 msgid "cannot get macro information section data: %s"
 msgstr "nie można uzyskać danych sekcji informacji o makrach: %s"
 
-#: src/readelf.c:6211
+#: src/readelf.c:6856
 #, c-format
 msgid "%*s*** non-terminated string at end of section"
 msgstr "%*s*** niezakończony ciąg na końcu sekcji"
 
-#: src/readelf.c:6327
-#, fuzzy, c-format
+#: src/readelf.c:6972
+#, c-format
 msgid " Offset:             0x%<PRIx64>\n"
-msgstr "  Właściciel          Rozmiar\n"
+msgstr " Offset:             0x%<PRIx64>\n"
 
-#: src/readelf.c:6339
-#, fuzzy, c-format
+#: src/readelf.c:6984
+#, c-format
 msgid " Version:            %<PRIu16>\n"
-msgstr "      %s: %<PRId64>\n"
+msgstr " Wersja:            %<PRIu16>\n"
 
-#: src/readelf.c:6345 src/readelf.c:7055
+#: src/readelf.c:6990 src/readelf.c:7703
 #, c-format
 msgid "  unknown version, cannot parse section\n"
-msgstr ""
+msgstr "  nieznana wersja, nie można przetworzyć sekcji\n"
 
-#: src/readelf.c:6352
-#, fuzzy, c-format
+#: src/readelf.c:6997
+#, c-format
 msgid " Flag:               0x%<PRIx8>\n"
-msgstr "  Adres punktu wejściowego:          %#<PRIx64>\n"
+msgstr "  Flaga:               0x%<PRIx8>\n"
 
-#: src/readelf.c:6355
-#, fuzzy, c-format
+#: src/readelf.c:7000
+#, c-format
 msgid " Offset length:      %<PRIu8>\n"
-msgstr " (offset: %#<PRIx64>)"
+msgstr " Długość offsetu:      %<PRIu8>\n"
 
-#: src/readelf.c:6363
-#, fuzzy, c-format
+#: src/readelf.c:7008
+#, c-format
 msgid " .debug_line offset: 0x%<PRIx64>\n"
-msgstr " (kończący offset: %#<PRIx64>)"
+msgstr " Offset .debug_line: 0x%<PRIx64>\n"
 
-#: src/readelf.c:6375
-#, fuzzy, c-format
+#: src/readelf.c:7021
+#, c-format
 msgid "  extension opcode table, %<PRIu8> items:\n"
-msgstr " nieznana instrukcja z %<PRIu8> parametrem:"
+msgstr " tablica instrukcji rozszerzenia, %<PRIu8> elementów:\n"
 
-#: src/readelf.c:6382
+#: src/readelf.c:7028
 #, c-format
 msgid "    [%<PRIx8>]"
-msgstr ""
+msgstr "    [%<PRIx8>]"
 
-#: src/readelf.c:6394
-#, fuzzy, c-format
+#: src/readelf.c:7040
+#, c-format
 msgid " %<PRIu8> arguments:"
-msgstr "  [%*<PRIuFAST8>]  %hhu parametr\n"
+msgstr " Parametry %<PRIu8>:"
 
-#: src/readelf.c:6422
+#: src/readelf.c:7068
 #, c-format
 msgid " no arguments."
-msgstr ""
+msgstr " brak parametrów."
 
-#: src/readelf.c:6657
+#: src/readelf.c:7303
 #, c-format
 msgid "vendor opcode not verified?"
-msgstr ""
+msgstr "instrukcja producenta nie została sprawdzona?"
 
-#: src/readelf.c:6685
+#: src/readelf.c:7331
 #, 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:6726
+#: src/readelf.c:7372
 #, c-format
 msgid ""
 "\n"
@@ -5631,12 +5823,12 @@ msgstr ""
 "Sekcja DWARF [%2zu] \"%s\" pod offsetem %#<PRIx64>:\n"
 " %*s  Ciąg\n"
 
-#: src/readelf.c:6740
+#: src/readelf.c:7386
 #, c-format
 msgid " *** error while reading strings: %s\n"
 msgstr " *** błąd podczas odczytywania ciągów: %s\n"
 
-#: src/readelf.c:6760
+#: src/readelf.c:7406
 #, c-format
 msgid ""
 "\n"
@@ -5645,7 +5837,7 @@ msgstr ""
 "\n"
 "Sekcja tabeli wyszukiwania ramki wywołania [%2zu] \".eh_frame_hdr\":\n"
 
-#: src/readelf.c:6862
+#: src/readelf.c:7508
 #, c-format
 msgid ""
 "\n"
@@ -5654,22 +5846,22 @@ msgstr ""
 "\n"
 "Sekcja tabeli obsługiwania wyjątków [%2zu] \".gcc_except_table\":\n"
 
-#: src/readelf.c:6885
+#: src/readelf.c:7531
 #, c-format
 msgid " LPStart encoding:    %#x "
 msgstr " Kodowanie LPStart:    %#x "
 
-#: src/readelf.c:6897
+#: src/readelf.c:7543
 #, c-format
 msgid " TType encoding:      %#x "
 msgstr " Kodowanie TType:      %#x "
 
-#: src/readelf.c:6911
+#: src/readelf.c:7557
 #, c-format
 msgid " Call site encoding:  %#x "
 msgstr " Kodowanie strony wywołania:  %#x "
 
-#: src/readelf.c:6924
+#: src/readelf.c:7570
 msgid ""
 "\n"
 " Call site table:"
@@ -5677,7 +5869,7 @@ msgstr ""
 "\n"
 " Tabela strony wywołania:"
 
-#: src/readelf.c:6938
+#: src/readelf.c:7584
 #, c-format
 msgid ""
 " [%4u] Call site start:   %#<PRIx64>\n"
@@ -5690,97 +5882,97 @@ msgstr ""
 "        Lądowisko:                 %#<PRIx64>\n"
 "        Działanie:                 %u\n"
 
-#: src/readelf.c:6998
+#: src/readelf.c:7644
 #, c-format
 msgid "invalid TType encoding"
 msgstr "nieprawidłowe kodowanie TType"
 
-#: src/readelf.c:7019
-#, fuzzy, c-format
+#: src/readelf.c:7665
+#, c-format
 msgid ""
 "\n"
 "GDB section [%2zu] '%s' at offset %#<PRIx64> contains %<PRId64> bytes :\n"
 msgstr ""
 "\n"
-"Sekcja DWARF [%2zu] \"%s\" pod offsetem %#<PRIx64> zawiera %zu wpis:\n"
+"Sekcja GDB [%2zu] \"%s\" pod offsetem %#<PRIx64> zawiera %<PRId64> bajtów:\n"
 
-#: src/readelf.c:7048
-#, fuzzy, c-format
+#: src/readelf.c:7694
+#, c-format
 msgid " Version:         %<PRId32>\n"
-msgstr "      %s: %<PRId64>\n"
+msgstr " Wersja:         %<PRId32>\n"
 
-#: src/readelf.c:7064
-#, fuzzy, c-format
+#: src/readelf.c:7712
+#, c-format
 msgid " CU offset:       %#<PRIx32>\n"
-msgstr " (offset: %#<PRIx64>)"
+msgstr " offset CU:       %#<PRIx32>\n"
 
-#: src/readelf.c:7071
-#, fuzzy, c-format
+#: src/readelf.c:7719
+#, c-format
 msgid " TU offset:       %#<PRIx32>\n"
-msgstr " (offset: %#<PRIx64>)"
+msgstr " offset TU:       %#<PRIx32>\n"
 
-#: src/readelf.c:7078
-#, fuzzy, c-format
+#: src/readelf.c:7726
+#, c-format
 msgid " address offset:  %#<PRIx32>\n"
-msgstr " (kończący offset: %#<PRIx64>)"
+msgstr " offset adresu:  %#<PRIx32>\n"
 
-#: src/readelf.c:7085
-#, fuzzy, c-format
+#: src/readelf.c:7733
+#, c-format
 msgid " symbol offset:   %#<PRIx32>\n"
-msgstr " (offset: %#<PRIx64>)"
+msgstr " offset symbolu:   %#<PRIx32>\n"
 
-#: src/readelf.c:7092
-#, fuzzy, c-format
+#: src/readelf.c:7740
+#, c-format
 msgid " constant offset: %#<PRIx32>\n"
-msgstr " (kończący offset: %#<PRIx64>)"
+msgstr " offset stałej: %#<PRIx32>\n"
 
-#: src/readelf.c:7099
-#, fuzzy, c-format
+#: src/readelf.c:7747
+#, c-format
 msgid ""
 "\n"
 " CU list at offset %#<PRIx32> contains %zu entries:\n"
 msgstr ""
 "\n"
-"Sekcja DWARF [%2zu] \"%s\" pod offsetem %#<PRIx64> zawiera %zu wpis:\n"
+" Lista CU pod offsetem %#<PRIx32> zawiera %zu wpisów:\n"
 
-#: src/readelf.c:7121
-#, fuzzy, c-format
+#: src/readelf.c:7769
+#, c-format
 msgid ""
 "\n"
 " TU list at offset %#<PRIx32> contains %zu entries:\n"
 msgstr ""
 "\n"
-"Sekcja DWARF [%2zu] \"%s\" pod offsetem %#<PRIx64> zawiera %zu wpis:\n"
+" Lista TU pod offsetem %#<PRIx32> zawiera %zu wpisów:\n"
 
-#: src/readelf.c:7147
-#, fuzzy, c-format
+#: src/readelf.c:7795
+#, c-format
 msgid ""
 "\n"
 " Address list at offset %#<PRIx32> contains %zu entries:\n"
 msgstr ""
 "\n"
-"Sekcja DWARF [%2zu] \"%s\" pod offsetem %#<PRIx64> zawiera %zu wpis:\n"
+" Lista adresów pod offsetem %#<PRIx32> zawiera %zu wpisów:\n"
 
-#: src/readelf.c:7174
-#, fuzzy, c-format
+#: src/readelf.c:7824
+#, c-format
 msgid ""
 "\n"
 " Symbol table at offset %#<PRIx32> contains %zu slots:\n"
 msgstr ""
 "\n"
-"Nieprawidłowa tabela symboli pod offsetem %#0<PRIx64>\n"
+" Tabela symboli pod offsetem %#<PRIx32> zawiera %zu gniazd:\n"
 
-#: src/readelf.c:7259
+#: src/readelf.c:7909
 #, c-format
 msgid "cannot get debug context descriptor: %s"
 msgstr "nie można uzyskać deskryptora kontekstu debugowania: %s"
 
-#: src/readelf.c:7409 src/readelf.c:8010
+#: src/readelf.c:8069 src/readelf.c:8675 src/readelf.c:8786 src/readelf.c:8844
 #, c-format
 msgid "cannot convert core note data: %s"
 msgstr "nie można przekonwertować danych notatki core: %s"
 
-#: src/readelf.c:7750
+#: src/readelf.c:8416
 #, c-format
 msgid ""
 "\n"
@@ -5789,21 +5981,21 @@ msgstr ""
 "\n"
 "%*s... <powtarza się jeszcze %u razy>..."
 
-#: src/readelf.c:8109
+#: src/readelf.c:8919
 msgid "  Owner          Data size  Type\n"
 msgstr "  Właściciel     Rozmiar danych  Typ\n"
 
-#: src/readelf.c:8127
+#: src/readelf.c:8937
 #, c-format
 msgid "  %-13.*s  %9<PRId32>  %s\n"
 msgstr "  %-13.*s  %9<PRId32>  %s\n"
 
-#: src/readelf.c:8161
+#: src/readelf.c:8987
 #, c-format
 msgid "cannot get content of note section: %s"
 msgstr "nie można uzyskać zawartości sekcji notatki: %s"
 
-#: src/readelf.c:8188
+#: src/readelf.c:9014
 #, c-format
 msgid ""
 "\n"
@@ -5813,7 +6005,7 @@ msgstr ""
 "Segment notatki [%2zu] \"%s\" o długości %<PRIu64> bajtów pod offsetem "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:8211
+#: src/readelf.c:9037
 #, c-format
 msgid ""
 "\n"
@@ -5822,7 +6014,7 @@ msgstr ""
 "\n"
 "Segment notatki o długości %<PRIu64> bajtów pod offsetem %#0<PRIx64>:\n"
 
-#: src/readelf.c:8257
+#: src/readelf.c:9083
 #, c-format
 msgid ""
 "\n"
@@ -5831,12 +6023,12 @@ msgstr ""
 "\n"
 "Sekcja [%Zu] \"%s\" nie posiada danych do zrzucenia.\n"
 
-#: src/readelf.c:8263 src/readelf.c:8286
+#: src/readelf.c:9089 src/readelf.c:9112
 #, 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:8267
+#: src/readelf.c:9093
 #, c-format
 msgid ""
 "\n"
@@ -5846,7 +6038,7 @@ msgstr ""
 "Segment zrzutu szesnastkowego [%Zu] \"%s\", %<PRIu64> bajtów pod offsetem "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:8280
+#: src/readelf.c:9106
 #, c-format
 msgid ""
 "\n"
@@ -5855,7 +6047,7 @@ msgstr ""
 "\n"
 "Sekcja [%Zu] \"%s\" nie posiada ciągów do zrzucenia.\n"
 
-#: src/readelf.c:8290
+#: src/readelf.c:9116
 #, c-format
 msgid ""
 "\n"
@@ -5865,7 +6057,7 @@ msgstr ""
 "Sekcja ciągów [%Zu] \"%s\" zawiera %<PRIu64> bajtów pod offsetem "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:8338
+#: src/readelf.c:9164
 #, c-format
 msgid ""
 "\n"
@@ -5874,7 +6066,7 @@ msgstr ""
 "\n"
 "sekcja [%lu] nie istnieje"
 
-#: src/readelf.c:8367
+#: src/readelf.c:9193
 #, c-format
 msgid ""
 "\n"
@@ -5883,12 +6075,12 @@ msgstr ""
 "\n"
 "sekcja \"%s\" nie istnieje"
 
-#: src/readelf.c:8424
+#: src/readelf.c:9250
 #, c-format
 msgid "cannot get symbol index of archive '%s': %s"
 msgstr "nie można uzyskać indeksu symboli archiwum \"%s\": %s"
 
-#: src/readelf.c:8427
+#: src/readelf.c:9253
 #, c-format
 msgid ""
 "\n"
@@ -5897,7 +6089,7 @@ msgstr ""
 "\n"
 "Archiwum \"%s\" nie posiada indeksu symboli\n"
 
-#: src/readelf.c:8431
+#: src/readelf.c:9257
 #, c-format
 msgid ""
 "\n"
@@ -5906,12 +6098,12 @@ msgstr ""
 "\n"
 "Indeks archiwum \"%s\" posiada %Zu wpisów:\n"
 
-#: src/readelf.c:8449
+#: src/readelf.c:9275
 #, 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:8454
+#: src/readelf.c:9280
 #, c-format
 msgid "Archive member '%s' contains:\n"
 msgstr "Element archiwum \"%s\" zawiera:\n"
@@ -5975,12 +6167,12 @@ msgstr "Nieprawidłowa baza: %s"
 msgid "%s: file format not recognized"
 msgstr "%s: nie rozpoznano formatu pliku"
 
-#: src/size.c:438 src/size.c:581
+#: src/size.c:438 src/size.c:571
 #, c-format
 msgid " (ex %s)"
 msgstr " (ex %s)"
 
-#: src/size.c:606
+#: src/size.c:596
 msgid "(TOTALS)\n"
 msgstr "(CAŁKOWITE)\n"
 
@@ -6021,27 +6213,27 @@ msgstr "Alias dla --radix=o"
 msgid "Print the strings of printable characters in files."
 msgstr "Wyświetla ciągi znaków drukowalnych w plikach."
 
-#: src/strings.c:260 src/strings.c:295
+#: src/strings.c:267 src/strings.c:302
 #, c-format
 msgid "invalid value '%s' for %s parameter"
 msgstr "nieprawidłowa wartość \"%s\" dla parametru %s"
 
-#: src/strings.c:306
+#: src/strings.c:313
 #, c-format
 msgid "invalid minimum length of matched string size"
 msgstr "nieprawidłowa minimalna długość dopasowanego rozmiaru ciągu"
 
-#: src/strings.c:591
+#: src/strings.c:596
 #, c-format
 msgid "lseek64 failed"
 msgstr "lseek64 nie powiodło się"
 
-#: src/strings.c:608 src/strings.c:672
+#: src/strings.c:613 src/strings.c:677
 #, c-format
 msgid "re-mmap failed"
 msgstr "ponowne mmap nie powiodło się"
 
-#: src/strings.c:645
+#: src/strings.c:650
 #, c-format
 msgid "mprotect failed"
 msgstr "mprotect nie powiodło się"
@@ -6076,6 +6268,9 @@ msgid ""
 "sections are placed in a debug file (only relevant for ET_REL files, "
 "operation is not reversable, needs -f)"
 msgstr ""
+"Rozwiązuje wszystkie proste relokacje między sekcjami debugowania, jeśli "
+"usunięte sekcje zostały umieszczone w pliku debugowania (ma znaczenie tylko "
+"dla plików ET_REL, działanie jest nieodwracalne, wymaga użycia opcji -f)"
 
 #: src/strip.c:85
 msgid "Remove .comment section"
@@ -6092,7 +6287,7 @@ msgstr "Odrzuca symbole z plików obiektów."
 #: src/strip.c:181
 #, c-format
 msgid "--reloc-debug-sections used without -f"
-msgstr ""
+msgstr "Użyto --reloc-debug-sections bez opcji -f"
 
 #: src/strip.c:195
 #, c-format
@@ -6109,7 +6304,7 @@ msgstr "Opcję -f podano dwukrotnie"
 msgid "-F option specified twice"
 msgstr "Opcję -F podano dwukrotnie"
 
-#: src/strip.c:249 src/unstrip.c:117
+#: src/strip.c:249 src/unstrip.c:121
 #, c-format
 msgid "-o option specified twice"
 msgstr "Opcję -o podano dwukrotnie"
@@ -6134,87 +6329,87 @@ msgstr "podczas otwierania \"%s\""
 msgid "%s: cannot use -o or -f when stripping archive"
 msgstr "%s: nie można używać -o lub -f podczas okrajania archiwum"
 
-#: src/strip.c:467
+#: src/strip.c:468
 #, c-format
 msgid "cannot open EBL backend"
 msgstr "nie można otworzyć zaplecza EBL"
 
-#: src/strip.c:517 src/strip.c:541
+#: src/strip.c:518 src/strip.c:542
 #, c-format
 msgid "cannot create new file '%s': %s"
 msgstr "nie można utworzyć nowego pliku \"%s\": %s"
 
-#: src/strip.c:601
+#: src/strip.c:608
 #, c-format
 msgid "illformed file '%s'"
 msgstr "plik \"%s\" posiada błędny format"
 
-#: src/strip.c:905 src/strip.c:994
+#: src/strip.c:930 src/strip.c:1019
 #, c-format
 msgid "while generating output file: %s"
 msgstr "podczas tworzenia pliku wyjściowego: %s"
 
-#: src/strip.c:967 src/strip.c:1929
+#: src/strip.c:992 src/strip.c:1957
 #, c-format
 msgid "%s: error while creating ELF header: %s"
 msgstr "%s: błąd podczas tworzenia nagłówka ELF: %s"
 
-#: src/strip.c:981
+#: src/strip.c:1006
 #, c-format
 msgid "while preparing output for '%s'"
 msgstr "podczas przygotowywania wyjścia dla \"%s\""
 
-#: src/strip.c:1032 src/strip.c:1088
+#: src/strip.c:1057 src/strip.c:1114
 #, c-format
 msgid "while create section header section: %s"
 msgstr "podczas tworzenia sekcji nagłówka sekcji: %s"
 
-#: src/strip.c:1038
+#: src/strip.c:1063
 #, c-format
 msgid "cannot allocate section data: %s"
 msgstr "nie można przydzielić danych sekcji: %s"
 
-#: src/strip.c:1097
+#: src/strip.c:1123
 #, c-format
 msgid "while create section header string table: %s"
 msgstr "podczas tworzenia tabeli ciągów nagłówka sekcji: %s"
 
-#: src/strip.c:1724
-#, fuzzy, c-format
+#: src/strip.c:1752
+#, c-format
 msgid "bad relocation"
-msgstr "Wyświetla relokacje"
+msgstr "błędna relokacja"
 
-#: src/strip.c:1841 src/strip.c:1951
+#: src/strip.c:1869 src/strip.c:1979
 #, c-format
 msgid "while writing '%s': %s"
 msgstr "podczas zapisywania \"%s\": %s"
 
-#: src/strip.c:1852
+#: src/strip.c:1880
 #, c-format
 msgid "while creating '%s'"
 msgstr "podczas tworzenia \"%s\""
 
-#: src/strip.c:1874
+#: src/strip.c:1902
 #, c-format
 msgid "while computing checksum for debug information"
 msgstr "podczas obliczania sumy kontrolnej dla informacji debugowania"
 
-#: src/strip.c:1937
+#: src/strip.c:1965
 #, c-format
 msgid "%s: error while reading the file: %s"
 msgstr "%s: błąd podczas odczytywania pliku: %s"
 
-#: src/strip.c:1976 src/strip.c:1996
+#: src/strip.c:2004 src/strip.c:2024
 #, c-format
 msgid "while writing '%s'"
 msgstr "podczas zapisywania \"%s\""
 
-#: src/strip.c:2030 src/strip.c:2037
+#: src/strip.c:2061 src/strip.c:2068
 #, c-format
 msgid "error while finishing '%s': %s"
 msgstr "błąd podczas kończenia \"%s\": %s"
 
-#: src/strip.c:2060 src/strip.c:2117
+#: src/strip.c:2091 src/strip.c:2148
 #, c-format
 msgid "cannot set access and modification date of '%s'"
 msgstr "nie można ustawić czasu dostępu i modyfikacji \"%s\""
@@ -6251,209 +6446,213 @@ msgstr "Zastosowuje relokacje do zawartości sekcji w plikach ET_REL"
 
 #: src/unstrip.c:84
 msgid "Only list module and file names, build IDs"
-msgstr "Wyświetla tylko nazwy modułów i plików, identyfikatory budowania"
+msgstr "Wyświetla tylko nazwy modułów i plików, identyfikatory kopii"
 
-#: src/unstrip.c:126
+#: src/unstrip.c:86
+msgid "Force combining files even if some ELF headers don't seem to match"
+msgstr ""
+
+#: src/unstrip.c:130
 #, c-format
 msgid "-d option specified twice"
 msgstr "opcję -d podano dwukrotnie"
 
-#: src/unstrip.c:158
+#: src/unstrip.c:165
 #, c-format
 msgid "only one of -o or -d allowed"
 msgstr "dozwolona jest tylko jedna z opcji -o lub -d"
 
-#: src/unstrip.c:167
+#: src/unstrip.c:174
 #, c-format
 msgid "-n cannot be used with explicit files or -o or -d"
 msgstr "opcja -n nie może być używana z jawnymi plikami albo z opcją -o lub -d"
 
-#: src/unstrip.c:182
+#: src/unstrip.c:189
 #, c-format
 msgid "output directory '%s'"
 msgstr "katalog wyjściowy \"%s\""
 
-#: src/unstrip.c:191
+#: src/unstrip.c:198
 #, c-format
 msgid "exactly two file arguments are required"
 msgstr "wymagane są dokładnie dwa parametry plików"
 
-#: src/unstrip.c:197
+#: src/unstrip.c:204
 #, c-format
 msgid "-m, -a, -R, and -i options not allowed with explicit files"
 msgstr "opcje -m, -a, -R oraz -i nie są dozwolone z jawnymi plikami"
 
-#: src/unstrip.c:210
+#: src/unstrip.c:217
 #, c-format
 msgid "-o or -d is required when using implicit files"
 msgstr "opcja -o lub -d jest wymagana podczas używania ukrytych plików"
 
-#: src/unstrip.c:246
+#: src/unstrip.c:253
 #, c-format
 msgid "cannot create ELF header: %s"
 msgstr "nie można utworzyć nagłówka ELF: %s"
 
-#: src/unstrip.c:251
+#: src/unstrip.c:258
 #, c-format
 msgid "cannot copy ELF header: %s"
 msgstr "nie można skopiować nagłówka ELF: %s"
 
-#: src/unstrip.c:256 src/unstrip.c:1820
+#: src/unstrip.c:263 src/unstrip.c:1828
 #, c-format
 msgid "cannot create program headers: %s"
 msgstr "nie można utworzyć nagłówków programu: %s"
 
-#: src/unstrip.c:262
+#: src/unstrip.c:269
 #, c-format
 msgid "cannot copy program header: %s"
 msgstr "nie można skopiować nagłówka programu: %s"
 
-#: src/unstrip.c:272
+#: src/unstrip.c:279
 #, c-format
 msgid "cannot copy section header: %s"
 msgstr "nie można skopiować nagłówka sekcji: %s"
 
-#: src/unstrip.c:275 src/unstrip.c:1501
+#: src/unstrip.c:282 src/unstrip.c:1509
 #, c-format
 msgid "cannot get section data: %s"
 msgstr "nie można uzyskać danych sekcji: %s"
 
-#: src/unstrip.c:277 src/unstrip.c:1503
+#: src/unstrip.c:284 src/unstrip.c:1511
 #, c-format
 msgid "cannot copy section data: %s"
 msgstr "nie można skopiować danych sekcji: %s"
 
-#: src/unstrip.c:301
+#: src/unstrip.c:308
 #, c-format
 msgid "cannot create directory '%s'"
 msgstr "nie można utworzyć katalogu \"%s\""
 
-#: src/unstrip.c:341 src/unstrip.c:758 src/unstrip.c:1535
+#: src/unstrip.c:348 src/unstrip.c:765 src/unstrip.c:1543
 #, c-format
 msgid "cannot get symbol table entry: %s"
 msgstr "nie można uzyskać wpisu tabeli symboli: %s"
 
-#: src/unstrip.c:357 src/unstrip.c:575 src/unstrip.c:596 src/unstrip.c:608
-#: src/unstrip.c:1556 src/unstrip.c:1686 src/unstrip.c:1710
+#: src/unstrip.c:364 src/unstrip.c:582 src/unstrip.c:603 src/unstrip.c:615
+#: src/unstrip.c:1564 src/unstrip.c:1694 src/unstrip.c:1718
 #, c-format
 msgid "cannot update symbol table: %s"
 msgstr "nie można zaktualizować tabeli symboli: %s"
 
-#: src/unstrip.c:367
+#: src/unstrip.c:374
 #, c-format
 msgid "cannot update section header: %s"
 msgstr "nie można zaktualizować nagłówka sekcji: %s"
 
-#: src/unstrip.c:406 src/unstrip.c:417
+#: src/unstrip.c:413 src/unstrip.c:424
 #, c-format
 msgid "cannot update relocation: %s"
 msgstr "nie można zaktualizować relokacji: %s"
 
-#: src/unstrip.c:504
+#: src/unstrip.c:511
 #, c-format
 msgid "cannot get symbol version: %s"
 msgstr "nie można uzyskać wersji symbolu: %s"
 
-#: src/unstrip.c:516
+#: src/unstrip.c:523
 #, 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:764
+#: src/unstrip.c:771
 #, c-format
 msgid "invalid string offset in symbol [%Zu]"
 msgstr "nieprawidłowy offset ciągu w symbolu [%Zu]"
 
-#: src/unstrip.c:906 src/unstrip.c:1246
+#: src/unstrip.c:913 src/unstrip.c:1254
 #, c-format
 msgid "cannot read section [%Zu] name: %s"
 msgstr "nie można odczytać nazwy sekcji [%Zu]: %s"
 
-#: src/unstrip.c:947 src/unstrip.c:966 src/unstrip.c:999
+#: src/unstrip.c:954 src/unstrip.c:973 src/unstrip.c:1006
 #, c-format
 msgid "cannot read '.gnu.prelink_undo' section: %s"
 msgstr "nie można odczytać sekcji \".gnu.prelink_undo\": %s"
 
-#: src/unstrip.c:987
+#: src/unstrip.c:994
 #, c-format
 msgid "invalid contents in '%s' section"
 msgstr "nieprawidłowa zawartość w sekcji \"%s\""
 
-#: src/unstrip.c:1042 src/unstrip.c:1366
+#: src/unstrip.c:1049 src/unstrip.c:1374
 #, c-format
 msgid "cannot find matching section for [%Zu] '%s'"
 msgstr "nie można odnaleźć pasującej sekcji dla [%Zu] \"%s\""
 
-#: src/unstrip.c:1166 src/unstrip.c:1181 src/unstrip.c:1447
+#: src/unstrip.c:1174 src/unstrip.c:1189 src/unstrip.c:1455
 #, 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:1190
+#: src/unstrip.c:1198
 #, 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:1217 src/unstrip.c:1221
+#: src/unstrip.c:1225 src/unstrip.c:1229
 #, 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:1225 src/unstrip.c:1229 src/unstrip.c:1462
+#: src/unstrip.c:1233 src/unstrip.c:1237 src/unstrip.c:1470
 #, c-format
 msgid "cannot get section count: %s"
 msgstr "nie można uzyskać licznika sekcji: %s"
 
-#: src/unstrip.c:1232
+#: src/unstrip.c:1240
 #, 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:1291 src/unstrip.c:1381
+#: src/unstrip.c:1299 src/unstrip.c:1389
 #, 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:1441
+#: src/unstrip.c:1449
 #, c-format
 msgid "cannot add new section: %s"
 msgstr "nie można dodać nowej sekcji: %s"
 
-#: src/unstrip.c:1543
+#: src/unstrip.c:1551
 #, c-format
 msgid "symbol [%Zu] has invalid section index"
 msgstr "symbol [%Zu] posiada nieprawidłowy indeks sekcji"
 
-#: src/unstrip.c:1781
+#: src/unstrip.c:1789
 #, c-format
 msgid "cannot read section data: %s"
 msgstr "nie można odczytać danych sekcji: %s"
 
-#: src/unstrip.c:1802
+#: src/unstrip.c:1810
 #, c-format
 msgid "cannot get ELF header: %s"
 msgstr "nie można uzyskać nagłówka ELF: %s"
 
-#: src/unstrip.c:1830
+#: src/unstrip.c:1838
 #, c-format
 msgid "cannot update program header: %s"
 msgstr "nie można zaktualizować nagłówka programu: %s"
 
-#: src/unstrip.c:1835 src/unstrip.c:1914
+#: src/unstrip.c:1843 src/unstrip.c:1922
 #, c-format
 msgid "cannot write output file: %s"
 msgstr "nie można zapisać pliku wyjściowego: %s"
 
-#: src/unstrip.c:1883
+#: src/unstrip.c:1891
 #, 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:1886
+#: src/unstrip.c:1894
 #, c-format
 msgid ""
 "DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
@@ -6461,58 +6660,77 @@ msgstr ""
 "Dane DWARF w \"%s\" nie zostały dostosowane do przesunięcia wczesnego "
 "konsolidowania; proszę rozważyć polecenie prelink -u"
 
-#: src/unstrip.c:1905 src/unstrip.c:1945 src/unstrip.c:1957 src/unstrip.c:2037
+#: src/unstrip.c:1913 src/unstrip.c:1964 src/unstrip.c:1976 src/unstrip.c:2062
 #, c-format
 msgid "cannot create ELF descriptor: %s"
 msgstr "nie można utworzyć deskryptora ELF: %s"
 
-#: src/unstrip.c:1963
-#, c-format
-msgid "'%s' and '%s' do not seem to match"
-msgstr "\"%s\" i \"%s\" nie zgadzają się"
+#: src/unstrip.c:1955
+msgid "WARNING: "
+msgstr ""
 
-#: src/unstrip.c:1994
+#: src/unstrip.c:1957
+msgid ", use --force"
+msgstr ""
+
+#: src/unstrip.c:1980
+msgid "ELF header identification (e_ident) different"
+msgstr ""
+
+#: src/unstrip.c:1983
+msgid "ELF header type (e_type) different"
+msgstr ""
+
+#: src/unstrip.c:1986
+msgid "ELF header machine type (e_machine) different"
+msgstr ""
+
+#: src/unstrip.c:1989
+msgid "stripped program header (e_phnum) smaller than unstripped"
+msgstr ""
+
+#: src/unstrip.c:2019
 #, 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:1998
+#: src/unstrip.c:2023
 #, 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:2013
+#: src/unstrip.c:2038
 #, 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:2017
+#: src/unstrip.c:2042
 #, 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:2030
+#: src/unstrip.c:2055
 #, c-format
 msgid "module '%s' file '%s' is not stripped"
 msgstr "moduł \"%s\" pliku \"%s\" nie został okrojony"
 
-#: src/unstrip.c:2061
+#: src/unstrip.c:2086
 #, 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:2194
+#: src/unstrip.c:2219
 #, c-format
 msgid "no matching modules found"
 msgstr "nie odnaleziono pasujących modułów"
 
-#: src/unstrip.c:2203
+#: src/unstrip.c:2228
 #, c-format
 msgid "matched more than one module"
 msgstr "pasuje więcej niż jeden moduł"
 
-#: src/unstrip.c:2250
+#: src/unstrip.c:2275
 msgid ""
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
@@ -6520,7 +6738,7 @@ msgstr ""
 "OKROJONY-PLIK PLIK-DEBUGOWANIA\n"
 "[MODUŁ...]"
 
-#: src/unstrip.c:2251
+#: src/unstrip.c:2276
 msgid ""
 "Combine stripped files with separate symbols and debug information.\vThe "
 "first form puts the result in DEBUG-FILE if -o was not given.\n"
@@ -6562,41 +6780,24 @@ msgstr ""
 "\n"
 "Używając opcji -n żadne pliki nie zostają zapisane, a jeden wiersz do "
 "standardowego wyjścia dla każdego modułu:\n"
-"\tPOCZĄTEK+ROZMIAR IDENTYFIKATOR-BUDOWANIA PLIK PLIK-DEBUGOWANIA NAZWA-"
-"MODUŁU\n"
+"\tPOCZĄTEK+ROZMIAR IDENTYFIKATOR-KOPII PLIK PLIK-DEBUGOWANIA NAZWA-MODUŁU\n"
 "POCZĄTEK i ROZMIAR są liczbami szesnastkowymi podającymi zakres adresów "
-"modułu. IDENTYFIKATOR-BUDOWANIA jest liczbą szesnastkową dla bitów "
-"identyfikatora budowania lub \"-\", jeśli identyfikator jest nieznany; "
-"liczba szesnastkowa może być uzupełniona @0xADRES podającym adres, gdzie "
-"znajduje się identyfikator, jeśli jest to wiadome. PLIK jest nazwą pliku "
+"modułu. IDENTYFIKATOR-KOPII jest liczbą szesnastkową dla bitów "
+"identyfikatora kopii lub \"-\", jeśli identyfikator jest nieznany; liczba "
+"szesnastkowa może być uzupełniona @0xADRES podającym adres, gdzie znajduje "
+"się identyfikator, jeśli jest to wiadome. PLIK jest nazwą pliku "
 "odnalezionego dla modułu lub \"-\", jeśli go nie odnaleziono lub \".\", "
 "jeśli obraz ELF jest dostępny, ale nie z żadnego nazwanego pliku. PLIK-"
 "DEBUGOWANIA jest nazwą oddzielnego pliku debuginfo lub \"-\", jeśli nie "
 "odnaleziono debuginfo lub \".\", jeśli PLIK zawiera informacje debugowania."
 
-#~ msgid "unknown tag %hx"
-#~ msgstr "nieznany znacznik %hx"
-
-#~ msgid "unknown user tag %hx"
-#~ msgstr "nieznany znacznik użytkownika %hx"
-
-#~ msgid "unknown attribute %hx"
-#~ msgstr "nieznany atrybut %hx"
-
-#~ msgid "unknown user attribute %hx"
-#~ msgstr "nieznany atrybut użytkownika %hx"
+#, fuzzy
+#~ msgid "cannot attach to process"
+#~ msgstr "nie można utworzyć drzewa wyszukiwania"
 
 #, fuzzy
-#~ msgid "unknown form %#<PRIx64>"
-#~ msgstr "nieznana forma %<PRIx64>"
-
-#~ msgid ""
-#~ "\n"
-#~ "\n"
-#~ "Symbols from %s[%s]:\n"
-#~ "\n"
-#~ msgstr ""
-#~ "\n"
-#~ "\n"
-#~ "Symbole z %s[%s]:\n"
-#~ "\n"
+#~ msgid "cannot attach to core"
+#~ msgstr "nie można utworzyć drzewa wyszukiwania"
+
+#~ msgid "'%s' and '%s' do not seem to match"
+#~ msgstr "\"%s\" i \"%s\" nie zgadzają się"
index 2667f2b..f1f4e04 100644 (file)
Binary files a/po/uk.gmo and b/po/uk.gmo differ
index 8f43a3a..37f4f2b 100644 (file)
--- a/po/uk.po
+++ b/po/uk.po
@@ -2,13 +2,13 @@
 # Copyright (C) 2010 Free Software Foundation, Inc.
 # This file is distributed under the same license as the elfutils package.
 #
-# Yuri Chornoivan <yurchor@ukr.net>, 2010, 2011, 2012.
+# Yuri Chornoivan <yurchor@ukr.net>, 2010, 2011, 2012, 2013.
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
-"POT-Creation-Date: 2012-08-27 20:34+0200\n"
-"PO-Revision-Date: 2012-08-11 17:59+0300\n"
+"POT-Creation-Date: 2014-08-27 11:26+0200\n"
+"PO-Revision-Date: 2013-10-09 17:50+0300\n"
 "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
 "Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
 "Language: uk\n"
@@ -19,18 +19,18 @@ msgstr ""
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 "X-Generator: Lokalize 1.5\n"
 
-#: lib/xmalloc.c:54 lib/xmalloc.c:68 lib/xmalloc.c:82 src/readelf.c:2842
-#: src/readelf.c:3181 src/unstrip.c:2090 src/unstrip.c:2298
+#: lib/xmalloc.c:54 lib/xmalloc.c:68 lib/xmalloc.c:82 src/readelf.c:3098
+#: src/readelf.c:3447 src/readelf.c:8018 src/unstrip.c:2115 src/unstrip.c:2323
 #, c-format
 msgid "memory exhausted"
 msgstr "пам’ять вичерпано"
 
-#: libasm/asm_error.c:65 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:49
+#: libasm/asm_error.c:65 libdw/dwarf_error.c:58 libdwfl/libdwflP.h:53
 #: libelf/elf_error.c:60
 msgid "no error"
 msgstr "без помилок"
 
-#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:51
+#: libasm/asm_error.c:66 libdw/dwarf_error.c:67 libdwfl/libdwflP.h:55
 #: libelf/elf_error.c:91
 msgid "out of memory"
 msgstr "нестача пам'яті"
@@ -69,7 +69,7 @@ msgstr "помилка під час спроби виведення даних"
 msgid "no backend support available"
 msgstr "підтримки серверів не передбачено"
 
-#: libasm/asm_error.c:84 libdw/dwarf_error.c:59 libdwfl/libdwflP.h:50
+#: libasm/asm_error.c:84 libdw/dwarf_error.c:59 libdwfl/libdwflP.h:54
 #: libelf/elf_error.c:63
 msgid "unknown error"
 msgstr "невідома помилка"
@@ -166,7 +166,7 @@ msgstr "некоректна версія DWARF"
 msgid "invalid directory index"
 msgstr "некоректний покажчик каталогу"
 
-#: libdw/dwarf_error.c:84 libdwfl/libdwflP.h:70
+#: libdw/dwarf_error.c:84 libdwfl/libdwflP.h:74
 msgid "address out of range"
 msgstr "некоректна адреса"
 
@@ -186,7 +186,7 @@ msgstr "некоректний номер рядка"
 msgid "invalid address range index"
 msgstr "некоректний індекс діапазону адрес"
 
-#: libdw/dwarf_error.c:89 libdwfl/libdwflP.h:71
+#: libdw/dwarf_error.c:89 libdwfl/libdwflP.h:75
 msgid "no matching address range"
 msgstr "не виявлено відповідного діапазону адрес"
 
@@ -210,7 +210,7 @@ msgstr "некоректний розділ CFI"
 msgid "no alternative debug link found"
 msgstr "альтернативного діагностичного посилання не знайдено"
 
-#: libdwfl/argp-std.c:46 src/unstrip.c:2240
+#: libdwfl/argp-std.c:46 src/unstrip.c:2265
 msgid "Input selection options:"
 msgstr "Вибір параметрів виведення даних:"
 
@@ -246,133 +246,193 @@ msgstr "Ядро з усіма модулями"
 msgid "Search path for separate debuginfo files"
 msgstr "Шукати у вказаному каталозі окремі файли debuginfo"
 
-#: libdwfl/argp-std.c:142
+#: libdwfl/argp-std.c:157
 msgid "only one of -e, -p, -k, -K, or --core allowed"
 msgstr ""
 "можна використовувати лише один за параметрів: -e, -p, -k, -K або --core"
 
-#: libdwfl/argp-std.c:202
-#, c-format
-msgid "cannot read ELF core file: %s"
-msgstr "не вдалося прочитати файл core ELF: %s"
-
-#: libdwfl/argp-std.c:220
-msgid "No modules recognized in core file"
-msgstr "Не вдалося виявити модулі у файлі core"
-
-#: libdwfl/argp-std.c:232
+#: libdwfl/argp-std.c:230
 msgid "cannot load kernel symbols"
 msgstr "не вдалося завантажити символи ядра"
 
-#: libdwfl/argp-std.c:236
+#: libdwfl/argp-std.c:234
 msgid "cannot find kernel modules"
 msgstr "не вдалося виявити модулі ядра"
 
-#: libdwfl/argp-std.c:250
+#: libdwfl/argp-std.c:251
 msgid "cannot find kernel or modules"
 msgstr "не вдалося виявити ядро або модулі"
 
-#: libdwfl/libdwflP.h:52
+#: libdwfl/argp-std.c:290
+#, c-format
+msgid "cannot read ELF core file: %s"
+msgstr "не вдалося прочитати файл core ELF: %s"
+
+#: libdwfl/argp-std.c:311
+msgid "No modules recognized in core file"
+msgstr "Не вдалося виявити модулі у файлі core"
+
+#: libdwfl/libdwflP.h:56
 msgid "See errno"
 msgstr "Див. errno"
 
-#: libdwfl/libdwflP.h:53
+#: libdwfl/libdwflP.h:57
 msgid "See elf_errno"
 msgstr "Див. elf_errno"
 
-#: libdwfl/libdwflP.h:54
+#: libdwfl/libdwflP.h:58
 msgid "See dwarf_errno"
 msgstr "Див. dwarf_errno"
 
-#: libdwfl/libdwflP.h:55
+#: libdwfl/libdwflP.h:59
 msgid "See ebl_errno (XXX missing)"
 msgstr "Див. ebl_errno (не виявлено XXX)"
 
-#: libdwfl/libdwflP.h:56
+#: libdwfl/libdwflP.h:60
 msgid "gzip decompression failed"
 msgstr "Помилка під час спроби видобування з gzip"
 
-#: libdwfl/libdwflP.h:57
+#: libdwfl/libdwflP.h:61
 msgid "bzip2 decompression failed"
 msgstr "Помилка під час спроби видобування з bzip2"
 
-#: libdwfl/libdwflP.h:58
+#: libdwfl/libdwflP.h:62
 msgid "LZMA decompression failed"
 msgstr "Помилка під час спроби видобування з LZMA"
 
-#: libdwfl/libdwflP.h:59
+#: libdwfl/libdwflP.h:63
 msgid "no support library found for machine"
 msgstr "у системі не виявлено бібліотеки підтримки"
 
-#: libdwfl/libdwflP.h:60
+#: libdwfl/libdwflP.h:64
 msgid "Callbacks missing for ET_REL file"
 msgstr "Немає зворотних викликів для файла ET_REL"
 
-#: libdwfl/libdwflP.h:61
+#: libdwfl/libdwflP.h:65
 msgid "Unsupported relocation type"
 msgstr "Непідтримуваний тип пересування"
 
-#: libdwfl/libdwflP.h:62
+#: libdwfl/libdwflP.h:66
 msgid "r_offset is bogus"
 msgstr "r_offset є фіктивним"
 
-#: libdwfl/libdwflP.h:63 libelf/elf_error.c:111 libelf/elf_error.c:171
+#: libdwfl/libdwflP.h:67 libelf/elf_error.c:111 libelf/elf_error.c:171
 msgid "offset out of range"
 msgstr "перевищення можливого зміщення"
 
-#: libdwfl/libdwflP.h:64
+#: libdwfl/libdwflP.h:68
 msgid "relocation refers to undefined symbol"
 msgstr "пересування посилається на невизначений символ."
 
-#: libdwfl/libdwflP.h:65
+#: libdwfl/libdwflP.h:69
 msgid "Callback returned failure"
 msgstr "Зворотним викликом повернуто помилку"
 
-#: libdwfl/libdwflP.h:66
+#: libdwfl/libdwflP.h:70
 msgid "No DWARF information found"
 msgstr "Не виявлено відомостей DWARF"
 
-#: libdwfl/libdwflP.h:67
+#: libdwfl/libdwflP.h:71
 msgid "No symbol table found"
 msgstr "Не виявлено таблиці символів"
 
-#: libdwfl/libdwflP.h:68
+#: libdwfl/libdwflP.h:72
 msgid "No ELF program headers"
 msgstr "Немає заголовків програми ELF"
 
-#: libdwfl/libdwflP.h:69
+#: libdwfl/libdwflP.h:73
 msgid "address range overlaps an existing module"
 msgstr "діапазон адрес перекриває існуючий модуль"
 
-#: libdwfl/libdwflP.h:72
+#: libdwfl/libdwflP.h:76
 msgid "image truncated"
 msgstr "образ обрізано"
 
-#: libdwfl/libdwflP.h:73
+#: libdwfl/libdwflP.h:77
 msgid "ELF file opened"
 msgstr "Відкритий файл ELF"
 
-#: libdwfl/libdwflP.h:74
+#: libdwfl/libdwflP.h:78
 msgid "not a valid ELF file"
 msgstr "не є коректним файлом ELF"
 
-#: libdwfl/libdwflP.h:75
+#: libdwfl/libdwflP.h:79
 msgid "cannot handle DWARF type description"
 msgstr "не вдалося обробити опис типу DWARF"
 
-#: libdwfl/libdwflP.h:76
+#: libdwfl/libdwflP.h:80
 msgid "ELF file does not match build ID"
 msgstr "Файл ELF не відповідає ідентифікатору збирання"
 
-#: libdwfl/libdwflP.h:77
+#: libdwfl/libdwflP.h:81
 msgid "corrupt .gnu.prelink_undo section data"
 msgstr "дані розділу «.gnu.prelink_undo» пошкоджено"
 
+#: libdwfl/libdwflP.h:82
+msgid "Internal error due to ebl"
+msgstr ""
+
+#: libdwfl/libdwflP.h:83
+msgid "Missing data in core file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:84
+#, fuzzy
+msgid "Invalid register"
+msgstr "некоректний параметр"
+
+#: libdwfl/libdwflP.h:85
+msgid "Error reading process memory"
+msgstr ""
+
+#: libdwfl/libdwflP.h:86
+msgid "Couldn't find architecture of any ELF"
+msgstr ""
+
+#: libdwfl/libdwflP.h:87
+msgid "Error parsing /proc filesystem"
+msgstr ""
+
+#: libdwfl/libdwflP.h:88
+#, fuzzy
+msgid "Invalid DWARF"
+msgstr "некоректний запис DWARF"
+
+#: libdwfl/libdwflP.h:89
+msgid "Unsupported DWARF"
+msgstr ""
+
+#: libdwfl/libdwflP.h:90
+msgid "Unable to find more threads"
+msgstr ""
+
+#: libdwfl/libdwflP.h:91
+msgid "Dwfl already has attached state"
+msgstr ""
+
+#: libdwfl/libdwflP.h:92
+msgid "Dwfl has no attached state"
+msgstr ""
+
+#: libdwfl/libdwflP.h:93
+msgid "Unwinding not supported for this architecture"
+msgstr ""
+
+#: libdwfl/libdwflP.h:94
+#, fuzzy
+msgid "Invalid argument"
+msgstr "некоректний параметр"
+
+#: libdwfl/libdwflP.h:95
+#, fuzzy
+msgid "Not an ET_CORE ELF file"
+msgstr "не є коректним файлом ELF"
+
 #: libebl/eblbackendname.c:42
 msgid "No backend"
 msgstr "Немає сервера"
 
-#: libebl/eblcorenotetypename.c:86 libebl/eblobjecttypename.c:57
+#: libebl/eblcorenotetypename.c:102 libebl/eblobjecttypename.c:57
 #: libebl/eblobjnotetypename.c:73 libebl/eblosabiname.c:77
 #: libebl/eblsectionname.c:89 libebl/eblsectiontypename.c:119
 #: libebl/eblsegmenttypename.c:83
@@ -412,7 +472,7 @@ msgstr " Семафор:   "
 #: libebl/eblobjnote.c:129
 #, c-format
 msgid "    Provider: "
-msgstr " остачальник: "
+msgstr " Ð\9fоÑ\81Ñ\82аÑ\87алÑ\8cник: "
 
 #: libebl/eblobjnote.c:131
 #, c-format
@@ -468,7 +528,7 @@ msgstr "некоректна розмірність вхідного парам
 msgid "invalid size of destination operand"
 msgstr "некоректна розмірність вихідного параметра"
 
-#: libelf/elf_error.c:87 src/readelf.c:4697
+#: libelf/elf_error.c:87 src/readelf.c:5190
 #, c-format
 msgid "invalid encoding"
 msgstr "некоректне кодування"
@@ -549,8 +609,8 @@ msgstr "невідповідність полів data/scn"
 msgid "invalid section header"
 msgstr "некоректний заголовок розділу"
 
-#: libelf/elf_error.c:187 src/readelf.c:6335 src/readelf.c:6780
-#: src/readelf.c:6881 src/readelf.c:7043
+#: libelf/elf_error.c:187 src/readelf.c:6980 src/readelf.c:7426
+#: src/readelf.c:7527 src/readelf.c:7689
 #, c-format
 msgid "invalid data"
 msgstr "некоректні дані"
@@ -615,31 +675,44 @@ msgid "Also show symbol or section names"
 msgstr "Показувати також назви символів та розділів"
 
 #: src/addr2line.c:64
+#, fuzzy
+msgid "Also show symbol and the section names"
+msgstr "Показувати також назви символів та розділів"
+
+#: src/addr2line.c:65
 msgid "Also show line table flags"
 msgstr "Показувати також прапорці рядків таблиці"
 
-#: src/addr2line.c:66
+#: src/addr2line.c:67
 msgid "Treat addresses as offsets relative to NAME section."
 msgstr "Вважати адреси зміщеннями відносно розділу НАЗВА."
 
-#: src/addr2line.c:68 src/elfcmp.c:72 src/findtextrel.c:67 src/nm.c:100
+#: src/addr2line.c:69
+msgid ""
+"Show all source locations that caused inline expansion of subroutines at the "
+"address."
+msgstr ""
+"Показати усі місця у початковому коді, у яких було виявлено вбудоване "
+"розгортання підпрограм за вказаною адресою."
+
+#: src/addr2line.c:72 src/elfcmp.c:72 src/findtextrel.c:67 src/nm.c:100
 #: src/strings.c:75
 msgid "Miscellaneous:"
 msgstr "Інше:"
 
-#: src/addr2line.c:77
+#: src/addr2line.c:81
 msgid ""
 "Locate source files and line information for ADDRs (in a.out by default)."
 msgstr "Шукати АДРЕСИ у файлах кодів та даних про рядки (типово, у a.out)."
 
-#: src/addr2line.c:81
+#: src/addr2line.c:85
 msgid "[ADDR...]"
 msgstr "[АДРЕСА...]"
 
-#: src/addr2line.c:181 src/ar.c:289 src/elfcmp.c:662 src/elflint.c:231
+#: src/addr2line.c:196 src/ar.c:289 src/elfcmp.c:662 src/elflint.c:235
 #: src/findtextrel.c:162 src/ld.c:949 src/nm.c:265 src/objdump.c:181
-#: src/ranlib.c:128 src/readelf.c:460 src/size.c:211 src/strings.c:219
-#: src/strip.c:213 src/unstrip.c:226
+#: src/ranlib.c:128 src/readelf.c:500 src/size.c:211 src/strings.c:226
+#: src/strip.c:213 src/unstrip.c:233
 #, c-format
 msgid ""
 "Copyright (C) %s Red Hat, Inc.\n"
@@ -651,30 +724,30 @@ msgstr ""
 "початкових кодах. Умовами ліцензування програми НЕ передбачено жодних "
 "гарантій, зокрема гарантій працездатності або придатності для певної мети.\n"
 
-#: src/addr2line.c:186 src/ar.c:294 src/elfcmp.c:667 src/elflint.c:236
+#: src/addr2line.c:201 src/ar.c:294 src/elfcmp.c:667 src/elflint.c:240
 #: src/findtextrel.c:167 src/ld.c:954 src/nm.c:270 src/objdump.c:186
-#: src/ranlib.c:133 src/readelf.c:465 src/size.c:216 src/strings.c:224
-#: src/strip.c:218 src/unstrip.c:231
+#: src/ranlib.c:133 src/readelf.c:505 src/size.c:216 src/strings.c:231
+#: src/strip.c:218 src/unstrip.c:238
 #, c-format
 msgid "Written by %s.\n"
 msgstr "Автор — %s.\n"
 
-#: src/addr2line.c:405
+#: src/addr2line.c:474
 #, c-format
 msgid "Section syntax requires exactly one module"
 msgstr "Синтаксис розділів вимагає точного одного модуля"
 
-#: src/addr2line.c:428
+#: src/addr2line.c:497
 #, c-format
 msgid "offset %#<PRIxMAX> lies outside section '%s'"
 msgstr "зміщення %#<PRIxMAX> розташовано поза межами розділу «%s»"
 
-#: src/addr2line.c:469
+#: src/addr2line.c:563
 #, c-format
 msgid "cannot find symbol '%s'"
 msgstr "не вдалося знайти символ «%s»"
 
-#: src/addr2line.c:474
+#: src/addr2line.c:568
 #, c-format
 msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
 msgstr "зміщення %#<PRIxMAX> розташовано поза межами вмісту «%s»"
@@ -1117,8 +1190,8 @@ msgstr "Некоректне значення «%s» параметра --gaps."
 
 #: src/elfcmp.c:722 src/findtextrel.c:221 src/ldgeneric.c:1757
 #: src/ldgeneric.c:4247 src/nm.c:381 src/ranlib.c:161 src/size.c:293
-#: src/strings.c:175 src/strip.c:450 src/strip.c:487 src/unstrip.c:1903
-#: src/unstrip.c:1932
+#: src/strings.c:182 src/strip.c:451 src/strip.c:488 src/unstrip.c:1911
+#: src/unstrip.c:1940
 #, c-format
 msgid "cannot open '%s'"
 msgstr "не вдалося відкрити «%s»"
@@ -1173,161 +1246,161 @@ msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
 msgstr ""
 "Педантична перевірка файлів ELF на сумісність зі специфікаціями gABI/psABI."
 
-#: src/elflint.c:78 src/readelf.c:113
+#: src/elflint.c:78 src/readelf.c:123
 msgid "FILE..."
 msgstr "ФАЙЛ..."
 
-#: src/elflint.c:151 src/readelf.c:271
+#: src/elflint.c:155 src/readelf.c:292
 #, c-format
 msgid "cannot open input file"
 msgstr "не вдалося відкрити вхідний файл."
 
-#: src/elflint.c:158
+#: src/elflint.c:162
 #, c-format
 msgid "cannot generate Elf descriptor: %s\n"
 msgstr "не вдалося створити дескриптор Elf: %s\n"
 
-#: src/elflint.c:177
+#: src/elflint.c:181
 #, c-format
 msgid "error while closing Elf descriptor: %s\n"
 msgstr "помилка під час спроби закриття дескриптора Elf: %s\n"
 
-#: src/elflint.c:181
+#: src/elflint.c:185
 msgid "No errors"
 msgstr "Без помилок"
 
-#: src/elflint.c:215 src/readelf.c:434
+#: src/elflint.c:219 src/readelf.c:468
 msgid "Missing file name.\n"
 msgstr "Не вказано назви файла.\n"
 
-#: src/elflint.c:294
+#: src/elflint.c:298
 #, c-format
 msgid " error while freeing sub-ELF descriptor: %s\n"
 msgstr " помилка під час спроби вивільнення дескриптора суб-ELF: %s\n"
 
-#: src/elflint.c:302
+#: src/elflint.c:306
 #, c-format
 msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
 msgstr "Не є файлом ELF. Виявлено помилкові магічні байти на початку файла\n"
 
-#: src/elflint.c:363
+#: src/elflint.c:371
 #, c-format
 msgid "e_ident[%d] == %d is no known class\n"
 msgstr "e_ident[%d] == %d не є відомим класом\n"
 
-#: src/elflint.c:368
+#: src/elflint.c:376
 #, c-format
 msgid "e_ident[%d] == %d is no known data encoding\n"
 msgstr "e_ident[%d] == %d не є відомим кодуванням даних\n"
 
-#: src/elflint.c:372
+#: src/elflint.c:380
 #, c-format
 msgid "unknown ELF header version number e_ident[%d] == %d\n"
 msgstr "невідомий номер версії заголовка ELF e_ident[%d] == %d\n"
 
-#: src/elflint.c:378
+#: src/elflint.c:386
 #, c-format
 msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
 msgstr "непідтримуване ABI ОС e_ident[%d] == «%s»\n"
 
-#: src/elflint.c:384
+#: src/elflint.c:392
 #, c-format
 msgid "unsupport ABI version e_ident[%d] == %d\n"
 msgstr "непідтримувана версія ABI e_ident[%d] == %d\n"
 
-#: src/elflint.c:389
+#: src/elflint.c:397
 #, c-format
 msgid "e_ident[%zu] is not zero\n"
 msgstr "e_ident[%zu] не дорівнює нулеві\n"
 
-#: src/elflint.c:394
+#: src/elflint.c:402
 #, c-format
 msgid "unknown object file type %d\n"
 msgstr "невідомий тип об’єктних файлів %d\n"
 
-#: src/elflint.c:401
+#: src/elflint.c:409
 #, c-format
 msgid "unknown machine type %d\n"
 msgstr "невідомий тип архітектури %d\n"
 
-#: src/elflint.c:405
+#: src/elflint.c:413
 #, c-format
 msgid "unknown object file version\n"
 msgstr "невідома версія об’єктних файлів\n"
 
-#: src/elflint.c:411
+#: src/elflint.c:419
 #, c-format
 msgid "invalid program header offset\n"
 msgstr "некоректне зміщення заголовка програми\n"
 
-#: src/elflint.c:413
+#: src/elflint.c:421
 #, c-format
 msgid "executables and DSOs cannot have zero program header offset\n"
 msgstr ""
 "виконувані файли і DSO не можуть містити заголовка програми з нульовим "
 "зміщенням\n"
 
-#: src/elflint.c:417
+#: src/elflint.c:425
 #, c-format
 msgid "invalid number of program header entries\n"
 msgstr "некоректна кількість записів заголовків програми\n"
 
-#: src/elflint.c:425
+#: src/elflint.c:433
 #, c-format
 msgid "invalid section header table offset\n"
 msgstr "некоректне зміщення таблиці заголовків розділів\n"
 
-#: src/elflint.c:428
+#: src/elflint.c:436
 #, c-format
 msgid "section header table must be present\n"
 msgstr "має бути вказано таблицю заголовків розділів\n"
 
-#: src/elflint.c:442
+#: src/elflint.c:450
 #, c-format
 msgid "invalid number of section header table entries\n"
 msgstr "некоректна кількість записів таблиці заголовків розділів\n"
 
-#: src/elflint.c:459
+#: src/elflint.c:467
 #, c-format
 msgid "invalid section header index\n"
 msgstr "некоректний індекс заголовка розділу\n"
 
-#: src/elflint.c:473
+#: src/elflint.c:481
 #, c-format
 msgid "invalid number of program header table entries\n"
 msgstr "некоректна кількість записів таблиці заголовків програми\n"
 
-#: src/elflint.c:482
+#: src/elflint.c:490
 #, c-format
 msgid "invalid machine flags: %s\n"
 msgstr "некоректні прапорці архітектури: %s\n"
 
-#: src/elflint.c:489 src/elflint.c:506
+#: src/elflint.c:497 src/elflint.c:514
 #, c-format
 msgid "invalid ELF header size: %hd\n"
 msgstr "некоректний розмір заголовка ELF: %hd\n"
 
-#: src/elflint.c:492 src/elflint.c:509
+#: src/elflint.c:500 src/elflint.c:517
 #, c-format
 msgid "invalid program header size: %hd\n"
 msgstr "некоректний розмір заголовка програми: %hd\n"
 
-#: src/elflint.c:495 src/elflint.c:512
+#: src/elflint.c:503 src/elflint.c:520
 #, c-format
 msgid "invalid program header position or size\n"
 msgstr "некоректне розташування або розмір заголовка програми\n"
 
-#: src/elflint.c:498 src/elflint.c:515
+#: src/elflint.c:506 src/elflint.c:523
 #, c-format
 msgid "invalid section header size: %hd\n"
 msgstr "некоректний розмір заголовка розділу: %hd\n"
 
-#: src/elflint.c:501 src/elflint.c:518
+#: src/elflint.c:509 src/elflint.c:526
 #, c-format
 msgid "invalid section header position or size\n"
 msgstr "некоректне розташування або розмір заголовка розділу\n"
 
-#: src/elflint.c:562
+#: src/elflint.c:570
 #, c-format
 msgid ""
 "section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
@@ -1336,7 +1409,7 @@ msgstr ""
 "розділ [%2d] «%s»: розділ з встановленим прапорцем SHF_GROUP не є частиною "
 "групи розділів\n"
 
-#: src/elflint.c:566
+#: src/elflint.c:574
 #, c-format
 msgid ""
 "section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
@@ -1344,14 +1417,14 @@ msgstr ""
 "розділ [%2d] «%s»: групу розділів [%2zu] «%s» мало бути визначено до розділу-"
 "елемента цієї групи\n"
 
-#: src/elflint.c:582 src/elflint.c:1426 src/elflint.c:1476 src/elflint.c:1581
-#: src/elflint.c:2166 src/elflint.c:2680 src/elflint.c:2841 src/elflint.c:2971
-#: src/elflint.c:3143 src/elflint.c:4045
+#: src/elflint.c:590 src/elflint.c:1457 src/elflint.c:1508 src/elflint.c:1614
+#: src/elflint.c:1939 src/elflint.c:2228 src/elflint.c:2742 src/elflint.c:2904
+#: src/elflint.c:3034 src/elflint.c:3206 src/elflint.c:4108
 #, c-format
 msgid "section [%2d] '%s': cannot get section data\n"
 msgstr "розділ [%2d] «%s»: не вдалося отримати дані розділу\n"
 
-#: src/elflint.c:595 src/elflint.c:1588
+#: src/elflint.c:603 src/elflint.c:1621
 #, c-format
 msgid ""
 "section [%2d] '%s': referenced as string table for section [%2d] '%s' but "
@@ -1360,7 +1433,7 @@ msgstr ""
 "розділ [%2d] «%s»: надано посилання на таблицю рядків розділу [%2d] «%s», "
 "але типом даних не є SHT_STRTAB\n"
 
-#: src/elflint.c:618
+#: src/elflint.c:626
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol table cannot have more than one extended index "
@@ -1369,38 +1442,38 @@ msgstr ""
 "розділ [%2d] «%s»: у таблиці символів не може бути більше одного розширеного "
 "розділу покажчика\n"
 
-#: src/elflint.c:629
+#: src/elflint.c:638
 #, c-format
 msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
 msgstr "розділ [%2u] «%s»: розмірність запису не відповідає ElfXX_Sym\n"
 
-#: src/elflint.c:638
+#: src/elflint.c:647
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
 msgstr "розділ [%2d] «%s»: не вдалося отримати символ %d: %s\n"
 
-#: src/elflint.c:643 src/elflint.c:646 src/elflint.c:649 src/elflint.c:652
-#: src/elflint.c:655 src/elflint.c:658
+#: src/elflint.c:652 src/elflint.c:655 src/elflint.c:658 src/elflint.c:661
+#: src/elflint.c:664 src/elflint.c:667
 #, c-format
 msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
 msgstr "розділ [%2d] «%s»: «%s» у нульовому записі не є нулем\n"
 
-#: src/elflint.c:661
+#: src/elflint.c:670
 #, c-format
 msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
 msgstr "розділ [%2d] «%s»: XINDEX для нульового запису не є нулем\n"
 
-#: src/elflint.c:671
+#: src/elflint.c:680
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
 msgstr "розділ [%2d] «%s»: не вдалося отримати символ %zu: %s\n"
 
-#: src/elflint.c:680
+#: src/elflint.c:689
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
 msgstr "розділ [%2d] «%s»: символ %zu: некоректне значення назви\n"
 
-#: src/elflint.c:694
+#: src/elflint.c:704
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: too large section index but no extended "
@@ -1409,7 +1482,7 @@ msgstr ""
 "розділ [%2d] «%s»: символ %zu: занадто великий покажчик розділу за умови, що "
 "не визначено розділу розширеного покажчика розділів\n"
 
-#: src/elflint.c:700
+#: src/elflint.c:710
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
@@ -1418,29 +1491,29 @@ msgstr ""
 "розділ [%2d] «%s»: символ %zu: XINDEX використано для індексування, яке не "
 "відповідає st_shndx (%<PRIu32>)\n"
 
-#: src/elflint.c:712
+#: src/elflint.c:722
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
 msgstr "розділ [%2d] «%s»: символ %zu: некоректний індекс розділу\n"
 
-#: src/elflint.c:720
+#: src/elflint.c:730
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown type\n"
 msgstr "розділ [%2d] «%s»: символ %zu: невідомий тип\n"
 
-#: src/elflint.c:726
+#: src/elflint.c:736
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
 msgstr "розділ [%2d] «%s»: символ %zu: невідома прив’язка символу\n"
 
-#: src/elflint.c:731
+#: src/elflint.c:741
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
 msgstr ""
 "розділ [%2d] «%s»: символ %zu: унікальний символ, що не належить до типу "
 "об’єктів\n"
 
-#: src/elflint.c:739
+#: src/elflint.c:749
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
@@ -1448,14 +1521,14 @@ msgstr ""
 "розділ [%2d] «%s»: символ %zu: COMMON можна використовувати лише у файлах, "
 "придатних до пересування\n"
 
-#: src/elflint.c:743
+#: src/elflint.c:753
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
 msgstr ""
 "розділ [%2d] «%s»: символ %zu: використання локальних символів COMMON "
 "позбавлене сенсу\n"
 
-#: src/elflint.c:747
+#: src/elflint.c:757
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
@@ -1463,13 +1536,13 @@ msgstr ""
 "розділ [%2d] «%s»: символ %zu: використання функції у розділі COMMON "
 "позбавлене сенсу\n"
 
-#: src/elflint.c:779
+#: src/elflint.c:804
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
 msgstr ""
 "розділ [%2d] «%s»: символ %zu: значення st_value поза можливим діапазоном\n"
 
-#: src/elflint.c:785 src/elflint.c:810 src/elflint.c:853
+#: src/elflint.c:810 src/elflint.c:835 src/elflint.c:878
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu does not fit completely in referenced section "
@@ -1478,7 +1551,7 @@ msgstr ""
 "розділ [%2d] «%s»: символ %zu не повністю відповідає розділу, на який "
 "посилається, [%2d] «%s»\n"
 
-#: src/elflint.c:794
+#: src/elflint.c:819
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
@@ -1487,7 +1560,7 @@ msgstr ""
 "розділ [%2d] «%s»: символ %zu: для розділу посилання [%2d] «%s» не "
 "встановлено прапорець SHF_TLS\n"
 
-#: src/elflint.c:804 src/elflint.c:846
+#: src/elflint.c:829 src/elflint.c:871
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
@@ -1496,14 +1569,14 @@ msgstr ""
 "розділ [%2d] «%s»: символ %zu: значення st_value поза межами розділу "
 "посилання, [%2d] «%s»\n"
 
-#: src/elflint.c:831
+#: src/elflint.c:856
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
 msgstr ""
 "розділ [%2d] «%s»: символ %zu: символ TLS без запису заголовка програми TLS\n"
 
-#: src/elflint.c:839
+#: src/elflint.c:864
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] "
@@ -1512,7 +1585,7 @@ msgstr ""
 "розділ [%2d] «%s»: символ %zu: значення st_value перед розділом посилання, "
 "[%2d] «%s»\n"
 
-#: src/elflint.c:866
+#: src/elflint.c:891
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: local symbol outside range described in "
@@ -1521,7 +1594,7 @@ msgstr ""
 "розділ [%2d] «%s»: символ %zu: у sh_info описано локальний символ поза "
 "діапазоном\n"
 
-#: src/elflint.c:873
+#: src/elflint.c:898
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
@@ -1530,12 +1603,12 @@ msgstr ""
 "розділ [%2d] «%s»: символ %zu: у sh_info описано нелокальний символ поза "
 "діапазоном\n"
 
-#: src/elflint.c:880
+#: src/elflint.c:905
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
 msgstr "розділ [%2d] «%s»: символ %zu: нелокальний символ розділу\n"
 
-#: src/elflint.c:930
+#: src/elflint.c:955
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section "
@@ -1544,7 +1617,7 @@ msgstr ""
 "розділ [%2d] «%s»: символ _GLOBAL_OFFSET_TABLE_  посилається на помилковий "
 "розділ, [%2d]\n"
 
-#: src/elflint.c:937
+#: src/elflint.c:962
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] "
@@ -1553,7 +1626,7 @@ msgstr ""
 "розділ [%2d] «%s»: символ _GLOBAL_OFFSET_TABLE_  посилається на розділ [%2d] "
 "'%s'\n"
 
-#: src/elflint.c:953
+#: src/elflint.c:978
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
@@ -1562,7 +1635,7 @@ msgstr ""
 "розділ [%2d] «%s»: значення символу _GLOBAL_OFFSET_TABLE_ %#<PRIx64> не "
 "відповідає адресі розділу %s %#<PRIx64>\n"
 
-#: src/elflint.c:960
+#: src/elflint.c:985
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
@@ -1571,7 +1644,7 @@ msgstr ""
 "розділ [%2d] «%s»: розмір символу _GLOBAL_OFFSET_TABLE_ %<PRIu64> не "
 "відповідає розміру розділу %s %<PRIu64>\n"
 
-#: src/elflint.c:968
+#: src/elflint.c:993
 #, c-format
 msgid ""
 "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
@@ -1580,7 +1653,7 @@ msgstr ""
 "розділ [%2d] «%s»: виявлено символ _GLOBAL_OFFSET_TABLE_, але не виявлено "
 "розділу .got\n"
 
-#: src/elflint.c:984
+#: src/elflint.c:1009
 #, c-format
 msgid ""
 "section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
@@ -1589,7 +1662,7 @@ msgstr ""
 "розділ [%2d] «%s»: значення символу _DYNAMIC_ %#<PRIx64> не відповідає "
 "адресі динамічного сегмента %#<PRIx64>\n"
 
-#: src/elflint.c:991
+#: src/elflint.c:1016
 #, c-format
 msgid ""
 "section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
@@ -1598,7 +1671,7 @@ msgstr ""
 "розділ [%2d] «%s»: розмір символу _DYNAMIC %<PRIu64> не відповідає розміру "
 "динамічного сегмента %<PRIu64>\n"
 
-#: src/elflint.c:1004
+#: src/elflint.c:1029
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
@@ -1607,24 +1680,24 @@ msgstr ""
 "розділ [%2d] «%s»: символ %zu: символ у динамічній таблиці символів з "
 "нетиповою видимістю\n"
 
-#: src/elflint.c:1008
+#: src/elflint.c:1033
 #, c-format
 msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
 msgstr "розділ [%2d] «%s»: символ %zu: невідомий набір бітів у st_other\n"
 
-#: src/elflint.c:1053
+#: src/elflint.c:1082
 #, c-format
 msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
 msgstr "розділ [%2d] «%s»: для цього розділу RELA використано DT_RELCOUNT\n"
 
-#: src/elflint.c:1062 src/elflint.c:1114
+#: src/elflint.c:1093 src/elflint.c:1145
 #, c-format
 msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
 msgstr ""
 "розділ [%2d] «%s»: значення DT_RELCOUNT %d є занадто високим для цього "
 "розділу\n"
 
-#: src/elflint.c:1087 src/elflint.c:1139
+#: src/elflint.c:1118 src/elflint.c:1170
 #, c-format
 msgid ""
 "section [%2d] '%s': relative relocations after index %d as specified by "
@@ -1633,7 +1706,7 @@ msgstr ""
 "розділ [%2d] «%s»: відносні пересування після позиції %d, вказаної за "
 "допомогою DT_RELCOUNT\n"
 
-#: src/elflint.c:1093 src/elflint.c:1145
+#: src/elflint.c:1124 src/elflint.c:1176
 #, c-format
 msgid ""
 "section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
@@ -1642,51 +1715,51 @@ msgstr ""
 "розділ [%2d] «%s»: безвідносне пересування на позиції %zu; DT_RELCOUNT "
 "визначено %d відносних пересування\n"
 
-#: src/elflint.c:1105
+#: src/elflint.c:1136
 #, c-format
 msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
 msgstr "розділ [%2d] «%s»: для цього розділу REL використано DT_RELACOUNT\n"
 
-#: src/elflint.c:1187
+#: src/elflint.c:1218
 #, c-format
 msgid "section [%2d] '%s': invalid destination section index\n"
 msgstr "розділ [%2d] «%s»: некоректний індекс розділу призначення\n"
 
-#: src/elflint.c:1200
+#: src/elflint.c:1230
 #, c-format
 msgid "section [%2d] '%s': invalid destination section type\n"
 msgstr "розділ [%2d] «%s»: некоректний тип розділу призначення\n"
 
-#: src/elflint.c:1208
+#: src/elflint.c:1238
 #, c-format
 msgid "section [%2d] '%s': sh_info should be zero\n"
 msgstr "розділ [%2d] «%s»: sh_info має бути нульовим\n"
 
-#: src/elflint.c:1215
+#: src/elflint.c:1245
 #, c-format
 msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
 msgstr ""
 "розділ [%2d] «%s»: пересування у придатних до об’єднання розділах неможливе\n"
 
-#: src/elflint.c:1222
+#: src/elflint.c:1253
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
 msgstr ""
 "розділ [%2d] «%s»: розмірність запису розділу не відповідає ElfXX_Rela\n"
 
-#: src/elflint.c:1282
+#: src/elflint.c:1313
 #, c-format
 msgid "text relocation flag set but there is no read-only segment\n"
 msgstr ""
 "встановлено прапорець пересування тексту, але сегмент придатний лише до "
 "читання\n"
 
-#: src/elflint.c:1309
+#: src/elflint.c:1340
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: invalid type\n"
 msgstr "розділ [%2d] «%s»: пересування %zu: некоректний тип\n"
 
-#: src/elflint.c:1317
+#: src/elflint.c:1348
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: relocation type invalid for the file "
@@ -1695,12 +1768,12 @@ msgstr ""
 "розділ [%2d] «%s»: пересування %zu: некоректний тип пересування для типу "
 "файла\n"
 
-#: src/elflint.c:1325
+#: src/elflint.c:1356
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
 msgstr "розділ [%2d] «%s»: пересування %zu: некоректний індекс символу\n"
 
-#: src/elflint.c:1343
+#: src/elflint.c:1374
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
@@ -1709,12 +1782,12 @@ msgstr ""
 "розділ [%2d] «%s»: пересування %zu: з %s можна використовувати лише символ "
 "«_GLOBAL_OFFSET_TABLE_»\n"
 
-#: src/elflint.c:1360
+#: src/elflint.c:1391
 #, c-format
 msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
 msgstr "розділ [%2d] «%s»: пересування %zu: зміщення за межі діапазону\n"
 
-#: src/elflint.c:1375
+#: src/elflint.c:1406
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: copy relocation against symbol of type "
@@ -1723,7 +1796,7 @@ msgstr ""
 "розділ [%2d] «%s»: пересування %zu: пересування копіювання для символу типу "
 "%s\n"
 
-#: src/elflint.c:1396
+#: src/elflint.c:1427
 #, c-format
 msgid ""
 "section [%2d] '%s': relocation %zu: read-only section modified but text "
@@ -1732,61 +1805,61 @@ msgstr ""
 "розділ [%2d] «%s»: пересування %zu: змінено придатний лише для читання "
 "розділ, але не встановлено прапорець пересування тексту\n"
 
-#: src/elflint.c:1411
+#: src/elflint.c:1442
 #, c-format
 msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
 msgstr "розділ [%2d] «%s»: пересування завантажених і незавантажених даних\n"
 
-#: src/elflint.c:1450 src/elflint.c:1500
+#: src/elflint.c:1482 src/elflint.c:1533
 #, c-format
 msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
 msgstr "розділ [%2d] «%s»: не вдалося отримати зміщення %zu: %s\n"
 
-#: src/elflint.c:1576
+#: src/elflint.c:1609
 #, c-format
 msgid "more than one dynamic section present\n"
 msgstr "вказано більше одного динамічного розділу\n"
 
-#: src/elflint.c:1594
+#: src/elflint.c:1628
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
 msgstr ""
 "розділ [%2d] «%s»: розмірність запису розділу не відповідає ElfXX_Dyn\n"
 
-#: src/elflint.c:1599 src/elflint.c:1882
+#: src/elflint.c:1633 src/elflint.c:1918
 #, c-format
 msgid "section [%2d] '%s': sh_info not zero\n"
 msgstr "розділ [%2d] «%s»: sh_info не є нульовим\n"
 
-#: src/elflint.c:1609
+#: src/elflint.c:1643
 #, c-format
 msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
 msgstr ""
 "розділ [%2d] «%s»: не вдалося отримати запис динамічного розділу %zu: %s\n"
 
-#: src/elflint.c:1617
+#: src/elflint.c:1651
 #, c-format
 msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
 msgstr ""
 "розділ [%2d] «%s»: за записом DT_NULL вказано записи, що не належать до "
 "DT_NULL\n"
 
-#: src/elflint.c:1624
+#: src/elflint.c:1658
 #, c-format
 msgid "section [%2d] '%s': entry %zu: unknown tag\n"
 msgstr "розділ [%2d] «%s»: запис %zu: невідома мітка\n"
 
-#: src/elflint.c:1635
+#: src/elflint.c:1669
 #, c-format
 msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
 msgstr "розділ [%2d] «%s»: запис %zu: декілька записів з міткою %s\n"
 
-#: src/elflint.c:1645
+#: src/elflint.c:1679
 #, c-format
 msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
 msgstr "розділ [%2d] «%s»: запис %zu: використано мітку рівня 2 %s\n"
 
-#: src/elflint.c:1663
+#: src/elflint.c:1697
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
@@ -1794,7 +1867,7 @@ msgstr ""
 "розділ [%2d] «%s»: запис %zu: значенням DT_PLTREL має бути DT_REL або "
 "DT_RELA\n"
 
-#: src/elflint.c:1676
+#: src/elflint.c:1710
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: pointer does not match address of section "
@@ -1803,7 +1876,7 @@ msgstr ""
 "розділ [%2d] «%s»: розділ %zu: вказівник не відповідає адресі розділу [%2d] "
 "«%s», на яку посилається sh_link\n"
 
-#: src/elflint.c:1719
+#: src/elflint.c:1753
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
@@ -1811,7 +1884,7 @@ msgstr ""
 "розділ [%2d] «%s»: запис %zu: значення %s має вказувати на завантажений "
 "сегмент\n"
 
-#: src/elflint.c:1734
+#: src/elflint.c:1768
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %zu: %s value must be valid offset in section "
@@ -1820,48 +1893,48 @@ msgstr ""
 "розділ [%2d] «%s»: запис %zu: значенням %s має бути коректне зміщення у "
 "розділі [%2d] «%s»\n"
 
-#: src/elflint.c:1754 src/elflint.c:1782
+#: src/elflint.c:1788 src/elflint.c:1816
 #, c-format
 msgid "section [%2d] '%s': contains %s entry but not %s\n"
 msgstr "розділ [%2d] «%s»: містить запис %s, але не %s\n"
 
-#: src/elflint.c:1766
+#: src/elflint.c:1800
 #, c-format
 msgid "section [%2d] '%s': mandatory tag %s not present\n"
 msgstr "розділ [%2d] «%s»: немає обов’язкової мітки %s\n"
 
-#: src/elflint.c:1775
+#: src/elflint.c:1809
 #, c-format
 msgid "section [%2d] '%s': no hash section present\n"
 msgstr "розділ [%2d] «%s»: не виявлено розділу хешів\n"
 
-#: src/elflint.c:1790 src/elflint.c:1797
+#: src/elflint.c:1824 src/elflint.c:1831
 #, c-format
 msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
 msgstr "розділ [%2d] «%s»: вказано не всі зі значень %s, %s і %s\n"
 
-#: src/elflint.c:1807 src/elflint.c:1811
+#: src/elflint.c:1841 src/elflint.c:1845
 #, c-format
 msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
 msgstr ""
 "розділ [%2d] «%s»: у DSO, позначеному на кроці попереднього компонування, "
 "немає мітки %s\n"
 
-#: src/elflint.c:1817
+#: src/elflint.c:1851
 #, c-format
 msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
 msgstr ""
 "розділ [%2d] «%s»: під час попереднього компонування як залежність позначено "
 "файл, який не є файлом DSO\n"
 
-#: src/elflint.c:1828 src/elflint.c:1832 src/elflint.c:1836 src/elflint.c:1840
+#: src/elflint.c:1862 src/elflint.c:1866 src/elflint.c:1870 src/elflint.c:1874
 #, c-format
 msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
 msgstr ""
 "розділ [%2d] «%s»: у попередньо скомпонованому виконуваному файлі не "
 "міститься мітки %s\n"
 
-#: src/elflint.c:1852
+#: src/elflint.c:1886
 #, c-format
 msgid ""
 "section [%2d] '%s': only relocatable files can have extended section index\n"
@@ -1869,7 +1942,7 @@ msgstr ""
 "розділ [%2d] «%s»: розширений розділ покажчика можуть мати лише файли, "
 "придатні до пересування\n"
 
-#: src/elflint.c:1862
+#: src/elflint.c:1896
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index section not for symbol table\n"
@@ -1877,23 +1950,23 @@ msgstr ""
 "розділ [%2d] «%s»: розділ розширеного покажчика розділів не призначено для "
 "таблиць символів\n"
 
-#: src/elflint.c:1867
+#: src/elflint.c:1901
 #, c-format
 msgid "cannot get data for symbol section\n"
 msgstr "не вдалося отримати дані для розділу символів\n"
 
-#: src/elflint.c:1870
+#: src/elflint.c:1904
 #, c-format
 msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
 msgstr "розділ [%2d] «%s»: розмірність запису не відповідає Elf32_Word\n"
 
-#: src/elflint.c:1877
+#: src/elflint.c:1913
 #, c-format
 msgid "section [%2d] '%s': extended index table too small for symbol table\n"
 msgstr ""
 "розділ [%2d] «%s»: розширена таблиця покажчика замала для таблиці символів\n"
 
-#: src/elflint.c:1892
+#: src/elflint.c:1928
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
@@ -1902,24 +1975,24 @@ msgstr ""
 "розділ [%2d] «%s»: розширений покажчик розділів у розділі [%2zu] «%s» "
 "посилається на ту саму таблицю розділів\n"
 
-#: src/elflint.c:1903
+#: src/elflint.c:1945
 #, c-format
 msgid "symbol 0 should have zero extended section index\n"
 msgstr "символу 0 має відповідати нульовий індекс розширеного розділу\n"
 
-#: src/elflint.c:1915
+#: src/elflint.c:1957
 #, c-format
 msgid "cannot get data for symbol %zu\n"
 msgstr "не вдалося отримати дані для символу %zu\n"
 
-#: src/elflint.c:1920
+#: src/elflint.c:1962
 #, c-format
 msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
 msgstr ""
 "індекс розширеного розділу дорівнює %<PRIu32>, але індекс символу не є "
 "XINDEX\n"
 
-#: src/elflint.c:1936 src/elflint.c:1977
+#: src/elflint.c:1978 src/elflint.c:2029
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
@@ -1927,51 +2000,51 @@ msgstr ""
 "розділ [%2d] «%s»: розділ таблиці хешів занадто малий (розмір %ld, мало бути "
 "— %ld)\n"
 
-#: src/elflint.c:1948 src/elflint.c:1989
+#: src/elflint.c:1990 src/elflint.c:2041
 #, c-format
 msgid "section [%2d] '%s': chain array too large\n"
 msgstr "розділ [%2d] «%s»: масив ланцюжка занадто великий\n"
 
-#: src/elflint.c:1957 src/elflint.c:1998
+#: src/elflint.c:2004 src/elflint.c:2055
 #, c-format
 msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
 msgstr ""
 "розділ [%2d] «%s»: посилання на хеш блоку %zu лежить поза межами діапазону\n"
 
-#: src/elflint.c:1963
+#: src/elflint.c:2014
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
 msgstr ""
 "розділ [%2d] «%s»: посилання ланцюжка хешів %zu лежить поза межами "
 "діапазону\n"
 
-#: src/elflint.c:2004
+#: src/elflint.c:2065
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
 msgstr ""
 "розділ [%2d] «%s»: посилання ланцюжка хешів %<PRIu64> лежить поза межами "
 "діапазону\n"
 
-#: src/elflint.c:2019
+#: src/elflint.c:2081
 #, c-format
 msgid "section [%2d] '%s': bitmask size not power of 2: %u\n"
 msgstr "розділ [%2d] «%s»: розмір бітової маски не є степенем 2: %u\n"
 
-#: src/elflint.c:2030
-#, c-format
+#: src/elflint.c:2092
+#, fuzzy, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected at "
-"least%ld)\n"
+"least %ld)\n"
 msgstr ""
 "розділ [%2d] «%s»: розділ таблиці хешів занадто малий (розмір %ld, мало бути "
 "не менше %ld)\n"
 
-#: src/elflint.c:2038
+#: src/elflint.c:2100
 #, c-format
 msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
 msgstr "розділ [%2d] «%s»: зсув 2-ої функції хешування занадто великий: %u\n"
 
-#: src/elflint.c:2070
+#: src/elflint.c:2132
 #, c-format
 msgid ""
 "section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
@@ -1979,7 +2052,7 @@ msgstr ""
 "розділ [%2d] '%s': ланцюжок хешів для блоку %zu розташовано нижче за позицію "
 "відхилення індексу символу\n"
 
-#: src/elflint.c:2091
+#: src/elflint.c:2153
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
@@ -1988,7 +2061,7 @@ msgstr ""
 "розділ [%2d] «%s»: символ %u, на який посилається ланцюжок у блоці %zu не "
 "визначено\n"
 
-#: src/elflint.c:2102
+#: src/elflint.c:2164
 #, c-format
 msgid ""
 "section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
@@ -1996,14 +2069,14 @@ msgstr ""
 "розділ [%2d] «%s»: значення хешу для символу %u у ланцюжку для блоку %zu є "
 "помилковим\n"
 
-#: src/elflint.c:2133
+#: src/elflint.c:2195
 #, c-format
 msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
 msgstr ""
 "розділ [%2d] «%s»: ланцюжок хешів для блоку %zu лежить поза межами "
 "діапазону\n"
 
-#: src/elflint.c:2138
+#: src/elflint.c:2200
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
@@ -2011,36 +2084,36 @@ msgstr ""
 "розділ [%2d] «%s»: посилання на символ у ланцюжку для блоку %zu лежить поза "
 "межами діапазону\n"
 
-#: src/elflint.c:2144
+#: src/elflint.c:2206
 #, c-format
 msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
 msgstr "розділ [%2d] «%s»: бітова маска не відповідає назвам у таблиці хешів\n"
 
-#: src/elflint.c:2157
+#: src/elflint.c:2219
 #, c-format
 msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
 msgstr ""
 "розділ [%2d] «%s»: придатні до пересування файли не можуть містити таблиць "
 "хешів\n"
 
-#: src/elflint.c:2175
+#: src/elflint.c:2237
 #, c-format
 msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
 msgstr ""
 "розділ [%2d] «%s»: таблицю хешів не призначено для зберігання таблиці "
 "динамічних символів\n"
 
-#: src/elflint.c:2183
+#: src/elflint.c:2245
 #, c-format
 msgid "section [%2d] '%s': hash table entry size incorrect\n"
 msgstr "розділ [%2d] «%s»: розмірність запису таблиці хешів є некоректною\n"
 
-#: src/elflint.c:2188
+#: src/elflint.c:2250
 #, c-format
 msgid "section [%2d] '%s': not marked to be allocated\n"
 msgstr "розділ [%2d] «%s»: не позначено для пересування\n"
 
-#: src/elflint.c:2193
+#: src/elflint.c:2255
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table has not even room for initial administrative "
@@ -2049,17 +2122,17 @@ msgstr ""
 "розділ [%2d] «%s»: у таблиці хешів виявлено незвичайне розташування "
 "початкових адміністративних записів\n"
 
-#: src/elflint.c:2241
+#: src/elflint.c:2303
 #, c-format
 msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
 msgstr "sh_link у розділах хешів [%2zu] «%s» і [%2zu] «%s» не збігаються\n"
 
-#: src/elflint.c:2319 src/elflint.c:2323
+#: src/elflint.c:2381 src/elflint.c:2385
 #, c-format
 msgid "section [%2zu] '%s': reference to symbol index 0\n"
 msgstr "розділ [%2zu] «%s»: посилання на індекс символів 0\n"
 
-#: src/elflint.c:2330
+#: src/elflint.c:2392
 #, c-format
 msgid ""
 "symbol %d referenced in new hash table in [%2zu] '%s' but not in old hash "
@@ -2068,7 +2141,7 @@ msgstr ""
 "виявлено посилання на символ %d у новій таблиці хешів у [%2zu] «%s», але "
 "його немає у старій таблиці хешів у [%2zu] «%s»\n"
 
-#: src/elflint.c:2342
+#: src/elflint.c:2404
 #, c-format
 msgid ""
 "symbol %d referenced in old hash table in [%2zu] '%s' but not in new hash "
@@ -2077,12 +2150,12 @@ msgstr ""
 "виявлено посилання на символ %d у старій таблиці хешів у [%2zu] «%s», але "
 "його немає у новій таблиці хешів у [%2zu] «%s»\n"
 
-#: src/elflint.c:2358
+#: src/elflint.c:2420
 #, c-format
 msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
 msgstr "розділ [%2d] «%s»: ненульове значення sh_%s для розділу NULL\n"
 
-#: src/elflint.c:2378
+#: src/elflint.c:2440
 #, c-format
 msgid ""
 "section [%2d] '%s': section groups only allowed in relocatable object files\n"
@@ -2090,90 +2163,90 @@ msgstr ""
 "розділ [%2d] «%s»: групи розділів передбачено лише для придатних до "
 "пересування об’єктних файлах\n"
 
-#: src/elflint.c:2389
+#: src/elflint.c:2451
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol table: %s\n"
 msgstr "розділ [%2d] «%s»: не вдалося отримати таблицю символів: %s\n"
 
-#: src/elflint.c:2394
+#: src/elflint.c:2456
 #, c-format
 msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
 msgstr ""
 "розділ [%2d] «%s»: посилання на розділ у sh_link не має таблиці символів\n"
 
-#: src/elflint.c:2400
+#: src/elflint.c:2462
 #, c-format
 msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
 msgstr "розділ [%2d] «%s»: некоректний індекс символу у sh_info\n"
 
-#: src/elflint.c:2405
+#: src/elflint.c:2467
 #, c-format
 msgid "section [%2d] '%s': sh_flags not zero\n"
 msgstr "розділ [%2d] «%s»: sh_flags не є нульовим\n"
 
-#: src/elflint.c:2412
+#: src/elflint.c:2474
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol for signature\n"
 msgstr "розділ [%2d] «%s»: не вдалося отримати символ для підпису\n"
 
-#: src/elflint.c:2417
+#: src/elflint.c:2479
 #, c-format
 msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
 msgstr "розділ [%2d] «%s»: символ підпису не може бути порожнім рядком\n"
 
-#: src/elflint.c:2423
+#: src/elflint.c:2485
 #, c-format
 msgid "section [%2d] '%s': sh_flags not set correctly\n"
 msgstr "розділ [%2d] «%s»: для sh_flags встановлено помилкове значення\n"
 
-#: src/elflint.c:2429
+#: src/elflint.c:2491
 #, c-format
 msgid "section [%2d] '%s': cannot get data: %s\n"
 msgstr "розділ [%2d] «%s»: не вдалося отримати дані: %s\n"
 
-#: src/elflint.c:2438
+#: src/elflint.c:2500
 #, c-format
 msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
 msgstr "розділ [%2d] «%s»: розмір розділу не є кратним до sizeof(Elf32_Word)\n"
 
-#: src/elflint.c:2443
+#: src/elflint.c:2505
 #, c-format
 msgid "section [%2d] '%s': section group without flags word\n"
 msgstr "розділ [%2d] «%s»: група розділів без значення типу word прапорців\n"
 
-#: src/elflint.c:2449
+#: src/elflint.c:2511
 #, c-format
 msgid "section [%2d] '%s': section group without member\n"
 msgstr "розділ [%2d] «%s»: група розділів без елементів\n"
 
-#: src/elflint.c:2453
+#: src/elflint.c:2515
 #, c-format
 msgid "section [%2d] '%s': section group with only one member\n"
 msgstr "розділ [%2d] «%s»: група розділів, що містить лише один елемент\n"
 
-#: src/elflint.c:2464
+#: src/elflint.c:2526
 #, c-format
 msgid "section [%2d] '%s': unknown section group flags\n"
 msgstr "розділ [%2d] «%s»: невідомі прапорці групи розділів\n"
 
-#: src/elflint.c:2476
+#: src/elflint.c:2538
 #, c-format
 msgid "section [%2d] '%s': section index %Zu out of range\n"
 msgstr "розділ [%2d] «%s»: індекс розділу %Zu поза межами діапазону\n"
 
-#: src/elflint.c:2485
+#: src/elflint.c:2547
 #, c-format
 msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
 msgstr ""
 "розділ [%2d] «%s»: не вдалося отримати заголовок розділу для елемента %zu: "
 "%s\n"
 
-#: src/elflint.c:2492
+#: src/elflint.c:2554
 #, c-format
 msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
 msgstr "розділ [%2d] «%s»: група розділів містить іншу групу [%2d] «%s»\n"
 
-#: src/elflint.c:2498
+#: src/elflint.c:2560
 #, c-format
 msgid ""
 "section [%2d] '%s': element %Zu references section [%2d] '%s' without "
@@ -2182,12 +2255,12 @@ msgstr ""
 "розділ [%2d] «%s»: елемент %Zu посилається на розділ [%2d] «%s» без "
 "встановленого прапорця SHF_GROUP\n"
 
-#: src/elflint.c:2505
+#: src/elflint.c:2567
 #, c-format
 msgid "section [%2d] '%s' is contained in more than one section group\n"
 msgstr "розділ [%2d] «%s» міститься у більше ніж одній групі розділів\n"
 
-#: src/elflint.c:2694
+#: src/elflint.c:2756
 #, c-format
 msgid ""
 "section [%2d] '%s' refers in sh_link to section [%2d] '%s' which is no "
@@ -2196,7 +2269,7 @@ msgstr ""
 "розділ [%2d] «%s» посилається у sh_link на розділ [%2d] «%s», який не має "
 "динамічної таблиці символів\n"
 
-#: src/elflint.c:2705
+#: src/elflint.c:2768
 #, c-format
 msgid ""
 "section [%2d] '%s' has different number of entries than symbol table [%2d] "
@@ -2205,28 +2278,28 @@ msgstr ""
 "кількість записів у розділі [%2d] «%s» відрізняється від кількості у таблиці "
 "символів [%2d] «%s»\n"
 
-#: src/elflint.c:2721
+#: src/elflint.c:2784
 #, c-format
 msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
 msgstr "розділ [%2d] «%s»: символ %d: не вдалося прочитати дані щодо версії\n"
 
-#: src/elflint.c:2737
+#: src/elflint.c:2800
 #, c-format
 msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
 msgstr ""
 "розділ [%2d] «%s»: символ %d: локальний символ у загальному контексті\n"
 
-#: src/elflint.c:2745
+#: src/elflint.c:2808
 #, c-format
 msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
 msgstr "розділ [%2d] «%s»: символ %d: локальний символ з версією\n"
 
-#: src/elflint.c:2759
+#: src/elflint.c:2822
 #, c-format
 msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
 msgstr "розділ [%2d] «%s»: символ %d: некоректний індекс версії %d\n"
 
-#: src/elflint.c:2764
+#: src/elflint.c:2827
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: version index %d is for defined version\n"
@@ -2234,7 +2307,7 @@ msgstr ""
 "розділ [%2d] «%s»: символ %d: індекси версії %d призначено до визначеної "
 "версії\n"
 
-#: src/elflint.c:2774
+#: src/elflint.c:2837
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: version index %d is for requested version\n"
@@ -2242,45 +2315,45 @@ msgstr ""
 "розділ [%2d] «%s»: символ %d: індекс версії %d призначено для версії, на яку "
 "надійшов запит\n"
 
-#: src/elflint.c:2826
+#: src/elflint.c:2889
 #, c-format
 msgid "more than one version reference section present\n"
 msgstr "виявлено більше за один розділ посилань на версії\n"
 
-#: src/elflint.c:2834 src/elflint.c:2963
+#: src/elflint.c:2897 src/elflint.c:3026
 #, c-format
 msgid "section [%2d] '%s': sh_link does not link to string table\n"
 msgstr "розділ [%2d] «%s»: sh_link не посилається на таблицю рядків\n"
 
-#: src/elflint.c:2857 src/elflint.c:3015
+#: src/elflint.c:2920 src/elflint.c:3078
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong version %d\n"
 msgstr "розділ [%2d] «%s»: запис %d має помилкову версію %d\n"
 
-#: src/elflint.c:2863 src/elflint.c:3021
+#: src/elflint.c:2926 src/elflint.c:3084
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
 msgstr ""
 "розділ [%2d] «%s»: запис %d містить помилкове зміщення у допоміжних даних\n"
 
-#: src/elflint.c:2871
+#: src/elflint.c:2934
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid file reference\n"
 msgstr "розділ [%2d] «%s»: запис %d містить некоректне посилання на файл\n"
 
-#: src/elflint.c:2879
+#: src/elflint.c:2942
 #, c-format
 msgid "section [%2d] '%s': entry %d references unknown dependency\n"
 msgstr "розділ [%2d] «%s»: запис %d посилається на невідому залежність\n"
 
-#: src/elflint.c:2891
+#: src/elflint.c:2954
 #, c-format
 msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
 msgstr ""
 "розділ [%2d] «%s»: допоміжний запис %d запису %d позначено невідомим "
 "прапорцем\n"
 
-#: src/elflint.c:2898
+#: src/elflint.c:2961
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
@@ -2289,7 +2362,7 @@ msgstr ""
 "розділ [%2d] «%s»: допоміжний запис %d запису %d містить некоректне "
 "посилання на назву\n"
 
-#: src/elflint.c:2905
+#: src/elflint.c:2968
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: "
@@ -2298,7 +2371,7 @@ msgstr ""
 "розділ [%2d] «%s»: допоміжний запис %d запису %d має помилкове значення "
 "хешу: %#x, мало бути %#x\n"
 
-#: src/elflint.c:2915
+#: src/elflint.c:2978
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
@@ -2307,7 +2380,7 @@ msgstr ""
 "розділ [%2d] «%s»: допоміжний запис %d запису %d містить дублікати назви "
 "версії «%s»\n"
 
-#: src/elflint.c:2926
+#: src/elflint.c:2989
 #, c-format
 msgid ""
 "section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
@@ -2315,50 +2388,50 @@ msgstr ""
 "розділ [%2d] «%s»: допоміжний запис %d запису %d має помилкове наступне "
 "поле\n"
 
-#: src/elflint.c:2942 src/elflint.c:3100
+#: src/elflint.c:3005 src/elflint.c:3163
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
 msgstr ""
 "розділ [%2d] «%s»: запис %d має некоректне зміщення щодо наступного запису\n"
 
-#: src/elflint.c:2955
+#: src/elflint.c:3018
 #, c-format
 msgid "more than one version definition section present\n"
 msgstr "виявлено більше за один розділ визначення версій\n"
 
-#: src/elflint.c:3000
+#: src/elflint.c:3063
 #, c-format
 msgid "section [%2d] '%s': more than one BASE definition\n"
 msgstr "розділ [%2d] «%s»: повторне визначення BASE\n"
 
-#: src/elflint.c:3004
+#: src/elflint.c:3067
 #, c-format
 msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
 msgstr ""
 "розділ [%2d] «%s»: визначення BASE повинно мати індекс VER_NDX_GLOBAL\n"
 
-#: src/elflint.c:3010
+#: src/elflint.c:3073
 #, c-format
 msgid "section [%2d] '%s': entry %d has unknown flag\n"
 msgstr "розділ [%2d] «%s»: невідомий прапорець запису %d\n"
 
-#: src/elflint.c:3034
+#: src/elflint.c:3097
 #, c-format
 msgid "section [%2d] '%s': entry %d has invalid name reference\n"
 msgstr "розділ [%2d] «%s»: запис %d містить некоректне посилання на назву\n"
 
-#: src/elflint.c:3041
+#: src/elflint.c:3104
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
 msgstr ""
 "розділ [%2d] «%s»: запис %d має помилкове значення хешу: %#x, мало бути %#x\n"
 
-#: src/elflint.c:3050
+#: src/elflint.c:3113
 #, c-format
 msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
 msgstr "розділ [%2d] «%s»: запис %d містить дублікати назви версії «%s»\n"
 
-#: src/elflint.c:3069
+#: src/elflint.c:3132
 #, c-format
 msgid ""
 "section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
@@ -2366,53 +2439,53 @@ msgstr ""
 "розділ [%2d] «%s»: запис %d містить некоректне посилання на назву у "
 "допоміжних даних\n"
 
-#: src/elflint.c:3084
+#: src/elflint.c:3147
 #, c-format
 msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
 msgstr ""
 "розділ [%2d] «%s»: у допоміжних даних запису %d міститься помилкове поле "
 "наступного запису\n"
 
-#: src/elflint.c:3106
+#: src/elflint.c:3169
 #, c-format
 msgid "section [%2d] '%s': no BASE definition\n"
 msgstr "розділ [%2d] «%s»: немає визначення BASE\n"
 
-#: src/elflint.c:3122
+#: src/elflint.c:3185
 #, c-format
 msgid "section [%2d] '%s': unknown parent version '%s'\n"
 msgstr "розділ [%2d] «%s»: невідома основна версія «%s»\n"
 
-#: src/elflint.c:3135
+#: src/elflint.c:3198
 #, c-format
 msgid "section [%2d] '%s': empty object attributes section\n"
 msgstr "розділ [%2d] «%s»: порожній розділ атрибутів об’єкта\n"
 
-#: src/elflint.c:3156
+#: src/elflint.c:3219
 #, c-format
 msgid "section [%2d] '%s': unrecognized attribute format\n"
 msgstr "розділ [%2d] «%s»: не вдалося визначити формат атрибутів\n"
 
-#: src/elflint.c:3172
+#: src/elflint.c:3235
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
 msgstr ""
 "розділ [%2d] «%s»: зміщення %zu: поле нульового розміру у розділі атрибутів\n"
 
-#: src/elflint.c:3181
+#: src/elflint.c:3244
 #, c-format
 msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
 msgstr ""
 "розділ [%2d] «%s»: зміщення %zu: некоректна довжина у розділі атрибутів\n"
 
-#: src/elflint.c:3193
+#: src/elflint.c:3256
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
 msgstr ""
 "розділ [%2d] «%s»: зміщення %zu: незавершений рядок назви постачальника\n"
 
-#: src/elflint.c:3210
+#: src/elflint.c:3273
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
@@ -2420,12 +2493,12 @@ msgstr ""
 "розділ [%2d] «%s»: зміщення %zu: незавершене поле ULEB128 у тезі підрозділу "
 "атрибутів\n"
 
-#: src/elflint.c:3219
+#: src/elflint.c:3282
 #, c-format
 msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
 msgstr "розділ [%2d] «%s»: зміщення %zu: обрізаний розділ атрибутів\n"
 
-#: src/elflint.c:3228
+#: src/elflint.c:3291
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
@@ -2433,14 +2506,14 @@ msgstr ""
 "розділ [%2d] «%s»: зміщення %zu: поле нульового розміру у підрозділі "
 "атрибутів\n"
 
-#: src/elflint.c:3241
+#: src/elflint.c:3304
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
 msgstr ""
 "розділ [%2d] «%s»: зміщення %zu: некоректна довжина у підрозділі атрибутів\n"
 
-#: src/elflint.c:3252
+#: src/elflint.c:3315
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
@@ -2448,35 +2521,35 @@ msgstr ""
 "розділ [%2d] «%s»: зміщення %zu: підрозділ атрибутів містить неочікуваний "
 "теґ %u\n"
 
-#: src/elflint.c:3270
+#: src/elflint.c:3333
 #, c-format
 msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
 msgstr ""
 "розділ [%2d] «%s»: зміщення %zu: незавершене поле ULEB128 у тезі атрибуту\n"
 
-#: src/elflint.c:3281
+#: src/elflint.c:3344
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
 msgstr "розділ [%2d] «%s»: зміщення %zu: незавершений рядок у атрибуті\n"
 
-#: src/elflint.c:3294
+#: src/elflint.c:3357
 #, c-format
 msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
 msgstr "розділ [%2d] «%s»: зміщення %zu: незавершений теґ атрибуту %u\n"
 
-#: src/elflint.c:3298
+#: src/elflint.c:3361
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
 msgstr ""
 "розділ [%2d] «%s»: зміщення %zu: невідоме значення %s атрибуту %<PRIu64>\n"
 
-#: src/elflint.c:3308
+#: src/elflint.c:3371
 #, c-format
 msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
 msgstr "розділ [%2d] «%s»: зміщення %zu: невідомий постачальник «%s»\n"
 
-#: src/elflint.c:3314
+#: src/elflint.c:3377
 #, c-format
 msgid ""
 "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
@@ -2484,47 +2557,47 @@ msgstr ""
 "розділ [%2d] «%s»: зміщення %zu: зайві байти після останнього розділу "
 "атрибутів\n"
 
-#: src/elflint.c:3403
+#: src/elflint.c:3466
 #, c-format
 msgid "cannot get section header of zeroth section\n"
 msgstr "не вдалося отримати заголовок нульового розділу\n"
 
-#: src/elflint.c:3407
+#: src/elflint.c:3470
 #, c-format
 msgid "zeroth section has nonzero name\n"
 msgstr "нульовий розділ має ненульову назву\n"
 
-#: src/elflint.c:3409
+#: src/elflint.c:3472
 #, c-format
 msgid "zeroth section has nonzero type\n"
 msgstr "нульовий розділ має ненульовий тип\n"
 
-#: src/elflint.c:3411
+#: src/elflint.c:3474
 #, c-format
 msgid "zeroth section has nonzero flags\n"
 msgstr "нульовий розділ має ненульові прапорці\n"
 
-#: src/elflint.c:3413
+#: src/elflint.c:3476
 #, c-format
 msgid "zeroth section has nonzero address\n"
 msgstr "нульовий розділ має ненульову адресу\n"
 
-#: src/elflint.c:3415
+#: src/elflint.c:3478
 #, c-format
 msgid "zeroth section has nonzero offset\n"
 msgstr "нульовий розділ має ненульове зміщення\n"
 
-#: src/elflint.c:3417
+#: src/elflint.c:3480
 #, c-format
 msgid "zeroth section has nonzero align value\n"
 msgstr "нульовий розділ має ненульове значення вирівнювання\n"
 
-#: src/elflint.c:3419
+#: src/elflint.c:3482
 #, c-format
 msgid "zeroth section has nonzero entry size value\n"
 msgstr "нульовий розділ має ненульове значення розміру запису\n"
 
-#: src/elflint.c:3422
+#: src/elflint.c:3485
 #, c-format
 msgid ""
 "zeroth section has nonzero size value while ELF header has nonzero shnum "
@@ -2533,7 +2606,7 @@ msgstr ""
 "нульовий розділ має ненульове значення розміру, хоча заголовок ELF ман "
 "ненульове значення shnum\n"
 
-#: src/elflint.c:3426
+#: src/elflint.c:3489
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
@@ -2542,7 +2615,7 @@ msgstr ""
 "нульовий розділ має ненульове значення компонування, хоча у заголовку ELF "
 "немає сигналу переповнення у shstrndx\n"
 
-#: src/elflint.c:3430
+#: src/elflint.c:3493
 #, c-format
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
@@ -2551,28 +2624,28 @@ msgstr ""
 "нульовий розділ має ненульове значення компонування, хоча у заголовку ELF "
 "немає сигналу переповнення у phnum\n"
 
-#: src/elflint.c:3447
+#: src/elflint.c:3510
 #, c-format
 msgid "cannot get section header for section [%2zu] '%s': %s\n"
 msgstr "не вдалося отримати заголовок розділу [%2zu] «%s»: %s\n"
 
-#: src/elflint.c:3456
+#: src/elflint.c:3519
 #, c-format
 msgid "section [%2zu]: invalid name\n"
 msgstr "розділ [%2zu]: некоректна назва\n"
 
-#: src/elflint.c:3483
+#: src/elflint.c:3546
 #, c-format
 msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
 msgstr ""
 "розділ [%2d] «%s» належить до помилкового типу: мав бути %s, маємо %s\n"
 
-#: src/elflint.c:3499
+#: src/elflint.c:3562
 #, c-format
 msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
 msgstr "розділ [%2zu] «%s» має помилкові прапорці: мало бути %s, маємо %s\n"
 
-#: src/elflint.c:3516
+#: src/elflint.c:3579
 #, c-format
 msgid ""
 "section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
@@ -2580,12 +2653,12 @@ msgstr ""
 "розділ [%2zu] «%s» має помилкові прапорці: мало бути %s, можливо, %s, але "
 "маємо %s\n"
 
-#: src/elflint.c:3534
+#: src/elflint.c:3597
 #, c-format
 msgid "section [%2zu] '%s' present in object file\n"
 msgstr "у об’єктному файлі виявлено розділ [%2zu] «%s»\n"
 
-#: src/elflint.c:3540 src/elflint.c:3572
+#: src/elflint.c:3603 src/elflint.c:3635
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
@@ -2593,7 +2666,7 @@ msgstr ""
 "у розділ [%2zu] «%s» встановлено прапорець SHF_ALLOC, але немає придатного "
 "до завантаження сегмента\n"
 
-#: src/elflint.c:3545 src/elflint.c:3577
+#: src/elflint.c:3608 src/elflint.c:3640
 #, c-format
 msgid ""
 "section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
@@ -2602,7 +2675,7 @@ msgstr ""
 "у розділі [%2zu] «%s» не встановлено прапорець SHF_ALLOC, але є придатні до "
 "завантаження сегменти\n"
 
-#: src/elflint.c:3553
+#: src/elflint.c:3616
 #, c-format
 msgid ""
 "section [%2zu] '%s' is extension section index table in non-object file\n"
@@ -2610,22 +2683,22 @@ msgstr ""
 "розділ [%2zu] «%s» є таблицею-покажчиком розділу розширень у файлі, який не "
 "є об’єктним\n"
 
-#: src/elflint.c:3596
+#: src/elflint.c:3659
 #, c-format
 msgid "section [%2zu] '%s': size not multiple of entry size\n"
 msgstr "розділ [%2zu] «%s»: розмір не є кратним до розміру запису\n"
 
-#: src/elflint.c:3601
+#: src/elflint.c:3664
 #, c-format
 msgid "cannot get section header\n"
 msgstr "не вдалося отримати заголовок розділу\n"
 
-#: src/elflint.c:3611
+#: src/elflint.c:3674
 #, c-format
 msgid "section [%2zu] '%s' has unsupported type %d\n"
 msgstr "розділ [%2zu] «%s» належить до непідтримуваного типу %d\n"
 
-#: src/elflint.c:3625
+#: src/elflint.c:3688
 #, c-format
 msgid ""
 "section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
@@ -2633,52 +2706,52 @@ msgstr ""
 "розділ [%2zu] «%s» містить некоректні специфічні для процесора прапорці "
 "%#<PRIx64>\n"
 
-#: src/elflint.c:3632
+#: src/elflint.c:3695
 #, c-format
 msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
 msgstr "розділ [%2zu] «%s» містить невідомі прапорці %#<PRIx64>\n"
 
-#: src/elflint.c:3640
+#: src/elflint.c:3703
 #, c-format
 msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
 msgstr ""
 "розділ [%2zu] «%s»: адреса розділів локальних даних потоків не є нульовою\n"
 
-#: src/elflint.c:3648
+#: src/elflint.c:3711
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in link value\n"
 msgstr ""
 "розділ [%2zu] «%s»: некоректне посилання на розділ у значенні компонування\n"
 
-#: src/elflint.c:3653
+#: src/elflint.c:3716
 #, c-format
 msgid "section [%2zu] '%s': invalid section reference in info value\n"
 msgstr ""
 "розділ [%2zu] «%s»: некоректне посилання на розділ у значенні відомостей\n"
 
-#: src/elflint.c:3660
+#: src/elflint.c:3723
 #, c-format
 msgid "section [%2zu] '%s': strings flag set without merge flag\n"
 msgstr "розділ [%2zu] «%s»: встановлено прапорець strings без прапорця merge\n"
 
-#: src/elflint.c:3665
+#: src/elflint.c:3728
 #, c-format
 msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
 msgstr ""
 "розділ [%2zu] «%s»: встановлено прапорець merge, але розмір запису є "
 "нульовим\n"
 
-#: src/elflint.c:3683
+#: src/elflint.c:3746
 #, c-format
 msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
 msgstr "розділ [%2zu] «%s» має неочікуваний тип %d для виконуваного розділу\n"
 
-#: src/elflint.c:3692
+#: src/elflint.c:3755
 #, c-format
 msgid "section [%2zu] '%s' is both executable and writable\n"
 msgstr "розділ [%2zu] «%s» є одночасно виконуваним і придатним до запису\n"
 
-#: src/elflint.c:3721
+#: src/elflint.c:3784
 #, c-format
 msgid ""
 "section [%2zu] '%s' not fully contained in segment of program header entry "
@@ -2687,7 +2760,7 @@ msgstr ""
 "розділ [%2zu] «%s» не повністю міститься у сегменті запису заголовка "
 "програми %d\n"
 
-#: src/elflint.c:3729
+#: src/elflint.c:3792
 #, c-format
 msgid ""
 "section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
@@ -2696,7 +2769,7 @@ msgstr ""
 "розділ [%2zu] «%s» належить до типу NOBITS, але його читання виконується з "
 "файла у сегментів запису заголовка програми %d\n"
 
-#: src/elflint.c:3738
+#: src/elflint.c:3801
 #, c-format
 msgid ""
 "section [%2zu] '%s' has not type NOBITS but is not read from the file in "
@@ -2705,19 +2778,19 @@ msgstr ""
 "розділ [%2zu] «%s» не належить до типу NOBITS, але його читання не "
 "виконується з файла у сегментів запису заголовка програми %d\n"
 
-#: src/elflint.c:3749
+#: src/elflint.c:3812
 #, c-format
 msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
 msgstr "розділ [%2zu] «%s» є виконуваним у невиконуваному сегменті %d\n"
 
-#: src/elflint.c:3759
+#: src/elflint.c:3822
 #, c-format
 msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
 msgstr ""
 "розділ [%2zu] «%s» є придатним до запису у непридатному до запису сегменті "
 "%d\n"
 
-#: src/elflint.c:3769
+#: src/elflint.c:3832
 #, c-format
 msgid ""
 "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
@@ -2725,7 +2798,7 @@ msgstr ""
 "розділ [%2zu] «%s»: встановлено прапорець alloc, але розділ не перебуває у "
 "жодному завантаженому сегменті\n"
 
-#: src/elflint.c:3775
+#: src/elflint.c:3838
 #, c-format
 msgid ""
 "section [%2zu] '%s': ELF header says this is the section header string table "
@@ -2734,7 +2807,7 @@ msgstr ""
 "розділ [%2zu] «%s»: заголовок ELF повідомляє про те, що це таблиця рядків "
 "заголовка розділу, але ця таблиця не належить до типу SHT_TYPE\n"
 
-#: src/elflint.c:3783
+#: src/elflint.c:3846
 #, c-format
 msgid ""
 "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
@@ -2742,17 +2815,17 @@ msgstr ""
 "розділ [%2zu] «%s»: придатні до пересування файли не можуть містити "
 "динамічних таблиць символів\n"
 
-#: src/elflint.c:3834
+#: src/elflint.c:3897
 #, c-format
 msgid "more than one version symbol table present\n"
 msgstr "виявлено більше за одну таблицю символів версій\n"
 
-#: src/elflint.c:3857
+#: src/elflint.c:3920
 #, c-format
 msgid "INTERP program header entry but no .interp section\n"
 msgstr "існує запис заголовка програми INTERP, але не розділ .interp\n"
 
-#: src/elflint.c:3868
+#: src/elflint.c:3931
 #, c-format
 msgid ""
 "loadable segment [%u] is executable but contains no executable sections\n"
@@ -2760,14 +2833,14 @@ msgstr ""
 "придатний до завантаження сегмент [%u] є виконуваним, але не містить "
 "виконуваних розділів\n"
 
-#: src/elflint.c:3874
+#: src/elflint.c:3937
 #, c-format
 msgid "loadable segment [%u] is writable but contains no writable sections\n"
 msgstr ""
 "придатний до завантаження розділ [%u] є придатним до запису, але не містить "
 "придатних до запису розділів\n"
 
-#: src/elflint.c:3885
+#: src/elflint.c:3948
 #, c-format
 msgid ""
 "no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
@@ -2776,24 +2849,24 @@ msgstr ""
 "немає розділу .gnu.versym, хоча існує розділ .gnu.versym_d або .gnu."
 "versym_r\n"
 
-#: src/elflint.c:3898
+#: src/elflint.c:3961
 #, c-format
 msgid "duplicate version index %d\n"
 msgstr "дублікат індексу версії %d\n"
 
-#: src/elflint.c:3912
+#: src/elflint.c:3975
 #, c-format
 msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
 msgstr ""
 "існує розділ .gnu.versym, але немає розділу .gnu.versym_d або .gnu.versym_r\n"
 
-#: src/elflint.c:3961
+#: src/elflint.c:4024
 #, c-format
 msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
 msgstr ""
 "phdr[%d]: невідомий тип нотатки файла core %<PRIu32> за зміщенням %<PRIu64>\n"
 
-#: src/elflint.c:3965
+#: src/elflint.c:4028
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
@@ -2801,13 +2874,13 @@ msgstr ""
 "розділ [%2d] «%s»: невідомий тип нотатки файла core %<PRIu32> за зміщенням "
 "%Zu\n"
 
-#: src/elflint.c:3988
+#: src/elflint.c:4051
 #, c-format
 msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
 msgstr ""
 "phdr[%d]: невідомий тип нотатки об’єктного файла %<PRIu32> за зміщенням %Zu\n"
 
-#: src/elflint.c:3992
+#: src/elflint.c:4055
 #, c-format
 msgid ""
 "section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
@@ -2815,39 +2888,39 @@ msgstr ""
 "розділ [%2d] «%s»: невідомий тип нотатки об’єктного файла %<PRIu32> за "
 "зміщенням %Zu\n"
 
-#: src/elflint.c:4009
+#: src/elflint.c:4072
 #, c-format
 msgid "phdr[%d]: no note entries defined for the type of file\n"
 msgstr "phdr[%d]: для цього типу файлів не визначено записів нотаток\n"
 
-#: src/elflint.c:4028
+#: src/elflint.c:4091
 #, c-format
 msgid "phdr[%d]: cannot get content of note section: %s\n"
 msgstr "phdr[%d]: не вдалося отримати вміст розділу нотаток: %s\n"
 
-#: src/elflint.c:4031
+#: src/elflint.c:4094
 #, c-format
 msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
 msgstr "phdr[%d]: зайві %<PRIu64> байтів після останнього запису нотатки\n"
 
-#: src/elflint.c:4052
+#: src/elflint.c:4115
 #, c-format
 msgid "section [%2d] '%s': no note entries defined for the type of file\n"
 msgstr ""
 "розділ [%2d] «%s»: для цього типу файлів не визначено записів нотаток\n"
 
-#: src/elflint.c:4059
+#: src/elflint.c:4122
 #, c-format
 msgid "section [%2d] '%s': cannot get content of note section\n"
 msgstr "розділ [%2d] «%s»: не вдалося отримати вміст розділу нотаток\n"
 
-#: src/elflint.c:4062
+#: src/elflint.c:4125
 #, c-format
 msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
 msgstr ""
 "розділ [%2d] «%s»: додаткові %<PRIu64> байтів після останньої нотатки\n"
 
-#: src/elflint.c:4080
+#: src/elflint.c:4143
 #, c-format
 msgid ""
 "only executables, shared objects, and core files can have program headers\n"
@@ -2855,135 +2928,135 @@ msgstr ""
 "заголовки програм можуть бути лише у виконуваних файлів, об’єктних файлів "
 "спільного використання або файлів core\n"
 
-#: src/elflint.c:4095
+#: src/elflint.c:4158
 #, c-format
 msgid "cannot get program header entry %d: %s\n"
 msgstr "не вдалося отримати запис заголовка програми %d: %s\n"
 
-#: src/elflint.c:4104
+#: src/elflint.c:4167
 #, c-format
 msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
 msgstr ""
 "запис заголовка програми %d: невідомий тип запису заголовка програми "
 "%#<PRIx64>\n"
 
-#: src/elflint.c:4115
+#: src/elflint.c:4178
 #, c-format
 msgid "more than one INTERP entry in program header\n"
 msgstr "більше за один запис INTERP у заголовку програми\n"
 
-#: src/elflint.c:4123
+#: src/elflint.c:4186
 #, c-format
 msgid "more than one TLS entry in program header\n"
 msgstr "більше за один запис TLS у заголовку програми\n"
 
-#: src/elflint.c:4130
+#: src/elflint.c:4193
 #, c-format
 msgid "static executable cannot have dynamic sections\n"
 msgstr "у статичному виконуваному файлі не може бути динамічних розділів\n"
 
-#: src/elflint.c:4144
+#: src/elflint.c:4207
 #, c-format
 msgid "dynamic section reference in program header has wrong offset\n"
 msgstr ""
 "посилання на динамічний розділ у заголовку програми має помилкове зміщення\n"
 
-#: src/elflint.c:4147
+#: src/elflint.c:4210
 #, c-format
 msgid "dynamic section size mismatch in program and section header\n"
 msgstr ""
 "розміри динамічного розділу у заголовку програми та у заголовку розділу не "
 "збігаються\n"
 
-#: src/elflint.c:4157
+#: src/elflint.c:4220
 #, c-format
 msgid "more than one GNU_RELRO entry in program header\n"
 msgstr "більше за один запис GNU_RELRO у заголовку програми\n"
 
-#: src/elflint.c:4178
+#: src/elflint.c:4241
 #, c-format
 msgid "loadable segment GNU_RELRO applies to is not writable\n"
 msgstr ""
 "придатний до завантаження сегмент, до якого звертається GNU_RELRO, "
 "непридатний до запису\n"
 
-#: src/elflint.c:4181
+#: src/elflint.c:4244
 #, c-format
 msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
 msgstr ""
 "прапорці придатного до завантаження сегмента [%u] не відповідають прапорцям "
 "GNU_RELRO [%u]\n"
 
-#: src/elflint.c:4189 src/elflint.c:4212
+#: src/elflint.c:4252 src/elflint.c:4275
 #, c-format
 msgid "%s segment not contained in a loaded segment\n"
 msgstr "сегмент %s не міститься у завантаженому сегменті\n"
 
-#: src/elflint.c:4218
+#: src/elflint.c:4281
 #, c-format
 msgid "program header offset in ELF header and PHDR entry do not match"
 msgstr "зміщення заголовка програми у заголовку ELF і запис PHDR не збігаються"
 
-#: src/elflint.c:4242
+#: src/elflint.c:4305
 #, c-format
 msgid "call frame search table reference in program header has wrong offset\n"
 msgstr ""
 "посилання на таблицю вікон викликів у заголовку програми має помилкове "
 "зміщення\n"
 
-#: src/elflint.c:4245
+#: src/elflint.c:4308
 #, c-format
 msgid "call frame search table size mismatch in program and section header\n"
 msgstr ""
 "розміри таблиці пошуку вікон виклику у заголовку програми та у заголовку "
 "розділу не збігаються\n"
 
-#: src/elflint.c:4258
+#: src/elflint.c:4321
 #, c-format
 msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
 msgstr "існує PT_GNU_EH_FRAME, хоча немає розділу .eh_frame_hdr\n"
 
-#: src/elflint.c:4266
+#: src/elflint.c:4329
 #, c-format
 msgid "call frame search table must be allocated\n"
 msgstr "таблицю пошуку вікон викликів має бути розміщено у пам’яті\n"
 
-#: src/elflint.c:4269
+#: src/elflint.c:4332
 #, c-format
 msgid "section [%2zu] '%s' must be allocated\n"
 msgstr "розділ [%2zu] «%s» має бути розміщено у пам’яті\n"
 
-#: src/elflint.c:4273
+#: src/elflint.c:4336
 #, c-format
 msgid "call frame search table must not be writable\n"
 msgstr "таблиця пошуку вікон викликів не повинна бути придатною до запису\n"
 
-#: src/elflint.c:4276
+#: src/elflint.c:4339
 #, c-format
 msgid "section [%2zu] '%s' must not be writable\n"
 msgstr "розділ [%2zu] «%s» не повинен бути придатним до запису\n"
 
-#: src/elflint.c:4281
+#: src/elflint.c:4344
 #, c-format
 msgid "call frame search table must not be executable\n"
 msgstr "таблиця пошуку вікон викликів не повинна бути придатною до виконання\n"
 
-#: src/elflint.c:4284
+#: src/elflint.c:4347
 #, c-format
 msgid "section [%2zu] '%s' must not be executable\n"
 msgstr "розділ [%2zu] «%s» не повинен бути придатним до виконання\n"
 
-#: src/elflint.c:4295
+#: src/elflint.c:4358
 #, c-format
 msgid "program header entry %d: file size greater than memory size\n"
 msgstr "запис заголовка програми %d: розмір файла перевищує об’єм пам’яті\n"
 
-#: src/elflint.c:4302
+#: src/elflint.c:4365
 #, c-format
 msgid "program header entry %d: alignment not a power of 2\n"
 msgstr "запис заголовка програми %d: значення вирівнювання не є степенем 2\n"
 
-#: src/elflint.c:4305
+#: src/elflint.c:4368
 #, c-format
 msgid ""
 "program header entry %d: file offset and virtual address not module of "
@@ -2992,7 +3065,7 @@ msgstr ""
 "запис заголовка програми %d: зміщення у файлі і віртуальна адреса не "
 "співвідносяться з вирівнюванням\n"
 
-#: src/elflint.c:4318
+#: src/elflint.c:4381
 #, c-format
 msgid ""
 "executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
@@ -3001,12 +3074,12 @@ msgstr ""
 "виконуваний модуль/DSO з розділом .eh_frame_hdr не містить запису заголовка "
 "програми PT_GNU_EH_FRAME"
 
-#: src/elflint.c:4352
+#: src/elflint.c:4415
 #, c-format
 msgid "cannot read ELF header: %s\n"
 msgstr "не вдалося прочитати заголовок ELF: %s\n"
 
-#: src/elflint.c:4378
+#: src/elflint.c:4441
 #, c-format
 msgid "text relocation flag set but not needed\n"
 msgstr ""
@@ -3537,7 +3610,8 @@ msgstr "Попередження: тип «%s» змінився з %s у %s н
 msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
 msgstr "Попередження: розмір «%s» змінено з %<PRIu64> у %s на %<PRIu64> у %s"
 
-#: src/ldgeneric.c:651 src/ldgeneric.c:1112 src/readelf.c:640 src/strip.c:562
+#: src/ldgeneric.c:651 src/ldgeneric.c:1112 src/readelf.c:527
+#: src/readelf.c:829 src/strip.c:563
 #, c-format
 msgid "cannot determine number of sections: %s"
 msgstr "не вдалося визначити кількість розділів: %s"
@@ -3779,7 +3853,7 @@ msgstr "внутрішня помилка: небезбітовий розділ
 msgid "cannot get header of 0th section: %s"
 msgstr "не вдалося отримати заголовок 0-го розділу: %s"
 
-#: src/ldgeneric.c:6930 src/unstrip.c:1810
+#: src/ldgeneric.c:6930 src/unstrip.c:1818
 #, c-format
 msgid "cannot update ELF header: %s"
 msgstr "не вдалося оновити заголовок ELF: %s"
@@ -3946,7 +4020,7 @@ msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
 msgstr "%s: ВНУТРІШНЯ ПОМИЛКА %d (%s-%s): %s"
 
 #: src/nm.c:398 src/nm.c:410 src/size.c:309 src/size.c:318 src/size.c:329
-#: src/strip.c:2124
+#: src/strip.c:2155
 #, c-format
 msgid "while closing '%s'"
 msgstr "під час закриття «%s»"
@@ -3989,17 +4063,17 @@ msgstr "%s%s%s: не вдалося розпізнати формат файла
 msgid "cannot create search tree"
 msgstr "не вдалося створити дерево пошуку"
 
-#: src/nm.c:757 src/nm.c:1156 src/objdump.c:787 src/readelf.c:896
-#: src/readelf.c:1039 src/readelf.c:1187 src/readelf.c:1369 src/readelf.c:1569
-#: src/readelf.c:1755 src/readelf.c:1965 src/readelf.c:2219 src/readelf.c:2285
-#: src/readelf.c:2363 src/readelf.c:2861 src/readelf.c:2897 src/readelf.c:2959
-#: src/readelf.c:7270 src/readelf.c:8176 src/readelf.c:8323 src/readelf.c:8391
-#: src/size.c:417 src/size.c:491 src/strip.c:502
+#: src/nm.c:757 src/nm.c:1163 src/objdump.c:787 src/readelf.c:536
+#: src/readelf.c:1085 src/readelf.c:1245 src/readelf.c:1393 src/readelf.c:1579
+#: src/readelf.c:1785 src/readelf.c:1972 src/readelf.c:2196 src/readelf.c:2454
+#: src/readelf.c:2524 src/readelf.c:2606 src/readelf.c:3117 src/readelf.c:3153
+#: src/readelf.c:3216 src/readelf.c:7920 src/readelf.c:9002 src/readelf.c:9149
+#: src/readelf.c:9217 src/size.c:417 src/size.c:487 src/strip.c:503
 #, c-format
 msgid "cannot get section header string table index"
 msgstr "не вдалося визначити індекс заголовка розділу у таблиці рядків"
 
-#: src/nm.c:782
+#: src/nm.c:784
 #, c-format
 msgid ""
 "\n"
@@ -4012,7 +4086,7 @@ msgstr ""
 "Символи з %s:\n"
 "\n"
 
-#: src/nm.c:785
+#: src/nm.c:787
 #, c-format
 msgid ""
 "%*s%-*s %-*s Class  Type     %-*s %*s Section\n"
@@ -4021,22 +4095,22 @@ msgstr ""
 "%*s%-*s %-*s Клас   Тип      %-*s %*s Розділ\n"
 "\n"
 
-#: src/nm.c:1166
+#: src/nm.c:1173
 #, c-format
 msgid "%s: entry size in section `%s' is not what we expect"
 msgstr "%s: розмір запису у розділі «%s» не є очікуваним"
 
-#: src/nm.c:1170
+#: src/nm.c:1177
 #, c-format
 msgid "%s: size of section `%s' is not multiple of entry size"
 msgstr "%s: розмір розділу «%s» не є кратним до розміру запису"
 
-#: src/nm.c:1428
+#: src/nm.c:1435
 #, c-format
 msgid "%s%s%s%s: Invalid operation"
 msgstr "%s%s%s%s: некоректна дія"
 
-#: src/nm.c:1485
+#: src/nm.c:1492
 #, c-format
 msgid "%s%s%s: no symbols"
 msgstr "%s%s%s: немає символів"
@@ -4069,7 +4143,7 @@ msgstr "Показати інформацію лише з розділу НАЗ
 msgid "Show information from FILEs (a.out by default)."
 msgstr "Показати інформацію з ФАЙЛів (типово a.out)."
 
-#: src/objdump.c:236 src/readelf.c:439
+#: src/objdump.c:236 src/readelf.c:473
 msgid "No operation specified.\n"
 msgstr "Не вказано дії.\n"
 
@@ -4078,11 +4152,11 @@ msgstr "Не вказано дії.\n"
 msgid "while close `%s'"
 msgstr "під час закриття «%s»"
 
-#: src/objdump.c:379 src/readelf.c:1664 src/readelf.c:1838
+#: src/objdump.c:379 src/readelf.c:1880 src/readelf.c:2069
 msgid "INVALID SYMBOL"
 msgstr "НЕКОРЕКТНИЙ СИМВОЛ"
 
-#: src/objdump.c:394 src/readelf.c:1695 src/readelf.c:1871
+#: src/objdump.c:394 src/readelf.c:1911 src/readelf.c:2102
 msgid "INVALID SECTION"
 msgstr "НЕКОРЕКТНИЙ РОЗДІЛ"
 
@@ -4139,183 +4213,244 @@ msgstr "«%s» не є архівом"
 msgid "error while freeing sub-ELF descriptor: %s"
 msgstr "помилка під час спроби вивільнення дескриптора під-ELF: %s"
 
-#: src/readelf.c:67
+#: src/readelf.c:71
+msgid "ELF input selection:"
+msgstr "Вибір вихідних даних ELF:"
+
+#: src/readelf.c:73
+msgid ""
+"Use the named SECTION (default .gnu_debugdata) as (compressed) ELF input data"
+msgstr ""
+"Використовувати вказаний за іменем РОЗДІЛ (типово .gnu_debugdata) як "
+"(стиснені) вхідні дані ELF"
+
+#: src/readelf.c:75
 msgid "ELF output selection:"
 msgstr "Вибір виводу ELF:"
 
-#: src/readelf.c:69
+#: src/readelf.c:77
 msgid "All these plus -p .strtab -p .dynstr -p .comment"
 msgstr "Все це плюс -p .strtab -p .dynstr -p .comment"
 
-#: src/readelf.c:70
+#: src/readelf.c:78
 msgid "Display the dynamic segment"
 msgstr "Показувати динамічний сегмент"
 
-#: src/readelf.c:71
+#: src/readelf.c:79
 msgid "Display the ELF file header"
 msgstr "Показувати заголовок файла ELF"
 
-#: src/readelf.c:73
+#: src/readelf.c:81
 msgid "Display histogram of bucket list lengths"
 msgstr "Показати гістограму довжин списку блоків"
 
-#: src/readelf.c:74
+#: src/readelf.c:82
 msgid "Display the program headers"
 msgstr "Показувати заголовки програми"
 
-#: src/readelf.c:76
+#: src/readelf.c:84
 msgid "Display relocations"
 msgstr "Показувати пересування"
 
-#: src/readelf.c:77
+#: src/readelf.c:85
 msgid "Display the sections' headers"
 msgstr "Показувати заголовки розділів"
 
-#: src/readelf.c:79
+#: src/readelf.c:87
 msgid "Display the symbol table"
 msgstr "Показувати таблицю символів"
 
-#: src/readelf.c:80
+#: src/readelf.c:88
 msgid "Display versioning information"
 msgstr "Показувати відомості щодо версії"
 
-#: src/readelf.c:81
+#: src/readelf.c:89
 msgid "Display the ELF notes"
 msgstr "Показувати нотатки ELF"
 
-#: src/readelf.c:83
+#: src/readelf.c:91
 msgid "Display architecture specific information, if any"
 msgstr "Показувати специфічні для архітектури дані, якщо такі буде виявлено"
 
-#: src/readelf.c:85
+#: src/readelf.c:93
 msgid "Display sections for exception handling"
 msgstr "Показувати розділи для обробки виключень"
 
-#: src/readelf.c:87
+#: src/readelf.c:95
 msgid "Additional output selection:"
 msgstr "Додатковий вибір виводу:"
 
-#: src/readelf.c:89
+#: src/readelf.c:97
 msgid ""
 "Display DWARF section content.  SECTION can be one of abbrev, aranges, "
-"frame, gdb_index, info, loc, line, ranges, pubnames, str, macinfo, macro or "
-"exception"
+"decodedaranges, frame, gdb_index, info, loc, line, decodedline, ranges, "
+"pubnames, str, macinfo, macro or exception"
 msgstr ""
 "Показати вміст розділу DWARF. Значенням РОЗДІЛ може бути abbrev, aranges, "
-"frame, gdb_index, info, loc, line, ranges, pubnames, str, macinfo, macro або "
-"exception"
+"decodedaranges, frame, gdb_index, info, loc, line, decodedline, ranges, "
+"pubnames, str, macinfo, macro або exception"
 
-#: src/readelf.c:93
+#: src/readelf.c:101
 msgid "Dump the uninterpreted contents of SECTION, by number or name"
 msgstr ""
 "Створити дамп даних РОЗДІЛ, які не вдалося інтерпретувати, за номером або "
 "назвами"
 
-#: src/readelf.c:95
+#: src/readelf.c:103
 msgid "Print string contents of sections"
 msgstr "Виводити вміст рядків розділів"
 
-#: src/readelf.c:98
+#: src/readelf.c:106
 msgid "Display the symbol index of an archive"
 msgstr "Показувати покажчик символів архіву"
 
-#: src/readelf.c:100
+#: src/readelf.c:108
 msgid "Output control:"
 msgstr "Керування виводом:"
 
-#: src/readelf.c:102
+#: src/readelf.c:110
 msgid "Do not find symbol names for addresses in DWARF data"
-msgstr "Не шукати назви символів для адресу у даних DWARF"
+msgstr "Не шукати назви символів для адрес у даних DWARF"
 
-#: src/readelf.c:104
+#: src/readelf.c:112
+msgid ""
+"Display just offsets instead of resolving values to addresses in DWARF data"
+msgstr "Показати лише зміщення, а не визначені значення адреси у даних DWARF"
+
+#: src/readelf.c:114
 msgid "Ignored for compatibility (lines always wide)"
 msgstr "Ігнорується з міркувань сумісності (рядки завжди широкі)"
 
-#: src/readelf.c:109
+#: src/readelf.c:119
 msgid "Print information from ELF file in human-readable form."
 msgstr "Виводити відомості з файла ELF у придатному для читання форматі."
 
-#: src/readelf.c:410
+#: src/readelf.c:441
 #, c-format
 msgid "Unknown DWARF debug section `%s'.\n"
 msgstr "Невідомий діагностичний розділ DWARF «%s».\n"
 
-#: src/readelf.c:476
+#: src/readelf.c:520 src/readelf.c:631
 #, c-format
 msgid "cannot generate Elf descriptor: %s"
 msgstr "не вдалося створити дескриптор Elf: %s"
 
-#: src/readelf.c:488
+#: src/readelf.c:545 src/readelf.c:1099 src/readelf.c:1269
 #, c-format
-msgid "'%s' is not an archive, cannot print archive index"
-msgstr "«%s» не є архівом, виведення покажчика архіву неможливе"
+msgid "cannot get section: %s"
+msgstr "не вдалося отримати розділ: %s"
+
+#: src/readelf.c:554 src/readelf.c:1106 src/readelf.c:1277 src/readelf.c:9169
+#: src/unstrip.c:352 src/unstrip.c:383 src/unstrip.c:432 src/unstrip.c:540
+#: src/unstrip.c:557 src/unstrip.c:593 src/unstrip.c:791 src/unstrip.c:1059
+#: src/unstrip.c:1250 src/unstrip.c:1310 src/unstrip.c:1431 src/unstrip.c:1484
+#: src/unstrip.c:1591 src/unstrip.c:1780
+#, c-format
+msgid "cannot get section header: %s"
+msgstr "не вдалося отримати заголовок розділу: %s"
 
-#: src/readelf.c:493
+#: src/readelf.c:562
+#, c-format
+msgid "cannot get section name"
+msgstr "не вдалося отримати назву розділу"
+
+#: src/readelf.c:571 src/readelf.c:5221 src/readelf.c:7414 src/readelf.c:7516
+#: src/readelf.c:7674
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr "не вдалося отримати дані %s: %s"
+
+#: src/readelf.c:587
+#, c-format
+msgid "cannot create temp file '%s'"
+msgstr "не вдалося створити файл тимчасових даних «%s»"
+
+#: src/readelf.c:596
+#, c-format
+msgid "cannot write section data"
+msgstr "не вдалося записати дані розділу"
+
+#: src/readelf.c:602 src/readelf.c:619 src/readelf.c:648
 #, c-format
 msgid "error while closing Elf descriptor: %s"
 msgstr "помилка під час спроби закриття дескриптора Elf: %s"
 
-#: src/readelf.c:585
+#: src/readelf.c:609
+#, c-format
+msgid "error while rewinding file descriptor"
+msgstr "помилка під час повернення до початкового значення дескриптора файла"
+
+#: src/readelf.c:643
+#, c-format
+msgid "'%s' is not an archive, cannot print archive index"
+msgstr "«%s» не є архівом, виведення покажчика архіву неможливе"
+
+#: src/readelf.c:742
+#, c-format
+msgid "No such section '%s' in '%s'"
+msgstr "У «%2$s» немає розділу «%1$s»"
+
+#: src/readelf.c:769
 #, c-format
 msgid "cannot stat input file"
 msgstr "не вдалося отримати дані з вхідного файла за допомогою stat"
 
-#: src/readelf.c:587
+#: src/readelf.c:771
 #, c-format
 msgid "input file is empty"
 msgstr "вхідний файл є порожнім"
 
-#: src/readelf.c:589
+#: src/readelf.c:773
 #, c-format
 msgid "failed reading '%s': %s"
 msgstr "не вдалося прочитати «%s»: %s"
 
-#: src/readelf.c:625
+#: src/readelf.c:814
 #, c-format
 msgid "cannot read ELF header: %s"
 msgstr "не вдалося прочитати заголовок ELF: %s"
 
-#: src/readelf.c:633
+#: src/readelf.c:822
 #, c-format
 msgid "cannot create EBL handle"
 msgstr "не вдалося створити дескриптор EBL"
 
-#: src/readelf.c:646
+#: src/readelf.c:835
 #, c-format
 msgid "cannot determine number of program headers: %s"
 msgstr "не вдалося визначити кількість заголовків програми: %s"
 
-#: src/readelf.c:732
+#: src/readelf.c:921
 msgid "NONE (None)"
 msgstr "NONE (Немає)"
 
-#: src/readelf.c:733
+#: src/readelf.c:922
 msgid "REL (Relocatable file)"
 msgstr "REL (Придатний до пересування файл)"
 
-#: src/readelf.c:734
+#: src/readelf.c:923
 msgid "EXEC (Executable file)"
 msgstr "EXEC (Виконуваний файл)"
 
-#: src/readelf.c:735
+#: src/readelf.c:924
 msgid "DYN (Shared object file)"
 msgstr "DYN (Файл об’єктів спільного використання)"
 
-#: src/readelf.c:736
+#: src/readelf.c:925
 msgid "CORE (Core file)"
 msgstr "CORE (Файл ядра)"
 
-#: src/readelf.c:741
+#: src/readelf.c:930
 #, c-format
 msgid "OS Specific: (%x)\n"
 msgstr "ОС-специфічне: (%x)\n"
 
-#: src/readelf.c:743
+#: src/readelf.c:932
 #, c-format
 msgid "Processor Specific: (%x)\n"
 msgstr "Специфічне для процесора: (%x)\n"
 
-#: src/readelf.c:753
+#: src/readelf.c:942
 msgid ""
 "ELF Header:\n"
 "  Magic:  "
@@ -4323,7 +4458,7 @@ msgstr ""
 "Заголовок ELF:\n"
 "  Magic:  "
 
-#: src/readelf.c:757
+#: src/readelf.c:946
 #, c-format
 msgid ""
 "\n"
@@ -4332,117 +4467,117 @@ msgstr ""
 "\n"
 "  Клас:                              %s\n"
 
-#: src/readelf.c:762
+#: src/readelf.c:951
 #, c-format
 msgid "  Data:                              %s\n"
 msgstr "  Дані:                              %s\n"
 
-#: src/readelf.c:768
+#: src/readelf.c:957
 #, c-format
 msgid "  Ident Version:                     %hhd %s\n"
 msgstr "   Версія Ident:                     %hhd %s\n"
 
-#: src/readelf.c:770 src/readelf.c:787
+#: src/readelf.c:959 src/readelf.c:976
 msgid "(current)"
 msgstr "(поточний)"
 
-#: src/readelf.c:774
+#: src/readelf.c:963
 #, c-format
 msgid "  OS/ABI:                            %s\n"
 msgstr "  ОС/ABI:                            %s\n"
 
-#: src/readelf.c:777
+#: src/readelf.c:966
 #, c-format
 msgid "  ABI Version:                       %hhd\n"
 msgstr "  Версія ABI:                       %hhd\n"
 
-#: src/readelf.c:780
+#: src/readelf.c:969
 msgid "  Type:                              "
 msgstr "  Тип:                                "
 
-#: src/readelf.c:783
+#: src/readelf.c:972
 #, c-format
 msgid "  Machine:                           %s\n"
 msgstr "  Архітектура:                       %s\n"
 
-#: src/readelf.c:785
+#: src/readelf.c:974
 #, c-format
 msgid "  Version:                           %d %s\n"
 msgstr "  Версія:                            %d %s\n"
 
-#: src/readelf.c:789
+#: src/readelf.c:978
 #, c-format
 msgid "  Entry point address:               %#<PRIx64>\n"
 msgstr "  Адреса вхідної точки:              %#<PRIx64>\n"
 
-#: src/readelf.c:792
+#: src/readelf.c:981
 #, c-format
 msgid "  Start of program headers:          %<PRId64> %s\n"
 msgstr "  Початок заголовків програм:      %<PRId64> %s\n"
 
-#: src/readelf.c:793 src/readelf.c:796
+#: src/readelf.c:982 src/readelf.c:985
 msgid "(bytes into file)"
 msgstr "(байтів у файл)"
 
-#: src/readelf.c:795
+#: src/readelf.c:984
 #, c-format
 msgid "  Start of section headers:          %<PRId64> %s\n"
 msgstr "  Початок заголовків розділів:     %<PRId64> %s\n"
 
-#: src/readelf.c:798
+#: src/readelf.c:987
 #, c-format
 msgid "  Flags:                             %s\n"
 msgstr "  Прапорці:                          %s\n"
 
-#: src/readelf.c:801
+#: src/readelf.c:990
 #, c-format
 msgid "  Size of this header:               %<PRId16> %s\n"
 msgstr "  Розмір цього заголовка:            %<PRId16> %s\n"
 
-#: src/readelf.c:802 src/readelf.c:805 src/readelf.c:822
+#: src/readelf.c:991 src/readelf.c:994 src/readelf.c:1011
 msgid "(bytes)"
 msgstr "(байтів)"
 
-#: src/readelf.c:804
+#: src/readelf.c:993
 #, c-format
 msgid "  Size of program header entries:    %<PRId16> %s\n"
 msgstr "  Розмір записів заголовка програми:  %<PRId16> %s\n"
 
-#: src/readelf.c:807
+#: src/readelf.c:996
 #, c-format
 msgid "  Number of program headers entries: %<PRId16>"
 msgstr "  Кількість записів заголовків програми: %<PRId16>"
 
-#: src/readelf.c:814
+#: src/readelf.c:1003
 #, c-format
 msgid " (%<PRIu32> in [0].sh_info)"
 msgstr " (%<PRIu32> у [0].sh_info)"
 
-#: src/readelf.c:817 src/readelf.c:834 src/readelf.c:848
+#: src/readelf.c:1006 src/readelf.c:1023 src/readelf.c:1037
 msgid " ([0] not available)"
 msgstr " ([0] недоступний)"
 
-#: src/readelf.c:821
+#: src/readelf.c:1010
 #, c-format
 msgid "  Size of section header entries:    %<PRId16> %s\n"
 msgstr "  Розмір записів заголовків розділів:  %<PRId16> %s\n"
 
-#: src/readelf.c:824
+#: src/readelf.c:1013
 #, c-format
 msgid "  Number of section headers entries: %<PRId16>"
 msgstr "  Кількість записів заголовків розділів: %<PRId16>"
 
-#: src/readelf.c:831
+#: src/readelf.c:1020
 #, c-format
 msgid " (%<PRIu32> in [0].sh_size)"
 msgstr " (%<PRIu32> у [0].sh_size)"
 
-#: src/readelf.c:844
+#: src/readelf.c:1033
 #, c-format
 msgid " (%<PRIu32> in [0].sh_link)"
 msgstr " (%<PRIu32> у [0].sh_link)"
 
-#: src/readelf.c:852
+#: src/readelf.c:1041
 #, c-format
 msgid ""
 "  Section header string table index: XINDEX%s\n"
@@ -4451,7 +4586,7 @@ msgstr ""
 "  Індекс заголовка розділу у таблиці рядків: XINDEX%s\n"
 "\n"
 
-#: src/readelf.c:856
+#: src/readelf.c:1045
 #, c-format
 msgid ""
 "  Section header string table index: %<PRId16>\n"
@@ -4460,7 +4595,7 @@ msgstr ""
 "  Індекс заголовка розділу у таблиці рядків: %<PRId16>\n"
 "\n"
 
-#: src/readelf.c:888
+#: src/readelf.c:1077
 #, c-format
 msgid ""
 "There are %d section headers, starting at offset %#<PRIx64>:\n"
@@ -4469,11 +4604,11 @@ msgstr ""
 "Виявлено %d заголовків розділів, зміщення початку — %#<PRIx64>:\n"
 "\n"
 
-#: src/readelf.c:898
+#: src/readelf.c:1087
 msgid "Section Headers:"
 msgstr "Заголовки розділів:"
 
-#: src/readelf.c:901
+#: src/readelf.c:1090
 msgid ""
 "[Nr] Name                 Type         Addr     Off    Size   ES Flags Lk "
 "Inf Al"
@@ -4481,7 +4616,7 @@ msgstr ""
 "[№ ] Назва                Тип          Адр      Змі    Розмір ES Прап  Lk "
 "Інф Al"
 
-#: src/readelf.c:903
+#: src/readelf.c:1092
 msgid ""
 "[Nr] Name                 Type         Addr             Off      Size     ES "
 "Flags Lk Inf Al"
@@ -4489,31 +4624,17 @@ msgstr ""
 "[№ ] Назва                Тип          Адр              Змі      Розмір   ES "
 "Прап  Lk Інф Al"
 
-#: src/readelf.c:910 src/readelf.c:1063
-#, c-format
-msgid "cannot get section: %s"
-msgstr "не вдалося отримати розділ: %s"
-
-#: src/readelf.c:917 src/readelf.c:1071 src/readelf.c:8343 src/unstrip.c:345
-#: src/unstrip.c:376 src/unstrip.c:425 src/unstrip.c:533 src/unstrip.c:550
-#: src/unstrip.c:586 src/unstrip.c:784 src/unstrip.c:1052 src/unstrip.c:1242
-#: src/unstrip.c:1302 src/unstrip.c:1423 src/unstrip.c:1476 src/unstrip.c:1583
-#: src/unstrip.c:1772
-#, c-format
-msgid "cannot get section header: %s"
-msgstr "не вдалося отримати заголовок розділу: %s"
-
-#: src/readelf.c:975
+#: src/readelf.c:1164
 msgid "Program Headers:"
 msgstr "Заголовки програми:"
 
-#: src/readelf.c:977
+#: src/readelf.c:1166
 msgid ""
 "  Type           Offset   VirtAddr   PhysAddr   FileSiz  MemSiz   Flg Align"
 msgstr ""
 "  Тип            Зміщен   ВіртАдр    ФізАдр     РозмФайл РозмПам  Пра Вирів"
 
-#: src/readelf.c:980
+#: src/readelf.c:1169
 msgid ""
 "  Type           Offset   VirtAddr           PhysAddr           FileSiz  "
 "MemSiz   Flg Align"
@@ -4521,12 +4642,12 @@ msgstr ""
 "  Тип           Зміщен   ВіртАдр            ФізАдр             "
 "РозмФайлРозмПам  Пра Вирів"
 
-#: src/readelf.c:1020
+#: src/readelf.c:1226
 #, c-format
 msgid "\t[Requesting program interpreter: %s]\n"
 msgstr "\t[Запит щодо інтерпретатора програми: %s]\n"
 
-#: src/readelf.c:1041
+#: src/readelf.c:1247
 msgid ""
 "\n"
 " Section to Segment mapping:\n"
@@ -4536,12 +4657,12 @@ msgstr ""
 " Відображення розділів на сегмент:\n"
 "  Розділи сегмента..."
 
-#: src/readelf.c:1052 src/unstrip.c:1827 src/unstrip.c:1866 src/unstrip.c:1873
+#: src/readelf.c:1258 src/unstrip.c:1835 src/unstrip.c:1874 src/unstrip.c:1881
 #, c-format
 msgid "cannot get program header: %s"
 msgstr "не вдалося отримати заголовок програми: %s"
 
-#: src/readelf.c:1193
+#: src/readelf.c:1401
 #, c-format
 msgid ""
 "\n"
@@ -4559,7 +4680,7 @@ msgstr[2] ""
 "\n"
 "Група розділів COMDAT [%2zu] «%s» з підписом «%s» містить %zu записів:\n"
 
-#: src/readelf.c:1198
+#: src/readelf.c:1406
 #, c-format
 msgid ""
 "\n"
@@ -4577,15 +4698,21 @@ msgstr[2] ""
 "\n"
 "Група розділів [%2zu] «%s» з підписом «%s» містить %zu записів:\n"
 
-#: src/readelf.c:1206
+#: src/readelf.c:1414
 msgid "<INVALID SYMBOL>"
 msgstr "<НЕКОРЕКТНИЙ СИМВОЛ>"
 
-#: src/readelf.c:1220
+#: src/readelf.c:1428
 msgid "<INVALID SECTION>"
 msgstr "<НЕКОРЕКТНИЙ РОЗДІЛ>"
 
-#: src/readelf.c:1371
+#: src/readelf.c:1585 src/readelf.c:2202 src/readelf.c:2460 src/readelf.c:2530
+#: src/readelf.c:2812 src/readelf.c:2885 src/readelf.c:4488
+#, fuzzy, c-format
+msgid "invalid sh_link value in section %Zu"
+msgstr "некоректний розділ .debug_line"
+
+#: src/readelf.c:1588
 #, c-format
 msgid ""
 "\n"
@@ -4608,36 +4735,36 @@ msgstr[2] ""
 "Динамічний сегмент містить %lu записів:\n"
 " Адр: %#0*<PRIx64>  Зміщення: %#08<PRIx64>  Пос. на розділ: [%2u] '%s'\n"
 
-#: src/readelf.c:1383
+#: src/readelf.c:1598
 msgid "  Type              Value\n"
 msgstr "  Тип              Значення\n"
 
-#: src/readelf.c:1407
+#: src/readelf.c:1622
 #, c-format
 msgid "Shared library: [%s]\n"
 msgstr "Спільна бібліотека: [%s]\n"
 
-#: src/readelf.c:1412
+#: src/readelf.c:1627
 #, c-format
 msgid "Library soname: [%s]\n"
 msgstr "Назва so бібліотеки: [%s]\n"
 
-#: src/readelf.c:1417
+#: src/readelf.c:1632
 #, c-format
 msgid "Library rpath: [%s]\n"
 msgstr "Rpath бібліотеки: [%s]\n"
 
-#: src/readelf.c:1422
+#: src/readelf.c:1637
 #, c-format
 msgid "Library runpath: [%s]\n"
 msgstr "Runpath бібліотеки: [%s]\n"
 
-#: src/readelf.c:1442
+#: src/readelf.c:1657
 #, c-format
 msgid "%<PRId64> (bytes)\n"
 msgstr "%<PRId64> (байт)\n"
 
-#: src/readelf.c:1554 src/readelf.c:1740
+#: src/readelf.c:1770 src/readelf.c:1957
 #, c-format
 msgid ""
 "\n"
@@ -4646,7 +4773,7 @@ msgstr ""
 "\n"
 "Некоректна таблиця символів за зміщенням %#0<PRIx64>\n"
 
-#: src/readelf.c:1572 src/readelf.c:1757
+#: src/readelf.c:1788 src/readelf.c:1975
 #, c-format
 msgid ""
 "\n"
@@ -4669,7 +4796,7 @@ msgstr[2] ""
 "Розділ пересування [%2zu] «%s» для розділу [%2u] «%s» за зміщенням "
 "%#0<PRIx64> містить %d записів:\n"
 
-#: src/readelf.c:1587
+#: src/readelf.c:1803 src/readelf.c:1990
 #, c-format
 msgid ""
 "\n"
@@ -4687,30 +4814,30 @@ msgstr[2] ""
 "\n"
 "Розділ пересування [%2u] «%s» за зміщенням %#0<PRIx64> містить %d записів:\n"
 
-#: src/readelf.c:1597
+#: src/readelf.c:1813
 msgid "  Offset      Type                 Value       Name\n"
 msgstr "  Зміщення     Тип                  Значення    Назва\n"
 
-#: src/readelf.c:1599
+#: src/readelf.c:1815
 msgid "  Offset              Type                 Value               Name\n"
 msgstr "  Зміщення            Тип                  Значення            Назва\n"
 
-#: src/readelf.c:1652 src/readelf.c:1663 src/readelf.c:1676 src/readelf.c:1694
-#: src/readelf.c:1706 src/readelf.c:1825 src/readelf.c:1837 src/readelf.c:1851
-#: src/readelf.c:1870 src/readelf.c:1883
+#: src/readelf.c:1868 src/readelf.c:1879 src/readelf.c:1892 src/readelf.c:1910
+#: src/readelf.c:1922 src/readelf.c:2056 src/readelf.c:2068 src/readelf.c:2082
+#: src/readelf.c:2101 src/readelf.c:2114
 msgid "<INVALID RELOC>"
 msgstr "<НЕКОРЕКТНЕ ПЕРЕМІЩЕННЯ>"
 
-#: src/readelf.c:1769
+#: src/readelf.c:2000
 msgid "  Offset      Type            Value       Addend Name\n"
 msgstr "  Зміщення    Тип             Значення    Назва додатка\n"
 
-#: src/readelf.c:1771
+#: src/readelf.c:2002
 msgid "  Offset              Type            Value               Addend Name\n"
 msgstr ""
 "  Зміщення            Тип             Значення            Назва додатка\n"
 
-#: src/readelf.c:1972
+#: src/readelf.c:2210
 #, c-format
 msgid ""
 "\n"
@@ -4728,7 +4855,7 @@ msgstr[2] ""
 "\n"
 "Таблиця символів [%2u] «%s» містить %u записів:\n"
 
-#: src/readelf.c:1978
+#: src/readelf.c:2215
 #, c-format
 msgid " %lu local symbol  String table: [%2u] '%s'\n"
 msgid_plural " %lu local symbols  String table: [%2u] '%s'\n"
@@ -4736,33 +4863,33 @@ msgstr[0] " %lu лок. символ   Таблиця символів: [%2u] «
 msgstr[1] " %lu лок. символи  Таблиця символів: [%2u] «%s»\n"
 msgstr[2] " %lu лок. символів Таблиця символів: [%2u] «%s»\n"
 
-#: src/readelf.c:1988
+#: src/readelf.c:2223
 msgid "  Num:    Value   Size Type    Bind   Vis          Ndx Name\n"
 msgstr "  №№      Знач.   Роз. Тип     Зв’яз  Вид.         Інд Назва\n"
 
-#: src/readelf.c:1990
+#: src/readelf.c:2225
 msgid "  Num:            Value   Size Type    Bind   Vis          Ndx Name\n"
 msgstr "  №№              Знач.   Роз. Тип     Зв’яз  Вид.         Інд Назва\n"
 
-#: src/readelf.c:2010
+#: src/readelf.c:2245
 #, 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:2098
+#: src/readelf.c:2333
 #, c-format
 msgid "bad dynamic symbol"
 msgstr "помилковий динамічний символ"
 
-#: src/readelf.c:2180
+#: src/readelf.c:2415
 msgid "none"
 msgstr "немає"
 
-#: src/readelf.c:2197
+#: src/readelf.c:2432
 msgid "| <unknown>"
 msgstr "| <невідомо>"
 
-#: src/readelf.c:2222
+#: src/readelf.c:2463
 #, c-format
 msgid ""
 "\n"
@@ -4785,17 +4912,17 @@ msgstr[2] ""
 "Розділ потреби у версіях [%2u] «%s», що містить %d записів:\n"
 " Адр.: %#0*<PRIx64>  Зміщ.:  %#08<PRIx64>  Посилання на розділ: [%2u] «%s»\n"
 
-#: src/readelf.c:2245
+#: src/readelf.c:2484
 #, c-format
 msgid "  %#06x: Version: %hu  File: %s  Cnt: %hu\n"
 msgstr "  %#06x: Версія: %hu  Файл: %s  Кть: %hu\n"
 
-#: src/readelf.c:2258
+#: src/readelf.c:2497
 #, c-format
 msgid "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 msgstr "  %#06x: Назва: %s  Прап: %s  Версія: %hu\n"
 
-#: src/readelf.c:2289
+#: src/readelf.c:2534
 #, c-format
 msgid ""
 "\n"
@@ -4818,17 +4945,17 @@ msgstr[2] ""
 "Розділ визначення версії [%2u] «%s», що містить %d записів:\n"
 " Адр.: %#0*<PRIx64>  Зміщ.:  %#08<PRIx64>  Посилання на розділ: [%2u] «%s»\n"
 
-#: src/readelf.c:2319
+#: src/readelf.c:2562
 #, 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:2334
+#: src/readelf.c:2577
 #, c-format
 msgid "  %#06x: Parent %d: %s\n"
 msgstr "  %#06x: батьківський %d: %s\n"
 
-#: src/readelf.c:2566
+#: src/readelf.c:2816
 #, c-format
 msgid ""
 "\n"
@@ -4851,15 +4978,15 @@ msgstr[2] ""
 "Розділ символів версій [%2u] «%s», що містить %d записів:\n"
 " Адр.: %#0*<PRIx64>  Зміщ.:  %#08<PRIx64>  Посилання на розділ: [%2u] «%s»"
 
-#: src/readelf.c:2596
+#: src/readelf.c:2844
 msgid "   0 *local*                     "
 msgstr "   0 *локальний*                 "
 
-#: src/readelf.c:2601
+#: src/readelf.c:2849
 msgid "   1 *global*                    "
 msgstr "   1 *загальний*                 "
 
-#: src/readelf.c:2632
+#: src/readelf.c:2890
 #, c-format
 msgid ""
 "\n"
@@ -4887,22 +5014,22 @@ msgstr[2] ""
 "блоками):\n"
 " Адр.: %#0*<PRIx64>  Зміщ.: %#08<PRIx64>  Посилання на розділ: [%2u] «%s»\n"
 
-#: src/readelf.c:2656
+#: src/readelf.c:2912
 #, no-c-format
 msgid " Length  Number  % of total  Coverage\n"
 msgstr " Довжина Номер   % від загал. Покриття\n"
 
-#: src/readelf.c:2658
+#: src/readelf.c:2914
 #, c-format
 msgid "      0  %6<PRIu32>      %5.1f%%\n"
 msgstr "      0  %6<PRIu32>      %5.1f%%\n"
 
-#: src/readelf.c:2665
+#: src/readelf.c:2921
 #, c-format
 msgid "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 msgstr "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 
-#: src/readelf.c:2678
+#: src/readelf.c:2934
 #, c-format
 msgid ""
 " Average number of tests:   successful lookup: %f\n"
@@ -4911,12 +5038,12 @@ msgstr ""
 " Середня кількість тестів:   успішний пошук: %f\n"
 "\t\t\t  неуспішний пошук: %f\n"
 
-#: src/readelf.c:2696 src/readelf.c:2738 src/readelf.c:2779
+#: src/readelf.c:2952 src/readelf.c:2994 src/readelf.c:3035
 #, c-format
 msgid "cannot get data for section %d: %s"
 msgstr "не вдалося отримати дані для розділу %d: %s"
 
-#: src/readelf.c:2833
+#: src/readelf.c:3089
 #, c-format
 msgid ""
 " Symbol Bias: %u\n"
@@ -4926,7 +5053,7 @@ msgstr ""
 " Розмір бітової маски: %zu байтів  %<PRIuFAST32>%% встановлених бітів  зсув "
 "2-го хешу: %u\n"
 
-#: src/readelf.c:2907
+#: src/readelf.c:3164
 #, c-format
 msgid ""
 "\n"
@@ -4947,7 +5074,7 @@ msgstr[2] ""
 "Розділ списку бібліотек [%2zu] «%s» за зміщенням %#0<PRIx64> містить %d "
 "записів:\n"
 
-#: src/readelf.c:2921
+#: src/readelf.c:3178
 msgid ""
 "       Library                       Time Stamp          Checksum Version "
 "Flags"
@@ -4955,7 +5082,7 @@ msgstr ""
 "       Бібліотека                    Часовий штамп       Версія суми      "
 "Прапорці"
 
-#: src/readelf.c:2971
+#: src/readelf.c:3228
 #, c-format
 msgid ""
 "\n"
@@ -4966,135 +5093,140 @@ msgstr ""
 "Розділ атрибутів об’єктів [%2zu] «%s» з %<PRIu64> байтів за зміщенням "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:2987
+#: src/readelf.c:3244
 msgid "  Owner          Size\n"
 msgstr "  Власник        Розмір\n"
 
-#: src/readelf.c:3013
+#: src/readelf.c:3270
 #, c-format
 msgid "  %-13s  %4<PRIu32>\n"
 msgstr "  %-13s  %4<PRIu32>\n"
 
-#: src/readelf.c:3045
+#: src/readelf.c:3302
 #, c-format
 msgid "    %-4u %12<PRIu32>\n"
 msgstr "    %-4u %12<PRIu32>\n"
 
-#: src/readelf.c:3050
+#: src/readelf.c:3307
 #, c-format
 msgid "    File: %11<PRIu32>\n"
 msgstr "    Файл: %11<PRIu32>\n"
 
-#: src/readelf.c:3085
+#: src/readelf.c:3342
 #, c-format
 msgid "      %s: %<PRId64>, %s\n"
 msgstr "      %s: %<PRId64>, %s\n"
 
-#: src/readelf.c:3088
+#: src/readelf.c:3345
 #, c-format
 msgid "      %s: %<PRId64>\n"
 msgstr "      %s: %<PRId64>\n"
 
-#: src/readelf.c:3091
+#: src/readelf.c:3348
 #, c-format
 msgid "      %s: %s\n"
 msgstr "      %s: %s\n"
 
-#: src/readelf.c:3098
+#: src/readelf.c:3355
 #, c-format
 msgid "      %u: %<PRId64>\n"
 msgstr "      %u: %<PRId64>\n"
 
-#: src/readelf.c:3101
+#: src/readelf.c:3358
 #, c-format
 msgid "      %u: %s\n"
 msgstr "      %u: %s\n"
 
-#: src/readelf.c:3137
+#: src/readelf.c:3403
 #, c-format
 msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%s+%#<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3140
+#: src/readelf.c:3406
 #, c-format
 msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3145
+#: src/readelf.c:3411
 #, c-format
 msgid "%#<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%#<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3148
+#: src/readelf.c:3414
 #, c-format
 msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
 msgstr "%#0*<PRIx64> <%s+%#<PRIx64>>"
 
-#: src/readelf.c:3154
+#: src/readelf.c:3420
 #, c-format
 msgid "%s+%#<PRIx64> <%s>"
 msgstr "%s+%#<PRIx64> <%s>"
 
-#: src/readelf.c:3157
+#: src/readelf.c:3423
 #, c-format
 msgid "%s+%#0*<PRIx64> <%s>"
 msgstr "%s+%#0*<PRIx64> <%s>"
 
-#: src/readelf.c:3161
+#: src/readelf.c:3427
 #, c-format
 msgid "%#<PRIx64> <%s>"
 msgstr "%#<PRIx64> <%s>"
 
-#: src/readelf.c:3164
+#: src/readelf.c:3430
 #, c-format
 msgid "%#0*<PRIx64> <%s>"
 msgstr "%#0*<PRIx64> <%s>"
 
-#: src/readelf.c:3169
+#: src/readelf.c:3435
 #, c-format
 msgid "%s+%#<PRIx64>"
 msgstr "%s+%#<PRIx64>"
 
-#: src/readelf.c:3172
+#: src/readelf.c:3438
 #, c-format
 msgid "%s+%#0*<PRIx64>"
 msgstr "%s+%#0*<PRIx64>"
 
-#: src/readelf.c:3554
+#: src/readelf.c:3820
 msgid "empty block"
 msgstr "порожній блок"
 
-#: src/readelf.c:3557
+#: src/readelf.c:3823
 #, c-format
 msgid "%zu byte block:"
 msgstr "%zu-байтовий блок:"
 
-#: src/readelf.c:3934
+#: src/readelf.c:4217
 #, c-format
 msgid "%*s[%4<PRIuMAX>] %s  <TRUNCATED>\n"
 msgstr "%*s[%4<PRIuMAX>] %s  <ОБРІЗАНО>\n"
 
-#: src/readelf.c:3970
+#: src/readelf.c:4274
 #, c-format
 msgid "%s %#<PRIx64> used with different address sizes"
 msgstr "%s %#<PRIx64> використано з різними розмірами адрес"
 
-#: src/readelf.c:3977
+#: src/readelf.c:4281
 #, c-format
 msgid "%s %#<PRIx64> used with different offset sizes"
 msgstr "%s %#<PRIx64> використано з різними розмірами зміщень"
 
-#: src/readelf.c:4057
+#: src/readelf.c:4288
+#, c-format
+msgid "%s %#<PRIx64> used with different base addresses"
+msgstr "%s %#<PRIx64> використано з різними базовими адресами"
+
+#: src/readelf.c:4370
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE IN REST OF SECTION>\n"
 msgstr " [%6tx]  <НЕВИКОРИСТОВУВАНІ ДАНІ У РЕШТІ РОЗДІЛУ>\n"
 
-#: src/readelf.c:4065
+#: src/readelf.c:4378
 #, c-format
 msgid " [%6tx]  <UNUSED GARBAGE> ... %<PRIu64> bytes ...\n"
 msgstr " [%6tx]  <НЕВИКОРИСТОВУВАНІ ДАНІ> ... %<PRIu64> байтів ...\n"
 
-#: src/readelf.c:4087
+#: src/readelf.c:4404
 #, c-format
 msgid ""
 "\n"
@@ -5105,7 +5237,7 @@ msgstr ""
 "Розділ DWARF [%2zu] «%s» зі зміщенням %#<PRIx64>:\n"
 " [ Код]\n"
 
-#: src/readelf.c:4095
+#: src/readelf.c:4412
 #, c-format
 msgid ""
 "\n"
@@ -5114,30 +5246,30 @@ msgstr ""
 "\n"
 "Розділ скорочень за зміщенням %<PRIu64>:\n"
 
-#: src/readelf.c:4108
+#: src/readelf.c:4425
 #, c-format
 msgid " *** error while reading abbreviation: %s\n"
 msgstr " *** помилка під час читання скорочення: %s\n"
 
-#: src/readelf.c:4124
+#: src/readelf.c:4441
 #, c-format
 msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
 msgstr " [%5u] зміщення: %<PRId64>, дочірній: %s, мітка: %s\n"
 
-#: src/readelf.c:4127
+#: src/readelf.c:4444
 msgid "yes"
 msgstr "так"
 
-#: src/readelf.c:4127
+#: src/readelf.c:4444
 msgid "no"
 msgstr "ні"
 
-#: src/readelf.c:4162
+#: src/readelf.c:4478 src/readelf.c:4551
 #, c-format
 msgid "cannot get .debug_aranges content: %s"
 msgstr "не вдалося отримати дані get .debug_aranges: %s"
 
-#: src/readelf.c:4167
+#: src/readelf.c:4493
 #, c-format
 msgid ""
 "\n"
@@ -5155,12 +5287,12 @@ msgstr[2] ""
 "\n"
 "Розділ DWARF [%2zu] «%s» за зміщенням %#<PRIx64> містить %zu записів:\n"
 
-#: src/readelf.c:4198
+#: src/readelf.c:4524
 #, c-format
 msgid " [%*zu] ???\n"
 msgstr " [%*zu] ???\n"
 
-#: src/readelf.c:4200
+#: src/readelf.c:4526
 #, c-format
 msgid ""
 " [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
@@ -5168,13 +5300,8 @@ msgstr ""
 " [%*zu] початок: %0#*<PRIx64>, довжина: %5<PRIu64>, зміщення CU DIE: "
 "%6<PRId64>\n"
 
-#: src/readelf.c:4219
-#, c-format
-msgid "cannot get .debug_ranges content: %s"
-msgstr "не вдалося отримати дані .debug_ranges: %s"
-
-#: src/readelf.c:4224 src/readelf.c:4728 src/readelf.c:5505 src/readelf.c:6006
-#: src/readelf.c:6121 src/readelf.c:6277 src/readelf.c:6699
+#: src/readelf.c:4556 src/readelf.c:4710 src/readelf.c:5231 src/readelf.c:6145
+#: src/readelf.c:6646 src/readelf.c:6766 src/readelf.c:6922 src/readelf.c:7345
 #, c-format
 msgid ""
 "\n"
@@ -5183,37 +5310,119 @@ msgstr ""
 "\n"
 "Розділ DWARF [%2zu] «%s» зі зміщенням %#<PRIx64>:\n"
 
-#: src/readelf.c:4248 src/readelf.c:6031
+#: src/readelf.c:4569 src/readelf.c:6171
+#, c-format
+msgid ""
+"\n"
+"Table at offset %Zu:\n"
+msgstr ""
+"\n"
+"Таблиця за зміщенням %Zu:\n"
+
+#: src/readelf.c:4573 src/readelf.c:5255 src/readelf.c:6180
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr "некоректні дані у розділі [%zu] «%s»"
+
+#: src/readelf.c:4589
+#, c-format
+msgid ""
+"\n"
+" Length:        %6<PRIu64>\n"
+msgstr ""
+"\n"
+" Довжина:       %6<PRIu64>\n"
+
+#: src/readelf.c:4601
+#, c-format
+msgid " DWARF version: %6<PRIuFAST16>\n"
+msgstr " версія DWARF:  %6<PRIuFAST16>\n"
+
+#: src/readelf.c:4605
+#, c-format
+msgid "unsupported aranges version"
+msgstr "непідтримувана версія aranges"
+
+#: src/readelf.c:4616
+#, c-format
+msgid " CU offset:     %6<PRIx64>\n"
+msgstr " зміщення CU:     %6<PRIx64>\n"
+
+#: src/readelf.c:4622
+#, c-format
+msgid " Address size:  %6<PRIu64>\n"
+msgstr " Розмір адреси:  %6<PRIu64>\n"
+
+#: src/readelf.c:4626
+#, c-format
+msgid "unsupported address size"
+msgstr "непідтримуваний розмір адреси"
+
+#: src/readelf.c:4631
+#, c-format
+msgid ""
+" Segment size:  %6<PRIu64>\n"
+"\n"
+msgstr ""
+" Розмір сегмента:  %6<PRIu64>\n"
+"\n"
+
+#: src/readelf.c:4635
+#, c-format
+msgid "unsupported segment size"
+msgstr "непідтримуваний розмір сегмента"
+
+#: src/readelf.c:4675
+#, c-format
+msgid "   %s..%s (%<PRIx64>)\n"
+msgstr "   %s..%s (%<PRIx64>)\n"
+
+#: src/readelf.c:4678
+#, c-format
+msgid "   %s..%s\n"
+msgstr "   %s..%s\n"
+
+#: src/readelf.c:4687
+#, c-format
+msgid "   %Zu padding bytes\n"
+msgstr "   %Zu байтів доповнення\n"
+
+#: src/readelf.c:4705
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr "не вдалося отримати дані .debug_ranges: %s"
+
+#: src/readelf.c:4735 src/readelf.c:6673
 #, c-format
 msgid " [%6tx]  <INVALID DATA>\n"
 msgstr " [%6tx]  <НЕКОРЕКТНІ ДАНІ>\n"
 
-#: src/readelf.c:4270 src/readelf.c:6053
+#: src/readelf.c:4757 src/readelf.c:6695
 #, c-format
 msgid " [%6tx]  base address %s\n"
 msgstr " [%6tx]  базова адреса %s\n"
 
-#: src/readelf.c:4276 src/readelf.c:6059
+#: src/readelf.c:4764 src/readelf.c:6702
 #, c-format
 msgid " [%6tx]  empty list\n"
 msgstr " [%6tx]  порожній список\n"
 
-#: src/readelf.c:4285
+#: src/readelf.c:4775
 #, c-format
 msgid " [%6tx]  %s..%s\n"
 msgstr " [%6tx]  %s..%s\n"
 
-#: src/readelf.c:4287
+#: src/readelf.c:4777
 #, c-format
 msgid "           %s..%s\n"
 msgstr "           %s..%s\n"
 
-#: src/readelf.c:4717 src/readelf.c:6768 src/readelf.c:6870 src/readelf.c:7028
+#: src/readelf.c:5210
 #, c-format
-msgid "cannot get %s content: %s"
-msgstr "не вдалося отримати дані %s: %s"
+msgid "cannot get ELF: %s"
+msgstr "не вдалося отримати ELF: %s"
 
-#: src/readelf.c:4724
+#: src/readelf.c:5227
 #, c-format
 msgid ""
 "\n"
@@ -5222,12 +5431,7 @@ msgstr ""
 "\n"
 "Розділ відомостей щодо вікна викликів [%2zu] «%s» за зміщенням %#<PRIx64>:\n"
 
-#: src/readelf.c:4752 src/readelf.c:5540
-#, c-format
-msgid "invalid data in section [%zu] '%s'"
-msgstr "некоректні дані у розділі [%zu] «%s»"
-
-#: src/readelf.c:4774
+#: src/readelf.c:5277
 #, c-format
 msgid ""
 "\n"
@@ -5236,50 +5440,50 @@ msgstr ""
 "\n"
 " [%6tx] нульовий переривач\n"
 
-#: src/readelf.c:4859
+#: src/readelf.c:5362
 #, c-format
 msgid "invalid augmentation length"
 msgstr "некоректна довжина збільшення"
 
-#: src/readelf.c:4871
+#: src/readelf.c:5374
 msgid "FDE address encoding: "
 msgstr "Кодування адреси FDE: "
 
-#: src/readelf.c:4877
+#: src/readelf.c:5380
 msgid "LSDA pointer encoding: "
 msgstr "Кодування вказівника LSDA: "
 
-#: src/readelf.c:4975
+#: src/readelf.c:5491
 #, c-format
 msgid " (offset: %#<PRIx64>)"
 msgstr " (зміщення: %#<PRIx64>)"
 
-#: src/readelf.c:4982
+#: src/readelf.c:5498
 #, c-format
 msgid " (end offset: %#<PRIx64>)"
 msgstr " (зміщення від кінця: %#<PRIx64>)"
 
-#: src/readelf.c:5009
+#: src/readelf.c:5525
 #, c-format
 msgid "   %-26sLSDA pointer: %#<PRIx64>\n"
 msgstr "   %-26sвказівник LSDA: %#<PRIx64>\n"
 
-#: src/readelf.c:5060
+#: src/readelf.c:5577
 #, c-format
 msgid "cannot get attribute code: %s"
 msgstr "не вдалося отримати код атрибута: %s"
 
-#: src/readelf.c:5069
+#: src/readelf.c:5586
 #, c-format
 msgid "cannot get attribute form: %s"
 msgstr "не вдалося отримати форму атрибута: %s"
 
-#: src/readelf.c:5084
+#: src/readelf.c:5601
 #, c-format
 msgid "cannot get attribute value: %s"
 msgstr "не вдалося отримати значення атрибута: %s"
 
-#: src/readelf.c:5342
+#: src/readelf.c:5894
 #, c-format
 msgid ""
 "\n"
@@ -5290,7 +5494,7 @@ msgstr ""
 "Розділ DWARF [%2zu] «%s» за зміщенням %#<PRIx64>:\n"
 " [Зміщення]\n"
 
-#: src/readelf.c:5374
+#: src/readelf.c:5926
 #, c-format
 msgid ""
 " Type unit at offset %<PRIu64>:\n"
@@ -5303,7 +5507,7 @@ msgstr ""
 "Зміщення: %<PRIu8>\n"
 " Підпис типу: %#<PRIx64>, Зміщення типу: %#<PRIx64>\n"
 
-#: src/readelf.c:5383
+#: src/readelf.c:5935
 #, c-format
 msgid ""
 " Compilation unit at offset %<PRIu64>:\n"
@@ -5314,47 +5518,49 @@ msgstr ""
 " Версія: %<PRIu16>, Зміщення розділу скорочень: %<PRIu64>, Адреса: %<PRIu8>, "
 "Зміщення: %<PRIu8>\n"
 
-#: src/readelf.c:5409
+#: src/readelf.c:5960
 #, c-format
 msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
 msgstr "не вдалося отримати DIE за зміщенням %<PRIu64> у розділі «%s»: %s"
 
-#: src/readelf.c:5421
+#: src/readelf.c:5974
 #, c-format
 msgid "cannot get DIE offset: %s"
 msgstr "не вдалося отримати зміщення DIE: %s"
 
-#: src/readelf.c:5430
+#: src/readelf.c:5983
 #, c-format
 msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
 msgstr ""
 "не вдалося отримати мітку DIE за зміщенням %<PRIu64> у розділі «%s»: %s"
 
-#: src/readelf.c:5461
+#: src/readelf.c:6015
 #, c-format
 msgid "cannot get next DIE: %s\n"
 msgstr "не вдалося визначити наступний DIE: %s\n"
 
-#: src/readelf.c:5469
+#: src/readelf.c:6023
 #, c-format
 msgid "cannot get next DIE: %s"
 msgstr "не вдалося визначити наступний DIE: %s"
 
-#: src/readelf.c:5518
-#, c-format
-msgid "cannot get line data section data: %s"
-msgstr "не вдалося отримати дані розділу лінійних даних: %s"
-
-#: src/readelf.c:5531
+#: src/readelf.c:6059
 #, c-format
 msgid ""
 "\n"
-"Table at offset %Zu:\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+"\n"
 msgstr ""
 "\n"
-"Таблиця за зміщенням %Zu:\n"
+"Розділ DWARF [%2zu] «%s» зі зміщенням %#<PRIx64>:\n"
+"\n"
 
-#: src/readelf.c:5586
+#: src/readelf.c:6158
+#, c-format
+msgid "cannot get line data section data: %s"
+msgstr "не вдалося отримати дані розділу лінійних даних: %s"
+
+#: src/readelf.c:6226
 #, c-format
 msgid ""
 "\n"
@@ -5383,12 +5589,12 @@ msgstr ""
 "\n"
 "Коди операцій:\n"
 
-#: src/readelf.c:5607
+#: src/readelf.c:6247
 #, c-format
 msgid "invalid data at offset %tu in section [%zu] '%s'"
 msgstr "некоректні дані зі зміщенням %tu у розділі [%zu] «%s»"
 
-#: src/readelf.c:5622
+#: src/readelf.c:6262
 #, c-format
 msgid "  [%*<PRIuFAST8>]  %hhu argument\n"
 msgid_plural "  [%*<PRIuFAST8>]  %hhu arguments\n"
@@ -5396,7 +5602,7 @@ msgstr[0] "  [%*<PRIuFAST8>]  %hhu аргумент\n"
 msgstr[1] "  [%*<PRIuFAST8>]  %hhu аргументи\n"
 msgstr[2] "  [%*<PRIuFAST8>]  %hhu аргументів\n"
 
-#: src/readelf.c:5630
+#: src/readelf.c:6270
 msgid ""
 "\n"
 "Directory table:"
@@ -5404,7 +5610,7 @@ msgstr ""
 "\n"
 "Таблиця каталогу:"
 
-#: src/readelf.c:5646
+#: src/readelf.c:6286
 msgid ""
 "\n"
 "File name table:\n"
@@ -5414,7 +5620,7 @@ msgstr ""
 "Таблиця назв файлів:\n"
 " Запис Кат   Час       Розмір    Назва"
 
-#: src/readelf.c:5675
+#: src/readelf.c:6315
 msgid ""
 "\n"
 "Line number statements:"
@@ -5422,115 +5628,115 @@ msgstr ""
 "\n"
 "Оператори номерів рядків:"
 
-#: src/readelf.c:5751
+#: src/readelf.c:6391
 #, c-format
 msgid " special opcode %u: address+%u = %s, op_index = %u, line%+d = %zu\n"
 msgstr ""
 " спеціальний код операції %u: адреса+%u = %s, індекс_оп = %u, рядок%+d = "
 "%zu\n"
 
-#: src/readelf.c:5756
+#: src/readelf.c:6396
 #, c-format
 msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
 msgstr " спеціальний код операції %u: адреса+%u = %s, рядок%+d = %zu\n"
 
-#: src/readelf.c:5776
+#: src/readelf.c:6416
 #, c-format
 msgid " extended opcode %u: "
 msgstr " розширений код операції %u: "
 
-#: src/readelf.c:5781
+#: src/readelf.c:6421
 msgid " end of sequence"
 msgstr " кінець послідовності"
 
-#: src/readelf.c:5798
+#: src/readelf.c:6438
 #, c-format
 msgid " set address to %s\n"
 msgstr " встановити адресу у значення %s\n"
 
-#: src/readelf.c:5819
+#: src/readelf.c:6459
 #, 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:5832
+#: src/readelf.c:6472
 #, c-format
 msgid " set discriminator to %u\n"
 msgstr " встановити розрізнення для %u\n"
 
-#: src/readelf.c:5837
+#: src/readelf.c:6477
 msgid " unknown opcode"
 msgstr " невідомий код операції"
 
-#: src/readelf.c:5849
+#: src/readelf.c:6489
 msgid " copy"
 msgstr " копія"
 
-#: src/readelf.c:5860
+#: src/readelf.c:6500
 #, c-format
 msgid " advance address by %u to %s, op_index to %u\n"
 msgstr " збільшення адреси на %u до %s, індекс_оп до %u\n"
 
-#: src/readelf.c:5864
+#: src/readelf.c:6504
 #, c-format
 msgid " advance address by %u to %s\n"
 msgstr " збільшення адреси на %u до %s\n"
 
-#: src/readelf.c:5875
+#: src/readelf.c:6515
 #, c-format
 msgid " advance line by constant %d to %<PRId64>\n"
 msgstr " просувати рядок на сталу %d до %<PRId64>\n"
 
-#: src/readelf.c:5883
+#: src/readelf.c:6523
 #, c-format
 msgid " set file to %<PRIu64>\n"
 msgstr " встановити файл у %<PRIu64>\n"
 
-#: src/readelf.c:5893
+#: src/readelf.c:6533
 #, c-format
 msgid " set column to %<PRIu64>\n"
 msgstr " встановити значення стовпчика %<PRIu64>\n"
 
-#: src/readelf.c:5900
+#: src/readelf.c:6540
 #, c-format
 msgid " set '%s' to %<PRIuFAST8>\n"
 msgstr " встановити «%s» у %<PRIuFAST8>\n"
 
-#: src/readelf.c:5906
+#: src/readelf.c:6546
 msgid " set basic block flag"
 msgstr " встановити прапорець базового блоку"
 
-#: src/readelf.c:5915
+#: src/readelf.c:6555
 #, c-format
 msgid " advance address by constant %u to %s, op_index to %u\n"
 msgstr " збільшити адресу на сталу величину %u до %s, індекс_оп до %u\n"
 
-#: src/readelf.c:5919
+#: src/readelf.c:6559
 #, c-format
 msgid " advance address by constant %u to %s\n"
 msgstr " збільшити адресу на сталу величину %u до %s\n"
 
-#: src/readelf.c:5937
+#: src/readelf.c:6577
 #, c-format
 msgid " advance address by fixed value %u to %s\n"
 msgstr " збільшити адресу на фіксовану величину %u до %s\n"
 
-#: src/readelf.c:5946
+#: src/readelf.c:6586
 msgid " set prologue end flag"
 msgstr " встановити прапорець кінця вступу"
 
-#: src/readelf.c:5951
+#: src/readelf.c:6591
 msgid " set epilogue begin flag"
 msgstr " встановити прапорець початку епілогу"
 
-#: src/readelf.c:5960
+#: src/readelf.c:6600
 #, c-format
 msgid " set isa to %u\n"
 msgstr " встановити isa у %u\n"
 
-#: src/readelf.c:5969
+#: src/readelf.c:6609
 #, c-format
 msgid " unknown opcode with %<PRIu8> parameter:"
 msgid_plural " unknown opcode with %<PRIu8> parameters:"
@@ -5538,97 +5744,97 @@ msgstr[0] " невідомий код операції з %<PRIu8> параме
 msgstr[1] " невідомий код операції з %<PRIu8> параметрами:"
 msgstr[2] " невідомий код операції з %<PRIu8> параметрами:"
 
-#: src/readelf.c:6001
+#: src/readelf.c:6641
 #, c-format
 msgid "cannot get .debug_loc content: %s"
 msgstr "не вдалося отримати вміст .debug_loc: %s"
 
-#: src/readelf.c:6071
+#: src/readelf.c:6716
 #, c-format
 msgid " [%6tx]  %s..%s"
 msgstr " [%6tx]  %s..%s"
 
-#: src/readelf.c:6073
+#: src/readelf.c:6718
 #, c-format
 msgid "           %s..%s"
 msgstr "           %s..%s"
 
-#: src/readelf.c:6080
+#: src/readelf.c:6725
 msgid "   <INVALID DATA>\n"
 msgstr "   <НЕКОРЕКТНІ ДАНІ>\n"
 
-#: src/readelf.c:6132 src/readelf.c:6286
+#: src/readelf.c:6777 src/readelf.c:6931
 #, c-format
 msgid "cannot get macro information section data: %s"
 msgstr "не вдалося отримати дані розділу відомостей щодо макросів: %s"
 
-#: src/readelf.c:6211
+#: src/readelf.c:6856
 #, c-format
 msgid "%*s*** non-terminated string at end of section"
 msgstr "%*s*** незавершений рядок наприкінці розділу"
 
-#: src/readelf.c:6327
-#, fuzzy, c-format
+#: src/readelf.c:6972
+#, c-format
 msgid " Offset:             0x%<PRIx64>\n"
-msgstr " Зміщення:           0x%zx\n"
+msgstr " Зміщення:           0x%<PRIx64>\n"
 
-#: src/readelf.c:6339
+#: src/readelf.c:6984
 #, c-format
 msgid " Version:            %<PRIu16>\n"
 msgstr " Версія:             %<PRIu16>\n"
 
-#: src/readelf.c:6345 src/readelf.c:7055
+#: src/readelf.c:6990 src/readelf.c:7703
 #, c-format
 msgid "  unknown version, cannot parse section\n"
 msgstr "  невідома версія, не вдалося обробити розділ\n"
 
-#: src/readelf.c:6352
+#: src/readelf.c:6997
 #, c-format
 msgid " Flag:               0x%<PRIx8>\n"
 msgstr " Прапорець:          0x%<PRIx8>\n"
 
-#: src/readelf.c:6355
+#: src/readelf.c:7000
 #, c-format
 msgid " Offset length:      %<PRIu8>\n"
 msgstr " Довжина зміщення:   %<PRIu8>\n"
 
-#: src/readelf.c:6363
+#: src/readelf.c:7008
 #, c-format
 msgid " .debug_line offset: 0x%<PRIx64>\n"
 msgstr " зміщення .debug_line: 0x%<PRIx64>\n"
 
-#: src/readelf.c:6375
+#: src/readelf.c:7021
 #, c-format
 msgid "  extension opcode table, %<PRIu8> items:\n"
 msgstr "  таблиця кодів операцій розширень, записів — %<PRIu8>:\n"
 
-#: src/readelf.c:6382
+#: src/readelf.c:7028
 #, c-format
 msgid "    [%<PRIx8>]"
 msgstr "    [%<PRIx8>]"
 
-#: src/readelf.c:6394
+#: src/readelf.c:7040
 #, c-format
 msgid " %<PRIu8> arguments:"
 msgstr " %<PRIu8> аргументів:"
 
-#: src/readelf.c:6422
+#: src/readelf.c:7068
 #, c-format
 msgid " no arguments."
 msgstr " немає аргументів."
 
-#: src/readelf.c:6657
+#: src/readelf.c:7303
 #, c-format
 msgid "vendor opcode not verified?"
 msgstr "код операції постачальника не перевірено?"
 
-#: src/readelf.c:6685
+#: src/readelf.c:7331
 #, 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:6726
+#: src/readelf.c:7372
 #, c-format
 msgid ""
 "\n"
@@ -5639,12 +5845,12 @@ msgstr ""
 "Розділ DWARF [%2zu] «%s» зі зміщенням %#<PRIx64>:\n"
 " %*s  Рядок\n"
 
-#: src/readelf.c:6740
+#: src/readelf.c:7386
 #, c-format
 msgid " *** error while reading strings: %s\n"
 msgstr " *** помилка під час читання рядків: %s\n"
 
-#: src/readelf.c:6760
+#: src/readelf.c:7406
 #, c-format
 msgid ""
 "\n"
@@ -5653,7 +5859,7 @@ msgstr ""
 "\n"
 "Розділ таблиці пошуку вікон виклику [%2zu] '.eh_frame_hdr':\n"
 
-#: src/readelf.c:6862
+#: src/readelf.c:7508
 #, c-format
 msgid ""
 "\n"
@@ -5662,22 +5868,22 @@ msgstr ""
 "\n"
 "Розділ таблиці обробки виключень [%2zu] '.gcc_except_table':\n"
 
-#: src/readelf.c:6885
+#: src/readelf.c:7531
 #, c-format
 msgid " LPStart encoding:    %#x "
 msgstr " Кодування LPStart:   %#x "
 
-#: src/readelf.c:6897
+#: src/readelf.c:7543
 #, c-format
 msgid " TType encoding:      %#x "
 msgstr " Кодування TType:     %#x "
 
-#: src/readelf.c:6911
+#: src/readelf.c:7557
 #, c-format
 msgid " Call site encoding:  %#x "
 msgstr " Кодування місця виклику:%#x "
 
-#: src/readelf.c:6924
+#: src/readelf.c:7570
 msgid ""
 "\n"
 " Call site table:"
@@ -5685,7 +5891,7 @@ msgstr ""
 "\n"
 " Таблиця місця виклику:"
 
-#: src/readelf.c:6938
+#: src/readelf.c:7584
 #, c-format
 msgid ""
 " [%4u] Call site start:   %#<PRIx64>\n"
@@ -5698,12 +5904,12 @@ msgstr ""
 "        Місце застосування:   %#<PRIx64>\n"
 "        Дія:                  %u\n"
 
-#: src/readelf.c:6998
+#: src/readelf.c:7644
 #, c-format
 msgid "invalid TType encoding"
 msgstr "некоректне кодування TType"
 
-#: src/readelf.c:7019
+#: src/readelf.c:7665
 #, c-format
 msgid ""
 "\n"
@@ -5712,37 +5918,37 @@ msgstr ""
 "\n"
 "Розділ GDB [%2zu] «%s» за зміщенням %#<PRIx64> містить %<PRId64> байтів:\n"
 
-#: src/readelf.c:7048
+#: src/readelf.c:7694
 #, c-format
 msgid " Version:         %<PRId32>\n"
 msgstr " Версія:          %<PRId32>\n"
 
-#: src/readelf.c:7064
+#: src/readelf.c:7712
 #, c-format
 msgid " CU offset:       %#<PRIx32>\n"
 msgstr " зміщення CU:     %#<PRIx32>\n"
 
-#: src/readelf.c:7071
+#: src/readelf.c:7719
 #, c-format
 msgid " TU offset:       %#<PRIx32>\n"
 msgstr " зміщення TU:      %#<PRIx32>\n"
 
-#: src/readelf.c:7078
+#: src/readelf.c:7726
 #, c-format
 msgid " address offset:  %#<PRIx32>\n"
 msgstr " зміщення адреси: %#<PRIx32>\n"
 
-#: src/readelf.c:7085
+#: src/readelf.c:7733
 #, c-format
 msgid " symbol offset:   %#<PRIx32>\n"
 msgstr " зміщення символу: %#<PRIx32>\n"
 
-#: src/readelf.c:7092
+#: src/readelf.c:7740
 #, c-format
 msgid " constant offset: %#<PRIx32>\n"
 msgstr " стале зміщення:  %#<PRIx32>\n"
 
-#: src/readelf.c:7099
+#: src/readelf.c:7747
 #, c-format
 msgid ""
 "\n"
@@ -5751,7 +5957,7 @@ msgstr ""
 "\n"
 " Список CU зі зміщенням %#<PRIx32> містить %zu записів:\n"
 
-#: src/readelf.c:7121
+#: src/readelf.c:7769
 #, c-format
 msgid ""
 "\n"
@@ -5760,7 +5966,7 @@ msgstr ""
 "\n"
 " Список TU зі зміщенням %#<PRIx32> містить %zu записів:\n"
 
-#: src/readelf.c:7147
+#: src/readelf.c:7795
 #, c-format
 msgid ""
 "\n"
@@ -5769,7 +5975,7 @@ msgstr ""
 "\n"
 " Список адрес зі зміщенням %#<PRIx32> містить %zu записів:\n"
 
-#: src/readelf.c:7174
+#: src/readelf.c:7824
 #, c-format
 msgid ""
 "\n"
@@ -5778,17 +5984,17 @@ msgstr ""
 "\n"
 " Таблиця символів за зміщенням %#<PRIx32> містить %zu позицій:\n"
 
-#: src/readelf.c:7259
+#: src/readelf.c:7909
 #, c-format
 msgid "cannot get debug context descriptor: %s"
 msgstr "не вдалося отримати дескриптор контексту зневаджування: %s"
 
-#: src/readelf.c:7409 src/readelf.c:8010
+#: src/readelf.c:8069 src/readelf.c:8675 src/readelf.c:8786 src/readelf.c:8844
 #, c-format
 msgid "cannot convert core note data: %s"
 msgstr "не вдалося перетворити дані запису ядра: %s"
 
-#: src/readelf.c:7750
+#: src/readelf.c:8416
 #, c-format
 msgid ""
 "\n"
@@ -5797,21 +6003,21 @@ msgstr ""
 "\n"
 "%*s... <повторюється %u разів> ..."
 
-#: src/readelf.c:8109
+#: src/readelf.c:8919
 msgid "  Owner          Data size  Type\n"
 msgstr "  Власник        Розм. даних Тип\n"
 
-#: src/readelf.c:8127
+#: src/readelf.c:8937
 #, c-format
 msgid "  %-13.*s  %9<PRId32>  %s\n"
 msgstr "  %-13.*s  %9<PRId32>  %s\n"
 
-#: src/readelf.c:8161
+#: src/readelf.c:8987
 #, c-format
 msgid "cannot get content of note section: %s"
 msgstr "не вдалося отримати вміст розділу записів: %s"
 
-#: src/readelf.c:8188
+#: src/readelf.c:9014
 #, c-format
 msgid ""
 "\n"
@@ -5821,7 +6027,7 @@ msgstr ""
 "Розділ записів (note) [%2zu] «%s» з %<PRIu64> байтів за зміщенням "
 "%#0<PRIx64>:\n"
 
-#: src/readelf.c:8211
+#: src/readelf.c:9037
 #, c-format
 msgid ""
 "\n"
@@ -5830,7 +6036,7 @@ msgstr ""
 "\n"
 "Сегмент записів з %<PRIu64> байтів за зміщенням %#0<PRIx64>:\n"
 
-#: src/readelf.c:8257
+#: src/readelf.c:9083
 #, c-format
 msgid ""
 "\n"
@@ -5839,12 +6045,12 @@ msgstr ""
 "\n"
 "У розділі [%Zu] «%s» не міститься даних для створення дампу.\n"
 
-#: src/readelf.c:8263 src/readelf.c:8286
+#: src/readelf.c:9089 src/readelf.c:9112
 #, c-format
 msgid "cannot get data for section [%Zu] '%s': %s"
 msgstr "не вдалося отримати дані для розділу [%Zu] «%s»: %s"
 
-#: src/readelf.c:8267
+#: src/readelf.c:9093
 #, c-format
 msgid ""
 "\n"
@@ -5853,7 +6059,7 @@ msgstr ""
 "\n"
 "Шіст. дамп розділу [%Zu] «%s», %<PRIu64> байтів за зміщенням %#0<PRIx64>:\n"
 
-#: src/readelf.c:8280
+#: src/readelf.c:9106
 #, c-format
 msgid ""
 "\n"
@@ -5862,7 +6068,7 @@ msgstr ""
 "\n"
 "У розділі [%Zu] «%s» не міститься рядків для створення дампу.\n"
 
-#: src/readelf.c:8290
+#: src/readelf.c:9116
 #, c-format
 msgid ""
 "\n"
@@ -5871,7 +6077,7 @@ msgstr ""
 "\n"
 "Розділ рядків [%Zu] «%s» містить %<PRIu64> байтів за зміщенням %#0<PRIx64>:\n"
 
-#: src/readelf.c:8338
+#: src/readelf.c:9164
 #, c-format
 msgid ""
 "\n"
@@ -5880,7 +6086,7 @@ msgstr ""
 "\n"
 "розділу [%lu] не існує"
 
-#: src/readelf.c:8367
+#: src/readelf.c:9193
 #, c-format
 msgid ""
 "\n"
@@ -5889,12 +6095,12 @@ msgstr ""
 "\n"
 "розділу «%s» не існує"
 
-#: src/readelf.c:8424
+#: src/readelf.c:9250
 #, c-format
 msgid "cannot get symbol index of archive '%s': %s"
 msgstr "не вдалося отримати покажчик символів архіву «%s»: %s"
 
-#: src/readelf.c:8427
+#: src/readelf.c:9253
 #, c-format
 msgid ""
 "\n"
@@ -5903,7 +6109,7 @@ msgstr ""
 "\n"
 "У архіві «%s» немає покажчика символів\n"
 
-#: src/readelf.c:8431
+#: src/readelf.c:9257
 #, c-format
 msgid ""
 "\n"
@@ -5912,12 +6118,12 @@ msgstr ""
 "\n"
 "Покажчик архіву «%s» містить %Zu записів:\n"
 
-#: src/readelf.c:8449
+#: src/readelf.c:9275
 #, c-format
 msgid "cannot extract member at offset %Zu in '%s': %s"
 msgstr "не вдалося видобути елемент за зміщенням %Zu у «%s»: %s"
 
-#: src/readelf.c:8454
+#: src/readelf.c:9280
 #, c-format
 msgid "Archive member '%s' contains:\n"
 msgstr "Елемент архіву «%s» містить:\n"
@@ -5983,12 +6189,12 @@ msgstr "Некоректна основа числення: %s"
 msgid "%s: file format not recognized"
 msgstr "%s: не вдалося розпізнати формат файла"
 
-#: src/size.c:438 src/size.c:581
+#: src/size.c:438 src/size.c:571
 #, c-format
 msgid " (ex %s)"
 msgstr " (прикл. %s)"
 
-#: src/size.c:606
+#: src/size.c:596
 msgid "(TOTALS)\n"
 msgstr "(ЗАГАЛОМ)\n"
 
@@ -6030,27 +6236,27 @@ msgstr "Замінник --radix=o"
 msgid "Print the strings of printable characters in files."
 msgstr "Вивести рядки файлів з символів, придатних для друку."
 
-#: src/strings.c:260 src/strings.c:295
+#: src/strings.c:267 src/strings.c:302
 #, c-format
 msgid "invalid value '%s' for %s parameter"
 msgstr "некоректне значення «%s» параметра %s"
 
-#: src/strings.c:306
+#: src/strings.c:313
 #, c-format
 msgid "invalid minimum length of matched string size"
 msgstr "некоректна мінімальна довжина розмірності рядка для порівняння"
 
-#: src/strings.c:591
+#: src/strings.c:596
 #, c-format
 msgid "lseek64 failed"
 msgstr "помилка lseek64"
 
-#: src/strings.c:608 src/strings.c:672
+#: src/strings.c:613 src/strings.c:677
 #, c-format
 msgid "re-mmap failed"
 msgstr "помилка повторного використання mmap"
 
-#: src/strings.c:645
+#: src/strings.c:650
 #, c-format
 msgid "mprotect failed"
 msgstr "помилка mprotect"
@@ -6123,7 +6329,7 @@ msgstr "параметр -f вказано двічі"
 msgid "-F option specified twice"
 msgstr "параметр -F вказано двічі"
 
-#: src/strip.c:249 src/unstrip.c:117
+#: src/strip.c:249 src/unstrip.c:121
 #, c-format
 msgid "-o option specified twice"
 msgstr "параметр -o вказано двічі"
@@ -6150,87 +6356,87 @@ msgstr ""
 "%s: не можна використовувати -o або -f під час вилучення додаткового вмісту "
 "архіву"
 
-#: src/strip.c:467
+#: src/strip.c:468
 #, c-format
 msgid "cannot open EBL backend"
 msgstr "не вдалося відкрити канал сервера EBL"
 
-#: src/strip.c:517 src/strip.c:541
+#: src/strip.c:518 src/strip.c:542
 #, c-format
 msgid "cannot create new file '%s': %s"
 msgstr "не вдалося створити файл «%s»: %s"
 
-#: src/strip.c:601
+#: src/strip.c:608
 #, c-format
 msgid "illformed file '%s'"
 msgstr "помилкове форматування файла «%s»"
 
-#: src/strip.c:905 src/strip.c:994
+#: src/strip.c:930 src/strip.c:1019
 #, c-format
 msgid "while generating output file: %s"
 msgstr "під час спроби створення файла з виведеними даними: %s"
 
-#: src/strip.c:967 src/strip.c:1929
+#: src/strip.c:992 src/strip.c:1957
 #, c-format
 msgid "%s: error while creating ELF header: %s"
 msgstr "%s: помилка під час створення заголовка ELF: %s"
 
-#: src/strip.c:981
+#: src/strip.c:1006
 #, c-format
 msgid "while preparing output for '%s'"
 msgstr "під час приготування виведених даних для «%s»"
 
-#: src/strip.c:1032 src/strip.c:1088
+#: src/strip.c:1057 src/strip.c:1114
 #, c-format
 msgid "while create section header section: %s"
 msgstr "під час створення розділу заголовка розділу: %s"
 
-#: src/strip.c:1038
+#: src/strip.c:1063
 #, c-format
 msgid "cannot allocate section data: %s"
 msgstr "не вдалося розмістити дані розділу: %s"
 
-#: src/strip.c:1097
+#: src/strip.c:1123
 #, c-format
 msgid "while create section header string table: %s"
 msgstr "під час створення таблиці рядків заголовка розділу: %s"
 
-#: src/strip.c:1724
+#: src/strip.c:1752
 #, c-format
 msgid "bad relocation"
 msgstr "помилкове пересування"
 
-#: src/strip.c:1841 src/strip.c:1951
+#: src/strip.c:1869 src/strip.c:1979
 #, c-format
 msgid "while writing '%s': %s"
 msgstr "під час запису «%s»: %s"
 
-#: src/strip.c:1852
+#: src/strip.c:1880
 #, c-format
 msgid "while creating '%s'"
 msgstr "під час спроби створення «%s»"
 
-#: src/strip.c:1874
+#: src/strip.c:1902
 #, c-format
 msgid "while computing checksum for debug information"
 msgstr "під час обчислення контрольної суми для діагностичних даних"
 
-#: src/strip.c:1937
+#: src/strip.c:1965
 #, c-format
 msgid "%s: error while reading the file: %s"
 msgstr "%s: помилка під час читання файла: %s"
 
-#: src/strip.c:1976 src/strip.c:1996
+#: src/strip.c:2004 src/strip.c:2024
 #, c-format
 msgid "while writing '%s'"
 msgstr "під час спроби запису «%s»"
 
-#: src/strip.c:2030 src/strip.c:2037
+#: src/strip.c:2061 src/strip.c:2068
 #, c-format
 msgid "error while finishing '%s': %s"
 msgstr "помилка під час завершення «%s»: %s"
 
-#: src/strip.c:2060 src/strip.c:2117
+#: src/strip.c:2091 src/strip.c:2148
 #, c-format
 msgid "cannot set access and modification date of '%s'"
 msgstr "не вдалося встановити права доступу та дату зміни «%s»"
@@ -6269,211 +6475,215 @@ msgstr "Застосувати пересування до вмісту розд
 msgid "Only list module and file names, build IDs"
 msgstr "Вивести лише список назв модулів, файлів, побудувати ідентифікатори"
 
-#: src/unstrip.c:126
+#: src/unstrip.c:86
+msgid "Force combining files even if some ELF headers don't seem to match"
+msgstr ""
+
+#: src/unstrip.c:130
 #, c-format
 msgid "-d option specified twice"
 msgstr "параметр -d вказано двічі"
 
-#: src/unstrip.c:158
+#: src/unstrip.c:165
 #, c-format
 msgid "only one of -o or -d allowed"
 msgstr "можна використовувати лише один з параметрів: -o або -d"
 
-#: src/unstrip.c:167
+#: src/unstrip.c:174
 #, c-format
 msgid "-n cannot be used with explicit files or -o or -d"
 msgstr ""
 "-n не можна використовувати з файлами, заданими явно, або параметрами -o і -d"
 
-#: src/unstrip.c:182
+#: src/unstrip.c:189
 #, c-format
 msgid "output directory '%s'"
 msgstr "каталог виведення даних «%s»"
 
-#: src/unstrip.c:191
+#: src/unstrip.c:198
 #, c-format
 msgid "exactly two file arguments are required"
 msgstr "як аргументи має бути вказано точно два файла"
 
-#: src/unstrip.c:197
+#: src/unstrip.c:204
 #, c-format
 msgid "-m, -a, -R, and -i options not allowed with explicit files"
 msgstr ""
 "для файлів, заданих явно, не можна використовувати параметри -m, -a, -R і -i"
 
-#: src/unstrip.c:210
+#: src/unstrip.c:217
 #, c-format
 msgid "-o or -d is required when using implicit files"
 msgstr ""
 "якщо використовуються файли, задані неявно, слід додавати параметр -o або -d"
 
-#: src/unstrip.c:246
+#: src/unstrip.c:253
 #, c-format
 msgid "cannot create ELF header: %s"
 msgstr "не вдалося створити заголовок ELF: %s"
 
-#: src/unstrip.c:251
+#: src/unstrip.c:258
 #, c-format
 msgid "cannot copy ELF header: %s"
 msgstr "не вдалося скопіювати заголовок ELF: %s"
 
-#: src/unstrip.c:256 src/unstrip.c:1820
+#: src/unstrip.c:263 src/unstrip.c:1828
 #, c-format
 msgid "cannot create program headers: %s"
 msgstr "не вдалося створити заголовки програми: %s"
 
-#: src/unstrip.c:262
+#: src/unstrip.c:269
 #, c-format
 msgid "cannot copy program header: %s"
 msgstr "не вдалося скопіювати заголовок програми: %s"
 
-#: src/unstrip.c:272
+#: src/unstrip.c:279
 #, c-format
 msgid "cannot copy section header: %s"
 msgstr "не вдалося скопіювати заголовок розділу: %s"
 
-#: src/unstrip.c:275 src/unstrip.c:1501
+#: src/unstrip.c:282 src/unstrip.c:1509
 #, c-format
 msgid "cannot get section data: %s"
 msgstr "не вдалося отримати дані розділу: %s"
 
-#: src/unstrip.c:277 src/unstrip.c:1503
+#: src/unstrip.c:284 src/unstrip.c:1511
 #, c-format
 msgid "cannot copy section data: %s"
 msgstr "не вдалося скопіювати дані розділу: %s"
 
-#: src/unstrip.c:301
+#: src/unstrip.c:308
 #, c-format
 msgid "cannot create directory '%s'"
 msgstr "не вдалося створити каталог «%s»"
 
-#: src/unstrip.c:341 src/unstrip.c:758 src/unstrip.c:1535
+#: src/unstrip.c:348 src/unstrip.c:765 src/unstrip.c:1543
 #, c-format
 msgid "cannot get symbol table entry: %s"
 msgstr "не вдалося отримати запис таблиці символів: %s"
 
-#: src/unstrip.c:357 src/unstrip.c:575 src/unstrip.c:596 src/unstrip.c:608
-#: src/unstrip.c:1556 src/unstrip.c:1686 src/unstrip.c:1710
+#: src/unstrip.c:364 src/unstrip.c:582 src/unstrip.c:603 src/unstrip.c:615
+#: src/unstrip.c:1564 src/unstrip.c:1694 src/unstrip.c:1718
 #, c-format
 msgid "cannot update symbol table: %s"
 msgstr "не вдалося оновити таблицю символів: %s"
 
-#: src/unstrip.c:367
+#: src/unstrip.c:374
 #, c-format
 msgid "cannot update section header: %s"
 msgstr "не вдалося оновити заголовок розділу: %s"
 
-#: src/unstrip.c:406 src/unstrip.c:417
+#: src/unstrip.c:413 src/unstrip.c:424
 #, c-format
 msgid "cannot update relocation: %s"
 msgstr "не вдалося оновити пересування: %s"
 
-#: src/unstrip.c:504
+#: src/unstrip.c:511
 #, c-format
 msgid "cannot get symbol version: %s"
 msgstr "не вдалося отримати версію символу: %s"
 
-#: src/unstrip.c:516
+#: src/unstrip.c:523
 #, c-format
 msgid "unexpected section type in [%Zu] with sh_link to symtab"
 msgstr "неочікуваний тип розділу у [%Zu] з посиланням sh_link на symtab"
 
-#: src/unstrip.c:764
+#: src/unstrip.c:771
 #, c-format
 msgid "invalid string offset in symbol [%Zu]"
 msgstr "некоректне зміщення рядка у символі [%Zu]"
 
-#: src/unstrip.c:906 src/unstrip.c:1246
+#: src/unstrip.c:913 src/unstrip.c:1254
 #, c-format
 msgid "cannot read section [%Zu] name: %s"
 msgstr "не вдалося прочитати назву розділу [%Zu]: %s"
 
-#: src/unstrip.c:947 src/unstrip.c:966 src/unstrip.c:999
+#: src/unstrip.c:954 src/unstrip.c:973 src/unstrip.c:1006
 #, c-format
 msgid "cannot read '.gnu.prelink_undo' section: %s"
 msgstr "не вдалося прочитати розділ «.gnu.prelink_undo»: %s"
 
-#: src/unstrip.c:987
+#: src/unstrip.c:994
 #, c-format
 msgid "invalid contents in '%s' section"
 msgstr "некоректний вміст розділу «%s»"
 
-#: src/unstrip.c:1042 src/unstrip.c:1366
+#: src/unstrip.c:1049 src/unstrip.c:1374
 #, c-format
 msgid "cannot find matching section for [%Zu] '%s'"
 msgstr "не вдалося знайти відповідний розділ для [%Zu] «%s»"
 
-#: src/unstrip.c:1166 src/unstrip.c:1181 src/unstrip.c:1447
+#: src/unstrip.c:1174 src/unstrip.c:1189 src/unstrip.c:1455
 #, c-format
 msgid "cannot add section name to string table: %s"
 msgstr "не вдалося додати назву розділу до таблиці рядків: %s"
 
-#: src/unstrip.c:1190
+#: src/unstrip.c:1198
 #, c-format
 msgid "cannot update section header string table data: %s"
 msgstr "не вдалося оновити дані заголовка розділу у таблиці рядків: %s"
 
-#: src/unstrip.c:1217 src/unstrip.c:1221
+#: src/unstrip.c:1225 src/unstrip.c:1229
 #, c-format
 msgid "cannot get section header string table section index: %s"
 msgstr ""
 "не вдалося визначити індекс розділу заголовка розділу у таблиці рядків: %s"
 
-#: src/unstrip.c:1225 src/unstrip.c:1229 src/unstrip.c:1462
+#: src/unstrip.c:1233 src/unstrip.c:1237 src/unstrip.c:1470
 #, c-format
 msgid "cannot get section count: %s"
 msgstr "не вдалося отримати кількість розділів: %s"
 
-#: src/unstrip.c:1232
+#: src/unstrip.c:1240
 #, c-format
 msgid "more sections in stripped file than debug file -- arguments reversed?"
 msgstr ""
 "у очищеному файлі більше розділів ніж у файлі з даними для зневаджування — "
 "помилковий порядок параметрів?"
 
-#: src/unstrip.c:1291 src/unstrip.c:1381
+#: src/unstrip.c:1299 src/unstrip.c:1389
 #, c-format
 msgid "cannot read section header string table: %s"
 msgstr "не вдалося прочитати таблицю рядків заголовка розділу: %s"
 
-#: src/unstrip.c:1441
+#: src/unstrip.c:1449
 #, c-format
 msgid "cannot add new section: %s"
 msgstr "не вдалося додати новий розділ: %s"
 
-#: src/unstrip.c:1543
+#: src/unstrip.c:1551
 #, c-format
 msgid "symbol [%Zu] has invalid section index"
 msgstr "символ [%Zu] має некоректний індекс розділу"
 
-#: src/unstrip.c:1781
+#: src/unstrip.c:1789
 #, c-format
 msgid "cannot read section data: %s"
 msgstr "не вдалося прочитати дані розділу: %s"
 
-#: src/unstrip.c:1802
+#: src/unstrip.c:1810
 #, c-format
 msgid "cannot get ELF header: %s"
 msgstr "не вдалося отримати заголовок ELF: %s"
 
-#: src/unstrip.c:1830
+#: src/unstrip.c:1838
 #, c-format
 msgid "cannot update program header: %s"
 msgstr "не вдалося оновити заголовок програми: %s"
 
-#: src/unstrip.c:1835 src/unstrip.c:1914
+#: src/unstrip.c:1843 src/unstrip.c:1922
 #, c-format
 msgid "cannot write output file: %s"
 msgstr "не вдалося записати файл виведених даних: %s"
 
-#: src/unstrip.c:1883
+#: src/unstrip.c:1891
 #, c-format
 msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
 msgstr ""
 "Дані DWARF не скориговано відповідно до відхилення перед компонуванням; "
 "спробуйте виправити це командою prelink -u"
 
-#: src/unstrip.c:1886
+#: src/unstrip.c:1894
 #, c-format
 msgid ""
 "DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
@@ -6481,57 +6691,76 @@ msgstr ""
 "Дані DWARF у «%s» не скориговано відповідно до відхилення перед "
 "компонуванням; спробуйте виправити це командою prelink -u"
 
-#: src/unstrip.c:1905 src/unstrip.c:1945 src/unstrip.c:1957 src/unstrip.c:2037
+#: src/unstrip.c:1913 src/unstrip.c:1964 src/unstrip.c:1976 src/unstrip.c:2062
 #, c-format
 msgid "cannot create ELF descriptor: %s"
 msgstr "не вдалося створити дескриптор ELF: %s"
 
-#: src/unstrip.c:1963
-#, c-format
-msgid "'%s' and '%s' do not seem to match"
-msgstr "«%s» і «%s» не відповідають одне одному"
+#: src/unstrip.c:1955
+msgid "WARNING: "
+msgstr ""
+
+#: src/unstrip.c:1957
+msgid ", use --force"
+msgstr ""
+
+#: src/unstrip.c:1980
+msgid "ELF header identification (e_ident) different"
+msgstr ""
 
-#: src/unstrip.c:1994
+#: src/unstrip.c:1983
+msgid "ELF header type (e_type) different"
+msgstr ""
+
+#: src/unstrip.c:1986
+msgid "ELF header machine type (e_machine) different"
+msgstr ""
+
+#: src/unstrip.c:1989
+msgid "stripped program header (e_phnum) smaller than unstripped"
+msgstr ""
+
+#: src/unstrip.c:2019
 #, c-format
 msgid "cannot find stripped file for module '%s': %s"
 msgstr "не вдалося знайти очищений файл для модуля «%s»: %s"
 
-#: src/unstrip.c:1998
+#: src/unstrip.c:2023
 #, c-format
 msgid "cannot open stripped file '%s' for module '%s': %s"
 msgstr "не вдалося відкрити очищений файл «%s» для модуля «%s»: %s"
 
-#: src/unstrip.c:2013
+#: src/unstrip.c:2038
 #, c-format
 msgid "cannot find debug file for module '%s': %s"
 msgstr "не вдалося знайти файл діагностичних даних для модуля «%s»: %s"
 
-#: src/unstrip.c:2017
+#: src/unstrip.c:2042
 #, c-format
 msgid "cannot open debug file '%s' for module '%s': %s"
 msgstr "не вдалося відкрити файл діагностичних даних «%s» для модуля «%s»: %s"
 
-#: src/unstrip.c:2030
+#: src/unstrip.c:2055
 #, c-format
 msgid "module '%s' file '%s' is not stripped"
 msgstr "у модулі «%s» файл «%s» не очищено strip"
 
-#: src/unstrip.c:2061
+#: src/unstrip.c:2086
 #, c-format
 msgid "cannot cache section addresses for module '%s': %s"
 msgstr "не вдалося кешувати адреси розділів для модуля «%s»: %s"
 
-#: src/unstrip.c:2194
+#: src/unstrip.c:2219
 #, c-format
 msgid "no matching modules found"
 msgstr "відповідних модулів не виявлено"
 
-#: src/unstrip.c:2203
+#: src/unstrip.c:2228
 #, c-format
 msgid "matched more than one module"
 msgstr "встановлено відповідність декількох модулів"
 
-#: src/unstrip.c:2250
+#: src/unstrip.c:2275
 msgid ""
 "STRIPPED-FILE DEBUG-FILE\n"
 "[MODULE...]"
@@ -6539,7 +6768,7 @@ msgstr ""
 "ОЧИЩЕНИЙ-ФАЙЛ ФАЙЛ-DEBUG\n"
 "[МОДУЛЬ...]"
 
-#: src/unstrip.c:2251
+#: src/unstrip.c:2276
 msgid ""
 "Combine stripped files with separate symbols and debug information.\vThe "
 "first form puts the result in DEBUG-FILE if -o was not given.\n"
@@ -6595,6 +6824,17 @@ msgstr ""
 "окремого файла діагностичних даних або «-», якщо файла діагностичних даних "
 "не вдалося знайти, і «.», якщо ФАЙЛ сам містить діагностичні дані."
 
+#, fuzzy
+#~ msgid "cannot attach to process"
+#~ msgstr "не вдалося створити дерево пошуку"
+
+#, fuzzy
+#~ msgid "cannot attach to core"
+#~ msgstr "не вдалося створити дерево пошуку"
+
+#~ msgid "'%s' and '%s' do not seem to match"
+#~ msgstr "«%s» і «%s» не відповідають одне одному"
+
 #~ msgid "unknown tag %hx"
 #~ msgstr "невідомий теґ %hx"
 
index fc576fc..986b341 100644 (file)
@@ -1,3 +1,552 @@
+2014-08-25  Josh Stone  <jistone@redhat.com>
+
+       * Makefile.am: Prevent premature @AR@ replacement in a sed expression.
+
+2014-07-04  Menanteau Guy  <menantea@linux.vnet.ibm.com>
+           Mark Wielaard  <mjw@redhat.com>
+
+       * elflint (check_symtab): Add ".TOC." to the list of possibly
+       dangling symbols because of sourceware PR13621.
+
+2014-06-14  Mark Wielaard  <mjw@redhat.com>
+
+       * elflint (check_symtab): Use ebl_func_addr_mask on st_value.
+
+2014-05-27  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (print_debug): Skip section if name is NULL.
+
+2014-05-26  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (handle_relocs_rela): Print header like handle_relocs_rel
+       does, when sh_info == 0.
+
+2014-05-26  Mark Wielaard  <mjw@redhat.com>
+
+       * unstrip.c (find_alloc_sections_prelink): Allow non-split .bss
+       section when sh_size of the original and undo .bss section are equal.
+
+2014-05-26  Mark Wielaard  <mjw@redhat.com>
+
+       * unstrip.c (options): Add --force, -F.
+       (struct arg_info): Add bool force.
+       (parse_opt): Handle 'F', set force.
+       (handle_explicit_files): Add force argument, add warn function,
+       separate check ehdr field checks, use warn.
+       (handle_dwfl_module): Add force argument, pass on to
+       handle_explicit_files.
+       (handle_output_dir_module): Add force argument, pass on to
+       handle_dwfl_module.
+       (handle_implicit_modules): Pass info->force to handle_dwfl_module and
+       handle_output_dir_module.
+       (main): Pass info.force to handle_explicit_files.
+
+2014-05-19  Mark Wielaard  <mjw@redhat.com>
+
+       * elflint.c (check_reloc_shdr): Check ebl_check_reloc_target_type.
+
+2014-05-01  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (find_no_debuginfo): Call dwfl_standard_find_debuginfo
+       if looking for alternate debug file.
+
+2014-04-11  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (AM_CPPFLAGS): Add -I libdwelf.
+
+2014-04-22  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (handle_core_item): Make sure variable length array
+       contains at least enough space for terminating zero char.
+
+2014-04-22  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (print_gdb_index_section): Use unsigned int for 31 bits
+       left shift.
+
+2014-03-13  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: Remove no_mudflap.os. Remove libmudflap from all
+       LDADD lines.
+       * strings.c (process_chunk): Remove _MUDFLAP condition.
+
+2014-04-09  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (print_debug_aranges_section): Don't get the raw section
+       data, use the possibly decompressed .[z]debug sectiondata.
+       (print_debug_ranges_section): Likewise.
+       (print_debug_frame_section): Likewise.
+       (print_debug_line_section): Likewise.
+       (print_debug_loc_section): Likewise.
+       (print_debug_macinfo_section): Likewise.
+       (print_debug_macro_section): Likewise.
+
+2014-04-10  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (buf_read_ulong): Pass actual long size to convert.
+
+2014-03-05  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (attr_callback): Print DW_FORM_sdata values as signed
+       numbers.
+
+2014-02-24  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf (print_phdr): Check there is a SHT_PROGBITS section at the
+       offset given by p_offsets for a PT_INTERP segment before trying to
+       display the interpreter string.
+
+2014-02-07  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (print_phdr): Check phdr->p_filesz and make sure
+       interpreter string is zero terminated before calling printf.
+
+2014-01-22  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (nm_no_Wformat): Removed.
+       (size_no_Wformat): Likewise.
+       (strings_no_Wformat): Likewise.
+       (addr2line_no_Wformat): Likewise.
+       * size.c (show_sysv): Use fmtstr directly as literal in printf.
+       (show_sysv_one_line): Likewise.
+       * strings.c (locfmt): Removed.
+       (radix): New static enum.
+       (parse_opt): Set radix, not locfmt.
+       (process_chunk_mb): Use fmtstr directly as literal in printf based
+       on radix.
+       (process_chunk): Likewise.
+       * nm.c (show_symbols_sysv): Use fmtstr directly as literal in printf.
+       (show_symbols_bsd): Likewise.
+       (show_symbols_posix): Likewise.
+
+2014-01-21  Mark Wielaard  <mjw@redhat.com>
+
+       * stack.c (show_inlines): New static boolean.
+       (print_frame): New function split out from...
+       (print_frames): ..here. If show_inlines is true and we found a
+       DIE for the frame address, call print_inline_frames otherwise
+       call print_frame. Keep track of and track frame_nr.
+       (print_inline_frames): New function.
+       (parse_opt): Handle '-i'.
+       (main): Add 'i' to options.
+
+2014-01-27  Mark Wielaard  <mjw@redhat.com>
+
+       * stack.c (maxframes): Initialize to 256.
+       (main): Document new default in options. Document magic number
+       used in frames.allocated initialization.
+
+2014-01-20  Mark Wielaard  <mjw@redhat.com>
+
+       * stack.c (show_debugname): New static boolean.
+       (die_name): New function.
+       (print_frames): If show_debugname is true set symname to the
+       first function-like DIE with a name in scope for the address in
+       the debuginfo.
+       (parse_opt): Handle '-d'.
+       (main): Add 'd' to options.
+
+2014-01-20  Mark Wielaard  <mjw@redhat.com>
+
+       * addr2line.c (handle_address): Initialize scopes to NULL.
+
+2014-01-17  Roland McGrath  <roland@redhat.com>
+
+       * strip.c (handle_elf): Check for bogus values in sh_link, sh_info,
+       st_shndx, e_shstrndx, and SHT_GROUP or SHT_SYMTAB_SHNDX data.
+       Don't use assert on input values, instead bail with "illformed" error.
+
+2014-01-17  Roland McGrath  <roland@redhat.com>
+
+       * readelf.c (handle_dynamic, handle_symtab): Check for bogus sh_link.
+       (handle_verneed, handle_verdef, handle_versym, handle_hash): Likewise.
+       (handle_scngrp): Check for bogus sh_info.
+
+2014-01-17  Jakub Jelinek  <jakub@redhat.com>
+
+       * elflint.c (section_name): Return "<invalid>" instead of
+       crashing on invalid section name.
+       (check_symtab, is_rel_dyn, check_rela, check_rel, check_dynamic,
+       check_symtab_shndx, check_hash, check_versym): Robustify.
+       (check_hash): Don't check entries beyond end of section.
+       (check_note): Don't crash if gelf_rawchunk fails.
+
+2014-01-17  Petr Machata  <pmachata@redhat.com>
+
+       * readelf.c (handle_dynamic, handle_relocs_rel)
+       (handle_relocs_rela, handle_versym, print_liblist):
+       Use gelf_fsize instead of relying on shdr->sh_entsize.
+
+2014-01-14  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (print_debug_macro_section): Clear vendor array before
+       use.
+
+2014-01-15  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Fix corruption of non-C++ symbols by the demangler.
+       * nm.c (show_symbols_sysv, show_symbols_bsd, show_symbols_posix)
+       (show_symbols): Check for _Z.
+       * stack.c (print_frames) <USE_DEMANGLE>: Check for _Z.
+
+2014-01-02  Mark Wielaard  <mjw@redhat.com>
+
+       * stack.c (show_raw): Declare unconditionally.
+       (parse_opt): Handle '-r' unconditionally.
+       (main): Show "raw" option even without USE_DEMANGLE.
+
+2014-01-02  Mark Wielaard  <mjw@redhat.com>
+
+       * stack.c (print_frames): Print 0x before build-id hex-offset.
+
+2014-01-02  Mark Wielaard  <mjw@redhat.com>
+
+       * stack.c (maxframes): Increase to 2048.
+       (struct frames): Add allocated field.
+       (frame_callback): If frames used is frames allocated, realloc.
+       (print_frames): Show an error if maxframes has been reached.
+       (parse_opt): Allow -n 0 for unlimited frames.
+       (main): Document -n 0 and new default 2048 frames. Allocate initial
+       number of frames with malloc.
+
+2013-12-30  Mark Wielaard  <mjw@redhat.com>
+
+       * stack.c (parse_opt): Explicitly call dwfl_linux_proc_attach
+       or dwfl_core_file_attach and check for errors.
+
+2013-12-28  Mark Wielaard  <mjw@redhat.com>
+
+       * stack.c (print_frames): Remove address width code and use...
+       (get_addr_width): ...this new function.
+       (show_modules): New static boolean.
+       (module_callback): New static function.
+       (parse_opt): Handle '-l'.
+       (main): Add 'l' to options. If show_modules then use dwfl_getmodules
+       with module_callback to show all detected modules and possible
+       build_id, elf and dwarf files.
+
+2013-12-27  Mark Wielaard  <mjw@redhat.com>
+
+       * stack.c (frames_shown): New static boolean.
+       (EXIT_OK,EXIT_ERROR,EXIT_BAD,EXIT_USAGES): New defines.
+       (frame_callback): Return -1 on error. Don't print error.
+       (print_frames): Add arguments, tid, dwflerr and what. Print tid.
+       If there was an error report it with address and module if possible.
+       Record whether any frames were actually printed.
+       (thread_callback): Collect tid and err, pass it to print_frames.
+       (parse_opt): Use EXIT_BAD for errors. On ARGP_KEY_END print errno
+       if dwfl_linux_proc_report returned it. Check whether we are properly
+       attached with dwfl_pid.
+       (main): Document exit status. Don't report DWARF_CB_ABORT from
+       callbacks as error. Pass real errors to print_frames. Return
+       EXIT_BAD if no frames could be shown. Return EXIT_ERROR if there
+       were any non-fatal errors.
+
+2013-12-23  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (stack_LDADD): Add demanglelib.
+       * stack.c (show_quiet): New static boolean, default false.
+       (show_raw): Likewise.
+       (demangle_buffer_len): New static size_t.
+       (demangle_buffer): New static char *.
+       (print_frames): Don't resolve pc name if show_quiet. Demangle name
+       unless show_raw.
+       (parse_opt): Handle '-q' and '-r'.
+       (main): Add 'q' and 'r' to options. Free demangle_buffer.
+
+2013-12-23  Mark Wielaard  <mjw@redhat.com>
+
+       * stack.c (OPT_DEBUGINFO): New define.
+       (OPT_COREFILE): Likewise.
+       (pid): New static.
+       (core_fd): Likewise.
+       (core): Likewise.
+       (exec): Likewise.
+       (debuginfo_path): Likewise.
+       (parse_opt): Handle '-p', '--core', '-e' and '--debuginfo-path'.
+       Do argument sanity checking. Setup Dwfl.
+       (main): Add 'p', 'core', 'e' and 'debuginfo-path' to options.
+       Remove argp_child children, simplify argp doc, remove custom
+       usage message and construction of dwfl with dwfl_standard_argp.
+       Use pid directly as tid. close core and core_fd if opened. Print
+       pid of process or core.
+
+2013-12-23  Mark Wielaard  <mjw@redhat.com>
+
+       * stack.c (show_build_id): New static boolean.
+       (print_frames): Print module build-id, load address and pc offset
+       if show_build_id is true.
+       (parse_opt): Handle '-b'.
+       (main): Add -b to options.
+
+2013-12-22  Mark Wielaard  <mjw@redhat.com>
+
+       * stack.c (maxframes): New static unsigned. Initialize to 64.
+       (struct frame): New struct.
+       (struct frames): Likewise.
+       (dwfl): New static Dwfl pointer.
+       (frame_callback): Use arg as struct frames and fill it next frame.
+       Return DWARF_CB_ABORT when maxframes has been reached. Move
+       printing of frame to...
+       (print_frames): ...here. New function.
+       (thread_callback): Use arg as struct frames and set frames to zero.
+       Call print_frames.
+       (parse_opt): Handle '-n'.
+       (main): Add -n to options. Allocate frames using maxframes. Pass
+       frames to frame_callback and thread_callback.
+
+2013-12-20  Mark Wielaard  <mjw@redhat.com>
+
+       * stack.c (show_one_tid): New static boolean.
+       (parse_opt): Handle '-1'.
+       (main): Add -1 to options. Call dwfl_getthread_frames when
+       show_one_tid is true.
+
+2013-12-18  Mark Wielaard  <mjw@redhat.com>
+
+       * addr2line.c (options): Add symbol-sections, 'x'.
+       (show_symbol_sections): New static bool.
+       (parse_opt): Handle 'x'.
+       (print_addrsym): Use dwfl_module_addrinfo value.r
+       Also show section of address with show_symbol_sections.
+       (find_symbol): Use dwfl_module_getsym_info and set value.
+       (handle_address): Request value and use it instead of sym.st_value.
+       * readelf.c (format_dwarf_addr): Use dwfl_module_addrinfo to get
+       name and offset.
+
+2013-12-17  Masatake YAMATO  <yamato@redhat.com>
+           Mark Wielaard  <mjw@redhat.com>
+
+       * stack.c (show_activation, show_module, show_source): New variables.
+       (parse_opt): Set show_activation if -a option is given.
+       Set show_module if -m option is given. Set show_source if -s option
+       is given. Set all show booleans when -v option is given.
+       (main): Added `-a', `-m', `-s', and `-v' to the help message.
+       (frame_callback): Print module and source file information.
+
+2013-11-25  Petr Machata  <pmachata@redhat.com>
+
+       * elflint.c (valid_e_machine): Add EM_AARCH64.
+
+2013-11-14  Petr Machata  <pmachata@redhat.com>
+
+       * readelf.c (handle_core_item) <'h'>: New branch for handling
+       fields that shouldn't be displayed.
+
+2013-11-10  Mark Wielaard  <mjw@redhat.com>
+
+       * stack.c: Use ARGP_PROGRAM_VERSION_HOOK_DEF and
+       ARGP_PROGRAM_BUG_ADDRESS_DEF.
+       (print_version): New function.
+
+2013-11-09  Mark Wielaard  <mjw@redhat.com>
+
+       * arlib.c (arlib_init): Call snprintf before using the result
+       with memcpy.
+       (arlib_finalize): Likewise.
+       * nm.c (show_symbols_sysv): Don't modify cnt inside assert.
+
+2013-11-07  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * Makefile.am (bin_PROGRAMS): Add stack.
+       (stack_LDADD): New.
+       * stack.c: New file.
+
+2013-11-05  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (print_debug_ranges_section): Cast address to size_t
+       before comparison.
+       (print_debug_loc_section): Likewise.
+
+2013-10-18  Mark Wielaard  <mjw@redhat.com>
+
+       * ar.c (main): Correct operation check when instance_specifed is set.
+
+2013-09-26  Petr Machata  <pmachata@redhat.com>
+
+       * readelf.c (handle_file_note): New function.
+       (handle_notes_data): Call it to handle NT_FILE notes.
+
+2013-09-26  Petr Machata  <pmachata@redhat.com>
+
+       * readelf.c (handle_siginfo_note): New function.
+       (handle_notes_data): Call it to handle NT_SIGINFO notes.
+       (buf_read_int, buf_read_ulong, buf_has_data): New functions.
+
+2013-08-13  Mark Wielaard  <mjw@redhat.com>
+
+       * addr2line.c (options): Add "inlines", 'i'.
+       (show_inlines): New bool.
+       (parse_opt): Handle 'i'.
+       (print_diesym): New static function.
+       (print_src): New function taking code from...
+       (handle_address): here. Call print_src. Print inlines.
+
+2013-08-12  Mark Wielaard  <mjw@redhat.com>
+
+       * addr2line.c (main): If there is a newline char at end of buf,
+       then remove it.
+
+2013-07-05  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (print_ops): Take CU as argument, use it to print
+       parameter_ref DIE offset.
+       (struct listptr): Replace base field with cu.
+       (listptr_base): New function.
+       (compare_listptr): Use listptr_base.
+       (notice_listptr): Take CU as argument.
+       (skip_listptr_hole): Likewise.
+       (print_debug_ranges_section): Pass NULL as CU to skip_listptr_hole.
+       (print_cfa_program): Pass NULL as CU to print_ops.
+       (struct attrcb_args): Replace cu_base field with cu.
+       (attr_callback): Pass cu not cu_base to notice_listptr.
+       (print_debug_units): Don't calculate base, just set cu.
+       (print_debug_loc_section): Pass cu to skip_listptr_hole and
+       print_ops.
+
+2013-05-06  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (print_ops): Format first DW_OP_GNU_implicit_pointer
+       argument as DIE offset.
+
+2013-04-24  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: Use AM_CPPFLAGS instead of INCLUDES.
+
+2013-03-25  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (argp_options): Add decodedline.
+       (decodedline): New boolean initialized to false.
+       (parse_opt): Set decodedline when arg is decodedline.
+       (print_decoded_line_section): New function.
+       (print_debug_line_section): Call print_decoded_line_section when
+       decodedline is true.
+
+2013-03-25  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (argp_option): Add decodedaranges.
+       (decodedaranges): New boolean initialized to false.
+       (parse_opt): Set decodedaranges when arg is decodedaranges.
+       (print_debug_aranges_section): Reimplemented and original
+       implementation renamed to...
+       (print_decoded_aranges_section): this.
+
+2013-03-25  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (attrcb_args): Add Dwarf_Die.
+       (attr_callback): When highpc is in constant form also print as
+       address.
+       (print_debug_units): Set args.die.
+
+2013-03-19  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (print_gdb_index_section): Free format_dwarf_addr results.
+
+2013-03-18  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (print_gdb_index_section): Accept version 8.
+
+2013-03-01  Mark Wielaard  <mjw@redhat.com>
+
+       * findtextrel.c (process_file): Release ELF and close file when not
+       text relocations are found.
+       * strip.c (handle_elf): Track memory used for .debuglink section data
+       and free when done.
+
+2013-02-24  Mark Wielaard  <mjw@redhat.com>
+
+       * elflint.c (check_symtab): Add __bss_start__ to the list of symbols
+       allowed to have out of section values because of GNU ld bugs.
+
+2013-02-06  Mark Wielaard  <mjw@redhat.com>
+
+       * elflint.c (check_symtab): Add __bss_start and __TMC_END__ to the
+       list of symbols allowed to have out of section values because of
+       GNU ld bugs in either .symtab or .dynsym, but only when they are
+       zero sized.
+
+2013-01-24  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (argp_option): Add unresolved-address-offsets, U.
+       (print_unresolved_addresses): New static.
+       (parse_opt): Handle 'U', set print_unprocessed_values.
+       (format_dwarf_addr): Take and handle new raw argument.
+       (print_ops): Call format_dwarf_addr with raw offset values.
+       (print_debug_ranges_section): Likewise.
+       (print_debug_frame_section): Likewise.
+       (attr_callback): Likewise.
+       (print_debug_line_section): Likewise.
+       (print_debug_loc_section): Likewise.
+       (print_gdb_index_section): Likewise.
+
+2013-01-18  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (struct listptr): Add base Dwarf_Addr field.
+       (compare_listptr): Warn for same offset with different base.
+       (notice_listptr): Take base argument and set it.
+       (skip_listptr_hole): Likewise.
+       (struct attrcb_args): Removed unused cu_offset field.
+       Add cu_base Dwarf_Addr field.
+       (attr_callback): Call notice_listptr with cbargs->cu_base.
+       (print_debug_units): Set args.cu_base.
+       (print_debug_ranges_section): Get base and use for format_dwarf_addr.
+       (print_debug_loc_section): Likewise.
+
+2013-01-29  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * readelf.c (handle_core_items): Limit special repeated items handling
+       to single-item formats '\n', 'b' and 'B', assert OFFSET 0 there.
+
+2012-12-18  Mark Wielaard  <mark@bordewijk.wildebeest.org>
+
+       * readelf.c (ELF_INPUT_SECTION): New argp key value.
+       (argp_option): Add elf-section.
+       (elf_input_section): New static.
+       (parse_opt): Handle ELF_INPUT_SECTION and set elf_input_section.
+       (open_input_section): New function.
+       (process_file): Call open_input_section if elf_input_section set.
+
+2013-01-13  David Abdurachmanov  <David.Abdurachmanov@cern.ch>
+
+       ar.c (do_oper_delete): Fix num passed to memset.
+
+2012-12-21  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (print_debug_frame_section): Adjust FDE start address
+       if pcrel before feeding it to format_dwarf_addr.
+
+2012-12-21  Mark Wielaard  <mjw@redhat.com>
+
+       * addr2line.c (main): Call dwfl_end.
+
+2012-12-11  Roland McGrath  <roland@hack.frob.com>
+
+       * nm.c (show_symbols_sysv): Fix size passed to snprintf for invalid
+       sh_name case.
+       Reported by David Abdurachmanov <David.Abdurachmanov@cern.ch>.
+
+2012-10-16  Mark Wielaard  <mjw@redhat.com>
+
+       * readelf.c (print_ops): DW_OP_skip and DW_OP_bra targets are
+       calculated beginning after the operand and 2-byte constant.
+
+2012-10-12  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * readelf.c (ITEM_WRAP_COLUMN, REGISTER_WRAP_COLUMN): Merge to ...
+       (WRAP_COLUMN): ... here.
+       (print_core_item): Remove parameter format_max.  Update function
+       comment.  Replace FORMAT_MAX by the real output width.
+       (handle_core_item): Remove the FORMAT_MAX values in TYPES, DO_TYPE,
+       calls of print_core_item, remove variable maxfmt, change
+       ITEM_WRAP_COLUMN to WRAP_COLUMN.
+       (handle_core_register): Remove the FORMAT_MAX values in TYPES, BITS,
+       calls of print_core_item, change REGISTER_WRAP_COLUMN to WRAP_COLUMN.
+
+2012-10-11  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * readelf.c (handle_core_item) <b>: Make run an outer block variable.
+       Increase run only if LASTBIT != 0.  Print last element only if RUN > 0.
+
 2012-08-27  Mark Wielaard  <mjw@redhat.com>
 
        * readelf.c (print_debug_macro_section): Print offset as PRIx64.
index cf4875e..28dad85 100644 (file)
@@ -1,6 +1,6 @@
 ## Process this file with automake to create Makefile.in
 ##
-## Copyright (C) 1996-2012 Red Hat, Inc.
+## Copyright (C) 1996-2014 Red Hat, Inc.
 ## This file is part of elfutils.
 ##
 ## This file is free software; you can redistribute it and/or modify
 include $(top_srcdir)/config/eu.am
 DEFS += $(YYDEBUG) -DDEBUGPRED=@DEBUGPRED@ \
        -DSRCDIR=\"$(shell cd $(srcdir);pwd)\" -DOBJDIR=\"$(shell pwd)\"
-INCLUDES += -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
-           -I$(srcdir)/../libdw -I$(srcdir)/../libdwfl \
-           -I$(srcdir)/../libasm
+AM_CPPFLAGS += -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
+           -I$(srcdir)/../libdw -I$(srcdir)/../libdwelf \
+           -I$(srcdir)/../libdwfl -I$(srcdir)/../libasm
 
 AM_LDFLAGS = -Wl,-rpath-link,../libelf:../libdw
 
-no_mudflap.os = -fmudflap
-
 YACC = @YACC@ -d
 AM_YFLAGS = -pld
 AM_LFLAGS = -Pld -olex.yy.c
@@ -37,7 +35,7 @@ native_ld = @native_ld@
 base_cpu = @base_cpu@
 
 bin_PROGRAMS = readelf nm size strip ld elflint findtextrel addr2line \
-              elfcmp objdump ranlib strings ar unstrip
+              elfcmp objdump ranlib strings ar unstrip stack
 
 
 ld_dsos = libld_elf_i386_pic.a
@@ -88,33 +86,30 @@ if DEMANGLE
 demanglelib = -lstdc++
 endif
 
-nm_no_Wformat = yes
-size_no_Wformat = yes
-strings_no_Wformat = yes
-addr2line_no_Wformat = yes
 # XXX While the file is not finished, don't warn about this
 ldgeneric_no_Wunused = yes
 
-readelf_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl
-nm_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl \
+readelf_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) -ldl
+nm_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) -ldl \
           $(demanglelib)
-size_LDADD = $(libelf) $(libeu) $(libmudflap)
-strip_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl
-ld_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl
+size_LDADD = $(libelf) $(libeu)
+strip_LDADD = $(libebl) $(libelf) $(libeu) -ldl
+ld_LDADD = $(libebl) $(libelf) $(libeu) -ldl
 if NATIVE_LD
 # -ldl is always needed for libebl.
 ld_LDADD += libld_elf.a
 endif
 ld_LDFLAGS = -rdynamic
-elflint_LDADD  = $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl
-findtextrel_LDADD = $(libdw) $(libelf) $(libmudflap)
-addr2line_LDADD = $(libdw) $(libelf) $(libmudflap)
-elfcmp_LDADD = $(libebl) $(libelf) $(libmudflap) -ldl
-objdump_LDADD  = $(libasm) $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl
-ranlib_LDADD = libar.a $(libelf) $(libeu) $(libmudflap)
-strings_LDADD = $(libelf) $(libeu) $(libmudflap)
-ar_LDADD = libar.a $(libelf) $(libeu) $(libmudflap)
-unstrip_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(libmudflap) -ldl
+elflint_LDADD  = $(libebl) $(libelf) $(libeu) -ldl
+findtextrel_LDADD = $(libdw) $(libelf)
+addr2line_LDADD = $(libdw) $(libelf)
+elfcmp_LDADD = $(libebl) $(libelf) -ldl
+objdump_LDADD  = $(libasm) $(libebl) $(libelf) $(libeu) -ldl
+ranlib_LDADD = libar.a $(libelf) $(libeu)
+strings_LDADD = $(libelf) $(libeu)
+ar_LDADD = libar.a $(libelf) $(libeu)
+unstrip_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) -ldl
+stack_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) -ldl $(demanglelib)
 
 ldlex.o: ldscript.c
 ldlex_no_Werror = yes
@@ -165,7 +160,7 @@ MAINTAINERCLEANFILES = ldlex.c ldscript.c ldscript.h
 make-debug-archive: $(srcdir)/make-debug-archive.in
        UNSTRIP=$(bindir)/`echo unstrip | sed '$(transform)'`; \
        AR=$(bindir)/`echo ar | sed '$(transform)'`; \
-       sed -e "s,@UNSTRIP@,$$UNSTRIP,g" -e "s,@AR@,$$AR,g" \
+       sed -e "s,[@]UNSTRIP[@],$$UNSTRIP,g" -e "s,[@]AR[@],$$AR,g" \
            -e "s%[@]PACKAGE_NAME[@]%$(PACKAGE_NAME)%g" \
            -e "s%[@]PACKAGE_VERSION[@]%$(PACKAGE_VERSION)%g" \
            $(srcdir)/make-debug-archive.in > $@.new
index 8922d26..d1a5bad 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -37,25 +81,26 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
-       $(srcdir)/Makefile.in $(top_srcdir)/config/eu.am ChangeLog \
-       ldlex.c ldscript.c
-@MUDFLAP_TRUE@am__append_1 = -fmudflap
+DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \
+       $(srcdir)/Makefile.am ldlex.c ldscript.c \
+       $(top_srcdir)/config/depcomp $(top_srcdir)/config/ylwrap \
+       $(noinst_HEADERS) ChangeLog
 bin_PROGRAMS = readelf$(EXEEXT) nm$(EXEEXT) size$(EXEEXT) \
        strip$(EXEEXT) ld$(EXEEXT) elflint$(EXEEXT) \
        findtextrel$(EXEEXT) addr2line$(EXEEXT) elfcmp$(EXEEXT) \
        objdump$(EXEEXT) ranlib$(EXEEXT) strings$(EXEEXT) ar$(EXEEXT) \
-       unstrip$(EXEEXT)
+       unstrip$(EXEEXT) stack$(EXEEXT)
 @NATIVE_LD_FALSE@noinst_PROGRAMS = $(am__EXEEXT_1)
 # We never build this library but we need to get the dependency files
 # of all the linker backends that might be used in a non-generic linker.
-@NEVER_TRUE@am__append_2 = libdummy.a
+@NEVER_TRUE@am__append_1 = libdummy.a
 # -ldl is always needed for libebl.
-@NATIVE_LD_TRUE@am__append_3 = libld_elf.a
+@NATIVE_LD_TRUE@am__append_2 = libld_elf.a
 @NATIVE_LD_TRUE@am_libld_elf_i386_pic_a_OBJECTS =
 subdir = src
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
        $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/zip.m4 \
        $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
@@ -65,8 +110,11 @@ CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 LIBRARIES = $(noinst_LIBRARIES)
-AR = ar
 ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
 libar_a_AR = $(AR) $(ARFLAGS)
 libar_a_LIBADD =
 am_libar_a_OBJECTS = arlib.$(OBJEXT) arlib2.$(OBJEXT) \
@@ -94,28 +142,24 @@ am__DEPENDENCIES_1 =
 @BUILD_STATIC_FALSE@am__DEPENDENCIES_2 = ../libdw/libdw.so
 @BUILD_STATIC_TRUE@am__DEPENDENCIES_2 = ../libdw/libdw.a \
 @BUILD_STATIC_TRUE@    $(am__DEPENDENCIES_1) $(libelf) $(libebl)
-addr2line_DEPENDENCIES = $(am__DEPENDENCIES_2) $(libelf) \
-       $(am__DEPENDENCIES_1)
+addr2line_DEPENDENCIES = $(am__DEPENDENCIES_2) $(libelf)
 ar_SOURCES = ar.c
 ar_OBJECTS = ar.$(OBJEXT)
-ar_DEPENDENCIES = libar.a $(libelf) $(libeu) $(am__DEPENDENCIES_1)
+ar_DEPENDENCIES = libar.a $(libelf) $(libeu)
 elfcmp_SOURCES = elfcmp.c
 elfcmp_OBJECTS = elfcmp.$(OBJEXT)
-elfcmp_DEPENDENCIES = $(libebl) $(libelf) $(am__DEPENDENCIES_1)
+elfcmp_DEPENDENCIES = $(libebl) $(libelf)
 elflint_SOURCES = elflint.c
 elflint_OBJECTS = elflint.$(OBJEXT)
-elflint_DEPENDENCIES = $(libebl) $(libelf) $(libeu) \
-       $(am__DEPENDENCIES_1)
+elflint_DEPENDENCIES = $(libebl) $(libelf) $(libeu)
 findtextrel_SOURCES = findtextrel.c
 findtextrel_OBJECTS = findtextrel.$(OBJEXT)
-findtextrel_DEPENDENCIES = $(am__DEPENDENCIES_2) $(libelf) \
-       $(am__DEPENDENCIES_1)
+findtextrel_DEPENDENCIES = $(am__DEPENDENCIES_2) $(libelf)
 am_ld_OBJECTS = ld.$(OBJEXT) ldgeneric.$(OBJEXT) ldlex.$(OBJEXT) \
        ldscript.$(OBJEXT) symbolhash.$(OBJEXT) sectionhash.$(OBJEXT) \
        versionhash.$(OBJEXT)
 ld_OBJECTS = $(am_ld_OBJECTS)
-ld_DEPENDENCIES = $(libebl) $(libelf) $(libeu) $(am__DEPENDENCIES_1) \
-       $(am__append_3)
+ld_DEPENDENCIES = $(libebl) $(libelf) $(libeu) $(am__append_2)
 ld_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(ld_LDFLAGS) $(LDFLAGS) -o \
        $@
 am_libld_elf_i386_so_OBJECTS =
@@ -124,32 +168,34 @@ libld_elf_i386_so_LDADD = $(LDADD)
 nm_SOURCES = nm.c
 nm_OBJECTS = nm.$(OBJEXT)
 nm_DEPENDENCIES = $(am__DEPENDENCIES_2) $(libebl) $(libelf) $(libeu) \
-       $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_1)
 objdump_SOURCES = objdump.c
 objdump_OBJECTS = objdump.$(OBJEXT)
-objdump_DEPENDENCIES = $(libasm) $(libebl) $(libelf) $(libeu) \
-       $(am__DEPENDENCIES_1)
+objdump_DEPENDENCIES = $(libasm) $(libebl) $(libelf) $(libeu)
 ranlib_SOURCES = ranlib.c
 ranlib_OBJECTS = ranlib.$(OBJEXT)
-ranlib_DEPENDENCIES = libar.a $(libelf) $(libeu) $(am__DEPENDENCIES_1)
+ranlib_DEPENDENCIES = libar.a $(libelf) $(libeu)
 readelf_SOURCES = readelf.c
 readelf_OBJECTS = readelf.$(OBJEXT)
 readelf_DEPENDENCIES = $(am__DEPENDENCIES_2) $(libebl) $(libelf) \
-       $(libeu) $(am__DEPENDENCIES_1)
+       $(libeu)
 size_SOURCES = size.c
 size_OBJECTS = size.$(OBJEXT)
-size_DEPENDENCIES = $(libelf) $(libeu) $(am__DEPENDENCIES_1)
+size_DEPENDENCIES = $(libelf) $(libeu)
+stack_SOURCES = stack.c
+stack_OBJECTS = stack.$(OBJEXT)
+stack_DEPENDENCIES = $(libebl) $(libelf) $(am__DEPENDENCIES_2) \
+       $(libeu) $(am__DEPENDENCIES_1)
 strings_SOURCES = strings.c
 strings_OBJECTS = strings.$(OBJEXT)
-strings_DEPENDENCIES = $(libelf) $(libeu) $(am__DEPENDENCIES_1)
+strings_DEPENDENCIES = $(libelf) $(libeu)
 strip_SOURCES = strip.c
 strip_OBJECTS = strip.$(OBJEXT)
-strip_DEPENDENCIES = $(libebl) $(libelf) $(libeu) \
-       $(am__DEPENDENCIES_1)
+strip_DEPENDENCIES = $(libebl) $(libelf) $(libeu)
 unstrip_SOURCES = unstrip.c
 unstrip_OBJECTS = unstrip.$(OBJEXT)
 unstrip_DEPENDENCIES = $(libebl) $(libelf) $(am__DEPENDENCIES_2) \
-       $(libeu) $(am__DEPENDENCIES_1)
+       $(libeu)
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -178,43 +224,99 @@ am__uninstall_files_from_dir = { \
          $(am__cd) "$$dir" && rm -f $$files; }; \
   }
 SCRIPTS = $(bin_SCRIPTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/config/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
 @MAINTAINER_MODE_FALSE@am__skiplex = test -f $@ ||
 LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS)
+AM_V_LEX = $(am__v_LEX_@AM_V@)
+am__v_LEX_ = $(am__v_LEX_@AM_DEFAULT_V@)
+am__v_LEX_0 = @echo "  LEX     " $@;
+am__v_LEX_1 = 
 YLWRAP = $(top_srcdir)/config/ylwrap
 @MAINTAINER_MODE_FALSE@am__skipyacc = test -f $@ ||
+am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \
+                  -e s/c++$$/h++/ -e s/c$$/h/
 YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS)
+AM_V_YACC = $(am__v_YACC_@AM_V@)
+am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@)
+am__v_YACC_0 = @echo "  YACC    " $@;
+am__v_YACC_1 = 
 SOURCES = $(libar_a_SOURCES) $(libdummy_a_SOURCES) \
        $(libld_elf_a_SOURCES) $(libld_elf_i386_pic_a_SOURCES) \
        addr2line.c ar.c elfcmp.c elflint.c findtextrel.c \
        $(ld_SOURCES) $(libld_elf_i386_so_SOURCES) nm.c objdump.c \
-       ranlib.c readelf.c size.c strings.c strip.c unstrip.c
+       ranlib.c readelf.c size.c stack.c strings.c strip.c unstrip.c
 DIST_SOURCES = $(libar_a_SOURCES) $(am__libdummy_a_SOURCES_DIST) \
        $(am__libld_elf_a_SOURCES_DIST) \
        $(libld_elf_i386_pic_a_SOURCES) addr2line.c ar.c elfcmp.c \
        elflint.c findtextrel.c $(ld_SOURCES) \
        $(libld_elf_i386_so_SOURCES) nm.c objdump.c ranlib.c readelf.c \
-       size.c strings.c strip.c unstrip.c
+       size.c stack.c strings.c strip.c unstrip.c
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
+CC_BIARCH = @CC_BIARCH@
 CFLAGS = @CFLAGS@
+CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEBUGPRED = @DEBUGPRED@
@@ -225,10 +327,13 @@ DEPDIR = @DEPDIR@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_VALGRIND = @HAVE_VALGRIND@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -249,6 +354,7 @@ MODVERSION = @MODVERSION@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
+NM = @NM@
 OBJEXT = @OBJEXT@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -259,6 +365,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+READELF = @READELF@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
@@ -273,6 +380,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -322,32 +430,27 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 zip_LIBS = @zip_LIBS@
-INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \
+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. \
        -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
-       -I$(srcdir)/../libdw -I$(srcdir)/../libdwfl \
-       -I$(srcdir)/../libasm
-AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \
-       $($(*F)_no_Werror),,-Werror) $(if \
-       $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \
-       $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \
-       $(am__append_1)
-@MUDFLAP_FALSE@libmudflap = 
-@MUDFLAP_TRUE@libmudflap = -lmudflap
-COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\
-                         $(COMPILE))
-
+       -I$(srcdir)/../libdw -I$(srcdir)/../libdwelf \
+       -I$(srcdir)/../libdwfl -I$(srcdir)/../libasm
+AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \
+           $(if $($(*F)_no_Werror),,-Werror) \
+           $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \
+           $($(*F)_CFLAGS)
+
+COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE))
 CLEANFILES = *.gcno *.gcda make-debug-archive none_ld.os \
        $(ld_modules:.c=.os) *.gconv
-textrel_check = if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
+textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
 AM_LDFLAGS = -Wl,-rpath-link,../libelf:../libdw
-no_mudflap.os = -fmudflap
 AM_YFLAGS = -pld
 AM_LFLAGS = -Pld -olex.yy.c
 native_ld = @native_ld@
 ld_dsos = libld_elf_i386_pic.a
 @NATIVE_LD_FALSE@noinst_LIBRARIES = libld_elf.a libar.a $(ld_dsos) \
-@NATIVE_LD_FALSE@      $(am__append_2)
-@NATIVE_LD_TRUE@noinst_LIBRARIES = libld_elf.a libar.a $(am__append_2)
+@NATIVE_LD_FALSE@      $(am__append_1)
+@NATIVE_LD_TRUE@noinst_LIBRARIES = libld_elf.a libar.a $(am__append_1)
 @NATIVE_LD_TRUE@native_ld_cflags = -DBASE_ELF_NAME=elf_$(base_cpu)
 @NEVER_TRUE@libdummy_a_SOURCES = i386_ld.c
 ld_SOURCES = ld.c ldgeneric.c ldlex.l ldscript.y symbolhash.c sectionhash.c \
@@ -370,30 +473,27 @@ bin_SCRIPTS = make-debug-archive
 libebl = ../libebl/libebl.a
 libeu = ../lib/libeu.a
 @DEMANGLE_TRUE@demanglelib = -lstdc++
-nm_no_Wformat = yes
-size_no_Wformat = yes
-strings_no_Wformat = yes
-addr2line_no_Wformat = yes
+
 # XXX While the file is not finished, don't warn about this
 ldgeneric_no_Wunused = yes
-readelf_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl
-nm_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl \
+readelf_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) -ldl
+nm_LDADD = $(libdw) $(libebl) $(libelf) $(libeu) -ldl \
           $(demanglelib)
 
-size_LDADD = $(libelf) $(libeu) $(libmudflap)
-strip_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl
-ld_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl \
-       $(am__append_3)
+size_LDADD = $(libelf) $(libeu)
+strip_LDADD = $(libebl) $(libelf) $(libeu) -ldl
+ld_LDADD = $(libebl) $(libelf) $(libeu) -ldl $(am__append_2)
 ld_LDFLAGS = -rdynamic
-elflint_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl
-findtextrel_LDADD = $(libdw) $(libelf) $(libmudflap)
-addr2line_LDADD = $(libdw) $(libelf) $(libmudflap)
-elfcmp_LDADD = $(libebl) $(libelf) $(libmudflap) -ldl
-objdump_LDADD = $(libasm) $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl
-ranlib_LDADD = libar.a $(libelf) $(libeu) $(libmudflap)
-strings_LDADD = $(libelf) $(libeu) $(libmudflap)
-ar_LDADD = libar.a $(libelf) $(libeu) $(libmudflap)
-unstrip_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(libmudflap) -ldl
+elflint_LDADD = $(libebl) $(libelf) $(libeu) -ldl
+findtextrel_LDADD = $(libdw) $(libelf)
+addr2line_LDADD = $(libdw) $(libelf)
+elfcmp_LDADD = $(libebl) $(libelf) -ldl
+objdump_LDADD = $(libasm) $(libebl) $(libelf) $(libeu) -ldl
+ranlib_LDADD = libar.a $(libelf) $(libeu)
+strings_LDADD = $(libelf) $(libeu)
+ar_LDADD = libar.a $(libelf) $(libeu)
+unstrip_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) -ldl
+stack_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) -ldl $(demanglelib)
 ldlex_no_Werror = yes
 
 # Machine-specific linker code.
@@ -440,32 +540,40 @@ $(am__aclocal_m4_deps):
 
 clean-noinstLIBRARIES:
        -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
 libar.a: $(libar_a_OBJECTS) $(libar_a_DEPENDENCIES) $(EXTRA_libar_a_DEPENDENCIES) 
-       -rm -f libar.a
-       $(libar_a_AR) libar.a $(libar_a_OBJECTS) $(libar_a_LIBADD)
-       $(RANLIB) libar.a
+       $(AM_V_at)-rm -f libar.a
+       $(AM_V_AR)$(libar_a_AR) libar.a $(libar_a_OBJECTS) $(libar_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libar.a
+
 libdummy.a: $(libdummy_a_OBJECTS) $(libdummy_a_DEPENDENCIES) $(EXTRA_libdummy_a_DEPENDENCIES) 
-       -rm -f libdummy.a
-       $(libdummy_a_AR) libdummy.a $(libdummy_a_OBJECTS) $(libdummy_a_LIBADD)
-       $(RANLIB) libdummy.a
+       $(AM_V_at)-rm -f libdummy.a
+       $(AM_V_AR)$(libdummy_a_AR) libdummy.a $(libdummy_a_OBJECTS) $(libdummy_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libdummy.a
+
 libld_elf.a: $(libld_elf_a_OBJECTS) $(libld_elf_a_DEPENDENCIES) $(EXTRA_libld_elf_a_DEPENDENCIES) 
-       -rm -f libld_elf.a
-       $(libld_elf_a_AR) libld_elf.a $(libld_elf_a_OBJECTS) $(libld_elf_a_LIBADD)
-       $(RANLIB) libld_elf.a
+       $(AM_V_at)-rm -f libld_elf.a
+       $(AM_V_AR)$(libld_elf_a_AR) libld_elf.a $(libld_elf_a_OBJECTS) $(libld_elf_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libld_elf.a
+
 libld_elf_i386_pic.a: $(libld_elf_i386_pic_a_OBJECTS) $(libld_elf_i386_pic_a_DEPENDENCIES) $(EXTRA_libld_elf_i386_pic_a_DEPENDENCIES) 
-       -rm -f libld_elf_i386_pic.a
-       $(libld_elf_i386_pic_a_AR) libld_elf_i386_pic.a $(libld_elf_i386_pic_a_OBJECTS) $(libld_elf_i386_pic_a_LIBADD)
-       $(RANLIB) libld_elf_i386_pic.a
+       $(AM_V_at)-rm -f libld_elf_i386_pic.a
+       $(AM_V_AR)$(libld_elf_i386_pic_a_AR) libld_elf_i386_pic.a $(libld_elf_i386_pic_a_OBJECTS) $(libld_elf_i386_pic_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libld_elf_i386_pic.a
 install-binPROGRAMS: $(bin_PROGRAMS)
        @$(NORMAL_INSTALL)
-       test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
        @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+       fi; \
        for p in $$list; do echo "$$p $$p"; done | \
        sed 's/$(EXEEXT)$$//' | \
-       while read p p1; do if test -f $$p; \
-         then echo "$$p"; echo "$$p"; else :; fi; \
+       while read p p1; do if test -f $$p \
+         then echo "$$p"; echo "$$p"; else :; fi; \
        done | \
-       sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+       sed -e 'p;s,.*/,,;n;h' \
+           -e 's|.*|.|' \
            -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
        sed 'N;N;N;s,\n, ,g' | \
        $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
@@ -486,7 +594,8 @@ uninstall-binPROGRAMS:
        @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
        files=`for p in $$list; do echo "$$p"; done | \
          sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
-             -e 's/$$/$(EXEEXT)/' `; \
+             -e 's/$$/$(EXEEXT)/' \
+       `; \
        test -n "$$list" || exit 0; \
        echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
        cd "$(DESTDIR)$(bindir)" && rm -f $$files
@@ -496,55 +605,77 @@ clean-binPROGRAMS:
 
 clean-noinstPROGRAMS:
        -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+
 addr2line$(EXEEXT): $(addr2line_OBJECTS) $(addr2line_DEPENDENCIES) $(EXTRA_addr2line_DEPENDENCIES) 
        @rm -f addr2line$(EXEEXT)
-       $(LINK) $(addr2line_OBJECTS) $(addr2line_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(addr2line_OBJECTS) $(addr2line_LDADD) $(LIBS)
+
 ar$(EXEEXT): $(ar_OBJECTS) $(ar_DEPENDENCIES) $(EXTRA_ar_DEPENDENCIES) 
        @rm -f ar$(EXEEXT)
-       $(LINK) $(ar_OBJECTS) $(ar_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(ar_OBJECTS) $(ar_LDADD) $(LIBS)
+
 elfcmp$(EXEEXT): $(elfcmp_OBJECTS) $(elfcmp_DEPENDENCIES) $(EXTRA_elfcmp_DEPENDENCIES) 
        @rm -f elfcmp$(EXEEXT)
-       $(LINK) $(elfcmp_OBJECTS) $(elfcmp_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(elfcmp_OBJECTS) $(elfcmp_LDADD) $(LIBS)
+
 elflint$(EXEEXT): $(elflint_OBJECTS) $(elflint_DEPENDENCIES) $(EXTRA_elflint_DEPENDENCIES) 
        @rm -f elflint$(EXEEXT)
-       $(LINK) $(elflint_OBJECTS) $(elflint_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(elflint_OBJECTS) $(elflint_LDADD) $(LIBS)
+
 findtextrel$(EXEEXT): $(findtextrel_OBJECTS) $(findtextrel_DEPENDENCIES) $(EXTRA_findtextrel_DEPENDENCIES) 
        @rm -f findtextrel$(EXEEXT)
-       $(LINK) $(findtextrel_OBJECTS) $(findtextrel_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(findtextrel_OBJECTS) $(findtextrel_LDADD) $(LIBS)
+
 ld$(EXEEXT): $(ld_OBJECTS) $(ld_DEPENDENCIES) $(EXTRA_ld_DEPENDENCIES) 
        @rm -f ld$(EXEEXT)
-       $(ld_LINK) $(ld_OBJECTS) $(ld_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(ld_LINK) $(ld_OBJECTS) $(ld_LDADD) $(LIBS)
+
 @NATIVE_LD_TRUE@libld_elf_i386.so$(EXEEXT): $(libld_elf_i386_so_OBJECTS) $(libld_elf_i386_so_DEPENDENCIES) $(EXTRA_libld_elf_i386_so_DEPENDENCIES) 
 @NATIVE_LD_TRUE@       @rm -f libld_elf_i386.so$(EXEEXT)
-@NATIVE_LD_TRUE@       $(LINK) $(libld_elf_i386_so_OBJECTS) $(libld_elf_i386_so_LDADD) $(LIBS)
+@NATIVE_LD_TRUE@       $(AM_V_CCLD)$(LINK) $(libld_elf_i386_so_OBJECTS) $(libld_elf_i386_so_LDADD) $(LIBS)
+
 nm$(EXEEXT): $(nm_OBJECTS) $(nm_DEPENDENCIES) $(EXTRA_nm_DEPENDENCIES) 
        @rm -f nm$(EXEEXT)
-       $(LINK) $(nm_OBJECTS) $(nm_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(nm_OBJECTS) $(nm_LDADD) $(LIBS)
+
 objdump$(EXEEXT): $(objdump_OBJECTS) $(objdump_DEPENDENCIES) $(EXTRA_objdump_DEPENDENCIES) 
        @rm -f objdump$(EXEEXT)
-       $(LINK) $(objdump_OBJECTS) $(objdump_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(objdump_OBJECTS) $(objdump_LDADD) $(LIBS)
+
 ranlib$(EXEEXT): $(ranlib_OBJECTS) $(ranlib_DEPENDENCIES) $(EXTRA_ranlib_DEPENDENCIES) 
        @rm -f ranlib$(EXEEXT)
-       $(LINK) $(ranlib_OBJECTS) $(ranlib_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(ranlib_OBJECTS) $(ranlib_LDADD) $(LIBS)
+
 readelf$(EXEEXT): $(readelf_OBJECTS) $(readelf_DEPENDENCIES) $(EXTRA_readelf_DEPENDENCIES) 
        @rm -f readelf$(EXEEXT)
-       $(LINK) $(readelf_OBJECTS) $(readelf_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(readelf_OBJECTS) $(readelf_LDADD) $(LIBS)
+
 size$(EXEEXT): $(size_OBJECTS) $(size_DEPENDENCIES) $(EXTRA_size_DEPENDENCIES) 
        @rm -f size$(EXEEXT)
-       $(LINK) $(size_OBJECTS) $(size_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(size_OBJECTS) $(size_LDADD) $(LIBS)
+
+stack$(EXEEXT): $(stack_OBJECTS) $(stack_DEPENDENCIES) $(EXTRA_stack_DEPENDENCIES) 
+       @rm -f stack$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(stack_OBJECTS) $(stack_LDADD) $(LIBS)
+
 strings$(EXEEXT): $(strings_OBJECTS) $(strings_DEPENDENCIES) $(EXTRA_strings_DEPENDENCIES) 
        @rm -f strings$(EXEEXT)
-       $(LINK) $(strings_OBJECTS) $(strings_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(strings_OBJECTS) $(strings_LDADD) $(LIBS)
+
 strip$(EXEEXT): $(strip_OBJECTS) $(strip_DEPENDENCIES) $(EXTRA_strip_DEPENDENCIES) 
        @rm -f strip$(EXEEXT)
-       $(LINK) $(strip_OBJECTS) $(strip_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(strip_OBJECTS) $(strip_LDADD) $(LIBS)
+
 unstrip$(EXEEXT): $(unstrip_OBJECTS) $(unstrip_DEPENDENCIES) $(EXTRA_unstrip_DEPENDENCIES) 
        @rm -f unstrip$(EXEEXT)
-       $(LINK) $(unstrip_OBJECTS) $(unstrip_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(unstrip_OBJECTS) $(unstrip_LDADD) $(LIBS)
 install-binSCRIPTS: $(bin_SCRIPTS)
        @$(NORMAL_INSTALL)
-       test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
        @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \
@@ -615,6 +746,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readelf.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sectionhash.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/size.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strings.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strip.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symbolhash.Po@am__quote@
@@ -622,45 +754,34 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/versionhash.Po@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
 
 .c.obj:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
 
 .l.c:
-       $(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE)
+       $(AM_V_LEX)$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE)
 
 .y.c:
-       $(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE)
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+       $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE)
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -672,15 +793,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -689,6 +806,21 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -836,11 +968,12 @@ uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS
 
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
-       clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS ctags \
-       distclean distclean-compile distclean-generic distclean-tags \
-       distdir dvi dvi-am html html-am info info-am install \
-       install-am install-binPROGRAMS install-binSCRIPTS install-data \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+       clean-binPROGRAMS clean-generic clean-noinstLIBRARIES \
+       clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
+       distclean-compile distclean-generic distclean-tags distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-binPROGRAMS install-binSCRIPTS install-data \
        install-data-am install-dvi install-dvi-am install-exec \
        install-exec-am install-html install-html-am install-info \
        install-info-am install-man install-pdf install-pdf-am \
@@ -848,7 +981,7 @@ uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS
        installcheck-am installcheck-binPROGRAMS \
        installcheck-binSCRIPTS installdirs maintainer-clean \
        maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
        uninstall-am uninstall-binPROGRAMS uninstall-binSCRIPTS
 
 
@@ -893,7 +1026,7 @@ installcheck-binPROGRAMS: $(bin_PROGRAMS)
 make-debug-archive: $(srcdir)/make-debug-archive.in
        UNSTRIP=$(bindir)/`echo unstrip | sed '$(transform)'`; \
        AR=$(bindir)/`echo ar | sed '$(transform)'`; \
-       sed -e "s,@UNSTRIP@,$$UNSTRIP,g" -e "s,@AR@,$$AR,g" \
+       sed -e "s,[@]UNSTRIP[@],$$UNSTRIP,g" -e "s,[@]AR[@],$$AR,g" \
            -e "s%[@]PACKAGE_NAME[@]%$(PACKAGE_NAME)%g" \
            -e "s%[@]PACKAGE_VERSION[@]%$(PACKAGE_VERSION)%g" \
            $(srcdir)/make-debug-archive.in > $@.new
index 7d241f3..50fc2b3 100644 (file)
@@ -1,5 +1,5 @@
 /* Locate source files and line information for given addresses
-   Copyright (C) 2005-2010, 2012 Red Hat, Inc.
+   Copyright (C) 2005-2010, 2012, 2013 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2005.
 
@@ -61,9 +61,13 @@ static const struct argp_option options[] =
     N_("Show absolute file names using compilation directory"), 0 },
   { "functions", 'f', NULL, 0, N_("Also show function names"), 0 },
   { "symbols", 'S', NULL, 0, N_("Also show symbol or section names"), 0 },
+  { "symbols-sections", 'x', NULL, 0, N_("Also show symbol and the section names"), 0 },
   { "flags", 'F', NULL, 0, N_("Also show line table flags"), 0 },
   { "section", 'j', "NAME", 0,
     N_("Treat addresses as offsets relative to NAME section."), 0 },
+  { "inlines", 'i', NULL, 0,
+    N_("Show all source locations that caused inline expansion of subroutines at the address."),
+    0 },
 
   { NULL, 0, NULL, 0, N_("Miscellaneous:"), 0 },
   /* Unsupported options.  */
@@ -111,9 +115,15 @@ static bool show_functions;
 /* True if ELF symbol or section info should be shown.  */
 static bool show_symbols;
 
+/* True if section associated with a symbol address should be shown.  */
+static bool show_symbol_sections;
+
 /* If non-null, take address parameters as relative to named section.  */
 static const char *just_section;
 
+/* True if all inlined subroutines of the current address should be shown.  */
+static bool show_inlines;
+
 
 int
 main (int argc, char *argv[])
@@ -152,11 +162,15 @@ main (int argc, char *argv[])
 
       char *buf = NULL;
       size_t len = 0;
+      ssize_t chars;
       while (!feof_unlocked (stdin))
        {
-         if (getline (&buf, &len, stdin) < 0)
+         if ((chars = getline (&buf, &len, stdin)) < 0)
            break;
 
+         if (buf[chars - 1] == '\n')
+           buf[chars - 1] = '\0';
+
          result = handle_address (buf, dwfl);
        }
 
@@ -169,6 +183,7 @@ main (int argc, char *argv[])
       while (++remaining < argc);
     }
 
+  dwfl_end (dwfl);
   return result;
 }
 
@@ -223,10 +238,19 @@ parse_opt (int key, char *arg, struct argp_state *state)
       show_symbols = true;
       break;
 
+    case 'x':
+      show_symbols = true;
+      show_symbol_sections = true;
+      break;
+
     case 'j':
       just_section = arg;
       break;
 
+    case 'i':
+      show_inlines = true;
+      break;
+
     default:
       return ARGP_ERR_UNKNOWN;
     }
@@ -327,8 +351,9 @@ static void
 print_addrsym (Dwfl_Module *mod, GElf_Addr addr)
 {
   GElf_Sym s;
-  GElf_Word shndx;
-  const char *name = dwfl_module_addrsym (mod, addr, &s, &shndx);
+  GElf_Off off;
+  const char *name = dwfl_module_addrinfo (mod, addr, &off, &s,
+                                          NULL, NULL, NULL);
   if (name == NULL)
     {
       /* No symbol name.  Get a section name instead.  */
@@ -340,10 +365,51 @@ print_addrsym (Dwfl_Module *mod, GElf_Addr addr)
       else
        printf ("(%s)+%#" PRIx64 "\n", name, addr);
     }
-  else if (addr == s.st_value)
-    puts (name);
   else
-    printf ("%s+%#" PRIx64 "\n", name, addr - s.st_value);
+    {
+      if (off == 0)
+       printf ("%s", name);
+      else
+       printf ("%s+%#" PRIx64 "", name, off);
+
+      // Also show section name for address.
+      if (show_symbol_sections)
+       {
+         Dwarf_Addr ebias;
+         Elf_Scn *scn = dwfl_module_address_section (mod, &addr, &ebias);
+         if (scn != NULL)
+           {
+             GElf_Shdr shdr_mem;
+             GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+             if (shdr != NULL)
+               {
+                 Elf *elf = dwfl_module_getelf (mod, &ebias);
+                 GElf_Ehdr ehdr;
+                 if (gelf_getehdr (elf, &ehdr) != NULL)
+                   printf (" (%s)", elf_strptr (elf, ehdr.e_shstrndx,
+                                                shdr->sh_name));
+               }
+           }
+       }
+      puts ("");
+    }
+}
+
+static void
+print_diesym (Dwarf_Die *die)
+{
+  Dwarf_Attribute attr;
+  const char *name;
+
+  name = dwarf_formstring (dwarf_attr_integrate (die, DW_AT_MIPS_linkage_name,
+                                                &attr)
+                          ?: dwarf_attr_integrate (die, DW_AT_linkage_name,
+                                                   &attr));
+
+  if (name == NULL)
+    name = dwarf_diename (die) ?: "??";
+
+  puts (name);
 }
 
 static int
@@ -369,11 +435,14 @@ find_symbol (Dwfl_Module *mod,
 {
   const char *looking_for = ((void **) arg)[0];
   GElf_Sym *symbol = ((void **) arg)[1];
+  GElf_Addr *value = ((void **) arg)[2];
 
   int n = dwfl_module_getsymtab (mod);
   for (int i = 1; i < n; ++i)
     {
-      const char *symbol_name = dwfl_module_getsym (mod, i, symbol, NULL);
+      const char *symbol_name = dwfl_module_getsym_info (mod, i, symbol,
+                                                        value, NULL, NULL,
+                                                        NULL);
       if (symbol_name == NULL || symbol_name[0] == '\0')
        continue;
       switch (GELF_ST_TYPE (symbol->st_info))
@@ -437,6 +506,30 @@ adjust_to_section (const char *name, uintmax_t *addr, Dwfl *dwfl)
   return false;
 }
 
+static void
+print_src (const char *src, int lineno, int linecol, Dwarf_Die *cu)
+{
+  const char *comp_dir = "";
+  const char *comp_dir_sep = "";
+
+  if (only_basenames)
+    src = basename (src);
+  else if (use_comp_dir && src[0] != '/')
+    {
+      Dwarf_Attribute attr;
+      comp_dir = dwarf_formstring (dwarf_attr (cu, DW_AT_comp_dir, &attr));
+      if (comp_dir != NULL)
+       comp_dir_sep = "/";
+    }
+
+  if (linecol != 0)
+    printf ("%s%s%s:%d:%d",
+           comp_dir, comp_dir_sep, src, lineno, linecol);
+  else
+    printf ("%s%s%s:%d",
+           comp_dir, comp_dir_sep, src, lineno);
+}
+
 static int
 handle_address (const char *string, Dwfl *dwfl)
 {
@@ -463,7 +556,8 @@ handle_address (const char *string, Dwfl *dwfl)
 
          /* It was symbol[+offset].  */
          GElf_Sym sym;
-         void *arg[2] = { name, &sym };
+         GElf_Addr value = 0;
+         void *arg[3] = { name, &sym, &value };
          (void) dwfl_getmodules (dwfl, &find_symbol, arg, 0);
          if (arg[0] != NULL)
            error (0, 0, gettext ("cannot find symbol '%s'"), name);
@@ -474,7 +568,7 @@ handle_address (const char *string, Dwfl *dwfl)
                       gettext ("offset %#" PRIxMAX " lies outside"
                                " contents of '%s'"),
                       addr, name);
-             addr += sym.st_value;
+             addr += value;
              parsed = true;
            }
          break;
@@ -505,28 +599,11 @@ handle_address (const char *string, Dwfl *dwfl)
 
   const char *src;
   int lineno, linecol;
+
   if (line != NULL && (src = dwfl_lineinfo (line, &addr, &lineno, &linecol,
                                            NULL, NULL)) != NULL)
     {
-      const char *comp_dir = "";
-      const char *comp_dir_sep = "";
-
-      if (only_basenames)
-       src = basename (src);
-      else if (use_comp_dir && src[0] != '/')
-       {
-         comp_dir = dwfl_line_comp_dir (line);
-         if (comp_dir != NULL)
-           comp_dir_sep = "/";
-       }
-
-      if (linecol != 0)
-       printf ("%s%s%s:%d:%d",
-               comp_dir, comp_dir_sep, src, lineno, linecol);
-      else
-       printf ("%s%s%s:%d",
-               comp_dir, comp_dir_sep, src, lineno);
-
+      print_src (src, lineno, linecol, dwfl_linecu (line));
       if (show_flags)
        {
          Dwarf_Addr bias;
@@ -560,6 +637,72 @@ handle_address (const char *string, Dwfl *dwfl)
   else
     puts ("??:0");
 
+  if (show_inlines)
+    {
+      Dwarf_Addr bias = 0;
+      Dwarf_Die *cudie = dwfl_module_addrdie (mod, addr, &bias);
+
+      Dwarf_Die *scopes = NULL;
+      int nscopes = dwarf_getscopes (cudie, addr - bias, &scopes);
+      if (nscopes < 0)
+       return 1;
+
+      if (nscopes > 0)
+       {
+         Dwarf_Die subroutine;
+         Dwarf_Off dieoff = dwarf_dieoffset (&scopes[0]);
+         dwarf_offdie (dwfl_module_getdwarf (mod, &bias),
+                       dieoff, &subroutine);
+         free (scopes);
+
+         nscopes = dwarf_getscopes_die (&subroutine, &scopes);
+         if (nscopes > 1)
+           {
+             Dwarf_Die cu;
+             Dwarf_Files *files;
+             if (dwarf_diecu (&scopes[0], &cu, NULL, NULL) != NULL
+                 && dwarf_getsrcfiles (cudie, &files, NULL) == 0)
+               {
+                 for (int i = 0; i < nscopes - 1; i++)
+                   {
+                     Dwarf_Word val;
+                     Dwarf_Attribute attr;
+                     Dwarf_Die *die = &scopes[i];
+                     if (dwarf_tag (die) != DW_TAG_inlined_subroutine)
+                       continue;
+
+                     if (show_functions)
+                       print_diesym (&scopes[i + 1]);
+
+                     src = NULL;
+                     lineno = 0;
+                     linecol = 0;
+                     if (dwarf_formudata (dwarf_attr (die, DW_AT_call_file,
+                                                      &attr), &val) == 0)
+                       src = dwarf_filesrc (files, val, NULL, NULL);
+
+                     if (dwarf_formudata (dwarf_attr (die, DW_AT_call_line,
+                                                      &attr), &val) == 0)
+                       lineno = val;
+
+                     if (dwarf_formudata (dwarf_attr (die, DW_AT_call_column,
+                                                      &attr), &val) == 0)
+                       linecol = val;
+
+                     if (src != NULL)
+                       {
+                         print_src (src, lineno, linecol, &cu);
+                         putchar ('\n');
+                       }
+                     else
+                       puts ("??:0");
+                   }
+               }
+           }
+       }
+      free (scopes);
+    }
+
   return 0;
 }
 
index 03da1b7..f51f0ef 100644 (file)
--- a/src/ar.c
+++ b/src/ar.c
@@ -202,7 +202,7 @@ MEMBER parameter required for 'a', 'b', and 'i' modifiers"));
   if (instance_specifed)
     {
       /* Only valid for certain operations.  */
-      if (operation == oper_extract && operation == oper_delete)
+      if (operation != oper_extract && operation != oper_delete)
        error (1, 0, gettext ("\
 'N' is only meaningful with the 'x' and 'd' options"));
 
@@ -919,7 +919,7 @@ do_oper_delete (const char *arfname, char **argv, int argc,
                long int instance)
 {
   bool *found = alloca (sizeof (bool) * argc);
-  memset (found, '\0', sizeof (found));
+  memset (found, '\0', sizeof (bool) * argc);
 
   /* List of the files we keep.  */
   struct armem *to_copy = NULL;
index 62c517c..43a9145 100644 (file)
@@ -59,11 +59,11 @@ arlib_init (void)
      _FORTIFY_SOURCE=2 would not let us play these games.  Therefore
      we play it safe.  */
   char tmpbuf[sizeof (ar_hdr.ar_date) + 1];
-  memcpy (ar_hdr.ar_date, tmpbuf,
-         snprintf (tmpbuf, sizeof (tmpbuf), "%-*lld",
+  int s = snprintf (tmpbuf, sizeof (tmpbuf), "%-*lld",
                    (int) sizeof (ar_hdr.ar_date),
                     (arlib_deterministic_output ? 0
-                     : (long long int) time (NULL))));
+                     : (long long int) time (NULL)));
+  memcpy (ar_hdr.ar_date, tmpbuf, s);
   assert ((sizeof (struct ar_hdr)  % sizeof (uint32_t)) == 0);
 
   /* Note the string for the ar_uid and ar_gid cases is longer than
@@ -121,10 +121,10 @@ arlib_finalize (void)
 
       symtab.longnames = obstack_finish (&symtab.longnamesob);
 
-      memcpy (&((struct ar_hdr *) symtab.longnames)->ar_size, tmpbuf,
-             snprintf (tmpbuf, sizeof (tmpbuf), "%-*zu",
+      int s = snprintf (tmpbuf, sizeof (tmpbuf), "%-*zu",
                        (int) sizeof (((struct ar_hdr *) NULL)->ar_size),
-                       symtab.longnameslen - sizeof (struct ar_hdr)));
+                       symtab.longnameslen - sizeof (struct ar_hdr));
+      memcpy (&((struct ar_hdr *) symtab.longnames)->ar_size, tmpbuf, s);
     }
 
   symtab.symsofflen = obstack_object_size (&symtab.symsoffob);
index 4084987..d6a4774 100644 (file)
@@ -1,5 +1,5 @@
 /* Pedantic checking of ELF files compliance with gABI/psABI spec.
-   Copyright (C) 2001-2012 Red Hat, Inc.
+   Copyright (C) 2001-2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2001.
 
@@ -123,6 +123,10 @@ static uint32_t shstrndx;
 /* Array to count references in section groups.  */
 static int *scnref;
 
+/* Numbers of sections and program headers.  */
+static unsigned int shnum;
+static unsigned int phnum;
+
 
 int
 main (int argc, char *argv[])
@@ -311,10 +315,19 @@ section_name (Ebl *ebl, int idx)
 {
   GElf_Shdr shdr_mem;
   GElf_Shdr *shdr;
+  const char *ret;
+
+  if ((unsigned int) idx > shnum)
+    return "<invalid>";
 
   shdr = gelf_getshdr (elf_getscn (ebl->elf, idx), &shdr_mem);
+  if (shdr == NULL)
+    return "<invalid>";
 
-  return elf_strptr (ebl->elf, shstrndx, shdr->sh_name);
+  ret = elf_strptr (ebl->elf, shstrndx, shdr->sh_name);
+  if (ret == NULL)
+    return "<invalid>";
+  return ret;
 }
 
 
@@ -331,17 +344,12 @@ static const int valid_e_machine[] =
     EM_CRIS, EM_JAVELIN, EM_FIREPATH, EM_ZSP, EM_MMIX, EM_HUANY, EM_PRISM,
     EM_AVR, EM_FR30, EM_D10V, EM_D30V, EM_V850, EM_M32R, EM_MN10300,
     EM_MN10200, EM_PJ, EM_OPENRISC, EM_ARC_A5, EM_XTENSA, EM_ALPHA,
-    EM_TILEGX, EM_TILEPRO
+    EM_TILEGX, EM_TILEPRO, EM_AARCH64
   };
 #define nvalid_e_machine \
   (sizeof (valid_e_machine) / sizeof (valid_e_machine[0]))
 
 
-/* Numbers of sections and program headers.  */
-static unsigned int shnum;
-static unsigned int phnum;
-
-
 static void
 check_elf_header (Ebl *ebl, GElf_Ehdr *ehdr, size_t size)
 {
@@ -625,7 +633,8 @@ section [%2d] '%s': symbol table cannot have more than one extended index sectio
          }
       }
 
-  if (shdr->sh_entsize != gelf_fsize (ebl->elf, ELF_T_SYM, 1, EV_CURRENT))
+  size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_SYM, 1, EV_CURRENT);
+  if (shdr->sh_entsize != sh_entsize)
     ERROR (gettext ("\
 section [%2u] '%s': entry size is does not match ElfXX_Sym\n"),
           idx, section_name (ebl, idx));
@@ -663,7 +672,7 @@ section [%2d] '%s': XINDEX for zeroth entry not zero\n"),
               xndxscnidx, section_name (ebl, xndxscnidx));
     }
 
-  for (size_t cnt = 1; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
+  for (size_t cnt = 1; cnt < shdr->sh_size / sh_entsize; ++cnt)
     {
       sym = gelf_getsymshndx (data, xndxdata, cnt, &sym_mem, &xndx);
       if (sym == NULL)
@@ -683,7 +692,8 @@ section [%2d] '%s': symbol %zu: invalid name value\n"),
       else
        {
          name = elf_strptr (ebl->elf, shdr->sh_link, sym->st_name);
-         assert (name != NULL);
+         assert (name != NULL
+                 || strshdr->sh_type != SHT_STRTAB);
        }
 
       if (sym->st_shndx == SHN_XINDEX)
@@ -758,29 +768,44 @@ section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"),
            {
              GElf_Addr sh_addr = (ehdr->e_type == ET_REL ? 0
                                   : destshdr->sh_addr);
+             GElf_Addr st_value;
+             if (GELF_ST_TYPE (sym->st_info) == STT_FUNC
+                 || (GELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
+               st_value = sym->st_value & ebl_func_addr_mask (ebl);
+             else
+               st_value = sym->st_value;
              if (GELF_ST_TYPE (sym->st_info) != STT_TLS)
                {
                  if (! ebl_check_special_symbol (ebl, ehdr, sym, name,
                                                  destshdr))
                    {
-                     if (sym->st_value - sh_addr > destshdr->sh_size)
+                     if (st_value - sh_addr > destshdr->sh_size)
                        {
                          /* GNU ld has severe bugs.  When it decides to remove
                             empty sections it leaves symbols referencing them
-                            behind.  These are symbols in .symtab.  */
+                            behind.  These are symbols in .symtab or .dynsym
+                            and for the named symbols have zero size.  See
+                            sourceware PR13621.  */
                          if (!gnuld
-                             || strcmp (section_name (ebl, idx), ".symtab")
+                             || (strcmp (section_name (ebl, idx), ".symtab")
+                                 && strcmp (section_name (ebl, idx),
+                                            ".dynsym"))
+                             || sym->st_size != 0
                              || (strcmp (name, "__preinit_array_start") != 0
                                  && strcmp (name, "__preinit_array_end") != 0
                                  && strcmp (name, "__init_array_start") != 0
                                  && strcmp (name, "__init_array_end") != 0
                                  && strcmp (name, "__fini_array_start") != 0
-                                 && strcmp (name, "__fini_array_end") != 0))
+                                 && strcmp (name, "__fini_array_end") != 0
+                                 && strcmp (name, "__bss_start") != 0
+                                 && strcmp (name, "__bss_start__") != 0
+                                 && strcmp (name, "__TMC_END__") != 0
+                                 && strcmp (name, ".TOC.") != 0))
                            ERROR (gettext ("\
 section [%2d] '%s': symbol %zu: st_value out of bounds\n"),
                                   idx, section_name (ebl, idx), cnt);
                        }
-                     else if ((sym->st_value - sh_addr
+                     else if ((st_value - sh_addr
                                + sym->st_size) > destshdr->sh_size)
                        ERROR (gettext ("\
 section [%2d] '%s': symbol %zu does not fit completely in referenced section [%2d] '%s'\n"),
@@ -800,12 +825,12 @@ section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have SHF_
                    {
                      /* For object files the symbol value must fall
                         into the section.  */
-                     if (sym->st_value > destshdr->sh_size)
+                     if (st_value > destshdr->sh_size)
                        ERROR (gettext ("\
 section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section [%2d] '%s'\n"),
                               idx, section_name (ebl, idx), cnt,
                               (int) xndx, section_name (ebl, xndx));
-                     else if (sym->st_value + sym->st_size
+                     else if (st_value + sym->st_size
                               > destshdr->sh_size)
                        ERROR (gettext ("\
 section [%2d] '%s': symbol %zu does not fit completely in referenced section [%2d] '%s'\n"),
@@ -834,20 +859,20 @@ section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"),
                        }
                      else
                        {
-                         if (sym->st_value
+                         if (st_value
                              < destshdr->sh_offset - phdr->p_offset)
                            ERROR (gettext ("\
 section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] '%s'\n"),
                                   idx, section_name (ebl, idx), cnt,
                                   (int) xndx, section_name (ebl, xndx));
-                         else if (sym->st_value
+                         else if (st_value
                                   > (destshdr->sh_offset - phdr->p_offset
                                      + destshdr->sh_size))
                            ERROR (gettext ("\
 section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section [%2d] '%s'\n"),
                                   idx, section_name (ebl, idx), cnt,
                                   (int) xndx, section_name (ebl, xndx));
-                         else if (sym->st_value + sym->st_size
+                         else if (st_value + sym->st_size
                                   > (destshdr->sh_offset - phdr->p_offset
                                      + destshdr->sh_size))
                            ERROR (gettext ("\
@@ -1032,9 +1057,11 @@ is_rel_dyn (Ebl *ebl, const GElf_Ehdr *ehdr, int idx, const GElf_Shdr *shdr,
     {
       GElf_Shdr rcshdr_mem;
       const GElf_Shdr *rcshdr = gelf_getshdr (scn, &rcshdr_mem);
-      assert (rcshdr != NULL);
 
-      if (rcshdr->sh_type == SHT_DYNAMIC)
+      if (rcshdr == NULL)
+       break;
+
+      if (rcshdr->sh_type == SHT_DYNAMIC && rcshdr->sh_entsize)
        {
          /* Found the dynamic section.  Look through it.  */
          Elf_Data *d = elf_getdata (scn, NULL);
@@ -1044,7 +1071,9 @@ is_rel_dyn (Ebl *ebl, const GElf_Ehdr *ehdr, int idx, const GElf_Shdr *shdr,
            {
              GElf_Dyn dyn_mem;
              GElf_Dyn *dyn = gelf_getdyn (d, cnt, &dyn_mem);
-             assert (dyn != NULL);
+
+             if (dyn == NULL)
+               break;
 
              if (dyn->d_tag == DT_RELCOUNT)
                {
@@ -1058,7 +1087,9 @@ section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"),
                      /* Does the number specified number of relative
                         relocations exceed the total number of
                         relocations?  */
-                     if (dyn->d_un.d_val > shdr->sh_size / shdr->sh_entsize)
+                     if (shdr->sh_entsize != 0
+                         && dyn->d_un.d_val > (shdr->sh_size
+                                               / shdr->sh_entsize))
                        ERROR (gettext ("\
 section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"),
                               idx, section_name (ebl, idx),
@@ -1192,8 +1223,7 @@ check_reloc_shdr (Ebl *ebl, const GElf_Ehdr *ehdr, const GElf_Shdr *shdr,
                                 destshdr_memp);
       if (*destshdrp != NULL)
        {
-         if((*destshdrp)->sh_type != SHT_PROGBITS
-            && (*destshdrp)->sh_type != SHT_NOBITS)
+         if(! ebl_check_reloc_target_type (ebl, (*destshdrp)->sh_type))
            {
              reldyn = is_rel_dyn (ebl, ehdr, idx, shdr, true);
              if (!reldyn)
@@ -1218,7 +1248,8 @@ section [%2d] '%s': no relocations for merge-able sections possible\n"),
        }
     }
 
-  if (shdr->sh_entsize != gelf_fsize (ebl->elf, reltype, 1, EV_CURRENT))
+  size_t sh_entsize = gelf_fsize (ebl->elf, reltype, 1, EV_CURRENT);
+  if (shdr->sh_entsize != sh_entsize)
     ERROR (gettext (reltype == ELF_T_RELA ? "\
 section [%2d] '%s': section entry size does not match ElfXX_Rela\n" : "\
 section [%2d] '%s': section entry size does not match ElfXX_Rel\n"),
@@ -1441,7 +1472,8 @@ check_rela (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
   Elf_Data *symdata = elf_getdata (symscn, NULL);
   enum load_state state = state_undecided;
 
-  for (size_t cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
+  size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_RELA, 1, EV_CURRENT);
+  for (size_t cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt)
     {
       GElf_Rela rela_mem;
       GElf_Rela *rela = gelf_getrela (data, cnt, &rela_mem);
@@ -1491,7 +1523,8 @@ check_rel (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
   Elf_Data *symdata = elf_getdata (symscn, NULL);
   enum load_state state = state_undecided;
 
-  for (size_t cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
+  size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_REL, 1, EV_CURRENT);
+  for (size_t cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt)
     {
       GElf_Rel rel_mem;
       GElf_Rel *rel = gelf_getrel (data, cnt, &rel_mem);
@@ -1590,7 +1623,8 @@ section [%2d] '%s': referenced as string table for section [%2d] '%s' but type i
           shdr->sh_link, section_name (ebl, shdr->sh_link),
           idx, section_name (ebl, idx));
 
-  if (shdr->sh_entsize != gelf_fsize (ebl->elf, ELF_T_DYN, 1, EV_CURRENT))
+  size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_DYN, 1, EV_CURRENT);
+  if (shdr->sh_entsize != sh_entsize)
     ERROR (gettext ("\
 section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"),
           idx, section_name (ebl, idx));
@@ -1600,7 +1634,7 @@ section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"),
           idx, section_name (ebl, idx));
 
   bool non_null_warned = false;
-  for (cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
+  for (cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt)
     {
       GElf_Dyn dyn_mem;
       GElf_Dyn *dyn = gelf_getdyn (data, cnt, &dyn_mem);
@@ -1872,6 +1906,8 @@ section [%2d] '%s': entry size does not match Elf32_Word\n"),
           idx, section_name (ebl, idx));
 
   if (symshdr != NULL
+      && shdr->sh_entsize
+      && symshdr->sh_entsize
       && (shdr->sh_size / shdr->sh_entsize
          < symshdr->sh_size / symshdr->sh_entsize))
     ERROR (gettext ("\
@@ -1898,6 +1934,12 @@ section [%2d] '%s': extended section index in section [%2zu] '%s' refers to same
     }
 
   Elf_Data *data = elf_getdata (elf_getscn (ebl->elf, idx), NULL);
+  if (data == NULL)
+    {
+      ERROR (gettext ("section [%2d] '%s': cannot get section data\n"),
+            idx, section_name (ebl, idx));
+      return;
+    }
 
   if (*((Elf32_Word *) data->d_buf) != 0)
     ERROR (gettext ("symbol 0 should have zero extended section index\n"));
@@ -1940,7 +1982,7 @@ section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"),
 
   size_t maxidx = nchain;
 
-  if (symshdr != NULL)
+  if (symshdr != NULL && symshdr->sh_entsize != 0)
     {
       size_t symsize = symshdr->sh_size / symshdr->sh_entsize;
 
@@ -1951,18 +1993,28 @@ section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"),
       maxidx = symsize;
     }
 
+  Elf32_Word *buf = (Elf32_Word *) data->d_buf;
+  Elf32_Word *end = (Elf32_Word *) ((char *) data->d_buf + shdr->sh_size);
   size_t cnt;
   for (cnt = 2; cnt < 2 + nbucket; ++cnt)
-    if (((Elf32_Word *) data->d_buf)[cnt] >= maxidx)
+    {
+      if (buf + cnt >= end)
+       break;
+      else if (buf[cnt] >= maxidx)
       ERROR (gettext ("\
 section [%2d] '%s': hash bucket reference %zu out of bounds\n"),
             idx, section_name (ebl, idx), cnt - 2);
+    }
 
   for (; cnt < 2 + nbucket + nchain; ++cnt)
-    if (((Elf32_Word *) data->d_buf)[cnt] >= maxidx)
+    {
+      if (buf + cnt >= end)
+       break;
+      else if (buf[cnt] >= maxidx)
       ERROR (gettext ("\
 section [%2d] '%s': hash chain reference %zu out of bounds\n"),
             idx, section_name (ebl, idx), cnt - 2 - nbucket);
+    }
 }
 
 
@@ -1992,18 +2044,28 @@ section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"),
       maxidx = symsize;
     }
 
+  Elf64_Xword *buf = (Elf64_Xword *) data->d_buf;
+  Elf64_Xword *end = (Elf64_Xword *) ((char *) data->d_buf + shdr->sh_size);
   size_t cnt;
   for (cnt = 2; cnt < 2 + nbucket; ++cnt)
-    if (((Elf64_Xword *) data->d_buf)[cnt] >= maxidx)
+    {
+      if (buf + cnt >= end)
+       break;
+      else if (buf[cnt] >= maxidx)
       ERROR (gettext ("\
 section [%2d] '%s': hash bucket reference %zu out of bounds\n"),
             idx, section_name (ebl, idx), cnt - 2);
+    }
 
   for (; cnt < 2 + nbucket + nchain; ++cnt)
-    if (((Elf64_Xword *) data->d_buf)[cnt] >= maxidx)
+    {
+      if (buf + cnt >= end)
+       break;
+      else if (buf[cnt] >= maxidx)
       ERROR (gettext ("\
 section [%2d] '%s': hash chain reference %" PRIu64 " out of bounds\n"),
-            idx, section_name (ebl, idx), (uint64_t) (cnt - 2 - nbucket));
+              idx, section_name (ebl, idx), (uint64_t) cnt - 2 - nbucket);
+    }
 }
 
 
@@ -2028,7 +2090,7 @@ section [%2d] '%s': bitmask size not power of 2: %u\n"),
   if (shdr->sh_size < (4 + bitmask_words + nbuckets) * sizeof (Elf32_Word))
     {
       ERROR (gettext ("\
-section [%2d] '%s': hash table section is too small (is %ld, expected at least%ld)\n"),
+section [%2d] '%s': hash table section is too small (is %ld, expected at least %ld)\n"),
             idx, section_name (ebl, idx), (long int) shdr->sh_size,
             (long int) ((4 + bitmask_words + nbuckets) * sizeof (Elf32_Word)));
       return;
@@ -2700,8 +2762,9 @@ section [%2d] '%s' refers in sh_link to section [%2d] '%s' which is no dynamic s
 
   /* The number of elements in the version symbol table must be the
      same as the number of symbols.  */
-  if (shdr->sh_size / shdr->sh_entsize
-      != symshdr->sh_size / symshdr->sh_entsize)
+  if (shdr->sh_entsize && symshdr->sh_entsize
+      && (shdr->sh_size / shdr->sh_entsize
+         != symshdr->sh_size / symshdr->sh_entsize))
     ERROR (gettext ("\
 section [%2d] '%s' has different number of entries than symbol table [%2d] '%s'\n"),
           idx, section_name (ebl, idx),
index 39f7c92..9fd8163 100644 (file)
@@ -311,7 +311,7 @@ process_file (const char *fname, bool more_than_one)
   if (!have_textrel)
     {
       error (0, 0, gettext ("no text relocations reported in '%s'"), fname);
-      return 1;
+      goto err_elf_close;
     }
 
   int fd2 = -1;
index 5a1d321..81493c2 100644 (file)
@@ -28,7 +28,7 @@
 #define FLEX_SCANNER
 #define YY_FLEX_MAJOR_VERSION 2
 #define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 35
+#define YY_FLEX_SUBMINOR_VERSION 37
 #if YY_FLEX_SUBMINOR_VERSION > 0
 #define FLEX_BETA
 #endif
@@ -73,7 +73,6 @@ typedef int flex_int32_t;
 typedef unsigned char flex_uint8_t; 
 typedef unsigned short int flex_uint16_t;
 typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
 
 /* Limits of integral types. */
 #ifndef INT8_MIN
@@ -104,6 +103,8 @@ typedef unsigned int flex_uint32_t;
 #define UINT32_MAX             (4294967295U)
 #endif
 
+#endif /* ! C99 */
+
 #endif /* ! FLEXINT_H */
 
 #ifdef __cplusplus
@@ -172,7 +173,12 @@ typedef unsigned int flex_uint32_t;
 typedef struct yy_buffer_state *YY_BUFFER_STATE;
 #endif
 
-extern int ldleng;
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern yy_size_t ldleng;
 
 extern FILE *ldin, *ldout;
 
@@ -211,11 +217,6 @@ extern FILE *ldin, *ldout;
 
 #define unput(c) yyunput( c, (yytext_ptr)  )
 
-#ifndef YY_TYPEDEF_YY_SIZE_T
-#define YY_TYPEDEF_YY_SIZE_T
-typedef size_t yy_size_t;
-#endif
-
 #ifndef YY_STRUCT_YY_BUFFER_STATE
 #define YY_STRUCT_YY_BUFFER_STATE
 struct yy_buffer_state
@@ -233,7 +234,7 @@ struct yy_buffer_state
        /* Number of characters read into yy_ch_buf, not including EOB
         * characters.
         */
-       int yy_n_chars;
+       yy_size_t yy_n_chars;
 
        /* Whether we "own" the buffer - i.e., we know we created it,
         * and can realloc() it to grow it, and should free() it to
@@ -303,8 +304,8 @@ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
 
 /* yy_hold_char holds the character lost when ldtext is formed. */
 static char yy_hold_char;
-static int yy_n_chars;         /* number of characters read into yy_ch_buf */
-int ldleng;
+static yy_size_t yy_n_chars;           /* number of characters read into yy_ch_buf */
+yy_size_t ldleng;
 
 /* Points to current character in buffer. */
 static char *yy_c_buf_p = (char *) 0;
@@ -332,7 +333,7 @@ static void ld_init_buffer (YY_BUFFER_STATE b,FILE *file  );
 
 YY_BUFFER_STATE ld_scan_buffer (char *base,yy_size_t size  );
 YY_BUFFER_STATE ld_scan_string (yyconst char *yy_str  );
-YY_BUFFER_STATE ld_scan_bytes (yyconst char *bytes,int len  );
+YY_BUFFER_STATE ld_scan_bytes (yyconst char *bytes,yy_size_t len  );
 
 void *ldalloc (yy_size_t  );
 void *ldrealloc (void *,yy_size_t  );
@@ -364,7 +365,7 @@ void ldfree (void *  );
 
 /* Begin user sect3 */
 
-#define ldwrap(n) 1
+#define ldwrap() 1
 #define YY_SKIP_YYWRAP
 
 typedef unsigned char YY_CHAR;
@@ -1145,7 +1146,7 @@ static int pop_state (void);
 static int handle_ifdef (void);
 static void invalid_char (int ch);
 
-#line 1149 "ldlex.c"
+#line 1150 "ldlex.c"
 
 #define INITIAL 0
 #define IGNORE 1
@@ -1185,7 +1186,7 @@ FILE *ldget_out (void );
 
 void ldset_out  (FILE * out_str  );
 
-int ldget_leng (void );
+yy_size_t ldget_leng (void );
 
 char *ldget_text (void );
 
@@ -1246,7 +1247,7 @@ static int input (void );
        if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
                { \
                int c = '*'; \
-               unsigned n; \
+               size_t n; \
                for ( n = 0; n < max_size && \
                             (c = getc( ldin )) != EOF && c != '\n'; ++n ) \
                        buf[n] = (char) c; \
@@ -1339,7 +1340,7 @@ YY_DECL
                                    return kVERSION_SCRIPT;
                                  }
 
-#line 1343 "ldlex.c"
+#line 1344 "ldlex.c"
 
        if ( !(yy_init) )
                {
@@ -1410,7 +1411,7 @@ yy_find_action:
 
                if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
                        {
-                       int yyl;
+                       yy_size_t yyl;
                        for ( yyl = 0; yyl < ldleng; ++yyl )
                                if ( ldtext[yyl] == '\n' )
                                           
@@ -1754,7 +1755,7 @@ YY_RULE_SETUP
 #line 198 "ldlex.l"
 ECHO;
        YY_BREAK
-#line 1758 "ldlex.c"
+#line 1759 "ldlex.c"
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(IGNORE):
        yyterminate();
@@ -1942,21 +1943,21 @@ static int yy_get_next_buffer (void)
 
        else
                {
-                       int num_to_read =
+                       yy_size_t num_to_read =
                        YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
 
                while ( num_to_read <= 0 )
                        { /* Not enough room in the buffer - grow it. */
 
                        /* just a shorter name for the current buffer */
-                       YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+                       YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
 
                        int yy_c_buf_p_offset =
                                (int) ((yy_c_buf_p) - b->yy_ch_buf);
 
                        if ( b->yy_is_our_buffer )
                                {
-                               int new_size = b->yy_buf_size * 2;
+                               yy_size_t new_size = b->yy_buf_size * 2;
 
                                if ( new_size <= 0 )
                                        b->yy_buf_size += b->yy_buf_size / 8;
@@ -1987,7 +1988,7 @@ static int yy_get_next_buffer (void)
 
                /* Read in more data. */
                YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
-                       (yy_n_chars), (size_t) num_to_read );
+                       (yy_n_chars), num_to_read );
 
                YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
                }
@@ -2083,7 +2084,7 @@ static int yy_get_next_buffer (void)
        yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
        yy_is_jam = (yy_current_state == 218);
 
-       return yy_is_jam ? 0 : yy_current_state;
+               return yy_is_jam ? 0 : yy_current_state;
 }
 
     static void yyunput (int c, register char * yy_bp )
@@ -2098,7 +2099,7 @@ static int yy_get_next_buffer (void)
        if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
                { /* need to shift things up to make room */
                /* +2 for EOB chars. */
-               register int number_to_move = (yy_n_chars) + 2;
+               register yy_size_t number_to_move = (yy_n_chars) + 2;
                register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
                                        YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
                register char *source =
@@ -2151,7 +2152,7 @@ static int yy_get_next_buffer (void)
 
                else
                        { /* need more input */
-                       int offset = (yy_c_buf_p) - (yytext_ptr);
+                       yy_size_t offset = (yy_c_buf_p) - (yytext_ptr);
                        ++(yy_c_buf_p);
 
                        switch ( yy_get_next_buffer(  ) )
@@ -2429,7 +2430,7 @@ void ldpop_buffer_state (void)
  */
 static void ldensure_buffer_stack (void)
 {
-       int num_to_alloc;
+       yy_size_t num_to_alloc;
     
        if (!(yy_buffer_stack)) {
 
@@ -2521,17 +2522,17 @@ YY_BUFFER_STATE ld_scan_string (yyconst char * yystr )
 
 /** Setup the input buffer state to scan the given bytes. The next call to ldlex() will
  * scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
  * 
  * @return the newly allocated buffer state object.
  */
-YY_BUFFER_STATE ld_scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
+YY_BUFFER_STATE ld_scan_bytes  (yyconst char * yybytes, yy_size_t  _yybytes_len )
 {
        YY_BUFFER_STATE b;
        char *buf;
        yy_size_t n;
-       int i;
+       yy_size_t i;
     
        /* Get memory for full buffer, including space for trailing EOB's. */
        n = _yybytes_len + 2;
@@ -2613,7 +2614,7 @@ FILE *ldget_out  (void)
 /** Get the length of the current token.
  * 
  */
-int ldget_leng  (void)
+yy_size_t ldget_leng  (void)
 {
         return ldleng;
 }
index 4fd1a7e..5ebed84 100644 (file)
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 2.5.  */
+/* A Bison parser, made by GNU Bison 2.7.  */
 
 /* Bison implementation for Yacc-like parsers in C
    
-      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+      Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc.
    
    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
@@ -44,7 +44,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "2.5"
+#define YYBISON_VERSION "2.7"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -58,8 +58,6 @@
 /* Pull parsers.  */
 #define YYPULL 1
 
-/* Using locations.  */
-#define YYLSP_NEEDED 0
 
 /* Substitute the variable and function names.  */
 #define yyparse         ldparse
 #define yydebug         lddebug
 #define yynerrs         ldnerrs
 
-
 /* Copy the first part of user declarations.  */
-
-/* Line 268 of yacc.c  */
+/* Line 371 of yacc.c  */
 #line 1 "ldscript.y"
 
 /* Parser for linker scripts.
@@ -136,14 +132,16 @@ static void add_versions (struct version *versions);
 
 extern int yylex (void);
 
+/* Line 371 of yacc.c  */
+#line 137 "ldscript.c"
 
-/* Line 268 of yacc.c  */
-#line 142 "ldscript.c"
-
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
+# ifndef YY_NULL
+#  if defined __cplusplus && 201103L <= __cplusplus
+#   define YY_NULL nullptr
+#  else
+#   define YY_NULL 0
+#  endif
+# endif
 
 /* Enabling verbose error messages.  */
 #ifdef YYERROR_VERBOSE
@@ -153,11 +151,17 @@ extern int yylex (void);
 # define YYERROR_VERBOSE 0
 #endif
 
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
+/* In a future release of Bison, this section will be replaced
+   by #include "y.tab.h".  */
+#ifndef YY_LD_LDSCRIPT_H_INCLUDED
+# define YY_LD_LDSCRIPT_H_INCLUDED
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int lddebug;
 #endif
-
 
 /* Tokens.  */
 #ifndef YYTOKENTYPE
@@ -225,12 +229,10 @@ extern int yylex (void);
 
 
 
-
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
 {
-
-/* Line 293 of yacc.c  */
+/* Line 387 of yacc.c  */
 #line 63 "ldscript.y"
 
   uintmax_t num;
@@ -247,21 +249,36 @@ typedef union YYSTYPE
   struct id_list *id_list;
 
 
-
-/* Line 293 of yacc.c  */
-#line 253 "ldscript.c"
+/* Line 387 of yacc.c  */
+#line 254 "ldscript.c"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 #endif
 
+extern YYSTYPE ldlval;
 
-/* Copy the second part of user declarations.  */
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int ldparse (void *YYPARSE_PARAM);
+#else
+int ldparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int ldparse (void);
+#else
+int ldparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+#endif /* !YY_LD_LDSCRIPT_H_INCLUDED  */
 
+/* Copy the second part of user declarations.  */
 
-/* Line 343 of yacc.c  */
-#line 265 "ldscript.c"
+/* Line 390 of yacc.c  */
+#line 282 "ldscript.c"
 
 #ifdef short
 # undef short
@@ -314,24 +331,24 @@ typedef short int yytype_int16;
 # if defined YYENABLE_NLS && YYENABLE_NLS
 #  if ENABLE_NLS
 #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
-#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+#   define YY_(Msgid) dgettext ("bison-runtime", Msgid)
 #  endif
 # endif
 # ifndef YY_
-#  define YY_(msgid) msgid
+#  define YY_(Msgid) Msgid
 # endif
 #endif
 
 /* Suppress unused-variable warnings by "using" E.  */
 #if ! defined lint || defined __GNUC__
-# define YYUSE(e) ((void) (e))
+# define YYUSE(E) ((void) (E))
 #else
-# define YYUSE(e) /* empty */
+# define YYUSE(E) /* empty */
 #endif
 
 /* Identity function, used to suppress warnings about constant conditions.  */
 #ifndef lint
-# define YYID(n) (n)
+# define YYID(N) (N)
 #else
 #if (defined __STDC__ || defined __C99__FUNC__ \
      || defined __cplusplus || defined _MSC_VER)
@@ -367,6 +384,7 @@ YYID (yyi)
 #    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
      || defined __cplusplus || defined _MSC_VER)
 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+      /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
 #     ifndef EXIT_SUCCESS
 #      define EXIT_SUCCESS 0
 #     endif
@@ -458,20 +476,20 @@ union yyalloc
 #endif
 
 #if defined YYCOPY_NEEDED && YYCOPY_NEEDED
-/* Copy COUNT objects from FROM to TO.  The source and destination do
+/* Copy COUNT objects from SRC to DST.  The source and destination do
    not overlap.  */
 # ifndef YYCOPY
 #  if defined __GNUC__ && 1 < __GNUC__
-#   define YYCOPY(To, From, Count) \
-      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#   define YYCOPY(Dst, Src, Count) \
+      __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
 #  else
-#   define YYCOPY(To, From, Count)             \
-      do                                       \
-       {                                       \
-         YYSIZE_T yyi;                         \
-         for (yyi = 0; yyi < (Count); yyi++)   \
-           (To)[yyi] = (From)[yyi];            \
-       }                                       \
+#   define YYCOPY(Dst, Src, Count)              \
+      do                                        \
+        {                                       \
+          YYSIZE_T yyi;                         \
+          for (yyi = 0; yyi < (Count); yyi++)   \
+            (Dst)[yyi] = (Src)[yyi];            \
+        }                                       \
       while (YYID (0))
 #  endif
 # endif
@@ -589,7 +607,7 @@ static const yytype_uint16 yyrline[] =
 };
 #endif
 
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+#if YYDEBUG || YYERROR_VERBOSE || 0
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
@@ -605,7 +623,7 @@ static const char *const yytname[] =
   "inputsection", "sectionname", "sort_opt_name", "exclude_opt", "expr",
   "filename_id_list", "comma_opt", "filename_id_listelem", "versionlist",
   "version", "version_stmt_list", "version_stmt", "filename_id_star_list",
-  "filename_id", "filename_id_star", 0
+  "filename_id", "filename_id_star", YY_NULL
 };
 #endif
 
@@ -738,10 +756,10 @@ static const yytype_uint8 yytable[] =
        0,     0,     0,     0,    81,     0,    78
 };
 
-#define yypact_value_is_default(yystate) \
-  ((yystate) == (-86))
+#define yypact_value_is_default(Yystate) \
+  (!!((Yystate) == (-86)))
 
-#define yytable_value_is_error(yytable_value) \
+#define yytable_value_is_error(Yytable_value) \
   YYID (0)
 
 static const yytype_int16 yycheck[] =
@@ -820,62 +838,35 @@ static const yytype_uint8 yystos[] =
 
 #define YYRECOVERING()  (!!yyerrstatus)
 
-#define YYBACKUP(Token, Value)                                 \
-do                                                             \
-  if (yychar == YYEMPTY && yylen == 1)                         \
-    {                                                          \
-      yychar = (Token);                                                \
-      yylval = (Value);                                                \
-      YYPOPSTACK (1);                                          \
-      goto yybackup;                                           \
-    }                                                          \
-  else                                                         \
-    {                                                          \
+#define YYBACKUP(Token, Value)                                  \
+do                                                              \
+  if (yychar == YYEMPTY)                                        \
+    {                                                           \
+      yychar = (Token);                                         \
+      yylval = (Value);                                         \
+      YYPOPSTACK (yylen);                                       \
+      yystate = *yyssp;                                         \
+      goto yybackup;                                            \
+    }                                                           \
+  else                                                          \
+    {                                                           \
       yyerror (YY_("syntax error: cannot back up")); \
       YYERROR;                                                 \
     }                                                          \
 while (YYID (0))
 
-
+/* Error token number */
 #define YYTERROR       1
 #define YYERRCODE      256
 
 
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-   If N is 0, then set CURRENT to the empty location which ends
-   the previous symbol: RHS[0] (always defined).  */
-
-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N)                               \
-    do                                                                 \
-      if (YYID (N))                                                    \
-       {                                                               \
-         (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
-         (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
-         (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
-         (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
-       }                                                               \
-      else                                                             \
-       {                                                               \
-         (Current).first_line   = (Current).last_line   =              \
-           YYRHSLOC (Rhs, 0).last_line;                                \
-         (Current).first_column = (Current).last_column =              \
-           YYRHSLOC (Rhs, 0).last_column;                              \
-       }                                                               \
-    while (YYID (0))
-#endif
-
-
 /* This macro is provided for backward compatibility. */
-
 #ifndef YY_LOCATION_PRINT
 # define YY_LOCATION_PRINT(File, Loc) ((void) 0)
 #endif
 
 
 /* YYLEX -- calling `yylex' with the right arguments.  */
-
 #ifdef YYLEX_PARAM
 # define YYLEX yylex (YYLEX_PARAM)
 #else
@@ -925,6 +916,8 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep)
     YYSTYPE const * const yyvaluep;
 #endif
 {
+  FILE *yyo = yyoutput;
+  YYUSE (yyo);
   if (!yyvaluep)
     return;
 # ifdef YYPRINT
@@ -936,7 +929,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep)
   switch (yytype)
     {
       default:
-       break;
+        break;
     }
 }
 
@@ -1176,12 +1169,11 @@ static int
 yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                 yytype_int16 *yyssp, int yytoken)
 {
-  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]);
+  YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]);
   YYSIZE_T yysize = yysize0;
-  YYSIZE_T yysize1;
   enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
   /* Internationalized format string. */
-  const char *yyformat = 0;
+  const char *yyformat = YY_NULL;
   /* Arguments of yyformat. */
   char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
   /* Number of reported tokens (one for the "unexpected", one per
@@ -1241,11 +1233,13 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                     break;
                   }
                 yyarg[yycount++] = yytname[yyx];
-                yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-                if (! (yysize <= yysize1
-                       && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-                  return 2;
-                yysize = yysize1;
+                {
+                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]);
+                  if (! (yysize <= yysize1
+                         && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+                    return 2;
+                  yysize = yysize1;
+                }
               }
         }
     }
@@ -1265,10 +1259,12 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
 # undef YYCASE_
     }
 
-  yysize1 = yysize + yystrlen (yyformat);
-  if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-    return 2;
-  yysize = yysize1;
+  {
+    YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
+    if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+      return 2;
+    yysize = yysize1;
+  }
 
   if (*yymsg_alloc < yysize)
     {
@@ -1328,32 +1324,27 @@ yydestruct (yymsg, yytype, yyvaluep)
     {
 
       default:
-       break;
+        break;
     }
 }
 
 
-/* Prevent warnings from -Wmissing-prototypes.  */
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void *YYPARSE_PARAM);
-#else
-int yyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void);
-#else
-int yyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
 
 
 /* The lookahead symbol.  */
 int yychar;
 
+
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
 /* The semantic value of the lookahead symbol.  */
-YYSTYPE yylval;
+YYSTYPE yylval YY_INITIAL_VALUE(yyval_default);
 
 /* Number of syntax errors so far.  */
 int yynerrs;
@@ -1393,7 +1384,7 @@ yyparse ()
        `yyss': related to states.
        `yyvs': related to semantic values.
 
-       Refer to the stacks thru separate pointers, to allow yyoverflow
+       Refer to the stacks through separate pointers, to allow yyoverflow
        to reallocate them elsewhere.  */
 
     /* The state stack.  */
@@ -1411,7 +1402,7 @@ yyparse ()
   int yyn;
   int yyresult;
   /* Lookahead token as an internal (translated) token number.  */
-  int yytoken;
+  int yytoken = 0;
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;
@@ -1429,9 +1420,8 @@ yyparse ()
      Keep to zero when no symbol should be popped.  */
   int yylen = 0;
 
-  yytoken = 0;
-  yyss = yyssa;
-  yyvs = yyvsa;
+  yyssp = yyss = yyssa;
+  yyvsp = yyvs = yyvsa;
   yystacksize = YYINITDEPTH;
 
   YYDPRINTF ((stderr, "Starting parse\n"));
@@ -1440,14 +1430,6 @@ yyparse ()
   yyerrstatus = 0;
   yynerrs = 0;
   yychar = YYEMPTY; /* Cause a token to be read.  */
-
-  /* Initialize stack pointers.
-     Waste one element of value and location stack
-     so that they stay on the same level as the state stack.
-     The wasted elements are never initialized.  */
-  yyssp = yyss;
-  yyvsp = yyvs;
-
   goto yysetstate;
 
 /*------------------------------------------------------------.
@@ -1588,7 +1570,9 @@ yybackup:
   yychar = YYEMPTY;
 
   yystate = yyn;
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   *++yyvsp = yylval;
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
 
   goto yynewstate;
 
@@ -1625,15 +1609,13 @@ yyreduce:
   switch (yyn)
     {
         case 3:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 137 "ldscript.y"
     { add_versions ((yyvsp[(2) - (2)].version)); }
     break;
 
   case 6:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 145 "ldscript.y"
     {
                      if (likely (ld_state.entry == NULL))
@@ -1642,8 +1624,7 @@ yyreduce:
     break;
 
   case 7:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 150 "ldscript.y"
     {
                      ld_new_searchdir ((yyvsp[(3) - (5)].str));
@@ -1651,8 +1632,7 @@ yyreduce:
     break;
 
   case 8:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 154 "ldscript.y"
     {
                      if (likely (ld_state.pagesize == 0))
@@ -1661,8 +1641,7 @@ yyreduce:
     break;
 
   case 9:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 159 "ldscript.y"
     {
                      if (likely (ld_state.interp == NULL)
@@ -1672,8 +1651,7 @@ yyreduce:
     break;
 
   case 10:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 165 "ldscript.y"
     {
                      new_segment ((yyvsp[(2) - (5)].num), (yyvsp[(4) - (5)].output_rule));
@@ -1681,8 +1659,7 @@ yyreduce:
     break;
 
   case 11:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 169 "ldscript.y"
     {
                      fputs_unlocked (gettext ("mode for segment invalid\n"),
@@ -1692,8 +1669,7 @@ yyreduce:
     break;
 
   case 12:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 175 "ldscript.y"
     {
                      /* First little optimization.  If there is only one
@@ -1708,36 +1684,31 @@ yyreduce:
     break;
 
   case 13:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 186 "ldscript.y"
     { add_inputfiles ((yyvsp[(3) - (4)].filename_list)); }
     break;
 
   case 14:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 188 "ldscript.y"
     { add_inputfiles (mark_as_needed ((yyvsp[(3) - (4)].filename_list))); }
     break;
 
   case 15:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 190 "ldscript.y"
     { add_versions ((yyvsp[(3) - (4)].version)); }
     break;
 
   case 16:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 192 "ldscript.y"
     { /* XXX TODO */ }
     break;
 
   case 17:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 196 "ldscript.y"
     {
                      (yyvsp[(2) - (2)].output_rule)->next = (yyvsp[(1) - (2)].output_rule)->next;
@@ -1746,15 +1717,13 @@ yyreduce:
     break;
 
   case 18:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 201 "ldscript.y"
     { (yyval.output_rule) = (yyvsp[(1) - (1)].output_rule); }
     break;
 
   case 19:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 205 "ldscript.y"
     {
                      (yyval.output_rule) = new_output_rule (output_assignment);
@@ -1763,8 +1732,7 @@ yyreduce:
     break;
 
   case 20:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 210 "ldscript.y"
     {
                      (yyval.output_rule) = new_output_rule (output_section);
@@ -1780,8 +1748,7 @@ yyreduce:
     break;
 
   case 21:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 222 "ldscript.y"
     {
                      /* This is a short cut for "ID { *(ID) }".  */
@@ -1807,22 +1774,19 @@ yyreduce:
     break;
 
   case 22:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 246 "ldscript.y"
     { (yyval.assignment) = new_assignment ((yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].expr), false); }
     break;
 
   case 23:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 248 "ldscript.y"
     { (yyval.assignment) = new_assignment ((yyvsp[(3) - (6)].str), (yyvsp[(5) - (6)].expr), true); }
     break;
 
   case 24:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 252 "ldscript.y"
     {
                      (yyvsp[(2) - (2)].input_rule)->next = (yyvsp[(1) - (2)].input_rule)->next;
@@ -1831,15 +1795,13 @@ yyreduce:
     break;
 
   case 25:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 257 "ldscript.y"
     { (yyval.input_rule) = (yyvsp[(1) - (1)].input_rule); }
     break;
 
   case 26:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 261 "ldscript.y"
     {
                      (yyval.input_rule) = new_input_rule (input_section);
@@ -1848,8 +1810,7 @@ yyreduce:
     break;
 
   case 27:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 266 "ldscript.y"
     {
                      (yyvsp[(3) - (4)].filemask_section_name)->keep_flag = true;
@@ -1860,8 +1821,7 @@ yyreduce:
     break;
 
   case 28:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 273 "ldscript.y"
     {
                      (yyval.input_rule) = new_input_rule (input_assignment);
@@ -1870,8 +1830,7 @@ yyreduce:
     break;
 
   case 29:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 280 "ldscript.y"
     {
                      (yyval.filemask_section_name) = (struct filemask_section_name *)
@@ -1884,36 +1843,31 @@ yyreduce:
     break;
 
   case 30:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 291 "ldscript.y"
     { (yyval.sectionname) = new_input_section_name ((yyvsp[(1) - (1)].str), false); }
     break;
 
   case 31:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 293 "ldscript.y"
     { (yyval.sectionname) = new_input_section_name ((yyvsp[(3) - (4)].str), true); }
     break;
 
   case 32:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 297 "ldscript.y"
     { (yyval.str) = (yyvsp[(3) - (4)].str); }
     break;
 
   case 33:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 299 "ldscript.y"
     { (yyval.str) = NULL; }
     break;
 
   case 34:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 303 "ldscript.y"
     {
                      (yyval.expr) = new_expr (exp_align);
@@ -1922,15 +1876,13 @@ yyreduce:
     break;
 
   case 35:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 308 "ldscript.y"
     { (yyval.expr) = (yyvsp[(2) - (3)].expr); }
     break;
 
   case 36:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 310 "ldscript.y"
     {
                      (yyval.expr) = new_expr (exp_mult);
@@ -1940,8 +1892,7 @@ yyreduce:
     break;
 
   case 37:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 316 "ldscript.y"
     {
                      (yyval.expr) = new_expr ((yyvsp[(2) - (3)].op));
@@ -1951,8 +1902,7 @@ yyreduce:
     break;
 
   case 38:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 322 "ldscript.y"
     {
                      (yyval.expr) = new_expr ((yyvsp[(2) - (3)].op));
@@ -1962,8 +1912,7 @@ yyreduce:
     break;
 
   case 39:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 328 "ldscript.y"
     {
                      (yyval.expr) = new_expr (exp_and);
@@ -1973,8 +1922,7 @@ yyreduce:
     break;
 
   case 40:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 334 "ldscript.y"
     {
                      (yyval.expr) = new_expr (exp_or);
@@ -1984,8 +1932,7 @@ yyreduce:
     break;
 
   case 41:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 340 "ldscript.y"
     {
                      (yyval.expr) = new_expr (exp_num);
@@ -1994,8 +1941,7 @@ yyreduce:
     break;
 
   case 42:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 345 "ldscript.y"
     {
                      (yyval.expr) = new_expr (exp_id);
@@ -2004,22 +1950,19 @@ yyreduce:
     break;
 
   case 43:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 350 "ldscript.y"
     { (yyval.expr) = new_expr (exp_sizeof_headers); }
     break;
 
   case 44:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 352 "ldscript.y"
     { (yyval.expr) = new_expr (exp_pagesize); }
     break;
 
   case 45:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 356 "ldscript.y"
     {
                      (yyvsp[(3) - (3)].filename_list)->next = (yyvsp[(1) - (3)].filename_list)->next;
@@ -2028,15 +1971,13 @@ yyreduce:
     break;
 
   case 46:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 361 "ldscript.y"
     { (yyval.filename_list) = (yyvsp[(1) - (1)].filename_list); }
     break;
 
   case 49:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 369 "ldscript.y"
     {
                      /* First little optimization.  If there is only one
@@ -2051,22 +1992,19 @@ yyreduce:
     break;
 
   case 50:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 380 "ldscript.y"
     { (yyval.filename_list) = mark_as_needed ((yyvsp[(3) - (4)].filename_list)); }
     break;
 
   case 51:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 382 "ldscript.y"
     { (yyval.filename_list) = new_filename_listelem ((yyvsp[(1) - (1)].str)); }
     break;
 
   case 52:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 387 "ldscript.y"
     {
                      (yyvsp[(2) - (2)].version)->next = (yyvsp[(1) - (2)].version)->next;
@@ -2075,15 +2013,13 @@ yyreduce:
     break;
 
   case 53:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 392 "ldscript.y"
     { (yyval.version) = (yyvsp[(1) - (1)].version); }
     break;
 
   case 54:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 396 "ldscript.y"
     {
                      (yyvsp[(2) - (4)].version)->versionname = "";
@@ -2093,8 +2029,7 @@ yyreduce:
     break;
 
   case 55:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 402 "ldscript.y"
     {
                      (yyvsp[(3) - (5)].version)->versionname = (yyvsp[(1) - (5)].str);
@@ -2104,8 +2039,7 @@ yyreduce:
     break;
 
   case 56:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 408 "ldscript.y"
     {
                      (yyvsp[(3) - (6)].version)->versionname = (yyvsp[(1) - (6)].str);
@@ -2115,36 +2049,31 @@ yyreduce:
     break;
 
   case 57:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 417 "ldscript.y"
     { (yyval.version) = merge_versions ((yyvsp[(1) - (2)].version), (yyvsp[(2) - (2)].version)); }
     break;
 
   case 58:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 419 "ldscript.y"
     { (yyval.version) = (yyvsp[(1) - (1)].version); }
     break;
 
   case 59:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 423 "ldscript.y"
     { (yyval.version) = new_version (NULL, (yyvsp[(2) - (2)].id_list)); }
     break;
 
   case 60:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 425 "ldscript.y"
     { (yyval.version) = new_version ((yyvsp[(2) - (2)].id_list), NULL); }
     break;
 
   case 61:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 430 "ldscript.y"
     {
                      struct id_list *newp = new_id_listelem ((yyvsp[(2) - (3)].str));
@@ -2154,44 +2083,38 @@ yyreduce:
     break;
 
   case 62:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 436 "ldscript.y"
     { (yyval.id_list) = new_id_listelem ((yyvsp[(1) - (2)].str)); }
     break;
 
   case 63:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 440 "ldscript.y"
     { (yyval.str) = (yyvsp[(1) - (1)].str); }
     break;
 
   case 64:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 442 "ldscript.y"
     { (yyval.str) = (yyvsp[(1) - (1)].str); }
     break;
 
   case 65:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 446 "ldscript.y"
     { (yyval.str) = (yyvsp[(1) - (1)].str); }
     break;
 
   case 66:
-
-/* Line 1806 of yacc.c  */
+/* Line 1792 of yacc.c  */
 #line 448 "ldscript.y"
     { (yyval.str) = NULL; }
     break;
 
 
-
-/* Line 1806 of yacc.c  */
-#line 2195 "ldscript.c"
+/* Line 1792 of yacc.c  */
+#line 2118 "ldscript.c"
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -2354,7 +2277,9 @@ yyerrlab1:
       YY_STACK_PRINT (yyss, yyssp);
     }
 
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   *++yyvsp = yylval;
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
 
 
   /* Shift the error token.  */
@@ -2378,7 +2303,7 @@ yyabortlab:
   yyresult = 1;
   goto yyreturn;
 
-#if !defined(yyoverflow) || YYERROR_VERBOSE
+#if !defined yyoverflow || YYERROR_VERBOSE
 /*-------------------------------------------------.
 | yyexhaustedlab -- memory exhaustion comes here.  |
 `-------------------------------------------------*/
@@ -2420,8 +2345,7 @@ yyreturn:
 }
 
 
-
-/* Line 2067 of yacc.c  */
+/* Line 2055 of yacc.c  */
 #line 451 "ldscript.y"
 
 
@@ -2776,4 +2700,3 @@ add_versions (struct version *versions)
     }
   while (versions != NULL);
 }
-
index 5ce0bf6..f96b1bd 100644 (file)
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 2.5.  */
+/* A Bison parser, made by GNU Bison 2.7.  */
 
 /* Bison interface for Yacc-like parsers in C
    
-      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+      Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc.
    
    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
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
+#ifndef YY_LD_LDSCRIPT_H_INCLUDED
+# define YY_LD_LDSCRIPT_H_INCLUDED
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int lddebug;
+#endif
 
 /* Tokens.  */
 #ifndef YYTOKENTYPE
 
 
 
-
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
 {
-
-/* Line 2068 of yacc.c  */
+/* Line 2058 of yacc.c  */
 #line 63 "ldscript.y"
 
   uintmax_t num;
@@ -119,9 +126,8 @@ typedef union YYSTYPE
   struct id_list *id_list;
 
 
-
-/* Line 2068 of yacc.c  */
-#line 125 "ldscript.h"
+/* Line 2058 of yacc.c  */
+#line 131 "ldscript.h"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
@@ -130,4 +136,18 @@ typedef union YYSTYPE
 
 extern YYSTYPE ldlval;
 
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int ldparse (void *YYPARSE_PARAM);
+#else
+int ldparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int ldparse (void);
+#else
+int ldparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
 
+#endif /* !YY_LD_LDSCRIPT_H_INCLUDED  */
index f50da0b..4f2e0e7 100644 (file)
--- a/src/nm.c
+++ b/src/nm.c
@@ -1,5 +1,5 @@
 /* Print symbol information from ELF file in human-readable form.
-   Copyright (C) 2000-2008, 2009, 2011, 2012 Red Hat, Inc.
+   Copyright (C) 2000-2008, 2009, 2011, 2012, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -763,14 +763,16 @@ show_symbols_sysv (Ebl *ebl, GElf_Word strndx, const char *fullname,
     {
       GElf_Shdr shdr_mem;
 
-      assert (elf_ndxscn (scn) == cnt++);
+      assert (elf_ndxscn (scn) == cnt);
+      cnt++;
 
       char *name = elf_strptr (ebl->elf, shstrndx,
                               gelf_getshdr (scn, &shdr_mem)->sh_name);
       if (unlikely (name == NULL))
        {
-         name = alloca (sizeof "[invalid sh_name 0x12345678]");
-         snprintf (name, sizeof name, "[invalid sh_name %#" PRIx32 "]",
+         const size_t bufsz = sizeof "[invalid sh_name 0x12345678]";
+         name = alloca (bufsz);
+         snprintf (name, bufsz, "[invalid sh_name %#" PRIx32 "]",
                    gelf_getshdr (scn, &shdr_mem)->sh_name);
        }
       scnnames[elf_ndxscn (scn)] = name;
@@ -792,15 +794,6 @@ show_symbols_sysv (Ebl *ebl, GElf_Word strndx, const char *fullname,
          /* TRANS: the "sysv|" parts makes the string unique.  */
          longest_where, sgettext ("sysv|Line"));
 
-  /* Which format string to use (different radix for numbers).  */
-  const char *number_fmtstr;
-  if (radix == radix_hex)
-    number_fmtstr = "%0*" PRIx64;
-  else if (radix == radix_decimal)
-    number_fmtstr = "%0*" PRId64;
-  else
-    number_fmtstr = "%0*" PRIo64;
-
 #ifdef USE_DEMANGLE
   size_t demangle_buffer_len = 0;
   char *demangle_buffer = NULL;
@@ -818,8 +811,8 @@ show_symbols_sysv (Ebl *ebl, GElf_Word strndx, const char *fullname,
                                     symstrbuf, sizeof symstrbuf);
 
 #ifdef USE_DEMANGLE
-      /* Demangle if necessary.  */
-      if (demangle)
+      /* Demangle if necessary.  Require GNU v3 ABI by the "_Z" prefix.  */
+      if (demangle && symstr[0] == '_' && symstr[1] == 'Z')
        {
          int status = -1;
          char *dmsymstr = __cxa_demangle (symstr, demangle_buffer,
@@ -848,9 +841,15 @@ show_symbols_sysv (Ebl *ebl, GElf_Word strndx, const char *fullname,
        addressbuf[0] = sizebuf[0] = '\0';
       else
        {
-         snprintf (addressbuf, sizeof (addressbuf), number_fmtstr,
+         snprintf (addressbuf, sizeof (addressbuf),
+                   (radix == radix_hex ? "%0*" PRIx64
+                    : (radix == radix_decimal ? "%0*" PRId64
+                       : "%0*" PRIo64)),
                    digits, syms[cnt].sym.st_value);
-         snprintf (sizebuf, sizeof (sizebuf), number_fmtstr,
+         snprintf (sizebuf, sizeof (sizebuf),
+                   (radix == radix_hex ? "%0*" PRIx64
+                    : (radix == radix_decimal ? "%0*" PRId64
+                       : "%0*" PRIo64)),
                    digits, syms[cnt].sym.st_size);
        }
 
@@ -927,19 +926,6 @@ show_symbols_bsd (Elf *elf, const GElf_Ehdr *ehdr, GElf_Word strndx,
   if (prefix != NULL && ! print_file_name)
     printf ("\n%s:\n", fname);
 
-  static const char *const fmtstrs[] =
-    {
-      [radix_hex] = "%6$s%2$0*1$" PRIx64 "%8$s %7$s%3$c%4$s %5$s",
-      [radix_decimal] = "%6$s%*" PRId64 "%8$s %7$s%3$c%4$s %5$s",
-      [radix_octal] = "%6$s%2$0*1$" PRIo64 "%8$s %7$s%3$c%4$s %5$s"
-    };
-  static const char *const sfmtstrs[] =
-    {
-      [radix_hex] = "%6$s%2$0*1$" PRIx64 "%8$s %10$0*9$" PRIx64 " %7$s%3$c%4$s %5$s",
-      [radix_decimal] = "%6$s%2$*1$" PRId64 "%8$s %10$*9$" PRId64 " %7$s%3$c%4$s %5$s",
-      [radix_octal] = "%6$s%2$0*1$" PRIo64 "%8$s %10$0*9$" PRIo64 " %7$s%3$c%4$s %5$s"
-    };
-
 #ifdef USE_DEMANGLE
   size_t demangle_buffer_len = 0;
   char *demangle_buffer = NULL;
@@ -963,8 +949,8 @@ show_symbols_bsd (Elf *elf, const GElf_Ehdr *ehdr, GElf_Word strndx,
        continue;
 
 #ifdef USE_DEMANGLE
-      /* Demangle if necessary.  */
-      if (demangle)
+      /* Demangle if necessary.  Require GNU v3 ABI by the "_Z" prefix.  */
+      if (demangle && symstr[0] == '_' && symstr[1] == 'Z')
        {
          int status = -1;
          char *dmsymstr = __cxa_demangle (symstr, demangle_buffer,
@@ -1014,16 +1000,41 @@ show_symbols_bsd (Elf *elf, const GElf_Ehdr *ehdr, GElf_Word strndx,
              else
                color = color_symbol;
            }
-
-         printf (print_size && syms[cnt].sym.st_size != 0
-                 ? sfmtstrs[radix] : fmtstrs[radix],
-                 digits, syms[cnt].sym.st_value,
-                 class_type_char (elf, ehdr, &syms[cnt].sym), marker,
-                 symstr,
-                 color_mode ? color_address : "",
-                 color,
-                 color_mode ? color_off : "",
-                 digits, (uint64_t) syms[cnt].sym.st_size);
+         if (print_size && syms[cnt].sym.st_size != 0)
+           {
+#define HEXFMT "%6$s%2$0*1$" PRIx64 "%8$s %10$0*9$" PRIx64 " %7$s%3$c%4$s %5$s"
+#define DECFMT "%6$s%2$*1$" PRId64 "%8$s %10$*9$" PRId64 " %7$s%3$c%4$s %5$s"
+#define OCTFMT "%6$s%2$0*1$" PRIo64 "%8$s %10$0*9$" PRIo64 " %7$s%3$c%4$s %5$s"
+             printf ((radix == radix_hex ? HEXFMT
+                      : (radix == radix_decimal ? DECFMT : OCTFMT)),
+                     digits, syms[cnt].sym.st_value,
+                     class_type_char (elf, ehdr, &syms[cnt].sym), marker,
+                     symstr,
+                     color_mode ? color_address : "",
+                     color,
+                     color_mode ? color_off : "",
+                     digits, (uint64_t) syms[cnt].sym.st_size);
+#undef HEXFMT
+#undef DECFMT
+#undef OCTFMT
+           }
+         else
+           {
+#define HEXFMT "%6$s%2$0*1$" PRIx64 "%8$s %7$s%3$c%4$s %5$s"
+#define DECFMT "%6$s%2$*1$" PRId64 "%8$s %7$s%3$c%4$s %5$s"
+#define OCTFMT "%6$s%2$0*1$" PRIo64 "%8$s %7$s%3$c%4$s %5$s"
+             printf ((radix == radix_hex ? HEXFMT
+                      : (radix == radix_decimal ? DECFMT : OCTFMT)),
+                     digits, syms[cnt].sym.st_value,
+                     class_type_char (elf, ehdr, &syms[cnt].sym), marker,
+                     symstr,
+                     color_mode ? color_address : "",
+                     color,
+                     color_mode ? color_off : "");
+#undef HEXFMT
+#undef DECFMT
+#undef OCTFMT
+           }
        }
 
       if (color_mode)
@@ -1045,14 +1056,6 @@ show_symbols_posix (Elf *elf, const GElf_Ehdr *ehdr, GElf_Word strndx,
   if (prefix != NULL && ! print_file_name)
     printf ("%s:\n", fullname);
 
-  const char *fmtstr;
-  if (radix == radix_hex)
-    fmtstr = "%s %c%s %0*" PRIx64 " %0*" PRIx64 "\n";
-  else if (radix == radix_decimal)
-    fmtstr = "%s %c%s %*" PRId64 " %*" PRId64 "\n";
-  else
-    fmtstr = "%s %c%s %0*" PRIo64 " %0*" PRIo64 "\n";
-
   int digits = length_map[gelf_getclass (elf) - 1][radix];
 
 #ifdef USE_DEMANGLE
@@ -1074,8 +1077,8 @@ show_symbols_posix (Elf *elf, const GElf_Ehdr *ehdr, GElf_Word strndx,
        continue;
 
 #ifdef USE_DEMANGLE
-      /* Demangle if necessary.  */
-      if (demangle)
+      /* Demangle if necessary.  Require GNU v3 ABI by the "_Z" prefix.  */
+      if (demangle && symstr[0] == '_' && symstr[1] == 'Z')
        {
          int status = -1;
          char *dmsymstr = __cxa_demangle (symstr, demangle_buffer,
@@ -1094,7 +1097,11 @@ show_symbols_posix (Elf *elf, const GElf_Ehdr *ehdr, GElf_Word strndx,
          putchar_unlocked (' ');
        }
 
-      printf (fmtstr,
+      printf ((radix == radix_hex
+              ? "%s %c%s %0*" PRIx64 " %0*" PRIx64 "\n"
+              : (radix == radix_decimal
+                 ? "%s %c%s %*" PRId64 " %*" PRId64 "\n"
+                 : "%s %c%s %0*" PRIo64 " %0*" PRIo64 "\n")),
              symstr,
              class_type_char (elf, ehdr, &syms[cnt].sym),
              mark_special
@@ -1242,8 +1249,8 @@ show_symbols (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, Elf_Scn *xndxscn,
            continue;
 
 #ifdef USE_DEMANGLE
-         /* Demangle if necessary.  */
-         if (demangle)
+         /* Demangle if necessary.  Require GNU v3 ABI by the "_Z" prefix.  */
+         if (demangle && symstr[0] == '_' && symstr[1] == 'Z')
            {
              int status = -1;
              char *dmsymstr = __cxa_demangle (symstr, demangle_buffer,
index 2954e74..6bbe436 100644 (file)
@@ -1,5 +1,5 @@
 /* Print information from ELF file in human-readable form.
-   Copyright (C) 1999-2012 Red Hat, Inc.
+   Copyright (C) 1999-2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 1999.
 
@@ -42,6 +42,7 @@
 #include <unistd.h>
 #include <sys/param.h>
 #include <sys/stat.h>
+#include <signal.h>
 
 #include <system.h>
 #include "../libelf/libelfP.h"
@@ -61,9 +62,16 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
 /* Bug report address.  */
 ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
 
+/* argp key value for --elf-section, non-ascii.  */
+#define ELF_INPUT_SECTION 256
+
 /* Definitions of arguments for argp functions.  */
 static const struct argp_option options[] =
 {
+  { NULL, 0, NULL, 0, N_("ELF input selection:"), 0 },
+  { "elf-section", ELF_INPUT_SECTION, "SECTION", OPTION_ARG_OPTIONAL,
+    N_("Use the named SECTION (default .gnu_debugdata) as (compressed) ELF "
+       "input data"), 0 },
   { NULL, 0, NULL, 0, N_("ELF output selection:"), 0 },
   { "all", 'a', NULL, 0,
     N_("All these plus -p .strtab -p .dynstr -p .comment"), 0 },
@@ -87,8 +95,8 @@ static const struct argp_option options[] =
   { NULL, 0, NULL, 0, N_("Additional output selection:"), 0 },
   { "debug-dump", 'w', "SECTION", OPTION_ARG_OPTIONAL,
     N_("Display DWARF section content.  SECTION can be one of abbrev, "
-       "aranges, frame, gdb_index, info, loc, line, ranges, pubnames, str, "
-       "macinfo, macro or exception"), 0 },
+       "aranges, decodedaranges, frame, gdb_index, info, loc, line, "
+       "decodedline, ranges, pubnames, str, macinfo, macro or exception"), 0 },
   { "hex-dump", 'x', "SECTION", 0,
     N_("Dump the uninterpreted contents of SECTION, by number or name"), 0 },
   { "strings", 'p', "SECTION", OPTION_ARG_OPTIONAL,
@@ -100,6 +108,8 @@ static const struct argp_option options[] =
   { NULL, 0, NULL, 0, N_("Output control:"), 0 },
   { "numeric-addresses", 'N', NULL, 0,
     N_("Do not find symbol names for addresses in DWARF data"), 0 },
+  { "unresolved-address-offsets", 'U', NULL, 0,
+    N_("Display just offsets instead of resolving values to addresses in DWARF data"), 0 },
   { "wide", 'W', NULL, 0,
     N_("Ignored for compatibility (lines always wide)"), 0 },
   { NULL, 0, NULL, 0, NULL, 0 }
@@ -121,6 +131,8 @@ static struct argp argp =
   options, parse_opt, args_doc, doc, NULL, NULL, NULL
 };
 
+/* If non-null, the section from which we should read to (compressed) ELF.  */
+static const char *elf_input_section = NULL;
 
 /* Flags set by the option controlling the output.  */
 
@@ -169,6 +181,15 @@ static bool any_control_option;
 /* True if we should print addresses from DWARF in symbolic form.  */
 static bool print_address_names = true;
 
+/* True if we should print raw values instead of relativized addresses.  */
+static bool print_unresolved_addresses = false;
+
+/* True if we should print the .debug_aranges section using libdw.  */
+static bool decodedaranges = false;
+
+/* True if we should print the .debug_aranges section using libdw.  */
+static bool decodedline = false;
+
 /* Select printing of debugging sections.  */
 static enum section_e
 {
@@ -377,6 +398,11 @@ parse_opt (int key, char *arg,
        print_debug_sections |= section_abbrev;
       else if (strcmp (arg, "aranges") == 0)
        print_debug_sections |= section_aranges;
+      else if (strcmp (arg, "decodedaranges") == 0)
+       {
+         print_debug_sections |= section_aranges;
+         decodedaranges = true;
+       }
       else if (strcmp (arg, "ranges") == 0)
        {
          print_debug_sections |= section_ranges;
@@ -393,6 +419,11 @@ parse_opt (int key, char *arg,
        }
       else if (strcmp (arg, "line") == 0)
        print_debug_sections |= section_line;
+      else if (strcmp (arg, "decodedline") == 0)
+       {
+         print_debug_sections |= section_line;
+         decodedline = true;
+       }
       else if (strcmp (arg, "pubnames") == 0)
        print_debug_sections |= section_pubnames;
       else if (strcmp (arg, "str") == 0)
@@ -430,6 +461,9 @@ parse_opt (int key, char *arg,
     case 'N':
       print_address_names = false;
       break;
+    case 'U':
+      print_unresolved_addresses = true;
+      break;
     case ARGP_KEY_NO_ARGS:
       fputs (gettext ("Missing file name.\n"), stderr);
       goto do_argp_help;
@@ -445,6 +479,12 @@ parse_opt (int key, char *arg,
       break;
     case 'W':                  /* Ignored.  */
       break;
+    case ELF_INPUT_SECTION:
+      if (arg == NULL)
+       elf_input_section = ".gnu_debugdata";
+      else
+       elf_input_section = arg;
+      break;
     default:
       return ARGP_ERR_UNKNOWN;
     }
@@ -466,6 +506,121 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
 }
 
 
+/* Create a file descriptor to read the data from the
+   elf_input_section given a file descriptor to an ELF file.  */
+static int
+open_input_section (int fd)
+{
+  size_t shnums;
+  size_t cnt;
+  size_t shstrndx;
+  Elf *elf = elf_begin (fd, ELF_C_READ_MMAP, NULL);
+  if (elf == NULL)
+    {
+      error (0, 0, gettext ("cannot generate Elf descriptor: %s"),
+            elf_errmsg (-1));
+      return -1;
+    }
+
+  if (elf_getshdrnum (elf, &shnums) < 0)
+    {
+      error (0, 0, gettext ("cannot determine number of sections: %s"),
+            elf_errmsg (-1));
+    open_error:
+      elf_end (elf);
+      return -1;
+    }
+
+  if (elf_getshdrstrndx (elf, &shstrndx) < 0)
+    {
+      error (0, 0, gettext ("cannot get section header string table index"));
+      goto open_error;
+    }
+
+  for (cnt = 0; cnt < shnums; ++cnt)
+    {
+      Elf_Scn *scn = elf_getscn (elf, cnt);
+      if (scn == NULL)
+       {
+         error (0, 0, gettext ("cannot get section: %s"),
+                elf_errmsg (-1));
+         goto open_error;
+       }
+
+      GElf_Shdr shdr_mem;
+      GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+      if (unlikely (shdr == NULL))
+       {
+         error (0, 0, gettext ("cannot get section header: %s"),
+                elf_errmsg (-1));
+         goto open_error;
+       }
+
+      const char *sname = elf_strptr (elf, shstrndx, shdr->sh_name);
+      if (sname == NULL)
+       {
+         error (0, 0, gettext ("cannot get section name"));
+         goto open_error;
+       }
+
+      if (strcmp (sname, elf_input_section) == 0)
+       {
+         Elf_Data *data = elf_rawdata (scn, NULL);
+         if (data == NULL)
+           {
+             error (0, 0, gettext ("cannot get %s content: %s"),
+                    sname, elf_errmsg (-1));
+             goto open_error;
+           }
+
+         /* Create (and immediately unlink) a temporary file to store
+            section data in to create a file descriptor for it.  */
+         const char *tmpdir = getenv ("TMPDIR") ?: P_tmpdir;
+         static const char suffix[] = "/readelfXXXXXX";
+         int tmplen = strlen (tmpdir) + sizeof (suffix);
+         char *tempname = alloca (tmplen);
+         sprintf (tempname, "%s%s", tmpdir, suffix);
+
+         int sfd = mkstemp (tempname);
+         if (sfd == -1)
+           {
+             error (0, 0, gettext ("cannot create temp file '%s'"),
+                    tempname);
+             goto open_error;
+           }
+         unlink (tempname);
+
+         ssize_t size = data->d_size;
+         if (write_retry (sfd, data->d_buf, size) != size)
+           {
+             error (0, 0, gettext ("cannot write section data"));
+             goto open_error;
+           }
+
+         if (elf_end (elf) != 0)
+           {
+             error (0, 0, gettext ("error while closing Elf descriptor: %s"),
+                    elf_errmsg (-1));
+             return -1;
+           }
+
+         if (lseek (sfd, 0, SEEK_SET) == -1)
+           {
+             error (0, 0, gettext ("error while rewinding file descriptor"));
+             return -1;
+           }
+
+         return sfd;
+       }
+    }
+
+  /* Named section not found.  */
+  if (elf_end (elf) != 0)
+    error (0, 0, gettext ("error while closing Elf descriptor: %s"),
+          elf_errmsg (-1));
+  return -1;
+}
+
 /* Check if the file is an archive, and if so dump its index.  */
 static void
 check_archive_index (int fd, const char *fname, bool only_one)
@@ -538,18 +693,32 @@ process_dwflmod (Dwfl_Module *dwflmod,
   return DWARF_CB_OK;
 }
 
-/* Stub libdwfl callback, only the ELF handle already open is ever used.  */
+/* Stub libdwfl callback, only the ELF handle already open is ever used.
+   Only used for finding the alternate debug file if the Dwarf comes from
+   the main file.  We are not interested in separate debuginfo.  */
 static int
-find_no_debuginfo (Dwfl_Module *mod __attribute__ ((unused)),
-                  void **userdata __attribute__ ((unused)),
-                  const char *modname __attribute__ ((unused)),
-                  Dwarf_Addr base __attribute__ ((unused)),
-                  const char *file_name __attribute__ ((unused)),
-                  const char *debuglink_file __attribute__ ((unused)),
-                  GElf_Word debuglink_crc __attribute__ ((unused)),
-                  char **debuginfo_file_name __attribute__ ((unused)))
+find_no_debuginfo (Dwfl_Module *mod,
+                  void **userdata,
+                  const char *modname,
+                  Dwarf_Addr base,
+                  const char *file_name,
+                  const char *debuglink_file,
+                  GElf_Word debuglink_crc,
+                  char **debuginfo_file_name)
 {
-  return -1;
+  Dwarf_Addr dwbias;
+  dwfl_module_info (mod, NULL, NULL, NULL, &dwbias, NULL, NULL, NULL);
+
+  /* We are only interested if the Dwarf has been setup on the main
+     elf file but is only missing the alternate debug link.  If dwbias
+     hasn't even been setup, this is searching for separate debuginfo
+     for the main elf.  We don't care in that case.  */
+  if (dwbias == (Dwarf_Addr) -1)
+    return -1;
+
+  return dwfl_standard_find_debuginfo (mod, userdata, modname, base,
+                                      file_name, debuglink_file,
+                                      debuglink_crc, debuginfo_file_name);
 }
 
 /* Process one input file.  */
@@ -562,6 +731,21 @@ process_file (int fd, const char *fname, bool only_one)
   if (!any_control_option)
     return;
 
+  if (elf_input_section != NULL)
+    {
+      /* Replace fname and fd with section content. */
+      char *fnname = alloca (strlen (fname) + strlen (elf_input_section) + 2);
+      sprintf (fnname, "%s:%s", fname, elf_input_section);
+      fd = open_input_section (fd);
+      if (fd == -1)
+        {
+          error (0, 0, gettext ("No such section '%s' in '%s'"),
+                elf_input_section, fname);
+          return;
+        }
+      fname = fnname;
+    }
+
   /* Duplicate an fd for dwfl_report_offline to swallow.  */
   int dwfl_fd = dup (fd);
   if (unlikely (dwfl_fd < 0))
@@ -606,6 +790,11 @@ process_file (int fd, const char *fname, bool only_one)
       dwfl_getmodules (dwfl, &process_dwflmod, &a, 0);
     }
   dwfl_end (dwfl);
+
+  /* Need to close the replaced fd if we created it.  Caller takes
+     care of original.  */
+  if (elf_input_section != NULL)
+    close (fd);
 }
 
 
@@ -1012,11 +1201,28 @@ print_phdr (Ebl *ebl, GElf_Ehdr *ehdr)
 
       if (phdr->p_type == PT_INTERP)
        {
-         /* We can show the user the name of the interpreter.  */
+         /* If we are sure the file offset is valid then we can show
+            the user the name of the interpreter.  We check whether
+            there is a section at the file offset.  Normally there
+            would be a section called ".interp".  But in separate
+            .debug files it is a NOBITS section (and so doesn't match
+            with gelf_offscn).  Which probably means the offset is
+            not valid another reason could be because the ELF file
+            just doesn't contain any section headers, in that case
+            just play it safe and don't display anything.  */
+
+         Elf_Scn *scn = gelf_offscn (ebl->elf, phdr->p_offset);
+         GElf_Shdr shdr_mem;
+         GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+
          size_t maxsize;
          char *filedata = elf_rawfile (ebl->elf, &maxsize);
 
-         if (filedata != NULL && phdr->p_offset < maxsize)
+         if (shdr != NULL && shdr->sh_type == SHT_PROGBITS
+             && filedata != NULL && phdr->p_offset < maxsize
+             && phdr->p_filesz <= maxsize - phdr->p_offset
+             && memchr (filedata + phdr->p_offset, '\0',
+                        phdr->p_filesz) != NULL)
            printf (gettext ("\t[Requesting program interpreter: %s]\n"),
                    filedata + phdr->p_offset);
        }
@@ -1189,6 +1395,8 @@ handle_scngrp (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
   Elf32_Word *grpref = (Elf32_Word *) data->d_buf;
 
   GElf_Sym sym_mem;
+  GElf_Sym *sym = gelf_getsym (symdata, shdr->sh_info, &sym_mem);
+
   printf ((grpref[0] & GRP_COMDAT)
          ? ngettext ("\
 \nCOMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n",
@@ -1201,8 +1409,8 @@ handle_scngrp (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
                      data->d_size / sizeof (Elf32_Word) - 1),
          elf_ndxscn (scn),
          elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
-         elf_strptr (ebl->elf, symshdr->sh_link,
-                     gelf_getsym (symdata, shdr->sh_info, &sym_mem)->st_name)
+         (sym == NULL ? NULL
+          : elf_strptr (ebl->elf, symshdr->sh_link, sym->st_name))
          ?: gettext ("<INVALID SYMBOL>"),
          data->d_size / sizeof (Elf32_Word) - 1);
 
@@ -1353,10 +1561,12 @@ static void
 handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
 {
   int class = gelf_getclass (ebl->elf);
-  GElf_Shdr glink;
+  GElf_Shdr glink_mem;
+  GElf_Shdr *glink;
   Elf_Data *data;
   size_t cnt;
   size_t shstrndx;
+  size_t sh_entsize;
 
   /* Get the data of the section.  */
   data = elf_getdata (scn, NULL);
@@ -1368,21 +1578,26 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
     error (EXIT_FAILURE, 0,
           gettext ("cannot get section header string table index"));
 
+  sh_entsize = gelf_fsize (ebl->elf, ELF_T_DYN, 1, EV_CURRENT);
+
+  glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), &glink_mem);
+  if (glink == NULL)
+    error (EXIT_FAILURE, 0, gettext ("invalid sh_link value in section %Zu"),
+          elf_ndxscn (scn));
+
   printf (ngettext ("\
 \nDynamic segment contains %lu entry:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'\n",
                    "\
 \nDynamic segment contains %lu entries:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'\n",
-                   shdr->sh_size / shdr->sh_entsize),
-         (unsigned long int) (shdr->sh_size / shdr->sh_entsize),
+                   shdr->sh_size / sh_entsize),
+         (unsigned long int) (shdr->sh_size / sh_entsize),
          class == ELFCLASS32 ? 10 : 18, shdr->sh_addr,
          shdr->sh_offset,
          (int) shdr->sh_link,
-         elf_strptr (ebl->elf, shstrndx,
-                     gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
-                                   &glink)->sh_name));
+         elf_strptr (ebl->elf, shstrndx, glink->sh_name));
   fputs_unlocked (gettext ("  Type              Value\n"), stdout);
 
-  for (cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
+  for (cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt)
     {
       GElf_Dyn dynmem;
       GElf_Dyn *dyn = gelf_getdyn (data, cnt, &dynmem);
@@ -1531,7 +1746,8 @@ static void
 handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr)
 {
   int class = gelf_getclass (ebl->elf);
-  int nentries = shdr->sh_size / shdr->sh_entsize;
+  size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_REL, 1, EV_CURRENT);
+  int nentries = shdr->sh_size / sh_entsize;
 
   /* Get the data of the section.  */
   Elf_Data *data = elf_getdata (scn, NULL);
@@ -1717,7 +1933,8 @@ static void
 handle_relocs_rela (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr)
 {
   int class = gelf_getclass (ebl->elf);
-  int nentries = shdr->sh_size / shdr->sh_entsize;
+  size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_RELA, 1, EV_CURRENT);
+  int nentries = shdr->sh_size / sh_entsize;
 
   /* Get the data of the section.  */
   Elf_Data *data = elf_getdata (scn, NULL);
@@ -1754,7 +1971,8 @@ handle_relocs_rela (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr)
     error (EXIT_FAILURE, 0,
           gettext ("cannot get section header string table index"));
 
-  printf (ngettext ("\
+  if (shdr->sh_info != 0)
+    printf (ngettext ("\
 \nRelocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0" PRIx64 " contains %d entry:\n",
                    "\
 \nRelocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0" PRIx64 " contains %d entries:\n",
@@ -1765,6 +1983,19 @@ handle_relocs_rela (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr)
          elf_strptr (ebl->elf, shstrndx, destshdr->sh_name),
          shdr->sh_offset,
          nentries);
+  else
+    /* 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.  */
+    printf (ngettext ("\
+\nRelocation section [%2u] '%s' at offset %#0" PRIx64 " contains %d entry:\n",
+                   "\
+\nRelocation section [%2u] '%s' at offset %#0" PRIx64 " contains %d entries:\n",
+                     nentries),
+           (unsigned int) elf_ndxscn (scn),
+           elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
+           shdr->sh_offset,
+           nentries);
   fputs_unlocked (class == ELFCLASS32
                  ? gettext ("\
   Offset      Type            Value       Addend Name\n")
@@ -1964,6 +2195,13 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
     error (EXIT_FAILURE, 0,
           gettext ("cannot get section header string table index"));
 
+  GElf_Shdr glink_mem;
+  GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
+                                  &glink_mem);
+  if (glink == NULL)
+    error (EXIT_FAILURE, 0, gettext ("invalid sh_link value in section %Zu"),
+          elf_ndxscn (scn));
+
   /* Now we can compute the number of entries in the section.  */
   unsigned int nsyms = data->d_size / (class == ELFCLASS32
                                       ? sizeof (Elf32_Sym)
@@ -1974,15 +2212,12 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
                    nsyms),
          (unsigned int) elf_ndxscn (scn),
          elf_strptr (ebl->elf, shstrndx, shdr->sh_name), nsyms);
-  GElf_Shdr glink;
   printf (ngettext (" %lu local symbol  String table: [%2u] '%s'\n",
                    " %lu local symbols  String table: [%2u] '%s'\n",
                    shdr->sh_info),
          (unsigned long int) shdr->sh_info,
          (unsigned int) shdr->sh_link,
-         elf_strptr (ebl->elf, shstrndx,
-                     gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
-                                   &glink)->sh_name));
+         elf_strptr (ebl->elf, shstrndx, glink->sh_name));
 
   fputs_unlocked (class == ELFCLASS32
                  ? gettext ("\
@@ -2218,7 +2453,13 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
     error (EXIT_FAILURE, 0,
           gettext ("cannot get section header string table index"));
 
-  GElf_Shdr glink;
+  GElf_Shdr glink_mem;
+  GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
+                                  &glink_mem);
+  if (glink == NULL)
+    error (EXIT_FAILURE, 0, gettext ("invalid sh_link value in section %Zu"),
+          elf_ndxscn (scn));
+
   printf (ngettext ("\
 \nVersion needs section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'\n",
                    "\
@@ -2229,9 +2470,7 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
          class == ELFCLASS32 ? 10 : 18, shdr->sh_addr,
          shdr->sh_offset,
          (unsigned int) shdr->sh_link,
-         elf_strptr (ebl->elf, shstrndx,
-                     gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
-                                   &glink)->sh_name));
+         elf_strptr (ebl->elf, shstrndx, glink->sh_name));
 
   unsigned int offset = 0;
   for (int cnt = shdr->sh_info; --cnt >= 0; )
@@ -2284,8 +2523,14 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
     error (EXIT_FAILURE, 0,
           gettext ("cannot get section header string table index"));
 
+  GElf_Shdr glink_mem;
+  GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
+                                  &glink_mem);
+  if (glink == NULL)
+    error (EXIT_FAILURE, 0, gettext ("invalid sh_link value in section %Zu"),
+          elf_ndxscn (scn));
+
   int class = gelf_getclass (ebl->elf);
-  GElf_Shdr glink;
   printf (ngettext ("\
 \nVersion definition section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'\n",
                    "\
@@ -2297,9 +2542,7 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
          class == ELFCLASS32 ? 10 : 18, shdr->sh_addr,
          shdr->sh_offset,
          (unsigned int) shdr->sh_link,
-         elf_strptr (ebl->elf, shstrndx,
-                     gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
-                                   &glink)->sh_name));
+         elf_strptr (ebl->elf, shstrndx, glink->sh_name));
 
   unsigned int offset = 0;
   for (int cnt = shdr->sh_info; --cnt >= 0; )
@@ -2561,25 +2804,30 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
       filename = NULL;
     }
 
+  GElf_Shdr glink_mem;
+  GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
+                                  &glink_mem);
+  size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_HALF, 1, EV_CURRENT);
+  if (glink == NULL)
+    error (EXIT_FAILURE, 0, gettext ("invalid sh_link value in section %Zu"),
+          elf_ndxscn (scn));
+
   /* Print the header.  */
-  GElf_Shdr glink;
   printf (ngettext ("\
 \nVersion symbols section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'",
                    "\
 \nVersion symbols section [%2u] '%s' contains %d entries:\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'",
-                   shdr->sh_size / shdr->sh_entsize),
+                   shdr->sh_size / sh_entsize),
          (unsigned int) elf_ndxscn (scn),
          elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
-         (int) (shdr->sh_size / shdr->sh_entsize),
+         (int) (shdr->sh_size / sh_entsize),
          class == ELFCLASS32 ? 10 : 18, shdr->sh_addr,
          shdr->sh_offset,
          (unsigned int) shdr->sh_link,
-         elf_strptr (ebl->elf, shstrndx,
-                     gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
-                                   &glink)->sh_name));
+         elf_strptr (ebl->elf, shstrndx, glink->sh_name));
 
   /* Now we can finally look at the actual contents of this section.  */
-  for (unsigned int cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
+  for (unsigned int cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt)
     {
       if (cnt % 2 == 0)
        printf ("\n %4d:", cnt);
@@ -2628,7 +2876,17 @@ print_hash_info (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, size_t shstrndx,
   for (Elf32_Word cnt = 0; cnt < nbucket; ++cnt)
     ++counts[lengths[cnt]];
 
-  GElf_Shdr glink;
+  GElf_Shdr glink_mem;
+  GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf,
+                                              shdr->sh_link),
+                                  &glink_mem);
+  if (glink == NULL)
+    {
+      error (0, 0, gettext ("invalid sh_link value in section %Zu"),
+            elf_ndxscn (scn));
+      return;
+    }
+
   printf (ngettext ("\
 \nHistogram for bucket list length in section [%2u] '%s' (total of %d bucket):\n Addr: %#0*" PRIx64 "  Offset: %#08" PRIx64 "  Link to section: [%2u] '%s'\n",
                    "\
@@ -2641,9 +2899,7 @@ print_hash_info (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, size_t shstrndx,
          shdr->sh_addr,
          shdr->sh_offset,
          (unsigned int) shdr->sh_link,
-         elf_strptr (ebl->elf, shstrndx,
-                     gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
-                                   &glink)->sh_name));
+         elf_strptr (ebl->elf, shstrndx, glink->sh_name));
 
   if (extrastr != NULL)
     fputs (extrastr, stdout);
@@ -2903,7 +3159,8 @@ print_liblist (Ebl *ebl)
 
       if (shdr != NULL && shdr->sh_type == SHT_GNU_LIBLIST)
        {
-         int nentries = shdr->sh_size / shdr->sh_entsize;
+         size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_LIB, 1, EV_CURRENT);
+         int nentries = shdr->sh_size / sh_entsize;
          printf (ngettext ("\
 \nLibrary list section [%2zu] '%s' at offset %#0" PRIx64 " contains %d entry:\n",
                            "\
@@ -3111,43 +3368,52 @@ print_attributes (Ebl *ebl, const GElf_Ehdr *ehdr)
 
 static char *
 format_dwarf_addr (Dwfl_Module *dwflmod,
-                  int address_size, Dwarf_Addr address)
+                  int address_size, Dwarf_Addr address, Dwarf_Addr raw)
 {
   /* See if there is a name we can give for this address.  */
   GElf_Sym sym;
-  const char *name = print_address_names
-    ? dwfl_module_addrsym (dwflmod, address, &sym, NULL) : NULL;
-  if (name != NULL)
-    sym.st_value = address - sym.st_value;
+  GElf_Off off = 0;
+  const char *name = (print_address_names && ! print_unresolved_addresses)
+    ? dwfl_module_addrinfo (dwflmod, address, &off, &sym, NULL, NULL, NULL)
+    : NULL;
 
-  /* Relativize the address.  */
-  int n = dwfl_module_relocations (dwflmod);
-  int i = n < 1 ? -1 : dwfl_module_relocate_address (dwflmod, &address);
+  const char *scn;
+  if (print_unresolved_addresses)
+    {
+      address = raw;
+      scn = NULL;
+    }
+  else
+    {
+      /* Relativize the address.  */
+      int n = dwfl_module_relocations (dwflmod);
+      int i = n < 1 ? -1 : dwfl_module_relocate_address (dwflmod, &address);
 
-  /* In an ET_REL file there is a section name to refer to.  */
-  const char *scn = (i < 0 ? NULL
-                    : dwfl_module_relocation_info (dwflmod, i, NULL));
+      /* In an ET_REL file there is a section name to refer to.  */
+      scn = (i < 0 ? NULL
+            : dwfl_module_relocation_info (dwflmod, i, NULL));
+    }
 
   char *result;
   if ((name != NULL
-       ? (sym.st_value != 0
+       ? (off != 0
          ? (scn != NULL
             ? (address_size == 0
                ? asprintf (&result,
                            gettext ("%s+%#" PRIx64 " <%s+%#" PRIx64 ">"),
-                           scn, address, name, sym.st_value)
+                           scn, address, name, off)
                : asprintf (&result,
                            gettext ("%s+%#0*" PRIx64 " <%s+%#" PRIx64 ">"),
                            scn, 2 + address_size * 2, address,
-                           name, sym.st_value))
+                           name, off))
             : (address_size == 0
                ? asprintf (&result,
                            gettext ("%#" PRIx64 " <%s+%#" PRIx64 ">"),
-                           address, name, sym.st_value)
+                           address, name, off)
                : asprintf (&result,
                            gettext ("%#0*" PRIx64 " <%s+%#" PRIx64 ">"),
                            2 + address_size * 2, address,
-                           name, sym.st_value)))
+                           name, off)))
          : (scn != NULL
             ? (address_size == 0
                ? asprintf (&result,
@@ -3566,7 +3832,7 @@ print_block (size_t n, const void *block)
 static void
 print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
           unsigned int vers, unsigned int addrsize, unsigned int offset_size,
-          Dwarf_Word len, const unsigned char *data)
+          struct Dwarf_CU *cu, Dwarf_Word len, const unsigned char *data)
 {
   const unsigned int ref_size = vers < 3 ? addrsize : offset_size;
 
@@ -3611,7 +3877,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
          data += addrsize;
          CONSUME (addrsize);
 
-         char *a = format_dwarf_addr (dwflmod, 0, addr);
+         char *a = format_dwarf_addr (dwflmod, 0, addr, addr);
          printf ("%*s[%4" PRIuMAX "] %s %s\n",
                  indent, "", (uintmax_t) offset, op_name, a);
          free (a);
@@ -3802,7 +4068,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
          NEED (2);
          printf ("%*s[%4" PRIuMAX "] %s %" PRIuMAX "\n",
                  indent, "", (uintmax_t) offset, op_name,
-                 (uintmax_t) (offset + read_2sbyte_unaligned (dbg, data)));
+                 (uintmax_t) (offset + read_2sbyte_unaligned (dbg, data) + 3));
          CONSUME (2);
          data += 2;
          offset += 3;
@@ -3836,7 +4102,7 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
          /* Byte offset operand.  */
          get_sleb128 (sleb, data); /* XXX check overrun */
 
-         printf ("%*s[%4" PRIuMAX "] %s %#" PRIxMAX ", %+" PRId64 "\n",
+         printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "] %+" PRId64 "\n",
                  indent, "", (intmax_t) offset,
                  op_name, (uintmax_t) addr, sleb);
          CONSUME (data - start);
@@ -3852,17 +4118,20 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
                  indent, "", (uintmax_t) offset, op_name);
          NEED (uleb);
          print_ops (dwflmod, dbg, indent + 6, indent + 6, vers,
-                    addrsize, offset_size, uleb, data);
+                    addrsize, offset_size, cu, uleb, data);
          data += uleb;
          CONSUME (data - start);
          offset += 1 + (data - start);
          break;
 
        case DW_OP_GNU_const_type:
-         /* DIE offset, size plus block.  */
+         /* uleb128 CU relative DW_TAG_base_type DIE offset, 1-byte
+            unsigned size plus block.  */
          start = data;
          NEED (2);
          get_uleb128 (uleb, data); /* XXX check overrun */
+         if (! print_unresolved_addresses && cu != NULL)
+           uleb += cu->start;
          uint8_t usize = *(uint8_t *) data++;
          NEED (usize);
          printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "] ",
@@ -3874,21 +4143,29 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
          break;
 
        case DW_OP_GNU_regval_type:
+         /* uleb128 register number, uleb128 CU relative
+            DW_TAG_base_type DIE offset.  */
          start = data;
          NEED (2);
          get_uleb128 (uleb, data); /* XXX check overrun */
          get_uleb128 (uleb2, data); /* XXX check overrun */
-         printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 " %#" PRIx64 "\n",
+         if (! print_unresolved_addresses && cu != NULL)
+           uleb2 += cu->start;
+         printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 " [%6" PRIx64 "]\n",
                  indent, "", (uintmax_t) offset, op_name, uleb, uleb2);
          CONSUME (data - start);
          offset += 1 + (data - start);
          break;
 
        case DW_OP_GNU_deref_type:
+         /* 1-byte unsigned size of value, uleb128 CU relative
+            DW_TAG_base_type DIE offset.  */
          start = data;
          NEED (2);
          usize = *(uint8_t *) data++;
          get_uleb128 (uleb, data); /* XXX check overrun */
+         if (! print_unresolved_addresses && cu != NULL)
+           uleb += cu->start;
          printf ("%*s[%4" PRIuMAX "] %s %" PRIu8 " [%6" PRIxMAX "]\n",
                  indent, "", (uintmax_t) offset,
                  op_name, usize, uleb);
@@ -3898,9 +4175,13 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
 
        case DW_OP_GNU_convert:
        case DW_OP_GNU_reinterpret:
+         /* uleb128 CU relative offset to DW_TAG_base_type, or zero
+            for conversion to untyped.  */
          start = data;
          NEED (1);
          get_uleb128 (uleb, data); /* XXX check overrun */
+         if (uleb != 0 && ! print_unresolved_addresses && cu != NULL)
+           uleb += cu->start;
          printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "]\n",
                  indent, "", (uintmax_t) offset, op_name, uleb);
          CONSUME (data - start);
@@ -3911,9 +4192,11 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
          /* 4 byte CU relative reference to the abstract optimized away
             DW_TAG_formal_parameter.  */
          NEED (4);
+         uintmax_t param_off = (uintmax_t) read_4ubyte_unaligned (dbg, data);
+         if (! print_unresolved_addresses && cu != NULL)
+           param_off += cu->start;
          printf ("%*s[%4" PRIuMAX "] %s [%6" PRIxMAX "]\n",
-                 indent, "", (uintmax_t) offset, op_name,
-                 (uintmax_t) read_4ubyte_unaligned (dbg, data));
+                 indent, "", (uintmax_t) offset, op_name, param_off);
          CONSUME (4);
          data += 4;
          offset += 5;
@@ -3944,11 +4227,32 @@ struct listptr
   bool addr64:1;
   bool dwarf64:1;
   bool warned:1;
+  struct Dwarf_CU *cu;
 };
 
 #define listptr_offset_size(p) ((p)->dwarf64 ? 8 : 4)
 #define listptr_address_size(p)        ((p)->addr64 ? 8 : 4)
 
+static Dwarf_Addr
+listptr_base (struct listptr *p)
+{
+  Dwarf_Addr base;
+  Dwarf_Die cu = CUDIE (p->cu);
+  /* Find the base address of the compilation unit.  It will normally
+     be specified by DW_AT_low_pc.  In DWARF-3 draft 4, the base
+     address could be overridden by DW_AT_entry_pc.  It's been
+     removed, but GCC emits DW_AT_entry_pc and not DW_AT_lowpc for
+     compilation units with discontinuous ranges.  */
+  if (unlikely (dwarf_lowpc (&cu, &base) != 0))
+    {
+      Dwarf_Attribute attr_mem;
+      if (dwarf_formaddr (dwarf_attr (&cu, DW_AT_entry_pc, &attr_mem),
+                         &base) != 0)
+       base = 0;
+    }
+  return base;
+}
+
 static int
 compare_listptr (const void *a, const void *b, void *arg)
 {
@@ -3977,6 +4281,13 @@ compare_listptr (const void *a, const void *b, void *arg)
                 gettext ("%s %#" PRIx64 " used with different offset sizes"),
                 name, (uint64_t) p1->offset);
        }
+      if (listptr_base (p1) != listptr_base (p2))
+       {
+         p1->warned = p2->warned = true;
+         error (0, 0,
+                gettext ("%s %#" PRIx64 " used with different base addresses"),
+                name, (uint64_t) p1->offset);
+       }
     }
 
   return 0;
@@ -4003,7 +4314,7 @@ reset_listptr (struct listptr_table *table)
 static void
 notice_listptr (enum section_e section, struct listptr_table *table,
                uint_fast8_t address_size, uint_fast8_t offset_size,
-               Dwarf_Off offset)
+               struct Dwarf_CU *cu, Dwarf_Off offset)
 {
   if (print_debug_sections & section)
     {
@@ -4023,7 +4334,8 @@ notice_listptr (enum section_e section, struct listptr_table *table,
        {
          .addr64 = address_size == 8,
          .dwarf64 = offset_size == 8,
-         .offset = offset
+         .offset = offset,
+         .cu = cu
        };
       assert (p->offset == offset);
     }
@@ -4040,7 +4352,8 @@ sort_listptr (struct listptr_table *table, const char *name)
 static bool
 skip_listptr_hole (struct listptr_table *table, size_t *idxp,
                   uint_fast8_t *address_sizep, uint_fast8_t *offset_sizep,
-                  ptrdiff_t offset, unsigned char **readp, unsigned char *endp)
+                  Dwarf_Addr *base, struct Dwarf_CU **cu, ptrdiff_t offset,
+                  unsigned char **readp, unsigned char *endp)
 {
   if (table->n == 0)
     return false;
@@ -4071,6 +4384,10 @@ skip_listptr_hole (struct listptr_table *table, size_t *idxp,
     *address_sizep = listptr_address_size (p);
   if (offset_sizep != NULL)
     *offset_sizep = listptr_offset_size (p);
+  if (base != NULL)
+    *base = listptr_base (p);
+  if (cu != NULL)
+    *cu = p->cu;
 
   return false;
 }
@@ -4151,9 +4468,8 @@ print_debug_abbrev_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
    not have to know a bit about the structure of the section, libdwarf
    takes care of it.  */
 static void
-print_debug_aranges_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
-                            Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn,
-                            GElf_Shdr *shdr, Dwarf *dbg)
+print_decoded_aranges_section (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn,
+                              GElf_Shdr *shdr, Dwarf *dbg)
 {
   Dwarf_Aranges *aranges;
   size_t cnt;
@@ -4164,6 +4480,16 @@ print_debug_aranges_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
       return;
     }
 
+  GElf_Shdr glink_mem;
+  GElf_Shdr *glink;
+  glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), &glink_mem);
+  if (glink == NULL)
+    {
+      error (0, 0, gettext ("invalid sh_link value in section %Zu"),
+            elf_ndxscn (scn));
+      return;
+    }
+
   printf (ngettext ("\
 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 " contains %zu entry:\n",
                    "\
@@ -4205,6 +4531,166 @@ print_debug_aranges_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
     }
 }
 
+
+/* Print content of DWARF .debug_aranges section.  */
+static void
+print_debug_aranges_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
+                            Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn,
+                            GElf_Shdr *shdr, Dwarf *dbg)
+{
+  if (decodedaranges)
+    {
+      print_decoded_aranges_section (ebl, ehdr, scn, shdr, dbg);
+      return;
+    }
+
+  Elf_Data *data = dbg->sectiondata[IDX_debug_aranges];
+
+  if (unlikely (data == NULL))
+    {
+      error (0, 0, gettext ("cannot get .debug_aranges content: %s"),
+            elf_errmsg (-1));
+      return;
+    }
+
+  printf (gettext ("\
+\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
+         elf_ndxscn (scn), section_name (ebl, ehdr, shdr),
+         (uint64_t) shdr->sh_offset);
+
+  const unsigned char *readp = data->d_buf;
+  const unsigned char *readendp = readp + data->d_size;
+
+  while (readp < readendp)
+    {
+      const unsigned char *hdrstart = readp;
+      size_t start_offset = hdrstart - (const unsigned char *) data->d_buf;
+
+      printf (gettext ("\nTable at offset %Zu:\n"), start_offset);
+      if (readp + 4 > readendp)
+       {
+       invalid_data:
+         error (0, 0, gettext ("invalid data in section [%zu] '%s'"),
+                elf_ndxscn (scn), section_name (ebl, ehdr, shdr));
+         return;
+       }
+
+      Dwarf_Word length = read_4ubyte_unaligned_inc (dbg, readp);
+      unsigned int length_bytes = 4;
+      if (length == DWARF3_LENGTH_64_BIT)
+       {
+         if (readp + 8 > readendp)
+           goto invalid_data;
+         length = read_8ubyte_unaligned_inc (dbg, readp);
+         length_bytes = 8;
+       }
+
+      const unsigned char *nexthdr = readp + length;
+      printf (gettext ("\n Length:        %6" PRIu64 "\n"),
+             (uint64_t) length);
+
+      if (nexthdr > readendp)
+       goto invalid_data;
+
+      if (length == 0)
+       continue;
+
+      if (readp + 2 > readendp)
+       goto invalid_data;
+      uint_fast16_t version = read_2ubyte_unaligned_inc (dbg, readp);
+      printf (gettext (" DWARF version: %6" PRIuFAST16 "\n"),
+             version);
+      if (version != 2)
+       {
+         error (0, 0, gettext ("unsupported aranges version"));
+         goto next_table;
+       }
+
+      Dwarf_Word offset;
+      if (readp + length_bytes > readendp)
+       goto invalid_data;
+      if (length_bytes == 8)
+       offset = read_8ubyte_unaligned_inc (dbg, readp);
+      else
+       offset = read_4ubyte_unaligned_inc (dbg, readp);
+      printf (gettext (" CU offset:     %6" PRIx64 "\n"),
+             (uint64_t) offset);
+
+      if (readp + 1 > readendp)
+       goto invalid_data;
+      unsigned int address_size = *readp++;
+      printf (gettext (" Address size:  %6" PRIu64 "\n"),
+             (uint64_t) address_size);
+      if (address_size != 4 && address_size != 8)
+       {
+         error (0, 0, gettext ("unsupported address size"));
+         goto next_table;
+       }
+
+      unsigned int segment_size = *readp++;
+      printf (gettext (" Segment size:  %6" PRIu64 "\n\n"),
+             (uint64_t) segment_size);
+      if (segment_size != 0 && segment_size != 4 && segment_size != 8)
+       {
+         error (0, 0, gettext ("unsupported segment size"));
+         goto next_table;
+       }
+
+      /* Round the address to the next multiple of 2*address_size.  */
+      readp += ((2 * address_size - ((readp - hdrstart) % (2 * address_size)))
+               % (2 * address_size));
+
+      while (readp < nexthdr)
+       {
+         Dwarf_Word range_address;
+         Dwarf_Word range_length;
+         Dwarf_Word segment = 0;
+         if (readp + 2 * address_size + segment_size > readendp)
+           goto invalid_data;
+         if (address_size == 4)
+           {
+             range_address = read_4ubyte_unaligned_inc (dbg, readp);
+             range_length = read_4ubyte_unaligned_inc (dbg, readp);
+           }
+         else
+           {
+             range_address = read_8ubyte_unaligned_inc (dbg, readp);
+             range_length = read_8ubyte_unaligned_inc (dbg, readp);
+           }
+
+         if (segment_size == 4)
+           segment = read_4ubyte_unaligned_inc (dbg, readp);
+         else if (segment_size == 8)
+           segment = read_8ubyte_unaligned_inc (dbg, readp);
+
+         if (range_address == 0 && range_length == 0 && segment == 0)
+           break;
+
+         char *b = format_dwarf_addr (dwflmod, address_size, range_address,
+                                      range_address);
+         char *e = format_dwarf_addr (dwflmod, address_size,
+                                      range_address + range_length - 1,
+                                      range_length);
+         if (segment_size != 0)
+           printf (gettext ("   %s..%s (%" PRIx64 ")\n"), b, e,
+                   (uint64_t) segment);
+         else
+           printf (gettext ("   %s..%s\n"), b, e);
+         free (b);
+         free (e);
+       }
+
+    next_table:
+      if (readp != nexthdr)
+       {
+         size_t padding = nexthdr - readp;
+         printf (gettext ("   %Zu padding bytes\n"), padding);
+         readp = nexthdr;
+       }
+    }
+}
+
+
 /* Print content of DWARF .debug_ranges section.  */
 static void
 print_debug_ranges_section (Dwfl_Module *dwflmod,
@@ -4212,7 +4698,7 @@ print_debug_ranges_section (Dwfl_Module *dwflmod,
                            Elf_Scn *scn, GElf_Shdr *shdr,
                            Dwarf *dbg)
 {
-  Elf_Data *data = elf_rawdata (scn, NULL);
+  Elf_Data *data = dbg->sectiondata[IDX_debug_ranges];
 
   if (unlikely (data == NULL))
     {
@@ -4232,6 +4718,7 @@ print_debug_ranges_section (Dwfl_Module *dwflmod,
   uint_fast8_t address_size = ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 4 : 8;
 
   bool first = true;
+  Dwarf_Addr base = 0;
   unsigned char *const endp = (unsigned char *) data->d_buf + data->d_size;
   unsigned char *readp = data->d_buf;
   while (readp < endp)
@@ -4239,11 +4726,11 @@ print_debug_ranges_section (Dwfl_Module *dwflmod,
       ptrdiff_t offset = readp - (unsigned char *) data->d_buf;
 
       if (first && skip_listptr_hole (&known_rangelistptr, &listptr_idx,
-                                     &address_size, NULL,
+                                     &address_size, NULL, &base, NULL,
                                      offset, &readp, endp))
        continue;
 
-      if (unlikely (data->d_size - offset < address_size * 2))
+      if (unlikely (data->d_size - offset < (size_t) address_size * 2))
        {
          printf (gettext (" [%6tx]  <INVALID DATA>\n"), offset);
          break;
@@ -4266,9 +4753,10 @@ print_debug_ranges_section (Dwfl_Module *dwflmod,
 
       if (begin == (Dwarf_Addr) -1l) /* Base address entry.  */
        {
-         char *b = format_dwarf_addr (dwflmod, address_size, end);
+         char *b = format_dwarf_addr (dwflmod, address_size, end, end);
          printf (gettext (" [%6tx]  base address %s\n"), offset, b);
          free (b);
+         base = end;
        }
       else if (begin == 0 && end == 0) /* End of list entry.  */
        {
@@ -4278,8 +4766,10 @@ print_debug_ranges_section (Dwfl_Module *dwflmod,
        }
       else
        {
-         char *b = format_dwarf_addr (dwflmod, address_size, begin);
-         char *e = format_dwarf_addr (dwflmod, address_size, end);
+         char *b = format_dwarf_addr (dwflmod, address_size, base + begin,
+                                      begin);
+         char *e = format_dwarf_addr (dwflmod, address_size, base + end,
+                                      end);
          /* We have an address range entry.  */
          if (first)            /* First address range entry in a list.  */
            printf (gettext (" [%6tx]  %s..%s\n"), offset, b, e);
@@ -4438,7 +4928,8 @@ print_cfa_program (const unsigned char *readp, const unsigned char *const endp,
            // XXX overflow check
            get_uleb128 (op1, readp);   /* Length of DW_FORM_block.  */
            printf ("     def_cfa_expression %" PRIu64 "\n", op1);
-           print_ops (dwflmod, dbg, 10, 10, version, ptr_size, 0, op1, readp);
+           print_ops (dwflmod, dbg, 10, 10, version, ptr_size, 0, NULL,
+                      op1, readp);
            readp += op1;
            break;
          case DW_CFA_expression:
@@ -4447,7 +4938,8 @@ print_cfa_program (const unsigned char *readp, const unsigned char *const endp,
            get_uleb128 (op2, readp);   /* Length of DW_FORM_block.  */
            printf ("     expression r%" PRIu64 " (%s) \n",
                    op1, regname (op1));
-           print_ops (dwflmod, dbg, 10, 10, version, ptr_size, 0, op2, readp);
+           print_ops (dwflmod, dbg, 10, 10, version, ptr_size, 0, NULL,
+                      op2, readp);
            readp += op2;
            break;
          case DW_CFA_offset_extended_sf:
@@ -4490,7 +4982,8 @@ print_cfa_program (const unsigned char *readp, const unsigned char *const endp,
            get_uleb128 (op2, readp);   /* Length of DW_FORM_block.  */
            printf ("     val_expression r%" PRIu64 " (%s)\n",
                    op1, regname (op1));
-           print_ops (dwflmod, dbg, 10, 10, version, ptr_size, 0, op2, readp);
+           print_ops (dwflmod, dbg, 10, 10, version, ptr_size, 0,
+                      NULL, op2, readp);
            readp += op2;
            break;
          case DW_CFA_MIPS_advance_loc8:
@@ -4710,7 +5203,18 @@ print_debug_frame_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
   (void) elf_getshdrstrndx (ebl->elf, &shstrndx);
   const char *scnname = elf_strptr (ebl->elf, shstrndx, shdr->sh_name);
 
-  Elf_Data *data = elf_rawdata (scn, NULL);
+  /* Needed if we find PC-relative addresses.  */
+  GElf_Addr bias;
+  if (dwfl_module_getelf (dwflmod, &bias) == NULL)
+    {
+      error (0, 0, gettext ("cannot get ELF: %s"), dwfl_errmsg (-1));
+      return;
+    }
+
+  bool is_eh_frame = strcmp (scnname, ".eh_frame") == 0;
+  Elf_Data *data = (is_eh_frame
+                   ? elf_rawdata (scn, NULL)
+                   : dbg->sectiondata[IDX_debug_frame]);
 
   if (unlikely (data == NULL))
     {
@@ -4718,7 +5222,6 @@ print_debug_frame_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
             scnname, elf_errmsg (-1));
       return;
     }
-  bool is_eh_frame = strcmp (scnname, ".eh_frame") == 0;
 
   if (is_eh_frame)
     printf (gettext ("\
@@ -4956,8 +5459,21 @@ print_debug_frame_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
          Dwarf_Word address_range
            = read_ubyte_unaligned_inc (ptr_size, dbg, readp);
 
+         /* pcrel for an FDE address is relative to the runtime
+            address of the start_address field itself.  Sign extend
+            if necessary to make sure the calculation is done on the
+            full 64 bit address even when initial_location only holds
+            the lower 32 bits.  */
+         Dwarf_Addr pc_start = initial_location;
+         if (ptr_size == 4)
+           pc_start = (uint64_t) (int32_t) pc_start;
+         if ((fde_encoding & 0x70) == DW_EH_PE_pcrel)
+           pc_start += ((uint64_t) shdr->sh_addr
+                        + (base - (const unsigned char *) data->d_buf)
+                        - bias);
+
          char *a = format_dwarf_addr (dwflmod, cie->address_size,
-                                      initial_location);
+                                      pc_start, initial_location);
          printf ("\n [%6tx] FDE length=%" PRIu64 " cie=[%6tx]\n"
                  "   CIE_pointer:              %" PRIu64 "\n"
                  "   initial_location:         %s",
@@ -5038,12 +5554,13 @@ struct attrcb_args
 {
   Dwfl_Module *dwflmod;
   Dwarf *dbg;
+  Dwarf_Die *die;
   int level;
   bool silent;
   unsigned int version;
   unsigned int addrsize;
   unsigned int offset_size;
-  Dwarf_Off cu_offset;
+  struct Dwarf_CU *cu;
 };
 
 
@@ -5085,7 +5602,8 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
                       dwarf_errmsg (-1));
              return DWARF_CB_ABORT;
            }
-         char *a = format_dwarf_addr (cbargs->dwflmod, cbargs->addrsize, addr);
+         char *a = format_dwarf_addr (cbargs->dwflmod, cbargs->addrsize,
+                                      addr, addr);
          printf ("           %*s%-20s (%s) %s\n",
                  (int) (level * 2), "", dwarf_attr_name (attr),
                  dwarf_form_name (form), a);
@@ -5176,7 +5694,8 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
        case DW_AT_GNU_call_site_target:
        case DW_AT_GNU_call_site_target_clobbered:
          notice_listptr (section_loc, &known_loclistptr,
-                         cbargs->addrsize, cbargs->offset_size, num);
+                         cbargs->addrsize, cbargs->offset_size,
+                         cbargs->cu, num);
          if (!cbargs->silent)
            printf ("           %*s%-20s (%s) location list [%6" PRIxMAX "]\n",
                    (int) (level * 2), "", dwarf_attr_name (attr),
@@ -5185,7 +5704,8 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
 
        case DW_AT_ranges:
          notice_listptr (section_ranges, &known_rangelistptr,
-                         cbargs->addrsize, cbargs->offset_size, num);
+                         cbargs->addrsize, cbargs->offset_size,
+                         cbargs->cu, num);
          if (!cbargs->silent)
            printf ("           %*s%-20s (%s) range list [%6" PRIxMAX "]\n",
                    (int) (level * 2), "", dwarf_attr_name (attr),
@@ -5230,14 +5750,46 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
       if (cbargs->silent)
        break;
 
-      if (valuestr == NULL)
-       printf ("           %*s%-20s (%s) %" PRIuMAX "\n",
-               (int) (level * 2), "", dwarf_attr_name (attr),
-               dwarf_form_name (form), (uintmax_t) num);
+      /* When highpc is in constant form it is relative to lowpc.
+        In that case also show the address.  */
+      Dwarf_Addr highpc;
+      if (attr == DW_AT_high_pc && dwarf_highpc (cbargs->die, &highpc) == 0)
+       {
+         char *a = format_dwarf_addr (cbargs->dwflmod, cbargs->addrsize,
+                                      highpc, highpc);
+         printf ("           %*s%-20s (%s) %" PRIuMAX " (%s)\n",
+                 (int) (level * 2), "", dwarf_attr_name (attr),
+                 dwarf_form_name (form), (uintmax_t) num, a);
+         free (a);
+       }
       else
-       printf ("           %*s%-20s (%s) %s (%" PRIuMAX ")\n",
-               (int) (level * 2), "", dwarf_attr_name (attr),
-               dwarf_form_name (form), valuestr, (uintmax_t) num);
+       {
+         Dwarf_Sword snum = 0;
+         if (form == DW_FORM_sdata)
+           if (unlikely (dwarf_formsdata (attrp, &snum) != 0))
+             goto attrval_out;
+
+         if (valuestr == NULL)
+           {
+             printf ("           %*s%-20s (%s)",
+                     (int) (level * 2), "", dwarf_attr_name (attr),
+                     dwarf_form_name (form));
+             if (form == DW_FORM_sdata)
+               printf (" %" PRIdMAX "\n", (intmax_t) snum);
+             else
+               printf (" %" PRIuMAX "\n", (uintmax_t) num);
+           }
+         else
+           {
+             printf ("           %*s%-20s (%s) %s",
+                     (int) (level * 2), "", dwarf_attr_name (attr),
+                     dwarf_form_name (form), valuestr);
+             if (form == DW_FORM_sdata)
+               printf (" (%" PRIdMAX ")\n", (intmax_t) snum);
+             else
+               printf (" (%" PRIuMAX ")\n", (uintmax_t) num);
+           }
+       }
       break;
 
     case DW_FORM_flag:
@@ -5312,7 +5864,7 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
          print_ops (cbargs->dwflmod, cbargs->dbg,
                     12 + level * 2, 12 + level * 2,
                     cbargs->version, cbargs->addrsize, cbargs->offset_size,
-                    block.length, block.data);
+                    attrp->cu, block.length, block.data);
          break;
        }
       break;
@@ -5394,8 +5946,7 @@ print_debug_units (Dwfl_Module *dwflmod,
       .silent = silent,
       .version = version,
       .addrsize = addrsize,
-      .offset_size = offsize,
-      .cu_offset = offset
+      .offset_size = offsize
     };
 
   offset += cuhl;
@@ -5412,6 +5963,8 @@ print_debug_units (Dwfl_Module *dwflmod,
       goto do_return;
     }
 
+  args.cu = dies[0].cu;
+
   do
     {
       offset = dwarf_dieoffset (&dies[level]);
@@ -5440,6 +5993,7 @@ print_debug_units (Dwfl_Module *dwflmod,
 
       /* Print the attribute values.  */
       args.level = level;
+      args.die = &dies[level];
       (void) dwarf_getattrs (&dies[level], attr_callback, &args, 0);
 
       /* Make room for the next level's DIE.  */
@@ -5499,9 +6053,95 @@ print_debug_types_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
 
 
 static void
+print_decoded_line_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
+                           Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
+{
+  printf (gettext ("\
+\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n\n"),
+         elf_ndxscn (scn), section_name (ebl, ehdr, shdr),
+         (uint64_t) shdr->sh_offset);
+
+  size_t address_size
+    = elf_getident (ebl->elf, NULL)[EI_CLASS] == ELFCLASS32 ? 4 : 8;
+
+  Dwarf_Off cuoffset;
+  Dwarf_Off ncuoffset = 0;
+  size_t hsize;
+  while (dwarf_nextcu (dbg, cuoffset = ncuoffset, &ncuoffset, &hsize,
+                      NULL, NULL, NULL) == 0)
+    {
+      Dwarf_Die cudie;
+      if (dwarf_offdie (dbg, cuoffset + hsize, &cudie) == NULL)
+       continue;
+
+      size_t nlines;
+      Dwarf_Lines *lines;
+      if (dwarf_getsrclines (&cudie, &lines, &nlines) != 0)
+       continue;
+
+      printf (" CU [%" PRIx64 "] %s\n",
+             dwarf_dieoffset (&cudie), dwarf_diename (&cudie));
+      printf ("  line:col SBPE* disc isa op address"
+             " (Statement Block Prologue Epilogue *End)\n");
+      const char *last_file = "";
+      for (size_t n = 0; n < nlines; n++)
+       {
+         Dwarf_Line *line = dwarf_onesrcline (lines, n);
+         Dwarf_Word mtime, length;
+         const char *file = dwarf_linesrc (line, &mtime, &length);
+         if (strcmp (last_file, file) != 0)
+           {
+             printf ("  %s (mtime: %" PRIu64 ", length: %" PRIu64 ")\n",
+                     file, mtime, length);
+             last_file = file;
+           }
+
+         int lineno, colno;
+         bool statement, endseq, block, prologue_end, epilogue_begin;
+         unsigned int lineop, isa, disc;
+         Dwarf_Addr address;
+         dwarf_lineaddr (line, &address);
+         dwarf_lineno (line, &lineno);
+         dwarf_linecol (line, &colno);
+         dwarf_lineop_index (line, &lineop);
+         dwarf_linebeginstatement (line, &statement);
+         dwarf_lineendsequence (line, &endseq);
+         dwarf_lineblock (line, &block);
+         dwarf_lineprologueend (line, &prologue_end);
+         dwarf_lineepiloguebegin (line, &epilogue_begin);
+         dwarf_lineisa (line, &isa);
+         dwarf_linediscriminator (line, &disc);
+
+         /* End sequence is special, it is one byte past.  */
+         char *a = format_dwarf_addr (dwflmod, address_size,
+                                      address - (endseq ? 1 : 0), address);
+         printf ("  %4d:%-3d %c%c%c%c%c %4d %3d %2d %s\n",
+                 lineno, colno,
+                 (statement ? 'S' : ' '),
+                 (block ? 'B' : ' '),
+                 (prologue_end ? 'P' : ' '),
+                 (epilogue_begin ? 'E' : ' '),
+                 (endseq ? '*' : ' '),
+                 disc, isa, lineop, a);
+         free (a);
+
+         if (endseq)
+           printf("\n");
+       }
+    }
+}
+
+
+static void
 print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
                          Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
 {
+  if (decodedline)
+    {
+      print_decoded_line_section (dwflmod, ebl, ehdr, scn, shdr, dbg);
+      return;
+    }
+
   printf (gettext ("\
 \nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
          elf_ndxscn (scn), section_name (ebl, ehdr, shdr),
@@ -5512,7 +6152,7 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
 
   /* There is no functionality in libdw to read the information in the
      way it is represented here.  Hardcode the decoder.  */
-  Elf_Data *data = elf_getdata (scn, NULL);
+  Elf_Data *data = dbg->sectiondata[IDX_debug_line];
   if (unlikely (data == NULL || data->d_buf == NULL))
     {
       error (0, 0, gettext ("cannot get line data section data: %s"),
@@ -5746,7 +6386,7 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
              line += line_increment;
              advance_pc ((opcode - opcode_base) / line_range);
 
-             char *a = format_dwarf_addr (dwflmod, 0, address);
+             char *a = format_dwarf_addr (dwflmod, 0, address, address);
              if (show_op_index)
                printf (gettext ("\
  special opcode %u: address+%u = %s, op_index = %u, line%+d = %zu\n"),
@@ -5794,7 +6434,7 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
                  else
                    address = read_8ubyte_unaligned_inc (dbg, linep);
                  {
-                   char *a = format_dwarf_addr (dwflmod, 0, address);
+                   char *a = format_dwarf_addr (dwflmod, 0, address, address);
                    printf (gettext (" set address to %s\n"), a);
                    free (a);
                  }
@@ -5855,7 +6495,7 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
                  get_uleb128 (u128, linep);
                  advance_pc (u128);
                  {
-                   char *a = format_dwarf_addr (dwflmod, 0, address);
+                   char *a = format_dwarf_addr (dwflmod, 0, address, address);
                    if (show_op_index)
                      printf (gettext ("\
  advance address by %u to %s, op_index to %u\n"),
@@ -5910,7 +6550,7 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
                  /* Takes no argument.  */
                  advance_pc ((255 - opcode_base) / line_range);
                  {
-                   char *a = format_dwarf_addr (dwflmod, 0, address);
+                   char *a = format_dwarf_addr (dwflmod, 0, address, address);
                    if (show_op_index)
                      printf (gettext ("\
  advance address by constant %u to %s, op_index to %u\n"),
@@ -5933,7 +6573,7 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
                  address += u128;
                  op_index = 0;
                  {
-                   char *a = format_dwarf_addr (dwflmod, 0, address);
+                   char *a = format_dwarf_addr (dwflmod, 0, address, address);
                    printf (gettext ("\
  advance address by fixed value %u to %s\n"),
                            u128, a);
@@ -5994,7 +6634,7 @@ print_debug_loc_section (Dwfl_Module *dwflmod,
                         Ebl *ebl, GElf_Ehdr *ehdr,
                         Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
 {
-  Elf_Data *data = elf_rawdata (scn, NULL);
+  Elf_Data *data = dbg->sectiondata[IDX_debug_loc];
 
   if (unlikely (data == NULL))
     {
@@ -6015,6 +6655,8 @@ print_debug_loc_section (Dwfl_Module *dwflmod,
   uint_fast8_t offset_size = 4;
 
   bool first = true;
+  struct Dwarf_CU *cu = NULL;
+  Dwarf_Addr base = 0;
   unsigned char *readp = data->d_buf;
   unsigned char *const endp = (unsigned char *) data->d_buf + data->d_size;
   while (readp < endp)
@@ -6022,11 +6664,11 @@ print_debug_loc_section (Dwfl_Module *dwflmod,
       ptrdiff_t offset = readp - (unsigned char *) data->d_buf;
 
       if (first && skip_listptr_hole (&known_loclistptr, &listptr_idx,
-                                     &address_size, &offset_size,
-                                     offset, &readp, endp))
+                                     &address_size, &offset_size, &base,
+                                     &cu, offset, &readp, endp))
        continue;
 
-      if (unlikely (data->d_size - offset < address_size * 2))
+      if (unlikely (data->d_size - offset < (size_t) address_size * 2))
        {
          printf (gettext (" [%6tx]  <INVALID DATA>\n"), offset);
          break;
@@ -6049,9 +6691,10 @@ print_debug_loc_section (Dwfl_Module *dwflmod,
 
       if (begin == (Dwarf_Addr) -1l) /* Base address entry.  */
        {
-         char *b = format_dwarf_addr (dwflmod, address_size, end);
+         char *b = format_dwarf_addr (dwflmod, address_size, end, end);
          printf (gettext (" [%6tx]  base address %s\n"), offset, b);
          free (b);
+         base = end;
        }
       else if (begin == 0 && end == 0) /* End of list entry.  */
        {
@@ -6064,8 +6707,10 @@ print_debug_loc_section (Dwfl_Module *dwflmod,
          /* We have a location expression entry.  */
          uint_fast16_t len = read_2ubyte_unaligned_inc (dbg, readp);
 
-         char *b = format_dwarf_addr (dwflmod, address_size, begin);
-         char *e = format_dwarf_addr (dwflmod, address_size, end);
+         char *b = format_dwarf_addr (dwflmod, address_size, base + begin,
+                                      begin);
+         char *e = format_dwarf_addr (dwflmod, address_size, base + end,
+                                      end);
 
          if (first)            /* First entry in a list.  */
            printf (gettext (" [%6tx]  %s..%s"), offset, b, e);
@@ -6082,7 +6727,7 @@ print_debug_loc_section (Dwfl_Module *dwflmod,
            }
 
          print_ops (dwflmod, dbg, 1, 18 + (address_size * 4),
-                    3 /*XXX*/, address_size, offset_size, len, readp);
+                    3 /*XXX*/, address_size, offset_size, cu, len, readp);
 
          first = false;
          readp += len;
@@ -6126,7 +6771,7 @@ print_debug_macinfo_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
 
   /* There is no function in libdw to iterate over the raw content of
      the section but it is easy enough to do.  */
-  Elf_Data *data = elf_getdata (scn, NULL);
+  Elf_Data *data = dbg->sectiondata[IDX_debug_macinfo];
   if (unlikely (data == NULL || data->d_buf == NULL))
     {
       error (0, 0, gettext ("cannot get macro information section data: %s"),
@@ -6280,7 +6925,7 @@ print_debug_macro_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
          (uint64_t) shdr->sh_offset);
   putc_unlocked ('\n', stdout);
 
-  Elf_Data *data = elf_getdata (scn, NULL);
+  Elf_Data *data = dbg->sectiondata[IDX_debug_macro];
   if (unlikely (data == NULL || data->d_buf == NULL))
     {
       error (0, 0, gettext ("cannot get macro information section data: %s"),
@@ -6365,6 +7010,7 @@ print_debug_macro_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
        }
 
       const unsigned char *vendor[DW_MACRO_GNU_hi_user - DW_MACRO_GNU_lo_user];
+      memset (vendor, 0, sizeof vendor);
       if (flag & 0x04)
        {
          // 1 byte length, for each item, 1 byte opcode, uleb128 number
@@ -7049,8 +7695,10 @@ print_gdb_index_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
 
   // The only difference between version 4 and version 5 is the
   // hash used for generating the table.  Version 6 contains symbols
-  // for inlined functions, older versions didn't.
-  if (vers < 4 || vers > 7)
+  // for inlined functions, older versions didn't.  Version 7 adds
+  // symbol kinds.  Version 8 just indicates that it correctly includes
+  // TUs for symbols.
+  if (vers < 4 || vers > 8)
     {
       printf (gettext ("  unknown version, cannot parse section\n"));
       return;
@@ -7160,10 +7808,12 @@ print_gdb_index_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
       uint32_t idx = read_4ubyte_unaligned (dbg, readp);
       readp += 4;
 
-      char *l = format_dwarf_addr (dwflmod, 8, low);
-      char *h = format_dwarf_addr (dwflmod, 8, high - 1);
+      char *l = format_dwarf_addr (dwflmod, 8, low, low);
+      char *h = format_dwarf_addr (dwflmod, 8, high - 1, high);
       printf (" [%4zu] %s..%s, CU index: %5" PRId32 "\n",
              n, l, h, idx);
+      free (l);
+      free (h);
       n++;
     }
 
@@ -7205,7 +7855,7 @@ print_gdb_index_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
              cu_kind = read_4ubyte_unaligned (dbg, readcus);
              cu = cu_kind & ((1 << 24) - 1);
              kind = (cu_kind >> 28) & 7;
-             is_static = cu_kind & (1 << 31);
+             is_static = cu_kind & (1U << 31);
              if (cu > cu_nr - 1)
                printf ("%" PRId32 "T", cu - (uint32_t) cu_nr);
              else
@@ -7312,8 +7962,10 @@ print_debug (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr)
                                       / sizeof (debug_sections[0]));
          const char *name = elf_strptr (ebl->elf, shstrndx,
                                         shdr->sh_name);
-         int n;
+         if (name == NULL)
+           continue;
 
+         int n;
          for (n = 0; n < ndebug_sections; ++n)
            if (strcmp (name, debug_sections[n].name) == 0
 #if USE_ZLIB
@@ -7337,24 +7989,35 @@ print_debug (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr)
 
 
 #define ITEM_INDENT            4
-#define ITEM_WRAP_COLUMN       150
-#define REGISTER_WRAP_COLUMN   75
+#define WRAP_COLUMN            75
+
+/* Print "NAME: FORMAT", wrapping when output text would make the line
+   exceed WRAP_COLUMN.  Unpadded numbers look better for the core items
+   but this function is also used for registers which should be printed
+   aligned.  Fortunately registers output uses fixed fields width (such
+   as %11d) for the alignment.
+
+   Line breaks should not depend on the particular values although that
+   may happen in some cases of the core items.  */
 
-/* Print "NAME: FORMAT", wrapping when FORMAT_MAX chars of FORMAT would
-   make the line exceed ITEM_WRAP_COLUMN.  Unpadded numbers look better
-   for the core items.  But we do not want the line breaks to depend on
-   the particular values.  */
 static unsigned int
-__attribute__ ((format (printf, 7, 8)))
+__attribute__ ((format (printf, 6, 7)))
 print_core_item (unsigned int colno, char sep, unsigned int wrap,
-                size_t name_width, const char *name,
-                size_t format_max, const char *format, ...)
+                size_t name_width, const char *name, const char *format, ...)
 {
   size_t len = strlen (name);
   if (name_width < len)
     name_width = len;
 
-  size_t n = name_width + sizeof ": " - 1 + format_max;
+  char *out;
+  va_list ap;
+  va_start (ap, format);
+  int out_len = vasprintf (&out, format, ap);
+  va_end (ap);
+  if (out_len == -1)
+    error (EXIT_FAILURE, 0, _("memory exhausted"));
+
+  size_t n = name_width + sizeof ": " - 1 + out_len;
 
   if (colno == 0)
     {
@@ -7372,12 +8035,9 @@ print_core_item (unsigned int colno, char sep, unsigned int wrap,
       colno = ITEM_INDENT + n;
     }
 
-  printf ("%s: %*s", name, (int) (name_width - len), "");
+  printf ("%s: %*s%s", name, (int) (name_width - len), "", out);
 
-  va_list ap;
-  va_start (ap, format);
-  vprintf (format, ap);
-  va_end (ap);
+  free (out);
 
   return colno;
 }
@@ -7420,14 +8080,14 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc,
   uint_fast16_t count = item->count ?: 1;
 
 #define TYPES                                                                \
-  DO_TYPE (BYTE, Byte, "0x%.2" PRIx8, "%" PRId8, 4);                         \
-  DO_TYPE (HALF, Half, "0x%.4" PRIx16, "%" PRId16, 6);                       \
-  DO_TYPE (WORD, Word, "0x%.8" PRIx32, "%" PRId32, 11);                              \
-  DO_TYPE (SWORD, Sword, "%" PRId32, "%" PRId32, 11);                        \
-  DO_TYPE (XWORD, Xword, "0x%.16" PRIx64, "%" PRId64, 20);                   \
-  DO_TYPE (SXWORD, Sxword, "%" PRId64, "%" PRId64, 20)
-
-#define DO_TYPE(NAME, Name, hex, dec, max) GElf_##Name Name[count]
+  DO_TYPE (BYTE, Byte, "0x%.2" PRIx8, "%" PRId8);                            \
+  DO_TYPE (HALF, Half, "0x%.4" PRIx16, "%" PRId16);                          \
+  DO_TYPE (WORD, Word, "0x%.8" PRIx32, "%" PRId32);                          \
+  DO_TYPE (SWORD, Sword, "%" PRId32, "%" PRId32);                            \
+  DO_TYPE (XWORD, Xword, "0x%.16" PRIx64, "%" PRId64);                       \
+  DO_TYPE (SXWORD, Sxword, "%" PRId64, "%" PRId64)
+
+#define DO_TYPE(NAME, Name, hex, dec) GElf_##Name Name[count]
   union { TYPES; } value;
 #undef DO_TYPE
 
@@ -7459,10 +8119,10 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc,
       assert (count == 1);
       switch (type)
        {
-#define DO_TYPE(NAME, Name, hex, dec, max)                                   \
+#define DO_TYPE(NAME, Name, hex, dec)                                        \
          case ELF_T_##NAME:                                                  \
-           colno = print_core_item (colno, ',', ITEM_WRAP_COLUMN,            \
-                                    0, item->name, max, dec, value.Name[0]); \
+           colno = print_core_item (colno, ',', WRAP_COLUMN,                 \
+                                    0, item->name, dec, value.Name[0]); \
            break
          TYPES;
 #undef DO_TYPE
@@ -7475,10 +8135,10 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc,
       assert (count == 1);
       switch (type)
        {
-#define DO_TYPE(NAME, Name, hex, dec, max)                                   \
+#define DO_TYPE(NAME, Name, hex, dec)                                        \
          case ELF_T_##NAME:                                                  \
-           colno = print_core_item (colno, ',', ITEM_WRAP_COLUMN,            \
-                                    0, item->name, max, hex, value.Name[0]); \
+           colno = print_core_item (colno, ',', WRAP_COLUMN,                 \
+                                    0, item->name, hex, value.Name[0]);      \
            break
          TYPES;
 #undef DO_TYPE
@@ -7498,7 +8158,7 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc,
       const unsigned int bias = item->format == 'b';
 
       {
-       char printed[(negate ? nbits - pop : pop) * 16];
+       char printed[(negate ? nbits - pop : pop) * 16 + 1];
        char *p = printed;
        *p = '\0';
 
@@ -7515,19 +8175,19 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc,
          }
 
        unsigned int lastbit = 0;
+       unsigned int run = 0;
        for (const unsigned int *i = data;
             (void *) i < data + count * size; ++i)
          {
            unsigned int bit = ((void *) i - data) * 8;
            unsigned int w = negate ? ~*i : *i;
-           unsigned int run = 0;
            while (w != 0)
              {
                int n = ffs (w);
                w >>= n;
                bit += n;
 
-               if (lastbit + 1 == bit)
+               if (lastbit != 0 && lastbit + 1 == bit)
                  ++run;
                else
                  {
@@ -7543,11 +8203,10 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc,
                lastbit = bit;
              }
          }
-       if (lastbit > 0 && lastbit + 1 != nbits)
-         p += sprintf (p, "-%u", nbits - bias);
+       if (lastbit > 0 && run > 0 && lastbit + 1 != nbits)
+         p += sprintf (p, "-%u", lastbit - bias);
 
-       colno = print_core_item (colno, ',', ITEM_WRAP_COLUMN, 0, item->name,
-                                4 + nbits * 4,
+       colno = print_core_item (colno, ',', WRAP_COLUMN, 0, item->name,
                                 negate ? "~<%s>" : "<%s>", printed);
       }
       break;
@@ -7557,14 +8216,12 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc,
       assert (count == 2);
       Dwarf_Word sec;
       Dwarf_Word usec;
-      size_t maxfmt = 7;
       switch (type)
        {
-#define DO_TYPE(NAME, Name, hex, dec, max)                                   \
+#define DO_TYPE(NAME, Name, hex, dec)                                        \
          case ELF_T_##NAME:                                                  \
            sec = value.Name[0];                                              \
            usec = value.Name[1];                                             \
-           maxfmt += max;                                                    \
            break
          TYPES;
 #undef DO_TYPE
@@ -7587,19 +8244,19 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc,
          else
            usec &= UINT32_MAX;
        }
-      colno = print_core_item (colno, ',', ITEM_WRAP_COLUMN, 0, item->name,
-                              maxfmt, "%" PRIu64 ".%.6" PRIu64, sec, usec);
+      colno = print_core_item (colno, ',', WRAP_COLUMN, 0, item->name,
+                              "%" PRIu64 ".%.6" PRIu64, sec, usec);
       break;
 
     case 'c':
       assert (count == 1);
-      colno = print_core_item (colno, ',', ITEM_WRAP_COLUMN, 0, item->name,
-                              1, "%c", value.Byte[0]);
+      colno = print_core_item (colno, ',', WRAP_COLUMN, 0, item->name,
+                              "%c", value.Byte[0]);
       break;
 
     case 's':
-      colno = print_core_item (colno, ',', ITEM_WRAP_COLUMN, 0, item->name,
-                              count, "%.*s", (int) count, value.Byte);
+      colno = print_core_item (colno, ',', WRAP_COLUMN, 0, item->name,
+                              "%.*s", (int) count, value.Byte);
       break;
 
     case '\n':
@@ -7626,7 +8283,10 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc,
          s = eol + 1;
        }
 
-      colno = ITEM_WRAP_COLUMN;
+      colno = WRAP_COLUMN;
+      break;
+
+    case 'h':
       break;
 
     default:
@@ -7675,6 +8335,24 @@ handle_core_items (Elf *core, const void *desc, size_t descsz,
 {
   if (nitems == 0)
     return 0;
+  unsigned int colno = 0;
+
+  /* FORMAT '\n' makes sense to be present only as a single item as it
+     processes all the data of a note.  FORMATs 'b' and 'B' have a special case
+     if present as a single item but they can be also processed with other
+     items below.  */
+  if (nitems == 1 && (items[0].format == '\n' || items[0].format == 'b'
+                     || items[0].format == 'B'))
+    {
+      assert (items[0].offset == 0);
+      size_t size = descsz;
+      colno = handle_core_item (core, items, desc, colno, &size);
+      /* If SIZE is not zero here there is some remaining data.  But we do not
+        know how to process it anyway.  */
+      return colno;
+    }
+  for (size_t i = 0; i < nitems; ++i)
+    assert (items[i].format != '\n');
 
   /* Sort to collect the groups together.  */
   const Ebl_Core_Item *sorted_items[nitems];
@@ -7693,19 +8371,7 @@ handle_core_items (Elf *core, const void *desc, size_t descsz,
   qsort (groups, ngroups, sizeof groups[0], &compare_core_item_groups);
 
   /* Write out all the groups.  */
-  unsigned int colno = 0;
-
   const void *last = desc;
-  if (nitems == 1)
-    {
-      size_t size = descsz;
-      colno = handle_core_item (core, sorted_items[0], desc, colno, &size);
-      if (size == 0)
-       return colno;
-      desc += descsz - size;
-      descsz = size;
-    }
-
   do
     {
       for (size_t i = 0; i < ngroups; ++i)
@@ -7718,7 +8384,7 @@ handle_core_items (Elf *core, const void *desc, size_t descsz,
            colno = handle_core_item (core, *item, desc, colno, NULL);
 
          /* Force a line break at the end of the group.  */
-         colno = ITEM_WRAP_COLUMN;
+         colno = WRAP_COLUMN;
        }
 
       if (descsz == 0)
@@ -7786,12 +8452,12 @@ handle_core_register (Ebl *ebl, Elf *core, int maxregname,
       register_info (ebl, reg, regloc, name, &bits, &type);
 
 #define TYPES                                                                \
-      BITS (8, BYTE, "%4" PRId8, "0x%.2" PRIx8, 4);                          \
-      BITS (16, HALF, "%6" PRId16, "0x%.4" PRIx16, 6);                       \
-      BITS (32, WORD, "%11" PRId32, " 0x%.8" PRIx32, 11);                    \
-      BITS (64, XWORD, "%20" PRId64, "  0x%.16" PRIx64, 20)
+      BITS (8, BYTE, "%4" PRId8, "0x%.2" PRIx8);                             \
+      BITS (16, HALF, "%6" PRId16, "0x%.4" PRIx16);                          \
+      BITS (32, WORD, "%11" PRId32, " 0x%.8" PRIx32);                        \
+      BITS (64, XWORD, "%20" PRId64, "  0x%.16" PRIx64)
 
-#define BITS(bits, xtype, sfmt, ufmt, max)                             \
+#define BITS(bits, xtype, sfmt, ufmt)                          \
       uint##bits##_t b##bits; int##bits##_t b##bits##s
       union { TYPES; uint64_t b128[2]; } value;
 #undef BITS
@@ -7803,17 +8469,17 @@ handle_core_register (Ebl *ebl, Elf *core, int maxregname,
        case DW_ATE_address:
          switch (bits)
            {
-#define BITS(bits, xtype, sfmt, ufmt, max)                                   \
+#define BITS(bits, xtype, sfmt, ufmt)                                        \
            case bits:                                                        \
              desc = convert (core, ELF_T_##xtype, 1, &value, desc, 0);       \
              if (type == DW_ATE_signed)                                      \
-               colno = print_core_item (colno, ' ', REGISTER_WRAP_COLUMN,    \
+               colno = print_core_item (colno, ' ', WRAP_COLUMN,             \
                                         maxregname, name,                    \
-                                        max, sfmt, value.b##bits##s);        \
+                                        sfmt, value.b##bits##s);             \
              else                                                            \
-               colno = print_core_item (colno, ' ', REGISTER_WRAP_COLUMN,    \
+               colno = print_core_item (colno, ' ', WRAP_COLUMN,             \
                                         maxregname, name,                    \
-                                        max, ufmt, value.b##bits);           \
+                                        ufmt, value.b##bits);                \
              break
 
            TYPES;
@@ -7822,9 +8488,9 @@ handle_core_register (Ebl *ebl, Elf *core, int maxregname,
              assert (type == DW_ATE_unsigned);
              desc = convert (core, ELF_T_XWORD, 2, &value, desc, 0);
              int be = elf_getident (core, NULL)[EI_DATA] == ELFDATA2MSB;
-             colno = print_core_item (colno, ' ', REGISTER_WRAP_COLUMN,
+             colno = print_core_item (colno, ' ', WRAP_COLUMN,
                                       maxregname, name,
-                                      34, "0x%.16" PRIx64 "%.16" PRIx64,
+                                      "0x%.16" PRIx64 "%.16" PRIx64,
                                       value.b128[!be], value.b128[be]);
              break;
 
@@ -7853,9 +8519,8 @@ handle_core_register (Ebl *ebl, Elf *core, int maxregname,
              *h++ = "0123456789abcdef"[bytes[idx] >> 4];
              *h++ = "0123456789abcdef"[bytes[idx] & 0xf];
            }
-         colno = print_core_item (colno, ' ', REGISTER_WRAP_COLUMN,
-                                  maxregname, name,
-                                  2 + sizeof hex - 1, "0x%s", hex);
+         colno = print_core_item (colno, ' ', WRAP_COLUMN,
+                                  maxregname, name, "0x%s", hex);
          break;
        }
       desc += regloc->pad;
@@ -7994,7 +8659,7 @@ handle_core_registers (Ebl *ebl, Elf *core, const void *desc,
                                      reg->regloc, desc, colno);
 
       /* Force a line break at the end of the group.  */
-      colno = REGISTER_WRAP_COLUMN;
+      colno = WRAP_COLUMN;
     }
 
   return colno;
@@ -8072,6 +8737,151 @@ handle_auxv_note (Ebl *ebl, Elf *core, GElf_Word descsz, GElf_Off desc_pos)
     }
 }
 
+static bool
+buf_has_data (unsigned char const *ptr, unsigned char const *end, size_t sz)
+{
+  return ptr < end && (size_t) (end - ptr) >= sz;
+}
+
+static bool
+buf_read_int (Elf *core, unsigned char const **ptrp, unsigned char const *end,
+             int *retp)
+{
+  if (! buf_has_data (*ptrp, end, 4))
+    return false;
+
+  *ptrp = convert (core, ELF_T_WORD, 1, retp, *ptrp, 4);
+  return true;
+}
+
+static bool
+buf_read_ulong (Elf *core, unsigned char const **ptrp, unsigned char const *end,
+               uint64_t *retp)
+{
+  size_t sz = gelf_fsize (core, ELF_T_ADDR, 1, EV_CURRENT);
+  if (! buf_has_data (*ptrp, end, sz))
+    return false;
+
+  union
+  {
+    uint64_t u64;
+    uint32_t u32;
+  } u;
+
+  *ptrp = convert (core, ELF_T_ADDR, 1, &u, *ptrp, sz);
+
+  if (sz == 4)
+    *retp = u.u32;
+  else
+    *retp = u.u64;
+  return true;
+}
+
+static void
+handle_siginfo_note (Elf *core, GElf_Word descsz, GElf_Off desc_pos)
+{
+  Elf_Data *data = elf_getdata_rawchunk (core, desc_pos, descsz, ELF_T_BYTE);
+  if (data == NULL)
+    error (EXIT_FAILURE, 0,
+          gettext ("cannot convert core note data: %s"), elf_errmsg (-1));
+
+  unsigned char const *ptr = data->d_buf;
+  unsigned char const *const end = data->d_buf + data->d_size;
+
+  /* Siginfo head is three ints: signal number, error number, origin
+     code.  */
+  int si_signo, si_errno, si_code;
+  if (! buf_read_int (core, &ptr, end, &si_signo)
+      || ! buf_read_int (core, &ptr, end, &si_errno)
+      || ! buf_read_int (core, &ptr, end, &si_code))
+    {
+    fail:
+      printf ("    Not enough data in NT_SIGINFO note.\n");
+      return;
+    }
+
+  /* Next is a pointer-aligned union of structures.  On 64-bit
+     machines, that implies a word of padding.  */
+  if (gelf_getclass (core) == ELFCLASS64)
+    ptr += 4;
+
+  printf ("    si_signo: %d, si_errno: %d, si_code: %d\n",
+         si_signo, si_errno, si_code);
+
+  if (si_code > 0)
+    switch (si_signo)
+      {
+      case SIGILL:
+      case SIGFPE:
+      case SIGSEGV:
+      case SIGBUS:
+       {
+         uint64_t addr;
+         if (! buf_read_ulong (core, &ptr, end, &addr))
+           goto fail;
+         printf ("    fault address: %#" PRIx64 "\n", addr);
+         break;
+       }
+      default:
+       ;
+      }
+  else if (si_code == SI_USER)
+    {
+      int pid, uid;
+      if (! buf_read_int (core, &ptr, end, &pid)
+         || ! buf_read_int (core, &ptr, end, &uid))
+       goto fail;
+      printf ("    sender PID: %d, sender UID: %d\n", pid, uid);
+    }
+}
+
+static void
+handle_file_note (Elf *core, GElf_Word descsz, GElf_Off desc_pos)
+{
+  Elf_Data *data = elf_getdata_rawchunk (core, desc_pos, descsz, ELF_T_BYTE);
+  if (data == NULL)
+    error (EXIT_FAILURE, 0,
+          gettext ("cannot convert core note data: %s"), elf_errmsg (-1));
+
+  unsigned char const *ptr = data->d_buf;
+  unsigned char const *const end = data->d_buf + data->d_size;
+
+  uint64_t count, page_size;
+  if (! buf_read_ulong (core, &ptr, end, &count)
+      || ! buf_read_ulong (core, &ptr, end, &page_size))
+    {
+    fail:
+      printf ("    Not enough data in NT_FILE note.\n");
+      return;
+    }
+
+  /* Where file names are stored.  */
+  unsigned char const *const fstart
+    = ptr + 3 * count * gelf_fsize (core, ELF_T_ADDR, 1, EV_CURRENT);
+  char const *fptr = (char *) fstart;
+
+  printf ("    %" PRId64 " files:\n", count);
+  for (uint64_t i = 0; i < count; ++i)
+    {
+      uint64_t mstart, mend, moffset;
+      if (! buf_read_ulong (core, &ptr, fstart, &mstart)
+         || ! buf_read_ulong (core, &ptr, fstart, &mend)
+         || ! buf_read_ulong (core, &ptr, fstart, &moffset))
+       goto fail;
+
+      const char *fnext = memchr (fptr, '\0', (char *) end - fptr);
+      if (fnext == NULL)
+       goto fail;
+
+      int ct = printf ("      %08" PRIx64 "-%08" PRIx64
+                      " %08" PRIx64 " %" PRId64,
+                      mstart, mend, moffset * page_size, mend - mstart);
+      printf ("%*s%s\n", ct > 50 ? 3 : 53 - ct, "", fptr);
+
+      fptr = fnext + 1;
+    }
+}
+
 static void
 handle_core_note (Ebl *ebl, const GElf_Nhdr *nhdr,
                  const char *name, const void *desc)
@@ -8145,6 +8955,22 @@ handle_notes_data (Ebl *ebl, const GElf_Ehdr *ehdr,
                  && !memcmp (name, "CORE", 4))
                handle_auxv_note (ebl, ebl->elf, nhdr.n_descsz,
                                  start + desc_offset);
+             else if (nhdr.n_namesz == 5 && strcmp (name, "CORE") == 0)
+               switch (nhdr.n_type)
+                 {
+                 case NT_SIGINFO:
+                   handle_siginfo_note (ebl->elf, nhdr.n_descsz,
+                                        start + desc_offset);
+                   break;
+
+                 case NT_FILE:
+                   handle_file_note (ebl->elf, nhdr.n_descsz,
+                                     start + desc_offset);
+                   break;
+
+                 default:
+                   handle_core_note (ebl, &nhdr, name, desc);
+                 }
              else
                handle_core_note (ebl, &nhdr, name, desc);
            }
index dfa46b1..9db55c8 100644 (file)
@@ -1,5 +1,5 @@
 /* Print size information from ELF file.
-   Copyright (C) 2000-2007,2009,2012 Red Hat, Inc.
+   Copyright (C) 2000-2007,2009,2012,2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -441,14 +441,6 @@ show_sysv (Elf *elf, const char *prefix, const char *fname,
          digits - 2, sgettext ("sysv|size"),
          digits, sgettext ("sysv|addr"));
 
-  const char *fmtstr;
-  if (radix == radix_hex)
-    fmtstr = "%-*s %*" PRIx64 " %*" PRIx64 "\n";
-  else if (radix == radix_decimal)
-    fmtstr = "%-*s %*" PRId64 " %*" PRId64 "\n";
-  else
-    fmtstr = "%-*s %*" PRIo64 " %*" PRIo64 "\n";
-
   /* Iterate over all sections.  */
   GElf_Off total = 0;
   while ((scn = elf_nextscn (elf, scn)) != NULL)
@@ -459,7 +451,11 @@ show_sysv (Elf *elf, const char *prefix, const char *fname,
       /* Ignore all sections which are not used at runtime.  */
       if ((shdr->sh_flags & SHF_ALLOC) != 0)
        {
-         printf (fmtstr,
+         printf ((radix == radix_hex
+                  ? "%-*s %*" PRIx64 " %*" PRIx64 "\n"
+                  : (radix == radix_decimal
+                     ? "%-*s %*" PRId64 " %*" PRId64 "\n"
+                     : "%-*s %*" PRIo64 " %*" PRIo64 "\n")),
                  maxlen, elf_strptr (elf, shstrndx, shdr->sh_name),
                  digits - 2, shdr->sh_size,
                  digits, shdr->sh_addr);
@@ -490,14 +486,6 @@ show_sysv_one_line (Elf *elf)
     error (EXIT_FAILURE, 0,
           gettext ("cannot get section header string table index"));
 
-  const char *fmtstr;
-  if (radix == radix_hex)
-    fmtstr = "%" PRIx64 "(%s)";
-  else if (radix == radix_decimal)
-    fmtstr = "%" PRId64 "(%s)";
-  else
-    fmtstr = "%" PRIo64 "(%s)";
-
   /* Iterate over all sections.  */
   GElf_Off total = 0;
   bool first = true;
@@ -515,8 +503,10 @@ show_sysv_one_line (Elf *elf)
        fputs_unlocked (" + ", stdout);
       first = false;
 
-      printf (fmtstr, shdr->sh_size,
-             elf_strptr (elf, shstrndx, shdr->sh_name));
+      printf ((radix == radix_hex ? "%" PRIx64 "(%s)"
+              : (radix == radix_decimal ? "%" PRId64 "(%s)"
+                 : "%" PRIo64 "(%s)")),
+             shdr->sh_size, elf_strptr (elf, shstrndx, shdr->sh_name));
 
       total += shdr->sh_size;
     }
diff --git a/src/stack.c b/src/stack.c
new file mode 100644 (file)
index 0000000..c277dfd
--- /dev/null
@@ -0,0 +1,760 @@
+/* Unwinding of frames like gstack/pstack.
+   Copyright (C) 2013-2014 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/>.  */
+
+#include <config.h>
+#include <assert.h>
+#include <argp.h>
+#include <error.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdio_ext.h>
+#include <string.h>
+#include <locale.h>
+#include <fcntl.h>
+#include ELFUTILS_HEADER(dwfl)
+
+#include <dwarf.h>
+#include <system.h>
+
+/* Name and version of program.  */
+static void print_version (FILE *stream, struct argp_state *state);
+ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
+
+/* Bug report address.  */
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
+
+/* non-printable argp options.  */
+#define OPT_DEBUGINFO  0x100
+#define OPT_COREFILE   0x101
+
+static bool show_activation = false;
+static bool show_module = false;
+static bool show_build_id = false;
+static bool show_source = false;
+static bool show_one_tid = false;
+static bool show_quiet = false;
+static bool show_raw = false;
+static bool show_modules = false;
+static bool show_debugname = false;
+static bool show_inlines = false;
+
+static int maxframes = 256;
+
+struct frame
+{
+  Dwarf_Addr pc;
+  bool isactivation;
+};
+
+struct frames
+{
+  int frames;
+  int allocated;
+  struct frame *frame;
+};
+
+static Dwfl *dwfl = NULL;
+static pid_t pid = 0;
+static int core_fd = -1;
+static Elf *core = NULL;
+static const char *exec = NULL;
+static char *debuginfo_path = NULL;
+
+static const Dwfl_Callbacks proc_callbacks =
+  {
+    .find_elf = dwfl_linux_proc_find_elf,
+    .find_debuginfo = dwfl_standard_find_debuginfo,
+    .debuginfo_path = &debuginfo_path,
+  };
+
+static const Dwfl_Callbacks core_callbacks =
+  {
+    .find_elf = dwfl_build_id_find_elf,
+    .find_debuginfo = dwfl_standard_find_debuginfo,
+    .debuginfo_path = &debuginfo_path,
+  };
+
+#ifdef USE_DEMANGLE
+static size_t demangle_buffer_len = 0;
+static char *demangle_buffer = NULL;
+#endif
+
+/* Whether any frames have been shown at all.  Determines exit status.  */
+static bool frames_shown = false;
+
+/* Program exit codes. All frames shown without any errors is GOOD.
+   Some frames shown with some non-fatal errors is an ERROR.  A fatal
+   error or no frames shown at all is BAD.  A command line USAGE exit
+   is generated by argp_error.  */
+#define EXIT_OK     0
+#define EXIT_ERROR  1
+#define EXIT_BAD    2
+#define EXIT_USAGE 64
+
+static int
+get_addr_width (Dwfl_Module *mod)
+{
+  // Try to find the address wide if possible.
+  static int width = 0;
+  if (width == 0 && mod)
+    {
+      Dwarf_Addr bias;
+      Elf *elf = dwfl_module_getelf (mod, &bias);
+      if (elf)
+        {
+         GElf_Ehdr ehdr_mem;
+         GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem);
+         if (ehdr)
+           width = ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 8 : 16;
+       }
+    }
+  if (width == 0)
+    width = 16;
+
+  return width;
+}
+
+static int
+module_callback (Dwfl_Module *mod, void **userdata __attribute__((unused)),
+                const char *name, Dwarf_Addr start,
+                void *arg __attribute__((unused)))
+{
+  /* Forces resolving of main elf and debug files. */
+  Dwarf_Addr bias;
+  Elf *elf = dwfl_module_getelf (mod, &bias);
+  Dwarf *dwarf = dwfl_module_getdwarf (mod, &bias);
+
+  Dwarf_Addr end;
+  const char *mainfile;
+  const char *debugfile;
+  const char *modname = dwfl_module_info (mod, NULL, NULL, &end, NULL,
+                                          NULL, &mainfile, &debugfile);
+  assert (strcmp (modname, name) == 0);
+
+  int width = get_addr_width (mod);
+  printf ("0x%0*" PRIx64 "-0x%0*" PRIx64 " %s\n",
+         width, start, width, end, basename (name));
+
+  const unsigned char *id;
+  GElf_Addr id_vaddr;
+  int id_len = dwfl_module_build_id (mod, &id, &id_vaddr);
+  if (id_len > 0)
+    {
+      printf ("  [");
+      do
+       printf ("%02" PRIx8, *id++);
+      while (--id_len > 0);
+      printf ("]\n");
+    }
+
+  if (elf != NULL)
+    printf ("  %s\n", mainfile != NULL ? mainfile : "-");
+  if (dwarf != NULL)
+    printf ("  %s\n", debugfile != NULL ? debugfile : "-");
+
+  return DWARF_CB_OK;
+}
+
+static int
+frame_callback (Dwfl_Frame *state, void *arg)
+{
+  struct frames *frames = (struct frames *) arg;
+  int nr = frames->frames;
+  if (! dwfl_frame_pc (state, &frames->frame[nr].pc,
+                      &frames->frame[nr].isactivation))
+    return -1;
+
+  frames->frames++;
+  if (frames->frames == maxframes)
+    return DWARF_CB_ABORT;
+
+  if (frames->frames == frames->allocated)
+    {
+      frames->allocated *= 2;
+      frames->frame = realloc (frames->frame,
+                              sizeof (struct frame) * frames->allocated);
+      if (frames->frame == NULL)
+       error (EXIT_BAD, errno, "realloc frames.frame");
+    }
+
+  return DWARF_CB_OK;
+}
+
+static const char*
+die_name (Dwarf_Die *die)
+{
+  Dwarf_Attribute attr;
+  const char *name;
+  name = dwarf_formstring (dwarf_attr_integrate (die,
+                                                DW_AT_MIPS_linkage_name,
+                                                &attr)
+                          ?: dwarf_attr_integrate (die,
+                                                   DW_AT_linkage_name,
+                                                   &attr));
+  if (name == NULL)
+    name = dwarf_diename (die);
+
+  return name;
+}
+
+static void
+print_frame (int nr, Dwarf_Addr pc, bool isactivation,
+            Dwarf_Addr pc_adjusted, Dwfl_Module *mod,
+            const char *symname, Dwarf_Die *cudie,
+            Dwarf_Die *die)
+{
+  int width = get_addr_width (mod);
+  printf ("#%-2u 0x%0*" PRIx64, nr, width, (uint64_t) pc);
+
+  if (show_activation)
+    printf ("%4s", ! isactivation ? "- 1" : "");
+
+  if (symname != NULL)
+    {
+#ifdef USE_DEMANGLE
+      // Require GNU v3 ABI by the "_Z" prefix.
+      if (! show_raw && symname[0] == '_' && symname[1] == 'Z')
+       {
+         int status = -1;
+         char *dsymname = __cxa_demangle (symname, demangle_buffer,
+                                          &demangle_buffer_len, &status);
+         if (status == 0)
+           symname = demangle_buffer = dsymname;
+       }
+#endif
+      printf (" %s", symname);
+    }
+
+  const char* fname;
+  Dwarf_Addr start;
+  fname = dwfl_module_info(mod, NULL, &start,
+                          NULL, NULL, NULL, NULL, NULL);
+  if (show_module)
+    {
+      if (fname != NULL)
+       printf (" - %s", fname);
+    }
+
+  if (show_build_id)
+    {
+      const unsigned char *id;
+      GElf_Addr id_vaddr;
+      int id_len = dwfl_module_build_id (mod, &id, &id_vaddr);
+      if (id_len > 0)
+       {
+         printf ("\n    [");
+         do
+           printf ("%02" PRIx8, *id++);
+         while (--id_len > 0);
+         printf ("]@0x%0" PRIx64 "+0x%" PRIx64,
+                 start, pc_adjusted - start);
+       }
+    }
+
+  if (show_source)
+    {
+      int line, col;
+      const char* sname;
+      line = col = -1;
+      sname = NULL;
+      if (die != NULL)
+       {
+         Dwarf_Files *files;
+         if (dwarf_getsrcfiles (cudie, &files, NULL) == 0)
+           {
+             Dwarf_Attribute attr;
+             Dwarf_Word val;
+             if (dwarf_formudata (dwarf_attr (die, DW_AT_call_file, &attr),
+                                  &val) == 0)
+               {
+                 sname = dwarf_filesrc (files, val, NULL, NULL);
+                 if (dwarf_formudata (dwarf_attr (die, DW_AT_call_line,
+                                                  &attr), &val) == 0)
+                   {
+                     line = val;
+                     if (dwarf_formudata (dwarf_attr (die, DW_AT_call_column,
+                                                      &attr), &val) == 0)
+                       col = val;
+                   }
+               }
+           }
+       }
+      else
+       {
+         Dwfl_Line *lineobj = dwfl_module_getsrc(mod, pc_adjusted);
+         if (lineobj)
+           sname = dwfl_lineinfo (lineobj, NULL, &line, &col, NULL, NULL);
+       }
+
+      if (sname != NULL)
+       {
+         printf ("\n    %s", sname);
+         if (line > 0)
+           {
+             printf (":%d", line);
+             if (col > 0)
+               printf (":%d", col);
+           }
+       }
+    }
+  printf ("\n");
+}
+
+static void
+print_inline_frames (int *nr, Dwarf_Addr pc, bool isactivation,
+                    Dwarf_Addr pc_adjusted, Dwfl_Module *mod,
+                    const char *symname, Dwarf_Die *cudie, Dwarf_Die *die)
+{
+  Dwarf_Die *scopes = NULL;
+  int nscopes = dwarf_getscopes_die (die, &scopes);
+  if (nscopes > 0)
+    {
+      /* scopes[0] == die, the lowest level, for which we already have
+        the name.  This is the actual source location where it
+        happened.  */
+      print_frame ((*nr)++, pc, isactivation, pc_adjusted, mod, symname,
+                  NULL, NULL);
+
+      /* last_scope is the source location where the next frame/function
+        call was done. */
+      Dwarf_Die *last_scope = &scopes[0];
+      for (int i = 1; i < nscopes && (maxframes == 0 || *nr < maxframes); i++)
+       {
+         Dwarf_Die *scope = &scopes[i];
+         int tag = dwarf_tag (scope);
+         if (tag != DW_TAG_inlined_subroutine
+             && tag != DW_TAG_entry_point
+             && tag != DW_TAG_subprogram)
+           continue;
+
+         symname = die_name (scope);
+         print_frame ((*nr)++, pc, isactivation, pc_adjusted, mod, symname,
+                      cudie, last_scope);
+
+         /* Found the "top-level" in which everything was inlined?  */
+         if (tag == DW_TAG_subprogram)
+           break;
+
+         last_scope = scope;
+       }
+    }
+  free (scopes);
+}
+
+static void
+print_frames (struct frames *frames, pid_t tid, int dwflerr, const char *what)
+{
+  if (frames->frames > 0)
+    frames_shown = true;
+
+  printf ("TID %d:\n", tid);
+  int frame_nr = 0;
+  for (int nr = 0; nr < frames->frames && (maxframes == 0
+                                          || frame_nr < maxframes); nr++)
+    {
+      Dwarf_Addr pc = frames->frame[nr].pc;
+      bool isactivation = frames->frame[nr].isactivation;
+      Dwarf_Addr pc_adjusted = pc - (isactivation ? 0 : 1);
+
+      /* Get PC->SYMNAME.  */
+      Dwfl_Module *mod = dwfl_addrmodule (dwfl, pc_adjusted);
+      const char *symname = NULL;
+      Dwarf_Die die_mem;
+      Dwarf_Die *die = NULL;
+      Dwarf_Die *cudie = NULL;
+      if (mod && ! show_quiet)
+       {
+         if (show_debugname)
+           {
+             Dwarf_Addr bias = 0;
+             Dwarf_Die *scopes = NULL;
+             cudie = dwfl_module_addrdie (mod, pc_adjusted, &bias);
+             int nscopes = dwarf_getscopes (cudie, pc_adjusted - bias,
+                                            &scopes);
+
+             /* Find the first function-like DIE with a name in scope.  */
+             for (int i = 0; symname == NULL && i < nscopes; i++)
+               {
+                 Dwarf_Die *scope = &scopes[i];
+                 int tag = dwarf_tag (scope);
+                 if (tag == DW_TAG_subprogram
+                     || tag == DW_TAG_inlined_subroutine
+                     || tag == DW_TAG_entry_point)
+                   symname = die_name (scope);
+
+                 if (symname != NULL)
+                   {
+                     die_mem = *scope;
+                     die = &die_mem;
+                   }
+               }
+             free (scopes);
+           }
+
+         if (symname == NULL)
+           symname = dwfl_module_addrname (mod, pc_adjusted);
+       }
+
+      if (show_inlines && die != NULL)
+       print_inline_frames (&frame_nr, pc, isactivation, pc_adjusted, mod,
+                            symname, cudie, die);
+      else
+       print_frame (frame_nr++, pc, isactivation, pc_adjusted, mod, symname,
+                    NULL, NULL);
+    }
+
+  if (frames->frames > 0 && frame_nr == maxframes)
+    error (0, 0, "tid %d: shown max number of frames "
+          "(%d, use -n 0 for unlimited)", tid, maxframes);
+  else if (dwflerr != 0)
+    {
+      if (frames->frames > 0)
+       {
+         unsigned nr = frames->frames - 1;
+         Dwarf_Addr pc = frames->frame[nr].pc;
+         bool isactivation = frames->frame[nr].isactivation;
+         Dwarf_Addr pc_adjusted = pc - (isactivation ? 0 : 1);
+         Dwfl_Module *mod = dwfl_addrmodule (dwfl, pc_adjusted);
+         const char *mainfile = NULL;
+         const char *modname = dwfl_module_info (mod, NULL, NULL, NULL, NULL,
+                                                 NULL, &mainfile, NULL);
+         if (modname == NULL || modname[0] == '\0')
+           {
+             if (mainfile != NULL)
+               modname = mainfile;
+             else
+               modname = "<unknown>";
+           }
+         error (0, 0, "%s tid %d at 0x%" PRIx64 " in %s: %s", what, tid,
+                pc_adjusted, modname, dwfl_errmsg (dwflerr));
+       }
+      else
+       error (0, 0, "%s tid %d: %s", what, tid, dwfl_errmsg (dwflerr));
+    }
+}
+
+static int
+thread_callback (Dwfl_Thread *thread, void *thread_arg)
+{
+  struct frames *frames = (struct frames *) thread_arg;
+  pid_t tid = dwfl_thread_tid (thread);
+  int err = 0;
+  frames->frames = 0;
+  switch (dwfl_thread_getframes (thread, frame_callback, thread_arg))
+    {
+    case DWARF_CB_OK:
+    case DWARF_CB_ABORT:
+      break;
+    case -1:
+      err = dwfl_errno ();
+      break;
+    default:
+      abort ();
+    }
+  print_frames (frames, tid, err, "dwfl_thread_getframes");
+  return DWARF_CB_OK;
+}
+
+static void
+print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
+{
+  fprintf (stream, "stack (%s) %s\n", PACKAGE_NAME, PACKAGE_VERSION);
+}
+
+static error_t
+parse_opt (int key, char *arg __attribute__ ((unused)),
+          struct argp_state *state)
+{
+  switch (key)
+    {
+    case 'p':
+      pid = atoi (arg);
+      if (pid == 0)
+       argp_error (state, N_("-p PID should be a positive process id."));
+      break;
+
+    case OPT_COREFILE:
+      core_fd = open (arg, O_RDONLY);
+      if (core_fd < 0)
+       error (EXIT_BAD, errno, N_("Cannot open core file '%s'"), arg);
+      elf_version (EV_CURRENT);
+      core = elf_begin (core_fd, ELF_C_READ_MMAP, NULL);
+      if (core == NULL)
+       error (EXIT_BAD, 0, "core '%s' elf_begin: %s", arg, elf_errmsg(-1));
+      break;
+
+    case 'e':
+      exec = arg;
+      break;
+
+    case OPT_DEBUGINFO:
+      debuginfo_path = arg;
+      break;
+
+    case 'm':
+      show_module = true;
+      break;
+
+    case 's':
+      show_source = true;
+      break;
+
+    case 'a':
+      show_activation = true;
+      break;
+
+    case 'd':
+      show_debugname = true;
+      break;
+
+    case 'i':
+      show_inlines = show_debugname = true;
+      break;
+
+    case 'v':
+      show_activation = show_source = show_module = show_debugname = true;
+      show_inlines = true;
+      break;
+
+    case 'b':
+      show_build_id = true;
+      break;
+
+    case 'q':
+      show_quiet = true;
+      break;
+
+    case 'r':
+      show_raw = true;
+      break;
+
+    case '1':
+      show_one_tid = true;
+      break;
+
+    case 'n':
+      maxframes = atoi (arg);
+      if (maxframes < 0)
+       {
+         argp_error (state, N_("-n MAXFRAMES should be 0 or higher."));
+         return EINVAL;
+       }
+      break;
+
+    case 'l':
+      show_modules = true;
+      break;
+
+    case ARGP_KEY_END:
+      if (core == NULL && exec != NULL)
+       argp_error (state,
+                   N_("-e EXEC needs a core given by --core."));
+
+      if (pid == 0 && show_one_tid == true)
+       argp_error (state,
+                   N_("-1 needs a thread id given by -p."));
+
+      if ((pid == 0 && core == NULL) || (pid != 0 && core != NULL))
+       argp_error (state,
+                   N_("One of -p PID or --core COREFILE should be given."));
+
+      if (pid != 0)
+       {
+         dwfl = dwfl_begin (&proc_callbacks);
+         if (dwfl == NULL)
+           error (EXIT_BAD, 0, "dwfl_begin: %s", dwfl_errmsg (-1));
+
+         int err = dwfl_linux_proc_report (dwfl, pid);
+         if (err < 0)
+           error (EXIT_BAD, 0, "dwfl_linux_proc_report pid %d: %s", pid,
+                  dwfl_errmsg (-1));
+         else if (err > 0)
+           error (EXIT_BAD, err, "dwfl_linux_proc_report pid %d", pid);
+       }
+
+      if (core != NULL)
+       {
+         dwfl = dwfl_begin (&core_callbacks);
+         if (dwfl == NULL)
+           error (EXIT_BAD, 0, "dwfl_begin: %s", dwfl_errmsg (-1));
+         if (dwfl_core_file_report (dwfl, core, exec) < 0)
+           error (EXIT_BAD, 0, "dwfl_core_file_report: %s", dwfl_errmsg (-1));
+       }
+
+      if (dwfl_report_end (dwfl, NULL, NULL) != 0)
+       error (EXIT_BAD, 0, "dwfl_report_end: %s", dwfl_errmsg (-1));
+
+      if (pid != 0)
+       {
+         int err = dwfl_linux_proc_attach (dwfl, pid, false);
+         if (err < 0)
+           error (EXIT_BAD, 0, "dwfl_linux_proc_attach pid %d: %s", pid,
+                  dwfl_errmsg (-1));
+         else if (err > 0)
+           error (EXIT_BAD, err, "dwfl_linux_proc_attach pid %d", pid);
+       }
+
+      if (core != NULL)
+       {
+         if (dwfl_core_file_attach (dwfl, core) < 0)
+           error (EXIT_BAD, 0, "dwfl_core_file_report: %s", dwfl_errmsg (-1));
+       }
+
+      /* Makes sure we are properly attached.  */
+      if (dwfl_pid (dwfl) < 0)
+       error (EXIT_BAD, 0, "dwfl_pid: %s\n", dwfl_errmsg (-1));
+      break;
+
+    default:
+      return ARGP_ERR_UNKNOWN;
+    }
+  return 0;
+}
+
+int
+main (int argc, char **argv)
+{
+  /* We use no threads here which can interfere with handling a stream.  */
+  __fsetlocking (stdin, FSETLOCKING_BYCALLER);
+  __fsetlocking (stdout, FSETLOCKING_BYCALLER);
+  __fsetlocking (stderr, FSETLOCKING_BYCALLER);
+
+  /* Set locale.  */
+  (void) setlocale (LC_ALL, "");
+
+  const struct argp_option options[] =
+    {
+      { NULL, 0, NULL, 0, N_("Input selection options:"), 0 },
+      { "pid", 'p', "PID", 0,
+       N_("Show stack of process PID"), 0 },
+      { "core", OPT_COREFILE, "COREFILE", 0,
+       N_("Show stack found in COREFILE"), 0 },
+      {  "executable", 'e', "EXEC", 0, N_("(optional) EXECUTABLE that produced COREFILE"), 0 },
+      { "debuginfo-path", OPT_DEBUGINFO, "PATH", 0,
+       N_("Search path for separate debuginfo files"), 0 },
+
+      { NULL, 0, NULL, 0, N_("Output selection options:"), 0 },
+      { "activation",  'a', NULL, 0,
+       N_("Additionally show frame activation"), 0 },
+      { "debugname",  'd', NULL, 0,
+       N_("Additionally try to lookup DWARF debuginfo name for frame address"),
+       0 },
+      { "inlines",  'i', NULL, 0,
+       N_("Additionally show inlined function frames using DWARF debuginfo if available (implies -d)"), 0 },
+      { "module",  'm', NULL, 0,
+       N_("Additionally show module file information"), 0 },
+      { "source",  's', NULL, 0,
+       N_("Additionally show source file information"), 0 },
+      { "verbose", 'v', NULL, 0,
+       N_("Show all additional information (activation, debugname, inlines, module and source)"), 0 },
+      { "quiet", 'q', NULL, 0,
+       N_("Do not resolve address to function symbol name"), 0 },
+      { "raw", 'r', NULL, 0,
+       N_("Show raw function symbol names, do not try to demangle names"), 0 },
+      { "build-id",  'b', NULL, 0,
+       N_("Show module build-id, load address and pc offset"), 0 },
+      { NULL, '1', NULL, 0,
+       N_("Show the backtrace of only one thread"), 0 },
+      { NULL, 'n', "MAXFRAMES", 0,
+       N_("Show at most MAXFRAMES per thread (default 256, use 0 for unlimited)"), 0 },
+      { "list-modules", 'l', NULL, 0,
+       N_("Show module memory map with build-id, elf and debug files detected"), 0 },
+      { NULL, 0, NULL, 0, NULL, 0 }
+    };
+
+  const struct argp argp =
+    {
+      .options = options,
+      .parser = parse_opt,
+      .doc = N_("Print a stack for each thread in a process or core file.\v\
+Program exits with return code 0 if all frames were shown without \
+any errors.  If some frames were shown, but there were some non-fatal \
+errors, possibly causing an incomplete backtrace, the program exits \
+with return code 1.  If no frames could be shown, or a fatal error \
+occured the program exits with return code 2.  If the program was \
+invoked with bad or missing arguments it will exit with return code 64.")
+    };
+
+  argp_parse (&argp, argc, argv, 0, NULL, NULL);
+
+  if (show_modules)
+    {
+      printf ("PID %d - %s module memory map\n", dwfl_pid (dwfl),
+             pid != 0 ? "process" : "core");
+      if (dwfl_getmodules (dwfl, module_callback, NULL, 0) != 0)
+       error (EXIT_BAD, 0, "dwfl_getmodules: %s", dwfl_errmsg (-1));
+    }
+
+  struct frames frames;
+  /* When maxframes is zero, then 2048 is just the initial allocation
+     that will be increased using realloc in framecallback ().  */
+  frames.allocated = maxframes == 0 ? 2048 : maxframes;
+  frames.frames = 0;
+  frames.frame = malloc (sizeof (struct frame) * frames.allocated);
+  if (frames.frame == NULL)
+    error (EXIT_BAD, errno, "malloc frames.frame");
+
+  if (show_one_tid)
+    {
+      int err = 0;
+      switch (dwfl_getthread_frames (dwfl, pid, frame_callback, &frames))
+       {
+       case DWARF_CB_OK:
+       case DWARF_CB_ABORT:
+         break;
+       case -1:
+         err = dwfl_errno ();
+         break;
+       default:
+         abort ();
+       }
+      print_frames (&frames, pid, err, "dwfl_getthread_frames");
+    }
+  else
+    {
+      printf ("PID %d - %s\n", dwfl_pid (dwfl), pid != 0 ? "process" : "core");
+      switch (dwfl_getthreads (dwfl, thread_callback, &frames))
+       {
+       case DWARF_CB_OK:
+       case DWARF_CB_ABORT:
+         break;
+       case -1:
+         error (0, 0, "dwfl_getthreads: %s", dwfl_errmsg (-1));
+         break;
+       default:
+         abort ();
+       }
+    }
+  free (frames.frame);
+  dwfl_end (dwfl);
+
+  if (core != NULL)
+    elf_end (core);
+
+  if (core_fd != -1)
+    close (core_fd);
+
+#ifdef USE_DEMANGLE
+  free (demangle_buffer);
+#endif
+
+  if (! frames_shown)
+    error (EXIT_BAD, 0, N_("Couldn't show any frames."));
+
+  return error_message_count != 0 ? EXIT_ERROR : EXIT_OK;
+}
index 084eb99..f60e4b4 100644 (file)
@@ -1,5 +1,5 @@
 /* Print the strings of printable characters in files.
-   Copyright (C) 2005-2010, 2012 Red Hat, Inc.
+   Copyright (C) 2005-2010, 2012, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2005.
 
@@ -116,8 +116,15 @@ static bool char_7bit;
 /* True if file names should be printed before strings.  */
 static bool print_file_name;
 
-/* Location print format string.  */
-static const char *locfmt;
+/* Radix for printed numbers.  */
+static enum
+{
+  radix_none = 0,
+  radix_decimal,
+  radix_hex,
+  radix_octal
+} radix = radix_none;
+
 
 /* Page size in use.  */
 static size_t ps;
@@ -279,16 +286,16 @@ parse_opt (int key, char *arg,
       switch (arg[0])
        {
        case 'd':
-         locfmt = "%7" PRId64 " ";
+         radix = radix_decimal;
          break;
 
        case 'o':
        octfmt:
-         locfmt = "%7" PRIo64 " ";
+         radix = radix_octal;
          break;
 
        case 'x':
-         locfmt = "%7" PRIx64 " ";
+         radix = radix_hex;
          break;
 
        default:
@@ -355,8 +362,11 @@ process_chunk_mb (const char *fname, const unsigned char *buf, off64_t to,
                  fputs_unlocked (": ", stdout);
                }
 
-             if (unlikely (locfmt != NULL))
-               printf (locfmt, (int64_t) to - len - (buf - start));
+             if (unlikely (radix != radix_none))
+               printf ((radix == radix_octal ? "%7" PRIo64 " "
+                        : (radix == radix_decimal ? "%7" PRId64 " "
+                           : "%7" PRIx64 " ")),
+                       (int64_t) to - len - (buf - start));
 
              if (unlikely (*unprinted != NULL))
                {
@@ -420,8 +430,11 @@ process_chunk (const char *fname, const unsigned char *buf, off64_t to,
                  fputs_unlocked (": ", stdout);
                }
 
-             if (likely (locfmt != NULL))
-               printf (locfmt, (int64_t) to - len - (buf - start));
+             if (likely (radix != radix_none))
+               printf ((radix == radix_octal ? "%7" PRIo64 " "
+                        : (radix == radix_decimal ? "%7" PRId64 " "
+                           : "%7" PRIx64 " ")),
+                       (int64_t) to - len - (buf - start));
 
              if (unlikely (*unprinted != NULL))
                {
@@ -452,13 +465,6 @@ process_chunk (const char *fname, const unsigned char *buf, off64_t to,
 static void *
 map_file (int fd, off64_t start_off, off64_t fdlen, size_t *map_sizep)
 {
-#if _MUDFLAP
-  (void) fd;
-  (void) start_off;
-  (void) fdlen;
-  (void) map_sizep;
-  return MAP_FAILED;
-#else
   /* Maximum size we mmap.  We use an #ifdef to avoid overflows on
      32-bit machines.  64-bit machines these days do not have usable
      address spaces larger than about 43 bits.  Not that any file
@@ -500,7 +506,6 @@ map_file (int fd, off64_t start_off, off64_t fdlen, size_t *map_sizep)
 
   *map_sizep = map_size;
   return mem;
-#endif
 }
 
 
index 5e9c883..c9a1d8d 100644 (file)
@@ -1,5 +1,5 @@
 /* Discard section not used at runtime from object files.
-   Copyright (C) 2000-2012 Red Hat, Inc.
+   Copyright (C) 2000-2012, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2000.
 
@@ -432,6 +432,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
   Elf_Data debuglink_crc_data;
   bool any_symtab_changes = false;
   Elf_Data *shstrtab_data = NULL;
+  void *debuglink_buf = NULL;
 
   /* Create the full name of the file.  */
   if (prefix != NULL)
@@ -564,6 +565,11 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
       goto fail_close;
     }
 
+  if (shstrndx >= shnum)
+    goto illformed;
+
+#define elf_assert(test) do { if (!(test)) goto illformed; } while (0)
+
   /* Storage for section information.  We leave room for two more
      entries since we unconditionally create a section header string
      table.  Maybe some weird tool created an ELF file without one.
@@ -585,7 +591,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
     {
       /* This should always be true (i.e., there should not be any
         holes in the numbering).  */
-      assert (elf_ndxscn (scn) == cnt);
+      elf_assert (elf_ndxscn (scn) == cnt);
 
       shdr_info[cnt].scn = scn;
 
@@ -598,6 +604,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
                                        shdr_info[cnt].shdr.sh_name);
       if (shdr_info[cnt].name == NULL)
        {
+       illformed:
          error (0, 0, gettext ("illformed file '%s'"), fname);
          goto fail_close;
        }
@@ -607,6 +614,8 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
 
       /* Remember the shdr.sh_link value.  */
       shdr_info[cnt].old_sh_link = shdr_info[cnt].shdr.sh_link;
+      if (shdr_info[cnt].old_sh_link >= shnum)
+       goto illformed;
 
       /* Sections in files other than relocatable object files which
         are not loaded can be freely moved by us.  In relocatable
@@ -619,7 +628,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
         appropriate reference.  */
       if (unlikely (shdr_info[cnt].shdr.sh_type == SHT_SYMTAB_SHNDX))
        {
-         assert (shdr_info[shdr_info[cnt].shdr.sh_link].symtab_idx == 0);
+         elf_assert (shdr_info[shdr_info[cnt].shdr.sh_link].symtab_idx == 0);
          shdr_info[shdr_info[cnt].shdr.sh_link].symtab_idx = cnt;
        }
       else if (unlikely (shdr_info[cnt].shdr.sh_type == SHT_GROUP))
@@ -636,7 +645,12 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
          for (inner = 1;
               inner < shdr_info[cnt].data->d_size / sizeof (Elf32_Word);
               ++inner)
-           shdr_info[grpref[inner]].group_idx = cnt;
+           {
+             if (grpref[inner] < shnum)
+               shdr_info[grpref[inner]].group_idx = cnt;
+             else
+               goto illformed;
+           }
 
          if (inner == 1 || (inner == 2 && (grpref[0] & GRP_COMDAT) == 0))
            /* If the section group contains only one element and this
@@ -647,7 +661,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
        }
       else if (unlikely (shdr_info[cnt].shdr.sh_type == SHT_GNU_versym))
        {
-         assert (shdr_info[shdr_info[cnt].shdr.sh_link].version_idx == 0);
+         elf_assert (shdr_info[shdr_info[cnt].shdr.sh_link].version_idx == 0);
          shdr_info[shdr_info[cnt].shdr.sh_link].version_idx = cnt;
        }
 
@@ -655,7 +669,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
         discarded right away.  */
       if ((shdr_info[cnt].shdr.sh_flags & SHF_GROUP) != 0)
        {
-         assert (shdr_info[cnt].group_idx != 0);
+         elf_assert (shdr_info[cnt].group_idx != 0);
 
          if (shdr_info[shdr_info[cnt].group_idx].idx == 0)
            {
@@ -731,10 +745,14 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
            {
              /* If a relocation section is marked as being removed make
                 sure the section it is relocating is removed, too.  */
-             if ((shdr_info[cnt].shdr.sh_type == SHT_REL
+             if (shdr_info[cnt].shdr.sh_type == SHT_REL
                   || shdr_info[cnt].shdr.sh_type == SHT_RELA)
-                 && shdr_info[shdr_info[cnt].shdr.sh_info].idx != 0)
-               shdr_info[cnt].idx = 1;
+               {
+                 if (shdr_info[cnt].shdr.sh_info >= shnum)
+                   goto illformed;
+                 else if (shdr_info[shdr_info[cnt].shdr.sh_info].idx != 0)
+                   shdr_info[cnt].idx = 1;
+               }
 
              /* If a group section is marked as being removed make
                 sure all the sections it contains are being removed, too.  */
@@ -778,7 +796,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
                  if (shdr_info[cnt].symtab_idx != 0
                      && shdr_info[shdr_info[cnt].symtab_idx].data == NULL)
                    {
-                     assert (shdr_info[cnt].shdr.sh_type == SHT_SYMTAB);
+                     elf_assert (shdr_info[cnt].shdr.sh_type == SHT_SYMTAB);
 
                      shdr_info[shdr_info[cnt].symtab_idx].data
                        = elf_getdata (shdr_info[shdr_info[cnt].symtab_idx].scn,
@@ -818,6 +836,9 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
                      else if (scnidx == SHN_XINDEX)
                        scnidx = xndx;
 
+                     if (scnidx >= shnum)
+                       goto illformed;
+
                      if (shdr_info[scnidx].idx == 0)
                        /* This symbol table has a real symbol in
                           a discarded section.  So preserve the
@@ -848,11 +869,15 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
                }
 
              /* Handle references through sh_info.  */
-             if (SH_INFO_LINK_P (&shdr_info[cnt].shdr)
-                 && shdr_info[shdr_info[cnt].shdr.sh_info].idx == 0)
+             if (SH_INFO_LINK_P (&shdr_info[cnt].shdr))
                {
-                 shdr_info[shdr_info[cnt].shdr.sh_info].idx = 1;
-                 changes |= shdr_info[cnt].shdr.sh_info < cnt;
+                 if (shdr_info[cnt].shdr.sh_info >= shnum)
+                   goto illformed;
+                 else if ( shdr_info[shdr_info[cnt].shdr.sh_info].idx == 0)
+                   {
+                     shdr_info[shdr_info[cnt].shdr.sh_info].idx = 1;
+                     changes |= shdr_info[cnt].shdr.sh_info < cnt;
+                   }
                }
 
              /* Mark the section as investigated.  */
@@ -994,7 +1019,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
          error (EXIT_FAILURE, 0, gettext ("while generating output file: %s"),
                 elf_errmsg (-1));
 
-       assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx);
+       elf_assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx);
 
        /* Add this name to the section header string table.  */
        shdr_info[cnt].se = ebl_strtabadd (shst, shdr_info[cnt].name, 0);
@@ -1031,7 +1056,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
        error (EXIT_FAILURE, 0,
               gettext ("while create section header section: %s"),
               elf_errmsg (-1));
-      assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx);
+      elf_assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx);
 
       shdr_info[cnt].data = elf_newdata (shdr_info[cnt].newscn);
       if (shdr_info[cnt].data == NULL)
@@ -1046,7 +1071,8 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
       shdr_info[cnt].data->d_align = 4;
       shdr_info[cnt].shdr.sh_size = shdr_info[cnt].data->d_size
        = crc_offset + 4;
-      shdr_info[cnt].data->d_buf = xcalloc (1, shdr_info[cnt].data->d_size);
+      debuglink_buf = xcalloc (1, shdr_info[cnt].data->d_size);
+      shdr_info[cnt].data->d_buf = debuglink_buf;
 
       strcpy (shdr_info[cnt].data->d_buf, debug_basename);
 
@@ -1087,7 +1113,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
     error (EXIT_FAILURE, 0,
           gettext ("while create section header section: %s"),
           elf_errmsg (-1));
-  assert (elf_ndxscn (shdr_info[cnt].newscn) == idx);
+  elf_assert (elf_ndxscn (shdr_info[cnt].newscn) == idx);
 
   /* Finalize the string table and fill in the correct indices in the
      section headers.  */
@@ -1177,20 +1203,20 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
                    shndxdata = elf_getdata (shdr_info[shdr_info[cnt].symtab_idx].scn,
                                             NULL);
 
-                   assert ((versiondata->d_size / sizeof (Elf32_Word))
+                   elf_assert ((versiondata->d_size / sizeof (Elf32_Word))
                            >= shdr_info[cnt].data->d_size / elsize);
                  }
 
                if (shdr_info[cnt].version_idx != 0)
                  {
-                   assert (shdr_info[cnt].shdr.sh_type == SHT_DYNSYM);
+                   elf_assert (shdr_info[cnt].shdr.sh_type == SHT_DYNSYM);
                    /* This section has associated version
                       information.  We have to modify that
                       information, too.  */
                    versiondata = elf_getdata (shdr_info[shdr_info[cnt].version_idx].scn,
                                               NULL);
 
-                   assert ((versiondata->d_size / sizeof (GElf_Versym))
+                   elf_assert ((versiondata->d_size / sizeof (GElf_Versym))
                            >= shdr_info[cnt].data->d_size / elsize);
                  }
 
@@ -1245,7 +1271,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
                      sec = shdr_info[sym->st_shndx].idx;
                    else
                      {
-                       assert (shndxdata != NULL);
+                       elf_assert (shndxdata != NULL);
 
                        sec = shdr_info[xshndx].idx;
                      }
@@ -1266,7 +1292,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
                            nxshndx = sec;
                          }
 
-                       assert (sec < SHN_LORESERVE || shndxdata != NULL);
+                       elf_assert (sec < SHN_LORESERVE || shndxdata != NULL);
 
                        if ((inner != destidx || nshndx != sym->st_shndx
                             || (shndxdata != NULL && nxshndx != xshndx))
@@ -1293,9 +1319,11 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
                      {
                        size_t sidx = (sym->st_shndx != SHN_XINDEX
                                        ? sym->st_shndx : xshndx);
-                       assert (GELF_ST_TYPE (sym->st_info) == STT_SECTION
-                               || (shdr_info[sidx].shdr.sh_type == SHT_GROUP
-                                   && shdr_info[sidx].shdr.sh_info == inner));
+                       elf_assert (GELF_ST_TYPE (sym->st_info) == STT_SECTION
+                                   || ((shdr_info[sidx].shdr.sh_type
+                                        == SHT_GROUP)
+                                       && (shdr_info[sidx].shdr.sh_info
+                                           == inner)));
                      }
                  }
 
@@ -1483,11 +1511,11 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
                  {
                    GElf_Sym sym_mem;
                    GElf_Sym *sym = gelf_getsym (symd, inner, &sym_mem);
-                   assert (sym != NULL);
+                   elf_assert (sym != NULL);
 
                    const char *name = elf_strptr (elf, strshndx,
                                                   sym->st_name);
-                   assert (name != NULL);
+                   elf_assert (name != NULL);
                    size_t hidx = elf_hash (name) % nbucket;
 
                    if (bucket[hidx] == 0)
@@ -1506,8 +1534,8 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
            else
              {
                /* Alpha and S390 64-bit use 64-bit SHT_HASH entries.  */
-               assert (shdr_info[cnt].shdr.sh_entsize
-                       == sizeof (Elf64_Xword));
+               elf_assert (shdr_info[cnt].shdr.sh_entsize
+                           == sizeof (Elf64_Xword));
 
                Elf64_Xword *bucket = (Elf64_Xword *) hashd->d_buf;
 
@@ -1537,11 +1565,11 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
                  {
                    GElf_Sym sym_mem;
                    GElf_Sym *sym = gelf_getsym (symd, inner, &sym_mem);
-                   assert (sym != NULL);
+                   elf_assert (sym != NULL);
 
                    const char *name = elf_strptr (elf, strshndx,
                                                   sym->st_name);
-                   assert (name != NULL);
+                   elf_assert (name != NULL);
                    size_t hidx = elf_hash (name) % nbucket;
 
                    if (bucket[hidx] == 0)
@@ -2013,6 +2041,9 @@ while computing checksum for debug information"));
              free (shdr_info[cnt].debug_data->d_buf);
          }
 
+      /* Free data we allocated for the .gnu_debuglink section. */
+      free (debuglink_buf);
+
       /* Free the memory.  */
       if ((shnum + 2) * sizeof (struct shdr_info) > MAX_STACK_ALLOC)
        free (shdr_info);
index f6660a3..f6af450 100644 (file)
@@ -1,5 +1,5 @@
 /* Combine stripped files with separate symbols and debug information.
-   Copyright (C) 2007-2012 Red Hat, Inc.
+   Copyright (C) 2007-2012, 2014 Red Hat, Inc.
    This file is part of elfutils.
    Written by Roland McGrath <roland@redhat.com>, 2007.
 
@@ -82,6 +82,9 @@ static const struct argp_option options[] =
     N_("Apply relocations to section contents in ET_REL files"), 0 },
   { "list-only", 'n', NULL, 0,
     N_("Only list module and file names, build IDs"), 0 },
+ { "force", 'F', NULL, 0,
+    N_("Force combining files even if some ELF headers don't seem to match"),
+   0 },
   { NULL, 0, NULL, 0, NULL, 0 }
 };
 
@@ -97,6 +100,7 @@ struct arg_info
   bool modnames;
   bool match_files;
   bool relocate;
+  bool force;
 };
 
 /* Handle program arguments.  */
@@ -147,6 +151,9 @@ parse_opt (int key, char *arg, struct argp_state *state)
     case 'R':
       info->relocate = true;
       break;
+    case 'F':
+      info->force = true;
+      break;
 
     case ARGP_KEY_ARGS:
     case ARGP_KEY_NO_ARGS:
@@ -1118,10 +1125,11 @@ find_alloc_sections_prelink (Elf *debug, Elf_Data *debug_shstrtab,
                      && (sec->shdr.sh_type == undo_sec->shdr.sh_type
                          || (sec->shdr.sh_type == SHT_PROGBITS
                              && undo_sec->shdr.sh_type == SHT_NOBITS))
-                     && sec->shdr.sh_size < undo_sec->shdr.sh_size
+                     && sec->shdr.sh_size <= undo_sec->shdr.sh_size
                      && (!strcmp (sec->name, ".bss")
                          || !strcmp (sec->name, ".sbss"))
-                     && (split_bss = sec) > sections)))
+                     && (sec->shdr.sh_size == undo_sec->shdr.sh_size
+                         || (split_bss = sec) > sections))))
            {
              sec->outscn = undo_sec->outscn;
              undo_sec = NULL;
@@ -1935,9 +1943,20 @@ open_file (const char *file, bool writable)
 
 /* Handle a pair of files we need to open by name.  */
 static void
-handle_explicit_files (const char *output_file, bool create_dirs,
+handle_explicit_files (const char *output_file, bool create_dirs, bool force,
                       const char *stripped_file, const char *unstripped_file)
 {
+
+  /* Warn, and exit if not forced to continue, if some ELF header
+     sanity check for the stripped and unstripped files failed.  */
+  void warn (const char *msg)
+  {
+    error (force ? 0 : EXIT_FAILURE, 0, "%s'%s' and '%s' %s%s.",
+          force ? _("WARNING: ") : "",
+          stripped_file, unstripped_file, msg,
+          force ? "" : _(", use --force"));
+  }
+
   int stripped_fd = open_file (stripped_file, false);
   Elf *stripped = elf_begin (stripped_fd, ELF_C_READ, NULL);
   GElf_Ehdr stripped_ehdr;
@@ -1956,12 +1975,18 @@ handle_explicit_files (const char *output_file, bool create_dirs,
       ELF_CHECK (gelf_getehdr (unstripped, &unstripped_ehdr),
                 _("cannot create ELF descriptor: %s"));
 
-      if (memcmp (stripped_ehdr.e_ident, unstripped_ehdr.e_ident, EI_NIDENT)
-         || stripped_ehdr.e_type != unstripped_ehdr.e_type
-         || stripped_ehdr.e_machine != unstripped_ehdr.e_machine
-         || stripped_ehdr.e_phnum != unstripped_ehdr.e_phnum)
-       error (EXIT_FAILURE, 0, _("'%s' and '%s' do not seem to match"),
-              stripped_file, unstripped_file);
+      if (memcmp (stripped_ehdr.e_ident,
+                 unstripped_ehdr.e_ident, EI_NIDENT) != 0)
+       warn (_("ELF header identification (e_ident) different"));
+
+      if (stripped_ehdr.e_type != unstripped_ehdr.e_type)
+       warn (_("ELF header type (e_type) different"));
+
+      if (stripped_ehdr.e_machine != unstripped_ehdr.e_machine)
+       warn (_("ELF header machine type (e_machine) different"));
+
+      if (stripped_ehdr.e_phnum < unstripped_ehdr.e_phnum)
+       warn (_("stripped program header (e_phnum) smaller than unstripped"));
     }
 
   handle_file (output_file, create_dirs, stripped, &stripped_ehdr, unstripped);
@@ -1976,7 +2001,7 @@ handle_explicit_files (const char *output_file, bool create_dirs,
 
 /* Handle a pair of files opened implicitly by libdwfl for one module.  */
 static void
-handle_dwfl_module (const char *output_file, bool create_dirs,
+handle_dwfl_module (const char *output_file, bool create_dirs, bool force,
                    Dwfl_Module *mod, bool all, bool ignore, bool relocate)
 {
   GElf_Addr bias;
@@ -2048,7 +2073,7 @@ handle_dwfl_module (const char *output_file, bool create_dirs,
          (void) dwfl_module_info (mod, NULL, NULL, NULL, NULL, NULL,
                                   &stripped_file, &unstripped_file);
 
-         handle_explicit_files (output_file, create_dirs,
+         handle_explicit_files (output_file, create_dirs, force,
                                 stripped_file, unstripped_file);
          return;
        }
@@ -2068,7 +2093,7 @@ handle_dwfl_module (const char *output_file, bool create_dirs,
 
 /* Handle one module being written to the output directory.  */
 static void
-handle_output_dir_module (const char *output_dir, Dwfl_Module *mod,
+handle_output_dir_module (const char *output_dir, Dwfl_Module *mod, bool force,
                          bool all, bool ignore, bool modnames, bool relocate)
 {
   if (! modnames)
@@ -2089,7 +2114,7 @@ handle_output_dir_module (const char *output_dir, Dwfl_Module *mod,
   if (asprintf (&output_file, "%s/%s", output_dir, modnames ? name : file) < 0)
     error (EXIT_FAILURE, 0, _("memory exhausted"));
 
-  handle_dwfl_module (output_file, true, mod, all, ignore, relocate);
+  handle_dwfl_module (output_file, true, force, mod, all, ignore, relocate);
 }
 
 
@@ -2201,12 +2226,12 @@ handle_implicit_modules (const struct arg_info *info)
     {
       if (next (offset) != 0)
        error (EXIT_FAILURE, 0, _("matched more than one module"));
-      handle_dwfl_module (info->output_file, false, mmi.found,
+      handle_dwfl_module (info->output_file, false, info->force, mmi.found,
                          info->all, info->ignore, info->relocate);
     }
   else
     do
-      handle_output_dir_module (info->output_dir, mmi.found,
+      handle_output_dir_module (info->output_dir, mmi.found, info->force,
                                info->all, info->ignore,
                                info->modnames, info->relocate);
     while ((offset = next (offset)) > 0);
@@ -2296,11 +2321,12 @@ or - if no debuginfo was found, or . if FILE contains the debug information.\
          char *file;
          if (asprintf (&file, "%s/%s", info.output_dir, info.args[0]) < 0)
            error (EXIT_FAILURE, 0, _("memory exhausted"));
-         handle_explicit_files (file, true, info.args[0], info.args[1]);
+         handle_explicit_files (file, true, info.force,
+                                info.args[0], info.args[1]);
          free (file);
        }
       else
-       handle_explicit_files (info.output_file, false,
+       handle_explicit_files (info.output_file, false, info.force,
                               info.args[0], info.args[1]);
     }
   else
index 276462c..dce6ebe 100644 (file)
@@ -1,3 +1,732 @@
+2014-06-15  Mark Wielaard  <mjw@redhat.com>
+
+       * backtrace.c (frame_callback): Error on seeing more than 16 frames.
+
+2014-06-13  Mark Wielaard  <mjw@redhat.com>
+
+       * backtrace.c (callback_verify): Accept "__libc_do_syscall" as first
+       frame symname.
+
+2014-06-13  Mark Wielaard  <mjw@redhat.com>
+
+       * backtrace-subr.sh (check_native_unsupported): New function.
+       (check_native): Call it.
+       (check_native_core): Likewise.
+       * run-backtrace-dwarf.sh: Likewise.
+
+2014-06-11  Mark Wielaard  <mjw@redhat.com>
+
+       * backtrace.c (main): Check that Dwfl was attached by calling
+       dwfl_pid and printing the error when it is not.
+
+2014-05-18  Mark Wielaard  <mjw@redhat.com>
+
+       * testfile-backtrace-demangle.cc (cxxfunc): Make non-static.
+       (f): Likewise.
+       * testfile-backtrace-demangle.bz2: Regenerate.
+       * testfile-backtrace-demangle.core.bz2: Likewise.
+
+2014-05-02  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (TESTS): run-readelf-dwz-multi.sh and
+       run-allfcts-multi.sh are now added unconditionally.
+
+2014-05-01  Mark Wielaard  <mjw@redhat.com>
+
+       * run-readelf-dwz-multi.sh: Add tests with alt debug files in .dwz
+       subdir.
+
+2014-04-30  Mark Wielaard  <mjw@redhat.com>
+
+       * buildid.c, buildid.sh, testfile42_noshdrs.bz2: New files.
+       * Makefile.am (check_PROGRAMS): Add buildid.
+       (TESTS): Add run-buildid.sh.
+       (EXTRA_DISTS): Add run-buildid.sh and testfile42_noshdrs.bz2.
+       (buildid_LDADD): New variable.
+
+2014-04-24  Florian Weimer  <fweimer@redhat.com>
+
+       * allfcts.c (setup_alt): New function.
+       (main): Call it.  Implementation additional error checking and
+       reporting.
+
+2014-04-24  Florian Weimer  <fweimer@redhat.com>
+
+       * debugaltlink.c, run-debugaltlink.sh: New files.
+       * Makefile.am (check_PROGRAMS): Add debugaltlink.
+       (TESTS): Add run-debugaltlink.sh.
+       (debugaltlink_LDADD): New variable.
+
+2014-04-11  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (AM_CPPFLAGS): Add -I libdwelf.
+       (check_PROGRAMS): Add debuglink.
+       (TESTS): Add run-debuglink.sh
+       (EXTRA_DIST): Likewise.
+       (debuglink_LDADD): New.
+       * debuglink.c: New file.
+       * run-debuglink.sh: Likewise.
+
+2014-03-23  Mark Wielaard  <mjw@redhat.com>
+
+       * run-nm-self.sh: Use test = not == for string comparisons.
+
+2014-04-22  Kurt Roeckx  <kurt@roeckx.be>
+
+       * backtrace.c: Make Linux only.
+       * backtrace-child.c: Make Linux only.
+       * backtrace-data.c: Make Linux only.
+       * backtrace-dwarf.c: Make Linux only.
+       * backtrace-subr.sh: Skip core file unwinding tests when not supported.
+
+2014-03-14  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: Remove MUDFLAP conditions. Remove libmudflap from all
+       LDADD lines.
+       * configure.ac: Remove MUDFLAP conditional.
+
+2014-04-09  Mark Wielaard  <mjw@redhat.com>
+
+       * run-readelf-zdebug.sh: New test.
+       * testfile-debug.bz2: New testfile.
+       * testfile-zdebug.bz2: New testfile.
+       * Makefile.am (TESTS): Add run-readelf-zdebug.sh if ZLIB.
+       (EXTRA_DIST): Add run-readelf-zdebug.sh, testfile-debug.bz2 and
+       testfile-zdebug.bz2.
+
+2014-04-10  Mark Wielaard  <mjw@redhat.com>
+
+       * testfile_i686_core.bz2: New test file.
+       * run-readelf-mixed-corenote.sh: Add testfile_i686_core test.
+       * Makefile.am (EXTRA_DIST): Add testfile_i686_core.bz2
+
+2014-04-09  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (TESTS): Add run-backtrace-core-aarch64.sh.
+       (EXTRA_DIST): Add run-backtrace-core-aarch64.sh,
+       backtrace.aarch64.core.bz2 and backtrace.aarch64.exec.bz2.
+       * run-backtrace-core-aarch64.sh: New test.
+
+2014-03-11  Josh Stone  <jistone@redhat.com>
+
+       * testfilebaxmin.bz2: New testfile.
+       * Makefile.am (EXTRA_DIST): Add testfilebaxmin.bz2.
+       * run-readelf-s.sh: Test testfilebaxmin.
+       * run-dwflsyms.sh: Likewise.
+
+2014-01-26  Mark Wielaard  <mjw@redhat.com>
+
+       * backtrace-subr.sh (check_unsupported): Special case arm*.
+
+2014-01-25  Mark Wielaard  <mjw@redhat.com>
+
+       * run-addrcfi.sh (EM_ARM): Change reg13 (sp) from undefined to
+       location expression: call_frame_cfa stack_value.
+
+2014-01-22  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (line2addr_no_Wformat): Removed.
+
+2014-01-21  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (TESTS): Add run-stack-i-test.sh.
+       (EXTRA_DIST): Likewise.
+       * run-stack-i-test.sh: New test.
+
+2014-01-20  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (TESTS): Add run-stack-d-test.sh.
+       (EXTRA_DIST): Add run-stack-d-test.sh, testfiledwarfinlines.bz2
+       testfiledwarfinlines.core.bz2.
+       * run-stack-d-test.sh: New test.
+       * testfiledwarfinlines.bz2: New test file.
+       * testfiledwarfinlines.core.bz2: Likewise.
+
+2014-01-16  Mark Wielaard  <mjw@redhat.com>
+
+       * run-nm-self.sh: Don't use testrun_on_self_quiet but just testrun
+       on one ET_REL, one ET_EXEC and one ET_DYN file.
+       * test-subr.sh (self_test_files): Add two ET_REL files, only add
+       two libebl ET_DYN backend files.
+
+2014-01-16  Mark Wielaard  <mjw@redhat.com>
+
+       * run-backtrace-demangle.sh: Check exitcode and max number of frames.
+
+2014-01-18  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Fix false FAILs on testsuite with ulimit -c unlimited.
+       * backtrace-child.c (sigusr2): Call pthread_exit.
+       (main): Return, do not call abort.
+
+2014-01-15  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Fix corruption of non-C++ symbols by the demangler.
+       * Makefile.am (TESTS): Add run-backtrace-demangle.sh.
+       <!DEMANGLE>: Add ELFUTILS_DISABLE_DEMANGLE export.
+       (EXTRA_DIST): Add run-backtrace-demangle.sh,
+       testfile-backtrace-demangle.bz2, testfile-backtrace-demangle.cc,
+       testfile-backtrace-demangle.core.bz2.
+       * backtrace-demangle.cc: New file.
+       * run-backtrace-demangle.sh: New file.
+       * testfile-backtrace-demangle.bz2: New file.
+       * testfile-backtrace-demangle.cc: New file.
+       * testfile-backtrace-demangle.core.bz2: New file.
+
+2014-01-07  Matthias Klose <doko@ubuntu.com>
+
+       * backtrace-subr.sh (check_native_core): Check to see if core file
+       was created without ".PID" extension, if so mv core to core.PID.
+       Skip test if no core file was created or could be found.
+
+2014-01-04  Mark Wielaard  <mjw@redhat.com>
+
+       * backtrace-data.c (main): Don't assert if raise returns.
+       * backtrace-dwarf.c (report_pid): Call dwfl_linux_proc_attach with
+       assume_ptrace_attached true.
+       (ptrace_detach_stopped): Removed function.
+       (main): Don't call ptrace_detach_stopped.
+       * backtrace.c (ptrace_detach_stopped): Removed function.
+       (report_pid): Call dwfl_linux_proc_attach with assume_ptrace_attached
+       true.
+       (exec_dump): Don't call ptrace_detach_stopped.
+
+2014-01-04  Mark Wielaard  <mjw@redhat.com>
+
+       * backtrace-subr.sh (check_native_core): Skip, exit 77, the test
+       if we cannot adjust core ulimit.
+
+2014-01-04  Mark Wielaard  <mjw@redhat.com>
+
+       * cleanup-13.c (force_unwind_stop): Removed.
+       (force_unwind): Just call abort. Don't setup _Unwind_Exception and
+       don't call _Unwind_ForcedUnwind.
+
+2014-01-03  Mark Wielaard  <mjw@redhat.com>
+
+       * run-addrcfi.sh: Add case for EM_AARCH64.
+       * testfileaarch64.bz2: New testfile.
+       * Makefile.am (EXTRA_DIST): Add testfilesaarch64.bz2.
+
+2013-12-30  Mark Wielaard  <mjw@redhat.com>
+
+       * backtrace-dwarf.c (report_pid): Explicitly call
+       dwfl_linux_proc_attach and check for errors.
+       * backtrace.c (report_pid): Likewise.
+
+2013-12-21  Mark Wielaard  <mjw@redhat.com>
+
+       * backtrace.c (callback_verify): Only assert that case 5 is the last
+       instruction of backtracegen on x86_64 native.
+
+2013-12-18  Jan Kratochvil  <jan.kratochvil@redhat.com>
+           Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (EXTRA_DIST): Add testfile66.bz2, testfile66.core.bz2
+       and testfilebaz*ppc64*.bz2 files.
+       * dwflsyms.c (list_syms): Remove unused from parameter mod_name.  Print
+       error on dwfl_module_getsymtab error.
+       (list_syms): Use dwfl_module_getsym and dwfl_module_getsym_info.
+       Compare values for non-ET_REL. Use dwfl_module_addrinfo.
+       Also print section of actual value if different from sym.
+       * run-addrname-test.sh (testfile66, testfile66.core): New tests.
+       Test addr2line -x by showing different sections for address and
+       found name in testfile66.
+       * run-dwflsyms.sh (testfile66, testfile66.core, hello_ppc64.ko,
+       testfilebaz*ppc64): New tests.
+       * testfile66.bz2, testfile66.core.bz2, testfilebazdbgppc64.bz2,
+       testfilebazdbgppc64.debug.bz2, testfilebazdbgppc64_pl.bz2,
+       testfilebazdbgppc64_plr.bz2, testfilebazdynppc64.bz2,
+       testfilebazmdbppc64.bz2, testfilebazminppc64.bz2,
+       testfilebazminppc64_pl.bz2, testfilebazminppc64_plr.bz2,
+       testfilebaztabppc64.bz2: New test files.
+
+2013-12-18  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       unwinder: s390 and s390x
+       * Makefile.am (TESTS): Add run-backtrace-core-s390x.sh and
+       run-backtrace-core-s390.sh.
+       (EXTRA_DIST): Add backtrace.s390x.core.bz2, backtrace.s390x.exec.bz2,
+       backtrace.s390.core.bz2, backtrace.s390.exec.bz2,
+       run-backtrace-core-s390x.sh and run-backtrace-core-s390.sh.
+       * backtrace.s390.core.bz2: New file.
+       * backtrace.s390.exec.bz2: New file.
+       * backtrace.s390x.core.bz2: New file.
+       * backtrace.s390x.exec.bz2: New file.
+       * run-backtrace-core-s390.sh: New file.
+       * run-backtrace-core-s390x.sh: New file.
+
+2013-12-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * backtrace-dwarf.c (executable, find_elf, dwfl_offline): Remove unused
+       code.
+
+2013-12-15  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       unwinder: ppc
+       * Makefile.am (TESTS): Add run-backtrace-core-ppc.sh.
+       (EXTRA_DIST): Add backtrace.ppc.core.bz2,
+       backtrace.ppc.exec.bz2 and run-backtrace-core-ppc.sh.
+       * backtrace.ppc.core.bz2: New file.
+       * backtrace.ppc.exec.bz2: New file.
+       * run-backtrace-core-ppc.sh: New file.
+
+2013-12-10  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (backtrace_child_biarch_SOURCES): New backtrace-child.c.
+
+2013-12-10  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (valgrind_cmd): Remove --trace-children=yes.
+       * backtrace-subr.sh (check_native_core): Disable valgrind while
+       dumping core.
+       * run-backtrace-data.sh: Disable valgrind.
+       * run-backtrace-dwarf.sh: Likewise.
+
+2013-12-09  Mark Wielaard  <mjw@redhat.com>
+
+       * varlocs.c (print_expr): Update comment to explain empty location
+       associated with DW_OP_GNU_implicit_pointer.
+
+2013-12-05  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Fix test FAIL with -O2.
+       * backtrace-child.c (sigusr2): Add NOINLINE_NOCLONE and final asm stub.
+
+2013-12-05  Mark Wielaard  <mjw@redhat.com>
+
+       * backtrace-data.c (main): If unsupported also print to stderr.
+       * run-backtrace-dwarf.sh: Add check_unsupported and check_main.
+
+2013-12-04  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (backtrace-child-biarch): Add $(EXEEXT).
+
+2013-12-02  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * Makefile.am (check_PROGRAMS): Add backtrace, backtrace-child,
+       backtrace-data and backtrace-dwarf.
+       (BUILT_SOURCES, clean-local, backtrace-child-biarch): New.
+       (TESTS): Add run-backtrace-native.sh, run-backtrace-data.sh,
+       run-backtrace-dwarf.sh, run-backtrace-native-biarch.sh,
+       run-backtrace-native-core.sh, run-backtrace-native-core-biarch.sh,
+       run-backtrace-core-x86_64.sh and run-backtrace-core-i386.sh.
+       <!BIARCH> Add export of ELFUTILS_DISABLE_BIARCH.
+       (EXTRA_DIST): Add run-backtrace-data.sh, run-backtrace-dwarf.sh,
+       cleanup-13.c, run-backtrace-native.sh, run-backtrace-native-biarch.sh,
+       run-backtrace-native-core.sh, run-backtrace-native-core-biarch.sh,
+       run-backtrace-core-x86_64.sh, run-backtrace-core-i386.sh,
+       backtrace-subr.sh, backtrace.i386.core.bz2, backtrace.i386.exec.bz2,
+       backtrace.x86_64.core.bz2, backtrace.x86_64.exec.bz2.
+       (backtrace_LDADD, backtrace_child_CFLAGS, backtrace_child_LDFLAGS)
+       (backtrace_data_LDADD, backtrace_dwarf_CFLAGS, backtrace_dwarf_LDADD):
+       New.
+       * backtrace-child.c: New file.
+       * backtrace-data.c: New file.
+       * backtrace-dwarf.c: New file.
+       * backtrace-subr.sh: New file.
+       * backtrace.c: New file.
+       * cleanup-13.c: New file.
+       * backtrace.i386.core.bz2: New file.
+       * backtrace.i386.exec.bz2: New file.
+       * backtrace.x86_64.core.bz2: New file.
+       * backtrace.x86_64.exec.bz2: New file.
+       * run-backtrace-core-i386.sh: New file.
+       * run-backtrace-core-x86_64.sh: New file.
+       * run-backtrace-native-biarch.sh: New file.
+       * run-backtrace-native-core-biarch.sh: New file.
+       * run-backtrace-native-core.sh: New file.
+       * run-backtrace-native.sh: New file.
+       * run-backtrace-data.sh: New file.
+       * run-backtrace-dwarf.sh: New file.
+
+2013-11-27  Mark Wielaard  <mjw@redhat.com>
+
+       * dwflsyms.c (gelf_bind_order): New function.
+       (elf_section_name): Likewise.
+       (addr_in_section): Likewise.
+       (list_syms): Use dwfl_module_getsym_elf and dwfl_module_addrsym_elf.
+       Refine assert using gelf_bind_order. Print elf_section_name. Check
+       bias with addr_in_section.
+       * run-dwflsyms.sh: Add section names to expected output.
+
+2013-11-26  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (EXTRA_DIST): Add run-funcretval.sh.
+
+2013-11-25  Petr Machata  <pmachata@redhat.com>
+
+       * testfile_aarch64_core.bz2, hello_aarch64.ko.bz2: New files.
+       * funcretval_test.c, funcretval_test_aarch64.bz2: Likewise.
+       * Makefile.am (EXTRA_DIST): Add these.
+       (TESTS): Add run-funcretval.sh.
+       * run-allregs.sh: Use testfile_aarch64_core.bz2 for a regs_test.
+       * run-readelf-mixed-corenote.sh: ... and for a readelf -n test.
+       * run-strip-reloc.sh: Add a test on hello_aarch64.ko.bz2.
+       * run-funcretval.sh: New file.
+
+2013-11-18  Josh Stone  <jistone@redhat.com>
+
+       * testfilebazdbg_plr.bz2: New testfile.
+       * testfilebazmin_plr.bz2: Likewise.
+       * Makefile.am (EXTRA_DIST): Add the above files.
+       * run-dwflsyms.sh: Add prelink -r tests.
+
+2013-11-15  Mark Wielaard  <mjw@redhat.com>
+
+       * testfilebazmdb.bz2: Regenerated.
+       * testfilebazmin.bz2: Likewise.
+       * testfilebazdbg_pl.bz2: New testfile.
+       * testfilebazmin_pl.bz2: Likewise.
+       * Makefile.am (EXTRA_DIST): Add testfilebazdbg_pl.bz2 and
+       testfilebazmin_pl.bz2.
+       * dwflsyms.c (list_syms): Call dwfl_module_relocate_address and
+       print relative address of function symbols.
+       * run-dwflsyms.sh: Add prelink tests and adjust expected output.
+
+2013-11-01  Michael Forney  <mforney@mforney.org>
+
+       * Makefile.am (TESTS_ENVIRONMENT): Use and export NM.
+       * run-arsymtest.sh: Use NM.
+
+2013-11-05  Mark Wielaard  <mjw@redhat.com>
+
+       * allfcts.c (main): Correct dwarf_getfuncs return value check.
+
+2013-10-10  Mark Wielaard  <mjw@redhat.com>
+           Josh Stone  <jistone@redhat.com>
+
+       * run-allfcts-multi.sh: New test.
+       * test-offset-loop.bz2: New testfile.
+       * test-offset-loop.alt.bz2: New testfile.
+       * Makefile.am (TESTS): Add run-allcft-multi.sh if ENABLE_DWZ.
+       (EXTRA_DIST): Add run-allfcts-multi.sh, test-offset-loop.bz2 and
+       test-offset-loop.alt.bz2.
+
+2013-10-15  Mark Wielaard  <mjw@redhat.com>
+
+       * run-unstrip-M.sh: New test.
+       * Makefile.am (TESTS): Add run-unstrip-M.sh.
+       (EXTRA_DIST): Likewise.
+
+2013-10-06  Mark Wielaard  <mjw@redhat.com>
+
+       * run-addrcfi.sh: Remove nop from expected ppc and ppc64
+       location expression.
+
+2013-10-03  Josh Stone  <jistone@redhat.com>
+
+       * typeiter2.c: New file, reversing typeiter.c.
+       * run-typeiter.sh: Also run typeiter2.
+       * Makefile.am (check_PROGRAMS): Add typeiter2.
+       (typeiter2_LDADD): New variable.
+
+2013-09-26  Petr Machata  <pmachata@redhat.com>
+
+       * run-readelf-mixed-corenote.sh: Update output of testfile71
+       dump--readelf can newly decode the NT_FILE note.
+
+2013-09-26  Petr Machata  <pmachata@redhat.com>
+
+       * Makefile.am (EXTRA_DIST): Add testfile71.bz2.
+       * run-readelf-mixed-corenote.sh: New test for this file.
+       * testfile71.bz2: New file.
+
+2013-09-20  Mark Wielaard  <mjw@redhat.com>
+
+       * allfcts.c (cb): Return DWARF_CB_ABORT.
+       (main): Iterate over all offsets returned by dwarf_getfuncs.
+       * run-allfcts.sh: Add nested_funcs and class_func testcases.
+       * testfile_nested_funcs.bz2: New test file.
+       * testfile_class_func.bz2: Likewise.
+       * Makefile.am (EXTRA_DIST): Add testfile_class_func.bz2 and
+       testfile_nested_funcs.bz2.
+
+2013-08-30  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (check_PROGRAMS): Add varlocs.
+       (TESTS): Add run-varlocs.sh.
+       (EXTRA_DIST): Add run-varlocs.sh, testfile_const_type.c,
+       testfile_const_type.bz2, testfile_implicit_pointer.c,
+       testfile_implicit_pointer.bz2, testfile_parameter_ref.c,
+       testfile_entry_value.c, testfile_entry_value.bz2,
+       testfile_implicit_value.c and testfile_implicit_value.bz2.
+       (varlocs_LDADD): New.
+       * run-varlocs: New test.
+       * testfile_const_type.c: New test source file.
+       * testfile_entry_value.c: Likewise.
+       * testfile_implicit_pointer.c: Likewise.
+       * testfile_implicit_value.c: Likewise.
+       * testfile_parameter_ref.c: Likewise.
+       * testfile_const_type.bz2: New test file.
+       * testfile_entry_value.bz2: Likewise.
+       * testfile_implicit_pointer.bz2: Likewise.
+       * testfile_implicit_value.bz2: Likewise.
+       * testfile_parameter_ref.bz2: Likewise.
+       * varlocs.c: New test source.
+
+2013-08-29  Mark Wielaard  <mjw@redhat.com>
+
+       * run-addrcfi.sh: Add case for EM_ARM.
+       * testfilearm.bz2: New testfile.
+       * Makefile.am (EXTRA_DIST): Add testfilesarm.bz2.
+
+2013-08-28  Mark Wielaard  <mjw@redhat.com>
+
+       * addrcfi.c (handle_cfi): Handle .debug_frame or .eh_frame
+       completely missing.
+       * run-addrcfi.sh: Add case for EM_S390 ELFCLASS32 and ELFCLASS64.
+       * testfiles390.bz2: New testfile.
+       * testfiles390x.bz2: Likewise.
+       * Makefile.am (EXTRA_DIST): Add testfiles390.bz2 and
+       testfiles390x.bz2.
+
+2013-08-28  Mark Wielaard  <mjw@redhat.com>
+
+       * addrcfi.c (handle_cfi): Use printf not error.
+       * run-addrcfi.sh: Add case for EM_PPC and EM_PPC64.
+       * testfileppc32.bz2: New testfile.
+       * testfileppc64.bz2: Likewise.
+       * Makefile.am (EXTRA_DIST): Add testfileppc32.bz2 and
+       testfileppc64.bz2.
+
+2013-08-27  Mark Wielaard  <mjw@redhat.com>
+
+       * run-addrcfi.sh: New test.
+       * Makefile.am (TESTS): Add run-addrcfi.sh.
+       (EXTRA_DIST): Likewise.
+       * addrcfi.c (op_name): New function.
+       (print_detail): Call and print op_name. Check ops, not result
+       to check if this is "same value" or "undefined".
+       (handle_cfi): Make sure cfa_ops doesn't point to NULL.
+
+2013-08-13  Mark Wielaard  <mjw@redhat.com>
+
+       * run-addr2line-i-test.sh: New test.
+       * testfile-inlines.bz2: New testfile.
+       * Makefile.am (EXTRA_DIST): Add run-addr2line-i-test.sh and
+       testfile-inlines.bz2.
+       (TESTS): Add run-addr2line-i-test.sh.
+
+2013-08-12  Mark Wielaard  <mjw@redhat.com>
+
+       * run-addr2line-test.sh: New test.
+       * Makefile.am (EXTRA_DIST): Add run-addr2line-test.sh.
+       (TESTS): Likewise.
+
+2013-07-23  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * run-unstrip-n.sh (test-core.*): Ignore libc.so.6 entry and order of
+       the entries.
+
+2013-07-02  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (EXTRA_DIST): Fix typo, forgot extension in
+       testfilenolines.bz2.
+
+2013-05-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * Makefile.am (EXTRA_DIST): Add test-core-lib.so.bz2,
+       test-core.core.bz2 and test-core.exec.bz2.
+       * run-addrname-test.sh: New test for these files.
+       * run-unstrip-n.sh: Update expected output.  New test for these files.
+       * test-core-lib.so.bz2: New file.
+       * test-core.core.bz2: New file.
+       * test-core.exec.bz2: New file.
+
+2013-05-03  Mark Wielaard  <mjw@redhat.com>
+
+       * testfilenolines.bz2: New test file.
+       * Makefile.am (EXTRA_DIST): Add testfilenolines.bz2.
+       * run-get-lines.sh: Run testrun_compare on testfilenolines.
+
+2013-04-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * dwfl-report-elf-align.c: Use false add_p_vaddr for dwfl_report_elf.
+
+2013-04-29  Mark Wielaard  <mjw@redhat.com>
+
+       * test-subr.sh: Don't use pushd, just cd into test-dir.
+       (exit_cleanup): Don't use popd, just cd .. to get out.
+
+2013-04-27  Mark Wielaard  <mjw@redhat.com>
+
+       * test-subr.sh (exit_cleanup): New function.
+       (trap): Use exit_cleanup as argument.
+       * run-native-test.sh (native_exit): New function.
+       (trap): For EXIT (0) use native_exit as argument.
+
+2013-04-27  Mark Wielaard  <mjw@redhat.com>
+
+       * update1.c (main): Use unique tempfile name and unlink file.
+       * update2.c (main): Likewise.
+       * update3.c (main): Likewise.
+       * update4.c (main): Use unique tempfile name.
+
+2013-04-27  Mark Wielaard  <mjw@redhat.com>
+
+       * run-alldts.sh: Add testfile-alldts to tempfiles.
+       * run-elf_cntl_gelf_getshdr.sh: Add test_shdr.out to tempfiles.
+       * run-macro-test.sh: Add readelf.macros.out to tempfiles.
+       * run-strip-reloc.sh: Add readelf.out, readelf.out1, readelf.out2
+       and out.stripped1, out.debug1, out.stripped2, out.debug2 to tempfiles.
+
+2013-04-26  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (installed_TESTS_ENVIRONMENT): Export environment,
+       remove wrapper.
+       (TESTS_ENVIRONMENT): Likewise.
+       (installed_LOG_COMPILER): New variable defining wrapper.
+       (LOG_COMPILER): Likewise.
+       * run-*.sh: Fixup location of input and output files.
+       * test-subr.sh: Create test_dir, pushd to execute test in.
+       (trap): Remove test_dir.
+       (testfiles): Use abs_srcdir.
+       (installed_testrun): Match on abs_builddir or abs_top_builddir.
+       (self_test_files): Adjust path.
+
+2013-04-24  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am: Use AM_CPPFLAGS instead of INCLUDES.
+
+2013-03-25  Mark Wielaard  <mjw@redhat.com>
+
+       * run-readelf-aranges.sh: New test.
+       * testfilefoobarbaz.bz2: New test file.
+       * Makefile.am (TESTS): Add run-readelf-aranges.sh.
+       (EXTRA_DIST): Add run-readelf-aranges.sh and testfilefoobarbaz.bz2.
+
+2013-03-25  Mark Wielaard  <mjw@redhat.com>
+
+       * run-readelf-dwz-multi.sh: Expect high_pc also as address.
+
+2013-03-20  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * Makefile.am (check_PROGRAMS): Add dwfl-report-elf-align.
+       (TESTS): Add run-dwfl-report-elf-align.sh.
+       (EXTRA_DIST): Add run-dwfl-report-elf-align.sh and
+       testfile-dwfl-report-elf-align-shlib.so.bz2 .
+       (dwfl_report_elf_align_LDADD): New.
+       * dwfl-report-elf-align.c: New file.
+       * run-dwfl-report-elf-align.sh: New file.
+       * testfile-dwfl-report-elf-align-shlib.so.bz2: New file.
+
+2013-03-12  Mark Wielaard  <mjw@redhat.com>
+
+       * run-dwfllines.sh: New test.
+       * dwfllines.c: New test program.
+       * Makefile.am (TESTS): Add run-dwfllines.sh.
+       (EXTRA_DIST): Likewise.
+       (dwfllines_LDADD): New variable.
+
+2013-02-22  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (TESTS): Remove run-readelf-s.sh and run-dwflsyms.sh.
+       (LZMA): Add run-readelf-s.sh and run-dwflsyms.sh to TESTS.
+
+2013-02-15  Mark Wielaard  <mjw@redhat.com>
+
+       * testfile-dwzstr.bz2: New testfile.
+       * testfile-dwzstr.multi.bz2: Likewise.
+       * run-readelf-dwz-multi.sh: Add readelf testfile-dwzstr test.
+       * Makefile.am (EXTRA_DIST): Add testfile-dwzstr.bz2 and
+       testfile-dwzstr.multi.bz2.
+
+2013-01-30  Mark Wielaard  <mjw@redhat.com>
+
+       * testfileloc.bz2: New testfile.
+       * run-readelf-loc.sh: New test.
+       * Makefile.am (TESTS): Add run-readelf-loc.sh.
+       (EXTRA_DIST): Add run-readelf-loc.sh and testfileloc.bz2.
+
+2013-01-29  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * run-readelf-mixed-corenote.sh: New testcase for readelf -n of s390
+       and s390x core notes.
+       * testfile67.bz2: New file.
+       * testfile68.bz2: New file.
+       * Makefile.am (EXTRA_DIST): Add testfile67.bz2 and testfile68.bz2 .
+
+2013-01-23  Mark Wielaard  <mjw@redhat.com>
+
+       * testfilebasmin.bz2: New testfile.
+       * Makefile.am (EXTRA_DIST): Add testfilebasmin.bz2.
+       * run-readelf-s.sh: Test testfilebasmin.
+       * run-dwflsyms.sh: Likewise.
+
+2013-01-16  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (check_PROGRAMS): Add dwflsyms.
+       (TESTS): Add run-readelf-s.sh and run-dwflsyms.sh.
+       (EXTRA_DIST): Add run-readelf-s.sh, testfilebazdbg.bz2,
+       testfilebazdyn.bz2, testfilebazmin.bz2, testfilebazdbg.debug.bz2,
+       testfilebazmdb.bz2, testfilebaztab.bz2 and run-dwflsyms.sh.
+       (dwflsyms_LDADD): New variable.
+
+2013-01-07  Roland McGrath  <roland@hack.frob.com>
+
+       * run-prelink-addr-test.sh: Use ln -snf.
+
+2012-12-03  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (valgrind_cmd): Add --run-libc-freeres=no.
+
+2012-11-29  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * run-addrname-test.sh: New test for PIE relocation.
+       * testfile70.core.bz2: New file.
+       * testfile70.exec.bz2: New file.
+       * Makefile.am (EXTRA_DIST): Add testfile70.core.bz2 and
+       testfile70.exec.bz2 .
+
+2012-10-27  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * Makefile.am (EXTRA_DIST): Add testfile64.bz2, testfile65.bz2,
+       testfile69.core.bz2 and testfile69.so.bz2 .
+
+2012-10-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * run-addrname-test.sh: New test for DSO with build-id bias.
+       * testfile69.core.bz2: New file.
+       * testfile69.so.bz2: New file.
+
+2012-10-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * run-addrname-test.sh: New test for core vDSO bias.
+       * testfile65.bz2: New file.
+
+2012-10-10  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * run-addrname-test.sh: New test for symbol preferences.
+       * testfile64.bz2: New file.
+
+2012-10-01  Mark Wielaard  <mjw@redhat.com>
+
+       * Makefile.am (TESTS_ENVIRONMENT): Define valgrind_cmd if USE_VALGRIND.
+       * test-wrapper.sh: Export VALGRIND_CMD if available.
+       * test-subr.sh (built_testrun): Use VALGRIND_CMD to invoke test prog.
+       (installed_testrun): Likewise.
+
+2012-09-24  Petr Machata  <pmachata@redhat.com>
+
+       * testfile63.bz2: New testfile.
+       * run-readelf-mixed-corenote.sh: New test.
+       * Makefile.am (TEST): Add run-readelf-mixed-corenote.sh.
+       (EXTRA_DIST): Add testfile63.bz2 and run-readelf-mixed-corenote.sh.
+
+2012-09-24  Petr Machata  <pmachata@redhat.com>
+
+       * testfile62.bz2: New testfile.
+       * run-readelf-vmcoreinfo.sh: New test.
+       * Makefile.am (TEST): Add run-readelf-vmcoreinfo.sh.
+       (EXTRA_DIST): Add testfile62.bz2 and run-readelf-vmcoreinfo.sh.
+
+2012-09-18  Petr Machata  <pmachata@redhat.com>
+
+       * testfile61.bz2: New testfile.
+       * run-allregs.sh: Run reg_test testfile61.
+       * Makefile.am (EXTRA_DIST): Add testfile61.bz2.
+
 2012-08-24  Mark Wielaard  <mjw@redhat.com>
 
        * Makefile.am (EXTRA_DIST): Add testfile60.bz2.
index d8783e5..4cc81c9 100644 (file)
@@ -1,6 +1,6 @@
 ## Process this file with automake to create Makefile.in
 ##
-## Copyright (C) 1996-2012 Red Hat, Inc.
+## Copyright (C) 1996-2014 Red Hat, Inc.
 ## This file is part of elfutils.
 ##
 ## This file is free software; you can redistribute it and/or modify
 ## along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ##
 include $(top_srcdir)/config/eu.am
-if MUDFLAP
-BUILD_RPATH = \$$ORIGIN/../backends
-else
 BUILD_RPATH = \$$ORIGIN/../libasm:\$$ORIGIN/../libdw:\$$ORIGIN/../backends:\$$ORIGIN/../libelf
-endif
 
 AM_LDFLAGS =
 
 if !STANDALONE
-INCLUDES += -I$(top_srcdir)/libasm -I$(top_srcdir)/libdw \
-           -I$(top_srcdir)/libdwfl \
+AM_CPPFLAGS += -I$(top_srcdir)/libasm -I$(top_srcdir)/libdw \
+           -I$(top_srcdir)/libdwfl -I$(top_srcdir)/libdwelf \
            -I$(top_srcdir)/libebl -I$(top_srcdir)/libelf \
            -I$(top_srcdir)/lib -I..
 AM_LDFLAGS += -Wl,-rpath-link,../libasm:../libdw:../libelf
@@ -50,11 +46,27 @@ check_PROGRAMS = arextract arsymtest newfile saridx scnnames sectiondump \
                  dwfl-addr-sect dwfl-bug-report early-offscn \
                  dwfl-bug-getmodules dwarf-getmacros addrcfi \
                  test-flag-nobits dwarf-getstring rerequest_tag \
-                 alldts md5-sha1-test typeiter low_high_pc \
-                 test-elf_cntl_gelf_getshdr
+                 alldts md5-sha1-test typeiter typeiter2 low_high_pc \
+                 test-elf_cntl_gelf_getshdr dwflsyms dwfllines \
+                 dwfl-report-elf-align varlocs backtrace backtrace-child \
+                 backtrace-data backtrace-dwarf debuglink debugaltlink \
+                 buildid
+
 asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \
            asm-tst6 asm-tst7 asm-tst8 asm-tst9
 
+if BIARCH
+check_PROGRAMS += backtrace-child-biarch
+endif
+
+# Substitute $(COMPILE).
+backtrace-child-biarch$(EXEEXT): backtrace-child.c
+       $(CC_BIARCH) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+                    $(AM_CPPFLAGS) $(CPPFLAGS) \
+                    $(AM_CFLAGS) $(CFLAGS) $(backtrace_child_CFLAGS) \
+                    $(AM_LDFLAGS) $(LDFLAGS) $(backtrace_child_LDFLAGS) \
+                    -o $@ $<
+
 TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \
        update1 update2 update3 update4 \
        run-show-die-info.sh run-get-files.sh run-get-lines.sh \
@@ -64,17 +76,19 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \
        run-strip-test3.sh run-strip-test4.sh run-strip-test5.sh \
        run-strip-test6.sh run-strip-test7.sh run-strip-test8.sh \
        run-strip-groups.sh run-strip-reloc.sh \
-       run-unstrip-test.sh run-unstrip-test2.sh \
+       run-unstrip-test.sh run-unstrip-test2.sh run-unstrip-M.sh \
        run-ecp-test.sh run-ecp-test2.sh run-alldts.sh \
        run-elflint-test.sh run-elflint-self.sh run-ranlib-test.sh \
        run-ranlib-test2.sh run-ranlib-test3.sh run-ranlib-test4.sh \
        run-addrscopes.sh run-strings-test.sh run-funcscopes.sh \
-       run-find-prologues.sh run-allregs.sh \
+       run-find-prologues.sh run-allregs.sh run-addrcfi.sh \
        run-nm-self.sh run-readelf-self.sh \
        run-readelf-test1.sh run-readelf-test2.sh run-readelf-test3.sh \
        run-readelf-test4.sh run-readelf-twofiles.sh \
-       run-readelf-macro.sh \
+       run-readelf-macro.sh run-readelf-loc.sh \
+       run-readelf-aranges.sh run-readelf-line.sh \
        run-native-test.sh run-bug1-test.sh \
+       run-debuglink.sh run-debugaltlink.sh run-buildid.sh \
        dwfl-bug-addr-overflow run-addrname-test.sh \
        dwfl-bug-fd-leak dwfl-bug-report \
        run-dwfl-bug-offline-rel.sh run-dwfl-addr-sect.sh \
@@ -84,22 +98,44 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \
        run-dwarf-getstring.sh run-rerequest_tag.sh run-typeiter.sh \
        run-readelf-d.sh run-readelf-gdb_index.sh run-unstrip-n.sh \
        run-low_high_pc.sh run-macro-test.sh run-elf_cntl_gelf_getshdr.sh \
-       run-test-archive64.sh
+       run-test-archive64.sh run-readelf-vmcoreinfo.sh \
+       run-readelf-mixed-corenote.sh run-dwfllines.sh \
+       run-dwfl-report-elf-align.sh run-addr2line-test.sh \
+       run-addr2line-i-test.sh run-varlocs.sh run-funcretval.sh \
+       run-backtrace-native.sh run-backtrace-data.sh run-backtrace-dwarf.sh \
+       run-backtrace-native-biarch.sh run-backtrace-native-core.sh \
+       run-backtrace-native-core-biarch.sh run-backtrace-core-x86_64.sh \
+       run-backtrace-core-i386.sh run-backtrace-core-ppc.sh \
+       run-backtrace-core-s390x.sh run-backtrace-core-s390.sh \
+       run-backtrace-core-aarch64.sh \
+       run-backtrace-demangle.sh run-stack-d-test.sh run-stack-i-test.sh \
+       run-readelf-dwz-multi.sh run-allfcts-multi.sh
+
+if !BIARCH
+export ELFUTILS_DISABLE_BIARCH = 1
+endif
+
+if !DEMANGLE
+export ELFUTILS_DISABLE_DEMANGLE = 1
+endif
 
 if !STANDALONE
 check_PROGRAMS += msg_tst md5-sha1-test
 TESTS += msg_tst md5-sha1-test
 endif
 
-if HAVE_LIBASM
-check_PROGRAMS += $(asm_TESTS)
-TESTS += $(asm_TESTS)
+if LZMA
+TESTS += run-readelf-s.sh run-dwflsyms.sh
 endif
 
-if ENABLE_DWZ
-TESTS += run-readelf-dwz-multi.sh
+if ZLIB
+TESTS += run-readelf-zdebug.sh
 endif
 
+if HAVE_LIBASM
+check_PROGRAMS += $(asm_TESTS)
+TESTS += $(asm_TESTS)
+endif
 
 EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
             run-show-die-info.sh run-get-files.sh run-get-lines.sh \
@@ -110,16 +146,17 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
             testfile5.bz2 testfile6.bz2 testfile7.bz2 testfile8.bz2 \
             testfile9.bz2 testfile10.bz2 testfile11.bz2 testfile12.bz2 \
             testfile13.bz2 run-strip-test3.sh run-allfcts.sh \
+            testfile_class_func.bz2 testfile_nested_funcs.bz2 \
             run-line2addr.sh run-elflint-test.sh testfile14.bz2 \
             run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \
             run-strip-test7.sh run-strip-test8.sh run-strip-groups.sh \
             run-strip-reloc.sh hello_i386.ko.bz2 hello_x86_64.ko.bz2 \
-            hello_ppc64.ko.bz2 hello_s390.ko.bz2 \
-            run-unstrip-test.sh run-unstrip-test2.sh \
+            hello_ppc64.ko.bz2 hello_s390.ko.bz2 hello_aarch64.ko.bz2 \
+            run-unstrip-test.sh run-unstrip-test2.sh run-unstrip-M.sh\
             run-elflint-self.sh run-ranlib-test.sh run-ranlib-test2.sh \
             run-ranlib-test3.sh run-ranlib-test4.sh \
             run-addrscopes.sh run-strings-test.sh run-funcscopes.sh \
-            run-nm-self.sh run-readelf-self.sh \
+            run-nm-self.sh run-readelf-self.sh run-addrcfi.sh \
             run-find-prologues.sh run-allregs.sh run-native-test.sh \
             run-addrname-test.sh run-dwfl-bug-offline-rel.sh \
             run-dwfl-addr-sect.sh run-early-offscn.sh \
@@ -137,20 +174,27 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
             run-readelf-test1.sh run-readelf-test2.sh run-readelf-test3.sh \
             run-readelf-test4.sh run-readelf-twofiles.sh \
             run-bug1-test.sh testfile28.bz2 testfile28.rdwr.bz2 \
+            run-debuglink.sh run-debugaltlink.sh run-buildid.sh \
             testfile29.bz2 testfile29.rdwr.bz2 \
             testfile30.bz2 testfile31.bz2 testfile32.bz2 testfile33.bz2 \
             testfile34.bz2 testfile35.bz2 testfile35.debug.bz2 \
             testfile36.bz2 testfile36.debug.bz2 \
             testfile37.bz2 testfile37.debug.bz2 \
             testfile38.bz2 testfile39.bz2 testfile40.bz2 testfile40.debug.bz2 \
-            testfile41.bz2 testfile42.bz2 testfile43.bz2 \
+            testfile41.bz2 testfile42.bz2 testfile42_noshdrs.bz2 \
+            testfile43.bz2 \
             testfile44.S.bz2 testfile44.expect.bz2 run-disasm-x86.sh \
             testfile45.S.bz2 testfile45.expect.bz2 run-disasm-x86-64.sh \
             testfile46.bz2 testfile47.bz2 testfile48.bz2 testfile48.debug.bz2 \
             testfile49.bz2 testfile50.bz2 testfile51.bz2 \
             run-readelf-macro.sh testfilemacro.bz2 \
+            run-readelf-loc.sh testfileloc.bz2 \
+            run-readelf-aranges.sh run-readelf-line.sh testfilefoobarbaz.bz2 \
             run-readelf-dwz-multi.sh libtestfile_multi_shared.so.bz2 \
             testfile_multi.dwz.bz2 testfile_multi_main.bz2 \
+            testfile-dwzstr.bz2 testfile-dwzstr.multi.bz2 \
+            run-allfcts-multi.sh \
+            test-offset-loop.bz2 test-offset-loop.alt.bz2 \
             run-prelink-addr-test.sh \
             testfile52-32.so.bz2 testfile52-32.so.debug.bz2 \
             testfile52-32.prelink.so.bz2 testfile52-32.noshdrs.so.bz2 \
@@ -171,34 +215,104 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
             run-readelf-d.sh testlib_dynseg.so.bz2 \
             run-readelf-gdb_index.sh testfilegdbindex5.bz2 \
             testfilegdbindex7.bz2 \
+            run-readelf-s.sh testfilebazdbg.bz2 testfilebazdyn.bz2 \
+            testfilebazmin.bz2 testfilebazdbg.debug.bz2 testfilebazmdb.bz2 \
+            testfilebaztab.bz2 testfilebasmin.bz2 testfilebaxmin.bz2 \
+            testfilebazdbg_pl.bz2 testfilebazmin_pl.bz2 \
+            testfilebazdbg_plr.bz2 testfilebazmin_plr.bz2 \
+            testfilebazdbgppc64.bz2 testfilebazdbgppc64.debug.bz2 \
+            testfilebazdbgppc64_pl.bz2 testfilebazdbgppc64_plr.bz2 \
+            testfilebazdynppc64.bz2 testfilebazmdbppc64.bz2 \
+            testfilebazminppc64.bz2 testfilebazminppc64_pl.bz2 \
+            testfilebazminppc64_plr.bz2 testfilebaztabppc64.bz2 \
+            run-dwflsyms.sh \
             run-unstrip-n.sh testcore-rtlib.bz2 testcore-rtlib-ppc.bz2 \
             run-low_high_pc.sh testfile_low_high_pc.bz2 \
             run-macro-test.sh testfile-macinfo.bz2 testfile-macros.bz2 \
             run-elf_cntl_gelf_getshdr.sh \
             run-test-archive64.sh testarchive64.a.bz2 \
-            testfile60.bz2
+            testfile60.bz2 testfile61.bz2 \
+            run-readelf-vmcoreinfo.sh testfile62.bz2 \
+            run-readelf-mixed-corenote.sh testfile63.bz2 testfile64.bz2 \
+            testfile65.bz2 testfile67.bz2 testfile68.bz2 \
+            testfile69.core.bz2 testfile69.so.bz2 \
+            testfile70.core.bz2 testfile70.exec.bz2 testfile71.bz2 \
+            run-dwfllines.sh run-dwfl-report-elf-align.sh \
+            testfile-dwfl-report-elf-align-shlib.so.bz2 \
+            testfilenolines.bz2 test-core-lib.so.bz2 test-core.core.bz2 \
+            test-core.exec.bz2 run-addr2line-test.sh \
+            run-addr2line-i-test.sh testfile-inlines.bz2 \
+            testfileppc32.bz2 testfileppc64.bz2 \
+            testfiles390.bz2 testfiles390x.bz2 \
+            testfilearm.bz2 testfileaarch64.bz2 \
+            run-varlocs.sh \
+            testfile_const_type.c testfile_const_type.bz2 \
+            testfile_implicit_pointer.c testfile_implicit_pointer.bz2 \
+            testfile_parameter_ref.c testfile_parameter_ref.bz2 \
+            testfile_entry_value.c testfile_entry_value.bz2 \
+            testfile_implicit_value.c testfile_implicit_value.bz2 \
+            testfile_aarch64_core.bz2 testfile_i686_core.bz2 \
+            run-funcretval.sh funcretval_test.c funcretval_test_aarch64.bz2 \
+            run-backtrace-data.sh run-backtrace-dwarf.sh cleanup-13.c \
+            run-backtrace-native.sh run-backtrace-native-biarch.sh \
+            run-backtrace-native-core.sh run-backtrace-native-core-biarch.sh \
+            run-backtrace-core-x86_64.sh run-backtrace-core-i386.sh \
+            backtrace-subr.sh backtrace.i386.core.bz2 backtrace.i386.exec.bz2 \
+            backtrace.x86_64.core.bz2 backtrace.x86_64.exec.bz2 \
+            backtrace.ppc.core.bz2 backtrace.ppc.exec.bz2 \
+            run-backtrace-core-ppc.sh testfile66.bz2 testfile66.core.bz2 \
+            backtrace.s390x.core.bz2 backtrace.s390x.exec.bz2 \
+            backtrace.s390.core.bz2 backtrace.s390.exec.bz2 \
+            run-backtrace-core-s390x.sh run-backtrace-core-s390.sh \
+            run-backtrace-core-aarch64.sh \
+            backtrace.aarch64.core.bz2 backtrace.aarch64.exec.bz2 \
+            run-backtrace-demangle.sh testfile-backtrace-demangle.bz2 \
+            testfile-backtrace-demangle.cc \
+            testfile-backtrace-demangle.core.bz2 \
+            run-stack-d-test.sh run-stack-i-test.sh \
+            testfiledwarfinlines.bz2 testfiledwarfinlines.core.bz2 \
+            run-readelf-zdebug.sh testfile-debug.bz2 testfile-zdebug.bz2
 
-installed_TESTS_ENVIRONMENT = libdir=$(DESTDIR)$(libdir) \
-                             bindir=$(DESTDIR)$(bindir) \
-                             LC_ALL=C LANG=C \
-                             $(srcdir)/test-wrapper.sh \
-                             installed $(tests_rpath) \
-                             $(program_transform_name)
+if USE_VALGRIND
+valgrind_cmd='valgrind -q --error-exitcode=1 --run-libc-freeres=no'
+endif
+
+
+installed_TESTS_ENVIRONMENT = libdir=$(DESTDIR)$(libdir); \
+                             bindir=$(DESTDIR)$(bindir); \
+                             LC_ALL=C; LANG=C; \
+                             VALGRIND_CMD=$(valgrind_cmd); \
+                             abs_srcdir=$(abs_srcdir); \
+                             abs_builddir=$(abs_builddir); \
+                             abs_top_builddir=$(abs_top_builddir); \
+                             export abs_srcdir; export abs_builddir; \
+                             export abs_top_builddir; \
+                             export libdir; export bindir; \
+                             export LC_ALL; export LANG; export VALGRIND_CMD; \
+                             NM=$(NM); export NM;
+installed_LOG_COMPILER = $(abs_srcdir)/test-wrapper.sh \
+                        installed $(tests_rpath) \
+                        '$(program_transform_name)'
 if STANDALONE
 TESTS_ENVIRONMENT = $(installed_TESTS_ENVIRONMENT)
+LOG_COMPILER = $(installed_LOG_COMPILER)
 else !STANDALONE
-TESTS_ENVIRONMENT = LC_ALL=C LANG=C $(srcdir)/test-wrapper.sh \
-                   ../libdw:../backends:../libelf:../libasm
+TESTS_ENVIRONMENT = LC_ALL=C; LANG=C; VALGRIND_CMD=$(valgrind_cmd); \
+                   abs_srcdir=$(abs_srcdir);  abs_builddir=$(abs_builddir); \
+                   abs_top_builddir=$(abs_top_builddir); \
+                   export abs_srcdir; export abs_builddir; \
+                   export abs_top_builddir; \
+                   export LC_ALL; export LANG; export VALGRIND_CMD; \
+                   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
 
 installcheck-local:
        $(MAKE) $(AM_MAKEFLAGS) \
-               TESTS_ENVIRONMENT='$(installed_TESTS_ENVIRONMENT)' check-TESTS
+               TESTS_ENVIRONMENT="$(installed_TESTS_ENVIRONMENT)" \
+               LOG_COMPILER="$(installed_LOG_COMPILER)" check-TESTS
 endif !STANDALONE
 
-if MUDFLAP
-static_build = yes
-endif
-
 if STANDALONE
 libdw = -ldw
 libelf = -lelf
@@ -218,65 +332,80 @@ libebl = ../libebl/libebl.a
 libeu = ../lib/libeu.a
 endif !STANDALONE
 
-arextract_LDADD = $(libelf) $(libmudflap)
-arsymtest_LDADD = $(libelf) $(libmudflap)
-newfile_LDADD = $(libelf) $(libmudflap)
-saridx_LDADD = $(libelf) $(libmudflap)
-scnnames_LDADD = $(libelf) $(libmudflap)
-sectiondump_LDADD = $(libelf) $(libmudflap)
-showptable_LDADD = $(libelf) $(libmudflap)
-hash_LDADD = $(libelf) $(libmudflap)
-test_nlist_LDADD = $(libelf) $(libmudflap)
-msg_tst_LDADD = $(libelf) $(libmudflap)
-newscn_LDADD = $(libelf) $(libmudflap)
-early_offscn_LDADD = $(libelf) $(libmudflap)
-ecp_LDADD = $(libelf) $(libmudflap)
-update1_LDADD = $(libelf) $(libmudflap)
-update2_LDADD = $(libelf) $(libmudflap)
-update3_LDADD = $(libebl) $(libelf) $(libmudflap)
-update4_LDADD = $(libebl) $(libelf) $(libmudflap)
-show_die_info_LDADD = $(libdw) $(libelf) $(libmudflap)
-get_pubnames_LDADD = $(libdw) $(libelf) $(libmudflap)
-show_abbrev_LDADD = $(libdw) $(libelf) $(libmudflap)
-get_lines_LDADD = $(libdw) $(libelf) $(libmudflap)
-get_files_LDADD = $(libdw) $(libelf) $(libmudflap)
-get_aranges_LDADD = $(libdw) $(libelf) $(libmudflap)
-allfcts_LDADD = $(libdw) $(libelf) $(libmudflap)
-line2addr_no_Wformat = yes
-line2addr_LDADD = $(libdw) $(libmudflap)
-addrscopes_LDADD = $(libdw) $(libmudflap)
-funcscopes_LDADD = $(libdw) $(libmudflap)
-funcretval_LDADD = $(libdw) $(libmudflap)
-allregs_LDADD = $(libdw) $(libmudflap)
-find_prologues_LDADD = $(libdw) $(libmudflap)
-#show_ciefde_LDADD = ../libdwarf/libdwarf.so $(libelf) $(libmudflap)
-asm_tst1_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-asm_tst2_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-asm_tst3_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-asm_tst4_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-asm_tst5_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-asm_tst6_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-asm_tst7_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-asm_tst8_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-asm_tst9_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-dwflmodtest_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl
-rdwrmmap_LDADD = $(libelf) $(libmudflap)
-dwfl_bug_addr_overflow_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl
-arls_LDADD = $(libelf) $(libmudflap)
-dwfl_bug_fd_leak_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl
-dwfl_bug_report_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl
-dwfl_bug_getmodules_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl
-dwfl_addr_sect_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl
-dwarf_getmacros_LDADD = $(libdw) $(libmudflap)
-dwarf_getstring_LDADD = $(libdw) $(libmudflap)
-addrcfi_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl
-test_flag_nobits_LDADD = $(libelf) $(libmudflap)
-rerequest_tag_LDADD = $(libdw) $(libmudflap)
-alldts_LDADD = $(libebl) $(libelf) $(libmudflap)
+arextract_LDADD = $(libelf)
+arsymtest_LDADD = $(libelf)
+newfile_LDADD = $(libelf)
+saridx_LDADD = $(libelf)
+scnnames_LDADD = $(libelf)
+sectiondump_LDADD = $(libelf)
+showptable_LDADD = $(libelf)
+hash_LDADD = $(libelf)
+test_nlist_LDADD = $(libelf)
+msg_tst_LDADD = $(libelf)
+newscn_LDADD = $(libelf)
+early_offscn_LDADD = $(libelf)
+ecp_LDADD = $(libelf)
+update1_LDADD = $(libelf)
+update2_LDADD = $(libelf)
+update3_LDADD = $(libebl) $(libelf)
+update4_LDADD = $(libebl) $(libelf)
+show_die_info_LDADD = $(libdw) $(libelf)
+get_pubnames_LDADD = $(libdw) $(libelf)
+show_abbrev_LDADD = $(libdw) $(libelf)
+get_lines_LDADD = $(libdw) $(libelf)
+get_files_LDADD = $(libdw) $(libelf)
+get_aranges_LDADD = $(libdw) $(libelf)
+allfcts_LDADD = $(libdw) $(libelf)
+line2addr_LDADD = $(libdw)
+addrscopes_LDADD = $(libdw)
+funcscopes_LDADD = $(libdw)
+funcretval_LDADD = $(libdw)
+allregs_LDADD = $(libdw)
+find_prologues_LDADD = $(libdw)
+#show_ciefde_LDADD = ../libdwarf/libdwarf.so $(libelf)
+asm_tst1_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+asm_tst2_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+asm_tst3_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+asm_tst4_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+asm_tst5_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+asm_tst6_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+asm_tst7_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+asm_tst8_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+asm_tst9_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+dwflmodtest_LDADD = $(libdw) $(libebl) $(libelf) -ldl
+rdwrmmap_LDADD = $(libelf)
+dwfl_bug_addr_overflow_LDADD = $(libdw) $(libebl) $(libelf) -ldl
+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) -ldl
+dwarf_getmacros_LDADD = $(libdw)
+dwarf_getstring_LDADD = $(libdw)
+addrcfi_LDADD = $(libdw) $(libebl) $(libelf) -ldl
+test_flag_nobits_LDADD = $(libelf)
+rerequest_tag_LDADD = $(libdw)
+alldts_LDADD = $(libebl) $(libelf)
 md5_sha1_test_LDADD = $(libeu)
-typeiter_LDADD = $(libdw) $(libelf) $(libmudflap)
-low_high_pc_LDADD = $(libdw) $(libelf) $(libmudflap)
-test_elf_cntl_gelf_getshdr_LDADD = $(libelf) $(libmudflap)
+typeiter_LDADD = $(libdw) $(libelf)
+typeiter2_LDADD = $(libdw) $(libelf)
+low_high_pc_LDADD = $(libdw) $(libelf)
+test_elf_cntl_gelf_getshdr_LDADD = $(libelf)
+dwflsyms_LDADD = $(libdw) $(libelf)
+dwfllines_LDADD = $(libdw) $(libelf)
+dwfl_report_elf_align_LDADD = $(libdw)
+varlocs_LDADD = $(libdw) $(libelf)
+backtrace_LDADD = $(libdw) $(libelf)
+# backtrace-child-biarch also uses those *_CFLAGS and *_LDLAGS variables:
+backtrace_child_CFLAGS = -fPIE
+backtrace_child_LDFLAGS = -pie -pthread
+backtrace_child_biarch_SOURCES = backtrace-child.c
+backtrace_data_LDADD = $(libdw) $(libelf)
+backtrace_dwarf_CFLAGS = -Wno-unused-parameter
+backtrace_dwarf_LDADD = $(libdw) $(libelf)
+debuglink_LDADD = $(libdw) $(libelf)
+debugaltlink_LDADD = $(libdw) $(libelf)
+buildid_LDADD = $(libdw) $(libelf)
 
 if GCOV
 check: check-am coverage
index 30a10ad..5ecc710 100644 (file)
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.13.4 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
 @SET_MAKE@
 VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -33,16 +77,16 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-       $(top_srcdir)/config/eu.am ChangeLog
-@MUDFLAP_TRUE@am__append_1 = -fmudflap
-@STANDALONE_FALSE@am__append_2 = -I$(top_srcdir)/libasm -I$(top_srcdir)/libdw \
-@STANDALONE_FALSE@         -I$(top_srcdir)/libdwfl \
+DIST_COMMON = $(top_srcdir)/config/eu.am $(srcdir)/Makefile.in \
+       $(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \
+       $(top_srcdir)/config/test-driver ChangeLog
+@STANDALONE_FALSE@am__append_1 = -I$(top_srcdir)/libasm -I$(top_srcdir)/libdw \
+@STANDALONE_FALSE@         -I$(top_srcdir)/libdwfl -I$(top_srcdir)/libdwelf \
 @STANDALONE_FALSE@         -I$(top_srcdir)/libebl -I$(top_srcdir)/libelf \
 @STANDALONE_FALSE@         -I$(top_srcdir)/lib -I..
 
-@STANDALONE_FALSE@am__append_3 = -Wl,-rpath-link,../libasm:../libdw:../libelf
-@TESTS_RPATH_TRUE@am__append_4 = -Wl,-rpath,$(BUILD_RPATH)
+@STANDALONE_FALSE@am__append_2 = -Wl,-rpath-link,../libasm:../libdw:../libelf
+@TESTS_RPATH_TRUE@am__append_3 = -Wl,-rpath,$(BUILD_RPATH)
 check_PROGRAMS = arextract$(EXEEXT) arsymtest$(EXEEXT) \
        newfile$(EXEEXT) saridx$(EXEEXT) scnnames$(EXEEXT) \
        sectiondump$(EXEEXT) showptable$(EXEEXT) update1$(EXEEXT) \
@@ -60,9 +104,14 @@ check_PROGRAMS = arextract$(EXEEXT) arsymtest$(EXEEXT) \
        dwarf-getmacros$(EXEEXT) addrcfi$(EXEEXT) \
        test-flag-nobits$(EXEEXT) dwarf-getstring$(EXEEXT) \
        rerequest_tag$(EXEEXT) alldts$(EXEEXT) md5-sha1-test$(EXEEXT) \
-       typeiter$(EXEEXT) low_high_pc$(EXEEXT) \
-       test-elf_cntl_gelf_getshdr$(EXEEXT) $(am__EXEEXT_1) \
-       $(am__EXEEXT_3)
+       typeiter$(EXEEXT) typeiter2$(EXEEXT) low_high_pc$(EXEEXT) \
+       test-elf_cntl_gelf_getshdr$(EXEEXT) dwflsyms$(EXEEXT) \
+       dwfllines$(EXEEXT) dwfl-report-elf-align$(EXEEXT) \
+       varlocs$(EXEEXT) backtrace$(EXEEXT) backtrace-child$(EXEEXT) \
+       backtrace-data$(EXEEXT) backtrace-dwarf$(EXEEXT) \
+       debuglink$(EXEEXT) debugaltlink$(EXEEXT) buildid$(EXEEXT) \
+       $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_4)
+@BIARCH_TRUE@am__append_4 = backtrace-child-biarch
 TESTS = run-arextract.sh run-arsymtest.sh newfile$(EXEEXT) \
        test-nlist$(EXEEXT) update1$(EXEEXT) update2$(EXEEXT) \
        update3$(EXEEXT) update4$(EXEEXT) run-show-die-info.sh \
@@ -73,15 +122,17 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile$(EXEEXT) \
        run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \
        run-strip-test7.sh run-strip-test8.sh run-strip-groups.sh \
        run-strip-reloc.sh run-unstrip-test.sh run-unstrip-test2.sh \
-       run-ecp-test.sh run-ecp-test2.sh run-alldts.sh \
-       run-elflint-test.sh run-elflint-self.sh run-ranlib-test.sh \
-       run-ranlib-test2.sh run-ranlib-test3.sh run-ranlib-test4.sh \
-       run-addrscopes.sh run-strings-test.sh run-funcscopes.sh \
-       run-find-prologues.sh run-allregs.sh run-nm-self.sh \
-       run-readelf-self.sh run-readelf-test1.sh run-readelf-test2.sh \
-       run-readelf-test3.sh run-readelf-test4.sh \
-       run-readelf-twofiles.sh run-readelf-macro.sh \
-       run-native-test.sh run-bug1-test.sh \
+       run-unstrip-M.sh run-ecp-test.sh run-ecp-test2.sh \
+       run-alldts.sh run-elflint-test.sh run-elflint-self.sh \
+       run-ranlib-test.sh run-ranlib-test2.sh run-ranlib-test3.sh \
+       run-ranlib-test4.sh run-addrscopes.sh run-strings-test.sh \
+       run-funcscopes.sh run-find-prologues.sh run-allregs.sh \
+       run-addrcfi.sh run-nm-self.sh run-readelf-self.sh \
+       run-readelf-test1.sh run-readelf-test2.sh run-readelf-test3.sh \
+       run-readelf-test4.sh run-readelf-twofiles.sh \
+       run-readelf-macro.sh run-readelf-loc.sh run-readelf-aranges.sh \
+       run-readelf-line.sh run-native-test.sh run-bug1-test.sh \
+       run-debuglink.sh run-debugaltlink.sh run-buildid.sh \
        dwfl-bug-addr-overflow$(EXEEXT) run-addrname-test.sh \
        dwfl-bug-fd-leak$(EXEEXT) dwfl-bug-report$(EXEEXT) \
        run-dwfl-bug-offline-rel.sh run-dwfl-addr-sect.sh \
@@ -91,16 +142,31 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile$(EXEEXT) \
        run-rerequest_tag.sh run-typeiter.sh run-readelf-d.sh \
        run-readelf-gdb_index.sh run-unstrip-n.sh run-low_high_pc.sh \
        run-macro-test.sh run-elf_cntl_gelf_getshdr.sh \
-       run-test-archive64.sh $(am__EXEEXT_1) $(am__EXEEXT_3) \
-       $(am__append_9)
+       run-test-archive64.sh run-readelf-vmcoreinfo.sh \
+       run-readelf-mixed-corenote.sh run-dwfllines.sh \
+       run-dwfl-report-elf-align.sh run-addr2line-test.sh \
+       run-addr2line-i-test.sh run-varlocs.sh run-funcretval.sh \
+       run-backtrace-native.sh run-backtrace-data.sh \
+       run-backtrace-dwarf.sh run-backtrace-native-biarch.sh \
+       run-backtrace-native-core.sh \
+       run-backtrace-native-core-biarch.sh \
+       run-backtrace-core-x86_64.sh run-backtrace-core-i386.sh \
+       run-backtrace-core-ppc.sh run-backtrace-core-s390x.sh \
+       run-backtrace-core-s390.sh run-backtrace-core-aarch64.sh \
+       run-backtrace-demangle.sh run-stack-d-test.sh \
+       run-stack-i-test.sh run-readelf-dwz-multi.sh \
+       run-allfcts-multi.sh $(am__EXEEXT_2) $(am__append_7) \
+       $(am__append_8) $(am__EXEEXT_4)
 @STANDALONE_FALSE@am__append_5 = msg_tst md5-sha1-test
 @STANDALONE_FALSE@am__append_6 = msg_tst md5-sha1-test
-@HAVE_LIBASM_TRUE@am__append_7 = $(asm_TESTS)
-@HAVE_LIBASM_TRUE@am__append_8 = $(asm_TESTS)
-@ENABLE_DWZ_TRUE@am__append_9 = run-readelf-dwz-multi.sh
+@LZMA_TRUE@am__append_7 = run-readelf-s.sh run-dwflsyms.sh
+@ZLIB_TRUE@am__append_8 = run-readelf-zdebug.sh
+@HAVE_LIBASM_TRUE@am__append_9 = $(asm_TESTS)
+@HAVE_LIBASM_TRUE@am__append_10 = $(asm_TESTS)
 subdir = tests
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/m4/biarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
        $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/zip.m4 \
        $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
@@ -109,12 +175,13 @@ mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-@STANDALONE_FALSE@am__EXEEXT_1 = msg_tst$(EXEEXT) \
+@BIARCH_TRUE@am__EXEEXT_1 = backtrace-child-biarch$(EXEEXT)
+@STANDALONE_FALSE@am__EXEEXT_2 = msg_tst$(EXEEXT) \
 @STANDALONE_FALSE@     md5-sha1-test$(EXEEXT)
-am__EXEEXT_2 = asm-tst1$(EXEEXT) asm-tst2$(EXEEXT) asm-tst3$(EXEEXT) \
+am__EXEEXT_3 = asm-tst1$(EXEEXT) asm-tst2$(EXEEXT) asm-tst3$(EXEEXT) \
        asm-tst4$(EXEEXT) asm-tst5$(EXEEXT) asm-tst6$(EXEEXT) \
        asm-tst7$(EXEEXT) asm-tst8$(EXEEXT) asm-tst9$(EXEEXT)
-@HAVE_LIBASM_TRUE@am__EXEEXT_3 = $(am__EXEEXT_2)
+@HAVE_LIBASM_TRUE@am__EXEEXT_4 = $(am__EXEEXT_3)
 addrcfi_SOURCES = addrcfi.c
 addrcfi_OBJECTS = addrcfi.$(OBJEXT)
 am__DEPENDENCIES_1 =
@@ -131,30 +198,28 @@ am__DEPENDENCIES_1 =
 @BUILD_STATIC_TRUE@@STANDALONE_FALSE@  $(am__DEPENDENCIES_2) \
 @BUILD_STATIC_TRUE@@STANDALONE_FALSE@  $(am__DEPENDENCIES_3)
 addrcfi_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_3) \
-       $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_2)
 addrscopes_SOURCES = addrscopes.c
 addrscopes_OBJECTS = addrscopes.$(OBJEXT)
-addrscopes_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_1)
+addrscopes_DEPENDENCIES = $(am__DEPENDENCIES_4)
 alldts_SOURCES = alldts.c
 alldts_OBJECTS = alldts.$(OBJEXT)
-alldts_DEPENDENCIES = $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+alldts_DEPENDENCIES = $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_2)
 allfcts_SOURCES = allfcts.c
 allfcts_OBJECTS = allfcts.$(OBJEXT)
-allfcts_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+allfcts_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2)
 allregs_SOURCES = allregs.c
 allregs_OBJECTS = allregs.$(OBJEXT)
-allregs_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_1)
+allregs_DEPENDENCIES = $(am__DEPENDENCIES_4)
 arextract_SOURCES = arextract.c
 arextract_OBJECTS = arextract.$(OBJEXT)
-arextract_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+arextract_DEPENDENCIES = $(am__DEPENDENCIES_2)
 arls_SOURCES = arls.c
 arls_OBJECTS = arls.$(OBJEXT)
-arls_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+arls_DEPENDENCIES = $(am__DEPENDENCIES_2)
 arsymtest_SOURCES = arsymtest.c
 arsymtest_OBJECTS = arsymtest.$(OBJEXT)
-arsymtest_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+arsymtest_DEPENDENCIES = $(am__DEPENDENCIES_2)
 asm_tst1_SOURCES = asm-tst1.c
 asm_tst1_OBJECTS = asm-tst1.$(OBJEXT)
 @BUILD_STATIC_FALSE@@STANDALONE_FALSE@am__DEPENDENCIES_5 =  \
@@ -162,202 +227,256 @@ asm_tst1_OBJECTS = asm-tst1.$(OBJEXT)
 @BUILD_STATIC_TRUE@@STANDALONE_FALSE@am__DEPENDENCIES_5 =  \
 @BUILD_STATIC_TRUE@@STANDALONE_FALSE@  ../libasm/libasm.a
 asm_tst1_DEPENDENCIES = $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_3) \
-       $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_2)
 asm_tst2_SOURCES = asm-tst2.c
 asm_tst2_OBJECTS = asm-tst2.$(OBJEXT)
 asm_tst2_DEPENDENCIES = $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_3) \
-       $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_2)
 asm_tst3_SOURCES = asm-tst3.c
 asm_tst3_OBJECTS = asm-tst3.$(OBJEXT)
 asm_tst3_DEPENDENCIES = $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_3) \
-       $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_2)
 asm_tst4_SOURCES = asm-tst4.c
 asm_tst4_OBJECTS = asm-tst4.$(OBJEXT)
 asm_tst4_DEPENDENCIES = $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_3) \
-       $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_2)
 asm_tst5_SOURCES = asm-tst5.c
 asm_tst5_OBJECTS = asm-tst5.$(OBJEXT)
 asm_tst5_DEPENDENCIES = $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_3) \
-       $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_2)
 asm_tst6_SOURCES = asm-tst6.c
 asm_tst6_OBJECTS = asm-tst6.$(OBJEXT)
 asm_tst6_DEPENDENCIES = $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_3) \
-       $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_2)
 asm_tst7_SOURCES = asm-tst7.c
 asm_tst7_OBJECTS = asm-tst7.$(OBJEXT)
 asm_tst7_DEPENDENCIES = $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_3) \
-       $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_2)
 asm_tst8_SOURCES = asm-tst8.c
 asm_tst8_OBJECTS = asm-tst8.$(OBJEXT)
 asm_tst8_DEPENDENCIES = $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_3) \
-       $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_2)
 asm_tst9_SOURCES = asm-tst9.c
 asm_tst9_OBJECTS = asm-tst9.$(OBJEXT)
 asm_tst9_DEPENDENCIES = $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_3) \
-       $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_2)
+backtrace_SOURCES = backtrace.c
+backtrace_OBJECTS = backtrace.$(OBJEXT)
+backtrace_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2)
+backtrace_child_SOURCES = backtrace-child.c
+backtrace_child_OBJECTS = backtrace_child-backtrace-child.$(OBJEXT)
+backtrace_child_LDADD = $(LDADD)
+backtrace_child_LINK = $(CCLD) $(backtrace_child_CFLAGS) $(CFLAGS) \
+       $(backtrace_child_LDFLAGS) $(LDFLAGS) -o $@
+am_backtrace_child_biarch_OBJECTS = backtrace-child.$(OBJEXT)
+backtrace_child_biarch_OBJECTS = $(am_backtrace_child_biarch_OBJECTS)
+backtrace_child_biarch_LDADD = $(LDADD)
+backtrace_data_SOURCES = backtrace-data.c
+backtrace_data_OBJECTS = backtrace-data.$(OBJEXT)
+backtrace_data_DEPENDENCIES = $(am__DEPENDENCIES_4) \
+       $(am__DEPENDENCIES_2)
+backtrace_dwarf_SOURCES = backtrace-dwarf.c
+backtrace_dwarf_OBJECTS = backtrace_dwarf-backtrace-dwarf.$(OBJEXT)
+backtrace_dwarf_DEPENDENCIES = $(am__DEPENDENCIES_4) \
+       $(am__DEPENDENCIES_2)
+backtrace_dwarf_LINK = $(CCLD) $(backtrace_dwarf_CFLAGS) $(CFLAGS) \
+       $(AM_LDFLAGS) $(LDFLAGS) -o $@
+buildid_SOURCES = buildid.c
+buildid_OBJECTS = buildid.$(OBJEXT)
+buildid_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2)
+debugaltlink_SOURCES = debugaltlink.c
+debugaltlink_OBJECTS = debugaltlink.$(OBJEXT)
+debugaltlink_DEPENDENCIES = $(am__DEPENDENCIES_4) \
+       $(am__DEPENDENCIES_2)
+debuglink_SOURCES = debuglink.c
+debuglink_OBJECTS = debuglink.$(OBJEXT)
+debuglink_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2)
 dwarf_getmacros_SOURCES = dwarf-getmacros.c
 dwarf_getmacros_OBJECTS = dwarf-getmacros.$(OBJEXT)
-dwarf_getmacros_DEPENDENCIES = $(am__DEPENDENCIES_4) \
-       $(am__DEPENDENCIES_1)
+dwarf_getmacros_DEPENDENCIES = $(am__DEPENDENCIES_4)
 dwarf_getstring_SOURCES = dwarf-getstring.c
 dwarf_getstring_OBJECTS = dwarf-getstring.$(OBJEXT)
-dwarf_getstring_DEPENDENCIES = $(am__DEPENDENCIES_4) \
-       $(am__DEPENDENCIES_1)
+dwarf_getstring_DEPENDENCIES = $(am__DEPENDENCIES_4)
 dwfl_addr_sect_SOURCES = dwfl-addr-sect.c
 dwfl_addr_sect_OBJECTS = dwfl-addr-sect.$(OBJEXT)
 dwfl_addr_sect_DEPENDENCIES = $(am__DEPENDENCIES_4) \
-       $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_2)
 dwfl_bug_addr_overflow_SOURCES = dwfl-bug-addr-overflow.c
 dwfl_bug_addr_overflow_OBJECTS = dwfl-bug-addr-overflow.$(OBJEXT)
 dwfl_bug_addr_overflow_DEPENDENCIES = $(am__DEPENDENCIES_4) \
-       $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_2)
 dwfl_bug_fd_leak_SOURCES = dwfl-bug-fd-leak.c
 dwfl_bug_fd_leak_OBJECTS = dwfl-bug-fd-leak.$(OBJEXT)
 dwfl_bug_fd_leak_DEPENDENCIES = $(am__DEPENDENCIES_4) \
-       $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_2)
 dwfl_bug_getmodules_SOURCES = dwfl-bug-getmodules.c
 dwfl_bug_getmodules_OBJECTS = dwfl-bug-getmodules.$(OBJEXT)
 dwfl_bug_getmodules_DEPENDENCIES = $(am__DEPENDENCIES_4) \
-       $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_2)
 dwfl_bug_report_SOURCES = dwfl-bug-report.c
 dwfl_bug_report_OBJECTS = dwfl-bug-report.$(OBJEXT)
 dwfl_bug_report_DEPENDENCIES = $(am__DEPENDENCIES_4) \
-       $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_2)
+dwfl_report_elf_align_SOURCES = dwfl-report-elf-align.c
+dwfl_report_elf_align_OBJECTS = dwfl-report-elf-align.$(OBJEXT)
+dwfl_report_elf_align_DEPENDENCIES = $(am__DEPENDENCIES_4)
+dwfllines_SOURCES = dwfllines.c
+dwfllines_OBJECTS = dwfllines.$(OBJEXT)
+dwfllines_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2)
 dwflmodtest_SOURCES = dwflmodtest.c
 dwflmodtest_OBJECTS = dwflmodtest.$(OBJEXT)
 dwflmodtest_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_3) \
-       $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_2)
+dwflsyms_SOURCES = dwflsyms.c
+dwflsyms_OBJECTS = dwflsyms.$(OBJEXT)
+dwflsyms_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2)
 early_offscn_SOURCES = early-offscn.c
 early_offscn_OBJECTS = early-offscn.$(OBJEXT)
-early_offscn_DEPENDENCIES = $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+early_offscn_DEPENDENCIES = $(am__DEPENDENCIES_2)
 ecp_SOURCES = ecp.c
 ecp_OBJECTS = ecp.$(OBJEXT)
-ecp_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+ecp_DEPENDENCIES = $(am__DEPENDENCIES_2)
 find_prologues_SOURCES = find-prologues.c
 find_prologues_OBJECTS = find-prologues.$(OBJEXT)
-find_prologues_DEPENDENCIES = $(am__DEPENDENCIES_4) \
-       $(am__DEPENDENCIES_1)
+find_prologues_DEPENDENCIES = $(am__DEPENDENCIES_4)
 funcretval_SOURCES = funcretval.c
 funcretval_OBJECTS = funcretval.$(OBJEXT)
-funcretval_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_1)
+funcretval_DEPENDENCIES = $(am__DEPENDENCIES_4)
 funcscopes_SOURCES = funcscopes.c
 funcscopes_OBJECTS = funcscopes.$(OBJEXT)
-funcscopes_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_1)
+funcscopes_DEPENDENCIES = $(am__DEPENDENCIES_4)
 get_aranges_SOURCES = get-aranges.c
 get_aranges_OBJECTS = get-aranges.$(OBJEXT)
-get_aranges_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+get_aranges_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2)
 get_files_SOURCES = get-files.c
 get_files_OBJECTS = get-files.$(OBJEXT)
-get_files_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+get_files_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2)
 get_lines_SOURCES = get-lines.c
 get_lines_OBJECTS = get-lines.$(OBJEXT)
-get_lines_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+get_lines_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2)
 get_pubnames_SOURCES = get-pubnames.c
 get_pubnames_OBJECTS = get-pubnames.$(OBJEXT)
 get_pubnames_DEPENDENCIES = $(am__DEPENDENCIES_4) \
-       $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_2)
 hash_SOURCES = hash.c
 hash_OBJECTS = hash.$(OBJEXT)
-hash_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+hash_DEPENDENCIES = $(am__DEPENDENCIES_2)
 line2addr_SOURCES = line2addr.c
 line2addr_OBJECTS = line2addr.$(OBJEXT)
-line2addr_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_1)
+line2addr_DEPENDENCIES = $(am__DEPENDENCIES_4)
 low_high_pc_SOURCES = low_high_pc.c
 low_high_pc_OBJECTS = low_high_pc.$(OBJEXT)
-low_high_pc_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+low_high_pc_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2)
 md5_sha1_test_SOURCES = md5-sha1-test.c
 md5_sha1_test_OBJECTS = md5-sha1-test.$(OBJEXT)
 md5_sha1_test_DEPENDENCIES = $(libeu)
 msg_tst_SOURCES = msg_tst.c
 msg_tst_OBJECTS = msg_tst.$(OBJEXT)
-msg_tst_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+msg_tst_DEPENDENCIES = $(am__DEPENDENCIES_2)
 newfile_SOURCES = newfile.c
 newfile_OBJECTS = newfile.$(OBJEXT)
-newfile_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+newfile_DEPENDENCIES = $(am__DEPENDENCIES_2)
 newscn_SOURCES = newscn.c
 newscn_OBJECTS = newscn.$(OBJEXT)
-newscn_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+newscn_DEPENDENCIES = $(am__DEPENDENCIES_2)
 rdwrmmap_SOURCES = rdwrmmap.c
 rdwrmmap_OBJECTS = rdwrmmap.$(OBJEXT)
-rdwrmmap_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+rdwrmmap_DEPENDENCIES = $(am__DEPENDENCIES_2)
 rerequest_tag_SOURCES = rerequest_tag.c
 rerequest_tag_OBJECTS = rerequest_tag.$(OBJEXT)
-rerequest_tag_DEPENDENCIES = $(am__DEPENDENCIES_4) \
-       $(am__DEPENDENCIES_1)
+rerequest_tag_DEPENDENCIES = $(am__DEPENDENCIES_4)
 saridx_SOURCES = saridx.c
 saridx_OBJECTS = saridx.$(OBJEXT)
-saridx_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+saridx_DEPENDENCIES = $(am__DEPENDENCIES_2)
 scnnames_SOURCES = scnnames.c
 scnnames_OBJECTS = scnnames.$(OBJEXT)
-scnnames_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+scnnames_DEPENDENCIES = $(am__DEPENDENCIES_2)
 sectiondump_SOURCES = sectiondump.c
 sectiondump_OBJECTS = sectiondump.$(OBJEXT)
-sectiondump_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+sectiondump_DEPENDENCIES = $(am__DEPENDENCIES_2)
 show_abbrev_SOURCES = show-abbrev.c
 show_abbrev_OBJECTS = show-abbrev.$(OBJEXT)
-show_abbrev_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+show_abbrev_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2)
 show_die_info_SOURCES = show-die-info.c
 show_die_info_OBJECTS = show-die-info.$(OBJEXT)
 show_die_info_DEPENDENCIES = $(am__DEPENDENCIES_4) \
-       $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+       $(am__DEPENDENCIES_2)
 showptable_SOURCES = showptable.c
 showptable_OBJECTS = showptable.$(OBJEXT)
-showptable_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+showptable_DEPENDENCIES = $(am__DEPENDENCIES_2)
 test_elf_cntl_gelf_getshdr_SOURCES = test-elf_cntl_gelf_getshdr.c
 test_elf_cntl_gelf_getshdr_OBJECTS =  \
        test-elf_cntl_gelf_getshdr.$(OBJEXT)
-test_elf_cntl_gelf_getshdr_DEPENDENCIES = $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+test_elf_cntl_gelf_getshdr_DEPENDENCIES = $(am__DEPENDENCIES_2)
 test_flag_nobits_SOURCES = test-flag-nobits.c
 test_flag_nobits_OBJECTS = test-flag-nobits.$(OBJEXT)
-test_flag_nobits_DEPENDENCIES = $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+test_flag_nobits_DEPENDENCIES = $(am__DEPENDENCIES_2)
 test_nlist_SOURCES = test-nlist.c
 test_nlist_OBJECTS = test-nlist.$(OBJEXT)
-test_nlist_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+test_nlist_DEPENDENCIES = $(am__DEPENDENCIES_2)
 typeiter_SOURCES = typeiter.c
 typeiter_OBJECTS = typeiter.$(OBJEXT)
-typeiter_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+typeiter_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2)
+typeiter2_SOURCES = typeiter2.c
+typeiter2_OBJECTS = typeiter2.$(OBJEXT)
+typeiter2_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2)
 update1_SOURCES = update1.c
 update1_OBJECTS = update1.$(OBJEXT)
-update1_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+update1_DEPENDENCIES = $(am__DEPENDENCIES_2)
 update2_SOURCES = update2.c
 update2_OBJECTS = update2.$(OBJEXT)
-update2_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+update2_DEPENDENCIES = $(am__DEPENDENCIES_2)
 update3_SOURCES = update3.c
 update3_OBJECTS = update3.$(OBJEXT)
-update3_DEPENDENCIES = $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+update3_DEPENDENCIES = $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_2)
 update4_SOURCES = update4.c
 update4_OBJECTS = update4.$(OBJEXT)
-update4_DEPENDENCIES = $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_2) \
-       $(am__DEPENDENCIES_1)
+update4_DEPENDENCIES = $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_2)
+varlocs_SOURCES = varlocs.c
+varlocs_OBJECTS = varlocs.$(OBJEXT)
+varlocs_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/config/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
 CCLD = $(CC)
 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
 SOURCES = addrcfi.c addrscopes.c alldts.c allfcts.c allregs.c \
        arextract.c arls.c arsymtest.c asm-tst1.c asm-tst2.c \
        asm-tst3.c asm-tst4.c asm-tst5.c asm-tst6.c asm-tst7.c \
-       asm-tst8.c asm-tst9.c dwarf-getmacros.c dwarf-getstring.c \
-       dwfl-addr-sect.c dwfl-bug-addr-overflow.c dwfl-bug-fd-leak.c \
-       dwfl-bug-getmodules.c dwfl-bug-report.c dwflmodtest.c \
+       asm-tst8.c asm-tst9.c backtrace.c backtrace-child.c \
+       $(backtrace_child_biarch_SOURCES) backtrace-data.c \
+       backtrace-dwarf.c buildid.c debugaltlink.c debuglink.c \
+       dwarf-getmacros.c dwarf-getstring.c dwfl-addr-sect.c \
+       dwfl-bug-addr-overflow.c dwfl-bug-fd-leak.c \
+       dwfl-bug-getmodules.c dwfl-bug-report.c \
+       dwfl-report-elf-align.c dwfllines.c dwflmodtest.c dwflsyms.c \
        early-offscn.c ecp.c find-prologues.c funcretval.c \
        funcscopes.c get-aranges.c get-files.c get-lines.c \
        get-pubnames.c hash.c line2addr.c low_high_pc.c \
@@ -365,13 +484,18 @@ SOURCES = addrcfi.c addrscopes.c alldts.c allfcts.c allregs.c \
        rerequest_tag.c saridx.c scnnames.c sectiondump.c \
        show-abbrev.c show-die-info.c showptable.c \
        test-elf_cntl_gelf_getshdr.c test-flag-nobits.c test-nlist.c \
-       typeiter.c update1.c update2.c update3.c update4.c
+       typeiter.c typeiter2.c update1.c update2.c update3.c update4.c \
+       varlocs.c
 DIST_SOURCES = addrcfi.c addrscopes.c alldts.c allfcts.c allregs.c \
        arextract.c arls.c arsymtest.c asm-tst1.c asm-tst2.c \
        asm-tst3.c asm-tst4.c asm-tst5.c asm-tst6.c asm-tst7.c \
-       asm-tst8.c asm-tst9.c dwarf-getmacros.c dwarf-getstring.c \
-       dwfl-addr-sect.c dwfl-bug-addr-overflow.c dwfl-bug-fd-leak.c \
-       dwfl-bug-getmodules.c dwfl-bug-report.c dwflmodtest.c \
+       asm-tst8.c asm-tst9.c backtrace.c backtrace-child.c \
+       $(backtrace_child_biarch_SOURCES) backtrace-data.c \
+       backtrace-dwarf.c buildid.c debugaltlink.c debuglink.c \
+       dwarf-getmacros.c dwarf-getstring.c dwfl-addr-sect.c \
+       dwfl-bug-addr-overflow.c dwfl-bug-fd-leak.c \
+       dwfl-bug-getmodules.c dwfl-bug-report.c \
+       dwfl-report-elf-align.c dwfllines.c dwflmodtest.c dwflsyms.c \
        early-offscn.c ecp.c find-prologues.c funcretval.c \
        funcscopes.c get-aranges.c get-files.c get-lines.c \
        get-pubnames.c hash.c line2addr.c low_high_pc.c \
@@ -379,21 +503,250 @@ DIST_SOURCES = addrcfi.c addrscopes.c alldts.c allfcts.c allregs.c \
        rerequest_tag.c saridx.c scnnames.c sectiondump.c \
        show-abbrev.c show-die-info.c showptable.c \
        test-elf_cntl_gelf_getshdr.c test-flag-nobits.c test-nlist.c \
-       typeiter.c update1.c update2.c update3.c update4.c
+       typeiter.c typeiter2.c update1.c update2.c update3.c update4.c \
+       varlocs.c
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
-am__tty_colors = \
-red=; grn=; lgn=; blu=; std=
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red='\e[0;31m'; \
+    grn='\e[0;32m'; \
+    lgn='\e[1;32m'; \
+    blu='\e[1;34m'; \
+    mgn='\e[0;35m'; \
+    brg='\e[1m'; \
+    std='\e[m'; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[    ]*:recheck:[    ]*
+am__global_test_result_rx = ^[         ]*:global-test-result:[         ]*
+am__copy_in_global_log_rx = ^[         ]*:copy-in-global-log:[         ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+           recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[       ]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);                                     \
+$(am__vpath_adj_setup) $(am__vpath_adj)                        \
+$(am__tty_colors);                                     \
+srcdir=$(srcdir); export srcdir;                       \
+case "$@" in                                           \
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;   \
+    *) am__odir=.;;                                    \
+esac;                                                  \
+test "x$$am__odir" = x"." || test -d "$$am__odir"      \
+  || $(MKDIR_P) "$$am__odir" || exit $$?;              \
+if test -f "./$$f"; then dir=./;                       \
+elif test -f "$$f"; then dir=;                         \
+else dir="$(srcdir)/"; fi;                             \
+tst=$$dir$$f; log='$@';                                \
+if test -n '$(DISABLE_HARD_ERRORS)'; then              \
+  am__enable_hard_errors=no;                           \
+else                                                   \
+  am__enable_hard_errors=yes;                          \
+fi;                                                    \
+case " $(XFAIL_TESTS) " in                             \
+  *[\ \        ]$$f[\ \        ]* | *[\ \      ]$$dir$$f[\ \   ]*) \
+    am__expect_failure=yes;;                           \
+  *)                                                   \
+    am__expect_failure=no;;                            \
+esac;                                                  \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/config/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/config/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+       $(TEST_LOG_FLAGS)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
+CC_BIARCH = @CC_BIARCH@
 CFLAGS = @CFLAGS@
+CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DEBUGPRED = @DEBUGPRED@
@@ -402,10 +755,13 @@ DEPDIR = @DEPDIR@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_VALGRIND = @HAVE_VALGRIND@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -426,6 +782,7 @@ MODVERSION = @MODVERSION@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
+NM = @NM@
 OBJEXT = @OBJEXT@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -436,6 +793,7 @@ PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
 RANLIB = @RANLIB@
+READELF = @READELF@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
@@ -450,6 +808,7 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -499,22 +858,17 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 zip_LIBS = @zip_LIBS@
-INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. $(am__append_2)
-AM_CFLAGS = -std=gnu99 -Wall -Wshadow $(if \
-       $($(*F)_no_Werror),,-Werror) $(if \
-       $($(*F)_no_Wunused),,-Wunused -Wextra) $(if \
-       $($(*F)_no_Wformat),-Wno-format,-Wformat=2) $($(*F)_CFLAGS) \
-       $(am__append_1)
-@MUDFLAP_FALSE@libmudflap = 
-@MUDFLAP_TRUE@libmudflap = -lmudflap
-COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\
-                         $(COMPILE))
+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_srcdir)/lib -I.. $(am__append_1)
+AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \
+           $(if $($(*F)_no_Werror),,-Werror) \
+           $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \
+           $($(*F)_CFLAGS)
 
+COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage, $(COMPILE))
 CLEANFILES = *.gcno *.gcda
-textrel_check = if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
-@MUDFLAP_FALSE@BUILD_RPATH = \$$ORIGIN/../libasm:\$$ORIGIN/../libdw:\$$ORIGIN/../backends:\$$ORIGIN/../libelf
-@MUDFLAP_TRUE@BUILD_RPATH = \$$ORIGIN/../backends
-AM_LDFLAGS = $(am__append_3) $(am__append_4)
+textrel_check = if $(READELF) -d $@ | fgrep -q TEXTREL; then exit 1; fi
+BUILD_RPATH = \$$ORIGIN/../libasm:\$$ORIGIN/../libdw:\$$ORIGIN/../backends:\$$ORIGIN/../libelf
+AM_LDFLAGS = $(am__append_2) $(am__append_3)
 @TESTS_RPATH_FALSE@tests_rpath = no
 @TESTS_RPATH_TRUE@tests_rpath = yes
 asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \
@@ -529,16 +883,17 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
             testfile5.bz2 testfile6.bz2 testfile7.bz2 testfile8.bz2 \
             testfile9.bz2 testfile10.bz2 testfile11.bz2 testfile12.bz2 \
             testfile13.bz2 run-strip-test3.sh run-allfcts.sh \
+            testfile_class_func.bz2 testfile_nested_funcs.bz2 \
             run-line2addr.sh run-elflint-test.sh testfile14.bz2 \
             run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \
             run-strip-test7.sh run-strip-test8.sh run-strip-groups.sh \
             run-strip-reloc.sh hello_i386.ko.bz2 hello_x86_64.ko.bz2 \
-            hello_ppc64.ko.bz2 hello_s390.ko.bz2 \
-            run-unstrip-test.sh run-unstrip-test2.sh \
+            hello_ppc64.ko.bz2 hello_s390.ko.bz2 hello_aarch64.ko.bz2 \
+            run-unstrip-test.sh run-unstrip-test2.sh run-unstrip-M.sh\
             run-elflint-self.sh run-ranlib-test.sh run-ranlib-test2.sh \
             run-ranlib-test3.sh run-ranlib-test4.sh \
             run-addrscopes.sh run-strings-test.sh run-funcscopes.sh \
-            run-nm-self.sh run-readelf-self.sh \
+            run-nm-self.sh run-readelf-self.sh run-addrcfi.sh \
             run-find-prologues.sh run-allregs.sh run-native-test.sh \
             run-addrname-test.sh run-dwfl-bug-offline-rel.sh \
             run-dwfl-addr-sect.sh run-early-offscn.sh \
@@ -556,20 +911,27 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
             run-readelf-test1.sh run-readelf-test2.sh run-readelf-test3.sh \
             run-readelf-test4.sh run-readelf-twofiles.sh \
             run-bug1-test.sh testfile28.bz2 testfile28.rdwr.bz2 \
+            run-debuglink.sh run-debugaltlink.sh run-buildid.sh \
             testfile29.bz2 testfile29.rdwr.bz2 \
             testfile30.bz2 testfile31.bz2 testfile32.bz2 testfile33.bz2 \
             testfile34.bz2 testfile35.bz2 testfile35.debug.bz2 \
             testfile36.bz2 testfile36.debug.bz2 \
             testfile37.bz2 testfile37.debug.bz2 \
             testfile38.bz2 testfile39.bz2 testfile40.bz2 testfile40.debug.bz2 \
-            testfile41.bz2 testfile42.bz2 testfile43.bz2 \
+            testfile41.bz2 testfile42.bz2 testfile42_noshdrs.bz2 \
+            testfile43.bz2 \
             testfile44.S.bz2 testfile44.expect.bz2 run-disasm-x86.sh \
             testfile45.S.bz2 testfile45.expect.bz2 run-disasm-x86-64.sh \
             testfile46.bz2 testfile47.bz2 testfile48.bz2 testfile48.debug.bz2 \
             testfile49.bz2 testfile50.bz2 testfile51.bz2 \
             run-readelf-macro.sh testfilemacro.bz2 \
+            run-readelf-loc.sh testfileloc.bz2 \
+            run-readelf-aranges.sh run-readelf-line.sh testfilefoobarbaz.bz2 \
             run-readelf-dwz-multi.sh libtestfile_multi_shared.so.bz2 \
             testfile_multi.dwz.bz2 testfile_multi_main.bz2 \
+            testfile-dwzstr.bz2 testfile-dwzstr.multi.bz2 \
+            run-allfcts-multi.sh \
+            test-offset-loop.bz2 test-offset-loop.alt.bz2 \
             run-prelink-addr-test.sh \
             testfile52-32.so.bz2 testfile52-32.so.debug.bz2 \
             testfile52-32.prelink.so.bz2 testfile52-32.noshdrs.so.bz2 \
@@ -590,25 +952,95 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
             run-readelf-d.sh testlib_dynseg.so.bz2 \
             run-readelf-gdb_index.sh testfilegdbindex5.bz2 \
             testfilegdbindex7.bz2 \
+            run-readelf-s.sh testfilebazdbg.bz2 testfilebazdyn.bz2 \
+            testfilebazmin.bz2 testfilebazdbg.debug.bz2 testfilebazmdb.bz2 \
+            testfilebaztab.bz2 testfilebasmin.bz2 testfilebaxmin.bz2 \
+            testfilebazdbg_pl.bz2 testfilebazmin_pl.bz2 \
+            testfilebazdbg_plr.bz2 testfilebazmin_plr.bz2 \
+            testfilebazdbgppc64.bz2 testfilebazdbgppc64.debug.bz2 \
+            testfilebazdbgppc64_pl.bz2 testfilebazdbgppc64_plr.bz2 \
+            testfilebazdynppc64.bz2 testfilebazmdbppc64.bz2 \
+            testfilebazminppc64.bz2 testfilebazminppc64_pl.bz2 \
+            testfilebazminppc64_plr.bz2 testfilebaztabppc64.bz2 \
+            run-dwflsyms.sh \
             run-unstrip-n.sh testcore-rtlib.bz2 testcore-rtlib-ppc.bz2 \
             run-low_high_pc.sh testfile_low_high_pc.bz2 \
             run-macro-test.sh testfile-macinfo.bz2 testfile-macros.bz2 \
             run-elf_cntl_gelf_getshdr.sh \
             run-test-archive64.sh testarchive64.a.bz2 \
-            testfile60.bz2
-
-installed_TESTS_ENVIRONMENT = libdir=$(DESTDIR)$(libdir) \
-                             bindir=$(DESTDIR)$(bindir) \
-                             LC_ALL=C LANG=C \
-                             $(srcdir)/test-wrapper.sh \
-                             installed $(tests_rpath) \
-                             $(program_transform_name)
-
-@STANDALONE_FALSE@TESTS_ENVIRONMENT = LC_ALL=C LANG=C $(srcdir)/test-wrapper.sh \
-@STANDALONE_FALSE@                 ../libdw:../backends:../libelf:../libasm
+            testfile60.bz2 testfile61.bz2 \
+            run-readelf-vmcoreinfo.sh testfile62.bz2 \
+            run-readelf-mixed-corenote.sh testfile63.bz2 testfile64.bz2 \
+            testfile65.bz2 testfile67.bz2 testfile68.bz2 \
+            testfile69.core.bz2 testfile69.so.bz2 \
+            testfile70.core.bz2 testfile70.exec.bz2 testfile71.bz2 \
+            run-dwfllines.sh run-dwfl-report-elf-align.sh \
+            testfile-dwfl-report-elf-align-shlib.so.bz2 \
+            testfilenolines.bz2 test-core-lib.so.bz2 test-core.core.bz2 \
+            test-core.exec.bz2 run-addr2line-test.sh \
+            run-addr2line-i-test.sh testfile-inlines.bz2 \
+            testfileppc32.bz2 testfileppc64.bz2 \
+            testfiles390.bz2 testfiles390x.bz2 \
+            testfilearm.bz2 testfileaarch64.bz2 \
+            run-varlocs.sh \
+            testfile_const_type.c testfile_const_type.bz2 \
+            testfile_implicit_pointer.c testfile_implicit_pointer.bz2 \
+            testfile_parameter_ref.c testfile_parameter_ref.bz2 \
+            testfile_entry_value.c testfile_entry_value.bz2 \
+            testfile_implicit_value.c testfile_implicit_value.bz2 \
+            testfile_aarch64_core.bz2 testfile_i686_core.bz2 \
+            run-funcretval.sh funcretval_test.c funcretval_test_aarch64.bz2 \
+            run-backtrace-data.sh run-backtrace-dwarf.sh cleanup-13.c \
+            run-backtrace-native.sh run-backtrace-native-biarch.sh \
+            run-backtrace-native-core.sh run-backtrace-native-core-biarch.sh \
+            run-backtrace-core-x86_64.sh run-backtrace-core-i386.sh \
+            backtrace-subr.sh backtrace.i386.core.bz2 backtrace.i386.exec.bz2 \
+            backtrace.x86_64.core.bz2 backtrace.x86_64.exec.bz2 \
+            backtrace.ppc.core.bz2 backtrace.ppc.exec.bz2 \
+            run-backtrace-core-ppc.sh testfile66.bz2 testfile66.core.bz2 \
+            backtrace.s390x.core.bz2 backtrace.s390x.exec.bz2 \
+            backtrace.s390.core.bz2 backtrace.s390.exec.bz2 \
+            run-backtrace-core-s390x.sh run-backtrace-core-s390.sh \
+            run-backtrace-core-aarch64.sh \
+            backtrace.aarch64.core.bz2 backtrace.aarch64.exec.bz2 \
+            run-backtrace-demangle.sh testfile-backtrace-demangle.bz2 \
+            testfile-backtrace-demangle.cc \
+            testfile-backtrace-demangle.core.bz2 \
+            run-stack-d-test.sh run-stack-i-test.sh \
+            testfiledwarfinlines.bz2 testfiledwarfinlines.core.bz2 \
+            run-readelf-zdebug.sh testfile-debug.bz2 testfile-zdebug.bz2
+
+@USE_VALGRIND_TRUE@valgrind_cmd = 'valgrind -q --error-exitcode=1 --run-libc-freeres=no'
+installed_TESTS_ENVIRONMENT = libdir=$(DESTDIR)$(libdir); \
+                             bindir=$(DESTDIR)$(bindir); \
+                             LC_ALL=C; LANG=C; \
+                             VALGRIND_CMD=$(valgrind_cmd); \
+                             abs_srcdir=$(abs_srcdir); \
+                             abs_builddir=$(abs_builddir); \
+                             abs_top_builddir=$(abs_top_builddir); \
+                             export abs_srcdir; export abs_builddir; \
+                             export abs_top_builddir; \
+                             export libdir; export bindir; \
+                             export LC_ALL; export LANG; export VALGRIND_CMD; \
+                             NM=$(NM); export NM;
+
+installed_LOG_COMPILER = $(abs_srcdir)/test-wrapper.sh \
+                        installed $(tests_rpath) \
+                        '$(program_transform_name)'
+
+@STANDALONE_FALSE@TESTS_ENVIRONMENT = LC_ALL=C; LANG=C; VALGRIND_CMD=$(valgrind_cmd); \
+@STANDALONE_FALSE@                 abs_srcdir=$(abs_srcdir);  abs_builddir=$(abs_builddir); \
+@STANDALONE_FALSE@                 abs_top_builddir=$(abs_top_builddir); \
+@STANDALONE_FALSE@                 export abs_srcdir; export abs_builddir; \
+@STANDALONE_FALSE@                 export abs_top_builddir; \
+@STANDALONE_FALSE@                 export LC_ALL; export LANG; export VALGRIND_CMD; \
+@STANDALONE_FALSE@                 NM=$(NM); export NM;
 
 @STANDALONE_TRUE@TESTS_ENVIRONMENT = $(installed_TESTS_ENVIRONMENT)
-@MUDFLAP_TRUE@static_build = yes
+@STANDALONE_FALSE@LOG_COMPILER = $(abs_srcdir)/test-wrapper.sh \
+@STANDALONE_FALSE@            $(abs_top_builddir)/libdw:$(abs_top_builddir)/backends:$(abs_top_builddir)/libelf:$(abs_top_builddir)/libasm
+
+@STANDALONE_TRUE@LOG_COMPILER = $(installed_LOG_COMPILER)
 @BUILD_STATIC_FALSE@@STANDALONE_FALSE@libdw = ../libdw/libdw.so
 @BUILD_STATIC_TRUE@@STANDALONE_FALSE@libdw = ../libdw/libdw.a $(zip_LIBS) $(libelf) $(libebl) -ldl
 @STANDALONE_TRUE@libdw = -ldw
@@ -621,69 +1053,84 @@ installed_TESTS_ENVIRONMENT = libdir=$(DESTDIR)$(libdir) \
 @STANDALONE_FALSE@libebl = ../libebl/libebl.a
 @STANDALONE_TRUE@libebl = -lebl
 @STANDALONE_FALSE@libeu = ../lib/libeu.a
-arextract_LDADD = $(libelf) $(libmudflap)
-arsymtest_LDADD = $(libelf) $(libmudflap)
-newfile_LDADD = $(libelf) $(libmudflap)
-saridx_LDADD = $(libelf) $(libmudflap)
-scnnames_LDADD = $(libelf) $(libmudflap)
-sectiondump_LDADD = $(libelf) $(libmudflap)
-showptable_LDADD = $(libelf) $(libmudflap)
-hash_LDADD = $(libelf) $(libmudflap)
-test_nlist_LDADD = $(libelf) $(libmudflap)
-msg_tst_LDADD = $(libelf) $(libmudflap)
-newscn_LDADD = $(libelf) $(libmudflap)
-early_offscn_LDADD = $(libelf) $(libmudflap)
-ecp_LDADD = $(libelf) $(libmudflap)
-update1_LDADD = $(libelf) $(libmudflap)
-update2_LDADD = $(libelf) $(libmudflap)
-update3_LDADD = $(libebl) $(libelf) $(libmudflap)
-update4_LDADD = $(libebl) $(libelf) $(libmudflap)
-show_die_info_LDADD = $(libdw) $(libelf) $(libmudflap)
-get_pubnames_LDADD = $(libdw) $(libelf) $(libmudflap)
-show_abbrev_LDADD = $(libdw) $(libelf) $(libmudflap)
-get_lines_LDADD = $(libdw) $(libelf) $(libmudflap)
-get_files_LDADD = $(libdw) $(libelf) $(libmudflap)
-get_aranges_LDADD = $(libdw) $(libelf) $(libmudflap)
-allfcts_LDADD = $(libdw) $(libelf) $(libmudflap)
-line2addr_no_Wformat = yes
-line2addr_LDADD = $(libdw) $(libmudflap)
-addrscopes_LDADD = $(libdw) $(libmudflap)
-funcscopes_LDADD = $(libdw) $(libmudflap)
-funcretval_LDADD = $(libdw) $(libmudflap)
-allregs_LDADD = $(libdw) $(libmudflap)
-find_prologues_LDADD = $(libdw) $(libmudflap)
-#show_ciefde_LDADD = ../libdwarf/libdwarf.so $(libelf) $(libmudflap)
-asm_tst1_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-asm_tst2_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-asm_tst3_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-asm_tst4_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-asm_tst5_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-asm_tst6_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-asm_tst7_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-asm_tst8_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-asm_tst9_LDADD = $(libasm) $(libebl) $(libelf) $(libmudflap) -ldl
-dwflmodtest_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl
-rdwrmmap_LDADD = $(libelf) $(libmudflap)
-dwfl_bug_addr_overflow_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl
-arls_LDADD = $(libelf) $(libmudflap)
-dwfl_bug_fd_leak_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl
-dwfl_bug_report_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl
-dwfl_bug_getmodules_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl
-dwfl_addr_sect_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl
-dwarf_getmacros_LDADD = $(libdw) $(libmudflap)
-dwarf_getstring_LDADD = $(libdw) $(libmudflap)
-addrcfi_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl
-test_flag_nobits_LDADD = $(libelf) $(libmudflap)
-rerequest_tag_LDADD = $(libdw) $(libmudflap)
-alldts_LDADD = $(libebl) $(libelf) $(libmudflap)
+arextract_LDADD = $(libelf)
+arsymtest_LDADD = $(libelf)
+newfile_LDADD = $(libelf)
+saridx_LDADD = $(libelf)
+scnnames_LDADD = $(libelf)
+sectiondump_LDADD = $(libelf)
+showptable_LDADD = $(libelf)
+hash_LDADD = $(libelf)
+test_nlist_LDADD = $(libelf)
+msg_tst_LDADD = $(libelf)
+newscn_LDADD = $(libelf)
+early_offscn_LDADD = $(libelf)
+ecp_LDADD = $(libelf)
+update1_LDADD = $(libelf)
+update2_LDADD = $(libelf)
+update3_LDADD = $(libebl) $(libelf)
+update4_LDADD = $(libebl) $(libelf)
+show_die_info_LDADD = $(libdw) $(libelf)
+get_pubnames_LDADD = $(libdw) $(libelf)
+show_abbrev_LDADD = $(libdw) $(libelf)
+get_lines_LDADD = $(libdw) $(libelf)
+get_files_LDADD = $(libdw) $(libelf)
+get_aranges_LDADD = $(libdw) $(libelf)
+allfcts_LDADD = $(libdw) $(libelf)
+line2addr_LDADD = $(libdw)
+addrscopes_LDADD = $(libdw)
+funcscopes_LDADD = $(libdw)
+funcretval_LDADD = $(libdw)
+allregs_LDADD = $(libdw)
+find_prologues_LDADD = $(libdw)
+#show_ciefde_LDADD = ../libdwarf/libdwarf.so $(libelf)
+asm_tst1_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+asm_tst2_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+asm_tst3_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+asm_tst4_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+asm_tst5_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+asm_tst6_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+asm_tst7_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+asm_tst8_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+asm_tst9_LDADD = $(libasm) $(libebl) $(libelf) -ldl
+dwflmodtest_LDADD = $(libdw) $(libebl) $(libelf) -ldl
+rdwrmmap_LDADD = $(libelf)
+dwfl_bug_addr_overflow_LDADD = $(libdw) $(libebl) $(libelf) -ldl
+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) -ldl
+dwarf_getmacros_LDADD = $(libdw)
+dwarf_getstring_LDADD = $(libdw)
+addrcfi_LDADD = $(libdw) $(libebl) $(libelf) -ldl
+test_flag_nobits_LDADD = $(libelf)
+rerequest_tag_LDADD = $(libdw)
+alldts_LDADD = $(libebl) $(libelf)
 md5_sha1_test_LDADD = $(libeu)
-typeiter_LDADD = $(libdw) $(libelf) $(libmudflap)
-low_high_pc_LDADD = $(libdw) $(libelf) $(libmudflap)
-test_elf_cntl_gelf_getshdr_LDADD = $(libelf) $(libmudflap)
+typeiter_LDADD = $(libdw) $(libelf)
+typeiter2_LDADD = $(libdw) $(libelf)
+low_high_pc_LDADD = $(libdw) $(libelf)
+test_elf_cntl_gelf_getshdr_LDADD = $(libelf)
+dwflsyms_LDADD = $(libdw) $(libelf)
+dwfllines_LDADD = $(libdw) $(libelf)
+dwfl_report_elf_align_LDADD = $(libdw)
+varlocs_LDADD = $(libdw) $(libelf)
+backtrace_LDADD = $(libdw) $(libelf)
+# backtrace-child-biarch also uses those *_CFLAGS and *_LDLAGS variables:
+backtrace_child_CFLAGS = -fPIE
+backtrace_child_LDFLAGS = -pie -pthread
+backtrace_child_biarch_SOURCES = backtrace-child.c
+backtrace_data_LDADD = $(libdw) $(libelf)
+backtrace_dwarf_CFLAGS = -Wno-unused-parameter
+backtrace_dwarf_LDADD = $(libdw) $(libelf)
+debuglink_LDADD = $(libdw) $(libelf)
+debugaltlink_LDADD = $(libdw) $(libelf)
+buildid_LDADD = $(libdw) $(libelf)
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .c .o .obj
+.SUFFIXES: .c .log .o .obj .test .test$(EXEEXT) .trs
 $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/eu.am $(am__configure_deps)
        @for dep in $?; do \
          case '$(am__configure_deps)' in \
@@ -718,177 +1165,282 @@ $(am__aclocal_m4_deps):
 
 clean-checkPROGRAMS:
        -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS)
+
 addrcfi$(EXEEXT): $(addrcfi_OBJECTS) $(addrcfi_DEPENDENCIES) $(EXTRA_addrcfi_DEPENDENCIES) 
        @rm -f addrcfi$(EXEEXT)
-       $(LINK) $(addrcfi_OBJECTS) $(addrcfi_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(addrcfi_OBJECTS) $(addrcfi_LDADD) $(LIBS)
+
 addrscopes$(EXEEXT): $(addrscopes_OBJECTS) $(addrscopes_DEPENDENCIES) $(EXTRA_addrscopes_DEPENDENCIES) 
        @rm -f addrscopes$(EXEEXT)
-       $(LINK) $(addrscopes_OBJECTS) $(addrscopes_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(addrscopes_OBJECTS) $(addrscopes_LDADD) $(LIBS)
+
 alldts$(EXEEXT): $(alldts_OBJECTS) $(alldts_DEPENDENCIES) $(EXTRA_alldts_DEPENDENCIES) 
        @rm -f alldts$(EXEEXT)
-       $(LINK) $(alldts_OBJECTS) $(alldts_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(alldts_OBJECTS) $(alldts_LDADD) $(LIBS)
+
 allfcts$(EXEEXT): $(allfcts_OBJECTS) $(allfcts_DEPENDENCIES) $(EXTRA_allfcts_DEPENDENCIES) 
        @rm -f allfcts$(EXEEXT)
-       $(LINK) $(allfcts_OBJECTS) $(allfcts_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(allfcts_OBJECTS) $(allfcts_LDADD) $(LIBS)
+
 allregs$(EXEEXT): $(allregs_OBJECTS) $(allregs_DEPENDENCIES) $(EXTRA_allregs_DEPENDENCIES) 
        @rm -f allregs$(EXEEXT)
-       $(LINK) $(allregs_OBJECTS) $(allregs_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(allregs_OBJECTS) $(allregs_LDADD) $(LIBS)
+
 arextract$(EXEEXT): $(arextract_OBJECTS) $(arextract_DEPENDENCIES) $(EXTRA_arextract_DEPENDENCIES) 
        @rm -f arextract$(EXEEXT)
-       $(LINK) $(arextract_OBJECTS) $(arextract_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(arextract_OBJECTS) $(arextract_LDADD) $(LIBS)
+
 arls$(EXEEXT): $(arls_OBJECTS) $(arls_DEPENDENCIES) $(EXTRA_arls_DEPENDENCIES) 
        @rm -f arls$(EXEEXT)
-       $(LINK) $(arls_OBJECTS) $(arls_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(arls_OBJECTS) $(arls_LDADD) $(LIBS)
+
 arsymtest$(EXEEXT): $(arsymtest_OBJECTS) $(arsymtest_DEPENDENCIES) $(EXTRA_arsymtest_DEPENDENCIES) 
        @rm -f arsymtest$(EXEEXT)
-       $(LINK) $(arsymtest_OBJECTS) $(arsymtest_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(arsymtest_OBJECTS) $(arsymtest_LDADD) $(LIBS)
+
 asm-tst1$(EXEEXT): $(asm_tst1_OBJECTS) $(asm_tst1_DEPENDENCIES) $(EXTRA_asm_tst1_DEPENDENCIES) 
        @rm -f asm-tst1$(EXEEXT)
-       $(LINK) $(asm_tst1_OBJECTS) $(asm_tst1_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(asm_tst1_OBJECTS) $(asm_tst1_LDADD) $(LIBS)
+
 asm-tst2$(EXEEXT): $(asm_tst2_OBJECTS) $(asm_tst2_DEPENDENCIES) $(EXTRA_asm_tst2_DEPENDENCIES) 
        @rm -f asm-tst2$(EXEEXT)
-       $(LINK) $(asm_tst2_OBJECTS) $(asm_tst2_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(asm_tst2_OBJECTS) $(asm_tst2_LDADD) $(LIBS)
+
 asm-tst3$(EXEEXT): $(asm_tst3_OBJECTS) $(asm_tst3_DEPENDENCIES) $(EXTRA_asm_tst3_DEPENDENCIES) 
        @rm -f asm-tst3$(EXEEXT)
-       $(LINK) $(asm_tst3_OBJECTS) $(asm_tst3_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(asm_tst3_OBJECTS) $(asm_tst3_LDADD) $(LIBS)
+
 asm-tst4$(EXEEXT): $(asm_tst4_OBJECTS) $(asm_tst4_DEPENDENCIES) $(EXTRA_asm_tst4_DEPENDENCIES) 
        @rm -f asm-tst4$(EXEEXT)
-       $(LINK) $(asm_tst4_OBJECTS) $(asm_tst4_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(asm_tst4_OBJECTS) $(asm_tst4_LDADD) $(LIBS)
+
 asm-tst5$(EXEEXT): $(asm_tst5_OBJECTS) $(asm_tst5_DEPENDENCIES) $(EXTRA_asm_tst5_DEPENDENCIES) 
        @rm -f asm-tst5$(EXEEXT)
-       $(LINK) $(asm_tst5_OBJECTS) $(asm_tst5_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(asm_tst5_OBJECTS) $(asm_tst5_LDADD) $(LIBS)
+
 asm-tst6$(EXEEXT): $(asm_tst6_OBJECTS) $(asm_tst6_DEPENDENCIES) $(EXTRA_asm_tst6_DEPENDENCIES) 
        @rm -f asm-tst6$(EXEEXT)
-       $(LINK) $(asm_tst6_OBJECTS) $(asm_tst6_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(asm_tst6_OBJECTS) $(asm_tst6_LDADD) $(LIBS)
+
 asm-tst7$(EXEEXT): $(asm_tst7_OBJECTS) $(asm_tst7_DEPENDENCIES) $(EXTRA_asm_tst7_DEPENDENCIES) 
        @rm -f asm-tst7$(EXEEXT)
-       $(LINK) $(asm_tst7_OBJECTS) $(asm_tst7_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(asm_tst7_OBJECTS) $(asm_tst7_LDADD) $(LIBS)
+
 asm-tst8$(EXEEXT): $(asm_tst8_OBJECTS) $(asm_tst8_DEPENDENCIES) $(EXTRA_asm_tst8_DEPENDENCIES) 
        @rm -f asm-tst8$(EXEEXT)
-       $(LINK) $(asm_tst8_OBJECTS) $(asm_tst8_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(asm_tst8_OBJECTS) $(asm_tst8_LDADD) $(LIBS)
+
 asm-tst9$(EXEEXT): $(asm_tst9_OBJECTS) $(asm_tst9_DEPENDENCIES) $(EXTRA_asm_tst9_DEPENDENCIES) 
        @rm -f asm-tst9$(EXEEXT)
-       $(LINK) $(asm_tst9_OBJECTS) $(asm_tst9_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(asm_tst9_OBJECTS) $(asm_tst9_LDADD) $(LIBS)
+
+backtrace$(EXEEXT): $(backtrace_OBJECTS) $(backtrace_DEPENDENCIES) $(EXTRA_backtrace_DEPENDENCIES) 
+       @rm -f backtrace$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(backtrace_OBJECTS) $(backtrace_LDADD) $(LIBS)
+
+backtrace-child$(EXEEXT): $(backtrace_child_OBJECTS) $(backtrace_child_DEPENDENCIES) $(EXTRA_backtrace_child_DEPENDENCIES) 
+       @rm -f backtrace-child$(EXEEXT)
+       $(AM_V_CCLD)$(backtrace_child_LINK) $(backtrace_child_OBJECTS) $(backtrace_child_LDADD) $(LIBS)
+
+backtrace-data$(EXEEXT): $(backtrace_data_OBJECTS) $(backtrace_data_DEPENDENCIES) $(EXTRA_backtrace_data_DEPENDENCIES) 
+       @rm -f backtrace-data$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(backtrace_data_OBJECTS) $(backtrace_data_LDADD) $(LIBS)
+
+backtrace-dwarf$(EXEEXT): $(backtrace_dwarf_OBJECTS) $(backtrace_dwarf_DEPENDENCIES) $(EXTRA_backtrace_dwarf_DEPENDENCIES) 
+       @rm -f backtrace-dwarf$(EXEEXT)
+       $(AM_V_CCLD)$(backtrace_dwarf_LINK) $(backtrace_dwarf_OBJECTS) $(backtrace_dwarf_LDADD) $(LIBS)
+
+buildid$(EXEEXT): $(buildid_OBJECTS) $(buildid_DEPENDENCIES) $(EXTRA_buildid_DEPENDENCIES) 
+       @rm -f buildid$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(buildid_OBJECTS) $(buildid_LDADD) $(LIBS)
+
+debugaltlink$(EXEEXT): $(debugaltlink_OBJECTS) $(debugaltlink_DEPENDENCIES) $(EXTRA_debugaltlink_DEPENDENCIES) 
+       @rm -f debugaltlink$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(debugaltlink_OBJECTS) $(debugaltlink_LDADD) $(LIBS)
+
+debuglink$(EXEEXT): $(debuglink_OBJECTS) $(debuglink_DEPENDENCIES) $(EXTRA_debuglink_DEPENDENCIES) 
+       @rm -f debuglink$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(debuglink_OBJECTS) $(debuglink_LDADD) $(LIBS)
+
 dwarf-getmacros$(EXEEXT): $(dwarf_getmacros_OBJECTS) $(dwarf_getmacros_DEPENDENCIES) $(EXTRA_dwarf_getmacros_DEPENDENCIES) 
        @rm -f dwarf-getmacros$(EXEEXT)
-       $(LINK) $(dwarf_getmacros_OBJECTS) $(dwarf_getmacros_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(dwarf_getmacros_OBJECTS) $(dwarf_getmacros_LDADD) $(LIBS)
+
 dwarf-getstring$(EXEEXT): $(dwarf_getstring_OBJECTS) $(dwarf_getstring_DEPENDENCIES) $(EXTRA_dwarf_getstring_DEPENDENCIES) 
        @rm -f dwarf-getstring$(EXEEXT)
-       $(LINK) $(dwarf_getstring_OBJECTS) $(dwarf_getstring_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(dwarf_getstring_OBJECTS) $(dwarf_getstring_LDADD) $(LIBS)
+
 dwfl-addr-sect$(EXEEXT): $(dwfl_addr_sect_OBJECTS) $(dwfl_addr_sect_DEPENDENCIES) $(EXTRA_dwfl_addr_sect_DEPENDENCIES) 
        @rm -f dwfl-addr-sect$(EXEEXT)
-       $(LINK) $(dwfl_addr_sect_OBJECTS) $(dwfl_addr_sect_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(dwfl_addr_sect_OBJECTS) $(dwfl_addr_sect_LDADD) $(LIBS)
+
 dwfl-bug-addr-overflow$(EXEEXT): $(dwfl_bug_addr_overflow_OBJECTS) $(dwfl_bug_addr_overflow_DEPENDENCIES) $(EXTRA_dwfl_bug_addr_overflow_DEPENDENCIES) 
        @rm -f dwfl-bug-addr-overflow$(EXEEXT)
-       $(LINK) $(dwfl_bug_addr_overflow_OBJECTS) $(dwfl_bug_addr_overflow_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(dwfl_bug_addr_overflow_OBJECTS) $(dwfl_bug_addr_overflow_LDADD) $(LIBS)
+
 dwfl-bug-fd-leak$(EXEEXT): $(dwfl_bug_fd_leak_OBJECTS) $(dwfl_bug_fd_leak_DEPENDENCIES) $(EXTRA_dwfl_bug_fd_leak_DEPENDENCIES) 
        @rm -f dwfl-bug-fd-leak$(EXEEXT)
-       $(LINK) $(dwfl_bug_fd_leak_OBJECTS) $(dwfl_bug_fd_leak_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(dwfl_bug_fd_leak_OBJECTS) $(dwfl_bug_fd_leak_LDADD) $(LIBS)
+
 dwfl-bug-getmodules$(EXEEXT): $(dwfl_bug_getmodules_OBJECTS) $(dwfl_bug_getmodules_DEPENDENCIES) $(EXTRA_dwfl_bug_getmodules_DEPENDENCIES) 
        @rm -f dwfl-bug-getmodules$(EXEEXT)
-       $(LINK) $(dwfl_bug_getmodules_OBJECTS) $(dwfl_bug_getmodules_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(dwfl_bug_getmodules_OBJECTS) $(dwfl_bug_getmodules_LDADD) $(LIBS)
+
 dwfl-bug-report$(EXEEXT): $(dwfl_bug_report_OBJECTS) $(dwfl_bug_report_DEPENDENCIES) $(EXTRA_dwfl_bug_report_DEPENDENCIES) 
        @rm -f dwfl-bug-report$(EXEEXT)
-       $(LINK) $(dwfl_bug_report_OBJECTS) $(dwfl_bug_report_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(dwfl_bug_report_OBJECTS) $(dwfl_bug_report_LDADD) $(LIBS)
+
+dwfl-report-elf-align$(EXEEXT): $(dwfl_report_elf_align_OBJECTS) $(dwfl_report_elf_align_DEPENDENCIES) $(EXTRA_dwfl_report_elf_align_DEPENDENCIES) 
+       @rm -f dwfl-report-elf-align$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(dwfl_report_elf_align_OBJECTS) $(dwfl_report_elf_align_LDADD) $(LIBS)
+
+dwfllines$(EXEEXT): $(dwfllines_OBJECTS) $(dwfllines_DEPENDENCIES) $(EXTRA_dwfllines_DEPENDENCIES) 
+       @rm -f dwfllines$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(dwfllines_OBJECTS) $(dwfllines_LDADD) $(LIBS)
+
 dwflmodtest$(EXEEXT): $(dwflmodtest_OBJECTS) $(dwflmodtest_DEPENDENCIES) $(EXTRA_dwflmodtest_DEPENDENCIES) 
        @rm -f dwflmodtest$(EXEEXT)
-       $(LINK) $(dwflmodtest_OBJECTS) $(dwflmodtest_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(dwflmodtest_OBJECTS) $(dwflmodtest_LDADD) $(LIBS)
+
+dwflsyms$(EXEEXT): $(dwflsyms_OBJECTS) $(dwflsyms_DEPENDENCIES) $(EXTRA_dwflsyms_DEPENDENCIES) 
+       @rm -f dwflsyms$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(dwflsyms_OBJECTS) $(dwflsyms_LDADD) $(LIBS)
+
 early-offscn$(EXEEXT): $(early_offscn_OBJECTS) $(early_offscn_DEPENDENCIES) $(EXTRA_early_offscn_DEPENDENCIES) 
        @rm -f early-offscn$(EXEEXT)
-       $(LINK) $(early_offscn_OBJECTS) $(early_offscn_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(early_offscn_OBJECTS) $(early_offscn_LDADD) $(LIBS)
+
 ecp$(EXEEXT): $(ecp_OBJECTS) $(ecp_DEPENDENCIES) $(EXTRA_ecp_DEPENDENCIES) 
        @rm -f ecp$(EXEEXT)
-       $(LINK) $(ecp_OBJECTS) $(ecp_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(ecp_OBJECTS) $(ecp_LDADD) $(LIBS)
+
 find-prologues$(EXEEXT): $(find_prologues_OBJECTS) $(find_prologues_DEPENDENCIES) $(EXTRA_find_prologues_DEPENDENCIES) 
        @rm -f find-prologues$(EXEEXT)
-       $(LINK) $(find_prologues_OBJECTS) $(find_prologues_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(find_prologues_OBJECTS) $(find_prologues_LDADD) $(LIBS)
+
 funcretval$(EXEEXT): $(funcretval_OBJECTS) $(funcretval_DEPENDENCIES) $(EXTRA_funcretval_DEPENDENCIES) 
        @rm -f funcretval$(EXEEXT)
-       $(LINK) $(funcretval_OBJECTS) $(funcretval_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(funcretval_OBJECTS) $(funcretval_LDADD) $(LIBS)
+
 funcscopes$(EXEEXT): $(funcscopes_OBJECTS) $(funcscopes_DEPENDENCIES) $(EXTRA_funcscopes_DEPENDENCIES) 
        @rm -f funcscopes$(EXEEXT)
-       $(LINK) $(funcscopes_OBJECTS) $(funcscopes_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(funcscopes_OBJECTS) $(funcscopes_LDADD) $(LIBS)
+
 get-aranges$(EXEEXT): $(get_aranges_OBJECTS) $(get_aranges_DEPENDENCIES) $(EXTRA_get_aranges_DEPENDENCIES) 
        @rm -f get-aranges$(EXEEXT)
-       $(LINK) $(get_aranges_OBJECTS) $(get_aranges_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(get_aranges_OBJECTS) $(get_aranges_LDADD) $(LIBS)
+
 get-files$(EXEEXT): $(get_files_OBJECTS) $(get_files_DEPENDENCIES) $(EXTRA_get_files_DEPENDENCIES) 
        @rm -f get-files$(EXEEXT)
-       $(LINK) $(get_files_OBJECTS) $(get_files_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(get_files_OBJECTS) $(get_files_LDADD) $(LIBS)
+
 get-lines$(EXEEXT): $(get_lines_OBJECTS) $(get_lines_DEPENDENCIES) $(EXTRA_get_lines_DEPENDENCIES) 
        @rm -f get-lines$(EXEEXT)
-       $(LINK) $(get_lines_OBJECTS) $(get_lines_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(get_lines_OBJECTS) $(get_lines_LDADD) $(LIBS)
+
 get-pubnames$(EXEEXT): $(get_pubnames_OBJECTS) $(get_pubnames_DEPENDENCIES) $(EXTRA_get_pubnames_DEPENDENCIES) 
        @rm -f get-pubnames$(EXEEXT)
-       $(LINK) $(get_pubnames_OBJECTS) $(get_pubnames_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(get_pubnames_OBJECTS) $(get_pubnames_LDADD) $(LIBS)
+
 hash$(EXEEXT): $(hash_OBJECTS) $(hash_DEPENDENCIES) $(EXTRA_hash_DEPENDENCIES) 
        @rm -f hash$(EXEEXT)
-       $(LINK) $(hash_OBJECTS) $(hash_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(hash_OBJECTS) $(hash_LDADD) $(LIBS)
+
 line2addr$(EXEEXT): $(line2addr_OBJECTS) $(line2addr_DEPENDENCIES) $(EXTRA_line2addr_DEPENDENCIES) 
        @rm -f line2addr$(EXEEXT)
-       $(LINK) $(line2addr_OBJECTS) $(line2addr_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(line2addr_OBJECTS) $(line2addr_LDADD) $(LIBS)
+
 low_high_pc$(EXEEXT): $(low_high_pc_OBJECTS) $(low_high_pc_DEPENDENCIES) $(EXTRA_low_high_pc_DEPENDENCIES) 
        @rm -f low_high_pc$(EXEEXT)
-       $(LINK) $(low_high_pc_OBJECTS) $(low_high_pc_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(low_high_pc_OBJECTS) $(low_high_pc_LDADD) $(LIBS)
+
 md5-sha1-test$(EXEEXT): $(md5_sha1_test_OBJECTS) $(md5_sha1_test_DEPENDENCIES) $(EXTRA_md5_sha1_test_DEPENDENCIES) 
        @rm -f md5-sha1-test$(EXEEXT)
-       $(LINK) $(md5_sha1_test_OBJECTS) $(md5_sha1_test_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(md5_sha1_test_OBJECTS) $(md5_sha1_test_LDADD) $(LIBS)
+
 msg_tst$(EXEEXT): $(msg_tst_OBJECTS) $(msg_tst_DEPENDENCIES) $(EXTRA_msg_tst_DEPENDENCIES) 
        @rm -f msg_tst$(EXEEXT)
-       $(LINK) $(msg_tst_OBJECTS) $(msg_tst_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(msg_tst_OBJECTS) $(msg_tst_LDADD) $(LIBS)
+
 newfile$(EXEEXT): $(newfile_OBJECTS) $(newfile_DEPENDENCIES) $(EXTRA_newfile_DEPENDENCIES) 
        @rm -f newfile$(EXEEXT)
-       $(LINK) $(newfile_OBJECTS) $(newfile_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(newfile_OBJECTS) $(newfile_LDADD) $(LIBS)
+
 newscn$(EXEEXT): $(newscn_OBJECTS) $(newscn_DEPENDENCIES) $(EXTRA_newscn_DEPENDENCIES) 
        @rm -f newscn$(EXEEXT)
-       $(LINK) $(newscn_OBJECTS) $(newscn_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(newscn_OBJECTS) $(newscn_LDADD) $(LIBS)
+
 rdwrmmap$(EXEEXT): $(rdwrmmap_OBJECTS) $(rdwrmmap_DEPENDENCIES) $(EXTRA_rdwrmmap_DEPENDENCIES) 
        @rm -f rdwrmmap$(EXEEXT)
-       $(LINK) $(rdwrmmap_OBJECTS) $(rdwrmmap_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(rdwrmmap_OBJECTS) $(rdwrmmap_LDADD) $(LIBS)
+
 rerequest_tag$(EXEEXT): $(rerequest_tag_OBJECTS) $(rerequest_tag_DEPENDENCIES) $(EXTRA_rerequest_tag_DEPENDENCIES) 
        @rm -f rerequest_tag$(EXEEXT)
-       $(LINK) $(rerequest_tag_OBJECTS) $(rerequest_tag_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(rerequest_tag_OBJECTS) $(rerequest_tag_LDADD) $(LIBS)
+
 saridx$(EXEEXT): $(saridx_OBJECTS) $(saridx_DEPENDENCIES) $(EXTRA_saridx_DEPENDENCIES) 
        @rm -f saridx$(EXEEXT)
-       $(LINK) $(saridx_OBJECTS) $(saridx_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(saridx_OBJECTS) $(saridx_LDADD) $(LIBS)
+
 scnnames$(EXEEXT): $(scnnames_OBJECTS) $(scnnames_DEPENDENCIES) $(EXTRA_scnnames_DEPENDENCIES) 
        @rm -f scnnames$(EXEEXT)
-       $(LINK) $(scnnames_OBJECTS) $(scnnames_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(scnnames_OBJECTS) $(scnnames_LDADD) $(LIBS)
+
 sectiondump$(EXEEXT): $(sectiondump_OBJECTS) $(sectiondump_DEPENDENCIES) $(EXTRA_sectiondump_DEPENDENCIES) 
        @rm -f sectiondump$(EXEEXT)
-       $(LINK) $(sectiondump_OBJECTS) $(sectiondump_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(sectiondump_OBJECTS) $(sectiondump_LDADD) $(LIBS)
+
 show-abbrev$(EXEEXT): $(show_abbrev_OBJECTS) $(show_abbrev_DEPENDENCIES) $(EXTRA_show_abbrev_DEPENDENCIES) 
        @rm -f show-abbrev$(EXEEXT)
-       $(LINK) $(show_abbrev_OBJECTS) $(show_abbrev_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(show_abbrev_OBJECTS) $(show_abbrev_LDADD) $(LIBS)
+
 show-die-info$(EXEEXT): $(show_die_info_OBJECTS) $(show_die_info_DEPENDENCIES) $(EXTRA_show_die_info_DEPENDENCIES) 
        @rm -f show-die-info$(EXEEXT)
-       $(LINK) $(show_die_info_OBJECTS) $(show_die_info_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(show_die_info_OBJECTS) $(show_die_info_LDADD) $(LIBS)
+
 showptable$(EXEEXT): $(showptable_OBJECTS) $(showptable_DEPENDENCIES) $(EXTRA_showptable_DEPENDENCIES) 
        @rm -f showptable$(EXEEXT)
-       $(LINK) $(showptable_OBJECTS) $(showptable_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(showptable_OBJECTS) $(showptable_LDADD) $(LIBS)
+
 test-elf_cntl_gelf_getshdr$(EXEEXT): $(test_elf_cntl_gelf_getshdr_OBJECTS) $(test_elf_cntl_gelf_getshdr_DEPENDENCIES) $(EXTRA_test_elf_cntl_gelf_getshdr_DEPENDENCIES) 
        @rm -f test-elf_cntl_gelf_getshdr$(EXEEXT)
-       $(LINK) $(test_elf_cntl_gelf_getshdr_OBJECTS) $(test_elf_cntl_gelf_getshdr_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(test_elf_cntl_gelf_getshdr_OBJECTS) $(test_elf_cntl_gelf_getshdr_LDADD) $(LIBS)
+
 test-flag-nobits$(EXEEXT): $(test_flag_nobits_OBJECTS) $(test_flag_nobits_DEPENDENCIES) $(EXTRA_test_flag_nobits_DEPENDENCIES) 
        @rm -f test-flag-nobits$(EXEEXT)
-       $(LINK) $(test_flag_nobits_OBJECTS) $(test_flag_nobits_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(test_flag_nobits_OBJECTS) $(test_flag_nobits_LDADD) $(LIBS)
+
 test-nlist$(EXEEXT): $(test_nlist_OBJECTS) $(test_nlist_DEPENDENCIES) $(EXTRA_test_nlist_DEPENDENCIES) 
        @rm -f test-nlist$(EXEEXT)
-       $(LINK) $(test_nlist_OBJECTS) $(test_nlist_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(test_nlist_OBJECTS) $(test_nlist_LDADD) $(LIBS)
+
 typeiter$(EXEEXT): $(typeiter_OBJECTS) $(typeiter_DEPENDENCIES) $(EXTRA_typeiter_DEPENDENCIES) 
        @rm -f typeiter$(EXEEXT)
-       $(LINK) $(typeiter_OBJECTS) $(typeiter_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(typeiter_OBJECTS) $(typeiter_LDADD) $(LIBS)
+
+typeiter2$(EXEEXT): $(typeiter2_OBJECTS) $(typeiter2_DEPENDENCIES) $(EXTRA_typeiter2_DEPENDENCIES) 
+       @rm -f typeiter2$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(typeiter2_OBJECTS) $(typeiter2_LDADD) $(LIBS)
+
 update1$(EXEEXT): $(update1_OBJECTS) $(update1_DEPENDENCIES) $(EXTRA_update1_DEPENDENCIES) 
        @rm -f update1$(EXEEXT)
-       $(LINK) $(update1_OBJECTS) $(update1_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(update1_OBJECTS) $(update1_LDADD) $(LIBS)
+
 update2$(EXEEXT): $(update2_OBJECTS) $(update2_DEPENDENCIES) $(EXTRA_update2_DEPENDENCIES) 
        @rm -f update2$(EXEEXT)
-       $(LINK) $(update2_OBJECTS) $(update2_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(update2_OBJECTS) $(update2_LDADD) $(LIBS)
+
 update3$(EXEEXT): $(update3_OBJECTS) $(update3_DEPENDENCIES) $(EXTRA_update3_DEPENDENCIES) 
        @rm -f update3$(EXEEXT)
-       $(LINK) $(update3_OBJECTS) $(update3_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(update3_OBJECTS) $(update3_LDADD) $(LIBS)
+
 update4$(EXEEXT): $(update4_OBJECTS) $(update4_DEPENDENCIES) $(EXTRA_update4_DEPENDENCIES) 
        @rm -f update4$(EXEEXT)
-       $(LINK) $(update4_OBJECTS) $(update4_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(LINK) $(update4_OBJECTS) $(update4_LDADD) $(LIBS)
+
+varlocs$(EXEEXT): $(varlocs_OBJECTS) $(varlocs_DEPENDENCIES) $(EXTRA_varlocs_DEPENDENCIES) 
+       @rm -f varlocs$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(varlocs_OBJECTS) $(varlocs_LDADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -913,6 +1465,14 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asm-tst7.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asm-tst8.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asm-tst9.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backtrace-child.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backtrace-data.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backtrace.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backtrace_child-backtrace-child.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backtrace_dwarf-backtrace-dwarf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buildid.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugaltlink.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debuglink.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf-getmacros.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwarf-getstring.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwfl-addr-sect.Po@am__quote@
@@ -920,7 +1480,10 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwfl-bug-fd-leak.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwfl-bug-getmodules.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwfl-bug-report.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwfl-report-elf-align.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwfllines.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwflmodtest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dwflsyms.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/early-offscn.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecp.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/find-prologues.Po@am__quote@
@@ -949,45 +1512,64 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-flag-nobits.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-nlist.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/typeiter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/typeiter2.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/update1.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/update2.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/update3.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/update4.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/varlocs.Po@am__quote@
 
 .c.o:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
 
 .c.obj:
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+backtrace_child-backtrace-child.o: backtrace-child.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(backtrace_child_CFLAGS) $(CFLAGS) -MT backtrace_child-backtrace-child.o -MD -MP -MF $(DEPDIR)/backtrace_child-backtrace-child.Tpo -c -o backtrace_child-backtrace-child.o `test -f 'backtrace-child.c' || echo '$(srcdir)/'`backtrace-child.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/backtrace_child-backtrace-child.Tpo $(DEPDIR)/backtrace_child-backtrace-child.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='backtrace-child.c' object='backtrace_child-backtrace-child.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(backtrace_child_CFLAGS) $(CFLAGS) -c -o backtrace_child-backtrace-child.o `test -f 'backtrace-child.c' || echo '$(srcdir)/'`backtrace-child.c
+
+backtrace_child-backtrace-child.obj: backtrace-child.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(backtrace_child_CFLAGS) $(CFLAGS) -MT backtrace_child-backtrace-child.obj -MD -MP -MF $(DEPDIR)/backtrace_child-backtrace-child.Tpo -c -o backtrace_child-backtrace-child.obj `if test -f 'backtrace-child.c'; then $(CYGPATH_W) 'backtrace-child.c'; else $(CYGPATH_W) '$(srcdir)/backtrace-child.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/backtrace_child-backtrace-child.Tpo $(DEPDIR)/backtrace_child-backtrace-child.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='backtrace-child.c' object='backtrace_child-backtrace-child.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(backtrace_child_CFLAGS) $(CFLAGS) -c -o backtrace_child-backtrace-child.obj `if test -f 'backtrace-child.c'; then $(CYGPATH_W) 'backtrace-child.c'; else $(CYGPATH_W) '$(srcdir)/backtrace-child.c'; fi`
+
+backtrace_dwarf-backtrace-dwarf.o: backtrace-dwarf.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(backtrace_dwarf_CFLAGS) $(CFLAGS) -MT backtrace_dwarf-backtrace-dwarf.o -MD -MP -MF $(DEPDIR)/backtrace_dwarf-backtrace-dwarf.Tpo -c -o backtrace_dwarf-backtrace-dwarf.o `test -f 'backtrace-dwarf.c' || echo '$(srcdir)/'`backtrace-dwarf.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/backtrace_dwarf-backtrace-dwarf.Tpo $(DEPDIR)/backtrace_dwarf-backtrace-dwarf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='backtrace-dwarf.c' object='backtrace_dwarf-backtrace-dwarf.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(backtrace_dwarf_CFLAGS) $(CFLAGS) -c -o backtrace_dwarf-backtrace-dwarf.o `test -f 'backtrace-dwarf.c' || echo '$(srcdir)/'`backtrace-dwarf.c
+
+backtrace_dwarf-backtrace-dwarf.obj: backtrace-dwarf.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(backtrace_dwarf_CFLAGS) $(CFLAGS) -MT backtrace_dwarf-backtrace-dwarf.obj -MD -MP -MF $(DEPDIR)/backtrace_dwarf-backtrace-dwarf.Tpo -c -o backtrace_dwarf-backtrace-dwarf.obj `if test -f 'backtrace-dwarf.c'; then $(CYGPATH_W) 'backtrace-dwarf.c'; else $(CYGPATH_W) '$(srcdir)/backtrace-dwarf.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/backtrace_dwarf-backtrace-dwarf.Tpo $(DEPDIR)/backtrace_dwarf-backtrace-dwarf.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='backtrace-dwarf.c' object='backtrace_dwarf-backtrace-dwarf.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
-       mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(backtrace_dwarf_CFLAGS) $(CFLAGS) -c -o backtrace_dwarf-backtrace-dwarf.obj `if test -f 'backtrace-dwarf.c'; then $(CYGPATH_W) 'backtrace-dwarf.c'; else $(CYGPATH_W) '$(srcdir)/backtrace-dwarf.c'; fi`
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
        set x; \
        here=`pwd`; \
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+       $(am__define_uniq_tagged_files); \
        shift; \
        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
          test -n "$$unique" || unique=$$empty_fix; \
@@ -999,15 +1581,11 @@ TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
              $$unique; \
          fi; \
        fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-               $(TAGS_FILES) $(LISP)
-       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-       unique=`for i in $$list; do \
-           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-         done | \
-         $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-             END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
        test -z "$(CTAGS_ARGS)$$unique" \
          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
             $$unique
@@ -1016,102 +1594,1041 @@ GTAGS:
        here=`$(am__cd) $(top_builddir) && pwd` \
          && $(am__cd) $(top_srcdir) \
          && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
 
 distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 
-check-TESTS: $(TESTS)
-       @failed=0; all=0; xfail=0; xpass=0; skip=0; \
-       srcdir=$(srcdir); export srcdir; \
-       list=' $(TESTS) '; \
-       $(am__tty_colors); \
-       if test -n "$$list"; then \
-         for tst in $$list; do \
-           if test -f ./$$tst; then dir=./; \
-           elif test -f $$tst; then dir=; \
-           else dir="$(srcdir)/"; fi; \
-           if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
-             all=`expr $$all + 1`; \
-             case " $(XFAIL_TESTS) " in \
-             *[\ \     ]$$tst[\ \      ]*) \
-               xpass=`expr $$xpass + 1`; \
-               failed=`expr $$failed + 1`; \
-               col=$$red; res=XPASS; \
-             ;; \
-             *) \
-               col=$$grn; res=PASS; \
-             ;; \
-             esac; \
-           elif test $$? -ne 77; then \
-             all=`expr $$all + 1`; \
-             case " $(XFAIL_TESTS) " in \
-             *[\ \     ]$$tst[\ \      ]*) \
-               xfail=`expr $$xfail + 1`; \
-               col=$$lgn; res=XFAIL; \
-             ;; \
-             *) \
-               failed=`expr $$failed + 1`; \
-               col=$$red; res=FAIL; \
-             ;; \
-             esac; \
-           else \
-             skip=`expr $$skip + 1`; \
-             col=$$blu; res=SKIP; \
-           fi; \
-           echo "$${col}$$res$${std}: $$tst"; \
-         done; \
-         if test "$$all" -eq 1; then \
-           tests="test"; \
-           All=""; \
-         else \
-           tests="tests"; \
-           All="All "; \
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+       rm -f $< $@
+       $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+       @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+       @$(am__set_TESTS_bases); \
+       am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+       redo_bases=`for i in $$bases; do \
+                     am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+                   done`; \
+       if test -n "$$redo_bases"; then \
+         redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+         redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+         if $(am__make_dryrun); then :; else \
+           rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
          fi; \
-         if test "$$failed" -eq 0; then \
-           if test "$$xfail" -eq 0; then \
-             banner="$$All$$all $$tests passed"; \
-           else \
-             if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
-             banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
-           fi; \
-         else \
-           if test "$$xpass" -eq 0; then \
-             banner="$$failed of $$all $$tests failed"; \
+       fi; \
+       if test -n "$$am__remaking_logs"; then \
+         echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+              "recursion detected" >&2; \
+       else \
+         am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+       fi; \
+       if $(am__make_dryrun); then :; else \
+         st=0;  \
+         errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+         for i in $$redo_bases; do \
+           test -f $$i.trs && test -r $$i.trs \
+             || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+           test -f $$i.log && test -r $$i.log \
+             || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+         done; \
+         test $$st -eq 0 || exit 1; \
+       fi
+       @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+       ws='[   ]'; \
+       results=`for b in $$bases; do echo $$b.trs; done`; \
+       test -n "$$results" || results=/dev/null; \
+       all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+       pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+       fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+       skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+       xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+       xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+       error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+       if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+         success=true; \
+       else \
+         success=false; \
+       fi; \
+       br='==================='; br=$$br$$br$$br$$br; \
+       result_count () \
+       { \
+           if test x"$$1" = x"--maybe-color"; then \
+             maybe_colorize=yes; \
+           elif test x"$$1" = x"--no-color"; then \
+             maybe_colorize=no; \
            else \
-             if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
-             banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+             echo "$@: invalid 'result_count' usage" >&2; exit 4; \
            fi; \
-         fi; \
-         dashes="$$banner"; \
-         skipped=""; \
-         if test "$$skip" -ne 0; then \
-           if test "$$skip" -eq 1; then \
-             skipped="($$skip test was not run)"; \
+           shift; \
+           desc=$$1 count=$$2; \
+           if test $$maybe_colorize = yes && test $$count -gt 0; then \
+             color_start=$$3 color_end=$$std; \
            else \
-             skipped="($$skip tests were not run)"; \
+             color_start= color_end=; \
            fi; \
-           test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
-             dashes="$$skipped"; \
-         fi; \
-         report=""; \
-         if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
-           report="Please report to $(PACKAGE_BUGREPORT)"; \
-           test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
-             dashes="$$report"; \
-         fi; \
-         dashes=`echo "$$dashes" | sed s/./=/g`; \
-         if test "$$failed" -eq 0; then \
-           col="$$grn"; \
-         else \
-           col="$$red"; \
-         fi; \
-         echo "$${col}$$dashes$${std}"; \
-         echo "$${col}$$banner$${std}"; \
-         test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
-         test -z "$$report" || echo "$${col}$$report$${std}"; \
-         echo "$${col}$$dashes$${std}"; \
-         test "$$failed" -eq 0; \
-       else :; fi
+           echo "$${color_start}# $$desc $$count$${color_end}"; \
+       }; \
+       create_testsuite_report () \
+       { \
+         result_count $$1 "TOTAL:" $$all   "$$brg"; \
+         result_count $$1 "PASS: " $$pass  "$$grn"; \
+         result_count $$1 "SKIP: " $$skip  "$$blu"; \
+         result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+         result_count $$1 "FAIL: " $$fail  "$$red"; \
+         result_count $$1 "XPASS:" $$xpass "$$red"; \
+         result_count $$1 "ERROR:" $$error "$$mgn"; \
+       }; \
+       {                                                               \
+         echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |       \
+           $(am__rst_title);                                           \
+         create_testsuite_report --no-color;                           \
+         echo;                                                         \
+         echo ".. contents:: :depth: 2";                               \
+         echo;                                                         \
+         for b in $$bases; do echo $$b; done                           \
+           | $(am__create_global_log);                                 \
+       } >$(TEST_SUITE_LOG).tmp || exit 1;                             \
+       mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);                     \
+       if $$success; then                                              \
+         col="$$grn";                                                  \
+        else                                                           \
+         col="$$red";                                                  \
+         test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);               \
+       fi;                                                             \
+       echo "$${col}$$br$${std}";                                      \
+       echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";   \
+       echo "$${col}$$br$${std}";                                      \
+       create_testsuite_report --maybe-color;                          \
+       echo "$$col$$br$$std";                                          \
+       if $$success; then :; else                                      \
+         echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";         \
+         if test -n "$(PACKAGE_BUGREPORT)"; then                       \
+           echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+         fi;                                                           \
+         echo "$$col$$br$$std";                                        \
+       fi;                                                             \
+       $$success || exit 1
+
+check-TESTS:
+       @list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+       @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+       log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+       exit $$?;
+recheck: all $(check_PROGRAMS)
+       @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+       @set +e; $(am__set_TESTS_bases); \
+       bases=`for i in $$bases; do echo $$i; done \
+                | $(am__list_recheck_tests)` || exit 1; \
+       log_list=`for i in $$bases; do echo $$i.log; done`; \
+       log_list=`echo $$log_list`; \
+       $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+               am__force_recheck=am--force-recheck \
+               TEST_LOGS="$$log_list"; \
+       exit $$?
+run-arextract.sh.log: run-arextract.sh
+       @p='run-arextract.sh'; \
+       b='run-arextract.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-arsymtest.sh.log: run-arsymtest.sh
+       @p='run-arsymtest.sh'; \
+       b='run-arsymtest.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+newfile.log: newfile$(EXEEXT)
+       @p='newfile$(EXEEXT)'; \
+       b='newfile'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+test-nlist.log: test-nlist$(EXEEXT)
+       @p='test-nlist$(EXEEXT)'; \
+       b='test-nlist'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+update1.log: update1$(EXEEXT)
+       @p='update1$(EXEEXT)'; \
+       b='update1'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+update2.log: update2$(EXEEXT)
+       @p='update2$(EXEEXT)'; \
+       b='update2'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+update3.log: update3$(EXEEXT)
+       @p='update3$(EXEEXT)'; \
+       b='update3'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+update4.log: update4$(EXEEXT)
+       @p='update4$(EXEEXT)'; \
+       b='update4'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-show-die-info.sh.log: run-show-die-info.sh
+       @p='run-show-die-info.sh'; \
+       b='run-show-die-info.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-get-files.sh.log: run-get-files.sh
+       @p='run-get-files.sh'; \
+       b='run-get-files.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-get-lines.sh.log: run-get-lines.sh
+       @p='run-get-lines.sh'; \
+       b='run-get-lines.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-get-pubnames.sh.log: run-get-pubnames.sh
+       @p='run-get-pubnames.sh'; \
+       b='run-get-pubnames.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-get-aranges.sh.log: run-get-aranges.sh
+       @p='run-get-aranges.sh'; \
+       b='run-get-aranges.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-allfcts.sh.log: run-allfcts.sh
+       @p='run-allfcts.sh'; \
+       b='run-allfcts.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-show-abbrev.sh.log: run-show-abbrev.sh
+       @p='run-show-abbrev.sh'; \
+       b='run-show-abbrev.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-line2addr.sh.log: run-line2addr.sh
+       @p='run-line2addr.sh'; \
+       b='run-line2addr.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+hash.log: hash$(EXEEXT)
+       @p='hash$(EXEEXT)'; \
+       b='hash'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+newscn.log: newscn$(EXEEXT)
+       @p='newscn$(EXEEXT)'; \
+       b='newscn'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-strip-test.sh.log: run-strip-test.sh
+       @p='run-strip-test.sh'; \
+       b='run-strip-test.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-strip-test2.sh.log: run-strip-test2.sh
+       @p='run-strip-test2.sh'; \
+       b='run-strip-test2.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-strip-test3.sh.log: run-strip-test3.sh
+       @p='run-strip-test3.sh'; \
+       b='run-strip-test3.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-strip-test4.sh.log: run-strip-test4.sh
+       @p='run-strip-test4.sh'; \
+       b='run-strip-test4.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-strip-test5.sh.log: run-strip-test5.sh
+       @p='run-strip-test5.sh'; \
+       b='run-strip-test5.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-strip-test6.sh.log: run-strip-test6.sh
+       @p='run-strip-test6.sh'; \
+       b='run-strip-test6.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-strip-test7.sh.log: run-strip-test7.sh
+       @p='run-strip-test7.sh'; \
+       b='run-strip-test7.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-strip-test8.sh.log: run-strip-test8.sh
+       @p='run-strip-test8.sh'; \
+       b='run-strip-test8.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-strip-groups.sh.log: run-strip-groups.sh
+       @p='run-strip-groups.sh'; \
+       b='run-strip-groups.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-strip-reloc.sh.log: run-strip-reloc.sh
+       @p='run-strip-reloc.sh'; \
+       b='run-strip-reloc.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-unstrip-test.sh.log: run-unstrip-test.sh
+       @p='run-unstrip-test.sh'; \
+       b='run-unstrip-test.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-unstrip-test2.sh.log: run-unstrip-test2.sh
+       @p='run-unstrip-test2.sh'; \
+       b='run-unstrip-test2.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-unstrip-M.sh.log: run-unstrip-M.sh
+       @p='run-unstrip-M.sh'; \
+       b='run-unstrip-M.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-ecp-test.sh.log: run-ecp-test.sh
+       @p='run-ecp-test.sh'; \
+       b='run-ecp-test.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-ecp-test2.sh.log: run-ecp-test2.sh
+       @p='run-ecp-test2.sh'; \
+       b='run-ecp-test2.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-alldts.sh.log: run-alldts.sh
+       @p='run-alldts.sh'; \
+       b='run-alldts.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-elflint-test.sh.log: run-elflint-test.sh
+       @p='run-elflint-test.sh'; \
+       b='run-elflint-test.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-elflint-self.sh.log: run-elflint-self.sh
+       @p='run-elflint-self.sh'; \
+       b='run-elflint-self.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-ranlib-test.sh.log: run-ranlib-test.sh
+       @p='run-ranlib-test.sh'; \
+       b='run-ranlib-test.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-ranlib-test2.sh.log: run-ranlib-test2.sh
+       @p='run-ranlib-test2.sh'; \
+       b='run-ranlib-test2.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-ranlib-test3.sh.log: run-ranlib-test3.sh
+       @p='run-ranlib-test3.sh'; \
+       b='run-ranlib-test3.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-ranlib-test4.sh.log: run-ranlib-test4.sh
+       @p='run-ranlib-test4.sh'; \
+       b='run-ranlib-test4.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-addrscopes.sh.log: run-addrscopes.sh
+       @p='run-addrscopes.sh'; \
+       b='run-addrscopes.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-strings-test.sh.log: run-strings-test.sh
+       @p='run-strings-test.sh'; \
+       b='run-strings-test.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-funcscopes.sh.log: run-funcscopes.sh
+       @p='run-funcscopes.sh'; \
+       b='run-funcscopes.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-find-prologues.sh.log: run-find-prologues.sh
+       @p='run-find-prologues.sh'; \
+       b='run-find-prologues.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-allregs.sh.log: run-allregs.sh
+       @p='run-allregs.sh'; \
+       b='run-allregs.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-addrcfi.sh.log: run-addrcfi.sh
+       @p='run-addrcfi.sh'; \
+       b='run-addrcfi.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-nm-self.sh.log: run-nm-self.sh
+       @p='run-nm-self.sh'; \
+       b='run-nm-self.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-self.sh.log: run-readelf-self.sh
+       @p='run-readelf-self.sh'; \
+       b='run-readelf-self.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-test1.sh.log: run-readelf-test1.sh
+       @p='run-readelf-test1.sh'; \
+       b='run-readelf-test1.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-test2.sh.log: run-readelf-test2.sh
+       @p='run-readelf-test2.sh'; \
+       b='run-readelf-test2.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-test3.sh.log: run-readelf-test3.sh
+       @p='run-readelf-test3.sh'; \
+       b='run-readelf-test3.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-test4.sh.log: run-readelf-test4.sh
+       @p='run-readelf-test4.sh'; \
+       b='run-readelf-test4.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-twofiles.sh.log: run-readelf-twofiles.sh
+       @p='run-readelf-twofiles.sh'; \
+       b='run-readelf-twofiles.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-macro.sh.log: run-readelf-macro.sh
+       @p='run-readelf-macro.sh'; \
+       b='run-readelf-macro.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-loc.sh.log: run-readelf-loc.sh
+       @p='run-readelf-loc.sh'; \
+       b='run-readelf-loc.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-aranges.sh.log: run-readelf-aranges.sh
+       @p='run-readelf-aranges.sh'; \
+       b='run-readelf-aranges.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-line.sh.log: run-readelf-line.sh
+       @p='run-readelf-line.sh'; \
+       b='run-readelf-line.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-native-test.sh.log: run-native-test.sh
+       @p='run-native-test.sh'; \
+       b='run-native-test.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-bug1-test.sh.log: run-bug1-test.sh
+       @p='run-bug1-test.sh'; \
+       b='run-bug1-test.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-debuglink.sh.log: run-debuglink.sh
+       @p='run-debuglink.sh'; \
+       b='run-debuglink.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-debugaltlink.sh.log: run-debugaltlink.sh
+       @p='run-debugaltlink.sh'; \
+       b='run-debugaltlink.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-buildid.sh.log: run-buildid.sh
+       @p='run-buildid.sh'; \
+       b='run-buildid.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+dwfl-bug-addr-overflow.log: dwfl-bug-addr-overflow$(EXEEXT)
+       @p='dwfl-bug-addr-overflow$(EXEEXT)'; \
+       b='dwfl-bug-addr-overflow'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-addrname-test.sh.log: run-addrname-test.sh
+       @p='run-addrname-test.sh'; \
+       b='run-addrname-test.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+dwfl-bug-fd-leak.log: dwfl-bug-fd-leak$(EXEEXT)
+       @p='dwfl-bug-fd-leak$(EXEEXT)'; \
+       b='dwfl-bug-fd-leak'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+dwfl-bug-report.log: dwfl-bug-report$(EXEEXT)
+       @p='dwfl-bug-report$(EXEEXT)'; \
+       b='dwfl-bug-report'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-dwfl-bug-offline-rel.sh.log: run-dwfl-bug-offline-rel.sh
+       @p='run-dwfl-bug-offline-rel.sh'; \
+       b='run-dwfl-bug-offline-rel.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-dwfl-addr-sect.sh.log: run-dwfl-addr-sect.sh
+       @p='run-dwfl-addr-sect.sh'; \
+       b='run-dwfl-addr-sect.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-disasm-x86.sh.log: run-disasm-x86.sh
+       @p='run-disasm-x86.sh'; \
+       b='run-disasm-x86.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-disasm-x86-64.sh.log: run-disasm-x86-64.sh
+       @p='run-disasm-x86-64.sh'; \
+       b='run-disasm-x86-64.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-early-offscn.sh.log: run-early-offscn.sh
+       @p='run-early-offscn.sh'; \
+       b='run-early-offscn.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-dwarf-getmacros.sh.log: run-dwarf-getmacros.sh
+       @p='run-dwarf-getmacros.sh'; \
+       b='run-dwarf-getmacros.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-test-flag-nobits.sh.log: run-test-flag-nobits.sh
+       @p='run-test-flag-nobits.sh'; \
+       b='run-test-flag-nobits.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-prelink-addr-test.sh.log: run-prelink-addr-test.sh
+       @p='run-prelink-addr-test.sh'; \
+       b='run-prelink-addr-test.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-dwarf-getstring.sh.log: run-dwarf-getstring.sh
+       @p='run-dwarf-getstring.sh'; \
+       b='run-dwarf-getstring.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-rerequest_tag.sh.log: run-rerequest_tag.sh
+       @p='run-rerequest_tag.sh'; \
+       b='run-rerequest_tag.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-typeiter.sh.log: run-typeiter.sh
+       @p='run-typeiter.sh'; \
+       b='run-typeiter.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-d.sh.log: run-readelf-d.sh
+       @p='run-readelf-d.sh'; \
+       b='run-readelf-d.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-gdb_index.sh.log: run-readelf-gdb_index.sh
+       @p='run-readelf-gdb_index.sh'; \
+       b='run-readelf-gdb_index.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-unstrip-n.sh.log: run-unstrip-n.sh
+       @p='run-unstrip-n.sh'; \
+       b='run-unstrip-n.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-low_high_pc.sh.log: run-low_high_pc.sh
+       @p='run-low_high_pc.sh'; \
+       b='run-low_high_pc.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-macro-test.sh.log: run-macro-test.sh
+       @p='run-macro-test.sh'; \
+       b='run-macro-test.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-elf_cntl_gelf_getshdr.sh.log: run-elf_cntl_gelf_getshdr.sh
+       @p='run-elf_cntl_gelf_getshdr.sh'; \
+       b='run-elf_cntl_gelf_getshdr.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-test-archive64.sh.log: run-test-archive64.sh
+       @p='run-test-archive64.sh'; \
+       b='run-test-archive64.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-vmcoreinfo.sh.log: run-readelf-vmcoreinfo.sh
+       @p='run-readelf-vmcoreinfo.sh'; \
+       b='run-readelf-vmcoreinfo.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-mixed-corenote.sh.log: run-readelf-mixed-corenote.sh
+       @p='run-readelf-mixed-corenote.sh'; \
+       b='run-readelf-mixed-corenote.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-dwfllines.sh.log: run-dwfllines.sh
+       @p='run-dwfllines.sh'; \
+       b='run-dwfllines.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-dwfl-report-elf-align.sh.log: run-dwfl-report-elf-align.sh
+       @p='run-dwfl-report-elf-align.sh'; \
+       b='run-dwfl-report-elf-align.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-addr2line-test.sh.log: run-addr2line-test.sh
+       @p='run-addr2line-test.sh'; \
+       b='run-addr2line-test.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-addr2line-i-test.sh.log: run-addr2line-i-test.sh
+       @p='run-addr2line-i-test.sh'; \
+       b='run-addr2line-i-test.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-varlocs.sh.log: run-varlocs.sh
+       @p='run-varlocs.sh'; \
+       b='run-varlocs.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-funcretval.sh.log: run-funcretval.sh
+       @p='run-funcretval.sh'; \
+       b='run-funcretval.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-backtrace-native.sh.log: run-backtrace-native.sh
+       @p='run-backtrace-native.sh'; \
+       b='run-backtrace-native.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-backtrace-data.sh.log: run-backtrace-data.sh
+       @p='run-backtrace-data.sh'; \
+       b='run-backtrace-data.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-backtrace-dwarf.sh.log: run-backtrace-dwarf.sh
+       @p='run-backtrace-dwarf.sh'; \
+       b='run-backtrace-dwarf.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-backtrace-native-biarch.sh.log: run-backtrace-native-biarch.sh
+       @p='run-backtrace-native-biarch.sh'; \
+       b='run-backtrace-native-biarch.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-backtrace-native-core.sh.log: run-backtrace-native-core.sh
+       @p='run-backtrace-native-core.sh'; \
+       b='run-backtrace-native-core.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-backtrace-native-core-biarch.sh.log: run-backtrace-native-core-biarch.sh
+       @p='run-backtrace-native-core-biarch.sh'; \
+       b='run-backtrace-native-core-biarch.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-backtrace-core-x86_64.sh.log: run-backtrace-core-x86_64.sh
+       @p='run-backtrace-core-x86_64.sh'; \
+       b='run-backtrace-core-x86_64.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-backtrace-core-i386.sh.log: run-backtrace-core-i386.sh
+       @p='run-backtrace-core-i386.sh'; \
+       b='run-backtrace-core-i386.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-backtrace-core-ppc.sh.log: run-backtrace-core-ppc.sh
+       @p='run-backtrace-core-ppc.sh'; \
+       b='run-backtrace-core-ppc.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-backtrace-core-s390x.sh.log: run-backtrace-core-s390x.sh
+       @p='run-backtrace-core-s390x.sh'; \
+       b='run-backtrace-core-s390x.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-backtrace-core-s390.sh.log: run-backtrace-core-s390.sh
+       @p='run-backtrace-core-s390.sh'; \
+       b='run-backtrace-core-s390.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-backtrace-core-aarch64.sh.log: run-backtrace-core-aarch64.sh
+       @p='run-backtrace-core-aarch64.sh'; \
+       b='run-backtrace-core-aarch64.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-backtrace-demangle.sh.log: run-backtrace-demangle.sh
+       @p='run-backtrace-demangle.sh'; \
+       b='run-backtrace-demangle.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-stack-d-test.sh.log: run-stack-d-test.sh
+       @p='run-stack-d-test.sh'; \
+       b='run-stack-d-test.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-stack-i-test.sh.log: run-stack-i-test.sh
+       @p='run-stack-i-test.sh'; \
+       b='run-stack-i-test.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-dwz-multi.sh.log: run-readelf-dwz-multi.sh
+       @p='run-readelf-dwz-multi.sh'; \
+       b='run-readelf-dwz-multi.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-allfcts-multi.sh.log: run-allfcts-multi.sh
+       @p='run-allfcts-multi.sh'; \
+       b='run-allfcts-multi.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+msg_tst.log: msg_tst$(EXEEXT)
+       @p='msg_tst$(EXEEXT)'; \
+       b='msg_tst'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+md5-sha1-test.log: md5-sha1-test$(EXEEXT)
+       @p='md5-sha1-test$(EXEEXT)'; \
+       b='md5-sha1-test'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-s.sh.log: run-readelf-s.sh
+       @p='run-readelf-s.sh'; \
+       b='run-readelf-s.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-dwflsyms.sh.log: run-dwflsyms.sh
+       @p='run-dwflsyms.sh'; \
+       b='run-dwflsyms.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+run-readelf-zdebug.sh.log: run-readelf-zdebug.sh
+       @p='run-readelf-zdebug.sh'; \
+       b='run-readelf-zdebug.sh'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+asm-tst1.log: asm-tst1$(EXEEXT)
+       @p='asm-tst1$(EXEEXT)'; \
+       b='asm-tst1'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+asm-tst2.log: asm-tst2$(EXEEXT)
+       @p='asm-tst2$(EXEEXT)'; \
+       b='asm-tst2'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+asm-tst3.log: asm-tst3$(EXEEXT)
+       @p='asm-tst3$(EXEEXT)'; \
+       b='asm-tst3'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+asm-tst4.log: asm-tst4$(EXEEXT)
+       @p='asm-tst4$(EXEEXT)'; \
+       b='asm-tst4'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+asm-tst5.log: asm-tst5$(EXEEXT)
+       @p='asm-tst5$(EXEEXT)'; \
+       b='asm-tst5'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+asm-tst6.log: asm-tst6$(EXEEXT)
+       @p='asm-tst6$(EXEEXT)'; \
+       b='asm-tst6'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+asm-tst7.log: asm-tst7$(EXEEXT)
+       @p='asm-tst7$(EXEEXT)'; \
+       b='asm-tst7'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+asm-tst8.log: asm-tst8$(EXEEXT)
+       @p='asm-tst8$(EXEEXT)'; \
+       b='asm-tst8'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+asm-tst9.log: asm-tst9$(EXEEXT)
+       @p='asm-tst9$(EXEEXT)'; \
+       b='asm-tst9'; \
+       $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+       @p='$<'; \
+       $(am__set_b); \
+       $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+       --log-file $$b.log --trs-file $$b.trs \
+       $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+       "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@      @p='$<'; \
+@am__EXEEXT_TRUE@      $(am__set_b); \
+@am__EXEEXT_TRUE@      $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@      --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@      $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@      "$$tst" $(AM_TESTS_FD_REDIRECT)
 
 distdir: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -1169,6 +2686,9 @@ install-strip:
            "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
        fi
 mostlyclean-generic:
+       -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+       -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+       -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
 
 clean-generic:
        -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
@@ -1252,18 +2772,18 @@ uninstall-am:
 
 .MAKE: check-am install-am install-strip
 
-.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
-       clean-checkPROGRAMS clean-generic ctags distclean \
-       distclean-compile distclean-generic distclean-tags distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-html install-html-am \
-       install-info install-info-am install-man install-pdf \
-       install-pdf-am install-ps install-ps-am install-strip \
-       installcheck installcheck-am installcheck-local installdirs \
-       maintainer-clean maintainer-clean-generic mostlyclean \
-       mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
-       tags uninstall uninstall-am
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+       clean-checkPROGRAMS clean-generic cscopelist-am ctags ctags-am \
+       distclean distclean-compile distclean-generic distclean-tags \
+       distdir dvi dvi-am html html-am info info-am install \
+       install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installcheck-local \
+       installdirs maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
+       ps ps-am recheck tags tags-am uninstall uninstall-am
 
 
 %.os: %.c %.o
@@ -1275,9 +2795,22 @@ uninstall-am:
 @AMDEP_TRUE@   fi
 @AMDEP_FALSE@  $(COMPILE.os) -c -o $@ -fpic -DPIC -DSHARED $<
 
+# Substitute $(COMPILE).
+backtrace-child-biarch$(EXEEXT): backtrace-child.c
+       $(CC_BIARCH) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+                    $(AM_CPPFLAGS) $(CPPFLAGS) \
+                    $(AM_CFLAGS) $(CFLAGS) $(backtrace_child_CFLAGS) \
+                    $(AM_LDFLAGS) $(LDFLAGS) $(backtrace_child_LDFLAGS) \
+                    -o $@ $<
+
+@BIARCH_FALSE@export ELFUTILS_DISABLE_BIARCH = 1
+
+@DEMANGLE_FALSE@export ELFUTILS_DISABLE_DEMANGLE = 1
+
 @STANDALONE_FALSE@installcheck-local:
 @STANDALONE_FALSE@     $(MAKE) $(AM_MAKEFLAGS) \
-@STANDALONE_FALSE@             TESTS_ENVIRONMENT='$(installed_TESTS_ENVIRONMENT)' check-TESTS
+@STANDALONE_FALSE@             TESTS_ENVIRONMENT="$(installed_TESTS_ENVIRONMENT)" \
+@STANDALONE_FALSE@             LOG_COMPILER="$(installed_LOG_COMPILER)" check-TESTS
 
 @GCOV_TRUE@check: check-am coverage
 @GCOV_TRUE@.PHONY: coverage
index bc8bc32..8a2d126 100644 (file)
@@ -1,5 +1,5 @@
 /* Test program for CFI handling.
-   Copyright (C) 2009-2010 Red Hat, Inc.
+   Copyright (C) 2009-2010, 2013 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
 #include <stdio_ext.h>
 #include <locale.h>
 #include <stdlib.h>
-#include <error.h>
 #include <string.h>
 
+#include "../libdw/known-dwarf.h"
+
+static const char *
+op_name (unsigned int code)
+{
+  static const char *const known[] =
+    {
+#define ONE_KNOWN_DW_OP_DESC(NAME, CODE, DESC) ONE_KNOWN_DW_OP (NAME, CODE)
+#define ONE_KNOWN_DW_OP(NAME, CODE) [CODE] = #NAME,
+      ALL_KNOWN_DW_OP
+#undef ONE_KNOWN_DW_OP
+#undef ONE_KNOWN_DW_OP_DESC
+    };
+
+  if (likely (code < sizeof (known) / sizeof (known[0])))
+    return known[code];
+
+  return NULL;
+}
 
 static void
 print_detail (int result, const Dwarf_Op *ops, size_t nops, Dwarf_Addr bias)
@@ -35,13 +53,13 @@ print_detail (int result, const Dwarf_Op *ops, size_t nops, Dwarf_Addr bias)
   if (result < 0)
     printf ("indeterminate (%s)\n", dwarf_errmsg (-1));
   else if (nops == 0)
-    printf ("%s\n", result == 0 ? "same_value" : "undefined");
+    printf ("%s\n", ops == NULL ? "same_value" : "undefined");
   else
     {
       printf ("%s expression:", result == 0 ? "location" : "value");
       for (size_t i = 0; i < nops; ++i)
        {
-         printf (" %#x", ops[i].atom);
+         printf (" %s", op_name(ops[i].atom));
          if (ops[i].number2 == 0)
            {
              if (ops[i].atom == DW_OP_addr)
@@ -89,10 +107,16 @@ static int
 handle_cfi (Dwfl *dwfl, const char *which, Dwarf_CFI *cfi,
            GElf_Addr pc, struct stuff *stuff)
 {
+  if (cfi == NULL)
+    {
+      printf ("handle_cfi no CFI (%s): %s\n", which, dwarf_errmsg (-1));
+      return -1;
+    }
+
   int result = dwarf_cfi_addrframe (cfi, pc - stuff->bias, &stuff->frame);
   if (result != 0)
     {
-      error (0, 0, "dwarf_cfi_addrframe (%s): %s", which, dwarf_errmsg (-1));
+      printf ("dwarf_cfi_addrframe (%s): %s\n", which, dwarf_errmsg (-1));
       return 1;
     }
 
@@ -116,7 +140,10 @@ handle_cfi (Dwfl *dwfl, const char *which, Dwarf_CFI *cfi,
     printf ("\treturn address in reg%u%s\n",
            ra_regno, signalp ? " (signal frame)" : "");
 
-  Dwarf_Op *cfa_ops;
+  // Point cfa_ops to dummy to match print_detail expectations.
+  // (nops == 0 && cfa_ops != NULL => "undefined")
+  Dwarf_Op dummy;
+  Dwarf_Op *cfa_ops = &dummy;
   size_t cfa_nops;
   result = dwarf_frame_cfa (stuff->frame, &cfa_ops, &cfa_nops);
 
index f14b493..d3c8d26 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2005 Red Hat, Inc.
+/* Copyright (C) 2005, 2013 Red Hat, Inc.
    This file is part of elfutils.
 
    This file is free software; you can redistribute it and/or modify
 # include <config.h>
 #endif
 
+#include <err.h>
 #include <fcntl.h>
 #include ELFUTILS_HEADER(dw)
+#include ELFUTILS_HEADER(dwelf)
 #include <stdio.h>
 #include <unistd.h>
 
@@ -34,9 +36,31 @@ cb (Dwarf_Die *func, void *arg __attribute__ ((unused)))
 
   printf ("%s:%d:%s\n", file, line, fct);
 
-  return DWARF_CB_OK;
+  return DWARF_CB_ABORT;
 }
 
+static Dwarf *
+setup_alt (Dwarf *main)
+{
+  const char *alt_name;
+  const void *build_id;
+  ssize_t ret = dwelf_dwarf_gnu_debugaltlink (main, &alt_name, &build_id);
+  if (ret == 0)
+    return NULL;
+  if (ret == -1)
+    errx (1, "dwelf_dwarf_gnu_debugaltlink: %s", dwarf_errmsg (-1));
+  int fd = open (alt_name, O_RDONLY);
+  if (fd < 0)
+    err (1, "open (%s)", alt_name);
+  Dwarf *dbg_alt = dwarf_begin (fd, DWARF_C_READ);
+  if (dbg_alt == NULL)
+    errx (1, "dwarf_begin (%s): %s", alt_name, dwarf_errmsg (-1));
+  if (elf_cntl (dwarf_getelf (dbg_alt), ELF_C_FDREAD) != 0)
+    errx (1, "elf_cntl (%s, ELF_C_FDREAD): %s", alt_name, elf_errmsg (-1));
+  close (fd);
+  dwarf_setalt (main, dbg_alt);
+  return dbg_alt;
+}
 
 int
 main (int argc, char *argv[])
@@ -44,6 +68,8 @@ main (int argc, char *argv[])
   for (int i = 1; i < argc; ++i)
     {
       int fd = open (argv[i], O_RDONLY);
+      if (fd < 0)
+       err (1, "open (%s)", argv[i]);
 
       Dwarf *dbg = dwarf_begin (fd, DWARF_C_READ);
       if (dbg != NULL)
@@ -51,19 +77,32 @@ main (int argc, char *argv[])
          Dwarf_Off off = 0;
          size_t cuhl;
          Dwarf_Off noff;
+         Dwarf *dbg_alt = setup_alt (dbg);
 
          while (dwarf_nextcu (dbg, off, &noff, &cuhl, NULL, NULL, NULL) == 0)
            {
              Dwarf_Die die_mem;
              Dwarf_Die *die = dwarf_offdie (dbg, off + cuhl, &die_mem);
 
-             (void) dwarf_getfuncs (die, cb, NULL, 0);
+             /* Explicitly stop in the callback and then resume each time.  */
+             ptrdiff_t doff = 0;
+             do
+               {
+                 doff = dwarf_getfuncs (die, cb, NULL, doff);
+                 if (dwarf_errno () != 0)
+                   errx (1, "dwarf_getfuncs (%s): %s",
+                         argv[i], dwarf_errmsg (-1));
+               }
+             while (doff != 0);
 
              off = noff;
            }
 
+         dwarf_end (dbg_alt);
          dwarf_end (dbg);
        }
+      else
+       errx (1, "dwarf_begin (%s): %s", argv[i], dwarf_errmsg (-1));
 
       close (fd);
     }
diff --git a/tests/backtrace-child.c b/tests/backtrace-child.c
new file mode 100644 (file)
index 0000000..788801c
--- /dev/null
@@ -0,0 +1,240 @@
+/* Test child for parent backtrace test.
+   Copyright (C) 2013 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/>.  */
+
+/* Command line syntax: ./backtrace-child [--ptraceme|--gencore]
+   --ptraceme will call ptrace (PTRACE_TRACEME) in the two threads.
+   --gencore will call abort () at its end.
+   Main thread will signal SIGUSR2.  Other thread will signal SIGUSR1.
+   On x86_64 only:
+     PC will get changed to function 'jmp' by backtrace.c function
+     prepare_thread.  Then SIGUSR2 will be signalled to backtrace-child
+     which will invoke function sigusr2.
+     This is all done so that signal interrupts execution of the very first
+     instruction of a function.  Properly handled unwind should not slip into
+     the previous unrelated function.
+     The tested functionality is arch-independent but the code reproducing it
+     has to be arch-specific.
+   On non-x86_64:
+     sigusr2 gets called by normal function call from function stdarg.
+   On any arch then sigusr2 calls raise (SIGUSR1) for --ptraceme.
+   abort () is called otherwise, expected for --gencore core dump.
+
+   Expected x86_64 output:
+   TID 10276:
+   # 0 0x7f7ab61e9e6b      raise
+   # 1 0x7f7ab661af47 - 1  main
+   # 2 0x7f7ab5e3bb45 - 1  __libc_start_main
+   # 3 0x7f7ab661aa09 - 1  _start
+   TID 10278:
+   # 0 0x7f7ab61e9e6b      raise
+   # 1 0x7f7ab661ab3c - 1  sigusr2
+   # 2 0x7f7ab5e4fa60      __restore_rt
+   # 3 0x7f7ab661ab47      jmp
+   # 4 0x7f7ab661ac92 - 1  stdarg
+   # 5 0x7f7ab661acba - 1  backtracegen
+   # 6 0x7f7ab661acd1 - 1  start
+   # 7 0x7f7ab61e2c53 - 1  start_thread
+   # 8 0x7f7ab5f0fdbd - 1  __clone
+
+   Expected non-x86_64 (i386) output; __kernel_vsyscall are skipped if found:
+   TID 10408:
+   # 0 0xf779f430          __kernel_vsyscall
+   # 1 0xf7771466 - 1      raise
+   # 2 0xf77c1d07 - 1      main
+   # 3 0xf75bd963 - 1      __libc_start_main
+   # 4 0xf77c1761 - 1      _start
+   TID 10412:
+   # 0 0xf779f430          __kernel_vsyscall
+   # 1 0xf7771466 - 1      raise
+   # 2 0xf77c18f4 - 1      sigusr2
+   # 3 0xf77c1a10 - 1      stdarg
+   # 4 0xf77c1a2c - 1      backtracegen
+   # 5 0xf77c1a48 - 1      start
+   # 6 0xf77699da - 1      start_thread
+   # 7 0xf769bbfe - 1      __clone
+   */
+
+#include <config.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <errno.h>
+#include <sys/ptrace.h>
+#include <string.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#ifndef __linux__
+
+int
+main (int argc __attribute__ ((unused)), char **argv)
+{
+  fprintf (stderr, "%s: Unwinding not supported for this architecture\n",
+           argv[0]);
+  return 77;
+}
+
+#else /* __linux__ */
+
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+#define NOINLINE_NOCLONE __attribute__ ((noinline, noclone))
+#else
+#define NOINLINE_NOCLONE __attribute__ ((noinline))
+#endif
+
+#define NORETURN __attribute__ ((noreturn))
+#define UNUSED __attribute__ ((unused))
+#define USED __attribute__ ((used))
+
+static int ptraceme, gencore;
+
+/* Execution will arrive here from jmp by an artificial ptrace-spawn signal.  */
+
+static NOINLINE_NOCLONE void
+sigusr2 (int signo)
+{
+  assert (signo == SIGUSR2);
+  if (! gencore)
+    {
+      raise (SIGUSR1);
+      /* Do not return as stack may be invalid due to ptrace-patched PC to the
+        jmp function.  */
+      pthread_exit (NULL);
+      /* Not reached.  */
+      abort ();
+    }
+  /* Here we dump the core for --gencore.  */
+  raise (SIGABRT);
+  /* Avoid tail call optimization for the raise call.  */
+  asm volatile ("");
+}
+
+static NOINLINE_NOCLONE void
+dummy1 (void)
+{
+  asm volatile ("");
+}
+
+#ifdef __x86_64__
+static NOINLINE_NOCLONE USED void
+jmp (void)
+{
+  /* Not reached, signal will get ptrace-spawn to jump into sigusr2.  */
+  abort ();
+}
+#endif
+
+static NOINLINE_NOCLONE void
+dummy2 (void)
+{
+  asm volatile ("");
+}
+
+static NOINLINE_NOCLONE NORETURN void
+stdarg (int f UNUSED, ...)
+{
+  sighandler_t sigusr2_orig = signal (SIGUSR2, sigusr2);
+  assert (sigusr2_orig == SIG_DFL);
+  errno = 0;
+  if (ptraceme)
+    {
+      long l = ptrace (PTRACE_TRACEME, 0, NULL, NULL);
+      assert_perror (errno);
+      assert (l == 0);
+    }
+#ifdef __x86_64__
+  if (! gencore)
+    {
+      /* Execution will get PC patched into function jmp.  */
+      raise (SIGUSR1);
+    }
+#endif
+  sigusr2 (SIGUSR2);
+  /* Not reached.  */
+  abort ();
+}
+
+static NOINLINE_NOCLONE void
+dummy3 (void)
+{
+  asm volatile ("");
+}
+
+static NOINLINE_NOCLONE void
+backtracegen (void)
+{
+  stdarg (1);
+  /* Here should be no instruction after the stdarg call as it is noreturn
+     function.  It must be stdarg so that it is a call and not jump (jump as
+     a tail-call).  */
+}
+
+static NOINLINE_NOCLONE void
+dummy4 (void)
+{
+  asm volatile ("");
+}
+
+static void *
+start (void *arg UNUSED)
+{
+  backtracegen ();
+  /* Not reached.  */
+  abort ();
+}
+
+int
+main (int argc UNUSED, char **argv)
+{
+  setbuf (stdout, NULL);
+  assert (*argv++);
+  ptraceme = (*argv && strcmp (*argv, "--ptraceme") == 0);
+  argv += ptraceme;
+  gencore = (*argv && strcmp (*argv, "--gencore") == 0);
+  argv += gencore;
+  assert (!*argv);
+  /* These dummy* functions are there so that each of their surrounding
+     functions has some unrelated code around.  The purpose of some of the
+     tests is verify unwinding the very first / after the very last instruction
+     does not inappropriately slip into the unrelated code around.  */
+  dummy1 ();
+  dummy2 ();
+  dummy3 ();
+  dummy4 ();
+  if (gencore)
+    printf ("%ld\n", (long) getpid ());
+  pthread_t thread;
+  int i = pthread_create (&thread, NULL, start, NULL);
+  // pthread_* functions do not set errno.
+  assert (i == 0);
+  if (ptraceme)
+    {
+      errno = 0;
+      long l = ptrace (PTRACE_TRACEME, 0, NULL, NULL);
+      assert_perror (errno);
+      assert (l == 0);
+    }
+  if (gencore)
+    pthread_join (thread, NULL);
+  else
+    raise (SIGUSR2);
+  return 0;
+}
+
+#endif /* ! __linux__ */
+
diff --git a/tests/backtrace-data.c b/tests/backtrace-data.c
new file mode 100644 (file)
index 0000000..01c1c00
--- /dev/null
@@ -0,0 +1,328 @@
+/* Test custom provided Dwfl_Thread_Callbacks vector.
+   Copyright (C) 2013 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/>.  */
+
+/* Test custom provided Dwfl_Thread_Callbacks vector.  Test mimics what
+   a ptrace based vector would do.  */
+
+#include <config.h>
+#include <assert.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdio_ext.h>
+#include <locale.h>
+#include <dirent.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <error.h>
+#include <unistd.h>
+#include <dwarf.h>
+#include <sys/resource.h>
+#include <sys/ptrace.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/user.h>
+#include <fcntl.h>
+#include <string.h>
+#include ELFUTILS_HEADER(dwfl)
+
+#if !defined(__x86_64__) || !defined(__linux__)
+
+int
+main (int argc __attribute__ ((unused)), char **argv)
+{
+  fprintf (stderr, "%s: Unwinding not supported for this architecture\n",
+          argv[0]);
+  return 77;
+}
+
+#else /* __x86_64__ && __linux__ */
+
+/* The only arch specific code is set_initial_registers.  */
+
+static int
+find_elf (Dwfl_Module *mod __attribute__ ((unused)),
+         void **userdata __attribute__ ((unused)),
+         const char *modname __attribute__ ((unused)),
+         Dwarf_Addr base __attribute__ ((unused)),
+         char **file_name __attribute__ ((unused)),
+         Elf **elfp __attribute__ ((unused)))
+{
+  /* Not used as modules are reported explicitly.  */
+  assert (0);
+}
+
+static bool
+memory_read (Dwfl *dwfl, Dwarf_Addr addr, Dwarf_Word *result,
+            void *dwfl_arg __attribute__ ((unused)))
+{
+  pid_t child = dwfl_pid (dwfl);
+
+  errno = 0;
+  long l = ptrace (PTRACE_PEEKDATA, child, (void *) (uintptr_t) addr, NULL);
+  assert_perror (errno);
+  *result = l;
+
+  /* We could also return false for failed ptrace.  */
+  return true;
+}
+
+/* Return filename and VMA address *BASEP where its mapping starts which
+   contains ADDR.  */
+
+static char *
+maps_lookup (pid_t pid, Dwarf_Addr addr, GElf_Addr *basep)
+{
+  char *fname;
+  int i = asprintf (&fname, "/proc/%ld/maps", (long) pid);
+  assert_perror (errno);
+  assert (i > 0);
+  FILE *f = fopen (fname, "r");
+  assert_perror (errno);
+  assert (f);
+  free (fname);
+  for (;;)
+    {
+      // 37e3c22000-37e3c23000 rw-p 00022000 00:11 49532 /lib64/ld-2.14.90.so */
+      unsigned long start, end, offset;
+      i = fscanf (f, "%lx-%lx %*s %lx %*x:%*x %*x", &start, &end, &offset);
+      assert_perror (errno);
+      assert (i == 3);
+      char *filename = strdup ("");
+      assert (filename);
+      size_t filename_len = 0;
+      for (;;)
+       {
+         int c = fgetc (f);
+         assert (c != EOF);
+         if (c == '\n')
+           break;
+         if (c == ' ' && *filename == '\0')
+           continue;
+         filename = realloc (filename, filename_len + 2);
+         assert (filename);
+         filename[filename_len++] = c;
+         filename[filename_len] = '\0';
+       }
+      if (start <= addr && addr < end)
+       {
+         i = fclose (f);
+         assert_perror (errno);
+         assert (i == 0);
+
+         *basep = start - offset;
+         return filename;
+       }
+      free (filename);
+    }
+}
+
+/* Add module containing ADDR to the DWFL address space.
+
+   dwfl_report_elf call here violates Dwfl manipulation as one should call
+   dwfl_report only between dwfl_report_begin_add and dwfl_report_end.
+   Current elfutils implementation does not mind as dwfl_report_begin_add is
+   empty.  */
+
+static Dwfl_Module *
+report_module (Dwfl *dwfl, pid_t child, Dwarf_Addr addr)
+{
+  GElf_Addr base;
+  char *long_name = maps_lookup (child, addr, &base);
+  Dwfl_Module *mod = dwfl_report_elf (dwfl, long_name, long_name, -1,
+                                     base, false /* add_p_vaddr */);
+  assert (mod);
+  free (long_name);
+  assert (dwfl_addrmodule (dwfl, addr) == mod);
+  return mod;
+}
+
+static pid_t
+next_thread (Dwfl *dwfl, void *dwfl_arg __attribute__ ((unused)),
+            void **thread_argp)
+{
+  if (*thread_argp != NULL)
+    return 0;
+  /* Put arbitrary non-NULL value into *THREAD_ARGP as a marker so that this
+     function returns non-zero PID only once.  */
+  *thread_argp = thread_argp;
+  return dwfl_pid (dwfl);
+}
+
+static bool
+set_initial_registers (Dwfl_Thread *thread,
+                      void *thread_arg __attribute__ ((unused)))
+{
+  pid_t child = dwfl_pid (dwfl_thread_dwfl (thread));
+
+  struct user_regs_struct user_regs;
+  long l = ptrace (PTRACE_GETREGS, child, NULL, &user_regs);
+  assert_perror (errno);
+  assert (l == 0);
+
+  Dwarf_Word dwarf_regs[17];
+  dwarf_regs[0] = user_regs.rax;
+  dwarf_regs[1] = user_regs.rdx;
+  dwarf_regs[2] = user_regs.rcx;
+  dwarf_regs[3] = user_regs.rbx;
+  dwarf_regs[4] = user_regs.rsi;
+  dwarf_regs[5] = user_regs.rdi;
+  dwarf_regs[6] = user_regs.rbp;
+  dwarf_regs[7] = user_regs.rsp;
+  dwarf_regs[8] = user_regs.r8;
+  dwarf_regs[9] = user_regs.r9;
+  dwarf_regs[10] = user_regs.r10;
+  dwarf_regs[11] = user_regs.r11;
+  dwarf_regs[12] = user_regs.r12;
+  dwarf_regs[13] = user_regs.r13;
+  dwarf_regs[14] = user_regs.r14;
+  dwarf_regs[15] = user_regs.r15;
+  dwarf_regs[16] = user_regs.rip;
+  bool ok = dwfl_thread_state_registers (thread, 0, 17, dwarf_regs);
+  assert (ok);
+
+  /* x86_64 has PC contained in its CFI subset of DWARF register set so
+     elfutils will figure out the real PC value from REGS.
+     So no need to explicitly call dwfl_thread_state_register_pc.  */
+
+  return true;
+}
+
+static const Dwfl_Thread_Callbacks callbacks =
+{
+  next_thread,
+  NULL, /* get_thread */
+  memory_read,
+  set_initial_registers,
+  NULL, /* detach */
+  NULL, /* thread_detach */
+};
+
+static int
+frame_callback (Dwfl_Frame *state, void *arg)
+{
+  unsigned *framenop = arg;
+  Dwarf_Addr pc;
+  bool isactivation;
+  if (! dwfl_frame_pc (state, &pc, &isactivation))
+    {
+      error (1, 0, "%s", dwfl_errmsg (-1));
+      return 1;
+    }
+  Dwarf_Addr pc_adjusted = pc - (isactivation ? 0 : 1);
+
+  /* Get PC->SYMNAME.  */
+  Dwfl *dwfl = dwfl_thread_dwfl (dwfl_frame_thread (state));
+  Dwfl_Module *mod = dwfl_addrmodule (dwfl, pc_adjusted);
+  if (mod == NULL)
+    mod = report_module (dwfl, dwfl_pid (dwfl), pc_adjusted);
+  const char *symname = NULL;
+  symname = dwfl_module_addrname (mod, pc_adjusted);
+
+  printf ("#%2u %#" PRIx64 "%4s\t%s\n", (*framenop)++, (uint64_t) pc,
+         ! isactivation ? "- 1" : "", symname);
+  return DWARF_CB_OK;
+}
+
+static int
+thread_callback (Dwfl_Thread *thread, void *thread_arg __attribute__ ((unused)))
+{
+  unsigned frameno = 0;
+  switch (dwfl_thread_getframes (thread, frame_callback, &frameno))
+    {
+    case 0:
+      break;
+    case -1:
+      error (1, 0, "dwfl_thread_getframes: %s", dwfl_errmsg (-1));
+    default:
+      abort ();
+    }
+  return DWARF_CB_OK;
+}
+
+int
+main (int argc __attribute__ ((unused)), char **argv __attribute__ ((unused)))
+{
+  /* We use no threads here which can interfere with handling a stream.  */
+  __fsetlocking (stdin, FSETLOCKING_BYCALLER);
+  __fsetlocking (stdout, FSETLOCKING_BYCALLER);
+  __fsetlocking (stderr, FSETLOCKING_BYCALLER);
+
+  /* Set locale.  */
+  (void) setlocale (LC_ALL, "");
+
+  elf_version (EV_CURRENT);
+
+  pid_t child = fork ();
+  switch (child)
+  {
+    case -1:
+      assert_perror (errno);
+      assert (0);
+    case 0:;
+      long l = ptrace (PTRACE_TRACEME, 0, NULL, NULL);
+      assert_perror (errno);
+      assert (l == 0);
+      raise (SIGUSR1);
+      return 0;
+    default:
+      break;
+  }
+
+  int status;
+  pid_t pid = waitpid (child, &status, 0);
+  assert_perror (errno);
+  assert (pid == child);
+  assert (WIFSTOPPED (status));
+  assert (WSTOPSIG (status) == SIGUSR1);
+
+  static char *debuginfo_path;
+  static const Dwfl_Callbacks offline_callbacks =
+    {
+      .find_debuginfo = dwfl_standard_find_debuginfo,
+      .debuginfo_path = &debuginfo_path,
+      .section_address = dwfl_offline_section_address,
+      .find_elf = find_elf,
+    };
+  Dwfl *dwfl = dwfl_begin (&offline_callbacks);
+  assert (dwfl);
+
+  struct user_regs_struct user_regs;
+  long l = ptrace (PTRACE_GETREGS, child, NULL, &user_regs);
+  assert_perror (errno);
+  assert (l == 0);
+  report_module (dwfl, child, user_regs.rip);
+
+  bool ok = dwfl_attach_state (dwfl, EM_NONE, child, &callbacks, NULL);
+  assert (ok);
+
+  /* Multiple threads are not handled here.  */
+  int err = dwfl_getthreads (dwfl, thread_callback, NULL);
+  assert (! err);
+
+  dwfl_end (dwfl);
+  kill (child, SIGKILL);
+  pid = waitpid (child, &status, 0);
+  assert_perror (errno);
+  assert (pid == child);
+  assert (WIFSIGNALED (status));
+  assert (WTERMSIG (status) == SIGKILL);
+
+  return EXIT_SUCCESS;
+}
+
+#endif /* x86_64 */
diff --git a/tests/backtrace-dwarf.c b/tests/backtrace-dwarf.c
new file mode 100644 (file)
index 0000000..87d088a
--- /dev/null
@@ -0,0 +1,165 @@
+/* Test program for unwinding of complicated DWARF expressions.
+   Copyright (C) 2013 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/>.  */
+
+#include <config.h>
+#include <assert.h>
+#include <signal.h>
+#include <inttypes.h>
+#include <stdio_ext.h>
+#include <locale.h>
+#include <errno.h>
+#include <sys/ptrace.h>
+#include ELFUTILS_HEADER(dwfl)
+
+#ifndef __linux__
+
+int
+main (int argc __attribute__ ((unused)), char **argv)
+{
+  fprintf (stderr, "%s: Unwinding not supported for this architecture\n",
+           argv[0]);
+  return 77;
+}
+
+#else /* __linux__ */
+
+static void cleanup_13_abort (void);
+#define main cleanup_13_main
+#include "cleanup-13.c"
+#undef main
+
+static void
+report_pid (Dwfl *dwfl, pid_t pid)
+{
+  int result = dwfl_linux_proc_report (dwfl, pid);
+  if (result < 0)
+    error (2, 0, "dwfl_linux_proc_report: %s", dwfl_errmsg (-1));
+  else if (result > 0)
+    error (2, result, "dwfl_linux_proc_report");
+
+  if (dwfl_report_end (dwfl, NULL, NULL) != 0)
+    error (2, 0, "dwfl_report_end: %s", dwfl_errmsg (-1));
+
+  result = dwfl_linux_proc_attach (dwfl, pid, true);
+  if (result < 0)
+    error (2, 0, "dwfl_linux_proc_attach: %s", dwfl_errmsg (-1));
+  else if (result > 0)
+    error (2, result, "dwfl_linux_proc_attach");
+}
+
+static Dwfl *
+pid_to_dwfl (pid_t pid)
+{
+  static char *debuginfo_path;
+  static const Dwfl_Callbacks proc_callbacks =
+    {
+      .find_debuginfo = dwfl_standard_find_debuginfo,
+      .debuginfo_path = &debuginfo_path,
+
+      .find_elf = dwfl_linux_proc_find_elf,
+    };
+  Dwfl *dwfl = dwfl_begin (&proc_callbacks);
+  if (dwfl == NULL)
+    error (2, 0, "dwfl_begin: %s", dwfl_errmsg (-1));
+  report_pid (dwfl, pid);
+  return dwfl;
+}
+
+static int
+frame_callback (Dwfl_Frame *state, void *frame_arg)
+{
+  Dwarf_Addr pc;
+  bool isactivation;
+  if (! dwfl_frame_pc (state, &pc, &isactivation))
+    {
+      error (0, 0, "%s", dwfl_errmsg (-1));
+      return DWARF_CB_ABORT;
+    }
+  Dwarf_Addr pc_adjusted = pc - (isactivation ? 0 : 1);
+
+  /* Get PC->SYMNAME.  */
+  Dwfl_Thread *thread = dwfl_frame_thread (state);
+  Dwfl *dwfl = dwfl_thread_dwfl (thread);
+  Dwfl_Module *mod = dwfl_addrmodule (dwfl, pc_adjusted);
+  const char *symname = NULL;
+  if (mod)
+    symname = dwfl_module_addrname (mod, pc_adjusted);
+
+  printf ("%#" PRIx64 "\t%s\n", (uint64_t) pc, symname);
+
+  if (symname && (strcmp (symname, "main") == 0
+                 || strcmp (symname, ".main") == 0))
+    {
+      kill (dwfl_pid (dwfl), SIGKILL);
+      exit (0);
+    }
+
+  return DWARF_CB_OK;
+}
+
+static int
+thread_callback (Dwfl_Thread *thread, void *thread_arg)
+{
+  dwfl_thread_getframes (thread, frame_callback, NULL);
+  error (1, 0, "dwfl_thread_getframes: %s", dwfl_errmsg (-1));
+}
+
+int
+main (int argc __attribute__ ((unused)), char **argv)
+{
+  /* We use no threads here which can interfere with handling a stream.  */
+  __fsetlocking (stdin, FSETLOCKING_BYCALLER);
+  __fsetlocking (stdout, FSETLOCKING_BYCALLER);
+  __fsetlocking (stderr, FSETLOCKING_BYCALLER);
+
+  /* Set locale.  */
+  (void) setlocale (LC_ALL, "");
+
+  elf_version (EV_CURRENT);
+
+  pid_t pid = fork ();
+  switch (pid)
+  {
+    case -1:
+      abort ();
+    case 0:;
+      long l = ptrace (PTRACE_TRACEME, 0, NULL, NULL);
+      assert_perror (errno);
+      assert (l == 0);
+      cleanup_13_main ();
+      abort ();
+    default:
+      break;
+  }
+
+  errno = 0;
+  int status;
+  pid_t got = waitpid (pid, &status, 0);
+  assert_perror (errno);
+  assert (got == pid);
+  assert (WIFSTOPPED (status));
+  assert (WSTOPSIG (status) == SIGABRT);
+
+  Dwfl *dwfl = pid_to_dwfl (pid);
+  dwfl_getthreads (dwfl, thread_callback, NULL);
+
+  /* There is an exit (0) call if we find the "main" frame,  */
+  error (1, 0, "dwfl_getthreads: %s", dwfl_errmsg (-1));
+}
+
+#endif /* ! __linux__ */
+
diff --git a/tests/backtrace-subr.sh b/tests/backtrace-subr.sh
new file mode 100644 (file)
index 0000000..1d3d6d4
--- /dev/null
@@ -0,0 +1,152 @@
+# Copyright (C) 2013 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
+
+# Verify one of the backtraced threads contains function 'main'.
+check_main()
+{
+  if grep -w main $1; then
+    return
+  fi
+  echo >&2 $2: no main
+  false
+}
+
+# Without proper ELF symbols resolution we could get inappropriate weak
+# symbol "gsignal" with the same address as the correct symbol "raise".
+# It was fixed by GIT commit 78dec228b3cfb2f9300cd0b682ebf416c9674c91 .
+# [patch] Improve ELF symbols preference (global > weak)
+# https://lists.fedorahosted.org/pipermail/elfutils-devel/2012-October/002624.html
+check_gsignal()
+{
+  if ! grep -w gsignal $1; then
+    return
+  fi
+  echo >&2 $2: found gsignal
+  false
+}
+
+# Verify the STDERR output does not contain unexpected errors.
+# In some cases we cannot reliably find out we got behind _start as some
+# operating system do not properly terminate CFI by undefined PC.
+# Ignore it here as it is a bug of OS, not a bug of elfutils.
+check_err()
+{
+  if [ $(egrep -v <$1 'dwfl_thread_getframes: (No DWARF information found|no matching address range)$' \
+         | wc -c) \
+       -eq 0 ]
+  then
+    return
+  fi
+  echo >&2 $2: neither empty nor just out of DWARF
+  false
+}
+
+check_all()
+{
+  bt=$1
+  err=$2
+  testname=$3
+  check_main $bt $testname
+  check_gsignal $bt $testname
+  check_err $err $testname
+}
+
+check_unsupported()
+{
+  err=$1
+  testname=$2
+  if grep -q ': Unwinding not supported for this architecture$' $err; then
+    echo >&2 $testname: arch not supported
+    exit 77
+  fi
+}
+
+check_native_unsupported()
+{
+  err=$1
+  testname=$2
+  check_unsupported $err $testname
+
+  # ARM is special. It is supported, but it doesn't use .eh_frame by default
+  # making the native tests fail unless debuginfo (for glibc) is installed
+  # and we can fall back on .debug_frame for the CFI.
+  case "`uname -m`" in
+    arm* )
+      if grep 'dwfl_thread_getframes: No DWARF information found' $err; then
+       echo >&2 $testname: arm needs debuginfo installed for all libraries
+       exit 77
+      fi
+    ;;
+  esac
+}
+
+check_core()
+{
+  arch=$1
+  testfiles backtrace.$arch.{exec,core}
+  tempfiles backtrace.$arch.{bt,err}
+  echo ./backtrace ./backtrace.$arch.{exec,core}
+  testrun ${abs_builddir}/backtrace -e ./backtrace.$arch.exec --core=./backtrace.$arch.core 1>backtrace.$arch.bt 2>backtrace.$arch.err || true
+  cat backtrace.$arch.{bt,err}
+  check_unsupported backtrace.$arch.err backtrace.$arch.core
+  check_all backtrace.$arch.{bt,err} backtrace.$arch.core
+}
+
+# Backtrace live process.
+# Do not abort on non-zero exit code due to some warnings of ./backtrace
+# - see function check_err.
+check_native()
+{
+  child=$1
+  tempfiles $child.{bt,err}
+  (set +ex; testrun ${abs_builddir}/backtrace --backtrace-exec=${abs_builddir}/$child 1>$child.bt 2>$child.err; true)
+  cat $child.{bt,err}
+  check_native_unsupported $child.err $child
+  check_all $child.{bt,err} $child
+}
+
+# Backtrace core file.
+check_native_core()
+{
+  child=$1
+
+  # Disable valgrind while dumping core.
+  SAVED_VALGRIND_CMD="$VALGRIND_CMD"
+  unset VALGRIND_CMD
+
+  # Skip the test if we cannot adjust core ulimit.
+  core="core.`ulimit -c unlimited || exit 77; set +ex; testrun ${abs_builddir}/$child --gencore; true`"
+  # see if /proc/sys/kernel/core_uses_pid is set to 0
+  if [ -f core ]; then
+    mv core "$core"
+  fi
+  if [ ! -f "$core" ]; then exit 77; fi
+
+  if [ "x$SAVED_VALGRIND_CMD" != "x" ]; then
+    VALGRIND_CMD="$SAVED_VALGRIND_CMD"
+    export VALGRIND_CMD
+  fi
+
+  # Do not abort on non-zero exit code due to some warnings of ./backtrace
+  # - see function check_err.
+  tempfiles $core{,.{bt,err}}
+  (set +ex; testrun ${abs_builddir}/backtrace -e ${abs_builddir}/$child --core=$core 1>$core.bt 2>$core.err; true)
+  cat $core.{bt,err}
+  check_native_unsupported $core.err $child-$core
+  check_all $core.{bt,err} $child-$core
+}
diff --git a/tests/backtrace.aarch64.core.bz2 b/tests/backtrace.aarch64.core.bz2
new file mode 100644 (file)
index 0000000..3082a5a
Binary files /dev/null and b/tests/backtrace.aarch64.core.bz2 differ
diff --git a/tests/backtrace.aarch64.exec.bz2 b/tests/backtrace.aarch64.exec.bz2
new file mode 100755 (executable)
index 0000000..66216b5
Binary files /dev/null and b/tests/backtrace.aarch64.exec.bz2 differ
diff --git a/tests/backtrace.c b/tests/backtrace.c
new file mode 100644 (file)
index 0000000..331ba0f
--- /dev/null
@@ -0,0 +1,479 @@
+/* Test program for unwinding of frames.
+   Copyright (C) 2013, 2014 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/>.  */
+
+#include <config.h>
+#include <assert.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdio_ext.h>
+#include <locale.h>
+#include <dirent.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <error.h>
+#include <unistd.h>
+#include <dwarf.h>
+#include <sys/resource.h>
+#include <sys/ptrace.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/user.h>
+#include <fcntl.h>
+#include <string.h>
+#include <argp.h>
+#include ELFUTILS_HEADER(dwfl)
+
+#ifndef __linux__
+
+int
+main (int argc __attribute__ ((unused)), char **argv)
+{
+  fprintf (stderr, "%s: Unwinding not supported for this architecture\n",
+          argv[0]);
+  return 77;
+}
+
+#else /* __linux__ */
+
+static int
+dump_modules (Dwfl_Module *mod, void **userdata __attribute__ ((unused)),
+             const char *name, Dwarf_Addr start,
+             void *arg __attribute__ ((unused)))
+{
+  Dwarf_Addr end;
+  dwfl_module_info (mod, NULL, NULL, &end, NULL, NULL, NULL, NULL);
+  printf ("%#" PRIx64 "\t%#" PRIx64 "\t%s\n", (uint64_t) start, (uint64_t) end,
+         name);
+  return DWARF_CB_OK;
+}
+
+static bool is_x86_64_native;
+static pid_t check_tid;
+
+static void
+callback_verify (pid_t tid, unsigned frameno, Dwarf_Addr pc,
+                const char *symname, Dwfl *dwfl)
+{
+  static bool seen_main = false;
+  if (symname && *symname == '.')
+    symname++;
+  if (symname && strcmp (symname, "main") == 0)
+    seen_main = true;
+  if (pc == 0)
+    {
+      assert (seen_main);
+      return;
+    }
+  if (check_tid == 0)
+    check_tid = tid;
+  if (tid != check_tid)
+    {
+      // For the main thread we are only interested if we can unwind till
+      // we see the "main" symbol.
+      return;
+    }
+  Dwfl_Module *mod;
+  static bool reduce_frameno = false;
+  if (reduce_frameno)
+    frameno--;
+  if (! is_x86_64_native && frameno >= 2)
+    frameno += 2;
+  const char *symname2 = NULL;
+  switch (frameno)
+  {
+    case 0:
+      if (! reduce_frameno && symname
+              && (strcmp (symname, "__kernel_vsyscall") == 0
+                  || strcmp (symname, "__libc_do_syscall") == 0))
+       reduce_frameno = true;
+      else
+       assert (symname && strcmp (symname, "raise") == 0);
+      break;
+    case 1:
+      assert (symname != NULL && strcmp (symname, "sigusr2") == 0);
+      break;
+    case 2: // x86_64 only
+      /* __restore_rt - glibc maybe does not have to have this symbol.  */
+      break;
+    case 3: // x86_64 only
+      if (is_x86_64_native)
+       {
+         /* Verify we trapped on the very first instruction of jmp.  */
+         assert (symname != NULL && strcmp (symname, "jmp") == 0);
+         mod = dwfl_addrmodule (dwfl, pc - 1);
+         if (mod)
+           symname2 = dwfl_module_addrname (mod, pc - 1);
+         assert (symname2 == NULL || strcmp (symname2, "jmp") != 0);
+         break;
+       }
+      /* PASSTHRU */
+    case 4:
+      assert (symname != NULL && strcmp (symname, "stdarg") == 0);
+      break;
+    case 5:
+      /* Verify we trapped on the very last instruction of child.  */
+      assert (symname != NULL && strcmp (symname, "backtracegen") == 0);
+      mod = dwfl_addrmodule (dwfl, pc);
+      if (mod)
+       symname2 = dwfl_module_addrname (mod, pc);
+
+      // Note that the following assert might in theory even fail on x86_64,
+      // there is no guarantee that the compiler doesn't reorder the
+      // instructions or even inserts some padding instructions at the end
+      // (which apparently happens on ppc64).
+      if (is_x86_64_native)
+        assert (symname2 == NULL || strcmp (symname2, "backtracegen") != 0);
+      break;
+  }
+}
+
+static int
+frame_callback (Dwfl_Frame *state, void *frame_arg)
+{
+  int *framenop = frame_arg;
+  Dwarf_Addr pc;
+  bool isactivation;
+
+  if (*framenop > 16)
+    {
+      error (0, 0, "Too many frames: %d\n", *framenop);
+      return DWARF_CB_ABORT;
+    }
+
+  if (! dwfl_frame_pc (state, &pc, &isactivation))
+    {
+      error (0, 0, "%s", dwfl_errmsg (-1));
+      return DWARF_CB_ABORT;
+    }
+  Dwarf_Addr pc_adjusted = pc - (isactivation ? 0 : 1);
+
+  /* Get PC->SYMNAME.  */
+  Dwfl_Thread *thread = dwfl_frame_thread (state);
+  Dwfl *dwfl = dwfl_thread_dwfl (thread);
+  Dwfl_Module *mod = dwfl_addrmodule (dwfl, pc_adjusted);
+  const char *symname = NULL;
+  if (mod)
+    symname = dwfl_module_addrname (mod, pc_adjusted);
+
+  printf ("#%2d %#" PRIx64 "%4s\t%s\n", *framenop, (uint64_t) pc,
+         ! isactivation ? "- 1" : "", symname);
+  pid_t tid = dwfl_thread_tid (thread);
+  callback_verify (tid, *framenop, pc, symname, dwfl);
+  (*framenop)++;
+
+  return DWARF_CB_OK;
+}
+
+static int
+thread_callback (Dwfl_Thread *thread, void *thread_arg __attribute__((unused)))
+{
+  printf ("TID %ld:\n", (long) dwfl_thread_tid (thread));
+  int frameno = 0;
+  switch (dwfl_thread_getframes (thread, frame_callback, &frameno))
+    {
+    case 0:
+      break;
+    case DWARF_CB_ABORT:
+      return DWARF_CB_ABORT;
+    case -1:
+      error (0, 0, "dwfl_thread_getframes: %s", dwfl_errmsg (-1));
+      /* All platforms do not have yet proper unwind termination.  */
+      break;
+    default:
+      abort ();
+    }
+  return DWARF_CB_OK;
+}
+
+static void
+dump (Dwfl *dwfl)
+{
+  ptrdiff_t ptrdiff = dwfl_getmodules (dwfl, dump_modules, NULL, 0);
+  assert (ptrdiff == 0);
+  bool err = false;
+  switch (dwfl_getthreads (dwfl, thread_callback, NULL))
+    {
+    case 0:
+      break;
+    case DWARF_CB_ABORT:
+      err = true;
+      break;
+    case -1:
+      error (0, 0, "dwfl_getthreads: %s", dwfl_errmsg (-1));
+      err = true;
+      break;
+    default:
+      abort ();
+    }
+  callback_verify (0, 0, 0, NULL, dwfl);
+  if (err)
+    exit (EXIT_FAILURE);
+}
+
+struct see_exec_module
+{
+  Dwfl_Module *mod;
+  char selfpath[PATH_MAX + 1];
+};
+
+static int
+see_exec_module (Dwfl_Module *mod, void **userdata __attribute__ ((unused)),
+                const char *name __attribute__ ((unused)),
+                Dwarf_Addr start __attribute__ ((unused)), void *arg)
+{
+  struct see_exec_module *data = arg;
+  if (strcmp (name, data->selfpath) != 0)
+    return DWARF_CB_OK;
+  assert (data->mod == NULL);
+  data->mod = mod;
+  return DWARF_CB_OK;
+}
+
+/* On x86_64 only:
+     PC will get changed to function 'jmp' by backtrace.c function
+     prepare_thread.  Then SIGUSR2 will be signalled to backtrace-child
+     which will invoke function sigusr2.
+     This is all done so that signal interrupts execution of the very first
+     instruction of a function.  Properly handled unwind should not slip into
+     the previous unrelated function.  */
+
+static void
+prepare_thread (pid_t pid2 __attribute__ ((unused)),
+               void (*jmp) (void) __attribute__ ((unused)))
+{
+#ifndef __x86_64__
+  abort ();
+#else /* x86_64 */
+  long l;
+  errno = 0;
+  l = ptrace (PTRACE_POKEUSER, pid2,
+             (void *) (intptr_t) offsetof (struct user_regs_struct, rip), jmp);
+  assert_perror (errno);
+  assert (l == 0);
+  l = ptrace (PTRACE_CONT, pid2, NULL, (void *) (intptr_t) SIGUSR2);
+  int status;
+  pid_t got = waitpid (pid2, &status, __WALL);
+  assert_perror (errno);
+  assert (got == pid2);
+  assert (WIFSTOPPED (status));
+  assert (WSTOPSIG (status) == SIGUSR1);
+#endif /* __x86_64__ */
+}
+
+#include <asm/unistd.h>
+#include <unistd.h>
+#define tgkill(pid, tid, sig) syscall (__NR_tgkill, (pid), (tid), (sig))
+
+static void
+report_pid (Dwfl *dwfl, pid_t pid)
+{
+  int result = dwfl_linux_proc_report (dwfl, pid);
+  if (result < 0)
+    error (2, 0, "dwfl_linux_proc_report: %s", dwfl_errmsg (-1));
+  else if (result > 0)
+    error (2, result, "dwfl_linux_proc_report");
+
+  if (dwfl_report_end (dwfl, NULL, NULL) != 0)
+    error (2, 0, "dwfl_report_end: %s", dwfl_errmsg (-1));
+
+  result = dwfl_linux_proc_attach (dwfl, pid, true);
+  if (result < 0)
+    error (2, 0, "dwfl_linux_proc_attach: %s", dwfl_errmsg (-1));
+  else if (result > 0)
+    error (2, result, "dwfl_linux_proc_attach");
+}
+
+static Dwfl *
+pid_to_dwfl (pid_t pid)
+{
+  static char *debuginfo_path;
+  static const Dwfl_Callbacks proc_callbacks =
+    {
+      .find_debuginfo = dwfl_standard_find_debuginfo,
+      .debuginfo_path = &debuginfo_path,
+
+      .find_elf = dwfl_linux_proc_find_elf,
+    };
+  Dwfl *dwfl = dwfl_begin (&proc_callbacks);
+  if (dwfl == NULL)
+    error (2, 0, "dwfl_begin: %s", dwfl_errmsg (-1));
+  report_pid (dwfl, pid);
+  return dwfl;
+}
+
+static void
+exec_dump (const char *exec)
+{
+  pid_t pid = fork ();
+  switch (pid)
+  {
+    case -1:
+      abort ();
+    case 0:
+      execl (exec, exec, "--ptraceme", NULL);
+      abort ();
+    default:
+      break;
+  }
+
+  /* Catch the main thread.  Catch it first otherwise the /proc evaluation of
+     PID may have caught still ourselves before executing execl above.  */
+  errno = 0;
+  int status;
+  pid_t got = waitpid (pid, &status, 0);
+  assert_perror (errno);
+  assert (got == pid);
+  assert (WIFSTOPPED (status));
+  // Main thread will signal SIGUSR2.  Other thread will signal SIGUSR1.
+  assert (WSTOPSIG (status) == SIGUSR2);
+
+  /* Catch the spawned thread.  Do not use __WCLONE as we could get racy
+     __WCLONE, probably despite pthread_create already had to be called the new
+     task is not yet alive enough for waitpid.  */
+  pid_t pid2 = waitpid (-1, &status, __WALL);
+  assert_perror (errno);
+  assert (pid2 > 0);
+  assert (pid2 != pid);
+  assert (WIFSTOPPED (status));
+  // Main thread will signal SIGUSR2.  Other thread will signal SIGUSR1.
+  assert (WSTOPSIG (status) == SIGUSR1);
+
+  Dwfl *dwfl = pid_to_dwfl (pid);
+  char *selfpathname;
+  int i = asprintf (&selfpathname, "/proc/%ld/exe", (long) pid);
+  assert (i > 0);
+  struct see_exec_module data;
+  ssize_t ssize = readlink (selfpathname, data.selfpath,
+                           sizeof (data.selfpath));
+  free (selfpathname);
+  assert (ssize > 0 && ssize < (ssize_t) sizeof (data.selfpath));
+  data.selfpath[ssize] = '\0';
+  data.mod = NULL;
+  ptrdiff_t ptrdiff = dwfl_getmodules (dwfl, see_exec_module, &data, 0);
+  assert (ptrdiff == 0);
+  assert (data.mod != NULL);
+  GElf_Addr loadbase;
+  Elf *elf = dwfl_module_getelf (data.mod, &loadbase);
+  GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (elf, &ehdr_mem);
+  assert (ehdr != NULL);
+  /* It is false also on x86_64 with i386 inferior.  */
+#ifndef __x86_64__
+  is_x86_64_native = false;
+#else /* __x86_64__ */
+  is_x86_64_native = ehdr->e_ident[EI_CLASS] == ELFCLASS64;
+#endif /* __x86_64__ */
+  void (*jmp) (void);
+  if (is_x86_64_native)
+    {
+      // Find inferior symbol named "jmp".
+      int nsym = dwfl_module_getsymtab (data.mod);
+      int symi;
+      for (symi = 1; symi < nsym; ++symi)
+       {
+         GElf_Sym symbol;
+         const char *symbol_name = dwfl_module_getsym (data.mod, symi, &symbol, NULL);
+         if (symbol_name == NULL)
+           continue;
+         switch (GELF_ST_TYPE (symbol.st_info))
+           {
+           case STT_SECTION:
+           case STT_FILE:
+           case STT_TLS:
+             continue;
+           default:
+             if (strcmp (symbol_name, "jmp") != 0)
+               continue;
+             break;
+           }
+         /* LOADBASE is already applied here.  */
+         jmp = (void (*) (void)) (uintptr_t) symbol.st_value;
+         break;
+       }
+      assert (symi < nsym);
+      prepare_thread (pid2, jmp);
+    }
+  dwfl_end (dwfl);
+  check_tid = pid2;
+  dwfl = pid_to_dwfl (pid);
+  dump (dwfl);
+  dwfl_end (dwfl);
+}
+
+#define OPT_BACKTRACE_EXEC 0x100
+
+static const struct argp_option options[] =
+  {
+    { "backtrace-exec", OPT_BACKTRACE_EXEC, "EXEC", 0, N_("Run executable"), 0 },
+    { NULL, 0, NULL, 0, NULL, 0 }
+  };
+
+
+static error_t
+parse_opt (int key, char *arg, struct argp_state *state)
+{
+  switch (key)
+    {
+    case ARGP_KEY_INIT:
+      state->child_inputs[0] = state->input;
+      break;
+
+    case OPT_BACKTRACE_EXEC:
+      exec_dump (arg);
+      exit (0);
+
+    default:
+      return ARGP_ERR_UNKNOWN;
+    }
+  return 0;
+}
+
+int
+main (int argc __attribute__ ((unused)), char **argv)
+{
+  /* We use no threads here which can interfere with handling a stream.  */
+  __fsetlocking (stdin, FSETLOCKING_BYCALLER);
+  __fsetlocking (stdout, FSETLOCKING_BYCALLER);
+  __fsetlocking (stderr, FSETLOCKING_BYCALLER);
+
+  /* Set locale.  */
+  (void) setlocale (LC_ALL, "");
+
+  elf_version (EV_CURRENT);
+
+  Dwfl *dwfl = NULL;
+  const struct argp_child argp_children[] =
+    {
+      { .argp = dwfl_standard_argp () },
+      { .argp = NULL }
+    };
+  const struct argp argp =
+    {
+      options, parse_opt, NULL, NULL, argp_children, NULL, NULL
+    };
+  (void) argp_parse (&argp, argc, argv, 0, NULL, &dwfl);
+  assert (dwfl != NULL);
+  /* We want to make sure the dwfl was properly attached.  */
+  if (dwfl_pid (dwfl) < 0)
+    error (2, 0, "dwfl_pid: %s", dwfl_errmsg (-1));
+  dump (dwfl);
+  dwfl_end (dwfl);
+  return 0;
+}
+
+#endif /* ! __linux__ */
+
diff --git a/tests/backtrace.i386.core.bz2 b/tests/backtrace.i386.core.bz2
new file mode 100644 (file)
index 0000000..e120d9b
Binary files /dev/null and b/tests/backtrace.i386.core.bz2 differ
diff --git a/tests/backtrace.i386.exec.bz2 b/tests/backtrace.i386.exec.bz2
new file mode 100644 (file)
index 0000000..1b0f001
Binary files /dev/null and b/tests/backtrace.i386.exec.bz2 differ
diff --git a/tests/backtrace.ppc.core.bz2 b/tests/backtrace.ppc.core.bz2
new file mode 100644 (file)
index 0000000..f20cd9f
Binary files /dev/null and b/tests/backtrace.ppc.core.bz2 differ
diff --git a/tests/backtrace.ppc.exec.bz2 b/tests/backtrace.ppc.exec.bz2
new file mode 100644 (file)
index 0000000..057c25a
Binary files /dev/null and b/tests/backtrace.ppc.exec.bz2 differ
diff --git a/tests/backtrace.s390.core.bz2 b/tests/backtrace.s390.core.bz2
new file mode 100644 (file)
index 0000000..db34694
Binary files /dev/null and b/tests/backtrace.s390.core.bz2 differ
diff --git a/tests/backtrace.s390.exec.bz2 b/tests/backtrace.s390.exec.bz2
new file mode 100644 (file)
index 0000000..4c1b4ae
Binary files /dev/null and b/tests/backtrace.s390.exec.bz2 differ
diff --git a/tests/backtrace.s390x.core.bz2 b/tests/backtrace.s390x.core.bz2
new file mode 100644 (file)
index 0000000..61c23ec
Binary files /dev/null and b/tests/backtrace.s390x.core.bz2 differ
diff --git a/tests/backtrace.s390x.exec.bz2 b/tests/backtrace.s390x.exec.bz2
new file mode 100644 (file)
index 0000000..8009239
Binary files /dev/null and b/tests/backtrace.s390x.exec.bz2 differ
diff --git a/tests/backtrace.x86_64.core.bz2 b/tests/backtrace.x86_64.core.bz2
new file mode 100644 (file)
index 0000000..1f34e20
Binary files /dev/null and b/tests/backtrace.x86_64.core.bz2 differ
diff --git a/tests/backtrace.x86_64.exec.bz2 b/tests/backtrace.x86_64.exec.bz2
new file mode 100644 (file)
index 0000000..70a151b
Binary files /dev/null and b/tests/backtrace.x86_64.exec.bz2 differ
diff --git a/tests/buildid.c b/tests/buildid.c
new file mode 100644 (file)
index 0000000..87c1877
--- /dev/null
@@ -0,0 +1,81 @@
+/* Test program for dwelf_elf_gnu_build_id, print build ID.
+   Copyright (C) 2014 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/>.  */
+
+#include <config.h>
+#include <assert.h>
+#include <inttypes.h>
+#include <err.h>
+#include <errno.h>
+#include ELFUTILS_HEADER(elf)
+#include ELFUTILS_HEADER(dwelf)
+#include <stdio.h>
+#include <error.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+int
+main (int argc, char *argv[])
+{
+  if (argc < 2)
+    error (EXIT_FAILURE, 0, "No input file given");
+
+  elf_version (EV_CURRENT);
+
+  for (int i = 1; i < argc; i++)
+    {
+      const char *file = argv[i];
+      int fd = open (file, O_RDONLY);
+      if (fd < 0)
+       error (EXIT_FAILURE, errno, "couldn't open file '%s'", file);
+
+      Elf *elf = elf_begin (fd, ELF_C_READ, NULL);
+      if (elf == NULL)
+       {
+         printf("%s: elf_begin failed: %s\n", file, elf_errmsg (-1));
+         close (fd);
+         continue;
+       }
+
+      const void *build_id;
+      ssize_t len = dwelf_elf_gnu_build_id (elf, &build_id);
+      switch (len)
+       {
+       case 0:
+         printf ("%s: <no NT_GNU_BUILD_ID note>\n", file);
+         break;
+       case -1:
+         errx (1, "dwelf_elf_gnu_build_id (%s): %s",
+               file, elf_errmsg (-1));
+       default:
+         printf ("%s: build ID: ", file);
+         const unsigned char *p = build_id;
+         const unsigned char *end = p + len;
+         while (p < end)
+             printf("%02x", (unsigned)*p++);
+         putchar('\n');
+       }
+
+      elf_end (elf);
+      close (fd);
+    }
+
+  return 0;
+}
diff --git a/tests/cleanup-13.c b/tests/cleanup-13.c
new file mode 100644 (file)
index 0000000..3919b91
--- /dev/null
@@ -0,0 +1,316 @@
+// http://gcc.gnu.org/viewcvs/gcc/trunk/gcc/testsuite/gcc.dg/cleanup-13.c?view=co&content-type=text%2Fplain
+
+/* HP-UX libunwind.so doesn't provide _UA_END_OF_STACK */
+/* { dg-do run } */
+/* { dg-options "-fexceptions" } */
+/* { dg-skip-if "" { "ia64-*-hpux11.*" }  { "*" } { "" } } */
+/* Verify DW_OP_* handling in the unwinder.  */
+
+#include <unwind.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* #define OP_addr(x) 0x06, ... */
+#define OP_deref 0x06,
+#define SLEB128(x) (x)&0x7f    /* Assume here the value is -0x40 ... 0x3f.  */
+#define ULEB128(x) (x)&0x7f    /* Assume here the value is 0 ... 0x7f.  */
+#define VAL1(x) (x)&0xff
+#if defined (__BIG_ENDIAN__)
+#define VAL2(x) ((x)>>8)&0xff,(x)&0xff
+#define VAL4(x) ((x)>>24)&0xff,((x)>>16)&0xff,((x)>>8)&0xff,(x)&0xff
+#define VAL8(x) ((x)>>56)&0xff,((x)>>48)&0xff,((x)>>40)&0xff,((x)>>32)&0xff,((x)>>24)&0xff,((x)>>16)&0xff,((x)>>8)&0xff,(x)&0xff
+#elif defined(__LITTLE_ENDIAN__) || defined(__x86_64__) || defined(__i386__)
+#define VAL2(x) (x)&0xff,((x)>>8)&0xff
+#define VAL4(x) (x)&0xff,((x)>>8)&0xff,((x)>>16)&0xff,((x)>>24)&0xff
+#define VAL8(x) (x)&0xff,((x)>>8)&0xff,((x)>>16)&0xff,((x)>>24)&0xff,((x)>>32)&0xff,((x)>>40)&0xff,((x)>>48)&0xff,((x)>>56)&0xff
+#endif
+#define OP_const1u(x) 0x08,VAL1(x),
+#define OP_const1s(x) 0x09,VAL1(x),
+#define OP_const2u(x) 0x0a,VAL2(x),
+#define OP_const2s(x) 0x0b,VAL2(x),
+#define OP_const4u(x) 0x0c,VAL4(x),
+#define OP_const4s(x) 0x0d,VAL4(x),
+#define OP_const8u(x) 0x0e,VAL8(x),
+#define OP_const8s(x) 0x0f,VAL8(x),
+#define OP_constu(x) 0x10,ULEB128(x),
+#define OP_consts(x) 0x11,SLEB128(x),
+#define OP_dup 0x12,
+#define OP_drop 0x13,
+#define OP_over 0x14,
+#define OP_pick(x) 0x15,VAL1(x),
+#define OP_swap 0x16,
+#define OP_rot 0x17,
+#define OP_xderef 0x18,
+#define OP_abs 0x19,
+#define OP_and 0x1a,
+#define OP_div 0x1b,
+#define OP_minus 0x1c,
+#define OP_mod 0x1d,
+#define OP_mul 0x1e,
+#define OP_neg 0x1f,
+#define OP_not 0x20,
+#define OP_or 0x21,
+#define OP_plus 0x22,
+#define OP_plus_uconst(x) 0x23,ULEB128(x),
+#define OP_shl 0x24,
+#define OP_shr 0x25,
+#define OP_shra 0x26,
+#define OP_xor 0x27,
+#define OP_bra(x) 0x28,VAL2(x),
+#define OP_eq 0x29,
+#define OP_ge 0x2a,
+#define OP_gt 0x2b,
+#define OP_le 0x2c,
+#define OP_lt 0x2d,
+#define OP_ne 0x2e,
+#define OP_skip(x) 0x2f,VAL2(x),
+#define OP_lit0 0x30,
+#define OP_lit1 0x31,
+#define OP_lit2 0x32,
+#define OP_lit3 0x33,
+#define OP_lit4 0x34,
+#define OP_lit5 0x35,
+#define OP_lit6 0x36,
+#define OP_lit7 0x37,
+#define OP_lit8 0x38,
+#define OP_lit9 0x39,
+#define OP_lit10 0x3a,
+#define OP_lit11 0x3b,
+#define OP_lit12 0x3c,
+#define OP_lit13 0x3d,
+#define OP_lit14 0x3e,
+#define OP_lit15 0x3f,
+#define OP_lit16 0x40,
+#define OP_lit17 0x41,
+#define OP_lit18 0x42,
+#define OP_lit19 0x43,
+#define OP_lit20 0x44,
+#define OP_lit21 0x45,
+#define OP_lit22 0x46,
+#define OP_lit23 0x47,
+#define OP_lit24 0x48,
+#define OP_lit25 0x49,
+#define OP_lit26 0x4a,
+#define OP_lit27 0x4b,
+#define OP_lit28 0x4c,
+#define OP_lit29 0x4d,
+#define OP_lit30 0x4e,
+#define OP_lit31 0x4f,
+#define OP_reg0 0x50,
+#define OP_reg1 0x51,
+#define OP_reg2 0x52,
+#define OP_reg3 0x53,
+#define OP_reg4 0x54,
+#define OP_reg5 0x55,
+#define OP_reg6 0x56,
+#define OP_reg7 0x57,
+#define OP_reg8 0x58,
+#define OP_reg9 0x59,
+#define OP_reg10 0x5a,
+#define OP_reg11 0x5b,
+#define OP_reg12 0x5c,
+#define OP_reg13 0x5d,
+#define OP_reg14 0x5e,
+#define OP_reg15 0x5f,
+#define OP_reg16 0x60,
+#define OP_reg17 0x61,
+#define OP_reg18 0x62,
+#define OP_reg19 0x63,
+#define OP_reg20 0x64,
+#define OP_reg21 0x65,
+#define OP_reg22 0x66,
+#define OP_reg23 0x67,
+#define OP_reg24 0x68,
+#define OP_reg25 0x69,
+#define OP_reg26 0x6a,
+#define OP_reg27 0x6b,
+#define OP_reg28 0x6c,
+#define OP_reg29 0x6d,
+#define OP_reg30 0x6e,
+#define OP_reg31 0x6f,
+#define OP_breg0(x) 0x70,SLEB128(x),
+#define OP_breg1(x) 0x71,SLEB128(x),
+#define OP_breg2(x) 0x72,SLEB128(x),
+#define OP_breg3(x) 0x73,SLEB128(x),
+#define OP_breg4(x) 0x74,SLEB128(x),
+#define OP_breg5(x) 0x75,SLEB128(x),
+#define OP_breg6(x) 0x76,SLEB128(x),
+#define OP_breg7(x) 0x77,SLEB128(x),
+#define OP_breg8(x) 0x78,SLEB128(x),
+#define OP_breg9(x) 0x79,SLEB128(x),
+#define OP_breg10(x) 0x7a,SLEB128(x),
+#define OP_breg11(x) 0x7b,SLEB128(x),
+#define OP_breg12(x) 0x7c,SLEB128(x),
+#define OP_breg13(x) 0x7d,SLEB128(x),
+#define OP_breg14(x) 0x7e,SLEB128(x),
+#define OP_breg15(x) 0x7f,SLEB128(x),
+#define OP_breg16(x) 0x80,SLEB128(x),
+#define OP_breg17(x) 0x81,SLEB128(x),
+#define OP_breg18(x) 0x82,SLEB128(x),
+#define OP_breg19(x) 0x83,SLEB128(x),
+#define OP_breg20(x) 0x84,SLEB128(x),
+#define OP_breg21(x) 0x85,SLEB128(x),
+#define OP_breg22(x) 0x86,SLEB128(x),
+#define OP_breg23(x) 0x87,SLEB128(x),
+#define OP_breg24(x) 0x88,SLEB128(x),
+#define OP_breg25(x) 0x89,SLEB128(x),
+#define OP_breg26(x) 0x8a,SLEB128(x),
+#define OP_breg27(x) 0x8b,SLEB128(x),
+#define OP_breg28(x) 0x8c,SLEB128(x),
+#define OP_breg29(x) 0x8d,SLEB128(x),
+#define OP_breg30(x) 0x8e,SLEB128(x),
+#define OP_breg31(x) 0x8f,SLEB128(x),
+#define OP_regx(x) 0x90,SLEB128(x),
+#define OP_fbreg(x) 0x91,SLEB128(x),
+#define OP_bregx(x,y) 0x92,ULEB128(x),SLEB128(y),
+#define OP_piece(x) 0x93,ULEB128(x),
+#define OP_deref_size(x) 0x94,VAL1(x),
+#define OP_xderef_size(x) 0x95,VAL1(x),
+#define OP_nop 0x96,
+#define OP_nop_termination 0x96
+#define OP_push_object_address 0x97,
+#define OP_call2(x) 0x98,VAL2(x),
+#define OP_call4(x) 0x99,VAL4(x),
+/* #define OP_call_ref(x) 0x9a,... */
+#define OP_form_tls_address(x) 0x9b,
+#define OP_call_frame_cfa 0x9c,
+#define OP_bit_piece(x) 0x9d,ULEB128(x),
+/* #define OP_implicit_value(x...) 0x9e,... */
+#define OP_stack_value 0x9f,
+#define OP_GNU_push_tls_address 0xe0,
+/* #define OP_GNU_encoded_addr(x...) 0xf1, */
+
+#define ASSERT_TOS_NON0 OP_bra(3) OP_skip(-3)
+#define ASSERT_TOS_0 OP_lit0 OP_eq ASSERT_TOS_NON0
+
+/* Initially there is CFA value on the stack, we want to
+   keep it there at the end.  */
+#define CFI_PROGRAM \
+OP_lit0 OP_nop ASSERT_TOS_0                                            \
+OP_lit1 ASSERT_TOS_NON0                                                        \
+OP_lit1 OP_const1u(1) OP_eq ASSERT_TOS_NON0                            \
+OP_lit16 OP_const2u(16) OP_eq ASSERT_TOS_NON0                          \
+OP_lit31 OP_const4u(31) OP_ne ASSERT_TOS_0                             \
+OP_lit1 OP_neg OP_const1s(-1) OP_eq ASSERT_TOS_NON0                    \
+OP_lit16 OP_neg OP_const2s(-16) OP_ne ASSERT_TOS_0                     \
+OP_lit31 OP_const4s(-31) OP_neg OP_ne ASSERT_TOS_0                     \
+OP_lit7 OP_dup OP_plus_uconst(2) OP_lit9 OP_eq ASSERT_TOS_NON0         \
+  OP_lit7 OP_eq ASSERT_TOS_NON0                                                \
+OP_lit20 OP_lit1 OP_drop OP_lit20 OP_eq ASSERT_TOS_NON0                        \
+OP_lit17 OP_lit19 OP_over OP_lit17 OP_eq ASSERT_TOS_NON0               \
+  OP_lit19 OP_eq ASSERT_TOS_NON0 OP_lit17 OP_eq ASSERT_TOS_NON0                \
+OP_lit1 OP_lit2 OP_lit3 OP_lit4 OP_pick(2) OP_lit2 OP_eq ASSERT_TOS_NON0\
+  OP_lit4 OP_eq ASSERT_TOS_NON0 OP_lit3 OP_eq ASSERT_TOS_NON0          \
+  OP_pick(0) OP_lit2 OP_eq ASSERT_TOS_NON0                             \
+  OP_lit2 OP_eq ASSERT_TOS_NON0 OP_lit1 OP_eq ASSERT_TOS_NON0          \
+OP_lit6 OP_lit12 OP_swap OP_lit6 OP_eq ASSERT_TOS_NON0                 \
+  OP_lit12 OP_eq ASSERT_TOS_NON0                                       \
+OP_lit7 OP_lit8 OP_lit9 OP_rot OP_lit8 OP_eq ASSERT_TOS_NON0           \
+  OP_lit7 OP_eq ASSERT_TOS_NON0 OP_lit9 OP_eq ASSERT_TOS_NON0          \
+OP_lit7 OP_abs OP_lit7 OP_eq ASSERT_TOS_NON0                           \
+OP_const1s(-123) OP_abs OP_const1u(123) OP_eq ASSERT_TOS_NON0          \
+OP_lit3 OP_lit6 OP_and OP_lit2 OP_eq ASSERT_TOS_NON0                   \
+OP_lit3 OP_lit6 OP_or OP_lit7 OP_eq ASSERT_TOS_NON0                    \
+OP_lit17 OP_lit2 OP_minus OP_lit15 OP_eq ASSERT_TOS_NON0               \
+/* Divide is signed truncating toward zero.  */                                \
+OP_const1s(-6) OP_const1s(-2) OP_div OP_lit3 OP_eq ASSERT_TOS_NON0     \
+OP_const1s(-7) OP_const1s(3) OP_div OP_const1s(-2)                     \
+  OP_eq ASSERT_TOS_NON0                                                        \
+/* Modulo is unsigned.  */                                             \
+OP_const1s(-6) OP_const1s(-4) OP_mod OP_const1s(-6)                    \
+  OP_eq ASSERT_TOS_NON0                                                        \
+OP_const1s(-6) OP_lit4 OP_mod OP_lit2 OP_eq ASSERT_TOS_NON0            \
+OP_lit6 OP_const1s(-4) OP_mod OP_lit6 OP_eq ASSERT_TOS_NON0            \
+/* Signed modulo can be implemented using "over over div mul minus".  */\
+OP_const1s(-6) OP_const1s(-4) OP_over OP_over OP_div OP_mul OP_minus   \
+  OP_const1s(-2) OP_eq ASSERT_TOS_NON0                                 \
+OP_const1s(-7) OP_lit3 OP_over OP_over OP_div OP_mul OP_minus          \
+  OP_const1s(-1) OP_eq ASSERT_TOS_NON0                                 \
+OP_lit7 OP_const1s(-3) OP_over OP_over OP_div OP_mul OP_minus          \
+  OP_lit1 OP_eq ASSERT_TOS_NON0                                                \
+OP_lit16 OP_lit31 OP_plus_uconst(1) OP_mul OP_const2u(512)             \
+  OP_eq ASSERT_TOS_NON0                                                        \
+OP_lit5 OP_not OP_lit31 OP_and OP_lit26 OP_eq ASSERT_TOS_NON0          \
+OP_lit12 OP_lit31 OP_plus OP_const1u(43) OP_eq ASSERT_TOS_NON0         \
+OP_const1s(-6) OP_lit2 OP_plus OP_const1s(-4) OP_eq ASSERT_TOS_NON0    \
+OP_const1s(-6) OP_plus_uconst(3) OP_const1s(-3) OP_eq ASSERT_TOS_NON0  \
+OP_lit16 OP_lit4 OP_shl OP_const2u(256) OP_eq ASSERT_TOS_NON0          \
+OP_lit16 OP_lit3 OP_shr OP_lit2 OP_eq ASSERT_TOS_NON0                  \
+OP_const1s(-16) OP_lit3 OP_shra OP_const1s(-2) OP_eq ASSERT_TOS_NON0   \
+OP_lit3 OP_lit6 OP_xor OP_lit5 OP_eq ASSERT_TOS_NON0                   \
+OP_lit3 OP_lit6 OP_le ASSERT_TOS_NON0                                  \
+OP_lit3 OP_lit3 OP_le ASSERT_TOS_NON0                                  \
+OP_lit6 OP_lit3 OP_le ASSERT_TOS_0                                     \
+OP_lit3 OP_lit6 OP_lt ASSERT_TOS_NON0                                  \
+OP_lit3 OP_lit3 OP_lt ASSERT_TOS_0                                     \
+OP_lit6 OP_lit3 OP_lt ASSERT_TOS_0                                     \
+OP_lit3 OP_lit6 OP_ge ASSERT_TOS_0                                     \
+OP_lit3 OP_lit3 OP_ge ASSERT_TOS_NON0                                  \
+OP_lit6 OP_lit3 OP_ge ASSERT_TOS_NON0                                  \
+OP_lit3 OP_lit6 OP_gt ASSERT_TOS_0                                     \
+OP_lit3 OP_lit3 OP_gt ASSERT_TOS_0                                     \
+OP_lit6 OP_lit3 OP_gt ASSERT_TOS_NON0                                  \
+OP_const1s(-6) OP_lit1 OP_shr OP_lit0 OP_gt ASSERT_TOS_NON0            \
+OP_const1s(-6) OP_lit1 OP_shra OP_lit0 OP_lt ASSERT_TOS_NON0
+
+#define CFI_ESCAPE_VAL_2(VALUES...) #VALUES
+#define CFI_ESCAPE_VAL_1(VALUES...) CFI_ESCAPE_VAL_2(VALUES)
+#define CFI_ESCAPE_VAL(VALUES...) CFI_ESCAPE_VAL_1(VALUES)
+#define CFI_ESCAPE do { } while (0)
+#define CFI_ARCH_PROGRAM OP_nop_termination
+#ifdef __GCC_HAVE_DWARF2_CFI_ASM
+#if defined (__x86_64__)
+#undef CFI_ESCAPE
+#undef CFI_ARCH_PROGRAM
+#define CFI_ARCH_PROGRAM CFI_PROGRAM OP_lit8 OP_minus OP_nop_termination
+unsigned char cfi_arch_program[] = { CFI_ARCH_PROGRAM };
+extern char verify_it[sizeof (cfi_arch_program) - 0x80 < 0x3f80 ? 1 : -1];
+/* DW_CFA_expression %rip, uleb128(l2-l1), l1: program DW_OP_lit8 DW_OP_minus DW_OP_nop l2: */
+#define CFI_ESCAPE \
+  asm volatile (".cfi_escape 0x10, 0x10, (%P0&0x7f)+0x80, %P0>>7, " \
+               CFI_ESCAPE_VAL (CFI_ARCH_PROGRAM) \
+               : : "i" (sizeof (cfi_arch_program)))
+#elif defined (__i386__)
+#undef CFI_ESCAPE
+#undef CFI_ARCH_PROGRAM
+#define CFI_ARCH_PROGRAM CFI_PROGRAM OP_lit4 OP_minus OP_nop_termination
+unsigned char cfi_arch_program[] = { CFI_ARCH_PROGRAM };
+extern char verify_it[sizeof (cfi_arch_program) - 0x80 < 0x3f80 ? 1 : -1];
+/* DW_CFA_expression %eip, uleb128(l2-l1), l1: program DW_OP_lit4 DW_OP_minus DW_OP_nop l2: */
+#define CFI_ESCAPE \
+  asm volatile (".cfi_escape 0x10, 8, (%P0&0x7f)+0x80, %P0>>7, " \
+               CFI_ESCAPE_VAL (CFI_ARCH_PROGRAM) \
+               : : "i" (sizeof (cfi_arch_program)))
+#endif
+#endif
+
+/* The original GCC testcase tests the runtime unwinder using
+   _Unwind_ForcedUnwind, we just inspect the child when it aborts.  */
+
+static void force_unwind ()
+{
+  abort ();
+}
+
+static void handler (void *p __attribute__((unused)))
+{
+  exit (0);
+}
+
+__attribute__((noinline)) static void callme ()
+{
+  CFI_ESCAPE;
+  force_unwind ();
+}
+
+__attribute__((noinline)) static void doit ()
+{
+  char dummy __attribute__((cleanup (handler)));
+  callme ();
+}
+
+int main()
+{ 
+  doit ();
+  abort ();
+}
diff --git a/tests/debugaltlink.c b/tests/debugaltlink.c
new file mode 100644 (file)
index 0000000..6d97d50
--- /dev/null
@@ -0,0 +1,83 @@
+/* Test program for dwelf_dwarf_gnu_debugaltlink, print name and build ID.
+   Copyright (C) 2014 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/>.  */
+
+#include <config.h>
+#include <assert.h>
+#include <inttypes.h>
+#include <err.h>
+#include <errno.h>
+#include ELFUTILS_HEADER(dw)
+#include ELFUTILS_HEADER(dwelf)
+#include <stdio.h>
+#include <error.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+int
+main (int argc, char *argv[])
+{
+  if (argc < 2)
+    error (EXIT_FAILURE, 0, "No input file given");
+
+  elf_version (EV_CURRENT);
+
+  for (int i = 1; i < argc; i++)
+    {
+      const char *file = argv[i];
+      int fd = open (file, O_RDONLY);
+      if (fd < 0)
+       error (EXIT_FAILURE, errno, "couldn't open file '%s'", file);
+
+      Dwarf *dwarf = dwarf_begin (fd, DWARF_C_READ);
+      if (dwarf == NULL)
+       {
+         printf("%s: dwarf_begin failed: %s\n", file, dwarf_errmsg (-1));
+         close (fd);
+         continue;
+       }
+
+      const char *name;
+      const void *build_id;
+      ssize_t ret = dwelf_dwarf_gnu_debugaltlink
+       (dwarf, &name, &build_id);
+      switch (ret)
+       {
+       case 0:
+         printf ("%s: <no .gnu_debugaltlink section>\n", file);
+         break;
+       case -1:
+         errx (1, "dwelf_dwarf_gnu_debugaltlink (%s): %s",
+               file, dwarf_errmsg (-1));
+       default:
+         printf ("%s: %s, build ID: ", file, name);
+         const unsigned char *p = build_id;
+         const unsigned char *end = p + ret;
+         while (p < end)
+             printf("%02x", (unsigned)*p++);
+         putchar('\n');
+       }
+
+      dwarf_end (dwarf);
+      close (fd);
+    }
+
+  return 0;
+}
diff --git a/tests/debuglink.c b/tests/debuglink.c
new file mode 100644 (file)
index 0000000..935d102
--- /dev/null
@@ -0,0 +1,64 @@
+/* Test program for dwelf_elf_gnu_debuglink, print name and crc.
+   Copyright (C) 2014 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/>.  */
+
+#include <config.h>
+#include <assert.h>
+#include <inttypes.h>
+#include <errno.h>
+#include ELFUTILS_HEADER(dwelf)
+#include <stdio.h>
+#include <error.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+int
+main (int argc, char *argv[])
+{
+  if (argc < 2)
+    error (EXIT_FAILURE, 0, "No input file given");
+
+  elf_version (EV_CURRENT);
+
+  for (int i = 1; i < argc; i++)
+    {
+      const char *file = argv[i];
+      int fd = open (file, O_RDONLY);
+      if (fd < 0)
+       error (EXIT_FAILURE, errno, "couldn't open file '%s'", file);
+
+      Elf *elf = elf_begin (fd, ELF_C_READ, NULL);
+      if (elf == NULL)
+       error (EXIT_FAILURE, 0, "elf_begin failed for '%s': %s",
+              file, elf_errmsg (-1));
+
+      GElf_Word crc;
+      const char *debug = dwelf_elf_gnu_debuglink (elf, &crc);
+      if (debug == NULL)
+       printf ("%s: <no gnu_debuglink file>\n", file);
+      else
+       printf ("%s: %s, crc: %" PRIx32 "\n", file, debug, crc);
+
+      elf_end (elf);
+      close (fd);
+    }
+
+  return 0;
+}
diff --git a/tests/dwfl-report-elf-align.c b/tests/dwfl-report-elf-align.c
new file mode 100644 (file)
index 0000000..a4e97d3
--- /dev/null
@@ -0,0 +1,72 @@
+/* Test program for dwfl_report_elf incorrect BASE alignment.
+   Copyright (C) 2013 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/>.  */
+
+#include <config.h>
+#include <assert.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdio_ext.h>
+#include <error.h>
+#include <locale.h>
+#include <string.h>
+#include <stdlib.h>
+#include ELFUTILS_HEADER(dwfl)
+
+
+static const Dwfl_Callbacks offline_callbacks =
+  {
+    .find_debuginfo = INTUSE(dwfl_standard_find_debuginfo),
+    .section_address = INTUSE(dwfl_offline_section_address),
+  };
+
+
+int
+main (int argc, char **argv)
+{
+  /* We use no threads here which can interfere with handling a stream.  */
+  (void) __fsetlocking (stdout, FSETLOCKING_BYCALLER);
+
+  /* Set locale.  */
+  (void) setlocale (LC_ALL, "");
+
+  if (argc != 5)
+    error (1, 0, "dwfl-report-elf-align shlib.so base funcaddr funcname");
+    
+  Dwfl *dwfl = dwfl_begin (&offline_callbacks);
+  assert (dwfl != NULL);
+
+  char *endptr;
+  uintptr_t base = strtoull (argv[2], &endptr, 0);
+  assert (endptr && !*endptr);
+
+  Dwfl_Module *mod = dwfl_report_elf (dwfl, argv[1], argv[1], -1, base, false);
+  assert (mod != NULL);
+
+  uintptr_t funcaddr = strtoull (argv[3], &endptr, 0);
+  assert (endptr && !*endptr);
+
+  Dwfl_Module *mod_found = dwfl_addrmodule (dwfl, funcaddr);
+  assert (mod_found == mod);
+
+  const char *symname = dwfl_module_addrname (mod, funcaddr);
+  assert (symname != NULL);
+  assert (strcmp (symname, argv[4]) == 0);
+
+  dwfl_end (dwfl);
+
+  return 0;
+}
diff --git a/tests/dwfllines.c b/tests/dwfllines.c
new file mode 100644 (file)
index 0000000..90379dd
--- /dev/null
@@ -0,0 +1,164 @@
+/* Copyright (C) 2013 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 <inttypes.h>
+#include <assert.h>
+#include ELFUTILS_HEADER(dw)
+#include ELFUTILS_HEADER(dwfl)
+#include <dwarf.h>
+#include <argp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <error.h>
+
+int
+main (int argc, char *argv[])
+{
+  int cnt;
+
+  Dwfl *dwfl = NULL;
+  (void) argp_parse (dwfl_standard_argp (), argc, argv, 0, &cnt, &dwfl);
+  assert (dwfl != NULL);
+
+  Dwarf_Die *cu = NULL;
+  Dwarf_Addr bias;
+  do
+    {
+      cu = dwfl_nextcu (dwfl, cu, &bias);
+      if (cu != NULL)
+       {
+         Dwfl_Module *mod = dwfl_cumodule (cu);
+         const char *modname = (dwfl_module_info (mod, NULL, NULL, NULL,
+                                                  NULL, NULL, NULL, NULL)
+                                ?: "<unknown>");
+         const char *cuname = (dwarf_diename (cu) ?: "<unknown>");
+
+         printf ("mod: %s CU: [%" PRIx64 "] %s\n", modname,
+                 dwarf_dieoffset (cu), cuname);
+
+         size_t lines;
+         if (dwfl_getsrclines (cu, &lines) != 0)
+           continue; // No lines...
+
+         for (size_t i = 0; i < lines; i++)
+           {
+             Dwfl_Line *line = dwfl_onesrcline (cu, i);
+
+             Dwarf_Addr addr;
+             int lineno;
+             int colno;
+             Dwarf_Word mtime;
+             Dwarf_Word length;
+             const char *src = dwfl_lineinfo (line, &addr, &lineno, &colno,
+                                              &mtime, &length);
+
+             Dwarf_Addr dw_bias;
+             Dwarf_Line *dw_line = dwfl_dwarf_line (line, &dw_bias);
+             assert (bias == dw_bias);
+
+             Dwarf_Addr dw_addr;
+             if (dwarf_lineaddr (dw_line, &dw_addr) != 0)
+               error (EXIT_FAILURE, 0, "dwarf_lineaddr: %s",
+                      dwarf_errmsg (-1));
+             assert (addr == dw_addr + dw_bias);
+
+             unsigned int dw_op_index;
+             if (dwarf_lineop_index (dw_line, &dw_op_index) != 0)
+               error (EXIT_FAILURE, 0, "dwarf_lineop_index: %s",
+                      dwarf_errmsg (-1));
+
+             int dw_lineno;
+             if (dwarf_lineno (dw_line, &dw_lineno) != 0)
+               error (EXIT_FAILURE, 0, "dwarf_lineno: %s",
+                      dwarf_errmsg (-1));
+             assert (lineno == dw_lineno);
+
+             int dw_colno;
+             if (dwarf_linecol (dw_line, &dw_colno) != 0)
+               error (EXIT_FAILURE, 0, "dwarf_lineno: %s",
+                      dwarf_errmsg (-1));
+             assert (colno == dw_colno);
+
+             bool begin;
+             if (dwarf_linebeginstatement (dw_line, &begin) != 0)
+               error (EXIT_FAILURE, 0, "dwarf_linebeginstatement: %s",
+                      dwarf_errmsg (-1));
+
+             bool end;
+             if (dwarf_lineendsequence (dw_line, &end) != 0)
+               error (EXIT_FAILURE, 0, "dwarf_lineendsequence: %s",
+                      dwarf_errmsg (-1));
+
+             bool pend;
+             if (dwarf_lineprologueend (dw_line, &pend) != 0)
+               error (EXIT_FAILURE, 0, "dwarf_lineprologueend: %s",
+                      dwarf_errmsg (-1));
+
+             bool ebegin;
+             if (dwarf_lineepiloguebegin (dw_line, &ebegin) != 0)
+               error (EXIT_FAILURE, 0, "dwarf_lineepiloguebegin: %s",
+                      dwarf_errmsg (-1));
+
+             bool block;
+             if (dwarf_lineblock (dw_line, &block) != 0)
+               error (EXIT_FAILURE, 0, "dwarf_lineblock: %s",
+                      dwarf_errmsg (-1));
+
+             unsigned int isa;
+             if (dwarf_lineisa (dw_line, &isa) != 0)
+               error (EXIT_FAILURE, 0, "dwarf_lineisa: %s",
+                      dwarf_errmsg (-1));
+
+             unsigned int disc;
+             if (dwarf_linediscriminator (dw_line, &disc) != 0)
+               error (EXIT_FAILURE, 0, "dwarf_linediscriminator: %s",
+                      dwarf_errmsg (-1));
+
+             const char *dw_src;
+             Dwarf_Word dw_mtime;
+             Dwarf_Word dw_length;
+             dw_src = dwarf_linesrc (dw_line, &dw_mtime, &dw_length);
+             assert (strcmp (src, dw_src) == 0);
+             assert (mtime == dw_mtime);
+             assert (length == dw_length);
+
+             printf ("%zd %#" PRIx64 " %s:%d:%d\n"
+                     " time: %#" PRIX64 ", len: %" PRIu64
+                     ", idx: %d, b: %d, e: %d"
+                     ", pe: %d, eb: %d, block: %d"
+                     ", isa: %d, disc: %d\n",
+                     i, addr, src, lineno, colno, mtime, length,
+                     dw_op_index, begin, end, pend, ebegin, block, isa, disc);
+
+             Dwarf_Die *linecu = dwfl_linecu (line);
+             assert (cu == linecu);
+
+             Dwfl_Module *linemod = dwfl_linemodule (line);
+             assert (mod == linemod);
+           }
+       }
+    }
+  while (cu != NULL);
+
+  dwfl_end (dwfl);
+
+  return 0;
+}
diff --git a/tests/dwflsyms.c b/tests/dwflsyms.c
new file mode 100644 (file)
index 0000000..49ac334
--- /dev/null
@@ -0,0 +1,226 @@
+/* Test program for libdwfl symbol resolving
+   Copyright (C) 2013 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/>.  */
+
+#include <config.h>
+#include <assert.h>
+#include <inttypes.h>
+#include ELFUTILS_HEADER(dwfl)
+#include <elf.h>
+#include <dwarf.h>
+#include <argp.h>
+#include <stdio.h>
+#include <stdio_ext.h>
+#include <stdlib.h>
+#include <error.h>
+#include <string.h>
+
+static const char *
+gelf_type (GElf_Sym *sym)
+{
+  switch (GELF_ST_TYPE (sym->st_info))
+    {
+    case STT_NOTYPE:
+      return "NOTYPE";
+    case STT_OBJECT:
+      return "OBJECT";
+    case STT_FUNC:
+      return "FUNC";
+    case STT_SECTION:
+      return "SECTION";
+    case STT_FILE:
+      return "FILE";
+    case STT_COMMON:
+      return "COMMON";
+    case STT_TLS:
+      return "TLS";
+    default:
+      return "UNKNOWN";
+    }
+}
+
+static const char *
+gelf_bind (GElf_Sym *sym)
+{
+  switch (GELF_ST_BIND (sym->st_info))
+    {
+    case STB_LOCAL:
+      return "LOCAL";
+    case STB_GLOBAL:
+      return "GLOBAL";
+    case STB_WEAK:
+      return "WEAK";
+    default:
+      return "UNKNOWN";
+    }
+}
+
+static int
+gelf_bind_order (GElf_Sym *sym)
+{
+  switch (GELF_ST_BIND (sym->st_info))
+    {
+    case STB_LOCAL:
+      return 1;
+    case STB_WEAK:
+      return 2;
+    case STB_GLOBAL:
+      return 3;
+    default:
+      return 0;
+    }
+}
+
+static const char *
+elf_section_name (Elf *elf, GElf_Word shndx)
+{
+  GElf_Ehdr ehdr;
+  GElf_Shdr shdr;
+  Elf_Scn *scn = elf_getscn (elf, shndx);
+  gelf_getshdr (scn, &shdr);
+  gelf_getehdr (elf, &ehdr);
+  return elf_strptr (elf, ehdr.e_shstrndx, shdr.sh_name);
+}
+
+bool
+addr_in_section (Elf *elf, GElf_Word shndx, GElf_Addr addr)
+{
+  GElf_Shdr shdr;
+  Elf_Scn *scn = elf_getscn (elf, shndx);
+  gelf_getshdr (scn, &shdr);
+  return addr >= shdr.sh_addr && addr < shdr.sh_addr + shdr.sh_size;
+}
+
+static int
+list_syms (struct Dwfl_Module *mod,
+          void **user __attribute__ ((unused)), const char *mod_name,
+          Dwarf_Addr low_addr __attribute__ ((unused)),
+          void *arg __attribute__ ((unused)))
+{
+  int syms = dwfl_module_getsymtab (mod);
+  if (syms < 0)
+    {
+      printf ("%s: %s\n", mod_name, dwfl_errmsg (-1));
+      return DWARF_CB_OK;
+    }
+
+  for (int ndx = 0; ndx < syms; ndx++)
+    {
+      GElf_Sym sym;
+      GElf_Word shndxp;
+      Elf *elf;
+      Dwarf_Addr bias;
+      const char *name = dwfl_module_getsym (mod, ndx, &sym, &shndxp);
+
+      printf("%4d: %s\t%s\t%s (%" PRIu64 ") %#" PRIx64,
+            ndx, gelf_type (&sym), gelf_bind (&sym), name,
+            sym.st_size, sym.st_value);
+
+      /* The info variant doesn't adjust st_value but returns the (possible)
+        adjusted value separately. */
+      GElf_Addr value;
+      GElf_Sym isym;
+      name = dwfl_module_getsym_info (mod, ndx, &isym, &value, &shndxp,
+                                     &elf, &bias);
+
+      GElf_Ehdr ehdr;
+      gelf_getehdr (elf, &ehdr);
+
+      // getsym st_values might or might not be adjusted depending on section.
+      // For ET_REL the adjustment is section relative.
+      assert (sym.st_value == isym.st_value
+             || sym.st_value == isym.st_value + bias
+             || ehdr.e_type == ET_REL);
+
+      /* And the reverse, which works for function symbols at least.
+        Note this only works because the st.value is adjusted by
+        dwfl_module_getsym ().  */
+      if (GELF_ST_TYPE (sym.st_info) == STT_FUNC && shndxp != SHN_UNDEF)
+       {
+         /* Make sure the adjusted value really falls in the elf section. */
+          assert (addr_in_section (elf, shndxp, sym.st_value - bias));
+
+         GElf_Addr addr = value;
+         GElf_Sym asym;
+         GElf_Word ashndxp;
+         Elf *aelf;
+         Dwarf_Addr abias;
+         GElf_Off off;
+         const char *aname = dwfl_module_addrinfo (mod, addr, &off, &asym,
+                                                   &ashndxp, &aelf, &abias);
+
+         /* Make sure the adjusted value really falls in the elf section. */
+          assert (addr_in_section (aelf, ashndxp, asym.st_value)
+                 || ehdr.e_type == ET_REL);
+
+         /* Either they are the same symbol (name), the binding of
+            asym is "stronger" (or equal) to sym or asym is more specific
+            (has a lower address) than sym.  */
+         assert ((strcmp (name, aname) == 0
+                  || gelf_bind_order (&asym) >= gelf_bind_order (&sym))
+                 && value <= sym.st_value);
+
+         addr = sym.st_value;
+         int res = dwfl_module_relocate_address (mod, &addr);
+         assert (res != -1);
+         if (shndxp < SHN_LORESERVE)
+           printf(", rel: %#" PRIx64 " (%s)", addr,
+                  elf_section_name (elf, shndxp));
+         else
+           printf(", rel: %#" PRIx64 "", addr);
+
+         /* Print the section of the actual value if different from sym.  */
+         if (value != isym.st_value + bias && ehdr.e_type != ET_REL)
+           {
+             GElf_Addr ebias;
+             addr = value;
+             Elf_Scn *scn = dwfl_module_address_section (mod, &addr, &ebias);
+             GElf_Shdr shdr_mem;
+             GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+             Elf *melf = dwfl_module_getelf (mod, &ebias);
+             gelf_getehdr (melf, &ehdr);
+             const char *sname = elf_strptr (melf, ehdr.e_shstrndx,
+                                             shdr->sh_name);
+             printf (" [%#" PRIx64 ", rel: %#" PRIx64 " (%s)]",
+                     value, addr, sname);
+           }
+
+       }
+      printf ("\n");
+    }
+
+  return DWARF_CB_OK;
+}
+
+int
+main (int argc, char *argv[])
+{
+  int remaining;
+  Dwfl *dwfl;
+  error_t res;
+
+  res = argp_parse (dwfl_standard_argp (), argc, argv, 0, &remaining, &dwfl);
+  assert (res == 0 && dwfl != NULL);
+
+  ptrdiff_t off = 0;
+  do
+    off = dwfl_getmodules (dwfl, list_syms, NULL, off);
+  while (off > 0);
+
+  dwfl_end (dwfl);
+
+  return off;
+}
diff --git a/tests/funcretval_test.c b/tests/funcretval_test.c
new file mode 100644 (file)
index 0000000..7e20f52
--- /dev/null
@@ -0,0 +1,828 @@
+signed char fun_char (void) { return 5; }
+short fun_short (void) { return 6; }
+int fun_int (void) { return 7; }
+void *fun_ptr (void) { return &fun_ptr; }
+int fun_iptr (void) { return 8; }
+long fun_long (void) { return 9; }
+__int128 fun_int128 (void) { return 10; }
+
+typedef struct { int i[10]; } large_struct1_t;
+large_struct1_t fun_large_struct1 (void) {
+  large_struct1_t ret = { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } };
+  return ret;
+}
+
+typedef struct { int i1; int i2; int i3; int i4; int i5;
+  int i6; int i7; int i8; int i9; int i10; } large_struct2_t;
+large_struct2_t fun_large_struct2 (void) {
+  large_struct2_t ret = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
+  return ret;
+}
+
+float fun_float (void) { return 1.5; }
+float _Complex fun_float_complex (void) { return 1.5 + 2.5i; }
+
+double fun_double (void) { return 2.5; }
+double _Complex fun_double_complex (void) { return 2.5 + 3.5i; }
+
+long double fun_long_double (void) { return 3.5; }
+long double _Complex fun_long_double_complex (void) { return 4.5 + 5.5i; }
+
+#ifdef FLOAT128
+__float128 fun_float128 (void) { return 3.5; }
+#endif
+
+// 8 byte vectors.
+
+typedef signed char __attribute__ ((vector_size (8))) vec_char_8_t;
+vec_char_8_t fun_vec_char_8 (void) {
+  vec_char_8_t ret = { 1, 2, 3, 4, 5, 6, 7, 8 };
+  return ret;
+}
+
+typedef short __attribute__ ((vector_size (8))) vec_short_8_t;
+vec_short_8_t fun_vec_short_8 (void) {
+  vec_short_8_t ret = { 2, 3, 4, 5 };
+  return ret;
+}
+
+typedef int __attribute__ ((vector_size (8))) vec_int_8_t;
+vec_int_8_t fun_vec_int_8 (void) {
+  vec_int_8_t ret = { 3, 4 };
+  return ret;
+}
+
+typedef long __attribute__ ((vector_size (8))) vec_long_8_t;
+vec_long_8_t fun_vec_long_8 (void) {
+  vec_long_8_t ret = { 5 };
+  return ret;
+}
+
+typedef float __attribute__ ((vector_size (8))) vec_float_8_t;
+vec_float_8_t fun_vec_float_8 (void) {
+  vec_float_8_t ret = { 1.5, 2.5 };
+  return ret;
+}
+
+typedef double __attribute__ ((vector_size (8))) vec_double_8_t;
+#ifndef AARCH64_BUG_1032854
+// https://bugzilla.redhat.com/show_bug.cgi?id=1032854
+vec_double_8_t fun_vec_double_8 (void) {
+  vec_double_8_t ret = { 3.5 };
+  return ret;
+}
+#endif
+
+// 16 byte vectors.
+
+typedef signed char __attribute__ ((vector_size (16))) vec_char_16_t;
+vec_char_16_t fun_vec_char_16 (void) {
+  vec_char_16_t ret = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
+  return ret;
+}
+
+typedef short __attribute__ ((vector_size (16))) vec_short_16_t;
+vec_short_16_t fun_vec_short_16 (void) {
+  vec_short_16_t ret = { 2, 3, 4, 5, 6, 7, 8 };
+  return ret;
+}
+
+typedef int __attribute__ ((vector_size (16))) vec_int_16_t;
+vec_int_16_t fun_vec_int_16 (void) {
+  vec_int_16_t ret = { 2, 3, 4 };
+  return ret;
+}
+
+typedef long __attribute__ ((vector_size (16))) vec_long_16_t;
+vec_long_16_t fun_vec_long_16 (void) {
+  vec_long_16_t ret = { 3, 4 };
+  return ret;
+}
+
+typedef __int128 __attribute__ ((vector_size (16))) vec_int128_16_t;
+vec_int128_16_t fun_vec_int128_16 (void) {
+  vec_int128_16_t ret = { 999 };
+  return ret;
+}
+
+typedef float __attribute__ ((vector_size (16))) vec_float_16_t;
+vec_float_16_t fun_vec_float_16 (void) {
+  vec_float_16_t ret = { 1.5, 2.5, 3.5, 4.5 };
+  return ret;
+}
+
+typedef double __attribute__ ((vector_size (16))) vec_double_16_t;
+vec_double_16_t fun_vec_double_16 (void) {
+  vec_double_16_t ret = { 2.5, 5 };
+  return ret;
+}
+
+#ifdef FLOAT128
+typedef __float128 __attribute__ ((vector_size (16))) vec_float128_16_t;
+vec_float128_16_t fun_vec_float128_16 (void) {
+  vec_float128_16_t ret = { 7.5 };
+  return ret;
+}
+#endif
+
+// Homogeneous floating-point aggregates.
+
+typedef struct { float f; } hfa1_float_t;
+hfa1_float_t fun_hfa1_float (void) {
+  hfa1_float_t ret = { 1.5 };
+  return ret;
+}
+
+typedef struct { double f; } hfa1_double_t;
+hfa1_double_t fun_hfa1_double (void) {
+  hfa1_double_t ret = { 3.0 };
+  return ret;
+}
+
+typedef struct { long double f; } hfa1_long_double_t;
+hfa1_long_double_t fun_hfa1_long_double (void) {
+  hfa1_long_double_t ret = { 3.0 };
+  return ret;
+}
+
+typedef struct { float f[1]; } hfa1_float_a_t;
+hfa1_float_a_t fun_hfa1_float_a (void) {
+  hfa1_float_a_t ret = { { 1.5 } };
+  return ret;
+}
+
+typedef struct { double f[1]; } hfa1_double_a_t;
+hfa1_double_a_t fun_hfa1_double_a (void) {
+  hfa1_double_a_t ret = { { 3.0 } };
+  return ret;
+}
+
+typedef struct { long double f[1]; } hfa1_long_double_a_t;
+hfa1_long_double_a_t fun_hfa1_long_double_a (void) {
+  hfa1_long_double_a_t ret = { { 3.0 } };
+  return ret;
+}
+
+typedef struct { float f; float g; } hfa2_float_t;
+hfa2_float_t fun_hfa2_float (void) {
+  hfa2_float_t ret = { 1.5, 3.0 };
+  return ret;
+}
+
+typedef struct { double f; double g; } hfa2_double_t;
+hfa2_double_t fun_hfa2_double (void) {
+  hfa2_double_t ret = { 3.0, 4.5 };
+  return ret;
+}
+
+typedef struct { long double f; long double g; } hfa2_long_double_t;
+hfa2_long_double_t fun_hfa2_long_double (void) {
+  hfa2_long_double_t ret = { 3.0, 4.5 };
+  return ret;
+}
+
+typedef struct { float f[2]; } hfa2_float_a_t;
+hfa2_float_a_t fun_hfa2_float_a (void) {
+  hfa2_float_a_t ret = { { 2.5, 3.5 } };
+  return ret;
+}
+
+typedef struct { double f[2]; } hfa2_double_a_t;
+hfa2_double_a_t fun_hfa2_double_a (void) {
+  hfa2_double_a_t ret = { { 3.0, 3.5 } };
+  return ret;
+}
+
+typedef struct { long double f[2]; } hfa2_long_double_a_t;
+hfa2_long_double_a_t fun_hfa2_long_double_a (void) {
+  hfa2_long_double_a_t ret = { { 3.0, 4.0 } };
+  return ret;
+}
+
+typedef struct { float f; float g; float h; } hfa3_float_t;
+hfa3_float_t fun_hfa3_float (void) {
+  hfa3_float_t ret = { 1.5, 3.0, 4.5 };
+  return ret;
+}
+
+typedef struct { double f; double g; double h; } hfa3_double_t;
+hfa3_double_t fun_hfa3_double (void) {
+  hfa3_double_t ret = { 3.0, 4.5, 9.5 };
+  return ret;
+}
+
+typedef struct { long double f; long double g; long double h; } hfa3_long_double_t;
+hfa3_long_double_t fun_hfa3_long_double (void) {
+  hfa3_long_double_t ret = { 3.0, 4.5, 9.5 };
+  return ret;
+}
+
+typedef struct { float f[3]; } hfa3_float_a_t;
+hfa3_float_a_t fun_hfa3_float_a (void) {
+  hfa3_float_a_t ret = { { 3.5, 4.5, 5.5 } };
+  return ret;
+}
+
+typedef struct { double f[3]; } hfa3_double_a_t;
+hfa3_double_a_t fun_hfa3_double_a (void) {
+  hfa3_double_a_t ret = { { 3.0, 3.5, 4.0 } };
+  return ret;
+}
+
+typedef struct { long double f[3]; } hfa3_long_double_a_t;
+hfa3_long_double_a_t fun_hfa3_long_double_a (void) {
+  hfa3_long_double_a_t ret = { { 3.0, 4.0, 5.0 } };
+  return ret;
+}
+
+typedef struct { float f; float g; float h; float i; } hfa4_float_t;
+hfa4_float_t fun_hfa4_float (void) {
+  hfa4_float_t ret = { 1.5, 3.5, 4.5, 9.5 };
+  return ret;
+}
+
+typedef struct { double f; double g; double h; double i; } hfa4_double_t;
+hfa4_double_t fun_hfa4_double (void) {
+  hfa4_double_t ret = { 3.5, 4.5, 9.5, 1.5 };
+  return ret;
+}
+
+typedef struct { long double f; long double g; long double h; long double i; } hfa4_long_double_t;
+hfa4_long_double_t fun_hfa4_long_double (void) {
+  hfa4_long_double_t ret = { 3.5, 4.5, 9.5, 1.5 };
+  return ret;
+}
+
+typedef struct { float f[4]; } hfa4_float_a_t;
+hfa4_float_a_t fun_hfa4_float_a (void) {
+  hfa4_float_a_t ret = { { 4.5, 5.5, 6.5, 7.5 } };
+  return ret;
+}
+
+typedef struct { double f[4]; } hfa4_double_a_t;
+hfa4_double_a_t fun_hfa4_double_a (void) {
+  hfa4_double_a_t ret = { { 3.0, 4.5, 5.0, 5.5 } };
+  return ret;
+}
+
+typedef struct { long double f[4]; } hfa4_long_double_a_t;
+hfa4_long_double_a_t fun_hfa4_long_double_a (void) {
+  hfa4_long_double_a_t ret = { { 3.0, 4.0, 5.0, 6.0 } };
+  return ret;
+}
+
+typedef struct { float f; float g; float h; float i; float j; } nfa5_float_t;
+nfa5_float_t fun_nfa5_float (void) {
+  nfa5_float_t ret = { 1.5, 3.5, 4.5, 9.5, 10.5 };
+  return ret;
+}
+
+typedef struct { double f; double g; double h; double i; double j; } nfa5_double_t;
+nfa5_double_t fun_nfa5_double (void) {
+  nfa5_double_t ret = { 3.5, 4.5, 9.5, 1.5, 2.5 };
+  return ret;
+}
+
+typedef struct { long double f; long double g; long double h; long double i; long double j; } nfa5_long_double_t;
+nfa5_long_double_t fun_nfa5_long_double (void) {
+  nfa5_long_double_t ret = { 3.5, 4.5, 9.5, 1.5, 2.5 };
+  return ret;
+}
+
+typedef struct { float f[5]; } nfa5_float_a_t;
+nfa5_float_a_t fun_nfa5_float_a (void) {
+  nfa5_float_a_t ret = { { 4.5, 5.5, 6.5, 7.5, 9.5 } };
+  return ret;
+}
+
+typedef struct { double f[5]; } nfa5_double_a_t;
+nfa5_double_a_t fun_nfa5_double_a (void) {
+  nfa5_double_a_t ret = { { 3.0, 4.5, 5.0, 5.5, 6.5 } };
+  return ret;
+}
+
+typedef struct { long double f[5]; } nfa5_long_double_a_t;
+nfa5_long_double_a_t fun_nfa5_long_double_a (void) {
+  nfa5_long_double_a_t ret = { { 3.0, 4.0, 5.0, 6.0, 7.0 } };
+  return ret;
+}
+
+#ifdef FLOAT128
+typedef struct { __float128 f; } hfa1_float128_t;
+hfa1_float128_t fun_hfa1_float128 (void) {
+  hfa1_float128_t ret = { 4.5 };
+  return ret;
+}
+
+typedef struct { __float128 f; __float128 g; } hfa2_float128_t;
+hfa2_float128_t fun_hfa2_float128 (void) {
+  hfa2_float128_t ret = { 4.5, 9.5 };
+  return ret;
+}
+
+typedef struct { __float128 f; __float128 g; __float128 h; } hfa3_float128_t;
+hfa3_float128_t fun_hfa3_float128 (void) {
+  hfa3_float128_t ret = { 4.5, 9.5, 12.5 };
+  return ret;
+}
+
+typedef struct { __float128 f; __float128 g; __float128 h; __float128 i; } hfa4_float128_t;
+hfa4_float128_t fun_hfa4_float128 (void) {
+  hfa4_float128_t ret = { 4.5, 9.5, 3.5, 1.5 };
+  return ret;
+}
+#endif
+
+// Homogeneous vector aggregates of 1 element.
+
+typedef struct { vec_char_8_t a; } hva1_vec_char_8_t;
+hva1_vec_char_8_t fun_hva1_vec_char_8 (void) {
+  hva1_vec_char_8_t ret = { { 1, 2, 3, 4, 5, 6, 7, 8 } };
+  return ret;
+}
+
+typedef struct { vec_short_8_t a; } hva1_vec_short_8_t;
+hva1_vec_short_8_t fun_hva1_vec_short_8 (void) {
+  hva1_vec_short_8_t ret = { { 2, 3, 4, 5 } };
+  return ret;
+}
+
+typedef struct { vec_int_8_t a; } hva1_vec_int_8_t;
+hva1_vec_int_8_t fun_hva1_vec_int_8 (void) {
+  hva1_vec_int_8_t ret = { { 3, 4 } };
+  return ret;
+}
+
+typedef struct { vec_long_8_t a; } hva1_vec_long_8_t;
+hva1_vec_long_8_t fun_hva1_vec_long_8 (void) {
+  hva1_vec_long_8_t ret = { { 5 } };
+  return ret;
+}
+
+typedef struct { vec_float_8_t a; } hva1_vec_float_8_t;
+hva1_vec_float_8_t fun_hva1_vec_float_8 (void) {
+  hva1_vec_float_8_t ret = { { 1.5, 2.5 } };
+  return ret;
+}
+
+typedef struct { vec_double_8_t a; } hva1_vec_double_8_t;
+hva1_vec_double_8_t fun_hva1_vec_double_8 (void) {
+  hva1_vec_double_8_t ret = { { 3.5 } };
+  return ret;
+}
+
+typedef struct { vec_char_16_t a; } hva1_vec_char_16_t;
+hva1_vec_char_16_t fun_hva1_vec_char_16_t (void) {
+  hva1_vec_char_16_t ret = { { 1, 2, 3, 4, 5, 6, 7, 8,
+                              9, 10, 11, 12, 13, 14, 15, 16 } };
+  return ret;
+}
+
+typedef struct { vec_short_16_t a; } hva1_vec_short_16_t;
+hva1_vec_short_16_t fun_hva1_vec_short_16_t (void) {
+  hva1_vec_short_16_t ret = { { 2, 3, 4, 5, 6, 7, 8, 9 } };
+  return ret;
+}
+
+typedef struct { vec_int_16_t a; } hva1_vec_int_16_t;
+hva1_vec_int_16_t fun_hva1_vec_int_16_t (void) {
+  hva1_vec_int_16_t ret = { { 3, 4, 5, 6 } };
+  return ret;
+}
+
+typedef struct { vec_long_16_t a; } hva1_vec_long_16_t;
+hva1_vec_long_16_t fun_hva1_vec_long_16_t (void) {
+  hva1_vec_long_16_t ret = { { 4, 5 } };
+  return ret;
+}
+
+typedef struct { vec_int128_16_t a; } hva1_vec_int128_16_t;
+hva1_vec_int128_16_t fun_hva1_vec_int128_16_t (void) {
+  hva1_vec_int128_16_t ret = { { 6 } };
+  return ret;
+}
+
+typedef struct { vec_float_16_t a; } hva1_vec_float_16_t;
+hva1_vec_float_16_t fun_hva1_vec_float_16_t (void) {
+  hva1_vec_float_16_t ret = { { 1.5, 2.5, 3.5, 4.5 } };
+  return ret;
+}
+
+typedef struct { vec_double_16_t a; } hva1_vec_double_16_t;
+hva1_vec_double_16_t fun_hva1_vec_double_16_t (void) {
+  hva1_vec_double_16_t ret = { { 2.5, 3.5 } };
+  return ret;
+}
+
+#ifdef FLOAT128
+typedef struct { vec_float128_16_t a; } hva1_vec_float128_16_t;
+hva1_vec_float128_16_t fun_hva1_vec_float128_16_t (void) {
+  hva1_vec_float128_16_t ret = { { 4.5 } };
+  return ret;
+}
+#endif
+
+// Homogeneous vector aggregates of 2 elements.
+
+typedef struct { vec_char_8_t a; vec_char_8_t b; } hva2_vec_char_8_t;
+hva2_vec_char_8_t fun_hva2_vec_char_8 (void) {
+  hva2_vec_char_8_t ret = { { 1, 2, 3, 4, 5, 6, 7, 8 },
+                           { 2, 3, 4, 5, 6, 7, 8, 9 } };
+  return ret;
+}
+
+typedef struct { vec_short_8_t a; vec_short_8_t b; } hva2_vec_short_8_t;
+hva2_vec_short_8_t fun_hva2_vec_short_8 (void) {
+  hva2_vec_short_8_t ret = { { 2, 3, 4, 5 },
+                            { 3, 4, 5, 6 } };
+  return ret;
+}
+
+typedef struct { vec_int_8_t a; vec_int_8_t b; } hva2_vec_int_8_t;
+hva2_vec_int_8_t fun_hva2_vec_int_8 (void) {
+  hva2_vec_int_8_t ret = { { 3, 4 },
+                          { 4, 5 } };
+  return ret;
+}
+
+typedef struct { vec_long_8_t a; vec_long_8_t b; } hva2_vec_long_8_t;
+hva2_vec_long_8_t fun_hva2_vec_long_8 (void) {
+  hva2_vec_long_8_t ret = { { 5 },
+                           { 6 } };
+  return ret;
+}
+
+typedef struct { vec_float_8_t a; vec_float_8_t b; } hva2_vec_float_8_t;
+hva2_vec_float_8_t fun_hva2_vec_float_8 (void) {
+  hva2_vec_float_8_t ret = { { 1.5, 2.5 },
+                            { 2.5, 3.5 } };
+  return ret;
+}
+
+typedef struct { vec_double_8_t a; vec_double_8_t b; } hva2_vec_double_8_t;
+hva2_vec_double_8_t fun_hva2_vec_double_8 (void) {
+  hva2_vec_double_8_t ret = { { 3.5 },
+                             { 4.5 } };
+  return ret;
+}
+
+typedef struct { vec_char_16_t a; vec_char_16_t b; } hva2_vec_char_16_t;
+hva2_vec_char_16_t fun_hva2_vec_char_16_t (void) {
+  hva2_vec_char_16_t ret = { { 1, 2, 3, 4, 5, 6, 7, 8,
+                              9, 10, 11, 12, 13, 14, 15, 16 },
+                            { 2, 3, 4, 5, 6, 7, 8, 9,
+                              10, 11, 12, 13, 14, 15, 16, 17 } };
+  return ret;
+}
+
+typedef struct { vec_short_16_t a; vec_short_16_t b; } hva2_vec_short_16_t;
+hva2_vec_short_16_t fun_hva2_vec_short_16_t (void) {
+  hva2_vec_short_16_t ret = { { 2, 3, 4, 5, 6, 7, 8, 9 },
+                             { 3, 4, 5, 6, 7, 8, 9, 10 } };
+  return ret;
+}
+
+typedef struct { vec_int_16_t a; vec_int_16_t b; } hva2_vec_int_16_t;
+hva2_vec_int_16_t fun_hva2_vec_int_16_t (void) {
+  hva2_vec_int_16_t ret = { { 3, 4, 5, 6 },
+                           { 4, 5, 6, 7 } };
+  return ret;
+}
+
+typedef struct { vec_long_16_t a; vec_long_16_t b; } hva2_vec_long_16_t;
+hva2_vec_long_16_t fun_hva2_vec_long_16_t (void) {
+  hva2_vec_long_16_t ret = { { 4, 5 },
+                            { 5, 6 } };
+  return ret;
+}
+
+typedef struct { vec_int128_16_t a; vec_int128_16_t b; } hva2_vec_int128_16_t;
+hva2_vec_int128_16_t fun_hva2_vec_int128_16_t (void) {
+  hva2_vec_int128_16_t ret = { { 6 },
+                              { 7 } };
+  return ret;
+}
+
+typedef struct { vec_float_16_t a; vec_float_16_t b; } hva2_vec_float_16_t;
+hva2_vec_float_16_t fun_hva2_vec_float_16_t (void) {
+  hva2_vec_float_16_t ret = { { 1.5, 2.5, 3.5, 4.5 },
+                             { 2.5, 3.5, 4.5, 5.5 } };
+  return ret;
+}
+
+typedef struct { vec_double_16_t a; vec_double_16_t b; } hva2_vec_double_16_t;
+hva2_vec_double_16_t fun_hva2_vec_double_16_t (void) {
+  hva2_vec_double_16_t ret = { { 2.5, 3.5 },
+                              { 3.5, 4.5 } };
+  return ret;
+}
+
+#ifdef FLOAT128
+typedef struct { vec_float128_16_t a; vec_float128_16_t b; } hva2_vec_float128_16_t;
+hva2_vec_float128_16_t fun_hva2_vec_float128_16_t (void) {
+  hva2_vec_float128_16_t ret = { { 4.5 },
+                                { 5.5 } };
+  return ret;
+}
+#endif
+
+// Homogeneous vector aggregates of 3 elements.
+
+typedef struct { vec_char_8_t a; vec_char_8_t b; vec_char_8_t c; } hva3_vec_char_8_t;
+hva3_vec_char_8_t fun_hva3_vec_char_8 (void) {
+  hva3_vec_char_8_t ret = { { 1, 2, 3, 4, 5, 6, 7, 8 },
+                           { 2, 3, 4, 5, 6, 7, 8, 9 },
+                           { 3, 4, 5, 6, 7, 8, 9, 10 } };
+  return ret;
+}
+
+typedef struct { vec_short_8_t a; vec_short_8_t b; vec_short_8_t c; } hva3_vec_short_8_t;
+hva3_vec_short_8_t fun_hva3_vec_short_8 (void) {
+  hva3_vec_short_8_t ret = { { 2, 3, 4, 5 },
+                            { 3, 4, 5, 6 },
+                            { 4, 5, 6, 7 } };
+  return ret;
+}
+
+typedef struct { vec_int_8_t a; vec_int_8_t b; vec_int_8_t c; } hva3_vec_int_8_t;
+hva3_vec_int_8_t fun_hva3_vec_int_8 (void) {
+  hva3_vec_int_8_t ret = { { 3, 4 },
+                          { 4, 5 },
+                          { 5, 6 } };
+  return ret;
+}
+
+typedef struct { vec_long_8_t a; vec_long_8_t b; vec_long_8_t c; } hva3_vec_long_8_t;
+hva3_vec_long_8_t fun_hva3_vec_long_8 (void) {
+  hva3_vec_long_8_t ret = { { 5 },
+                           { 6 },
+                           { 7 } };
+  return ret;
+}
+
+typedef struct { vec_float_8_t a; vec_float_8_t b; vec_float_8_t c; } hva3_vec_float_8_t;
+hva3_vec_float_8_t fun_hva3_vec_float_8 (void) {
+  hva3_vec_float_8_t ret = { { 1.5, 2.5 },
+                            { 2.5, 3.5 },
+                            { 3.5, 4.5 } };
+  return ret;
+}
+
+typedef struct { vec_double_8_t a; vec_double_8_t b; vec_double_8_t c; } hva3_vec_double_8_t;
+hva3_vec_double_8_t fun_hva3_vec_double_8 (void) {
+  hva3_vec_double_8_t ret = { { 3.5 },
+                             { 4.5 },
+                             { 5.5 } };
+  return ret;
+}
+
+typedef struct { vec_char_16_t a; vec_char_16_t b; vec_char_16_t c; } hva3_vec_char_16_t;
+hva3_vec_char_16_t fun_hva3_vec_char_16_t (void) {
+  hva3_vec_char_16_t ret = { { 1, 2, 3, 4, 5, 6, 7, 8,
+                              9, 10, 11, 12, 13, 14, 15, 16 },
+                            { 2, 3, 4, 5, 6, 7, 8, 9,
+                              10, 11, 12, 13, 14, 15, 16, 17 },
+                            { 3, 4, 5, 6, 7, 8, 9, 10,
+                              11, 12, 13, 14, 15, 16, 17, 18 } };
+  return ret;
+}
+
+typedef struct { vec_short_16_t a; vec_short_16_t b; vec_short_16_t c; } hva3_vec_short_16_t;
+hva3_vec_short_16_t fun_hva3_vec_short_16_t (void) {
+  hva3_vec_short_16_t ret = { { 2, 3, 4, 5, 6, 7, 8, 9 },
+                             { 3, 4, 5, 6, 7, 8, 9, 10 },
+                             { 4, 5, 6, 7, 8, 9, 10, 11 } };
+  return ret;
+}
+
+typedef struct { vec_int_16_t a; vec_int_16_t b; vec_int_16_t c; } hva3_vec_int_16_t;
+hva3_vec_int_16_t fun_hva3_vec_int_16_t (void) {
+  hva3_vec_int_16_t ret = { { 3, 4, 5, 6 },
+                           { 4, 5, 6, 7 },
+                           { 5, 6, 7, 8 } };
+  return ret;
+}
+
+typedef struct { vec_long_16_t a; vec_long_16_t b; vec_long_16_t c; } hva3_vec_long_16_t;
+hva3_vec_long_16_t fun_hva3_vec_long_16_t (void) {
+  hva3_vec_long_16_t ret = { { 3, 4 },
+                            { 4, 5 },
+                            { 5, 6 } };
+  return ret;
+}
+
+typedef struct { vec_int128_16_t a; vec_int128_16_t b; vec_int128_16_t c; } hva3_vec_int128_16_t;
+hva3_vec_int128_16_t fun_hva3_vec_int128_16_t (void) {
+  hva3_vec_int128_16_t ret = { { 6 },
+                              { 7 },
+                              { 8 } };
+  return ret;
+}
+
+typedef struct { vec_float_16_t a; vec_float_16_t b; vec_float_16_t c; } hva3_vec_float_16_t;
+hva3_vec_float_16_t fun_hva3_vec_float_16_t (void) {
+  hva3_vec_float_16_t ret = { { 1.5, 2.5, 3.5, 4.5 },
+                             { 2.5, 3.5, 4.5, 5.5 },
+                             { 3.5, 4.5, 5.5, 6.5 } };
+  return ret;
+}
+
+typedef struct { vec_double_16_t a; vec_double_16_t b; vec_double_16_t c; } hva3_vec_double_16_t;
+hva3_vec_double_16_t fun_hva3_vec_double_16_t (void) {
+  hva3_vec_double_16_t ret = { { 2.5, 3.5 },
+                              { 3.5, 4.5 },
+                              { 4.5, 5.5 } };
+  return ret;
+}
+
+#ifdef FLOAT128
+typedef struct { vec_float128_16_t a; vec_float128_16_t b; vec_float128_16_t c; } hva3_vec_float128_16_t;
+hva3_vec_float128_16_t fun_hva3_vec_float128_16_t (void) {
+  hva3_vec_float128_16_t ret = { { 4.5 },
+                                { 5.5 },
+                                { 6.5 } };
+  return ret;
+}
+#endif
+
+// Homogeneous vector aggregates of 3 elements.
+
+typedef struct { vec_char_8_t a; vec_char_8_t b; vec_char_8_t c; vec_char_8_t d; } hva4_vec_char_8_t;
+hva4_vec_char_8_t fun_hva4_vec_char_8 (void) {
+  hva4_vec_char_8_t ret = { { 1, 2, 3, 4, 5, 6, 7, 8 },
+                           { 2, 3, 4, 5, 6, 7, 8, 9 },
+                           { 3, 4, 5, 6, 7, 8, 9, 10 },
+                           { 4, 5, 6, 7, 8, 9, 10, 11 } };
+  return ret;
+}
+
+typedef struct { vec_short_8_t a; vec_short_8_t b; vec_short_8_t c; vec_short_8_t d; } hva4_vec_short_8_t;
+hva4_vec_short_8_t fun_hva4_vec_short_8 (void) {
+  hva4_vec_short_8_t ret = { { 2, 3, 4, 5 },
+                            { 3, 4, 5, 6 },
+                            { 4, 5, 6, 7 },
+                            { 5, 6, 7, 8 } };
+  return ret;
+}
+
+typedef struct { vec_int_8_t a; vec_int_8_t b; vec_int_8_t c; vec_int_8_t d; } hva4_vec_int_8_t;
+hva4_vec_int_8_t fun_hva4_vec_int_8 (void) {
+  hva4_vec_int_8_t ret = { { 3, 4 },
+                          { 4, 5 },
+                          { 5, 6 },
+                          { 6, 7 } };
+  return ret;
+}
+
+typedef struct { vec_long_8_t a; vec_long_8_t b; vec_long_8_t c; vec_long_8_t d; } hva4_vec_long_8_t;
+hva4_vec_long_8_t fun_hva4_vec_long_8 (void) {
+  hva4_vec_long_8_t ret = { { 5 },
+                           { 6 },
+                           { 7 },
+                           { 8 } };
+  return ret;
+}
+
+typedef struct { vec_float_8_t a; vec_float_8_t b; vec_float_8_t c; vec_float_8_t d; } hva4_vec_float_8_t;
+hva4_vec_float_8_t fun_hva4_vec_float_8 (void) {
+  hva4_vec_float_8_t ret = { { 1.5, 2.5 },
+                            { 2.5, 3.5 },
+                            { 3.5, 4.5 },
+                            { 4.5, 5.5 } };
+  return ret;
+}
+
+typedef struct { vec_double_8_t a; vec_double_8_t b; vec_double_8_t c; vec_double_8_t d; } hva4_vec_double_8_t;
+hva4_vec_double_8_t fun_hva4_vec_double_8 (void) {
+  hva4_vec_double_8_t ret = { { 3.5 },
+                             { 4.5 },
+                             { 5.5 },
+                             { 6.5 } };
+  return ret;
+}
+
+typedef struct { vec_char_16_t a; vec_char_16_t b; vec_char_16_t c; vec_char_16_t d; } hva4_vec_char_16_t;
+hva4_vec_char_16_t fun_hva4_vec_char_16_t (void) {
+  hva4_vec_char_16_t ret = { { 1, 2, 3, 4, 5, 6, 7, 8,
+                              9, 10, 11, 12, 13, 14, 15, 16 },
+                            { 2, 3, 4, 5, 6, 7, 8, 9,
+                              10, 11, 12, 13, 14, 15, 16, 17 },
+                            { 3, 4, 5, 6, 7, 8, 9, 10,
+                              11, 12, 13, 14, 15, 16, 17, 18 },
+                            { 4, 5, 6, 7, 8, 9, 10, 11,
+                              12, 13, 14, 15, 16, 17, 18, 19 } };
+  return ret;
+}
+
+typedef struct { vec_short_16_t a; vec_short_16_t b; vec_short_16_t c; vec_short_16_t d; } hva4_vec_short_16_t;
+hva4_vec_short_16_t fun_hva4_vec_short_16_t (void) {
+  hva4_vec_short_16_t ret = { { 2, 3, 4, 5, 6, 7, 8, 9 },
+                             { 3, 4, 5, 6, 7, 8, 9, 10 },
+                             { 4, 5, 6, 7, 8, 9, 10, 11 },
+                             { 5, 6, 7, 8, 9, 10, 11, 12 } };
+  return ret;
+}
+
+typedef struct { vec_int_16_t a; vec_int_16_t b; vec_int_16_t c; vec_int_16_t d; } hva4_vec_int_16_t;
+hva4_vec_int_16_t fun_hva4_vec_int_16_t (void) {
+  hva4_vec_int_16_t ret = { { 3, 4, 5, 6 },
+                           { 4, 5, 6, 7 },
+                           { 5, 6, 7, 8 },
+                           { 6, 7, 8, 9 } };
+  return ret;
+}
+
+typedef struct { vec_long_16_t a; vec_long_16_t b; vec_long_16_t c; vec_long_16_t d; } hva4_vec_long_16_t;
+hva4_vec_long_16_t fun_hva4_vec_long_16_t (void) {
+  hva4_vec_long_16_t ret = { { 3, 4 },
+                            { 4, 5 },
+                            { 5, 6 },
+                            { 6, 7 } };
+  return ret;
+}
+
+typedef struct { vec_int128_16_t a; vec_int128_16_t b; vec_int128_16_t c; vec_int128_16_t d; } hva4_vec_int128_16_t;
+hva4_vec_int128_16_t fun_hva4_vec_int128_16_t (void) {
+  hva4_vec_int128_16_t ret = { { 6 },
+                              { 7 },
+                              { 8 },
+                              { 9 } };
+  return ret;
+}
+
+typedef struct { vec_float_16_t a; vec_float_16_t b; vec_float_16_t c; vec_float_16_t d; } hva4_vec_float_16_t;
+hva4_vec_float_16_t fun_hva4_vec_float_16_t (void) {
+  hva4_vec_float_16_t ret = { { 1.5, 2.5, 3.5, 4.5 },
+                             { 2.5, 3.5, 4.5, 5.5 },
+                             { 3.5, 4.5, 5.5, 6.5 },
+                             { 4.5, 5.5, 6.5, 7.5 } };
+  return ret;
+}
+
+typedef struct { vec_double_16_t a; vec_double_16_t b; vec_double_16_t c; vec_double_16_t d; } hva4_vec_double_16_t;
+hva4_vec_double_16_t fun_hva4_vec_double_16_t (void) {
+  hva4_vec_double_16_t ret = { { 2.5, 3.5 },
+                              { 3.5, 4.5 },
+                              { 4.5, 5.5 },
+                              { 5.5, 6.5 } };
+  return ret;
+}
+
+#ifdef FLOAT128
+typedef struct { vec_float128_16_t a; vec_float128_16_t b; vec_float128_16_t c; vec_float128_16_t d; } hva4_vec_float128_16_t;
+hva4_vec_float128_16_t fun_hva4_vec_float128_16_t (void) {
+  hva4_vec_float128_16_t ret = { { 4.5 },
+                                { 5.5 },
+                                { 6.5 },
+                                { 7.5 } };
+  return ret;
+}
+#endif
+
+// Mixed HFA.
+typedef struct { float _Complex a; float b; } mixed_hfa3_cff_t;
+mixed_hfa3_cff_t fun_mixed_hfa3_cff (void) {
+  mixed_hfa3_cff_t ret = { 1.5 + 2.5i, 3.5 };
+  return ret;
+}
+
+typedef struct { double _Complex a; double b; } mixed_hfa3_cdd_t;
+mixed_hfa3_cdd_t fun_mixed_hfa3_cdd (void) {
+  mixed_hfa3_cdd_t ret = { 1.5 + 2.5i, 3.5 };
+  return ret;
+}
+
+typedef struct { long double _Complex a; long double b; } mixed_hfa3_cldld_t;
+mixed_hfa3_cldld_t fun_mixed_hfa3_cldld (void) {
+  mixed_hfa3_cldld_t ret = { 1.5 + 2.5i, 3.5 };
+  return ret;
+}
+
+typedef struct { float b; float _Complex a; } mixed_hfa3_fcf_t;
+mixed_hfa3_fcf_t fun_mixed_hfa3_fcf (void) {
+  mixed_hfa3_fcf_t ret = { 3.5, 1.5 + 2.5i };
+  return ret;
+}
+
+typedef struct { double b; double _Complex a; } mixed_hfa3_dcd_t;
+mixed_hfa3_dcd_t fun_mixed_hfa3_dcd (void) {
+  mixed_hfa3_dcd_t ret = { 3.5, 1.5 + 2.5i };
+  return ret;
+}
+
+typedef struct { long double b; long double _Complex a; } mixed_hfa3_ldcld_t;
+mixed_hfa3_ldcld_t fun_mixed_hfa3_ldcld (void) {
+  mixed_hfa3_ldcld_t ret = { 3.5, 1.5 + 2.5i };
+  return ret;
+}
+
+typedef struct { vec_float_8_t a; vec_short_8_t b; } mixed_hfa2_fltsht_t;
+mixed_hfa2_fltsht_t fun_mixed_hfa2_fltsht_t (void) {
+  mixed_hfa2_fltsht_t ret = { { 3.5, 4.5 }, { 1, 2, 3, 4 } };
+  return ret;
+}
+
+int main(int argc, char *argv[])
+{
+  return 0;
+}
diff --git a/tests/funcretval_test_aarch64.bz2 b/tests/funcretval_test_aarch64.bz2
new file mode 100755 (executable)
index 0000000..5494e10
Binary files /dev/null and b/tests/funcretval_test_aarch64.bz2 differ
diff --git a/tests/hello_aarch64.ko.bz2 b/tests/hello_aarch64.ko.bz2
new file mode 100644 (file)
index 0000000..431d89f
Binary files /dev/null and b/tests/hello_aarch64.ko.bz2 differ
diff --git a/tests/run-addr2line-i-test.sh b/tests/run-addr2line-i-test.sh
new file mode 100755 (executable)
index 0000000..e98adda
--- /dev/null
@@ -0,0 +1,145 @@
+#! /bin/sh
+# Copyright (C) 2013 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
+
+# // g++ x.cpp -g -fPIC -olibx.so -shared -O3 -fvisibility=hidden
+#
+# void foobar()
+# {
+#   __asm__ ( "nop" ::: );
+# }
+#
+# void fubar()
+# {
+#   __asm__ ( "nop" ::: );
+# }
+#
+# void bar()
+# {
+#   foobar();
+# }
+#
+# void baz()
+# {
+#   fubar();
+# }
+#
+# void foo()
+# {
+#   bar();
+#   baz();
+# }
+#
+# void fu()
+# {
+#   __asm__ ( "nop" ::: );
+#   fubar();
+#   foobar();
+# }
+
+testfiles testfile-inlines
+
+testrun_compare ${abs_top_builddir}/src/addr2line -i -e testfile-inlines 0x00000000000005a0 <<\EOF
+/tmp/x.cpp:5
+EOF
+
+testrun_compare ${abs_top_builddir}/src/addr2line -i -e testfile-inlines 0x00000000000005a1 <<\EOF
+/tmp/x.cpp:6
+EOF
+
+testrun_compare ${abs_top_builddir}/src/addr2line -i -e testfile-inlines 0x00000000000005b0 <<\EOF
+/tmp/x.cpp:10
+EOF
+
+testrun_compare ${abs_top_builddir}/src/addr2line -i -e testfile-inlines 0x00000000000005b1 <<\EOF
+/tmp/x.cpp:11
+EOF
+
+testrun_compare ${abs_top_builddir}/src/addr2line -i -e testfile-inlines 0x00000000000005c0 <<\EOF
+/tmp/x.cpp:5
+/tmp/x.cpp:15
+EOF
+
+testrun_compare ${abs_top_builddir}/src/addr2line -i -e testfile-inlines 0x00000000000005d0 <<\EOF
+/tmp/x.cpp:10
+/tmp/x.cpp:20
+EOF
+
+testrun_compare ${abs_top_builddir}/src/addr2line -i -e testfile-inlines 0x00000000000005e0 <<\EOF
+/tmp/x.cpp:5
+/tmp/x.cpp:15
+/tmp/x.cpp:25
+EOF
+
+testrun_compare ${abs_top_builddir}/src/addr2line -i -e testfile-inlines 0x00000000000005e1 <<\EOF
+/tmp/x.cpp:10
+/tmp/x.cpp:20
+/tmp/x.cpp:26
+EOF
+
+testrun_compare ${abs_top_builddir}/src/addr2line -i -e testfile-inlines 0x00000000000005f1 <<\EOF
+/tmp/x.cpp:10
+/tmp/x.cpp:32
+EOF
+
+testrun_compare ${abs_top_builddir}/src/addr2line -i -e testfile-inlines 0x00000000000005f2 <<\EOF
+/tmp/x.cpp:5
+/tmp/x.cpp:33
+EOF
+
+# All together now (plus function names).
+testrun_compare ${abs_top_builddir}/src/addr2line -f -i -e testfile-inlines 0x00000000000005a0 0x00000000000005a1 0x00000000000005b0 0x00000000000005b1 0x00000000000005c0 0x00000000000005d0 0x00000000000005e0 0x00000000000005e1 0x00000000000005f1 0x00000000000005f2 <<\EOF
+foobar
+/tmp/x.cpp:5
+foobar
+/tmp/x.cpp:6
+fubar
+/tmp/x.cpp:10
+fubar
+/tmp/x.cpp:11
+foobar inlined at /tmp/x.cpp:15 in _Z3barv
+/tmp/x.cpp:5
+bar
+/tmp/x.cpp:15
+fubar inlined at /tmp/x.cpp:20 in _Z3bazv
+/tmp/x.cpp:10
+baz
+/tmp/x.cpp:20
+foobar inlined at /tmp/x.cpp:15 in _Z3foov
+/tmp/x.cpp:5
+bar
+/tmp/x.cpp:15
+_Z3foov
+/tmp/x.cpp:25
+fubar inlined at /tmp/x.cpp:20 in _Z3foov
+/tmp/x.cpp:10
+baz
+/tmp/x.cpp:20
+_Z3foov
+/tmp/x.cpp:26
+fubar inlined at /tmp/x.cpp:32 in _Z2fuv
+/tmp/x.cpp:10
+_Z2fuv
+/tmp/x.cpp:32
+foobar inlined at /tmp/x.cpp:33 in _Z2fuv
+/tmp/x.cpp:5
+_Z2fuv
+/tmp/x.cpp:33
+EOF
+
+exit 0
diff --git a/tests/run-addr2line-test.sh b/tests/run-addr2line-test.sh
new file mode 100755 (executable)
index 0000000..768006b
--- /dev/null
@@ -0,0 +1,74 @@
+#! /bin/sh
+# Copyright (C) 2013 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
+tempfiles good.out stdin.nl stdin.nl.out stdin.nonl stdin.nonl.out foo.out
+tempfiles addr2line.out
+
+cat > good.out <<\EOF
+foo
+/home/drepper/gnu/new-bu/build/ttt/f.c:3
+bar
+/home/drepper/gnu/new-bu/build/ttt/b.c:4
+foo
+/home/drepper/gnu/new-bu/build/ttt/f.c:3
+bar
+/home/drepper/gnu/new-bu/build/ttt/b.c:4
+foo
+/home/drepper/gnu/new-bu/build/ttt/f.c:3
+bar
+/home/drepper/gnu/new-bu/build/ttt/b.c:4
+foo
+/home/drepper/gnu/new-bu/build/ttt/f.c:3
+bar
+/home/drepper/gnu/new-bu/build/ttt/b.c:4
+EOF
+
+echo "# Everything on the command line"
+cat good.out | testrun_compare ${abs_top_builddir}/src/addr2line -f -e testfile 0x08048468 0x0804845c foo bar foo+0x0 bar+0x0 foo-0x0 bar-0x0
+
+cat > stdin.nl <<\EOF
+0x08048468
+0x0804845c
+foo
+bar
+foo+0x0
+bar+0x0
+foo-0x0
+bar-0x0
+EOF
+
+echo "# Everything from stdin (with newlines)."
+cat stdin.nl | testrun ${abs_top_builddir}/src/addr2line -f -e testfile > stdin.nl.out || exit 1
+cmp good.out stdin.nl.out || exit 1
+
+cat > foo.out <<\EOF
+foo
+/home/drepper/gnu/new-bu/build/ttt/f.c:3
+EOF
+
+echo "# stdin without newline address, just EOF."
+echo -n "0x08048468" | testrun ${abs_top_builddir}/src/addr2line -f -e testfile > stdin.nonl.out || exit 1
+cmp foo.out stdin.nonl.out || exit 1
+
+echo "# stdin without newline symbol, just EOF."
+echo -n "foo" | testrun ${abs_top_builddir}/src/addr2line -f -e testfile > stdin.nl.out || exit 1
+cmp foo.out stdin.nonl.out || exit 1
+
+exit 0
diff --git a/tests/run-addrcfi.sh b/tests/run-addrcfi.sh
new file mode 100755 (executable)
index 0000000..5d33246
--- /dev/null
@@ -0,0 +1,2650 @@
+#! /bin/sh
+# Copyright (C) 2013
+# This file is part of elfutils.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# elfutils is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/test-subr.sh
+
+# Note some testfiles are also used in run-allregs.sh.
+
+# Shows return address, CFA location expression and register rules
+# from ABI's default CFI program as setup by arch ebl backend hook
+# abi_cfi unless overridden by CIE and FDE program at given address.
+
+# EM_386 (function main 0x080489b8)
+testfiles testfile11
+testrun_compare ${abs_builddir}/addrcfi -e testfile11 0x080489b8 <<\EOF
+.eh_frame has 0x80489b8 => [0x80489b8, 0x80489b9):
+       return address in reg8
+       CFA location expression: bregx(4,4)
+       integer reg0 (%eax): undefined
+       integer reg1 (%ecx): undefined
+       integer reg2 (%edx): undefined
+       integer reg3 (%ebx): same_value
+       integer reg4 (%esp): location expression: call_frame_cfa stack_value
+       integer reg5 (%ebp): same_value
+       integer reg6 (%esi): same_value
+       integer reg7 (%edi): same_value
+       integer reg8 (%eip): location expression: call_frame_cfa plus_uconst(-4)
+       integer reg9 (%eflags): undefined
+       integer reg10 (%trapno): undefined
+       x87 reg11 (%st0): undefined
+       x87 reg12 (%st1): undefined
+       x87 reg13 (%st2): undefined
+       x87 reg14 (%st3): undefined
+       x87 reg15 (%st4): undefined
+       x87 reg16 (%st5): undefined
+       x87 reg17 (%st6): undefined
+       x87 reg18 (%st7): undefined
+       SSE reg21 (%xmm0): undefined
+       SSE reg22 (%xmm1): undefined
+       SSE reg23 (%xmm2): undefined
+       SSE reg24 (%xmm3): undefined
+       SSE reg25 (%xmm4): undefined
+       SSE reg26 (%xmm5): undefined
+       SSE reg27 (%xmm6): undefined
+       SSE reg28 (%xmm7): undefined
+       MMX reg29 (%mm0): undefined
+       MMX reg30 (%mm1): undefined
+       MMX reg31 (%mm2): undefined
+       MMX reg32 (%mm3): undefined
+       MMX reg33 (%mm4): undefined
+       MMX reg34 (%mm5): undefined
+       MMX reg35 (%mm6): undefined
+       MMX reg36 (%mm7): undefined
+       FPU-control reg37 (%fctrl): undefined
+       FPU-control reg38 (%fstat): undefined
+       FPU-control reg39 (%mxcsr): undefined
+       segment reg40 (%es): same_value
+       segment reg41 (%cs): same_value
+       segment reg42 (%ss): same_value
+       segment reg43 (%ds): same_value
+       segment reg44 (%fs): same_value
+       segment reg45 (%gs): same_value
+.debug_frame has 0x80489b8 => [0x80489b8, 0x80489b9):
+       return address in reg8
+       CFA location expression: bregx(4,4)
+       integer reg0 (%eax): undefined
+       integer reg1 (%ecx): undefined
+       integer reg2 (%edx): undefined
+       integer reg3 (%ebx): same_value
+       integer reg4 (%esp): location expression: call_frame_cfa stack_value
+       integer reg5 (%ebp): same_value
+       integer reg6 (%esi): same_value
+       integer reg7 (%edi): same_value
+       integer reg8 (%eip): location expression: call_frame_cfa plus_uconst(-4)
+       integer reg9 (%eflags): undefined
+       integer reg10 (%trapno): undefined
+       x87 reg11 (%st0): undefined
+       x87 reg12 (%st1): undefined
+       x87 reg13 (%st2): undefined
+       x87 reg14 (%st3): undefined
+       x87 reg15 (%st4): undefined
+       x87 reg16 (%st5): undefined
+       x87 reg17 (%st6): undefined
+       x87 reg18 (%st7): undefined
+       SSE reg21 (%xmm0): undefined
+       SSE reg22 (%xmm1): undefined
+       SSE reg23 (%xmm2): undefined
+       SSE reg24 (%xmm3): undefined
+       SSE reg25 (%xmm4): undefined
+       SSE reg26 (%xmm5): undefined
+       SSE reg27 (%xmm6): undefined
+       SSE reg28 (%xmm7): undefined
+       MMX reg29 (%mm0): undefined
+       MMX reg30 (%mm1): undefined
+       MMX reg31 (%mm2): undefined
+       MMX reg32 (%mm3): undefined
+       MMX reg33 (%mm4): undefined
+       MMX reg34 (%mm5): undefined
+       MMX reg35 (%mm6): undefined
+       MMX reg36 (%mm7): undefined
+       FPU-control reg37 (%fctrl): undefined
+       FPU-control reg38 (%fstat): undefined
+       FPU-control reg39 (%mxcsr): undefined
+       segment reg40 (%es): same_value
+       segment reg41 (%cs): same_value
+       segment reg42 (%ss): same_value
+       segment reg43 (%ds): same_value
+       segment reg44 (%fs): same_value
+       segment reg45 (%gs): same_value
+EOF
+
+# EM_X86_64 (function foo 0x00000000000009d0)
+testfiles testfile12
+testrun_compare ${abs_builddir}/addrcfi -e testfile12 0x00000000000009d0 <<\EOF
+.eh_frame has 0x9d0 => [0x9d0, 0x9d1):
+       return address in reg16
+       CFA location expression: bregx(7,8)
+       integer reg0 (%rax): same_value
+       integer reg1 (%rdx): undefined
+       integer reg2 (%rcx): undefined
+       integer reg3 (%rbx): undefined
+       integer reg4 (%rsi): undefined
+       integer reg5 (%rdi): undefined
+       integer reg6 (%rbp): same_value
+       integer reg7 (%rsp): location expression: call_frame_cfa stack_value
+       integer reg8 (%r8): undefined
+       integer reg9 (%r9): undefined
+       integer reg10 (%r10): undefined
+       integer reg11 (%r11): undefined
+       integer reg12 (%r12): same_value
+       integer reg13 (%r13): same_value
+       integer reg14 (%r14): same_value
+       integer reg15 (%r15): same_value
+       integer reg16 (%rip): location expression: call_frame_cfa plus_uconst(-8)
+       SSE reg17 (%xmm0): undefined
+       SSE reg18 (%xmm1): undefined
+       SSE reg19 (%xmm2): undefined
+       SSE reg20 (%xmm3): undefined
+       SSE reg21 (%xmm4): undefined
+       SSE reg22 (%xmm5): undefined
+       SSE reg23 (%xmm6): undefined
+       SSE reg24 (%xmm7): undefined
+       SSE reg25 (%xmm8): undefined
+       SSE reg26 (%xmm9): undefined
+       SSE reg27 (%xmm10): undefined
+       SSE reg28 (%xmm11): undefined
+       SSE reg29 (%xmm12): undefined
+       SSE reg30 (%xmm13): undefined
+       SSE reg31 (%xmm14): undefined
+       SSE reg32 (%xmm15): undefined
+       x87 reg33 (%st0): undefined
+       x87 reg34 (%st1): undefined
+       x87 reg35 (%st2): undefined
+       x87 reg36 (%st3): undefined
+       x87 reg37 (%st4): undefined
+       x87 reg38 (%st5): undefined
+       x87 reg39 (%st6): undefined
+       x87 reg40 (%st7): undefined
+       MMX reg41 (%mm0): undefined
+       MMX reg42 (%mm1): undefined
+       MMX reg43 (%mm2): undefined
+       MMX reg44 (%mm3): undefined
+       MMX reg45 (%mm4): undefined
+       MMX reg46 (%mm5): undefined
+       MMX reg47 (%mm6): undefined
+       MMX reg48 (%mm7): undefined
+       integer reg49 (%rflags): undefined
+       segment reg50 (%es): undefined
+       segment reg51 (%cs): undefined
+       segment reg52 (%ss): undefined
+       segment reg53 (%ds): undefined
+       segment reg54 (%fs): undefined
+       segment reg55 (%gs): undefined
+       segment reg58 (%fs.base): undefined
+       segment reg59 (%gs.base): undefined
+       control reg62 (%tr): undefined
+       control reg63 (%ldtr): undefined
+       control reg64 (%mxcsr): undefined
+       control reg65 (%fcw): undefined
+       control reg66 (%fsw): undefined
+.debug_frame has 0x9d0 => [0x9d0, 0x9d1):
+       return address in reg16
+       CFA location expression: bregx(7,8)
+       integer reg0 (%rax): same_value
+       integer reg1 (%rdx): undefined
+       integer reg2 (%rcx): undefined
+       integer reg3 (%rbx): undefined
+       integer reg4 (%rsi): undefined
+       integer reg5 (%rdi): undefined
+       integer reg6 (%rbp): same_value
+       integer reg7 (%rsp): location expression: call_frame_cfa stack_value
+       integer reg8 (%r8): undefined
+       integer reg9 (%r9): undefined
+       integer reg10 (%r10): undefined
+       integer reg11 (%r11): undefined
+       integer reg12 (%r12): same_value
+       integer reg13 (%r13): same_value
+       integer reg14 (%r14): same_value
+       integer reg15 (%r15): same_value
+       integer reg16 (%rip): location expression: call_frame_cfa plus_uconst(-8)
+       SSE reg17 (%xmm0): undefined
+       SSE reg18 (%xmm1): undefined
+       SSE reg19 (%xmm2): undefined
+       SSE reg20 (%xmm3): undefined
+       SSE reg21 (%xmm4): undefined
+       SSE reg22 (%xmm5): undefined
+       SSE reg23 (%xmm6): undefined
+       SSE reg24 (%xmm7): undefined
+       SSE reg25 (%xmm8): undefined
+       SSE reg26 (%xmm9): undefined
+       SSE reg27 (%xmm10): undefined
+       SSE reg28 (%xmm11): undefined
+       SSE reg29 (%xmm12): undefined
+       SSE reg30 (%xmm13): undefined
+       SSE reg31 (%xmm14): undefined
+       SSE reg32 (%xmm15): undefined
+       x87 reg33 (%st0): undefined
+       x87 reg34 (%st1): undefined
+       x87 reg35 (%st2): undefined
+       x87 reg36 (%st3): undefined
+       x87 reg37 (%st4): undefined
+       x87 reg38 (%st5): undefined
+       x87 reg39 (%st6): undefined
+       x87 reg40 (%st7): undefined
+       MMX reg41 (%mm0): undefined
+       MMX reg42 (%mm1): undefined
+       MMX reg43 (%mm2): undefined
+       MMX reg44 (%mm3): undefined
+       MMX reg45 (%mm4): undefined
+       MMX reg46 (%mm5): undefined
+       MMX reg47 (%mm6): undefined
+       MMX reg48 (%mm7): undefined
+       integer reg49 (%rflags): undefined
+       segment reg50 (%es): undefined
+       segment reg51 (%cs): undefined
+       segment reg52 (%ss): undefined
+       segment reg53 (%ds): undefined
+       segment reg54 (%fs): undefined
+       segment reg55 (%gs): undefined
+       segment reg58 (%fs.base): undefined
+       segment reg59 (%gs.base): undefined
+       control reg62 (%tr): undefined
+       control reg63 (%ldtr): undefined
+       control reg64 (%mxcsr): undefined
+       control reg65 (%fcw): undefined
+       control reg66 (%fsw): undefined
+EOF
+
+# EM_PPC (function bar 0x100004c0)
+# Note. Only in .debug_frame, not in .eh_frame.
+#
+# = bar.c =
+#
+# static int b1 = 1;
+# int b2 = 1;
+#
+# static int
+# foo (int a)
+# {
+#   return a + b2;
+# }
+#
+# int bar (int b)
+# {
+#   return b - foo (b - b1);
+# }
+#
+# = foo.c =
+#
+# extern int bar (int b);
+# extern int b2;
+#
+# int
+# main (int argc, char ** argv)
+# {
+#   return bar (argc + b2);
+# }
+#
+# gcc -g -O2 -m32 -c foo.c
+# gcc -g -O2 -m32 -c bar.c
+# gcc -g -O2 m32 -o testfileppc32 foo.o bar.o
+testfiles testfileppc32
+testrun_compare ${abs_builddir}/addrcfi -e testfileppc32 0x100004c0 <<\EOF
+dwarf_cfi_addrframe (.eh_frame): no matching address range
+.debug_frame has 0x100004c0 => [0x100004c0, 0x100004d0):
+       return address in reg65
+       CFA location expression: bregx(1)
+       integer reg0 (r0): undefined
+       integer reg1 (r1): location expression: call_frame_cfa stack_value
+       integer reg2 (r2): same_value
+       integer reg3 (r3): undefined
+       integer reg4 (r4): undefined
+       integer reg5 (r5): undefined
+       integer reg6 (r6): undefined
+       integer reg7 (r7): undefined
+       integer reg8 (r8): undefined
+       integer reg9 (r9): undefined
+       integer reg10 (r10): undefined
+       integer reg11 (r11): undefined
+       integer reg12 (r12): undefined
+       integer reg13 (r13): same_value
+       integer reg14 (r14): same_value
+       integer reg15 (r15): same_value
+       integer reg16 (r16): same_value
+       integer reg17 (r17): same_value
+       integer reg18 (r18): same_value
+       integer reg19 (r19): same_value
+       integer reg20 (r20): same_value
+       integer reg21 (r21): same_value
+       integer reg22 (r22): same_value
+       integer reg23 (r23): same_value
+       integer reg24 (r24): same_value
+       integer reg25 (r25): same_value
+       integer reg26 (r26): same_value
+       integer reg27 (r27): same_value
+       integer reg28 (r28): same_value
+       integer reg29 (r29): same_value
+       integer reg30 (r30): same_value
+       integer reg31 (r31): same_value
+       FPU reg32 (f0): undefined
+       FPU reg33 (f1): undefined
+       FPU reg34 (f2): undefined
+       FPU reg35 (f3): undefined
+       FPU reg36 (f4): undefined
+       FPU reg37 (f5): undefined
+       FPU reg38 (f6): undefined
+       FPU reg39 (f7): undefined
+       FPU reg40 (f8): undefined
+       FPU reg41 (f9): undefined
+       FPU reg42 (f10): undefined
+       FPU reg43 (f11): undefined
+       FPU reg44 (f12): undefined
+       FPU reg45 (f13): undefined
+       FPU reg46 (f14): undefined
+       FPU reg47 (f15): undefined
+       FPU reg48 (f16): undefined
+       FPU reg49 (f17): undefined
+       FPU reg50 (f18): undefined
+       FPU reg51 (f19): undefined
+       FPU reg52 (f20): undefined
+       FPU reg53 (f21): undefined
+       FPU reg54 (f22): undefined
+       FPU reg55 (f23): undefined
+       FPU reg56 (f24): undefined
+       FPU reg57 (f25): undefined
+       FPU reg58 (f26): undefined
+       FPU reg59 (f27): undefined
+       FPU reg60 (f28): undefined
+       FPU reg61 (f29): undefined
+       FPU reg62 (f30): undefined
+       FPU reg63 (f31): undefined
+       integer reg64 (cr): undefined
+       FPU reg65 (fpscr): same_value
+       integer reg66 (msr): undefined
+       vector reg67 (vscr): undefined
+       privileged reg70 (sr0): undefined
+       privileged reg71 (sr1): undefined
+       privileged reg72 (sr2): undefined
+       privileged reg73 (sr3): undefined
+       privileged reg74 (sr4): undefined
+       privileged reg75 (sr5): undefined
+       privileged reg76 (sr6): undefined
+       privileged reg77 (sr7): undefined
+       privileged reg78 (sr8): undefined
+       privileged reg79 (sr9): undefined
+       privileged reg80 (sr10): undefined
+       privileged reg81 (sr11): undefined
+       privileged reg82 (sr12): undefined
+       privileged reg83 (sr13): undefined
+       privileged reg84 (sr14): undefined
+       privileged reg85 (sr15): undefined
+       privileged reg100 (mq): undefined
+       privileged reg101 (xer): undefined
+       privileged reg102 (spr2): undefined
+       privileged reg103 (spr3): undefined
+       privileged reg104 (spr4): undefined
+       privileged reg105 (spr5): undefined
+       privileged reg106 (spr6): undefined
+       privileged reg107 (spr7): undefined
+       privileged reg108 (lr): undefined
+       privileged reg109 (ctr): undefined
+       privileged reg110 (spr10): undefined
+       privileged reg111 (spr11): undefined
+       privileged reg112 (spr12): undefined
+       privileged reg113 (spr13): undefined
+       privileged reg114 (spr14): undefined
+       privileged reg115 (spr15): undefined
+       privileged reg116 (spr16): undefined
+       privileged reg117 (spr17): undefined
+       privileged reg118 (dsisr): undefined
+       privileged reg119 (dar): undefined
+       privileged reg120 (spr20): undefined
+       privileged reg121 (spr21): undefined
+       privileged reg122 (dec): undefined
+       privileged reg123 (spr23): undefined
+       privileged reg124 (spr24): undefined
+       privileged reg125 (spr25): undefined
+       privileged reg126 (spr26): undefined
+       privileged reg127 (spr27): undefined
+       privileged reg128 (spr28): undefined
+       privileged reg129 (spr29): undefined
+       privileged reg130 (spr30): undefined
+       privileged reg131 (spr31): undefined
+       privileged reg132 (spr32): undefined
+       privileged reg133 (spr33): undefined
+       privileged reg134 (spr34): undefined
+       privileged reg135 (spr35): undefined
+       privileged reg136 (spr36): undefined
+       privileged reg137 (spr37): undefined
+       privileged reg138 (spr38): undefined
+       privileged reg139 (spr39): undefined
+       privileged reg140 (spr40): undefined
+       privileged reg141 (spr41): undefined
+       privileged reg142 (spr42): undefined
+       privileged reg143 (spr43): undefined
+       privileged reg144 (spr44): undefined
+       privileged reg145 (spr45): undefined
+       privileged reg146 (spr46): undefined
+       privileged reg147 (spr47): undefined
+       privileged reg148 (spr48): undefined
+       privileged reg149 (spr49): undefined
+       privileged reg150 (spr50): undefined
+       privileged reg151 (spr51): undefined
+       privileged reg152 (spr52): undefined
+       privileged reg153 (spr53): undefined
+       privileged reg154 (spr54): undefined
+       privileged reg155 (spr55): undefined
+       privileged reg156 (spr56): undefined
+       privileged reg157 (spr57): undefined
+       privileged reg158 (spr58): undefined
+       privileged reg159 (spr59): undefined
+       privileged reg160 (spr60): undefined
+       privileged reg161 (spr61): undefined
+       privileged reg162 (spr62): undefined
+       privileged reg163 (spr63): undefined
+       privileged reg164 (spr64): undefined
+       privileged reg165 (spr65): undefined
+       privileged reg166 (spr66): undefined
+       privileged reg167 (spr67): undefined
+       privileged reg168 (spr68): undefined
+       privileged reg169 (spr69): undefined
+       privileged reg170 (spr70): undefined
+       privileged reg171 (spr71): undefined
+       privileged reg172 (spr72): undefined
+       privileged reg173 (spr73): undefined
+       privileged reg174 (spr74): undefined
+       privileged reg175 (spr75): undefined
+       privileged reg176 (spr76): undefined
+       privileged reg177 (spr77): undefined
+       privileged reg178 (spr78): undefined
+       privileged reg179 (spr79): undefined
+       privileged reg180 (spr80): undefined
+       privileged reg181 (spr81): undefined
+       privileged reg182 (spr82): undefined
+       privileged reg183 (spr83): undefined
+       privileged reg184 (spr84): undefined
+       privileged reg185 (spr85): undefined
+       privileged reg186 (spr86): undefined
+       privileged reg187 (spr87): undefined
+       privileged reg188 (spr88): undefined
+       privileged reg189 (spr89): undefined
+       privileged reg190 (spr90): undefined
+       privileged reg191 (spr91): undefined
+       privileged reg192 (spr92): undefined
+       privileged reg193 (spr93): undefined
+       privileged reg194 (spr94): undefined
+       privileged reg195 (spr95): undefined
+       privileged reg196 (spr96): undefined
+       privileged reg197 (spr97): undefined
+       privileged reg198 (spr98): undefined
+       privileged reg199 (spr99): undefined
+       privileged reg200 (spr100): undefined
+       privileged reg201 (spr101): undefined
+       privileged reg202 (spr102): undefined
+       privileged reg203 (spr103): undefined
+       privileged reg204 (spr104): undefined
+       privileged reg205 (spr105): undefined
+       privileged reg206 (spr106): undefined
+       privileged reg207 (spr107): undefined
+       privileged reg208 (spr108): undefined
+       privileged reg209 (spr109): undefined
+       privileged reg210 (spr110): undefined
+       privileged reg211 (spr111): undefined
+       privileged reg212 (spr112): undefined
+       privileged reg213 (spr113): undefined
+       privileged reg214 (spr114): undefined
+       privileged reg215 (spr115): undefined
+       privileged reg216 (spr116): undefined
+       privileged reg217 (spr117): undefined
+       privileged reg218 (spr118): undefined
+       privileged reg219 (spr119): undefined
+       privileged reg220 (spr120): undefined
+       privileged reg221 (spr121): undefined
+       privileged reg222 (spr122): undefined
+       privileged reg223 (spr123): undefined
+       privileged reg224 (spr124): undefined
+       privileged reg225 (spr125): undefined
+       privileged reg226 (spr126): undefined
+       privileged reg227 (spr127): undefined
+       privileged reg228 (spr128): undefined
+       privileged reg229 (spr129): undefined
+       privileged reg230 (spr130): undefined
+       privileged reg231 (spr131): undefined
+       privileged reg232 (spr132): undefined
+       privileged reg233 (spr133): undefined
+       privileged reg234 (spr134): undefined
+       privileged reg235 (spr135): undefined
+       privileged reg236 (spr136): undefined
+       privileged reg237 (spr137): undefined
+       privileged reg238 (spr138): undefined
+       privileged reg239 (spr139): undefined
+       privileged reg240 (spr140): undefined
+       privileged reg241 (spr141): undefined
+       privileged reg242 (spr142): undefined
+       privileged reg243 (spr143): undefined
+       privileged reg244 (spr144): undefined
+       privileged reg245 (spr145): undefined
+       privileged reg246 (spr146): undefined
+       privileged reg247 (spr147): undefined
+       privileged reg248 (spr148): undefined
+       privileged reg249 (spr149): undefined
+       privileged reg250 (spr150): undefined
+       privileged reg251 (spr151): undefined
+       privileged reg252 (spr152): undefined
+       privileged reg253 (spr153): undefined
+       privileged reg254 (spr154): undefined
+       privileged reg255 (spr155): undefined
+       privileged reg256 (spr156): undefined
+       privileged reg257 (spr157): undefined
+       privileged reg258 (spr158): undefined
+       privileged reg259 (spr159): undefined
+       privileged reg260 (spr160): undefined
+       privileged reg261 (spr161): undefined
+       privileged reg262 (spr162): undefined
+       privileged reg263 (spr163): undefined
+       privileged reg264 (spr164): undefined
+       privileged reg265 (spr165): undefined
+       privileged reg266 (spr166): undefined
+       privileged reg267 (spr167): undefined
+       privileged reg268 (spr168): undefined
+       privileged reg269 (spr169): undefined
+       privileged reg270 (spr170): undefined
+       privileged reg271 (spr171): undefined
+       privileged reg272 (spr172): undefined
+       privileged reg273 (spr173): undefined
+       privileged reg274 (spr174): undefined
+       privileged reg275 (spr175): undefined
+       privileged reg276 (spr176): undefined
+       privileged reg277 (spr177): undefined
+       privileged reg278 (spr178): undefined
+       privileged reg279 (spr179): undefined
+       privileged reg280 (spr180): undefined
+       privileged reg281 (spr181): undefined
+       privileged reg282 (spr182): undefined
+       privileged reg283 (spr183): undefined
+       privileged reg284 (spr184): undefined
+       privileged reg285 (spr185): undefined
+       privileged reg286 (spr186): undefined
+       privileged reg287 (spr187): undefined
+       privileged reg288 (spr188): undefined
+       privileged reg289 (spr189): undefined
+       privileged reg290 (spr190): undefined
+       privileged reg291 (spr191): undefined
+       privileged reg292 (spr192): undefined
+       privileged reg293 (spr193): undefined
+       privileged reg294 (spr194): undefined
+       privileged reg295 (spr195): undefined
+       privileged reg296 (spr196): undefined
+       privileged reg297 (spr197): undefined
+       privileged reg298 (spr198): undefined
+       privileged reg299 (spr199): undefined
+       privileged reg300 (spr200): undefined
+       privileged reg301 (spr201): undefined
+       privileged reg302 (spr202): undefined
+       privileged reg303 (spr203): undefined
+       privileged reg304 (spr204): undefined
+       privileged reg305 (spr205): undefined
+       privileged reg306 (spr206): undefined
+       privileged reg307 (spr207): undefined
+       privileged reg308 (spr208): undefined
+       privileged reg309 (spr209): undefined
+       privileged reg310 (spr210): undefined
+       privileged reg311 (spr211): undefined
+       privileged reg312 (spr212): undefined
+       privileged reg313 (spr213): undefined
+       privileged reg314 (spr214): undefined
+       privileged reg315 (spr215): undefined
+       privileged reg316 (spr216): undefined
+       privileged reg317 (spr217): undefined
+       privileged reg318 (spr218): undefined
+       privileged reg319 (spr219): undefined
+       privileged reg320 (spr220): undefined
+       privileged reg321 (spr221): undefined
+       privileged reg322 (spr222): undefined
+       privileged reg323 (spr223): undefined
+       privileged reg324 (spr224): undefined
+       privileged reg325 (spr225): undefined
+       privileged reg326 (spr226): undefined
+       privileged reg327 (spr227): undefined
+       privileged reg328 (spr228): undefined
+       privileged reg329 (spr229): undefined
+       privileged reg330 (spr230): undefined
+       privileged reg331 (spr231): undefined
+       privileged reg332 (spr232): undefined
+       privileged reg333 (spr233): undefined
+       privileged reg334 (spr234): undefined
+       privileged reg335 (spr235): undefined
+       privileged reg336 (spr236): undefined
+       privileged reg337 (spr237): undefined
+       privileged reg338 (spr238): undefined
+       privileged reg339 (spr239): undefined
+       privileged reg340 (spr240): undefined
+       privileged reg341 (spr241): undefined
+       privileged reg342 (spr242): undefined
+       privileged reg343 (spr243): undefined
+       privileged reg344 (spr244): undefined
+       privileged reg345 (spr245): undefined
+       privileged reg346 (spr246): undefined
+       privileged reg347 (spr247): undefined
+       privileged reg348 (spr248): undefined
+       privileged reg349 (spr249): undefined
+       privileged reg350 (spr250): undefined
+       privileged reg351 (spr251): undefined
+       privileged reg352 (spr252): undefined
+       privileged reg353 (spr253): undefined
+       privileged reg354 (spr254): undefined
+       privileged reg355 (spr255): undefined
+       vector reg356 (vrsave): undefined
+       privileged reg357 (spr257): undefined
+       privileged reg358 (spr258): undefined
+       privileged reg359 (spr259): undefined
+       privileged reg360 (spr260): undefined
+       privileged reg361 (spr261): undefined
+       privileged reg362 (spr262): undefined
+       privileged reg363 (spr263): undefined
+       privileged reg364 (spr264): undefined
+       privileged reg365 (spr265): undefined
+       privileged reg366 (spr266): undefined
+       privileged reg367 (spr267): undefined
+       privileged reg368 (spr268): undefined
+       privileged reg369 (spr269): undefined
+       privileged reg370 (spr270): undefined
+       privileged reg371 (spr271): undefined
+       privileged reg372 (spr272): undefined
+       privileged reg373 (spr273): undefined
+       privileged reg374 (spr274): undefined
+       privileged reg375 (spr275): undefined
+       privileged reg376 (spr276): undefined
+       privileged reg377 (spr277): undefined
+       privileged reg378 (spr278): undefined
+       privileged reg379 (spr279): undefined
+       privileged reg380 (spr280): undefined
+       privileged reg381 (spr281): undefined
+       privileged reg382 (spr282): undefined
+       privileged reg383 (spr283): undefined
+       privileged reg384 (spr284): undefined
+       privileged reg385 (spr285): undefined
+       privileged reg386 (spr286): undefined
+       privileged reg387 (spr287): undefined
+       privileged reg388 (spr288): undefined
+       privileged reg389 (spr289): undefined
+       privileged reg390 (spr290): undefined
+       privileged reg391 (spr291): undefined
+       privileged reg392 (spr292): undefined
+       privileged reg393 (spr293): undefined
+       privileged reg394 (spr294): undefined
+       privileged reg395 (spr295): undefined
+       privileged reg396 (spr296): undefined
+       privileged reg397 (spr297): undefined
+       privileged reg398 (spr298): undefined
+       privileged reg399 (spr299): undefined
+       privileged reg400 (spr300): undefined
+       privileged reg401 (spr301): undefined
+       privileged reg402 (spr302): undefined
+       privileged reg403 (spr303): undefined
+       privileged reg404 (spr304): undefined
+       privileged reg405 (spr305): undefined
+       privileged reg406 (spr306): undefined
+       privileged reg407 (spr307): undefined
+       privileged reg408 (spr308): undefined
+       privileged reg409 (spr309): undefined
+       privileged reg410 (spr310): undefined
+       privileged reg411 (spr311): undefined
+       privileged reg412 (spr312): undefined
+       privileged reg413 (spr313): undefined
+       privileged reg414 (spr314): undefined
+       privileged reg415 (spr315): undefined
+       privileged reg416 (spr316): undefined
+       privileged reg417 (spr317): undefined
+       privileged reg418 (spr318): undefined
+       privileged reg419 (spr319): undefined
+       privileged reg420 (spr320): undefined
+       privileged reg421 (spr321): undefined
+       privileged reg422 (spr322): undefined
+       privileged reg423 (spr323): undefined
+       privileged reg424 (spr324): undefined
+       privileged reg425 (spr325): undefined
+       privileged reg426 (spr326): undefined
+       privileged reg427 (spr327): undefined
+       privileged reg428 (spr328): undefined
+       privileged reg429 (spr329): undefined
+       privileged reg430 (spr330): undefined
+       privileged reg431 (spr331): undefined
+       privileged reg432 (spr332): undefined
+       privileged reg433 (spr333): undefined
+       privileged reg434 (spr334): undefined
+       privileged reg435 (spr335): undefined
+       privileged reg436 (spr336): undefined
+       privileged reg437 (spr337): undefined
+       privileged reg438 (spr338): undefined
+       privileged reg439 (spr339): undefined
+       privileged reg440 (spr340): undefined
+       privileged reg441 (spr341): undefined
+       privileged reg442 (spr342): undefined
+       privileged reg443 (spr343): undefined
+       privileged reg444 (spr344): undefined
+       privileged reg445 (spr345): undefined
+       privileged reg446 (spr346): undefined
+       privileged reg447 (spr347): undefined
+       privileged reg448 (spr348): undefined
+       privileged reg449 (spr349): undefined
+       privileged reg450 (spr350): undefined
+       privileged reg451 (spr351): undefined
+       privileged reg452 (spr352): undefined
+       privileged reg453 (spr353): undefined
+       privileged reg454 (spr354): undefined
+       privileged reg455 (spr355): undefined
+       privileged reg456 (spr356): undefined
+       privileged reg457 (spr357): undefined
+       privileged reg458 (spr358): undefined
+       privileged reg459 (spr359): undefined
+       privileged reg460 (spr360): undefined
+       privileged reg461 (spr361): undefined
+       privileged reg462 (spr362): undefined
+       privileged reg463 (spr363): undefined
+       privileged reg464 (spr364): undefined
+       privileged reg465 (spr365): undefined
+       privileged reg466 (spr366): undefined
+       privileged reg467 (spr367): undefined
+       privileged reg468 (spr368): undefined
+       privileged reg469 (spr369): undefined
+       privileged reg470 (spr370): undefined
+       privileged reg471 (spr371): undefined
+       privileged reg472 (spr372): undefined
+       privileged reg473 (spr373): undefined
+       privileged reg474 (spr374): undefined
+       privileged reg475 (spr375): undefined
+       privileged reg476 (spr376): undefined
+       privileged reg477 (spr377): undefined
+       privileged reg478 (spr378): undefined
+       privileged reg479 (spr379): undefined
+       privileged reg480 (spr380): undefined
+       privileged reg481 (spr381): undefined
+       privileged reg482 (spr382): undefined
+       privileged reg483 (spr383): undefined
+       privileged reg484 (spr384): undefined
+       privileged reg485 (spr385): undefined
+       privileged reg486 (spr386): undefined
+       privileged reg487 (spr387): undefined
+       privileged reg488 (spr388): undefined
+       privileged reg489 (spr389): undefined
+       privileged reg490 (spr390): undefined
+       privileged reg491 (spr391): undefined
+       privileged reg492 (spr392): undefined
+       privileged reg493 (spr393): undefined
+       privileged reg494 (spr394): undefined
+       privileged reg495 (spr395): undefined
+       privileged reg496 (spr396): undefined
+       privileged reg497 (spr397): undefined
+       privileged reg498 (spr398): undefined
+       privileged reg499 (spr399): undefined
+       privileged reg500 (spr400): undefined
+       privileged reg501 (spr401): undefined
+       privileged reg502 (spr402): undefined
+       privileged reg503 (spr403): undefined
+       privileged reg504 (spr404): undefined
+       privileged reg505 (spr405): undefined
+       privileged reg506 (spr406): undefined
+       privileged reg507 (spr407): undefined
+       privileged reg508 (spr408): undefined
+       privileged reg509 (spr409): undefined
+       privileged reg510 (spr410): undefined
+       privileged reg511 (spr411): undefined
+       privileged reg512 (spr412): undefined
+       privileged reg513 (spr413): undefined
+       privileged reg514 (spr414): undefined
+       privileged reg515 (spr415): undefined
+       privileged reg516 (spr416): undefined
+       privileged reg517 (spr417): undefined
+       privileged reg518 (spr418): undefined
+       privileged reg519 (spr419): undefined
+       privileged reg520 (spr420): undefined
+       privileged reg521 (spr421): undefined
+       privileged reg522 (spr422): undefined
+       privileged reg523 (spr423): undefined
+       privileged reg524 (spr424): undefined
+       privileged reg525 (spr425): undefined
+       privileged reg526 (spr426): undefined
+       privileged reg527 (spr427): undefined
+       privileged reg528 (spr428): undefined
+       privileged reg529 (spr429): undefined
+       privileged reg530 (spr430): undefined
+       privileged reg531 (spr431): undefined
+       privileged reg532 (spr432): undefined
+       privileged reg533 (spr433): undefined
+       privileged reg534 (spr434): undefined
+       privileged reg535 (spr435): undefined
+       privileged reg536 (spr436): undefined
+       privileged reg537 (spr437): undefined
+       privileged reg538 (spr438): undefined
+       privileged reg539 (spr439): undefined
+       privileged reg540 (spr440): undefined
+       privileged reg541 (spr441): undefined
+       privileged reg542 (spr442): undefined
+       privileged reg543 (spr443): undefined
+       privileged reg544 (spr444): undefined
+       privileged reg545 (spr445): undefined
+       privileged reg546 (spr446): undefined
+       privileged reg547 (spr447): undefined
+       privileged reg548 (spr448): undefined
+       privileged reg549 (spr449): undefined
+       privileged reg550 (spr450): undefined
+       privileged reg551 (spr451): undefined
+       privileged reg552 (spr452): undefined
+       privileged reg553 (spr453): undefined
+       privileged reg554 (spr454): undefined
+       privileged reg555 (spr455): undefined
+       privileged reg556 (spr456): undefined
+       privileged reg557 (spr457): undefined
+       privileged reg558 (spr458): undefined
+       privileged reg559 (spr459): undefined
+       privileged reg560 (spr460): undefined
+       privileged reg561 (spr461): undefined
+       privileged reg562 (spr462): undefined
+       privileged reg563 (spr463): undefined
+       privileged reg564 (spr464): undefined
+       privileged reg565 (spr465): undefined
+       privileged reg566 (spr466): undefined
+       privileged reg567 (spr467): undefined
+       privileged reg568 (spr468): undefined
+       privileged reg569 (spr469): undefined
+       privileged reg570 (spr470): undefined
+       privileged reg571 (spr471): undefined
+       privileged reg572 (spr472): undefined
+       privileged reg573 (spr473): undefined
+       privileged reg574 (spr474): undefined
+       privileged reg575 (spr475): undefined
+       privileged reg576 (spr476): undefined
+       privileged reg577 (spr477): undefined
+       privileged reg578 (spr478): undefined
+       privileged reg579 (spr479): undefined
+       privileged reg580 (spr480): undefined
+       privileged reg581 (spr481): undefined
+       privileged reg582 (spr482): undefined
+       privileged reg583 (spr483): undefined
+       privileged reg584 (spr484): undefined
+       privileged reg585 (spr485): undefined
+       privileged reg586 (spr486): undefined
+       privileged reg587 (spr487): undefined
+       privileged reg588 (spr488): undefined
+       privileged reg589 (spr489): undefined
+       privileged reg590 (spr490): undefined
+       privileged reg591 (spr491): undefined
+       privileged reg592 (spr492): undefined
+       privileged reg593 (spr493): undefined
+       privileged reg594 (spr494): undefined
+       privileged reg595 (spr495): undefined
+       privileged reg596 (spr496): undefined
+       privileged reg597 (spr497): undefined
+       privileged reg598 (spr498): undefined
+       privileged reg599 (spr499): undefined
+       privileged reg600 (spr500): undefined
+       privileged reg601 (spr501): undefined
+       privileged reg602 (spr502): undefined
+       privileged reg603 (spr503): undefined
+       privileged reg604 (spr504): undefined
+       privileged reg605 (spr505): undefined
+       privileged reg606 (spr506): undefined
+       privileged reg607 (spr507): undefined
+       privileged reg608 (spr508): undefined
+       privileged reg609 (spr509): undefined
+       privileged reg610 (spr510): undefined
+       privileged reg611 (spr511): undefined
+       vector reg612 (spefscr): undefined
+       privileged reg613 (spr513): undefined
+       privileged reg614 (spr514): undefined
+       privileged reg615 (spr515): undefined
+       privileged reg616 (spr516): undefined
+       privileged reg617 (spr517): undefined
+       privileged reg618 (spr518): undefined
+       privileged reg619 (spr519): undefined
+       privileged reg620 (spr520): undefined
+       privileged reg621 (spr521): undefined
+       privileged reg622 (spr522): undefined
+       privileged reg623 (spr523): undefined
+       privileged reg624 (spr524): undefined
+       privileged reg625 (spr525): undefined
+       privileged reg626 (spr526): undefined
+       privileged reg627 (spr527): undefined
+       privileged reg628 (spr528): undefined
+       privileged reg629 (spr529): undefined
+       privileged reg630 (spr530): undefined
+       privileged reg631 (spr531): undefined
+       privileged reg632 (spr532): undefined
+       privileged reg633 (spr533): undefined
+       privileged reg634 (spr534): undefined
+       privileged reg635 (spr535): undefined
+       privileged reg636 (spr536): undefined
+       privileged reg637 (spr537): undefined
+       privileged reg638 (spr538): undefined
+       privileged reg639 (spr539): undefined
+       privileged reg640 (spr540): undefined
+       privileged reg641 (spr541): undefined
+       privileged reg642 (spr542): undefined
+       privileged reg643 (spr543): undefined
+       privileged reg644 (spr544): undefined
+       privileged reg645 (spr545): undefined
+       privileged reg646 (spr546): undefined
+       privileged reg647 (spr547): undefined
+       privileged reg648 (spr548): undefined
+       privileged reg649 (spr549): undefined
+       privileged reg650 (spr550): undefined
+       privileged reg651 (spr551): undefined
+       privileged reg652 (spr552): undefined
+       privileged reg653 (spr553): undefined
+       privileged reg654 (spr554): undefined
+       privileged reg655 (spr555): undefined
+       privileged reg656 (spr556): undefined
+       privileged reg657 (spr557): undefined
+       privileged reg658 (spr558): undefined
+       privileged reg659 (spr559): undefined
+       privileged reg660 (spr560): undefined
+       privileged reg661 (spr561): undefined
+       privileged reg662 (spr562): undefined
+       privileged reg663 (spr563): undefined
+       privileged reg664 (spr564): undefined
+       privileged reg665 (spr565): undefined
+       privileged reg666 (spr566): undefined
+       privileged reg667 (spr567): undefined
+       privileged reg668 (spr568): undefined
+       privileged reg669 (spr569): undefined
+       privileged reg670 (spr570): undefined
+       privileged reg671 (spr571): undefined
+       privileged reg672 (spr572): undefined
+       privileged reg673 (spr573): undefined
+       privileged reg674 (spr574): undefined
+       privileged reg675 (spr575): undefined
+       privileged reg676 (spr576): undefined
+       privileged reg677 (spr577): undefined
+       privileged reg678 (spr578): undefined
+       privileged reg679 (spr579): undefined
+       privileged reg680 (spr580): undefined
+       privileged reg681 (spr581): undefined
+       privileged reg682 (spr582): undefined
+       privileged reg683 (spr583): undefined
+       privileged reg684 (spr584): undefined
+       privileged reg685 (spr585): undefined
+       privileged reg686 (spr586): undefined
+       privileged reg687 (spr587): undefined
+       privileged reg688 (spr588): undefined
+       privileged reg689 (spr589): undefined
+       privileged reg690 (spr590): undefined
+       privileged reg691 (spr591): undefined
+       privileged reg692 (spr592): undefined
+       privileged reg693 (spr593): undefined
+       privileged reg694 (spr594): undefined
+       privileged reg695 (spr595): undefined
+       privileged reg696 (spr596): undefined
+       privileged reg697 (spr597): undefined
+       privileged reg698 (spr598): undefined
+       privileged reg699 (spr599): undefined
+       privileged reg700 (spr600): undefined
+       privileged reg701 (spr601): undefined
+       privileged reg702 (spr602): undefined
+       privileged reg703 (spr603): undefined
+       privileged reg704 (spr604): undefined
+       privileged reg705 (spr605): undefined
+       privileged reg706 (spr606): undefined
+       privileged reg707 (spr607): undefined
+       privileged reg708 (spr608): undefined
+       privileged reg709 (spr609): undefined
+       privileged reg710 (spr610): undefined
+       privileged reg711 (spr611): undefined
+       privileged reg712 (spr612): undefined
+       privileged reg713 (spr613): undefined
+       privileged reg714 (spr614): undefined
+       privileged reg715 (spr615): undefined
+       privileged reg716 (spr616): undefined
+       privileged reg717 (spr617): undefined
+       privileged reg718 (spr618): undefined
+       privileged reg719 (spr619): undefined
+       privileged reg720 (spr620): undefined
+       privileged reg721 (spr621): undefined
+       privileged reg722 (spr622): undefined
+       privileged reg723 (spr623): undefined
+       privileged reg724 (spr624): undefined
+       privileged reg725 (spr625): undefined
+       privileged reg726 (spr626): undefined
+       privileged reg727 (spr627): undefined
+       privileged reg728 (spr628): undefined
+       privileged reg729 (spr629): undefined
+       privileged reg730 (spr630): undefined
+       privileged reg731 (spr631): undefined
+       privileged reg732 (spr632): undefined
+       privileged reg733 (spr633): undefined
+       privileged reg734 (spr634): undefined
+       privileged reg735 (spr635): undefined
+       privileged reg736 (spr636): undefined
+       privileged reg737 (spr637): undefined
+       privileged reg738 (spr638): undefined
+       privileged reg739 (spr639): undefined
+       privileged reg740 (spr640): undefined
+       privileged reg741 (spr641): undefined
+       privileged reg742 (spr642): undefined
+       privileged reg743 (spr643): undefined
+       privileged reg744 (spr644): undefined
+       privileged reg745 (spr645): undefined
+       privileged reg746 (spr646): undefined
+       privileged reg747 (spr647): undefined
+       privileged reg748 (spr648): undefined
+       privileged reg749 (spr649): undefined
+       privileged reg750 (spr650): undefined
+       privileged reg751 (spr651): undefined
+       privileged reg752 (spr652): undefined
+       privileged reg753 (spr653): undefined
+       privileged reg754 (spr654): undefined
+       privileged reg755 (spr655): undefined
+       privileged reg756 (spr656): undefined
+       privileged reg757 (spr657): undefined
+       privileged reg758 (spr658): undefined
+       privileged reg759 (spr659): undefined
+       privileged reg760 (spr660): undefined
+       privileged reg761 (spr661): undefined
+       privileged reg762 (spr662): undefined
+       privileged reg763 (spr663): undefined
+       privileged reg764 (spr664): undefined
+       privileged reg765 (spr665): undefined
+       privileged reg766 (spr666): undefined
+       privileged reg767 (spr667): undefined
+       privileged reg768 (spr668): undefined
+       privileged reg769 (spr669): undefined
+       privileged reg770 (spr670): undefined
+       privileged reg771 (spr671): undefined
+       privileged reg772 (spr672): undefined
+       privileged reg773 (spr673): undefined
+       privileged reg774 (spr674): undefined
+       privileged reg775 (spr675): undefined
+       privileged reg776 (spr676): undefined
+       privileged reg777 (spr677): undefined
+       privileged reg778 (spr678): undefined
+       privileged reg779 (spr679): undefined
+       privileged reg780 (spr680): undefined
+       privileged reg781 (spr681): undefined
+       privileged reg782 (spr682): undefined
+       privileged reg783 (spr683): undefined
+       privileged reg784 (spr684): undefined
+       privileged reg785 (spr685): undefined
+       privileged reg786 (spr686): undefined
+       privileged reg787 (spr687): undefined
+       privileged reg788 (spr688): undefined
+       privileged reg789 (spr689): undefined
+       privileged reg790 (spr690): undefined
+       privileged reg791 (spr691): undefined
+       privileged reg792 (spr692): undefined
+       privileged reg793 (spr693): undefined
+       privileged reg794 (spr694): undefined
+       privileged reg795 (spr695): undefined
+       privileged reg796 (spr696): undefined
+       privileged reg797 (spr697): undefined
+       privileged reg798 (spr698): undefined
+       privileged reg799 (spr699): undefined
+       privileged reg800 (spr700): undefined
+       privileged reg801 (spr701): undefined
+       privileged reg802 (spr702): undefined
+       privileged reg803 (spr703): undefined
+       privileged reg804 (spr704): undefined
+       privileged reg805 (spr705): undefined
+       privileged reg806 (spr706): undefined
+       privileged reg807 (spr707): undefined
+       privileged reg808 (spr708): undefined
+       privileged reg809 (spr709): undefined
+       privileged reg810 (spr710): undefined
+       privileged reg811 (spr711): undefined
+       privileged reg812 (spr712): undefined
+       privileged reg813 (spr713): undefined
+       privileged reg814 (spr714): undefined
+       privileged reg815 (spr715): undefined
+       privileged reg816 (spr716): undefined
+       privileged reg817 (spr717): undefined
+       privileged reg818 (spr718): undefined
+       privileged reg819 (spr719): undefined
+       privileged reg820 (spr720): undefined
+       privileged reg821 (spr721): undefined
+       privileged reg822 (spr722): undefined
+       privileged reg823 (spr723): undefined
+       privileged reg824 (spr724): undefined
+       privileged reg825 (spr725): undefined
+       privileged reg826 (spr726): undefined
+       privileged reg827 (spr727): undefined
+       privileged reg828 (spr728): undefined
+       privileged reg829 (spr729): undefined
+       privileged reg830 (spr730): undefined
+       privileged reg831 (spr731): undefined
+       privileged reg832 (spr732): undefined
+       privileged reg833 (spr733): undefined
+       privileged reg834 (spr734): undefined
+       privileged reg835 (spr735): undefined
+       privileged reg836 (spr736): undefined
+       privileged reg837 (spr737): undefined
+       privileged reg838 (spr738): undefined
+       privileged reg839 (spr739): undefined
+       privileged reg840 (spr740): undefined
+       privileged reg841 (spr741): undefined
+       privileged reg842 (spr742): undefined
+       privileged reg843 (spr743): undefined
+       privileged reg844 (spr744): undefined
+       privileged reg845 (spr745): undefined
+       privileged reg846 (spr746): undefined
+       privileged reg847 (spr747): undefined
+       privileged reg848 (spr748): undefined
+       privileged reg849 (spr749): undefined
+       privileged reg850 (spr750): undefined
+       privileged reg851 (spr751): undefined
+       privileged reg852 (spr752): undefined
+       privileged reg853 (spr753): undefined
+       privileged reg854 (spr754): undefined
+       privileged reg855 (spr755): undefined
+       privileged reg856 (spr756): undefined
+       privileged reg857 (spr757): undefined
+       privileged reg858 (spr758): undefined
+       privileged reg859 (spr759): undefined
+       privileged reg860 (spr760): undefined
+       privileged reg861 (spr761): undefined
+       privileged reg862 (spr762): undefined
+       privileged reg863 (spr763): undefined
+       privileged reg864 (spr764): undefined
+       privileged reg865 (spr765): undefined
+       privileged reg866 (spr766): undefined
+       privileged reg867 (spr767): undefined
+       privileged reg868 (spr768): undefined
+       privileged reg869 (spr769): undefined
+       privileged reg870 (spr770): undefined
+       privileged reg871 (spr771): undefined
+       privileged reg872 (spr772): undefined
+       privileged reg873 (spr773): undefined
+       privileged reg874 (spr774): undefined
+       privileged reg875 (spr775): undefined
+       privileged reg876 (spr776): undefined
+       privileged reg877 (spr777): undefined
+       privileged reg878 (spr778): undefined
+       privileged reg879 (spr779): undefined
+       privileged reg880 (spr780): undefined
+       privileged reg881 (spr781): undefined
+       privileged reg882 (spr782): undefined
+       privileged reg883 (spr783): undefined
+       privileged reg884 (spr784): undefined
+       privileged reg885 (spr785): undefined
+       privileged reg886 (spr786): undefined
+       privileged reg887 (spr787): undefined
+       privileged reg888 (spr788): undefined
+       privileged reg889 (spr789): undefined
+       privileged reg890 (spr790): undefined
+       privileged reg891 (spr791): undefined
+       privileged reg892 (spr792): undefined
+       privileged reg893 (spr793): undefined
+       privileged reg894 (spr794): undefined
+       privileged reg895 (spr795): undefined
+       privileged reg896 (spr796): undefined
+       privileged reg897 (spr797): undefined
+       privileged reg898 (spr798): undefined
+       privileged reg899 (spr799): undefined
+       privileged reg900 (spr800): undefined
+       privileged reg901 (spr801): undefined
+       privileged reg902 (spr802): undefined
+       privileged reg903 (spr803): undefined
+       privileged reg904 (spr804): undefined
+       privileged reg905 (spr805): undefined
+       privileged reg906 (spr806): undefined
+       privileged reg907 (spr807): undefined
+       privileged reg908 (spr808): undefined
+       privileged reg909 (spr809): undefined
+       privileged reg910 (spr810): undefined
+       privileged reg911 (spr811): undefined
+       privileged reg912 (spr812): undefined
+       privileged reg913 (spr813): undefined
+       privileged reg914 (spr814): undefined
+       privileged reg915 (spr815): undefined
+       privileged reg916 (spr816): undefined
+       privileged reg917 (spr817): undefined
+       privileged reg918 (spr818): undefined
+       privileged reg919 (spr819): undefined
+       privileged reg920 (spr820): undefined
+       privileged reg921 (spr821): undefined
+       privileged reg922 (spr822): undefined
+       privileged reg923 (spr823): undefined
+       privileged reg924 (spr824): undefined
+       privileged reg925 (spr825): undefined
+       privileged reg926 (spr826): undefined
+       privileged reg927 (spr827): undefined
+       privileged reg928 (spr828): undefined
+       privileged reg929 (spr829): undefined
+       privileged reg930 (spr830): undefined
+       privileged reg931 (spr831): undefined
+       privileged reg932 (spr832): undefined
+       privileged reg933 (spr833): undefined
+       privileged reg934 (spr834): undefined
+       privileged reg935 (spr835): undefined
+       privileged reg936 (spr836): undefined
+       privileged reg937 (spr837): undefined
+       privileged reg938 (spr838): undefined
+       privileged reg939 (spr839): undefined
+       privileged reg940 (spr840): undefined
+       privileged reg941 (spr841): undefined
+       privileged reg942 (spr842): undefined
+       privileged reg943 (spr843): undefined
+       privileged reg944 (spr844): undefined
+       privileged reg945 (spr845): undefined
+       privileged reg946 (spr846): undefined
+       privileged reg947 (spr847): undefined
+       privileged reg948 (spr848): undefined
+       privileged reg949 (spr849): undefined
+       privileged reg950 (spr850): undefined
+       privileged reg951 (spr851): undefined
+       privileged reg952 (spr852): undefined
+       privileged reg953 (spr853): undefined
+       privileged reg954 (spr854): undefined
+       privileged reg955 (spr855): undefined
+       privileged reg956 (spr856): undefined
+       privileged reg957 (spr857): undefined
+       privileged reg958 (spr858): undefined
+       privileged reg959 (spr859): undefined
+       privileged reg960 (spr860): undefined
+       privileged reg961 (spr861): undefined
+       privileged reg962 (spr862): undefined
+       privileged reg963 (spr863): undefined
+       privileged reg964 (spr864): undefined
+       privileged reg965 (spr865): undefined
+       privileged reg966 (spr866): undefined
+       privileged reg967 (spr867): undefined
+       privileged reg968 (spr868): undefined
+       privileged reg969 (spr869): undefined
+       privileged reg970 (spr870): undefined
+       privileged reg971 (spr871): undefined
+       privileged reg972 (spr872): undefined
+       privileged reg973 (spr873): undefined
+       privileged reg974 (spr874): undefined
+       privileged reg975 (spr875): undefined
+       privileged reg976 (spr876): undefined
+       privileged reg977 (spr877): undefined
+       privileged reg978 (spr878): undefined
+       privileged reg979 (spr879): undefined
+       privileged reg980 (spr880): undefined
+       privileged reg981 (spr881): undefined
+       privileged reg982 (spr882): undefined
+       privileged reg983 (spr883): undefined
+       privileged reg984 (spr884): undefined
+       privileged reg985 (spr885): undefined
+       privileged reg986 (spr886): undefined
+       privileged reg987 (spr887): undefined
+       privileged reg988 (spr888): undefined
+       privileged reg989 (spr889): undefined
+       privileged reg990 (spr890): undefined
+       privileged reg991 (spr891): undefined
+       privileged reg992 (spr892): undefined
+       privileged reg993 (spr893): undefined
+       privileged reg994 (spr894): undefined
+       privileged reg995 (spr895): undefined
+       privileged reg996 (spr896): undefined
+       privileged reg997 (spr897): undefined
+       privileged reg998 (spr898): undefined
+       privileged reg999 (spr899): undefined
+       vector reg1124 (vr0): undefined
+       vector reg1125 (vr1): undefined
+       vector reg1126 (vr2): undefined
+       vector reg1127 (vr3): undefined
+       vector reg1128 (vr4): undefined
+       vector reg1129 (vr5): undefined
+       vector reg1130 (vr6): undefined
+       vector reg1131 (vr7): undefined
+       vector reg1132 (vr8): undefined
+       vector reg1133 (vr9): undefined
+       vector reg1134 (vr10): undefined
+       vector reg1135 (vr11): undefined
+       vector reg1136 (vr12): undefined
+       vector reg1137 (vr13): undefined
+       vector reg1138 (vr14): undefined
+       vector reg1139 (vr15): undefined
+       vector reg1140 (vr16): undefined
+       vector reg1141 (vr17): undefined
+       vector reg1142 (vr18): undefined
+       vector reg1143 (vr19): undefined
+       vector reg1144 (vr20): undefined
+       vector reg1145 (vr21): undefined
+       vector reg1146 (vr22): undefined
+       vector reg1147 (vr23): undefined
+       vector reg1148 (vr24): undefined
+       vector reg1149 (vr25): undefined
+       vector reg1150 (vr26): undefined
+       vector reg1151 (vr27): undefined
+       vector reg1152 (vr28): undefined
+       vector reg1153 (vr29): undefined
+       vector reg1154 (vr30): undefined
+       vector reg1155 (vr31): undefined
+EOF
+
+# EM_PPC64 (function bar 0x00000000100005b0)
+# Note. Only in .debug_frame, not in .eh_frame.
+# Same as testfileppc32 but without -m32.
+testfiles testfileppc64
+testrun_compare ${abs_builddir}/addrcfi -e testfileppc64 0x00000000100005b0 <<\EOF
+dwarf_cfi_addrframe (.eh_frame): no matching address range
+.debug_frame has 0x100005b0 => [0x100005b0, 0x100005d0):
+       return address in reg65
+       CFA location expression: bregx(1)
+       integer reg0 (r0): undefined
+       integer reg1 (r1): location expression: call_frame_cfa stack_value
+       integer reg2 (r2): same_value
+       integer reg3 (r3): undefined
+       integer reg4 (r4): undefined
+       integer reg5 (r5): undefined
+       integer reg6 (r6): undefined
+       integer reg7 (r7): undefined
+       integer reg8 (r8): undefined
+       integer reg9 (r9): undefined
+       integer reg10 (r10): undefined
+       integer reg11 (r11): undefined
+       integer reg12 (r12): undefined
+       integer reg13 (r13): same_value
+       integer reg14 (r14): same_value
+       integer reg15 (r15): same_value
+       integer reg16 (r16): same_value
+       integer reg17 (r17): same_value
+       integer reg18 (r18): same_value
+       integer reg19 (r19): same_value
+       integer reg20 (r20): same_value
+       integer reg21 (r21): same_value
+       integer reg22 (r22): same_value
+       integer reg23 (r23): same_value
+       integer reg24 (r24): same_value
+       integer reg25 (r25): same_value
+       integer reg26 (r26): same_value
+       integer reg27 (r27): same_value
+       integer reg28 (r28): same_value
+       integer reg29 (r29): same_value
+       integer reg30 (r30): same_value
+       integer reg31 (r31): same_value
+       FPU reg32 (f0): undefined
+       FPU reg33 (f1): undefined
+       FPU reg34 (f2): undefined
+       FPU reg35 (f3): undefined
+       FPU reg36 (f4): undefined
+       FPU reg37 (f5): undefined
+       FPU reg38 (f6): undefined
+       FPU reg39 (f7): undefined
+       FPU reg40 (f8): undefined
+       FPU reg41 (f9): undefined
+       FPU reg42 (f10): undefined
+       FPU reg43 (f11): undefined
+       FPU reg44 (f12): undefined
+       FPU reg45 (f13): undefined
+       FPU reg46 (f14): undefined
+       FPU reg47 (f15): undefined
+       FPU reg48 (f16): undefined
+       FPU reg49 (f17): undefined
+       FPU reg50 (f18): undefined
+       FPU reg51 (f19): undefined
+       FPU reg52 (f20): undefined
+       FPU reg53 (f21): undefined
+       FPU reg54 (f22): undefined
+       FPU reg55 (f23): undefined
+       FPU reg56 (f24): undefined
+       FPU reg57 (f25): undefined
+       FPU reg58 (f26): undefined
+       FPU reg59 (f27): undefined
+       FPU reg60 (f28): undefined
+       FPU reg61 (f29): undefined
+       FPU reg62 (f30): undefined
+       FPU reg63 (f31): undefined
+       integer reg64 (cr): undefined
+       FPU reg65 (fpscr): same_value
+       integer reg66 (msr): undefined
+       vector reg67 (vscr): undefined
+       privileged reg70 (sr0): undefined
+       privileged reg71 (sr1): undefined
+       privileged reg72 (sr2): undefined
+       privileged reg73 (sr3): undefined
+       privileged reg74 (sr4): undefined
+       privileged reg75 (sr5): undefined
+       privileged reg76 (sr6): undefined
+       privileged reg77 (sr7): undefined
+       privileged reg78 (sr8): undefined
+       privileged reg79 (sr9): undefined
+       privileged reg80 (sr10): undefined
+       privileged reg81 (sr11): undefined
+       privileged reg82 (sr12): undefined
+       privileged reg83 (sr13): undefined
+       privileged reg84 (sr14): undefined
+       privileged reg85 (sr15): undefined
+       privileged reg100 (spr0): undefined
+       privileged reg101 (xer): undefined
+       privileged reg102 (spr2): undefined
+       privileged reg103 (spr3): undefined
+       privileged reg104 (spr4): undefined
+       privileged reg105 (spr5): undefined
+       privileged reg106 (spr6): undefined
+       privileged reg107 (spr7): undefined
+       privileged reg108 (lr): undefined
+       privileged reg109 (ctr): undefined
+       privileged reg110 (spr10): undefined
+       privileged reg111 (spr11): undefined
+       privileged reg112 (spr12): undefined
+       privileged reg113 (spr13): undefined
+       privileged reg114 (spr14): undefined
+       privileged reg115 (spr15): undefined
+       privileged reg116 (spr16): undefined
+       privileged reg117 (spr17): undefined
+       privileged reg118 (dsisr): undefined
+       privileged reg119 (dar): undefined
+       privileged reg120 (spr20): undefined
+       privileged reg121 (spr21): undefined
+       privileged reg122 (dec): undefined
+       privileged reg123 (spr23): undefined
+       privileged reg124 (spr24): undefined
+       privileged reg125 (spr25): undefined
+       privileged reg126 (spr26): undefined
+       privileged reg127 (spr27): undefined
+       privileged reg128 (spr28): undefined
+       privileged reg129 (spr29): undefined
+       privileged reg130 (spr30): undefined
+       privileged reg131 (spr31): undefined
+       privileged reg132 (spr32): undefined
+       privileged reg133 (spr33): undefined
+       privileged reg134 (spr34): undefined
+       privileged reg135 (spr35): undefined
+       privileged reg136 (spr36): undefined
+       privileged reg137 (spr37): undefined
+       privileged reg138 (spr38): undefined
+       privileged reg139 (spr39): undefined
+       privileged reg140 (spr40): undefined
+       privileged reg141 (spr41): undefined
+       privileged reg142 (spr42): undefined
+       privileged reg143 (spr43): undefined
+       privileged reg144 (spr44): undefined
+       privileged reg145 (spr45): undefined
+       privileged reg146 (spr46): undefined
+       privileged reg147 (spr47): undefined
+       privileged reg148 (spr48): undefined
+       privileged reg149 (spr49): undefined
+       privileged reg150 (spr50): undefined
+       privileged reg151 (spr51): undefined
+       privileged reg152 (spr52): undefined
+       privileged reg153 (spr53): undefined
+       privileged reg154 (spr54): undefined
+       privileged reg155 (spr55): undefined
+       privileged reg156 (spr56): undefined
+       privileged reg157 (spr57): undefined
+       privileged reg158 (spr58): undefined
+       privileged reg159 (spr59): undefined
+       privileged reg160 (spr60): undefined
+       privileged reg161 (spr61): undefined
+       privileged reg162 (spr62): undefined
+       privileged reg163 (spr63): undefined
+       privileged reg164 (spr64): undefined
+       privileged reg165 (spr65): undefined
+       privileged reg166 (spr66): undefined
+       privileged reg167 (spr67): undefined
+       privileged reg168 (spr68): undefined
+       privileged reg169 (spr69): undefined
+       privileged reg170 (spr70): undefined
+       privileged reg171 (spr71): undefined
+       privileged reg172 (spr72): undefined
+       privileged reg173 (spr73): undefined
+       privileged reg174 (spr74): undefined
+       privileged reg175 (spr75): undefined
+       privileged reg176 (spr76): undefined
+       privileged reg177 (spr77): undefined
+       privileged reg178 (spr78): undefined
+       privileged reg179 (spr79): undefined
+       privileged reg180 (spr80): undefined
+       privileged reg181 (spr81): undefined
+       privileged reg182 (spr82): undefined
+       privileged reg183 (spr83): undefined
+       privileged reg184 (spr84): undefined
+       privileged reg185 (spr85): undefined
+       privileged reg186 (spr86): undefined
+       privileged reg187 (spr87): undefined
+       privileged reg188 (spr88): undefined
+       privileged reg189 (spr89): undefined
+       privileged reg190 (spr90): undefined
+       privileged reg191 (spr91): undefined
+       privileged reg192 (spr92): undefined
+       privileged reg193 (spr93): undefined
+       privileged reg194 (spr94): undefined
+       privileged reg195 (spr95): undefined
+       privileged reg196 (spr96): undefined
+       privileged reg197 (spr97): undefined
+       privileged reg198 (spr98): undefined
+       privileged reg199 (spr99): undefined
+       privileged reg200 (spr100): undefined
+       privileged reg201 (spr101): undefined
+       privileged reg202 (spr102): undefined
+       privileged reg203 (spr103): undefined
+       privileged reg204 (spr104): undefined
+       privileged reg205 (spr105): undefined
+       privileged reg206 (spr106): undefined
+       privileged reg207 (spr107): undefined
+       privileged reg208 (spr108): undefined
+       privileged reg209 (spr109): undefined
+       privileged reg210 (spr110): undefined
+       privileged reg211 (spr111): undefined
+       privileged reg212 (spr112): undefined
+       privileged reg213 (spr113): undefined
+       privileged reg214 (spr114): undefined
+       privileged reg215 (spr115): undefined
+       privileged reg216 (spr116): undefined
+       privileged reg217 (spr117): undefined
+       privileged reg218 (spr118): undefined
+       privileged reg219 (spr119): undefined
+       privileged reg220 (spr120): undefined
+       privileged reg221 (spr121): undefined
+       privileged reg222 (spr122): undefined
+       privileged reg223 (spr123): undefined
+       privileged reg224 (spr124): undefined
+       privileged reg225 (spr125): undefined
+       privileged reg226 (spr126): undefined
+       privileged reg227 (spr127): undefined
+       privileged reg228 (spr128): undefined
+       privileged reg229 (spr129): undefined
+       privileged reg230 (spr130): undefined
+       privileged reg231 (spr131): undefined
+       privileged reg232 (spr132): undefined
+       privileged reg233 (spr133): undefined
+       privileged reg234 (spr134): undefined
+       privileged reg235 (spr135): undefined
+       privileged reg236 (spr136): undefined
+       privileged reg237 (spr137): undefined
+       privileged reg238 (spr138): undefined
+       privileged reg239 (spr139): undefined
+       privileged reg240 (spr140): undefined
+       privileged reg241 (spr141): undefined
+       privileged reg242 (spr142): undefined
+       privileged reg243 (spr143): undefined
+       privileged reg244 (spr144): undefined
+       privileged reg245 (spr145): undefined
+       privileged reg246 (spr146): undefined
+       privileged reg247 (spr147): undefined
+       privileged reg248 (spr148): undefined
+       privileged reg249 (spr149): undefined
+       privileged reg250 (spr150): undefined
+       privileged reg251 (spr151): undefined
+       privileged reg252 (spr152): undefined
+       privileged reg253 (spr153): undefined
+       privileged reg254 (spr154): undefined
+       privileged reg255 (spr155): undefined
+       privileged reg256 (spr156): undefined
+       privileged reg257 (spr157): undefined
+       privileged reg258 (spr158): undefined
+       privileged reg259 (spr159): undefined
+       privileged reg260 (spr160): undefined
+       privileged reg261 (spr161): undefined
+       privileged reg262 (spr162): undefined
+       privileged reg263 (spr163): undefined
+       privileged reg264 (spr164): undefined
+       privileged reg265 (spr165): undefined
+       privileged reg266 (spr166): undefined
+       privileged reg267 (spr167): undefined
+       privileged reg268 (spr168): undefined
+       privileged reg269 (spr169): undefined
+       privileged reg270 (spr170): undefined
+       privileged reg271 (spr171): undefined
+       privileged reg272 (spr172): undefined
+       privileged reg273 (spr173): undefined
+       privileged reg274 (spr174): undefined
+       privileged reg275 (spr175): undefined
+       privileged reg276 (spr176): undefined
+       privileged reg277 (spr177): undefined
+       privileged reg278 (spr178): undefined
+       privileged reg279 (spr179): undefined
+       privileged reg280 (spr180): undefined
+       privileged reg281 (spr181): undefined
+       privileged reg282 (spr182): undefined
+       privileged reg283 (spr183): undefined
+       privileged reg284 (spr184): undefined
+       privileged reg285 (spr185): undefined
+       privileged reg286 (spr186): undefined
+       privileged reg287 (spr187): undefined
+       privileged reg288 (spr188): undefined
+       privileged reg289 (spr189): undefined
+       privileged reg290 (spr190): undefined
+       privileged reg291 (spr191): undefined
+       privileged reg292 (spr192): undefined
+       privileged reg293 (spr193): undefined
+       privileged reg294 (spr194): undefined
+       privileged reg295 (spr195): undefined
+       privileged reg296 (spr196): undefined
+       privileged reg297 (spr197): undefined
+       privileged reg298 (spr198): undefined
+       privileged reg299 (spr199): undefined
+       privileged reg300 (spr200): undefined
+       privileged reg301 (spr201): undefined
+       privileged reg302 (spr202): undefined
+       privileged reg303 (spr203): undefined
+       privileged reg304 (spr204): undefined
+       privileged reg305 (spr205): undefined
+       privileged reg306 (spr206): undefined
+       privileged reg307 (spr207): undefined
+       privileged reg308 (spr208): undefined
+       privileged reg309 (spr209): undefined
+       privileged reg310 (spr210): undefined
+       privileged reg311 (spr211): undefined
+       privileged reg312 (spr212): undefined
+       privileged reg313 (spr213): undefined
+       privileged reg314 (spr214): undefined
+       privileged reg315 (spr215): undefined
+       privileged reg316 (spr216): undefined
+       privileged reg317 (spr217): undefined
+       privileged reg318 (spr218): undefined
+       privileged reg319 (spr219): undefined
+       privileged reg320 (spr220): undefined
+       privileged reg321 (spr221): undefined
+       privileged reg322 (spr222): undefined
+       privileged reg323 (spr223): undefined
+       privileged reg324 (spr224): undefined
+       privileged reg325 (spr225): undefined
+       privileged reg326 (spr226): undefined
+       privileged reg327 (spr227): undefined
+       privileged reg328 (spr228): undefined
+       privileged reg329 (spr229): undefined
+       privileged reg330 (spr230): undefined
+       privileged reg331 (spr231): undefined
+       privileged reg332 (spr232): undefined
+       privileged reg333 (spr233): undefined
+       privileged reg334 (spr234): undefined
+       privileged reg335 (spr235): undefined
+       privileged reg336 (spr236): undefined
+       privileged reg337 (spr237): undefined
+       privileged reg338 (spr238): undefined
+       privileged reg339 (spr239): undefined
+       privileged reg340 (spr240): undefined
+       privileged reg341 (spr241): undefined
+       privileged reg342 (spr242): undefined
+       privileged reg343 (spr243): undefined
+       privileged reg344 (spr244): undefined
+       privileged reg345 (spr245): undefined
+       privileged reg346 (spr246): undefined
+       privileged reg347 (spr247): undefined
+       privileged reg348 (spr248): undefined
+       privileged reg349 (spr249): undefined
+       privileged reg350 (spr250): undefined
+       privileged reg351 (spr251): undefined
+       privileged reg352 (spr252): undefined
+       privileged reg353 (spr253): undefined
+       privileged reg354 (spr254): undefined
+       privileged reg355 (spr255): undefined
+       vector reg356 (vrsave): undefined
+       privileged reg357 (spr257): undefined
+       privileged reg358 (spr258): undefined
+       privileged reg359 (spr259): undefined
+       privileged reg360 (spr260): undefined
+       privileged reg361 (spr261): undefined
+       privileged reg362 (spr262): undefined
+       privileged reg363 (spr263): undefined
+       privileged reg364 (spr264): undefined
+       privileged reg365 (spr265): undefined
+       privileged reg366 (spr266): undefined
+       privileged reg367 (spr267): undefined
+       privileged reg368 (spr268): undefined
+       privileged reg369 (spr269): undefined
+       privileged reg370 (spr270): undefined
+       privileged reg371 (spr271): undefined
+       privileged reg372 (spr272): undefined
+       privileged reg373 (spr273): undefined
+       privileged reg374 (spr274): undefined
+       privileged reg375 (spr275): undefined
+       privileged reg376 (spr276): undefined
+       privileged reg377 (spr277): undefined
+       privileged reg378 (spr278): undefined
+       privileged reg379 (spr279): undefined
+       privileged reg380 (spr280): undefined
+       privileged reg381 (spr281): undefined
+       privileged reg382 (spr282): undefined
+       privileged reg383 (spr283): undefined
+       privileged reg384 (spr284): undefined
+       privileged reg385 (spr285): undefined
+       privileged reg386 (spr286): undefined
+       privileged reg387 (spr287): undefined
+       privileged reg388 (spr288): undefined
+       privileged reg389 (spr289): undefined
+       privileged reg390 (spr290): undefined
+       privileged reg391 (spr291): undefined
+       privileged reg392 (spr292): undefined
+       privileged reg393 (spr293): undefined
+       privileged reg394 (spr294): undefined
+       privileged reg395 (spr295): undefined
+       privileged reg396 (spr296): undefined
+       privileged reg397 (spr297): undefined
+       privileged reg398 (spr298): undefined
+       privileged reg399 (spr299): undefined
+       privileged reg400 (spr300): undefined
+       privileged reg401 (spr301): undefined
+       privileged reg402 (spr302): undefined
+       privileged reg403 (spr303): undefined
+       privileged reg404 (spr304): undefined
+       privileged reg405 (spr305): undefined
+       privileged reg406 (spr306): undefined
+       privileged reg407 (spr307): undefined
+       privileged reg408 (spr308): undefined
+       privileged reg409 (spr309): undefined
+       privileged reg410 (spr310): undefined
+       privileged reg411 (spr311): undefined
+       privileged reg412 (spr312): undefined
+       privileged reg413 (spr313): undefined
+       privileged reg414 (spr314): undefined
+       privileged reg415 (spr315): undefined
+       privileged reg416 (spr316): undefined
+       privileged reg417 (spr317): undefined
+       privileged reg418 (spr318): undefined
+       privileged reg419 (spr319): undefined
+       privileged reg420 (spr320): undefined
+       privileged reg421 (spr321): undefined
+       privileged reg422 (spr322): undefined
+       privileged reg423 (spr323): undefined
+       privileged reg424 (spr324): undefined
+       privileged reg425 (spr325): undefined
+       privileged reg426 (spr326): undefined
+       privileged reg427 (spr327): undefined
+       privileged reg428 (spr328): undefined
+       privileged reg429 (spr329): undefined
+       privileged reg430 (spr330): undefined
+       privileged reg431 (spr331): undefined
+       privileged reg432 (spr332): undefined
+       privileged reg433 (spr333): undefined
+       privileged reg434 (spr334): undefined
+       privileged reg435 (spr335): undefined
+       privileged reg436 (spr336): undefined
+       privileged reg437 (spr337): undefined
+       privileged reg438 (spr338): undefined
+       privileged reg439 (spr339): undefined
+       privileged reg440 (spr340): undefined
+       privileged reg441 (spr341): undefined
+       privileged reg442 (spr342): undefined
+       privileged reg443 (spr343): undefined
+       privileged reg444 (spr344): undefined
+       privileged reg445 (spr345): undefined
+       privileged reg446 (spr346): undefined
+       privileged reg447 (spr347): undefined
+       privileged reg448 (spr348): undefined
+       privileged reg449 (spr349): undefined
+       privileged reg450 (spr350): undefined
+       privileged reg451 (spr351): undefined
+       privileged reg452 (spr352): undefined
+       privileged reg453 (spr353): undefined
+       privileged reg454 (spr354): undefined
+       privileged reg455 (spr355): undefined
+       privileged reg456 (spr356): undefined
+       privileged reg457 (spr357): undefined
+       privileged reg458 (spr358): undefined
+       privileged reg459 (spr359): undefined
+       privileged reg460 (spr360): undefined
+       privileged reg461 (spr361): undefined
+       privileged reg462 (spr362): undefined
+       privileged reg463 (spr363): undefined
+       privileged reg464 (spr364): undefined
+       privileged reg465 (spr365): undefined
+       privileged reg466 (spr366): undefined
+       privileged reg467 (spr367): undefined
+       privileged reg468 (spr368): undefined
+       privileged reg469 (spr369): undefined
+       privileged reg470 (spr370): undefined
+       privileged reg471 (spr371): undefined
+       privileged reg472 (spr372): undefined
+       privileged reg473 (spr373): undefined
+       privileged reg474 (spr374): undefined
+       privileged reg475 (spr375): undefined
+       privileged reg476 (spr376): undefined
+       privileged reg477 (spr377): undefined
+       privileged reg478 (spr378): undefined
+       privileged reg479 (spr379): undefined
+       privileged reg480 (spr380): undefined
+       privileged reg481 (spr381): undefined
+       privileged reg482 (spr382): undefined
+       privileged reg483 (spr383): undefined
+       privileged reg484 (spr384): undefined
+       privileged reg485 (spr385): undefined
+       privileged reg486 (spr386): undefined
+       privileged reg487 (spr387): undefined
+       privileged reg488 (spr388): undefined
+       privileged reg489 (spr389): undefined
+       privileged reg490 (spr390): undefined
+       privileged reg491 (spr391): undefined
+       privileged reg492 (spr392): undefined
+       privileged reg493 (spr393): undefined
+       privileged reg494 (spr394): undefined
+       privileged reg495 (spr395): undefined
+       privileged reg496 (spr396): undefined
+       privileged reg497 (spr397): undefined
+       privileged reg498 (spr398): undefined
+       privileged reg499 (spr399): undefined
+       privileged reg500 (spr400): undefined
+       privileged reg501 (spr401): undefined
+       privileged reg502 (spr402): undefined
+       privileged reg503 (spr403): undefined
+       privileged reg504 (spr404): undefined
+       privileged reg505 (spr405): undefined
+       privileged reg506 (spr406): undefined
+       privileged reg507 (spr407): undefined
+       privileged reg508 (spr408): undefined
+       privileged reg509 (spr409): undefined
+       privileged reg510 (spr410): undefined
+       privileged reg511 (spr411): undefined
+       privileged reg512 (spr412): undefined
+       privileged reg513 (spr413): undefined
+       privileged reg514 (spr414): undefined
+       privileged reg515 (spr415): undefined
+       privileged reg516 (spr416): undefined
+       privileged reg517 (spr417): undefined
+       privileged reg518 (spr418): undefined
+       privileged reg519 (spr419): undefined
+       privileged reg520 (spr420): undefined
+       privileged reg521 (spr421): undefined
+       privileged reg522 (spr422): undefined
+       privileged reg523 (spr423): undefined
+       privileged reg524 (spr424): undefined
+       privileged reg525 (spr425): undefined
+       privileged reg526 (spr426): undefined
+       privileged reg527 (spr427): undefined
+       privileged reg528 (spr428): undefined
+       privileged reg529 (spr429): undefined
+       privileged reg530 (spr430): undefined
+       privileged reg531 (spr431): undefined
+       privileged reg532 (spr432): undefined
+       privileged reg533 (spr433): undefined
+       privileged reg534 (spr434): undefined
+       privileged reg535 (spr435): undefined
+       privileged reg536 (spr436): undefined
+       privileged reg537 (spr437): undefined
+       privileged reg538 (spr438): undefined
+       privileged reg539 (spr439): undefined
+       privileged reg540 (spr440): undefined
+       privileged reg541 (spr441): undefined
+       privileged reg542 (spr442): undefined
+       privileged reg543 (spr443): undefined
+       privileged reg544 (spr444): undefined
+       privileged reg545 (spr445): undefined
+       privileged reg546 (spr446): undefined
+       privileged reg547 (spr447): undefined
+       privileged reg548 (spr448): undefined
+       privileged reg549 (spr449): undefined
+       privileged reg550 (spr450): undefined
+       privileged reg551 (spr451): undefined
+       privileged reg552 (spr452): undefined
+       privileged reg553 (spr453): undefined
+       privileged reg554 (spr454): undefined
+       privileged reg555 (spr455): undefined
+       privileged reg556 (spr456): undefined
+       privileged reg557 (spr457): undefined
+       privileged reg558 (spr458): undefined
+       privileged reg559 (spr459): undefined
+       privileged reg560 (spr460): undefined
+       privileged reg561 (spr461): undefined
+       privileged reg562 (spr462): undefined
+       privileged reg563 (spr463): undefined
+       privileged reg564 (spr464): undefined
+       privileged reg565 (spr465): undefined
+       privileged reg566 (spr466): undefined
+       privileged reg567 (spr467): undefined
+       privileged reg568 (spr468): undefined
+       privileged reg569 (spr469): undefined
+       privileged reg570 (spr470): undefined
+       privileged reg571 (spr471): undefined
+       privileged reg572 (spr472): undefined
+       privileged reg573 (spr473): undefined
+       privileged reg574 (spr474): undefined
+       privileged reg575 (spr475): undefined
+       privileged reg576 (spr476): undefined
+       privileged reg577 (spr477): undefined
+       privileged reg578 (spr478): undefined
+       privileged reg579 (spr479): undefined
+       privileged reg580 (spr480): undefined
+       privileged reg581 (spr481): undefined
+       privileged reg582 (spr482): undefined
+       privileged reg583 (spr483): undefined
+       privileged reg584 (spr484): undefined
+       privileged reg585 (spr485): undefined
+       privileged reg586 (spr486): undefined
+       privileged reg587 (spr487): undefined
+       privileged reg588 (spr488): undefined
+       privileged reg589 (spr489): undefined
+       privileged reg590 (spr490): undefined
+       privileged reg591 (spr491): undefined
+       privileged reg592 (spr492): undefined
+       privileged reg593 (spr493): undefined
+       privileged reg594 (spr494): undefined
+       privileged reg595 (spr495): undefined
+       privileged reg596 (spr496): undefined
+       privileged reg597 (spr497): undefined
+       privileged reg598 (spr498): undefined
+       privileged reg599 (spr499): undefined
+       privileged reg600 (spr500): undefined
+       privileged reg601 (spr501): undefined
+       privileged reg602 (spr502): undefined
+       privileged reg603 (spr503): undefined
+       privileged reg604 (spr504): undefined
+       privileged reg605 (spr505): undefined
+       privileged reg606 (spr506): undefined
+       privileged reg607 (spr507): undefined
+       privileged reg608 (spr508): undefined
+       privileged reg609 (spr509): undefined
+       privileged reg610 (spr510): undefined
+       privileged reg611 (spr511): undefined
+       vector reg612 (spefscr): undefined
+       privileged reg613 (spr513): undefined
+       privileged reg614 (spr514): undefined
+       privileged reg615 (spr515): undefined
+       privileged reg616 (spr516): undefined
+       privileged reg617 (spr517): undefined
+       privileged reg618 (spr518): undefined
+       privileged reg619 (spr519): undefined
+       privileged reg620 (spr520): undefined
+       privileged reg621 (spr521): undefined
+       privileged reg622 (spr522): undefined
+       privileged reg623 (spr523): undefined
+       privileged reg624 (spr524): undefined
+       privileged reg625 (spr525): undefined
+       privileged reg626 (spr526): undefined
+       privileged reg627 (spr527): undefined
+       privileged reg628 (spr528): undefined
+       privileged reg629 (spr529): undefined
+       privileged reg630 (spr530): undefined
+       privileged reg631 (spr531): undefined
+       privileged reg632 (spr532): undefined
+       privileged reg633 (spr533): undefined
+       privileged reg634 (spr534): undefined
+       privileged reg635 (spr535): undefined
+       privileged reg636 (spr536): undefined
+       privileged reg637 (spr537): undefined
+       privileged reg638 (spr538): undefined
+       privileged reg639 (spr539): undefined
+       privileged reg640 (spr540): undefined
+       privileged reg641 (spr541): undefined
+       privileged reg642 (spr542): undefined
+       privileged reg643 (spr543): undefined
+       privileged reg644 (spr544): undefined
+       privileged reg645 (spr545): undefined
+       privileged reg646 (spr546): undefined
+       privileged reg647 (spr547): undefined
+       privileged reg648 (spr548): undefined
+       privileged reg649 (spr549): undefined
+       privileged reg650 (spr550): undefined
+       privileged reg651 (spr551): undefined
+       privileged reg652 (spr552): undefined
+       privileged reg653 (spr553): undefined
+       privileged reg654 (spr554): undefined
+       privileged reg655 (spr555): undefined
+       privileged reg656 (spr556): undefined
+       privileged reg657 (spr557): undefined
+       privileged reg658 (spr558): undefined
+       privileged reg659 (spr559): undefined
+       privileged reg660 (spr560): undefined
+       privileged reg661 (spr561): undefined
+       privileged reg662 (spr562): undefined
+       privileged reg663 (spr563): undefined
+       privileged reg664 (spr564): undefined
+       privileged reg665 (spr565): undefined
+       privileged reg666 (spr566): undefined
+       privileged reg667 (spr567): undefined
+       privileged reg668 (spr568): undefined
+       privileged reg669 (spr569): undefined
+       privileged reg670 (spr570): undefined
+       privileged reg671 (spr571): undefined
+       privileged reg672 (spr572): undefined
+       privileged reg673 (spr573): undefined
+       privileged reg674 (spr574): undefined
+       privileged reg675 (spr575): undefined
+       privileged reg676 (spr576): undefined
+       privileged reg677 (spr577): undefined
+       privileged reg678 (spr578): undefined
+       privileged reg679 (spr579): undefined
+       privileged reg680 (spr580): undefined
+       privileged reg681 (spr581): undefined
+       privileged reg682 (spr582): undefined
+       privileged reg683 (spr583): undefined
+       privileged reg684 (spr584): undefined
+       privileged reg685 (spr585): undefined
+       privileged reg686 (spr586): undefined
+       privileged reg687 (spr587): undefined
+       privileged reg688 (spr588): undefined
+       privileged reg689 (spr589): undefined
+       privileged reg690 (spr590): undefined
+       privileged reg691 (spr591): undefined
+       privileged reg692 (spr592): undefined
+       privileged reg693 (spr593): undefined
+       privileged reg694 (spr594): undefined
+       privileged reg695 (spr595): undefined
+       privileged reg696 (spr596): undefined
+       privileged reg697 (spr597): undefined
+       privileged reg698 (spr598): undefined
+       privileged reg699 (spr599): undefined
+       privileged reg700 (spr600): undefined
+       privileged reg701 (spr601): undefined
+       privileged reg702 (spr602): undefined
+       privileged reg703 (spr603): undefined
+       privileged reg704 (spr604): undefined
+       privileged reg705 (spr605): undefined
+       privileged reg706 (spr606): undefined
+       privileged reg707 (spr607): undefined
+       privileged reg708 (spr608): undefined
+       privileged reg709 (spr609): undefined
+       privileged reg710 (spr610): undefined
+       privileged reg711 (spr611): undefined
+       privileged reg712 (spr612): undefined
+       privileged reg713 (spr613): undefined
+       privileged reg714 (spr614): undefined
+       privileged reg715 (spr615): undefined
+       privileged reg716 (spr616): undefined
+       privileged reg717 (spr617): undefined
+       privileged reg718 (spr618): undefined
+       privileged reg719 (spr619): undefined
+       privileged reg720 (spr620): undefined
+       privileged reg721 (spr621): undefined
+       privileged reg722 (spr622): undefined
+       privileged reg723 (spr623): undefined
+       privileged reg724 (spr624): undefined
+       privileged reg725 (spr625): undefined
+       privileged reg726 (spr626): undefined
+       privileged reg727 (spr627): undefined
+       privileged reg728 (spr628): undefined
+       privileged reg729 (spr629): undefined
+       privileged reg730 (spr630): undefined
+       privileged reg731 (spr631): undefined
+       privileged reg732 (spr632): undefined
+       privileged reg733 (spr633): undefined
+       privileged reg734 (spr634): undefined
+       privileged reg735 (spr635): undefined
+       privileged reg736 (spr636): undefined
+       privileged reg737 (spr637): undefined
+       privileged reg738 (spr638): undefined
+       privileged reg739 (spr639): undefined
+       privileged reg740 (spr640): undefined
+       privileged reg741 (spr641): undefined
+       privileged reg742 (spr642): undefined
+       privileged reg743 (spr643): undefined
+       privileged reg744 (spr644): undefined
+       privileged reg745 (spr645): undefined
+       privileged reg746 (spr646): undefined
+       privileged reg747 (spr647): undefined
+       privileged reg748 (spr648): undefined
+       privileged reg749 (spr649): undefined
+       privileged reg750 (spr650): undefined
+       privileged reg751 (spr651): undefined
+       privileged reg752 (spr652): undefined
+       privileged reg753 (spr653): undefined
+       privileged reg754 (spr654): undefined
+       privileged reg755 (spr655): undefined
+       privileged reg756 (spr656): undefined
+       privileged reg757 (spr657): undefined
+       privileged reg758 (spr658): undefined
+       privileged reg759 (spr659): undefined
+       privileged reg760 (spr660): undefined
+       privileged reg761 (spr661): undefined
+       privileged reg762 (spr662): undefined
+       privileged reg763 (spr663): undefined
+       privileged reg764 (spr664): undefined
+       privileged reg765 (spr665): undefined
+       privileged reg766 (spr666): undefined
+       privileged reg767 (spr667): undefined
+       privileged reg768 (spr668): undefined
+       privileged reg769 (spr669): undefined
+       privileged reg770 (spr670): undefined
+       privileged reg771 (spr671): undefined
+       privileged reg772 (spr672): undefined
+       privileged reg773 (spr673): undefined
+       privileged reg774 (spr674): undefined
+       privileged reg775 (spr675): undefined
+       privileged reg776 (spr676): undefined
+       privileged reg777 (spr677): undefined
+       privileged reg778 (spr678): undefined
+       privileged reg779 (spr679): undefined
+       privileged reg780 (spr680): undefined
+       privileged reg781 (spr681): undefined
+       privileged reg782 (spr682): undefined
+       privileged reg783 (spr683): undefined
+       privileged reg784 (spr684): undefined
+       privileged reg785 (spr685): undefined
+       privileged reg786 (spr686): undefined
+       privileged reg787 (spr687): undefined
+       privileged reg788 (spr688): undefined
+       privileged reg789 (spr689): undefined
+       privileged reg790 (spr690): undefined
+       privileged reg791 (spr691): undefined
+       privileged reg792 (spr692): undefined
+       privileged reg793 (spr693): undefined
+       privileged reg794 (spr694): undefined
+       privileged reg795 (spr695): undefined
+       privileged reg796 (spr696): undefined
+       privileged reg797 (spr697): undefined
+       privileged reg798 (spr698): undefined
+       privileged reg799 (spr699): undefined
+       privileged reg800 (spr700): undefined
+       privileged reg801 (spr701): undefined
+       privileged reg802 (spr702): undefined
+       privileged reg803 (spr703): undefined
+       privileged reg804 (spr704): undefined
+       privileged reg805 (spr705): undefined
+       privileged reg806 (spr706): undefined
+       privileged reg807 (spr707): undefined
+       privileged reg808 (spr708): undefined
+       privileged reg809 (spr709): undefined
+       privileged reg810 (spr710): undefined
+       privileged reg811 (spr711): undefined
+       privileged reg812 (spr712): undefined
+       privileged reg813 (spr713): undefined
+       privileged reg814 (spr714): undefined
+       privileged reg815 (spr715): undefined
+       privileged reg816 (spr716): undefined
+       privileged reg817 (spr717): undefined
+       privileged reg818 (spr718): undefined
+       privileged reg819 (spr719): undefined
+       privileged reg820 (spr720): undefined
+       privileged reg821 (spr721): undefined
+       privileged reg822 (spr722): undefined
+       privileged reg823 (spr723): undefined
+       privileged reg824 (spr724): undefined
+       privileged reg825 (spr725): undefined
+       privileged reg826 (spr726): undefined
+       privileged reg827 (spr727): undefined
+       privileged reg828 (spr728): undefined
+       privileged reg829 (spr729): undefined
+       privileged reg830 (spr730): undefined
+       privileged reg831 (spr731): undefined
+       privileged reg832 (spr732): undefined
+       privileged reg833 (spr733): undefined
+       privileged reg834 (spr734): undefined
+       privileged reg835 (spr735): undefined
+       privileged reg836 (spr736): undefined
+       privileged reg837 (spr737): undefined
+       privileged reg838 (spr738): undefined
+       privileged reg839 (spr739): undefined
+       privileged reg840 (spr740): undefined
+       privileged reg841 (spr741): undefined
+       privileged reg842 (spr742): undefined
+       privileged reg843 (spr743): undefined
+       privileged reg844 (spr744): undefined
+       privileged reg845 (spr745): undefined
+       privileged reg846 (spr746): undefined
+       privileged reg847 (spr747): undefined
+       privileged reg848 (spr748): undefined
+       privileged reg849 (spr749): undefined
+       privileged reg850 (spr750): undefined
+       privileged reg851 (spr751): undefined
+       privileged reg852 (spr752): undefined
+       privileged reg853 (spr753): undefined
+       privileged reg854 (spr754): undefined
+       privileged reg855 (spr755): undefined
+       privileged reg856 (spr756): undefined
+       privileged reg857 (spr757): undefined
+       privileged reg858 (spr758): undefined
+       privileged reg859 (spr759): undefined
+       privileged reg860 (spr760): undefined
+       privileged reg861 (spr761): undefined
+       privileged reg862 (spr762): undefined
+       privileged reg863 (spr763): undefined
+       privileged reg864 (spr764): undefined
+       privileged reg865 (spr765): undefined
+       privileged reg866 (spr766): undefined
+       privileged reg867 (spr767): undefined
+       privileged reg868 (spr768): undefined
+       privileged reg869 (spr769): undefined
+       privileged reg870 (spr770): undefined
+       privileged reg871 (spr771): undefined
+       privileged reg872 (spr772): undefined
+       privileged reg873 (spr773): undefined
+       privileged reg874 (spr774): undefined
+       privileged reg875 (spr775): undefined
+       privileged reg876 (spr776): undefined
+       privileged reg877 (spr777): undefined
+       privileged reg878 (spr778): undefined
+       privileged reg879 (spr779): undefined
+       privileged reg880 (spr780): undefined
+       privileged reg881 (spr781): undefined
+       privileged reg882 (spr782): undefined
+       privileged reg883 (spr783): undefined
+       privileged reg884 (spr784): undefined
+       privileged reg885 (spr785): undefined
+       privileged reg886 (spr786): undefined
+       privileged reg887 (spr787): undefined
+       privileged reg888 (spr788): undefined
+       privileged reg889 (spr789): undefined
+       privileged reg890 (spr790): undefined
+       privileged reg891 (spr791): undefined
+       privileged reg892 (spr792): undefined
+       privileged reg893 (spr793): undefined
+       privileged reg894 (spr794): undefined
+       privileged reg895 (spr795): undefined
+       privileged reg896 (spr796): undefined
+       privileged reg897 (spr797): undefined
+       privileged reg898 (spr798): undefined
+       privileged reg899 (spr799): undefined
+       privileged reg900 (spr800): undefined
+       privileged reg901 (spr801): undefined
+       privileged reg902 (spr802): undefined
+       privileged reg903 (spr803): undefined
+       privileged reg904 (spr804): undefined
+       privileged reg905 (spr805): undefined
+       privileged reg906 (spr806): undefined
+       privileged reg907 (spr807): undefined
+       privileged reg908 (spr808): undefined
+       privileged reg909 (spr809): undefined
+       privileged reg910 (spr810): undefined
+       privileged reg911 (spr811): undefined
+       privileged reg912 (spr812): undefined
+       privileged reg913 (spr813): undefined
+       privileged reg914 (spr814): undefined
+       privileged reg915 (spr815): undefined
+       privileged reg916 (spr816): undefined
+       privileged reg917 (spr817): undefined
+       privileged reg918 (spr818): undefined
+       privileged reg919 (spr819): undefined
+       privileged reg920 (spr820): undefined
+       privileged reg921 (spr821): undefined
+       privileged reg922 (spr822): undefined
+       privileged reg923 (spr823): undefined
+       privileged reg924 (spr824): undefined
+       privileged reg925 (spr825): undefined
+       privileged reg926 (spr826): undefined
+       privileged reg927 (spr827): undefined
+       privileged reg928 (spr828): undefined
+       privileged reg929 (spr829): undefined
+       privileged reg930 (spr830): undefined
+       privileged reg931 (spr831): undefined
+       privileged reg932 (spr832): undefined
+       privileged reg933 (spr833): undefined
+       privileged reg934 (spr834): undefined
+       privileged reg935 (spr835): undefined
+       privileged reg936 (spr836): undefined
+       privileged reg937 (spr837): undefined
+       privileged reg938 (spr838): undefined
+       privileged reg939 (spr839): undefined
+       privileged reg940 (spr840): undefined
+       privileged reg941 (spr841): undefined
+       privileged reg942 (spr842): undefined
+       privileged reg943 (spr843): undefined
+       privileged reg944 (spr844): undefined
+       privileged reg945 (spr845): undefined
+       privileged reg946 (spr846): undefined
+       privileged reg947 (spr847): undefined
+       privileged reg948 (spr848): undefined
+       privileged reg949 (spr849): undefined
+       privileged reg950 (spr850): undefined
+       privileged reg951 (spr851): undefined
+       privileged reg952 (spr852): undefined
+       privileged reg953 (spr853): undefined
+       privileged reg954 (spr854): undefined
+       privileged reg955 (spr855): undefined
+       privileged reg956 (spr856): undefined
+       privileged reg957 (spr857): undefined
+       privileged reg958 (spr858): undefined
+       privileged reg959 (spr859): undefined
+       privileged reg960 (spr860): undefined
+       privileged reg961 (spr861): undefined
+       privileged reg962 (spr862): undefined
+       privileged reg963 (spr863): undefined
+       privileged reg964 (spr864): undefined
+       privileged reg965 (spr865): undefined
+       privileged reg966 (spr866): undefined
+       privileged reg967 (spr867): undefined
+       privileged reg968 (spr868): undefined
+       privileged reg969 (spr869): undefined
+       privileged reg970 (spr870): undefined
+       privileged reg971 (spr871): undefined
+       privileged reg972 (spr872): undefined
+       privileged reg973 (spr873): undefined
+       privileged reg974 (spr874): undefined
+       privileged reg975 (spr875): undefined
+       privileged reg976 (spr876): undefined
+       privileged reg977 (spr877): undefined
+       privileged reg978 (spr878): undefined
+       privileged reg979 (spr879): undefined
+       privileged reg980 (spr880): undefined
+       privileged reg981 (spr881): undefined
+       privileged reg982 (spr882): undefined
+       privileged reg983 (spr883): undefined
+       privileged reg984 (spr884): undefined
+       privileged reg985 (spr885): undefined
+       privileged reg986 (spr886): undefined
+       privileged reg987 (spr887): undefined
+       privileged reg988 (spr888): undefined
+       privileged reg989 (spr889): undefined
+       privileged reg990 (spr890): undefined
+       privileged reg991 (spr891): undefined
+       privileged reg992 (spr892): undefined
+       privileged reg993 (spr893): undefined
+       privileged reg994 (spr894): undefined
+       privileged reg995 (spr895): undefined
+       privileged reg996 (spr896): undefined
+       privileged reg997 (spr897): undefined
+       privileged reg998 (spr898): undefined
+       privileged reg999 (spr899): undefined
+       vector reg1124 (vr0): undefined
+       vector reg1125 (vr1): undefined
+       vector reg1126 (vr2): undefined
+       vector reg1127 (vr3): undefined
+       vector reg1128 (vr4): undefined
+       vector reg1129 (vr5): undefined
+       vector reg1130 (vr6): undefined
+       vector reg1131 (vr7): undefined
+       vector reg1132 (vr8): undefined
+       vector reg1133 (vr9): undefined
+       vector reg1134 (vr10): undefined
+       vector reg1135 (vr11): undefined
+       vector reg1136 (vr12): undefined
+       vector reg1137 (vr13): undefined
+       vector reg1138 (vr14): undefined
+       vector reg1139 (vr15): undefined
+       vector reg1140 (vr16): undefined
+       vector reg1141 (vr17): undefined
+       vector reg1142 (vr18): undefined
+       vector reg1143 (vr19): undefined
+       vector reg1144 (vr20): undefined
+       vector reg1145 (vr21): undefined
+       vector reg1146 (vr22): undefined
+       vector reg1147 (vr23): undefined
+       vector reg1148 (vr24): undefined
+       vector reg1149 (vr25): undefined
+       vector reg1150 (vr26): undefined
+       vector reg1151 (vr27): undefined
+       vector reg1152 (vr28): undefined
+       vector reg1153 (vr29): undefined
+       vector reg1154 (vr30): undefined
+       vector reg1155 (vr31): undefined
+EOF
+
+# EM_S390 (ELFCLASS32) (function bar 0x4004d8)
+# Note. Only in .eh_frame, there is no .debug_frame.
+# Same as PPC above but with -m31.
+testfiles testfiles390
+testrun_compare ${abs_builddir}/addrcfi -e testfiles390 0x4004d8 <<\EOF
+.eh_frame has 0x4004d8 => [0x4004d8, 0x4004e8):
+       return address in reg14
+       CFA location expression: bregx(15,96)
+       integer reg0 (%r0): undefined
+       integer reg1 (%r1): undefined
+       integer reg2 (%r2): undefined
+       integer reg3 (%r3): undefined
+       integer reg4 (%r4): undefined
+       integer reg5 (%r5): undefined
+       integer reg6 (%r6): same_value
+       integer reg7 (%r7): same_value
+       integer reg8 (%r8): same_value
+       integer reg9 (%r9): same_value
+       integer reg10 (%r10): same_value
+       integer reg11 (%r11): same_value
+       integer reg12 (%r12): same_value
+       integer reg13 (%r13): same_value
+       integer reg14 (%r14): same_value
+       integer reg15 (%r15): same_value
+       FPU reg16 (%f0): undefined
+       FPU reg17 (%f2): undefined
+       FPU reg18 (%f4): undefined
+       FPU reg19 (%f6): undefined
+       FPU reg20 (%f1): undefined
+       FPU reg21 (%f3): undefined
+       FPU reg22 (%f5): undefined
+       FPU reg23 (%f7): undefined
+       FPU reg24 (%f8): same_value
+       FPU reg25 (%f10): same_value
+       FPU reg26 (%f12): same_value
+       FPU reg27 (%f14): same_value
+       FPU reg28 (%f9): same_value
+       FPU reg29 (%f11): same_value
+       FPU reg30 (%f13): same_value
+       FPU reg31 (%f15): same_value
+       control reg32 (%c0): undefined
+       control reg33 (%c1): undefined
+       control reg34 (%c2): undefined
+       control reg35 (%c3): undefined
+       control reg36 (%c4): undefined
+       control reg37 (%c5): undefined
+       control reg38 (%c6): undefined
+       control reg39 (%c7): undefined
+       control reg40 (%c8): undefined
+       control reg41 (%c9): undefined
+       control reg42 (%c10): undefined
+       control reg43 (%c11): undefined
+       control reg44 (%c12): undefined
+       control reg45 (%c13): undefined
+       control reg46 (%c14): undefined
+       control reg47 (%c15): undefined
+       access reg48 (%a0): undefined
+       access reg49 (%a1): undefined
+       access reg50 (%a2): undefined
+       access reg51 (%a3): undefined
+       access reg52 (%a4): undefined
+       access reg53 (%a5): undefined
+       access reg54 (%a6): undefined
+       access reg55 (%a7): undefined
+       access reg56 (%a8): undefined
+       access reg57 (%a9): undefined
+       access reg58 (%a10): undefined
+       access reg59 (%a11): undefined
+       access reg60 (%a12): undefined
+       access reg61 (%a13): undefined
+       access reg62 (%a14): undefined
+       access reg63 (%a15): undefined
+       control reg64 (%pswm): undefined
+       control reg65 (%pswa): undefined
+handle_cfi no CFI (.debug_frame): no error
+EOF
+
+# EM_S390 (ELFCLASS64) (function bar 0x0000000080000510)
+# Note. Only in .eh_frame, there is no .debug_frame.
+# Same as s390 above but without -m31.
+testfiles testfiles390x
+testrun_compare ${abs_builddir}/addrcfi -e testfiles390x 0x0000000080000510 <<\EOF
+.eh_frame has 0x80000510 => [0x80000510, 0x80000524):
+       return address in reg14
+       CFA location expression: bregx(15,160)
+       integer reg0 (%r0): undefined
+       integer reg1 (%r1): undefined
+       integer reg2 (%r2): undefined
+       integer reg3 (%r3): undefined
+       integer reg4 (%r4): undefined
+       integer reg5 (%r5): undefined
+       integer reg6 (%r6): same_value
+       integer reg7 (%r7): same_value
+       integer reg8 (%r8): same_value
+       integer reg9 (%r9): same_value
+       integer reg10 (%r10): same_value
+       integer reg11 (%r11): same_value
+       integer reg12 (%r12): same_value
+       integer reg13 (%r13): same_value
+       integer reg14 (%r14): same_value
+       integer reg15 (%r15): same_value
+       FPU reg16 (%f0): undefined
+       FPU reg17 (%f2): undefined
+       FPU reg18 (%f4): undefined
+       FPU reg19 (%f6): undefined
+       FPU reg20 (%f1): undefined
+       FPU reg21 (%f3): undefined
+       FPU reg22 (%f5): undefined
+       FPU reg23 (%f7): undefined
+       FPU reg24 (%f8): same_value
+       FPU reg25 (%f10): same_value
+       FPU reg26 (%f12): same_value
+       FPU reg27 (%f14): same_value
+       FPU reg28 (%f9): same_value
+       FPU reg29 (%f11): same_value
+       FPU reg30 (%f13): same_value
+       FPU reg31 (%f15): same_value
+       control reg32 (%c0): undefined
+       control reg33 (%c1): undefined
+       control reg34 (%c2): undefined
+       control reg35 (%c3): undefined
+       control reg36 (%c4): undefined
+       control reg37 (%c5): undefined
+       control reg38 (%c6): undefined
+       control reg39 (%c7): undefined
+       control reg40 (%c8): undefined
+       control reg41 (%c9): undefined
+       control reg42 (%c10): undefined
+       control reg43 (%c11): undefined
+       control reg44 (%c12): undefined
+       control reg45 (%c13): undefined
+       control reg46 (%c14): undefined
+       control reg47 (%c15): undefined
+       access reg48 (%a0): undefined
+       access reg49 (%a1): undefined
+       access reg50 (%a2): undefined
+       access reg51 (%a3): undefined
+       access reg52 (%a4): undefined
+       access reg53 (%a5): undefined
+       access reg54 (%a6): undefined
+       access reg55 (%a7): undefined
+       access reg56 (%a8): undefined
+       access reg57 (%a9): undefined
+       access reg58 (%a10): undefined
+       access reg59 (%a11): undefined
+       access reg60 (%a12): undefined
+       access reg61 (%a13): undefined
+       access reg62 (%a14): undefined
+       access reg63 (%a15): undefined
+       control reg64 (%pswm): undefined
+       control reg65 (%pswa): undefined
+handle_cfi no CFI (.debug_frame): no error
+EOF
+
+# EM_ARM (function bar 0x00008510)
+# Note. Only in .debug_frame, the .eh_frame is actually empty.
+# Same as s390 and ppc above.
+testfiles testfilearm
+testrun_compare ${abs_builddir}/addrcfi -e testfilearm 0x00008510 <<\EOF
+dwarf_cfi_addrframe (.eh_frame): no matching address range
+.debug_frame has 0x8510 => [0x8510, 0x8524):
+       return address in reg14
+       CFA location expression: bregx(13)
+       integer reg0 (r0): undefined
+       integer reg1 (r1): undefined
+       integer reg2 (r2): undefined
+       integer reg3 (r3): undefined
+       integer reg4 (r4): same_value
+       integer reg5 (r5): same_value
+       integer reg6 (r6): same_value
+       integer reg7 (r7): same_value
+       integer reg8 (r8): same_value
+       integer reg9 (r9): undefined
+       integer reg10 (r10): same_value
+       integer reg11 (r11): same_value
+       integer reg12 (r12): undefined
+       integer reg13 (sp): location expression: call_frame_cfa stack_value
+       integer reg14 (lr): same_value
+       integer reg15 (pc): location expression: regx(14)
+       FPA reg16 (f0): undefined
+       FPA reg17 (f1): undefined
+       FPA reg18 (f2): undefined
+       FPA reg19 (f3): undefined
+       FPA reg20 (f4): undefined
+       FPA reg21 (f5): undefined
+       FPA reg22 (f6): undefined
+       FPA reg23 (f7): undefined
+       FPA reg96 (f0): undefined
+       FPA reg97 (f1): undefined
+       FPA reg98 (f2): undefined
+       FPA reg99 (f3): undefined
+       FPA reg100 (f4): undefined
+       FPA reg101 (f5): undefined
+       FPA reg102 (f6): undefined
+       FPA reg103 (f7): undefined
+       integer reg128 (spsr): undefined
+       VFP reg256 (d0): undefined
+       VFP reg257 (d1): undefined
+       VFP reg258 (d2): undefined
+       VFP reg259 (d3): undefined
+       VFP reg260 (d4): undefined
+       VFP reg261 (d5): undefined
+       VFP reg262 (d6): undefined
+       VFP reg263 (d7): undefined
+       VFP reg264 (d8): same_value
+       VFP reg265 (d9): same_value
+       VFP reg266 (d10): same_value
+       VFP reg267 (d11): same_value
+       VFP reg268 (d12): same_value
+       VFP reg269 (d13): same_value
+       VFP reg270 (d14): same_value
+       VFP reg271 (d15): same_value
+       VFP reg272 (d16): undefined
+       VFP reg273 (d17): undefined
+       VFP reg274 (d18): undefined
+       VFP reg275 (d19): undefined
+       VFP reg276 (d20): undefined
+       VFP reg277 (d21): undefined
+       VFP reg278 (d22): undefined
+       VFP reg279 (d23): undefined
+       VFP reg280 (d24): undefined
+       VFP reg281 (d25): undefined
+       VFP reg282 (d26): undefined
+       VFP reg283 (d27): undefined
+       VFP reg284 (d28): undefined
+       VFP reg285 (d29): undefined
+       VFP reg286 (d30): undefined
+       VFP reg287 (d31): undefined
+EOF
+
+# EM_AARCH64 (function bar 0x400550)
+# Same as arm, 390 and ppc above.
+# Note missing coverage in .eh_frame.
+testfiles testfileaarch64
+testrun_compare ${abs_builddir}/addrcfi -e testfileaarch64 0x400550 <<\EOF
+dwarf_cfi_addrframe (.eh_frame): no matching address range
+.debug_frame has 0x400550 => [0x400550, 0x400568):
+       return address in reg30
+       CFA location expression: bregx(31)
+       integer reg0 (x0): undefined
+       integer reg1 (x1): undefined
+       integer reg2 (x2): undefined
+       integer reg3 (x3): undefined
+       integer reg4 (x4): undefined
+       integer reg5 (x5): undefined
+       integer reg6 (x6): undefined
+       integer reg7 (x7): undefined
+       integer reg8 (x8): undefined
+       integer reg9 (x9): undefined
+       integer reg10 (x10): undefined
+       integer reg11 (x11): undefined
+       integer reg12 (x12): undefined
+       integer reg13 (x13): undefined
+       integer reg14 (x14): undefined
+       integer reg15 (x15): undefined
+       integer reg16 (x16): undefined
+       integer reg17 (x17): undefined
+       integer reg18 (x18): undefined
+       integer reg19 (x19): same_value
+       integer reg20 (x20): same_value
+       integer reg21 (x21): same_value
+       integer reg22 (x22): same_value
+       integer reg23 (x23): same_value
+       integer reg24 (x24): same_value
+       integer reg25 (x25): same_value
+       integer reg26 (x26): same_value
+       integer reg27 (x27): same_value
+       integer reg28 (x28): same_value
+       integer reg29 (x29): same_value
+       integer reg30 (x30): same_value
+       integer reg31 (sp): undefined
+       integer reg33 (elr): undefined
+       FP/SIMD reg64 (v0): undefined
+       FP/SIMD reg65 (v1): undefined
+       FP/SIMD reg66 (v2): undefined
+       FP/SIMD reg67 (v3): undefined
+       FP/SIMD reg68 (v4): undefined
+       FP/SIMD reg69 (v5): undefined
+       FP/SIMD reg70 (v6): undefined
+       FP/SIMD reg71 (v7): undefined
+       FP/SIMD reg72 (v8): same_value
+       FP/SIMD reg73 (v9): same_value
+       FP/SIMD reg74 (v10): same_value
+       FP/SIMD reg75 (v11): same_value
+       FP/SIMD reg76 (v12): same_value
+       FP/SIMD reg77 (v13): same_value
+       FP/SIMD reg78 (v14): same_value
+       FP/SIMD reg79 (v15): same_value
+       FP/SIMD reg80 (v16): undefined
+       FP/SIMD reg81 (v17): undefined
+       FP/SIMD reg82 (v18): undefined
+       FP/SIMD reg83 (v19): undefined
+       FP/SIMD reg84 (v20): undefined
+       FP/SIMD reg85 (v21): undefined
+       FP/SIMD reg86 (v22): undefined
+       FP/SIMD reg87 (v23): undefined
+       FP/SIMD reg88 (v24): undefined
+       FP/SIMD reg89 (v25): undefined
+       FP/SIMD reg90 (v26): undefined
+       FP/SIMD reg91 (v27): undefined
+       FP/SIMD reg92 (v28): undefined
+       FP/SIMD reg93 (v29): undefined
+       FP/SIMD reg94 (v30): undefined
+       FP/SIMD reg95 (v31): undefined
+EOF
index 3531643..f954ee4 100755 (executable)
@@ -19,7 +19,7 @@
 
 testfiles testfile34 testfile38 testfile41 testfile49
 
-testrun_compare ../src/addr2line -f -e testfile34 \
+testrun_compare ${abs_top_builddir}/src/addr2line -f -e testfile34 \
                                 0x08048074 0x08048075 0x08048076 \
                                 0x08049078 0x08048080 0x08049080 <<\EOF
 foo
@@ -36,7 +36,7 @@ _end
 ??:0
 EOF
 
-testrun_compare ../src/addr2line -S -e testfile38 0x02 0x10a 0x211 0x31a <<\EOF
+testrun_compare ${abs_top_builddir}/src/addr2line -S -e testfile38 0x02 0x10a 0x211 0x31a <<\EOF
 t1_global_outer+0x2
 ??:0
 t2_global_symbol+0x2
@@ -47,7 +47,7 @@ t3_global_after_0+0x1
 ??:0
 EOF
 
-testrun_compare ../src/addr2line -S -e testfile41 0x1 0x104 <<\EOF
+testrun_compare ${abs_top_builddir}/src/addr2line -S -e testfile41 0x1 0x104 <<\EOF
 small_global_at_large_global+0x1
 ??:0
 small_global_first_at_large_global+0x1
@@ -69,7 +69,7 @@ cat > testmaps <<EOF
 ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
 EOF
 
-testrun_compare ../src/addr2line -S -M testmaps 0x40047c 0x10009db <<\EOF
+testrun_compare ${abs_top_builddir}/src/addr2line -S -M testmaps 0x40047c 0x10009db <<\EOF
 caller+0x14
 /home/drepper/local/elfutils-build/20050425/v.c:11
 foo+0xb
@@ -135,7 +135,7 @@ EOF
 #      nop #10
 #      .size local_outer, . - local_outer
 #      nop #11
-testrun_compare ../src/addr2line -S -e testfile49 \
+testrun_compare ${abs_top_builddir}/src/addr2line -S -e testfile49 \
                0 1 2 3 4 5 6 7 8 9 \
                0x100 0x101 0x102 0x103 0x104 0x105 \
                0x106 0x107 0x108 0x109 0x10a 0x10b \
@@ -211,4 +211,150 @@ local_outer+0x9
 ??:0
 EOF
 
+#      .macro global label size
+#\label:       .globl \label
+#      .size \label, \size
+#      .endm
+#      .macro weak label size
+#\label:       .weak \label
+#      .size \label, \size
+#      .endm
+#      .macro local label size
+#\label:       .size \label, \size
+#      .endm
+#      .macro offset val
+#      .ifne (. - _start) - \val
+#      .err
+#      .endif
+#      .byte \val
+#      .endm
+#
+#_start:
+#      offset 0
+#
+#      local glocal, 1
+#      weak gweak, 1
+#      global gglobal1, 2
+#      global gglobal2, 1
+#      global gglobal3, 1
+#      offset 1
+#      /* Symbols end here.  */
+#      offset 2
+#      /* gglobal1 ends here.  */
+#      offset 3
+#
+#      local g0local, 0
+#      weak g0weak, 0
+#      global g0global1, 0
+#      global g0global2, 0
+#      offset 4
+#
+#      local wlocal, 1
+#      weak wweak1, 2
+#      weak wweak2, 1
+#      weak wweak3, 1
+#      offset 5
+#      /* Symbols end here.  */
+#      offset 6
+#      /* wweak1 ends here.  */
+#      offset 7
+#
+#      local w0local, 0
+#      weak w0weak1, 0
+#      weak w0weak2, 0
+#      offset 8
+#
+#      local llocal1, 2
+#      local llocal2, 1
+#      local llocal3, 1
+#      offset 9
+#      /* Symbols end here.  */
+#      offset 10
+#      /* llocal1 ends here.  */
+#      offset 11
+#
+#      local l0local1, 0
+#      local l0local2, 0
+#      offset 12
+testfiles testfile64
+testrun_compare ${abs_top_builddir}/src/addr2line -S -e testfile64 1 4 5 8 9 12 <<\EOF
+gglobal2
+??:0
+g0global2
+??:0
+wweak2
+??:0
+w0weak2
+??:0
+llocal2
+??:0
+l0local2
+??:0
+EOF
+
+testfiles testfile65
+testrun_compare ${abs_top_builddir}/src/addr2line -S --core=testfile65 0x7fff94bffa30 <<\EOF
+__vdso_time
+??:0
+EOF
+
+#      .section        ".text"
+#      .globl _start
+#      .section        ".opd","aw"
+#_start:       .quad   .L._start,.TOC.@tocbase
+#      .previous
+#      .type   _start, @function
+#.L._start:
+#      .byte   0x7d, 0x82, 0x10, 0x08
+#      .size   _start,.-.L._start
+testfiles testfile66 testfile66.core
+testrun_compare ${abs_top_builddir}/src/addr2line -x -e testfile66 _start 0x2d8 0x2db 0x2dc 0x103d0 0x103d3 0x103d4<<EOF
+_start (.text)
+??:0
+_start (.text)
+??:0
+_start+0x3 (.text)
+??:0
+()+0x2dc
+??:0
+_start (.opd)
+??:0
+_start+0x3 (.opd)
+??:0
+()+0x103d4
+??:0
+EOF
+testrun_compare ${abs_top_builddir}/src/addr2line -x -e testfile66 --core=testfile66.core _start 0x461b02d8 0x461c03d0<<\EOF
+_start (.text)
+??:0
+_start (.text)
+??:0
+_start (.opd)
+??:0
+EOF
+
+testfiles testfile69.core testfile69.so
+testrun_compare ${abs_top_builddir}/src/addr2line --core=./testfile69.core -S 0x7f0bc6a33535 0x7f0bc6a33546 <<\EOF
+libstatic+0x9
+??:0
+libglobal+0x9
+??:0
+EOF
+
+testfiles testfile70.exec testfile70.core
+testrun_compare ${abs_top_builddir}/src/addr2line -S -e testfile70.exec --core=testfile70.core 0x7ff2cfe9b6b5 <<\EOF
+main+0x9
+??:0
+EOF
+testrun_compare ${abs_top_builddir}/src/addr2line -S --core=testfile70.core -e testfile70.exec 0x7ff2cfe9b6b5 <<\EOF
+main+0x9
+??:0
+EOF
+
+testfiles test-core-lib.so test-core.core test-core.exec
+testrun_compare ${abs_top_builddir}/src/addr2line -S -e test-core.exec --core=test-core.core 0x7f67f2aaf619 <<\EOF
+libfunc+0x9
+??:0
+EOF
+
 exit 0
index 38b9d88..4f5c9d7 100755 (executable)
@@ -19,7 +19,7 @@
 
 testfiles testfile22
 
-testrun_compare ./addrscopes -e testfile22 0x8048353 <<\EOF
+testrun_compare ${abs_builddir}/addrscopes -e testfile22 0x8048353 <<\EOF
 0x8048353:
     tests/foo.c (0x11): 0x8048348 (tests/foo.c:5) .. 0x804837e (tests/foo.c:16)
         global                        [    be]
@@ -30,7 +30,7 @@ EOF
 test_cleanup
 
 testfiles testfile24
-testrun_compare ./addrscopes -e testfile24 0x804834e <<\EOF
+testrun_compare ${abs_builddir}/addrscopes -e testfile24 0x804834e <<\EOF
 0x804834e:
     inline-test.c (0x11): 0x8048348 (/home/roland/build/stock-elfutils/inline-test.c:7) .. 0x8048364 (/home/roland/build/stock-elfutils/inline-test.c:16)
         add (0x1d): 0x804834e (/home/roland/build/stock-elfutils/inline-test.c:3) .. 0x8048350 (/home/roland/build/stock-elfutils/inline-test.c:9)
index d8b87c2..6a9a9ec 100755 (executable)
 
 . $srcdir/test-subr.sh
 
+tempfiles testfile-alldts
+
 # This will produce "testfile-alldts" file
-testrun ./alldts
+testrun ${abs_builddir}/alldts
 
-testrun_compare ../src/readelf -d testfile-alldts <<\EOF
+testrun_compare ${abs_top_builddir}/src/readelf -d testfile-alldts <<\EOF
 
 Dynamic segment contains 66 entries:
  Addr: 0x000001a0  Offset: 0x000078  Link to section: [ 0] ''
@@ -93,6 +95,4 @@ Dynamic segment contains 66 entries:
   FILTER            0xdeadbeef
 EOF
 
-rm -f testfile-alldts
-
 exit 0
diff --git a/tests/run-allfcts-multi.sh b/tests/run-allfcts-multi.sh
new file mode 100755 (executable)
index 0000000..727b76e
--- /dev/null
@@ -0,0 +1,56 @@
+#! /bin/sh
+# Copyright (C) 2013 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
+
+# See run-readelf-dwz-multi.sh
+testfiles libtestfile_multi_shared.so testfile_multi_main testfile_multi.dwz
+testfiles testfile-dwzstr testfile-dwzstr.multi
+
+testrun_compare ${abs_builddir}/allfcts testfile_multi_main libtestfile_multi_shared.so testfile-dwzstr <<\EOF
+/home/mark/src/tests/dwz/main.c:3:main
+/home/mark/src/tests/dwz/shared.c:3:call_foo
+/home/mark/src/tests/main.c:8:main
+EOF
+
+# - test-offset-loop.c
+#
+# #include <stdbool.h>
+# #include <string.h>
+# #include <errno.h>
+# void padding (int x, int y, int z) { }
+# static inline bool is_error (int err) { return err != 0; }
+# static inline int get_errno (void) { return errno; }
+# int main () { return is_error (get_errno ()); }
+#
+# gcc -g -O2 test-offset-loop.c -o test-offset-loop
+# cp test-offset-loop test-offset-loop2
+# dwz test-offset-loop test-offset-loop2 -m test-offset-loop.alt
+
+testfiles test-offset-loop test-offset-loop.alt
+tempfiles allfcts.out
+
+# Use head to capture output because the output could be infinite...
+testrun ${abs_builddir}/allfcts test-offset-loop | head -n 20 > allfcts.out
+testrun_compare cat allfcts.out <<\EOF
+/tmp/test-offset-loop.c:6:get_errno
+/tmp/test-offset-loop.c:5:is_error
+/tmp/test-offset-loop.c:4:padding
+/tmp/test-offset-loop.c:7:main
+EOF
+
+exit 0
index 4d0ec61..6eaf13c 100755 (executable)
@@ -1,5 +1,5 @@
 #! /bin/sh
-# Copyright (C) 2005 Red Hat, Inc.
+# Copyright (C) 2005, 2013 Red Hat, Inc.
 # This file is part of elfutils.
 # Written by Ulrich Drepper <drepper@redhat.com>, 2005.
 #
@@ -20,7 +20,7 @@
 
 testfiles testfile testfile2 testfile8
 
-testrun_compare ./allfcts testfile testfile2 testfile8 <<\EOF
+testrun_compare ${abs_builddir}/allfcts testfile testfile2 testfile8 <<\EOF
 /home/drepper/gnu/new-bu/build/ttt/m.c:5:main
 /home/drepper/gnu/new-bu/build/ttt/b.c:4:bar
 /home/drepper/gnu/new-bu/build/ttt/f.c:3:foo
@@ -37,4 +37,58 @@ testrun_compare ./allfcts testfile testfile2 testfile8 <<\EOF
 /home/drepper/gnu/elfutils/build/src/../../src/strip.c:313:handle_elf
 EOF
 
+# = nested_funcs.c =
+#
+# static int
+# foo (int x)
+# {
+#   int bar (int y)
+#   {
+#     return x - y;
+#   }
+# 
+#   return bar (x * 2);
+# }
+#
+# int
+# main (int argc, char ** argv)
+# {
+#   return foo (argc);
+# }
+#
+# gcc -g -o nested_funcs nested_funcs.c
+
+# = class_func.cxx =
+#
+# namespace foobar
+# {
+#   class Foo
+#   {
+#   public:
+#     int bar(int x);
+#   };
+#
+#   int Foo::bar(int x) { return x - 42; }
+# };
+#
+# int
+# main (int argc, char **argv)
+# {
+#   foobar::Foo foo;
+#
+#   return foo.bar (42);
+# }
+#
+# clang++ -g -o class_func class_func.cxx
+
+testfiles testfile_nested_funcs testfile_class_func
+
+testrun_compare ${abs_builddir}/allfcts testfile_nested_funcs testfile_class_func <<\EOF
+/home/mark/src/tests/nested/nested_funcs.c:2:foo
+/home/mark/src/tests/nested/nested_funcs.c:4:bar
+/home/mark/src/tests/nested/nested_funcs.c:13:main
+/home/mark/src/tests/nested/class_func.cxx:6:bar
+/home/mark/src/tests/nested/class_func.cxx:13:main
+EOF
+
 exit 0
index 0965715..6f3862e 100755 (executable)
@@ -1,5 +1,5 @@
 #! /bin/sh
-# Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+# Copyright (C) 2005, 2006, 2007, 2012, 2013 Red Hat, Inc.
 # This file is part of elfutils.
 #
 # This file is free software; you can redistribute it and/or modify
@@ -22,7 +22,7 @@ regs_test()
   tempfiles good.regs
   cat > good.regs
   testfiles "$@"
-  for f; do testrun_compare ./allregs -e $f < good.regs; done
+  for f; do testrun_compare ${abs_builddir}/allregs -e $f < good.regs; done
   test_cleanup
 }
 
@@ -2653,4 +2653,147 @@ integer registers:
         64: pc (pc), address 64 bits
 EOF
 
+regs_test testfile61 <<\EOF
+integer registers:
+         0: r0 (r0), signed 32 bits
+         1: r1 (r1), signed 32 bits
+         2: r2 (r2), signed 32 bits
+         3: r3 (r3), signed 32 bits
+         4: r4 (r4), signed 32 bits
+         5: r5 (r5), signed 32 bits
+         6: r6 (r6), signed 32 bits
+         7: r7 (r7), signed 32 bits
+         8: r8 (r8), signed 32 bits
+         9: r9 (r9), signed 32 bits
+        10: r10 (r10), signed 32 bits
+        11: r11 (r11), signed 32 bits
+        12: r12 (r12), signed 32 bits
+        13: sp (sp), address 32 bits
+        14: lr (lr), address 32 bits
+        15: pc (pc), address 32 bits
+       128: spsr (spsr), unsigned 32 bits
+FPA registers:
+        16: f0 (f0), float 96 bits
+        17: f1 (f1), float 96 bits
+        18: f2 (f2), float 96 bits
+        19: f3 (f3), float 96 bits
+        20: f4 (f4), float 96 bits
+        21: f5 (f5), float 96 bits
+        22: f6 (f6), float 96 bits
+        23: f7 (f7), float 96 bits
+        96: f0 (f0), float 96 bits
+        97: f1 (f1), float 96 bits
+        98: f2 (f2), float 96 bits
+        99: f3 (f3), float 96 bits
+       100: f4 (f4), float 96 bits
+       101: f5 (f5), float 96 bits
+       102: f6 (f6), float 96 bits
+       103: f7 (f7), float 96 bits
+VFP registers:
+       256: d0 (d0), float 64 bits
+       257: d1 (d1), float 64 bits
+       258: d2 (d2), float 64 bits
+       259: d3 (d3), float 64 bits
+       260: d4 (d4), float 64 bits
+       261: d5 (d5), float 64 bits
+       262: d6 (d6), float 64 bits
+       263: d7 (d7), float 64 bits
+       264: d8 (d8), float 64 bits
+       265: d9 (d9), float 64 bits
+       266: d10 (d10), float 64 bits
+       267: d11 (d11), float 64 bits
+       268: d12 (d12), float 64 bits
+       269: d13 (d13), float 64 bits
+       270: d14 (d14), float 64 bits
+       271: d15 (d15), float 64 bits
+       272: d16 (d16), float 64 bits
+       273: d17 (d17), float 64 bits
+       274: d18 (d18), float 64 bits
+       275: d19 (d19), float 64 bits
+       276: d20 (d20), float 64 bits
+       277: d21 (d21), float 64 bits
+       278: d22 (d22), float 64 bits
+       279: d23 (d23), float 64 bits
+       280: d24 (d24), float 64 bits
+       281: d25 (d25), float 64 bits
+       282: d26 (d26), float 64 bits
+       283: d27 (d27), float 64 bits
+       284: d28 (d28), float 64 bits
+       285: d29 (d29), float 64 bits
+       286: d30 (d30), float 64 bits
+       287: d31 (d31), float 64 bits
+EOF
+
+# See run-readelf-mixed-corenote.sh for instructions to regenerate
+# this core file.
+regs_test testfile_aarch64_core <<\EOF
+integer registers:
+         0: x0 (x0), signed 64 bits
+         1: x1 (x1), signed 64 bits
+         2: x2 (x2), signed 64 bits
+         3: x3 (x3), signed 64 bits
+         4: x4 (x4), signed 64 bits
+         5: x5 (x5), signed 64 bits
+         6: x6 (x6), signed 64 bits
+         7: x7 (x7), signed 64 bits
+         8: x8 (x8), signed 64 bits
+         9: x9 (x9), signed 64 bits
+        10: x10 (x10), signed 64 bits
+        11: x11 (x11), signed 64 bits
+        12: x12 (x12), signed 64 bits
+        13: x13 (x13), signed 64 bits
+        14: x14 (x14), signed 64 bits
+        15: x15 (x15), signed 64 bits
+        16: x16 (x16), signed 64 bits
+        17: x17 (x17), signed 64 bits
+        18: x18 (x18), signed 64 bits
+        19: x19 (x19), signed 64 bits
+        20: x20 (x20), signed 64 bits
+        21: x21 (x21), signed 64 bits
+        22: x22 (x22), signed 64 bits
+        23: x23 (x23), signed 64 bits
+        24: x24 (x24), signed 64 bits
+        25: x25 (x25), signed 64 bits
+        26: x26 (x26), signed 64 bits
+        27: x27 (x27), signed 64 bits
+        28: x28 (x28), signed 64 bits
+        29: x29 (x29), signed 64 bits
+        30: x30 (x30), signed 64 bits
+        31: sp (sp), address 64 bits
+        33: elr (elr), address 64 bits
+FP/SIMD registers:
+        64: v0 (v0), unsigned 128 bits
+        65: v1 (v1), unsigned 128 bits
+        66: v2 (v2), unsigned 128 bits
+        67: v3 (v3), unsigned 128 bits
+        68: v4 (v4), unsigned 128 bits
+        69: v5 (v5), unsigned 128 bits
+        70: v6 (v6), unsigned 128 bits
+        71: v7 (v7), unsigned 128 bits
+        72: v8 (v8), unsigned 128 bits
+        73: v9 (v9), unsigned 128 bits
+        74: v10 (v10), unsigned 128 bits
+        75: v11 (v11), unsigned 128 bits
+        76: v12 (v12), unsigned 128 bits
+        77: v13 (v13), unsigned 128 bits
+        78: v14 (v14), unsigned 128 bits
+        79: v15 (v15), unsigned 128 bits
+        80: v16 (v16), unsigned 128 bits
+        81: v17 (v17), unsigned 128 bits
+        82: v18 (v18), unsigned 128 bits
+        83: v19 (v19), unsigned 128 bits
+        84: v20 (v20), unsigned 128 bits
+        85: v21 (v21), unsigned 128 bits
+        86: v22 (v22), unsigned 128 bits
+        87: v23 (v23), unsigned 128 bits
+        88: v24 (v24), unsigned 128 bits
+        89: v25 (v25), unsigned 128 bits
+        90: v26 (v26), unsigned 128 bits
+        91: v27 (v27), unsigned 128 bits
+        92: v28 (v28), unsigned 128 bits
+        93: v29 (v29), unsigned 128 bits
+        94: v30 (v30), unsigned 128 bits
+        95: v31 (v31), unsigned 128 bits
+EOF
+
 exit 0
index 668b363..44f4a52 100755 (executable)
 
 tempfiles arextract.test
 
-archive=../libelf/libelf.a
+archive=${abs_top_builddir}/libelf/libelf.a
 if test -f $archive; then
     # The file is really available (i.e., no shared-only built).
     echo -n "Extracting symbols... $ac_c"
 
     # The files we are looking at.
-    for f in ../libelf/*.o; do
-       testrun ./arextract $archive `basename $f` arextract.test || exit 1
+    for f in ${abs_top_builddir}/libelf/*.o; do
+       testrun ${abs_builddir}/arextract $archive `basename $f` arextract.test || exit 1
        cmp $f arextract.test || {
            echo "Extraction of $1 failed"
            exit 1
index 89c7821..b0fdfcd 100755 (executable)
@@ -18,7 +18,7 @@
 
 . $srcdir/test-subr.sh
 
-lib=../libelf/libelf.a
+lib=${abs_top_builddir}/libelf/libelf.a
 okfile=arsymtest.ok
 tmpfile=arsymtest.tmp
 testfile=arsymtest.test
@@ -28,12 +28,12 @@ tempfiles $okfile $tmpfile $testfile
 result=77
 if test -f $lib; then
     # Generate list using `nm' we check against.
-    nm -s $lib |
+    ${NM} -s $lib |
     sed -e '1,/^Arch/d' -e '/^$/,$d' |
     sort > $okfile
 
     # Now run our program using libelf.
-    testrun ./arsymtest $lib $tmpfile || exit 1
+    testrun ${abs_builddir}/arsymtest $lib $tmpfile || exit 1
     sort $tmpfile > $testfile
 
     # Compare the outputs.
diff --git a/tests/run-backtrace-core-aarch64.sh b/tests/run-backtrace-core-aarch64.sh
new file mode 100755 (executable)
index 0000000..a29a661
--- /dev/null
@@ -0,0 +1,23 @@
+#! /bin/bash
+# Copyright (C) 2013 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/backtrace-subr.sh
+
+# backtrace.aarch64.exe is a -static binary of backtrace-child.
+# backtrace.aarch64.core was generated by running the static backtrace-child
+# with --gencore.
+check_core aarch64
diff --git a/tests/run-backtrace-core-i386.sh b/tests/run-backtrace-core-i386.sh
new file mode 100755 (executable)
index 0000000..7294ec3
--- /dev/null
@@ -0,0 +1,20 @@
+#! /bin/bash
+# Copyright (C) 2013 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/backtrace-subr.sh
+
+check_core i386
diff --git a/tests/run-backtrace-core-ppc.sh b/tests/run-backtrace-core-ppc.sh
new file mode 100755 (executable)
index 0000000..65c9279
--- /dev/null
@@ -0,0 +1,20 @@
+#! /bin/bash
+# Copyright (C) 2013 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/backtrace-subr.sh
+
+check_core ppc
diff --git a/tests/run-backtrace-core-s390.sh b/tests/run-backtrace-core-s390.sh
new file mode 100755 (executable)
index 0000000..d3b6dc9
--- /dev/null
@@ -0,0 +1,20 @@
+#! /bin/bash
+# Copyright (C) 2013 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/backtrace-subr.sh
+
+check_core s390
diff --git a/tests/run-backtrace-core-s390x.sh b/tests/run-backtrace-core-s390x.sh
new file mode 100755 (executable)
index 0000000..c3e236d
--- /dev/null
@@ -0,0 +1,20 @@
+#! /bin/bash
+# Copyright (C) 2013 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/backtrace-subr.sh
+
+check_core s390x
diff --git a/tests/run-backtrace-core-x86_64.sh b/tests/run-backtrace-core-x86_64.sh
new file mode 100755 (executable)
index 0000000..d00cd6d
--- /dev/null
@@ -0,0 +1,20 @@
+#! /bin/bash
+# Copyright (C) 2013 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/backtrace-subr.sh
+
+check_core x86_64
diff --git a/tests/run-backtrace-data.sh b/tests/run-backtrace-data.sh
new file mode 100755 (executable)
index 0000000..34a4f01
--- /dev/null
@@ -0,0 +1,28 @@
+#! /bin/bash
+# Copyright (C) 2013 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/backtrace-subr.sh
+
+# This test really cannot be run under valgrind, it tries to introspect
+# its own maps and registers and will find valgrinds instead.
+unset VALGRIND_CMD
+
+tempfiles data.{bt,err}
+(set +ex; testrun ${abs_builddir}/backtrace-data 1>data.bt 2>data.err; true)
+cat data.{bt,err}
+check_unsupported data.err data
+check_all data.{bt,err} data
diff --git a/tests/run-backtrace-demangle.sh b/tests/run-backtrace-demangle.sh
new file mode 100755 (executable)
index 0000000..6e18e77
--- /dev/null
@@ -0,0 +1,46 @@
+#! /bin/bash
+# Copyright (C) 2014 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/>.
+
+if test -n "$ELFUTILS_DISABLE_DEMANGLE"; then
+  exit 77
+fi
+
+. $srcdir/backtrace-subr.sh
+
+child=testfile-backtrace-demangle
+testfiles $child{,.core}
+tempfiles $child.{bt,err}
+
+# There can be more than 3 frames, but depending on the system/installed
+# glibc we might not be able to unwind fully till the end.
+# cxxfunc -> f -> main
+# Expect to see the top two and a warning that there are more frames
+# (exit code 1)
+testrun ${abs_top_builddir}/src/stack -n 2 -e $child --core $child.core >$child.bt 2>$child.err || exitcode=$?
+cat $child.{bt,err}
+if test $exitcode != 1 || ! grep "shown max number of frames" $child.err; then
+  echo >&2 $2: expected more than 2 frames
+  false
+fi
+if ! grep -w f $child.bt; then
+  echo >&2 $2: no f
+  false
+fi
+if ! grep ' cxxfunc(int)' $child.bt; then
+  echo >&2 $2: no cxxfunc
+  false
+fi
diff --git a/tests/run-backtrace-dwarf.sh b/tests/run-backtrace-dwarf.sh
new file mode 100755 (executable)
index 0000000..8834048
--- /dev/null
@@ -0,0 +1,30 @@
+#! /bin/bash
+# Copyright (C) 2013 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/backtrace-subr.sh
+
+# This test really cannot be run under valgrind, it tries to introspect
+# itself through ptrace and will find bits and pieces of valgrind.
+# On top of that valgrind also tries to read all the unwind info and
+# will warn and complain about various opcodes it doesn't understand...
+unset VALGRIND_CMD
+
+tempfiles dwarf.{bt,err}
+(set +ex; testrun ${abs_builddir}/backtrace-dwarf 1>dwarf.bt 2>dwarf.err; true)
+cat dwarf.{bt,err}
+check_native_unsupported dwarf.err dwarf
+check_main dwarf.bt dwarf
diff --git a/tests/run-backtrace-native-biarch.sh b/tests/run-backtrace-native-biarch.sh
new file mode 100755 (executable)
index 0000000..3a407c8
--- /dev/null
@@ -0,0 +1,24 @@
+#! /bin/bash
+# Copyright (C) 2013 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/>.
+
+if test -n "$ELFUTILS_DISABLE_BIARCH"; then
+  exit 77
+fi
+
+. $srcdir/backtrace-subr.sh
+
+check_native backtrace-child-biarch
diff --git a/tests/run-backtrace-native-core-biarch.sh b/tests/run-backtrace-native-core-biarch.sh
new file mode 100755 (executable)
index 0000000..fbd8025
--- /dev/null
@@ -0,0 +1,24 @@
+#! /bin/bash
+# Copyright (C) 2013 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/>.
+
+if test -n "$ELFUTILS_DISABLE_BIARCH"; then
+  exit 77
+fi
+
+. $srcdir/backtrace-subr.sh
+
+check_native_core backtrace-child-biarch
diff --git a/tests/run-backtrace-native-core.sh b/tests/run-backtrace-native-core.sh
new file mode 100755 (executable)
index 0000000..cb025a5
--- /dev/null
@@ -0,0 +1,20 @@
+#! /bin/bash
+# Copyright (C) 2013 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/backtrace-subr.sh
+
+check_native_core backtrace-child
diff --git a/tests/run-backtrace-native.sh b/tests/run-backtrace-native.sh
new file mode 100755 (executable)
index 0000000..ddae345
--- /dev/null
@@ -0,0 +1,20 @@
+#! /bin/bash
+# Copyright (C) 2013 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/backtrace-subr.sh
+
+check_native backtrace-child
index f651051..1e78a18 100755 (executable)
@@ -19,7 +19,7 @@
 
 testfiles testfile28 testfile28.rdwr
 
-testrun ./rdwrmmap testfile28
+testrun ${abs_builddir}/rdwrmmap testfile28
 
 cmp testfile28 testfile28.rdwr
 
@@ -27,7 +27,7 @@ test_cleanup
 
 testfiles testfile29 testfile29.rdwr
 
-testrun ./rdwrmmap testfile29
+testrun ${abs_builddir}/rdwrmmap testfile29
 
 cmp testfile29 testfile29.rdwr
 
diff --git a/tests/run-buildid.sh b/tests/run-buildid.sh
new file mode 100755 (executable)
index 0000000..31cec24
--- /dev/null
@@ -0,0 +1,38 @@
+#! /bin/sh
+# Copyright (C) 2014 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
+
+# Just some random testfiles, four with, one without build-id,
+# and one without shdrs forcing reading the notes through phdrs.
+# eu-strip --strip-sections -g --output=testfile42_noshdrs testfile42
+# See also run-debugaltlink.sh.
+testfiles testfile42 testfile_multi.dwz testfile-dwzstr.multi \
+    test-offset-loop.alt testfile14 testfile42_noshdrs
+
+testrun_compare  ${abs_builddir}/buildid testfile42 testfile42_noshdrs \
+    testfile_multi.dwz testfile-dwzstr.multi \
+    test-offset-loop.alt testfile14 <<\EOF
+testfile42: build ID: d826d96c4d097bdc5c254b1f7344a907e36b0439
+testfile42_noshdrs: build ID: d826d96c4d097bdc5c254b1f7344a907e36b0439
+testfile_multi.dwz: build ID: a0d6c06e0d912d74033b6fe2808753cae8f6f594
+testfile-dwzstr.multi: build ID: 6da22627dae55c1d62cf9122827c665e240a056b
+test-offset-loop.alt: build ID: 066bbf1a7bc5676f5015ee1966a088f23bdb83ae
+testfile14: <no NT_GNU_BUILD_ID note>
+EOF
+
+exit 0
diff --git a/tests/run-debugaltlink.sh b/tests/run-debugaltlink.sh
new file mode 100755 (executable)
index 0000000..fa7dd26
--- /dev/null
@@ -0,0 +1,34 @@
+#! /bin/sh
+# Copyright (C) 2014 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
+
+# Just some random testfiles, four with, one without .gnu_debugaltlink
+testfiles testfile42 testfile_multi_main testfile-dwzstr \
+    test-offset-loop libtestfile_multi_shared.so
+
+testrun_compare  ${abs_builddir}/debugaltlink testfile42 \
+    testfile_multi_main testfile-dwzstr \
+    test-offset-loop libtestfile_multi_shared.so <<\EOF
+testfile42: <no .gnu_debugaltlink section>
+testfile_multi_main: testfile_multi.dwz, build ID: a0d6c06e0d912d74033b6fe2808753cae8f6f594
+testfile-dwzstr: testfile-dwzstr.multi, build ID: 6da22627dae55c1d62cf9122827c665e240a056b
+test-offset-loop: test-offset-loop.alt, build ID: 066bbf1a7bc5676f5015ee1966a088f23bdb83ae
+libtestfile_multi_shared.so: testfile_multi.dwz, build ID: a0d6c06e0d912d74033b6fe2808753cae8f6f594
+EOF
+
+exit 0
diff --git a/tests/run-debuglink.sh b/tests/run-debuglink.sh
new file mode 100755 (executable)
index 0000000..42a816c
--- /dev/null
@@ -0,0 +1,29 @@
+#! /bin/sh
+# Copyright (C) 2014 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
+
+# Just some random testfiles, two with, one without .gnu_debuglink
+testfiles testfile36 testfile52-32.so testfile42
+
+testrun_compare  ${abs_builddir}/debuglink testfile36 testfile52-32.so testfile42 <<\EOF
+testfile36: testfile36.debug, crc: 8c5c20a3
+testfile52-32.so: testfile52-32.so.debug, crc: b835a71d
+testfile42: <no gnu_debuglink file>
+EOF
+
+exit 0
index 96e14d9..a6be62b 100755 (executable)
@@ -23,6 +23,6 @@ case "`uname -m`" in
     tempfiles testfile45.o
     testfiles testfile45.S testfile45.expect
     gcc -m64 -c -o testfile45.o testfile45.S
-    testrun_compare ../src/objdump -d testfile45.o < testfile45.expect
+    testrun_compare ${abs_top_builddir}/src/objdump -d testfile45.o < testfile45.expect
     ;;
 esac
index 399664c..28a3df7 100755 (executable)
@@ -23,6 +23,6 @@ case "`uname -m`" in
     tempfiles testfile44.o
     testfiles testfile44.S testfile44.expect
     gcc -m32 -c -o testfile44.o testfile44.S
-    testrun_compare ../src/objdump -d testfile44.o < testfile44.expect
+    testrun_compare ${abs_top_builddir}/src/objdump -d testfile44.o < testfile44.expect
     ;;
 esac
index b748b0f..ddb58e8 100755 (executable)
@@ -19,7 +19,7 @@
 
 testfiles testfile51
 
-testrun_compare ./dwarf-getmacros testfile51 0xb <<\EOF
+testrun_compare ${abs_builddir}/dwarf-getmacros testfile51 0xb <<\EOF
 __STDC__ 1
 __STDC_HOSTED__ 1
 __GNUC__ 4
@@ -152,7 +152,7 @@ __DECIMAL_BID_FORMAT__ 1
 macro1 ble
 EOF
 
-testrun_compare ./dwarf-getmacros testfile51 0x84 <<\EOF
+testrun_compare ${abs_builddir}/dwarf-getmacros testfile51 0x84 <<\EOF
 __STDC__ 1
 __STDC_HOSTED__ 1
 __GNUC__ 4
index c765f75..f18f628 100755 (executable)
@@ -19,7 +19,7 @@
 
 testfiles testfile11
 
-testrun_compare ./dwarf-getstring testfile11 <<\EOF
+testrun_compare ${abs_builddir}/dwarf-getstring testfile11 <<\EOF
 _ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwS3_S3_
 itimerspec
 _G_int32_t
index 85424fd..80da008 100755 (executable)
 
 testfiles testfile43 testfile50
 
-testrun_compare ./dwfl-addr-sect -e testfile43 0x64 0x8 0x98 <<\EOF
+testrun_compare ${abs_builddir}/dwfl-addr-sect -e testfile43 0x64 0x8 0x98 <<\EOF
 address 0x64 => module "" section 4 + 0
 address 0x8 => module "" section 1 + 0x8
 address 0x98 => module "" section 7 + 0
 EOF
 
-testrun_compare ./dwfl-addr-sect -e testfile50 0x1 <<\EOF
+testrun_compare ${abs_builddir}/dwfl-addr-sect -e testfile50 0x1 <<\EOF
 address 0x1 => module "" section 1 + 0x1
 EOF
 
index 3e19a58..fa476c4 100755 (executable)
@@ -19,7 +19,7 @@
 
 testfiles testfile36 testfile36.debug
 
-testrun_compare ./dwflmodtest -e testfile36 <<\EOF
+testrun_compare ${abs_builddir}/dwflmodtest -e testfile36 <<\EOF
 module:                                00000000..00002308 testfile36 (null)
 module:                                00000000 DWARF 0 (no error)
 module:                                00000000..00002308 testfile36 testfile36.debug
diff --git a/tests/run-dwfl-report-elf-align.sh b/tests/run-dwfl-report-elf-align.sh
new file mode 100755 (executable)
index 0000000..3849753
--- /dev/null
@@ -0,0 +1,44 @@
+#! /bin/sh
+# Copyright (C) 2013 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-dwfl-report-elf-align-shlib.so
+
+# /proc/PID/maps when the process was running:
+# 7f3560c92000-7f3560c93000 r-xp 00000000 fd:02 25037063 testfile-dwfl-report-elf-align-shlib.so
+# 7f3560c93000-7f3560e92000 ---p 00001000 fd:02 25037063 testfile-dwfl-report-elf-align-shlib.so
+# 7f3560e92000-7f3560e93000 rw-p 00000000 fd:02 25037063 testfile-dwfl-report-elf-align-shlib.so
+# testfile-dwfl-report-elf-align-shlib.so:
+# Program Headers:
+#   Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
+#   LOAD           0x000000 0x0000000000000000 0x0000000000000000 0x00065c 0x00065c R E 0x200000
+#   LOAD           0x000660 0x0000000000200660 0x0000000000200660 0x0001f0 0x000200 RW  0x200000
+# Symbol table '.dynsym' contains 12 entries:
+#    Num:    Value          Size Type    Bind   Vis      Ndx Name
+#      8: 000000000000057c    11 FUNC    GLOBAL DEFAULT   11 shlib
+# GDB output showing proper relocation:
+# #1  0x00007f3560c92585 in shlib () from ./testfile-dwfl-report-elf-align-shlib.so
+#
+# 0x7f3560c92000 is VMA address of first byte of testfile-dwfl-report-elf-align-shlib.so.
+# 0x7f3560c92585 = 0x7f3560c92000 + 0x585
+# where 0x585 is any address inside the shlib function: 0x57c .. 0x57c + 11 -1
+
+testrun ${abs_builddir}/dwfl-report-elf-align ./testfile-dwfl-report-elf-align-shlib.so \
+                               0x7f3560c92000 0x7f3560c92585 shlib
+
+exit 0
diff --git a/tests/run-dwfllines.sh b/tests/run-dwfllines.sh
new file mode 100755 (executable)
index 0000000..b384de0
--- /dev/null
@@ -0,0 +1,88 @@
+#! /bin/sh
+# Copyright (C) 2013 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 testfile2
+
+testrun_compare ${abs_builddir}/dwfllines -e testfile <<\EOF
+mod:  CU: [b] m.c
+0 0x804842c /home/drepper/gnu/new-bu/build/ttt/m.c:5:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+1 0x8048432 /home/drepper/gnu/new-bu/build/ttt/m.c:6:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+2 0x804844d /home/drepper/gnu/new-bu/build/ttt/m.c:7:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+3 0x8048458 /home/drepper/gnu/new-bu/build/ttt/m.c:8:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+4 0x804845a /home/drepper/gnu/new-bu/build/ttt/m.c:8:0
+ time: 0, len: 0, idx: 0, b: 1, e: 1, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+mod:  CU: [ca] b.c
+0 0x804845c /home/drepper/gnu/new-bu/build/ttt/b.c:4:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+1 0x804845f /home/drepper/gnu/new-bu/build/ttt/b.c:5:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+2 0x8048464 /home/drepper/gnu/new-bu/build/ttt/b.c:6:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+3 0x8048466 /home/drepper/gnu/new-bu/build/ttt/b.c:6:0
+ time: 0, len: 0, idx: 0, b: 1, e: 1, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+mod:  CU: [15fc] f.c
+0 0x8048468 /home/drepper/gnu/new-bu/build/ttt/f.c:3:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+1 0x804846b /home/drepper/gnu/new-bu/build/ttt/f.c:4:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+2 0x8048470 /home/drepper/gnu/new-bu/build/ttt/f.c:5:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+3 0x8048472 /home/drepper/gnu/new-bu/build/ttt/f.c:5:0
+ time: 0, len: 0, idx: 0, b: 1, e: 1, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+EOF
+
+testrun_compare ${abs_builddir}/dwfllines -e testfile2 <<\EOF
+mod:  CU: [b] b.c
+0 0x10000470 /shoggoth/drepper/b.c:4:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+1 0x1000047c /shoggoth/drepper/b.c:5:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+2 0x10000480 /shoggoth/drepper/b.c:6:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+3 0x10000490 /shoggoth/drepper/b.c:6:0
+ time: 0, len: 0, idx: 0, b: 1, e: 1, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+mod:  CU: [97d] f.c
+0 0x10000490 /shoggoth/drepper/f.c:3:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+1 0x1000049c /shoggoth/drepper/f.c:4:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+2 0x100004a0 /shoggoth/drepper/f.c:5:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+3 0x100004b0 /shoggoth/drepper/f.c:5:0
+ time: 0, len: 0, idx: 0, b: 1, e: 1, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+mod:  CU: [9e4] m.c
+0 0x100004b0 /shoggoth/drepper/m.c:5:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+1 0x100004cc /shoggoth/drepper/m.c:6:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+2 0x100004e8 /shoggoth/drepper/m.c:7:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+3 0x100004f4 /shoggoth/drepper/m.c:8:0
+ time: 0, len: 0, idx: 0, b: 1, e: 0, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+4 0x10000514 /shoggoth/drepper/m.c:8:0
+ time: 0, len: 0, idx: 0, b: 1, e: 1, pe: 0, eb: 0, block: 0, isa: 0, disc: 0
+EOF
+
+testrun_on_self_quiet ${abs_builddir}/dwfllines -e
+
+exit 0
diff --git a/tests/run-dwflsyms.sh b/tests/run-dwflsyms.sh
new file mode 100755 (executable)
index 0000000..9726bcf
--- /dev/null
@@ -0,0 +1,826 @@
+#! /bin/sh
+# Copyright (C) 2013 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
+
+# Tests dwfl_module_{addrsym,getsym,relocate_address}
+# See run-readelf-s.sh for how to generate test binaries.
+# In addition, *_pl files were created from their base file
+# with prelink -N, and *_plr with prelink -r 0x4200000000.
+
+testfiles testfilebaztab
+testfiles testfilebazdbg testfilebazdbg.debug
+testfiles testfilebazdbg_pl
+testfiles testfilebazdbg_plr
+testfiles testfilebazdyn
+testfiles testfilebazmdb
+testfiles testfilebazmin
+testfiles testfilebazmin_pl
+testfiles testfilebazmin_plr
+testfiles testfilebasmin
+testfiles testfilebaxmin
+
+tempfiles testfile.dynsym.in testfile.symtab.in testfile.minsym.in dwflsyms.out
+tempfiles testfile.symtab_pl.in testfile.minsym_pl.in 
+
+cat > testfile.symtab.in <<\EOF
+   0: NOTYPE   LOCAL    (0) 0
+   1: SECTION  LOCAL    (0) 0x238
+   2: SECTION  LOCAL    (0) 0x254
+   3: SECTION  LOCAL    (0) 0x274
+   4: SECTION  LOCAL    (0) 0x298
+   5: SECTION  LOCAL    (0) 0x2d8
+   6: SECTION  LOCAL    (0) 0x428
+   7: SECTION  LOCAL    (0) 0x4f2
+   8: SECTION  LOCAL    (0) 0x510
+   9: SECTION  LOCAL    (0) 0x530
+  10: SECTION  LOCAL    (0) 0x638
+  11: SECTION  LOCAL    (0) 0x680
+  12: SECTION  LOCAL    (0) 0x6a0
+  13: SECTION  LOCAL    (0) 0x6e0
+  14: SECTION  LOCAL    (0) 0x8f4
+  15: SECTION  LOCAL    (0) 0x900
+  16: SECTION  LOCAL    (0) 0x904
+  17: SECTION  LOCAL    (0) 0x948
+  18: SECTION  LOCAL    (0) 0x200dd0
+  19: SECTION  LOCAL    (0) 0x200dd8
+  20: SECTION  LOCAL    (0) 0x200de0
+  21: SECTION  LOCAL    (0) 0x200de8
+  22: SECTION  LOCAL    (0) 0x200df0
+  23: SECTION  LOCAL    (0) 0x200fc0
+  24: SECTION  LOCAL    (0) 0x201000
+  25: SECTION  LOCAL    (0) 0x201030
+  26: SECTION  LOCAL    (0) 0x20103c
+  27: SECTION  LOCAL    (0) 0
+  28: SECTION  LOCAL    (0) 0
+  29: SECTION  LOCAL    (0) 0
+  30: SECTION  LOCAL    (0) 0
+  31: SECTION  LOCAL    (0) 0
+  32: SECTION  LOCAL    (0) 0
+  33: FILE     LOCAL   crtstuff.c (0) 0
+  34: OBJECT   LOCAL   __JCR_LIST__ (0) 0x200de0
+  35: FUNC     LOCAL   deregister_tm_clones (0) 0x710, rel: 0x710 (.text)
+  36: FUNC     LOCAL   register_tm_clones (0) 0x740, rel: 0x740 (.text)
+  37: FUNC     LOCAL   __do_global_dtors_aux (0) 0x780, rel: 0x780 (.text)
+  38: OBJECT   LOCAL   completed.6137 (1) 0x20103c
+  39: OBJECT   LOCAL   __do_global_dtors_aux_fini_array_entry (0) 0x200dd8
+  40: FUNC     LOCAL   frame_dummy (0) 0x7c0, rel: 0x7c0 (.text)
+  41: OBJECT   LOCAL   __frame_dummy_init_array_entry (0) 0x200dd0
+  42: FILE     LOCAL   foo.c (0) 0
+  43: FILE     LOCAL   bar.c (0) 0
+  44: OBJECT   LOCAL   b1 (4) 0x201034
+  45: FUNC     LOCAL   foo (20) 0x814, rel: 0x814 (.text)
+  46: FILE     LOCAL   crtstuff.c (0) 0
+  47: OBJECT   LOCAL   __FRAME_END__ (0) 0xa58
+  48: OBJECT   LOCAL   __JCR_END__ (0) 0x200de0
+  49: FILE     LOCAL    (0) 0
+  50: NOTYPE   LOCAL   __init_array_end (0) 0x200dd8
+  51: OBJECT   LOCAL   _DYNAMIC (0) 0x200df0
+  52: NOTYPE   LOCAL   __init_array_start (0) 0x200dd0
+  53: OBJECT   LOCAL   _GLOBAL_OFFSET_TABLE_ (0) 0x201000
+  54: FUNC     GLOBAL  __libc_csu_fini (2) 0x8f0, rel: 0x8f0 (.text)
+  55: NOTYPE   WEAK    _ITM_deregisterTMCloneTable (0) 0
+  56: NOTYPE   WEAK    data_start (0) 0x201030
+  57: NOTYPE   GLOBAL  _edata (0) 0x20103c
+  58: FUNC     GLOBAL  bar (44) 0x828, rel: 0x828 (.text)
+  59: FUNC     GLOBAL  _fini (0) 0x8f4, rel: 0x8f4 (.fini)
+  60: FUNC     GLOBAL  __libc_start_main@@GLIBC_2.2.5 (0) 0
+  61: NOTYPE   GLOBAL  __data_start (0) 0x201030
+  62: NOTYPE   WEAK    __gmon_start__ (0) 0
+  63: OBJECT   GLOBAL  __dso_handle (0) 0x200de8
+  64: OBJECT   GLOBAL  _IO_stdin_used (4) 0x900
+  65: OBJECT   GLOBAL  b2 (4) 0x201038
+  66: FUNC     GLOBAL  __libc_csu_init (137) 0x860, rel: 0x860 (.text)
+  67: NOTYPE   GLOBAL  _end (0) 0x201040
+  68: FUNC     GLOBAL  _start (0) 0x6e0, rel: 0x6e0 (.text)
+  69: NOTYPE   GLOBAL  __bss_start (0) 0x20103c
+  70: FUNC     GLOBAL  main (35) 0x7f0, rel: 0x7f0 (.text)
+  71: NOTYPE   WEAK    _Jv_RegisterClasses (0) 0
+  72: OBJECT   GLOBAL  __TMC_END__ (0) 0x201040
+  73: NOTYPE   WEAK    _ITM_registerTMCloneTable (0) 0
+  74: FUNC     WEAK    __cxa_finalize@@GLIBC_2.2.5 (0) 0
+  75: FUNC     GLOBAL  _init (0) 0x680, rel: 0x680 (.init)
+EOF
+
+cat > testfile.symtab_pl.in <<\EOF
+   0: NOTYPE   LOCAL    (0) 0
+   1: SECTION  LOCAL    (0) 0x3000000238
+   2: SECTION  LOCAL    (0) 0x3000000254
+   3: SECTION  LOCAL    (0) 0x3000000274
+   4: SECTION  LOCAL    (0) 0x3000000298
+   5: SECTION  LOCAL    (0) 0x30000002d8
+   6: SECTION  LOCAL    (0) 0x3000000428
+   7: SECTION  LOCAL    (0) 0x30000004f2
+   8: SECTION  LOCAL    (0) 0x3000000510
+   9: SECTION  LOCAL    (0) 0x3000000530
+  10: SECTION  LOCAL    (0) 0x3000000638
+  11: SECTION  LOCAL    (0) 0x3000000680
+  12: SECTION  LOCAL    (0) 0x30000006a0
+  13: SECTION  LOCAL    (0) 0x30000006e0
+  14: SECTION  LOCAL    (0) 0x30000008f4
+  15: SECTION  LOCAL    (0) 0x3000000900
+  16: SECTION  LOCAL    (0) 0x3000000904
+  17: SECTION  LOCAL    (0) 0x3000000948
+  18: SECTION  LOCAL    (0) 0x3000200dd0
+  19: SECTION  LOCAL    (0) 0x3000200dd8
+  20: SECTION  LOCAL    (0) 0x3000200de0
+  21: SECTION  LOCAL    (0) 0x3000200de8
+  22: SECTION  LOCAL    (0) 0x3000200df0
+  23: SECTION  LOCAL    (0) 0x3000200fc0
+  24: SECTION  LOCAL    (0) 0x3000201000
+  25: SECTION  LOCAL    (0) 0x3000201030
+  26: SECTION  LOCAL    (0) 0x300020103c
+  27: SECTION  LOCAL    (0) 0
+  28: SECTION  LOCAL    (0) 0
+  29: SECTION  LOCAL    (0) 0
+  30: SECTION  LOCAL    (0) 0
+  31: SECTION  LOCAL    (0) 0
+  32: SECTION  LOCAL    (0) 0
+  33: FILE     LOCAL   crtstuff.c (0) 0
+  34: OBJECT   LOCAL   __JCR_LIST__ (0) 0x3000200de0
+  35: FUNC     LOCAL   deregister_tm_clones (0) 0x3000000710, rel: 0x710 (.text)
+  36: FUNC     LOCAL   register_tm_clones (0) 0x3000000740, rel: 0x740 (.text)
+  37: FUNC     LOCAL   __do_global_dtors_aux (0) 0x3000000780, rel: 0x780 (.text)
+  38: OBJECT   LOCAL   completed.6137 (1) 0x300020103c
+  39: OBJECT   LOCAL   __do_global_dtors_aux_fini_array_entry (0) 0x3000200dd8
+  40: FUNC     LOCAL   frame_dummy (0) 0x30000007c0, rel: 0x7c0 (.text)
+  41: OBJECT   LOCAL   __frame_dummy_init_array_entry (0) 0x3000200dd0
+  42: FILE     LOCAL   foo.c (0) 0
+  43: FILE     LOCAL   bar.c (0) 0
+  44: OBJECT   LOCAL   b1 (4) 0x3000201034
+  45: FUNC     LOCAL   foo (20) 0x3000000814, rel: 0x814 (.text)
+  46: FILE     LOCAL   crtstuff.c (0) 0
+  47: OBJECT   LOCAL   __FRAME_END__ (0) 0x3000000a58
+  48: OBJECT   LOCAL   __JCR_END__ (0) 0x3000200de0
+  49: FILE     LOCAL    (0) 0
+  50: NOTYPE   LOCAL   __init_array_end (0) 0x3000200dd8
+  51: OBJECT   LOCAL   _DYNAMIC (0) 0x3000200df0
+  52: NOTYPE   LOCAL   __init_array_start (0) 0x3000200dd0
+  53: OBJECT   LOCAL   _GLOBAL_OFFSET_TABLE_ (0) 0x3000201000
+  54: FUNC     GLOBAL  __libc_csu_fini (2) 0x30000008f0, rel: 0x8f0 (.text)
+  55: NOTYPE   WEAK    _ITM_deregisterTMCloneTable (0) 0
+  56: NOTYPE   WEAK    data_start (0) 0x3000201030
+  57: NOTYPE   GLOBAL  _edata (0) 0x300020103c
+  58: FUNC     GLOBAL  bar (44) 0x3000000828, rel: 0x828 (.text)
+  59: FUNC     GLOBAL  _fini (0) 0x30000008f4, rel: 0x8f4 (.fini)
+  60: FUNC     GLOBAL  __libc_start_main@@GLIBC_2.2.5 (0) 0
+  61: NOTYPE   GLOBAL  __data_start (0) 0x3000201030
+  62: NOTYPE   WEAK    __gmon_start__ (0) 0
+  63: OBJECT   GLOBAL  __dso_handle (0) 0x3000200de8
+  64: OBJECT   GLOBAL  _IO_stdin_used (4) 0x3000000900
+  65: OBJECT   GLOBAL  b2 (4) 0x3000201038
+  66: FUNC     GLOBAL  __libc_csu_init (137) 0x3000000860, rel: 0x860 (.text)
+  67: NOTYPE   GLOBAL  _end (0) 0x3000201040
+  68: FUNC     GLOBAL  _start (0) 0x30000006e0, rel: 0x6e0 (.text)
+  69: NOTYPE   GLOBAL  __bss_start (0) 0x300020103c
+  70: FUNC     GLOBAL  main (35) 0x30000007f0, rel: 0x7f0 (.text)
+  71: NOTYPE   WEAK    _Jv_RegisterClasses (0) 0
+  72: OBJECT   GLOBAL  __TMC_END__ (0) 0x3000201040
+  73: NOTYPE   WEAK    _ITM_registerTMCloneTable (0) 0
+  74: FUNC     WEAK    __cxa_finalize@@GLIBC_2.2.5 (0) 0
+  75: FUNC     GLOBAL  _init (0) 0x3000000680, rel: 0x680 (.init)
+EOF
+
+cat > testfile.dynsym.in <<\EOF
+   0: NOTYPE   LOCAL    (0) 0
+   1: SECTION  LOCAL    (0) 0x238
+   2: NOTYPE   WEAK    _ITM_deregisterTMCloneTable (0) 0
+   3: FUNC     GLOBAL  __libc_start_main (0) 0
+   4: NOTYPE   WEAK    __gmon_start__ (0) 0
+   5: NOTYPE   WEAK    _Jv_RegisterClasses (0) 0
+   6: NOTYPE   WEAK    _ITM_registerTMCloneTable (0) 0
+   7: FUNC     WEAK    __cxa_finalize (0) 0
+   8: NOTYPE   GLOBAL  _edata (0) 0x20103c
+   9: NOTYPE   GLOBAL  _end (0) 0x201040
+  10: FUNC     GLOBAL  __libc_csu_init (137) 0x860, rel: 0x860 (.text)
+  11: NOTYPE   GLOBAL  __bss_start (0) 0x20103c
+  12: FUNC     GLOBAL  main (35) 0x7f0, rel: 0x7f0 (.text)
+  13: FUNC     GLOBAL  __libc_csu_fini (2) 0x8f0, rel: 0x8f0 (.text)
+EOF
+
+cat > testfile.minsym.in <<\EOF
+   0: NOTYPE   LOCAL    (0) 0
+   1: SECTION  LOCAL    (0) 0x238
+   2: FUNC     LOCAL   deregister_tm_clones (0) 0x710, rel: 0x710 (.text)
+   3: FUNC     LOCAL   register_tm_clones (0) 0x740, rel: 0x740 (.text)
+   4: FUNC     LOCAL   __do_global_dtors_aux (0) 0x780, rel: 0x780 (.text)
+   5: OBJECT   LOCAL   __do_global_dtors_aux_fini_array_entry (0) 0x200dd8
+   6: FUNC     LOCAL   frame_dummy (0) 0x7c0, rel: 0x7c0 (.text)
+   7: OBJECT   LOCAL   __frame_dummy_init_array_entry (0) 0x200dd0
+   8: FUNC     LOCAL   foo (20) 0x814, rel: 0x814 (.text)
+   9: NOTYPE   LOCAL   __init_array_end (0) 0x200dd8
+  10: NOTYPE   LOCAL   __init_array_start (0) 0x200dd0
+  11: SECTION  LOCAL    (0) 0x238
+  12: SECTION  LOCAL    (0) 0x254
+  13: SECTION  LOCAL    (0) 0x274
+  14: SECTION  LOCAL    (0) 0x298
+  15: SECTION  LOCAL    (0) 0x2d8
+  16: SECTION  LOCAL    (0) 0x428
+  17: SECTION  LOCAL    (0) 0x4f2
+  18: SECTION  LOCAL    (0) 0x510
+  19: SECTION  LOCAL    (0) 0x530
+  20: SECTION  LOCAL    (0) 0x638
+  21: SECTION  LOCAL    (0) 0x680
+  22: SECTION  LOCAL    (0) 0x6a0
+  23: SECTION  LOCAL    (0) 0x6e0
+  24: SECTION  LOCAL    (0) 0x8f4
+  25: SECTION  LOCAL    (0) 0x900
+  26: SECTION  LOCAL    (0) 0x904
+  27: SECTION  LOCAL    (0) 0x948
+  28: SECTION  LOCAL    (0) 0x200dd0
+  29: SECTION  LOCAL    (0) 0x200dd8
+  30: SECTION  LOCAL    (0) 0x200de0
+  31: SECTION  LOCAL    (0) 0x200de8
+  32: SECTION  LOCAL    (0) 0x200df0
+  33: SECTION  LOCAL    (0) 0x200fc0
+  34: SECTION  LOCAL    (0) 0x201000
+  35: SECTION  LOCAL    (0) 0x201030
+  36: SECTION  LOCAL    (0) 0x20103c
+  37: NOTYPE   WEAK    _ITM_deregisterTMCloneTable (0) 0
+  38: FUNC     GLOBAL  __libc_start_main (0) 0
+  39: NOTYPE   WEAK    __gmon_start__ (0) 0
+  40: NOTYPE   WEAK    _Jv_RegisterClasses (0) 0
+  41: NOTYPE   WEAK    _ITM_registerTMCloneTable (0) 0
+  42: FUNC     WEAK    __cxa_finalize (0) 0
+  43: NOTYPE   GLOBAL  _edata (0) 0x20103c
+  44: NOTYPE   GLOBAL  _end (0) 0x201040
+  45: FUNC     GLOBAL  __libc_csu_init (137) 0x860, rel: 0x860 (.text)
+  46: NOTYPE   GLOBAL  __bss_start (0) 0x20103c
+  47: FUNC     GLOBAL  main (35) 0x7f0, rel: 0x7f0 (.text)
+  48: FUNC     GLOBAL  __libc_csu_fini (2) 0x8f0, rel: 0x8f0 (.text)
+  49: FUNC     GLOBAL  bar (44) 0x828, rel: 0x828 (.text)
+  50: FUNC     GLOBAL  _fini (0) 0x8f4, rel: 0x8f4 (.fini)
+  51: FUNC     GLOBAL  _start (0) 0x6e0, rel: 0x6e0 (.text)
+  52: FUNC     GLOBAL  _init (0) 0x680, rel: 0x680 (.init)
+EOF
+
+cat > testfile.minsym_pl.in <<\EOF
+   0: NOTYPE   LOCAL    (0) 0
+   1: SECTION  LOCAL    (0) 0x3000000238
+   2: FUNC     LOCAL   deregister_tm_clones (0) 0x3000000710, rel: 0x710 (.text)
+   3: FUNC     LOCAL   register_tm_clones (0) 0x3000000740, rel: 0x740 (.text)
+   4: FUNC     LOCAL   __do_global_dtors_aux (0) 0x3000000780, rel: 0x780 (.text)
+   5: OBJECT   LOCAL   __do_global_dtors_aux_fini_array_entry (0) 0x3000200dd8
+   6: FUNC     LOCAL   frame_dummy (0) 0x30000007c0, rel: 0x7c0 (.text)
+   7: OBJECT   LOCAL   __frame_dummy_init_array_entry (0) 0x3000200dd0
+   8: FUNC     LOCAL   foo (20) 0x3000000814, rel: 0x814 (.text)
+   9: NOTYPE   LOCAL   __init_array_end (0) 0x3000200dd8
+  10: NOTYPE   LOCAL   __init_array_start (0) 0x3000200dd0
+  11: SECTION  LOCAL    (0) 0x3000000238
+  12: SECTION  LOCAL    (0) 0x3000000254
+  13: SECTION  LOCAL    (0) 0x3000000274
+  14: SECTION  LOCAL    (0) 0x3000000298
+  15: SECTION  LOCAL    (0) 0x30000002d8
+  16: SECTION  LOCAL    (0) 0x3000000428
+  17: SECTION  LOCAL    (0) 0x30000004f2
+  18: SECTION  LOCAL    (0) 0x3000000510
+  19: SECTION  LOCAL    (0) 0x3000000530
+  20: SECTION  LOCAL    (0) 0x3000000638
+  21: SECTION  LOCAL    (0) 0x3000000680
+  22: SECTION  LOCAL    (0) 0x30000006a0
+  23: SECTION  LOCAL    (0) 0x30000006e0
+  24: SECTION  LOCAL    (0) 0x30000008f4
+  25: SECTION  LOCAL    (0) 0x3000000900
+  26: SECTION  LOCAL    (0) 0x3000000904
+  27: SECTION  LOCAL    (0) 0x3000000948
+  28: SECTION  LOCAL    (0) 0x3000200dd0
+  29: SECTION  LOCAL    (0) 0x3000200dd8
+  30: SECTION  LOCAL    (0) 0x3000200de0
+  31: SECTION  LOCAL    (0) 0x3000200de8
+  32: SECTION  LOCAL    (0) 0x3000200df0
+  33: SECTION  LOCAL    (0) 0x3000200fc0
+  34: SECTION  LOCAL    (0) 0x3000201000
+  35: SECTION  LOCAL    (0) 0x3000201030
+  36: SECTION  LOCAL    (0) 0x300020103c
+  37: NOTYPE   WEAK    _ITM_deregisterTMCloneTable (0) 0
+  38: FUNC     GLOBAL  __libc_start_main (0) 0
+  39: NOTYPE   WEAK    __gmon_start__ (0) 0
+  40: NOTYPE   WEAK    _Jv_RegisterClasses (0) 0
+  41: NOTYPE   WEAK    _ITM_registerTMCloneTable (0) 0
+  42: FUNC     WEAK    __cxa_finalize (0) 0
+  43: NOTYPE   GLOBAL  _edata (0) 0x300020103c
+  44: NOTYPE   GLOBAL  _end (0) 0x3000201040
+  45: FUNC     GLOBAL  __libc_csu_init (137) 0x3000000860, rel: 0x860 (.text)
+  46: NOTYPE   GLOBAL  __bss_start (0) 0x300020103c
+  47: FUNC     GLOBAL  main (35) 0x30000007f0, rel: 0x7f0 (.text)
+  48: FUNC     GLOBAL  __libc_csu_fini (2) 0x30000008f0, rel: 0x8f0 (.text)
+  49: FUNC     GLOBAL  bar (44) 0x3000000828, rel: 0x828 (.text)
+  50: FUNC     GLOBAL  _fini (0) 0x30000008f4, rel: 0x8f4 (.fini)
+  51: FUNC     GLOBAL  _start (0) 0x30000006e0, rel: 0x6e0 (.text)
+  52: FUNC     GLOBAL  _init (0) 0x3000000680, rel: 0x680 (.init)
+EOF
+
+cat testfile.symtab.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebaztab
+
+cat testfile.symtab.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazdbg
+
+cat testfile.symtab_pl.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazdbg_pl
+
+sed s/0x3000/0x4200/g testfile.symtab_pl.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazdbg_plr
+
+cat testfile.dynsym.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazdyn
+
+cat testfile.symtab.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazmdb
+
+cat testfile.minsym.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazmin
+
+cat testfile.minsym_pl.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazmin_pl
+
+sed s/0x3000/0x4200/g testfile.minsym_pl.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazmin_plr
+
+testrun_compare ${abs_builddir}/dwflsyms -e testfilebasmin <<\EOF
+   0: NOTYPE   LOCAL    (0) 0
+   1: FUNC     LOCAL   foo (18) 0x400168, rel: 0x400168 (.text)
+   2: SECTION  LOCAL    (0) 0x400120
+   3: SECTION  LOCAL    (0) 0x400144
+   4: SECTION  LOCAL    (0) 0x4001c0
+   5: SECTION  LOCAL    (0) 0x600258
+   6: FUNC     GLOBAL  _start (21) 0x4001a8, rel: 0x4001a8 (.text)
+   7: FUNC     GLOBAL  main (33) 0x400144, rel: 0x400144 (.text)
+   8: FUNC     GLOBAL  bar (44) 0x40017a, rel: 0x40017a (.text)
+EOF
+
+testrun_compare ${abs_builddir}/dwflsyms -e testfilebaxmin <<\EOF
+   0: NOTYPE   LOCAL    (0) 0
+   1: FUNC     LOCAL   deregister_tm_clones (0) 0x400430, rel: 0x400430 (.text)
+   2: FUNC     LOCAL   register_tm_clones (0) 0x400460, rel: 0x400460 (.text)
+   3: FUNC     LOCAL   __do_global_dtors_aux (0) 0x4004a0, rel: 0x4004a0 (.text)
+   4: OBJECT   LOCAL   __do_global_dtors_aux_fini_array_entry (0) 0x600e18
+   5: FUNC     LOCAL   frame_dummy (0) 0x4004c0, rel: 0x4004c0 (.text)
+   6: OBJECT   LOCAL   __frame_dummy_init_array_entry (0) 0x600e10
+   7: FUNC     LOCAL   foo (20) 0x4004f0, rel: 0x4004f0 (.text)
+   8: NOTYPE   LOCAL   __init_array_end (0) 0x600e18
+   9: NOTYPE   LOCAL   __init_array_start (0) 0x600e10
+  10: SECTION  LOCAL    (0) 0x400238
+  11: SECTION  LOCAL    (0) 0x400254
+  12: SECTION  LOCAL    (0) 0x400274
+  13: SECTION  LOCAL    (0) 0x400298
+  14: SECTION  LOCAL    (0) 0x4002b8
+  15: SECTION  LOCAL    (0) 0x400300
+  16: SECTION  LOCAL    (0) 0x400338
+  17: SECTION  LOCAL    (0) 0x400340
+  18: SECTION  LOCAL    (0) 0x400360
+  19: SECTION  LOCAL    (0) 0x400378
+  20: SECTION  LOCAL    (0) 0x4003a8
+  21: SECTION  LOCAL    (0) 0x4003d0
+  22: SECTION  LOCAL    (0) 0x400400
+  23: SECTION  LOCAL    (0) 0x4005c4
+  24: SECTION  LOCAL    (0) 0x4005d0
+  25: SECTION  LOCAL    (0) 0x4005e0
+  26: SECTION  LOCAL    (0) 0x400628
+  27: SECTION  LOCAL    (0) 0x600e10
+  28: SECTION  LOCAL    (0) 0x600e18
+  29: SECTION  LOCAL    (0) 0x600e20
+  30: SECTION  LOCAL    (0) 0x600e28
+  31: SECTION  LOCAL    (0) 0x600ff8
+  32: SECTION  LOCAL    (0) 0x601000
+  33: SECTION  LOCAL    (0) 0x601028
+  34: SECTION  LOCAL    (0) 0x601034
+  35: FUNC     GLOBAL  __libc_start_main (0) 0
+  36: NOTYPE   WEAK    __gmon_start__ (0) 0
+  37: FUNC     GLOBAL  __libc_csu_fini (2) 0x4005c0, rel: 0x4005c0 (.text)
+  38: FUNC     GLOBAL  bar (40) 0x400504, rel: 0x400504 (.text)
+  39: FUNC     GLOBAL  _fini (0) 0x4005c4, rel: 0x4005c4 (.fini)
+  40: FUNC     GLOBAL  __libc_csu_init (101) 0x400550, rel: 0x400550 (.text)
+  41: FUNC     GLOBAL  _start (0) 0x400400, rel: 0x400400 (.text)
+  42: FUNC     GLOBAL  main (35) 0x40052c, rel: 0x40052c (.text)
+  43: FUNC     GLOBAL  _init (0) 0x4003a8, rel: 0x4003a8 (.init)
+EOF
+
+testfiles testfile66
+testrun_compare ${abs_builddir}/dwflsyms -e testfile66 <<\EOF
+   0: NOTYPE   LOCAL    (0) 0
+   1: SECTION  LOCAL    (0) 0x190
+   2: SECTION  LOCAL    (0) 0x1a4
+   3: SECTION  LOCAL    (0) 0x1c8
+   4: SECTION  LOCAL    (0) 0x1f8
+   5: SECTION  LOCAL    (0) 0x288
+   6: SECTION  LOCAL    (0) 0x2a8
+   7: SECTION  LOCAL    (0) 0x2d8
+   8: SECTION  LOCAL    (0) 0x102e0
+   9: SECTION  LOCAL    (0) 0x103d0
+  10: SECTION  LOCAL    (0) 0x103e8
+  11: SECTION  LOCAL    (0) 0x103e8
+  12: OBJECT   LOCAL   _DYNAMIC (0) 0x102e0
+  13: FUNC     GLOBAL  _start (4) 0x103d0, rel: 0x103d0 (.opd) [0x2d8, rel: 0 (.text)]
+  14: NOTYPE   GLOBAL  __bss_start (0) 0x103f0
+  15: NOTYPE   GLOBAL  _edata (0) 0x103f0
+  16: NOTYPE   GLOBAL  _end (0) 0x103f0
+EOF
+
+testfiles testfile66.core
+testrun_compare ${abs_builddir}/dwflsyms -e testfile66 --core=testfile66.core <<\EOF
+   0: NOTYPE   LOCAL    (0) 0
+   1: SECTION  LOCAL    (0) 0xfffb1af0410
+   2: NOTYPE   GLOBAL  __kernel_datapage_offset (0) 0xfffb1af05dc
+   3: OBJECT   GLOBAL  LINUX_2.6.15 (0) 0
+   4: NOTYPE   GLOBAL  __kernel_clock_getres (64) 0xfffb1af052c
+   5: NOTYPE   GLOBAL  __kernel_get_tbfreq (24) 0xfffb1af0620
+   6: NOTYPE   GLOBAL  __kernel_gettimeofday (84) 0xfffb1af0440
+   7: NOTYPE   GLOBAL  __kernel_sync_dicache (20) 0xfffb1af06c4
+   8: NOTYPE   GLOBAL  __kernel_sync_dicache_p5 (20) 0xfffb1af06c4
+   9: NOTYPE   GLOBAL  __kernel_sigtramp_rt64 (12) 0xfffb1af0418
+  10: NOTYPE   GLOBAL  __kernel_clock_gettime (152) 0xfffb1af0494
+  11: NOTYPE   GLOBAL  __kernel_get_syscall_map (44) 0xfffb1af05f4
+ld64.so.1: Callback returned failure
+   0: NOTYPE   LOCAL    (0) 0
+   1: SECTION  LOCAL    (0) 0x461b0190
+   2: SECTION  LOCAL    (0) 0x461b01a4
+   3: SECTION  LOCAL    (0) 0x461b01c8
+   4: SECTION  LOCAL    (0) 0x461b01f8
+   5: SECTION  LOCAL    (0) 0x461b0288
+   6: SECTION  LOCAL    (0) 0x461b02a8
+   7: SECTION  LOCAL    (0) 0x461b02d8
+   8: SECTION  LOCAL    (0) 0x461c02e0
+   9: SECTION  LOCAL    (0) 0x461c03d0
+  10: SECTION  LOCAL    (0) 0x461c03e8
+  11: SECTION  LOCAL    (0) 0x461c03e8
+  12: OBJECT   LOCAL   _DYNAMIC (0) 0x102e0
+  13: FUNC     GLOBAL  _start (4) 0x461c03d0, rel: 0x103d0 (.opd) [0x461b02d8, rel: 0 (.text)]
+  14: NOTYPE   GLOBAL  __bss_start (0) 0x103f0
+  15: NOTYPE   GLOBAL  _edata (0) 0x103f0
+  16: NOTYPE   GLOBAL  _end (0) 0x103f0
+EOF
+
+# Test the already present dot-prefixed names do not get duplicated.
+testfiles hello_ppc64.ko
+testrun_compare ${abs_builddir}/dwflsyms -e hello_ppc64.ko <<\EOF
+   0: NOTYPE   LOCAL    (0) 0
+   1: SECTION  LOCAL    (0) 0
+   2: SECTION  LOCAL    (0) 0x94
+   3: SECTION  LOCAL    (0) 0xba
+   4: SECTION  LOCAL    (0) 0xd0
+   5: SECTION  LOCAL    (0) 0x13a
+   6: SECTION  LOCAL    (0) 0x13a
+   7: SECTION  LOCAL    (0) 0x150
+   8: SECTION  LOCAL    (0) 0x170
+   9: SECTION  LOCAL    (0) 0x188
+  10: SECTION  LOCAL    (0) 0x410
+  11: SECTION  LOCAL    (0) 0x434
+  12: SECTION  LOCAL    (0) 0x438
+  13: SECTION  LOCAL    (0) 0x438
+  14: SECTION  LOCAL    (0) 0
+  15: SECTION  LOCAL    (0) 0
+  16: SECTION  LOCAL    (0) 0
+  17: SECTION  LOCAL    (0) 0
+  18: SECTION  LOCAL    (0) 0
+  19: SECTION  LOCAL    (0) 0
+  20: SECTION  LOCAL    (0) 0
+  21: SECTION  LOCAL    (0) 0
+  22: SECTION  LOCAL    (0) 0
+  23: SECTION  LOCAL    (0) 0
+  24: FILE     LOCAL   init.c (0) 0
+  25: FILE     LOCAL   exit.c (0) 0
+  26: FILE     LOCAL   hello.mod.c (0) 0
+  27: OBJECT   LOCAL   __mod_srcversion23 (35) 0xd0
+  28: OBJECT   LOCAL   __module_depends (9) 0xf8
+  29: OBJECT   LOCAL   __mod_vermagic5 (50) 0x108
+  30: OBJECT   GLOBAL  __this_module (648) 0x188
+  31: FUNC     GLOBAL  .cleanup_module (72) 0x4c, rel: 0x4c (.text)
+  32: FUNC     GLOBAL  cleanup_module (24) 0x160, rel: 0x10 (.opd)
+  33: NOTYPE   GLOBAL  .printk (0) 0
+  34: FUNC     GLOBAL  init_module (24) 0x150, rel: 0 (.opd)
+  35: NOTYPE   GLOBAL  ._mcount (0) 0
+  36: FUNC     GLOBAL  .init_module (76) 0, rel: 0 (.text)
+  37: NOTYPE   GLOBAL  _mcount (0) 0
+EOF
+
+# Same test files as above, but now generated on ppc64.
+# ppc64 uses function descriptors to make things more "interesting".
+
+testfiles testfilebaztabppc64
+testfiles testfilebazdbgppc64 testfilebazdbgppc64.debug
+testfiles testfilebazdbgppc64_pl
+testfiles testfilebazdbgppc64_plr
+testfiles testfilebazdynppc64
+testfiles testfilebazmdbppc64
+testfiles testfilebazminppc64
+testfiles testfilebazminppc64_pl
+testfiles testfilebazminppc64_plr
+
+cat > testfile.symtab.in <<\EOF
+   0: NOTYPE   LOCAL    (0) 0
+   1: SECTION  LOCAL    (0) 0x238
+   2: SECTION  LOCAL    (0) 0x24c
+   3: SECTION  LOCAL    (0) 0x26c
+   4: SECTION  LOCAL    (0) 0x290
+   5: SECTION  LOCAL    (0) 0x2c0
+   6: SECTION  LOCAL    (0) 0x3e0
+   7: SECTION  LOCAL    (0) 0x488
+   8: SECTION  LOCAL    (0) 0x4a0
+   9: SECTION  LOCAL    (0) 0x4c0
+  10: SECTION  LOCAL    (0) 0x820
+  11: SECTION  LOCAL    (0) 0x850
+  12: SECTION  LOCAL    (0) 0x8a0
+  13: SECTION  LOCAL    (0) 0xd30
+  14: SECTION  LOCAL    (0) 0xd4c
+  15: SECTION  LOCAL    (0) 0xd50
+  16: SECTION  LOCAL    (0) 0xd70
+  17: SECTION  LOCAL    (0) 0x1fde0
+  18: SECTION  LOCAL    (0) 0x1fde8
+  19: SECTION  LOCAL    (0) 0x1fdf0
+  20: SECTION  LOCAL    (0) 0x1fdf8
+  21: SECTION  LOCAL    (0) 0x1fe20
+  22: SECTION  LOCAL    (0) 0x20000
+  23: SECTION  LOCAL    (0) 0x20010
+  24: SECTION  LOCAL    (0) 0x200d8
+  25: SECTION  LOCAL    (0) 0x20110
+  26: SECTION  LOCAL    (0) 0x20158
+  27: SECTION  LOCAL    (0) 0
+  28: SECTION  LOCAL    (0) 0
+  29: SECTION  LOCAL    (0) 0
+  30: SECTION  LOCAL    (0) 0
+  31: SECTION  LOCAL    (0) 0
+  32: SECTION  LOCAL    (0) 0
+  33: SECTION  LOCAL    (0) 0
+  34: FILE     LOCAL   crtstuff.c (0) 0
+  35: OBJECT   LOCAL   __JCR_LIST__ (0) 0x1fdf0
+  36: FUNC     LOCAL   deregister_tm_clones (0) 0x20040, rel: 0x20040 (.opd) [0x910, rel: 0x70 (.text)]
+  37: FUNC     LOCAL   register_tm_clones (0) 0x20050, rel: 0x20050 (.opd) [0x980, rel: 0xe0 (.text)]
+  38: FUNC     LOCAL   __do_global_dtors_aux (0) 0x20060, rel: 0x20060 (.opd) [0x9f0, rel: 0x150 (.text)]
+  39: OBJECT   LOCAL   completed.7711 (1) 0x20158
+  40: OBJECT   LOCAL   __do_global_dtors_aux_fini_array_entry (0) 0x1fde8
+  41: FUNC     LOCAL   frame_dummy (0) 0x20070, rel: 0x20070 (.opd) [0xa50, rel: 0x1b0 (.text)]
+  42: OBJECT   LOCAL   __frame_dummy_init_array_entry (0) 0x1fde0
+  43: FILE     LOCAL   foo.c (0) 0
+  44: FILE     LOCAL   bar.c (0) 0
+  45: OBJECT   LOCAL   b1 (4) 0x20004
+  46: FUNC     LOCAL   foo (76) 0x20090, rel: 0x20090 (.opd) [0xb34, rel: 0x294 (.text)]
+  47: FILE     LOCAL   crtstuff.c (0) 0
+  48: OBJECT   LOCAL   __FRAME_END__ (0) 0xe18
+  49: OBJECT   LOCAL   __JCR_END__ (0) 0x1fdf0
+  50: FILE     LOCAL    (0) 0
+  51: NOTYPE   LOCAL   __glink_PLTresolve (0) 0xce8
+  52: NOTYPE   LOCAL   00000011.plt_call.__libc_start_main@@GLIBC_2.3 (0) 0x8a0
+  53: NOTYPE   LOCAL   00000011.plt_call.__cxa_finalize@@GLIBC_2.3 (0) 0x8b4
+  54: NOTYPE   LOCAL   __init_array_end (0) 0x1fde8
+  55: OBJECT   LOCAL   _DYNAMIC (0) 0x1fe20
+  56: NOTYPE   LOCAL   __init_array_start (0) 0x1fde0
+  57: FUNC     GLOBAL  __libc_csu_fini (16) 0x200c0, rel: 0x200c0 (.opd) [0xcd0, rel: 0x430 (.text)]
+  58: FUNC     GLOBAL  __libc_start_main@@GLIBC_2.3 (0) 0
+  59: NOTYPE   WEAK    _ITM_deregisterTMCloneTable (0) 0
+  60: NOTYPE   WEAK    data_start (0) 0x20000
+  61: NOTYPE   GLOBAL  _edata (0) 0x20110
+  62: FUNC     GLOBAL  bar (116) 0x200a0, rel: 0x200a0 (.opd) [0xb80, rel: 0x2e0 (.text)]
+  63: FUNC     GLOBAL  _fini (0) 0x20030, rel: 0x20030 (.opd) [0xd30, rel: 0 (.fini)]
+  64: NOTYPE   GLOBAL  __data_start (0) 0x20000
+  65: NOTYPE   WEAK    __gmon_start__ (0) 0
+  66: OBJECT   GLOBAL  __dso_handle (0) 0x1fe18
+  67: OBJECT   GLOBAL  _IO_stdin_used (4) 0xd4c
+  68: OBJECT   GLOBAL  b2 (4) 0x20008
+  69: FUNC     WEAK    __cxa_finalize@@GLIBC_2.3 (0) 0
+  70: FUNC     GLOBAL  __libc_csu_init (204) 0x200b0, rel: 0x200b0 (.opd) [0xc00, rel: 0x360 (.text)]
+  71: NOTYPE   GLOBAL  _end (0) 0x20160
+  72: FUNC     GLOBAL  _start (60) 0x20010, rel: 0x20010 (.opd) [0x8c8, rel: 0x28 (.text)]
+  73: NOTYPE   GLOBAL  __bss_start (0) 0x20110
+  74: FUNC     GLOBAL  main (128) 0x20080, rel: 0x20080 (.opd) [0xab4, rel: 0x214 (.text)]
+  75: NOTYPE   WEAK    _Jv_RegisterClasses (0) 0
+  76: OBJECT   GLOBAL  __TMC_END__ (0) 0x20010
+  77: NOTYPE   WEAK    _ITM_registerTMCloneTable (0) 0
+  78: FUNC     GLOBAL  _init (0) 0x20020, rel: 0x20020 (.opd) [0x850, rel: 0 (.init)]
+EOF
+
+cat > testfile.symtab_pl.in <<\EOF
+   0: NOTYPE   LOCAL    (0) 0
+   1: SECTION  LOCAL    (0) 0x8001000238
+   2: SECTION  LOCAL    (0) 0x800100024c
+   3: SECTION  LOCAL    (0) 0x800100026c
+   4: SECTION  LOCAL    (0) 0x8001000290
+   5: SECTION  LOCAL    (0) 0x80010002c0
+   6: SECTION  LOCAL    (0) 0x80010003e0
+   7: SECTION  LOCAL    (0) 0x8001000488
+   8: SECTION  LOCAL    (0) 0x80010004a0
+   9: SECTION  LOCAL    (0) 0x80010004c0
+  10: SECTION  LOCAL    (0) 0x8001000820
+  11: SECTION  LOCAL    (0) 0x8001000850
+  12: SECTION  LOCAL    (0) 0x80010008a0
+  13: SECTION  LOCAL    (0) 0x8001000d30
+  14: SECTION  LOCAL    (0) 0x8001000d4c
+  15: SECTION  LOCAL    (0) 0x8001000d50
+  16: SECTION  LOCAL    (0) 0x8001000d70
+  17: SECTION  LOCAL    (0) 0x800101fde0
+  18: SECTION  LOCAL    (0) 0x800101fde8
+  19: SECTION  LOCAL    (0) 0x800101fdf0
+  20: SECTION  LOCAL    (0) 0x800101fdf8
+  21: SECTION  LOCAL    (0) 0x800101fe20
+  22: SECTION  LOCAL    (0) 0x8001020000
+  23: SECTION  LOCAL    (0) 0x8001020010
+  24: SECTION  LOCAL    (0) 0x80010200d8
+  25: SECTION  LOCAL    (0) 0x8001020110
+  26: SECTION  LOCAL    (0) 0x8001020158
+  27: SECTION  LOCAL    (0) 0
+  28: SECTION  LOCAL    (0) 0
+  29: SECTION  LOCAL    (0) 0
+  30: SECTION  LOCAL    (0) 0
+  31: SECTION  LOCAL    (0) 0
+  32: SECTION  LOCAL    (0) 0
+  33: SECTION  LOCAL    (0) 0
+  34: FILE     LOCAL   crtstuff.c (0) 0
+  35: OBJECT   LOCAL   __JCR_LIST__ (0) 0x800101fdf0
+  36: FUNC     LOCAL   deregister_tm_clones (0) 0x8001020040, rel: 0x20040 (.opd) [0x8001000910, rel: 0x70 (.text)]
+  37: FUNC     LOCAL   register_tm_clones (0) 0x8001020050, rel: 0x20050 (.opd) [0x8001000980, rel: 0xe0 (.text)]
+  38: FUNC     LOCAL   __do_global_dtors_aux (0) 0x8001020060, rel: 0x20060 (.opd) [0x80010009f0, rel: 0x150 (.text)]
+  39: OBJECT   LOCAL   completed.7711 (1) 0x8001020158
+  40: OBJECT   LOCAL   __do_global_dtors_aux_fini_array_entry (0) 0x800101fde8
+  41: FUNC     LOCAL   frame_dummy (0) 0x8001020070, rel: 0x20070 (.opd) [0x8001000a50, rel: 0x1b0 (.text)]
+  42: OBJECT   LOCAL   __frame_dummy_init_array_entry (0) 0x800101fde0
+  43: FILE     LOCAL   foo.c (0) 0
+  44: FILE     LOCAL   bar.c (0) 0
+  45: OBJECT   LOCAL   b1 (4) 0x8001020004
+  46: FUNC     LOCAL   foo (76) 0x8001020090, rel: 0x20090 (.opd) [0x8001000b34, rel: 0x294 (.text)]
+  47: FILE     LOCAL   crtstuff.c (0) 0
+  48: OBJECT   LOCAL   __FRAME_END__ (0) 0x8001000e18
+  49: OBJECT   LOCAL   __JCR_END__ (0) 0x800101fdf0
+  50: FILE     LOCAL    (0) 0
+  51: NOTYPE   LOCAL   __glink_PLTresolve (0) 0x8001000ce8
+  52: NOTYPE   LOCAL   00000011.plt_call.__libc_start_main@@GLIBC_2.3 (0) 0x80010008a0
+  53: NOTYPE   LOCAL   00000011.plt_call.__cxa_finalize@@GLIBC_2.3 (0) 0x80010008b4
+  54: NOTYPE   LOCAL   __init_array_end (0) 0x800101fde8
+  55: OBJECT   LOCAL   _DYNAMIC (0) 0x800101fe20
+  56: NOTYPE   LOCAL   __init_array_start (0) 0x800101fde0
+  57: FUNC     GLOBAL  __libc_csu_fini (16) 0x80010200c0, rel: 0x200c0 (.opd) [0x8001000cd0, rel: 0x430 (.text)]
+  58: FUNC     GLOBAL  __libc_start_main@@GLIBC_2.3 (0) 0
+  59: NOTYPE   WEAK    _ITM_deregisterTMCloneTable (0) 0
+  60: NOTYPE   WEAK    data_start (0) 0x8001020000
+  61: NOTYPE   GLOBAL  _edata (0) 0x8001020110
+  62: FUNC     GLOBAL  bar (116) 0x80010200a0, rel: 0x200a0 (.opd) [0x8001000b80, rel: 0x2e0 (.text)]
+  63: FUNC     GLOBAL  _fini (0) 0x8001020030, rel: 0x20030 (.opd) [0x8001000d30, rel: 0 (.fini)]
+  64: NOTYPE   GLOBAL  __data_start (0) 0x8001020000
+  65: NOTYPE   WEAK    __gmon_start__ (0) 0
+  66: OBJECT   GLOBAL  __dso_handle (0) 0x800101fe18
+  67: OBJECT   GLOBAL  _IO_stdin_used (4) 0x8001000d4c
+  68: OBJECT   GLOBAL  b2 (4) 0x8001020008
+  69: FUNC     WEAK    __cxa_finalize@@GLIBC_2.3 (0) 0
+  70: FUNC     GLOBAL  __libc_csu_init (204) 0x80010200b0, rel: 0x200b0 (.opd) [0x8001000c00, rel: 0x360 (.text)]
+  71: NOTYPE   GLOBAL  _end (0) 0x8001020160
+  72: FUNC     GLOBAL  _start (60) 0x8001020010, rel: 0x20010 (.opd) [0x80010008c8, rel: 0x28 (.text)]
+  73: NOTYPE   GLOBAL  __bss_start (0) 0x8001020110
+  74: FUNC     GLOBAL  main (128) 0x8001020080, rel: 0x20080 (.opd) [0x8001000ab4, rel: 0x214 (.text)]
+  75: NOTYPE   WEAK    _Jv_RegisterClasses (0) 0
+  76: OBJECT   GLOBAL  __TMC_END__ (0) 0x8001020010
+  77: NOTYPE   WEAK    _ITM_registerTMCloneTable (0) 0
+  78: FUNC     GLOBAL  _init (0) 0x8001020020, rel: 0x20020 (.opd) [0x8001000850, rel: 0 (.init)]
+EOF
+
+cat > testfile.dynsym.in <<\EOF
+   0: NOTYPE   LOCAL    (0) 0
+   1: SECTION  LOCAL    (0) 0x238
+   2: SECTION  LOCAL    (0) 0x1fdf0
+   3: FUNC     GLOBAL  __libc_start_main (0) 0
+   4: NOTYPE   WEAK    _ITM_deregisterTMCloneTable (0) 0
+   5: NOTYPE   WEAK    __gmon_start__ (0) 0
+   6: FUNC     WEAK    __cxa_finalize (0) 0
+   7: NOTYPE   WEAK    _Jv_RegisterClasses (0) 0
+   8: NOTYPE   WEAK    _ITM_registerTMCloneTable (0) 0
+   9: NOTYPE   GLOBAL  _edata (0) 0x20110
+  10: NOTYPE   GLOBAL  _end (0) 0x20160
+  11: NOTYPE   GLOBAL  __bss_start (0) 0x20110
+EOF
+
+cat > testfile.minsym.in <<\EOF
+   0: NOTYPE   LOCAL    (0) 0
+   1: SECTION  LOCAL    (0) 0x238
+   2: SECTION  LOCAL    (0) 0x1fdf0
+   3: OBJECT   LOCAL   __do_global_dtors_aux_fini_array_entry (0) 0x1fde8
+   4: OBJECT   LOCAL   __frame_dummy_init_array_entry (0) 0x1fde0
+   5: NOTYPE   LOCAL   __glink_PLTresolve (0) 0xce8
+   6: NOTYPE   LOCAL   00000011.plt_call.__libc_start_main@@GLIBC_2.3 (0) 0x8a0
+   7: NOTYPE   LOCAL   00000011.plt_call.__cxa_finalize@@GLIBC_2.3 (0) 0x8b4
+   8: NOTYPE   LOCAL   __init_array_end (0) 0x1fde8
+   9: NOTYPE   LOCAL   __init_array_start (0) 0x1fde0
+  10: SECTION  LOCAL    (0) 0x238
+  11: SECTION  LOCAL    (0) 0x24c
+  12: SECTION  LOCAL    (0) 0x26c
+  13: SECTION  LOCAL    (0) 0x290
+  14: SECTION  LOCAL    (0) 0x2c0
+  15: SECTION  LOCAL    (0) 0x3e0
+  16: SECTION  LOCAL    (0) 0x488
+  17: SECTION  LOCAL    (0) 0x4a0
+  18: SECTION  LOCAL    (0) 0x4c0
+  19: SECTION  LOCAL    (0) 0x820
+  20: SECTION  LOCAL    (0) 0x850
+  21: SECTION  LOCAL    (0) 0x8a0
+  22: SECTION  LOCAL    (0) 0xd30
+  23: SECTION  LOCAL    (0) 0xd4c
+  24: SECTION  LOCAL    (0) 0xd50
+  25: SECTION  LOCAL    (0) 0xd70
+  26: SECTION  LOCAL    (0) 0x1fde0
+  27: SECTION  LOCAL    (0) 0x1fde8
+  28: SECTION  LOCAL    (0) 0x1fdf0
+  29: SECTION  LOCAL    (0) 0x1fdf8
+  30: SECTION  LOCAL    (0) 0x1fe20
+  31: SECTION  LOCAL    (0) 0x20000
+  32: SECTION  LOCAL    (0) 0x20010
+  33: SECTION  LOCAL    (0) 0x200d8
+  34: SECTION  LOCAL    (0) 0x20110
+  35: SECTION  LOCAL    (0) 0x20158
+  36: FUNC     GLOBAL  __libc_start_main (0) 0
+  37: NOTYPE   WEAK    _ITM_deregisterTMCloneTable (0) 0
+  38: NOTYPE   WEAK    __gmon_start__ (0) 0
+  39: FUNC     WEAK    __cxa_finalize (0) 0
+  40: NOTYPE   WEAK    _Jv_RegisterClasses (0) 0
+  41: NOTYPE   WEAK    _ITM_registerTMCloneTable (0) 0
+  42: NOTYPE   GLOBAL  _edata (0) 0x20110
+  43: NOTYPE   GLOBAL  _end (0) 0x20160
+  44: NOTYPE   GLOBAL  __bss_start (0) 0x20110
+EOF
+
+cat > testfile.minsym_pl.in <<\EOF
+   0: NOTYPE   LOCAL    (0) 0
+   1: SECTION  LOCAL    (0) 0x8001000238
+   2: SECTION  LOCAL    (0) 0x800101fdf0
+   3: OBJECT   LOCAL   __do_global_dtors_aux_fini_array_entry (0) 0x800101fde8
+   4: OBJECT   LOCAL   __frame_dummy_init_array_entry (0) 0x800101fde0
+   5: NOTYPE   LOCAL   __glink_PLTresolve (0) 0x8001000ce8
+   6: NOTYPE   LOCAL   00000011.plt_call.__libc_start_main@@GLIBC_2.3 (0) 0x80010008a0
+   7: NOTYPE   LOCAL   00000011.plt_call.__cxa_finalize@@GLIBC_2.3 (0) 0x80010008b4
+   8: NOTYPE   LOCAL   __init_array_end (0) 0x800101fde8
+   9: NOTYPE   LOCAL   __init_array_start (0) 0x800101fde0
+  10: SECTION  LOCAL    (0) 0x8001000238
+  11: SECTION  LOCAL    (0) 0x800100024c
+  12: SECTION  LOCAL    (0) 0x800100026c
+  13: SECTION  LOCAL    (0) 0x8001000290
+  14: SECTION  LOCAL    (0) 0x80010002c0
+  15: SECTION  LOCAL    (0) 0x80010003e0
+  16: SECTION  LOCAL    (0) 0x8001000488
+  17: SECTION  LOCAL    (0) 0x80010004a0
+  18: SECTION  LOCAL    (0) 0x80010004c0
+  19: SECTION  LOCAL    (0) 0x8001000820
+  20: SECTION  LOCAL    (0) 0x8001000850
+  21: SECTION  LOCAL    (0) 0x80010008a0
+  22: SECTION  LOCAL    (0) 0x8001000d30
+  23: SECTION  LOCAL    (0) 0x8001000d4c
+  24: SECTION  LOCAL    (0) 0x8001000d50
+  25: SECTION  LOCAL    (0) 0x8001000d70
+  26: SECTION  LOCAL    (0) 0x800101fde0
+  27: SECTION  LOCAL    (0) 0x800101fde8
+  28: SECTION  LOCAL    (0) 0x800101fdf0
+  29: SECTION  LOCAL    (0) 0x800101fdf8
+  30: SECTION  LOCAL    (0) 0x800101fe20
+  31: SECTION  LOCAL    (0) 0x8001020000
+  32: SECTION  LOCAL    (0) 0x8001020010
+  33: SECTION  LOCAL    (0) 0x80010200d8
+  34: SECTION  LOCAL    (0) 0x8001020110
+  35: SECTION  LOCAL    (0) 0x8001020158
+  36: FUNC     GLOBAL  __libc_start_main (0) 0
+  37: NOTYPE   WEAK    _ITM_deregisterTMCloneTable (0) 0
+  38: NOTYPE   WEAK    __gmon_start__ (0) 0
+  39: FUNC     WEAK    __cxa_finalize (0) 0
+  40: NOTYPE   WEAK    _Jv_RegisterClasses (0) 0
+  41: NOTYPE   WEAK    _ITM_registerTMCloneTable (0) 0
+  42: NOTYPE   GLOBAL  _edata (0) 0x8001020110
+  43: NOTYPE   GLOBAL  _end (0) 0x8001020160
+  44: NOTYPE   GLOBAL  __bss_start (0) 0x8001020110
+EOF
+
+cat testfile.symtab.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebaztabppc64
+
+cat testfile.symtab.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazdbgppc64
+
+cat testfile.symtab_pl.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazdbgppc64_pl
+
+sed s/0x8001/0x4200/g testfile.symtab_pl.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazdbgppc64_plr
+
+cat testfile.dynsym.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazdynppc64
+
+cat testfile.symtab.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazmdbppc64
+
+cat testfile.minsym.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazminppc64
+
+cat testfile.minsym_pl.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazminppc64_pl
+
+sed s/0x8001/0x4200/g testfile.minsym_pl.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazminppc64_plr
+
+exit 0
index 55a38f9..3757bcf 100755 (executable)
@@ -19,6 +19,6 @@
 
 testfiles testfile
 
-testrun ./early-offscn testfile 0x500
+testrun ${abs_builddir}/early-offscn testfile 0x500
 
 exit 0
index d68a873..d5e376a 100755 (executable)
@@ -21,7 +21,7 @@
 testfiles testfile10
 tempfiles testfile10.tmp
 
-testrun ./ecp testfile10 testfile10.tmp
+testrun ${abs_builddir}/ecp testfile10 testfile10.tmp
 
 cmp testfile10 testfile10.tmp
 
index a9acbe9..864e0a5 100755 (executable)
@@ -21,6 +21,6 @@
 testfiles testfile2
 tempfiles testfile2.tmp
 
-testrun ./ecp testfile2 testfile2.tmp
+testrun ${abs_builddir}/ecp testfile2 testfile2.tmp
 
 exit 0
index 41a7d15..94b477c 100755 (executable)
 
 . $srcdir/test-subr.sh
 
+tempfiles test_shdr.out
+
 # However we open the elf file, the shdrs should be the same.
-testrun ./test-elf_cntl_gelf_getshdr READ test-elf_cntl_gelf_getshdr \
+testrun ${abs_builddir}/test-elf_cntl_gelf_getshdr READ ${abs_builddir}/test-elf_cntl_gelf_getshdr \
   > test_shdr.out
 
-testrun_compare ./test-elf_cntl_gelf_getshdr MMAP test-elf_cntl_gelf_getshdr \
+testrun_compare ${abs_builddir}/test-elf_cntl_gelf_getshdr MMAP ${abs_builddir}/test-elf_cntl_gelf_getshdr \
   < test_shdr.out
 
-testrun_compare ./test-elf_cntl_gelf_getshdr FDREAD test-elf_cntl_gelf_getshdr \
+testrun_compare ${abs_builddir}/test-elf_cntl_gelf_getshdr FDREAD ${abs_builddir}/test-elf_cntl_gelf_getshdr \
   < test_shdr.out
-
-rm -f test_shdr.out
index 4b01008..013109d 100755 (executable)
@@ -18,4 +18,4 @@
 
 . $srcdir/test-subr.sh
 
-testrun_on_self ../src/elflint --quiet --gnu-ld
+testrun_on_self ${abs_top_builddir}/src/elflint --quiet --gnu-ld
index 5a5c622..68615b9 100755 (executable)
 
 testfiles testfile18
 
-testrun_compare ../src/elflint --gnu-ld testfile18 <<\EOF
+testrun_compare ${abs_top_builddir}/src/elflint --gnu-ld testfile18 <<\EOF
 section [ 8] '.rela.dyn': relocation 1: copy relocation against symbol of type FUNC
 EOF
 
 testfiles testfile32
-testrun ../src/elflint -q testfile32
+testrun ${abs_top_builddir}/src/elflint -q testfile32
 
 testfiles testfile33
-testrun ../src/elflint -q testfile33
+testrun ${abs_top_builddir}/src/elflint -q testfile33
 
 testfiles testfile42
-testrun ../src/elflint -q --gnu-ld testfile42
+testrun ${abs_top_builddir}/src/elflint -q --gnu-ld testfile42
 
 testfiles testfile46
-testrun ../src/elflint -q testfile46
+testrun ${abs_top_builddir}/src/elflint -q testfile46
 
 # see also run-readelf-d.sh
 testfiles testlib_dynseg.so
-testrun ../src/elflint -q --gnu-ld testlib_dynseg.so
+testrun ${abs_top_builddir}/src/elflint -q --gnu-ld testlib_dynseg.so
 
 exit 0
index 78caa8c..160f07d 100755 (executable)
 testfiles testfile testfile11 testfile22 testfile24 \
          testfile25 testfile3 testfile4 testfile5 testfile6
 
-testrun_compare ./find-prologues -e testfile <<\EOF
+testrun_compare ${abs_builddir}/find-prologues -e testfile <<\EOF
 main             0x000000000804842c 0x0000000008048432
 bar              0x000000000804845c 0x000000000804845f
 foo              0x0000000008048468 0x000000000804846b
 EOF
 
-testrun_compare ./find-prologues -e testfile11 <<\EOF
+testrun_compare ${abs_builddir}/find-prologues -e testfile11 <<\EOF
 main             0x00000000080489b8 0x00000000080489cd
 gnu_obj_2        0x0000000008048c9e 0x0000000008048ca4
 gnu_obj_3        0x0000000008048cd8 0x0000000008048cde
@@ -37,27 +37,27 @@ gnu_obj_1        0x0000000008048d8a 0x0000000008048d8d
 ~invalid_argument 0x0000000008048db2 0x0000000008048db8
 EOF
 
-testrun_compare ./find-prologues -e testfile22 <<\EOF
+testrun_compare ${abs_builddir}/find-prologues -e testfile22 <<\EOF
 function         0x0000000008048348 0x000000000804834e
 main             0x000000000804835b 0x0000000008048377
 EOF
 
-testrun_compare ./find-prologues -e testfile24 <<\EOF
+testrun_compare ${abs_builddir}/find-prologues -e testfile24 <<\EOF
 incr             0x0000000008048348 0x000000000804834e
 main             0x0000000008048354 0x0000000008048360
 EOF
 
-testrun_compare ./find-prologues -e testfile25 <<\EOF
+testrun_compare ${abs_builddir}/find-prologues -e testfile25 <<\EOF
 incr             0x0000000008048348 0x000000000804834c
 EOF
 
-testrun_compare ./find-prologues -e testfile3 <<\EOF
+testrun_compare ${abs_builddir}/find-prologues -e testfile3 <<\EOF
 main             0x000000000804842c 0x0000000008048433
 bar              0x0000000008048458 0x000000000804845b
 foo              0x0000000008048464 0x0000000008048467
 EOF
 
-testrun_compare ./find-prologues -e testfile4 <<\EOF
+testrun_compare ${abs_builddir}/find-prologues -e testfile4 <<\EOF
 get              0x00000000080493fc 0x0000000008049402
 main             0x0000000008049498 0x000000000804949e
 a                0x000000000804d85c 0x000000000804d85c
@@ -65,13 +65,13 @@ __tfPCc          0x000000000804d86c 0x000000000804d872
 __tfCc           0x000000000804d8a4 0x000000000804d8a4
 EOF
 
-testrun_compare ./find-prologues -e testfile5 <<\EOF
+testrun_compare ${abs_builddir}/find-prologues -e testfile5 <<\EOF
 bar              0x000000000804842c 0x000000000804842f
 foo              0x0000000008048438 0x000000000804843b
 main             0x0000000008048444 0x000000000804844a
 EOF
 
-testrun_compare ./find-prologues -e testfile6 <<\EOF
+testrun_compare ${abs_builddir}/find-prologues -e testfile6 <<\EOF
 main             0x00000000080489b8 0x00000000080489cd
 gnu_obj_2        0x0000000008048c9e 0x0000000008048ca4
 gnu_obj_3        0x0000000008048cd8 0x0000000008048cde
diff --git a/tests/run-funcretval.sh b/tests/run-funcretval.sh
new file mode 100755 (executable)
index 0000000..779bd47
--- /dev/null
@@ -0,0 +1,153 @@
+#! /bin/sh
+# Copyright (C) 2013 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
+
+# The following files were obtaining by compiling funcretval_test.c
+# from this directory as follows:
+#
+#   gcc -g funcretval_test.c -o funcretval_test_<YOURARCH>
+#
+# Pass -DFLOAT128 if the given arch supports __float128.
+
+testfiles funcretval_test_aarch64
+
+# funcretval_test_aarch64 was built with additional flag:
+#   -DAARCH64_BUG_1032854
+# hence no fun_vec_double_8.
+testrun_compare ${abs_top_builddir}/tests/funcretval \
+       -e funcretval_test_aarch64 <<\EOF
+() fun_char: return value location: {0x50, 0}
+() fun_short: return value location: {0x50, 0}
+() fun_int: return value location: {0x50, 0}
+() fun_ptr: return value location: {0x50, 0}
+() fun_iptr: return value location: {0x50, 0}
+() fun_long: return value location: {0x50, 0}
+() fun_int128: return value location: {0x50, 0} {0x93, 0x8} {0x51, 0} {0x93, 0x8}
+() fun_large_struct1: return value location: {0x70, 0}
+() fun_large_struct2: return value location: {0x70, 0}
+() fun_float: return value location: {0x90, 0x40}
+() fun_float_complex: return value location: {0x90, 0x40} {0x93, 0x4} {0x90, 0x41} {0x93, 0x4}
+() fun_double: return value location: {0x90, 0x40}
+() fun_double_complex: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8}
+() fun_long_double: return value location: {0x90, 0x40}
+() fun_long_double_complex: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10}
+() fun_vec_char_8: return value location: {0x90, 0x40}
+() fun_vec_short_8: return value location: {0x90, 0x40}
+() fun_vec_int_8: return value location: {0x90, 0x40}
+() fun_vec_long_8: return value location: {0x90, 0x40}
+() fun_vec_float_8: return value location: {0x90, 0x40}
+() fun_vec_char_16: return value location: {0x90, 0x40}
+() fun_vec_short_16: return value location: {0x90, 0x40}
+() fun_vec_int_16: return value location: {0x90, 0x40}
+() fun_vec_long_16: return value location: {0x90, 0x40}
+() fun_vec_int128_16: return value location: {0x90, 0x40}
+() fun_vec_float_16: return value location: {0x90, 0x40}
+() fun_vec_double_16: return value location: {0x90, 0x40}
+() fun_hfa1_float: return value location: {0x90, 0x40}
+() fun_hfa1_double: return value location: {0x90, 0x40}
+() fun_hfa1_long_double: return value location: {0x90, 0x40}
+() fun_hfa1_float_a: return value location: {0x90, 0x40}
+() fun_hfa1_double_a: return value location: {0x90, 0x40}
+() fun_hfa1_long_double_a: return value location: {0x90, 0x40}
+() fun_hfa2_float: return value location: {0x90, 0x40} {0x93, 0x4} {0x90, 0x41} {0x93, 0x4}
+() fun_hfa2_double: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8}
+() fun_hfa2_long_double: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10}
+() fun_hfa2_float_a: return value location: {0x90, 0x40} {0x93, 0x4} {0x90, 0x41} {0x93, 0x4}
+() fun_hfa2_double_a: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8}
+() fun_hfa2_long_double_a: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10}
+() fun_hfa3_float: return value location: {0x90, 0x40} {0x93, 0x4} {0x90, 0x41} {0x93, 0x4} {0x90, 0x42} {0x93, 0x4}
+() fun_hfa3_double: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8}
+() fun_hfa3_long_double: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10}
+() fun_hfa3_float_a: return value location: {0x90, 0x40} {0x93, 0x4} {0x90, 0x41} {0x93, 0x4} {0x90, 0x42} {0x93, 0x4}
+() fun_hfa3_double_a: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8}
+() fun_hfa3_long_double_a: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10}
+() fun_hfa4_float: return value location: {0x90, 0x40} {0x93, 0x4} {0x90, 0x41} {0x93, 0x4} {0x90, 0x42} {0x93, 0x4} {0x90, 0x43} {0x93, 0x4}
+() fun_hfa4_double: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8} {0x90, 0x43} {0x93, 0x8}
+() fun_hfa4_long_double: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10} {0x90, 0x43} {0x93, 0x10}
+() fun_hfa4_float_a: return value location: {0x90, 0x40} {0x93, 0x4} {0x90, 0x41} {0x93, 0x4} {0x90, 0x42} {0x93, 0x4} {0x90, 0x43} {0x93, 0x4}
+() fun_hfa4_double_a: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8} {0x90, 0x43} {0x93, 0x8}
+() fun_hfa4_long_double_a: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10} {0x90, 0x43} {0x93, 0x10}
+() fun_nfa5_float: return value location: {0x70, 0}
+() fun_nfa5_double: return value location: {0x70, 0}
+() fun_nfa5_long_double: return value location: {0x70, 0}
+() fun_nfa5_float_a: return value location: {0x70, 0}
+() fun_nfa5_double_a: return value location: {0x70, 0}
+() fun_nfa5_long_double_a: return value location: {0x70, 0}
+() fun_hva1_vec_char_8: return value location: {0x90, 0x40}
+() fun_hva1_vec_short_8: return value location: {0x90, 0x40}
+() fun_hva1_vec_int_8: return value location: {0x90, 0x40}
+() fun_hva1_vec_long_8: return value location: {0x90, 0x40}
+() fun_hva1_vec_float_8: return value location: {0x90, 0x40}
+() fun_hva1_vec_double_8: return value location: {0x90, 0x40}
+() fun_hva1_vec_char_16_t: return value location: {0x90, 0x40}
+() fun_hva1_vec_short_16_t: return value location: {0x90, 0x40}
+() fun_hva1_vec_int_16_t: return value location: {0x90, 0x40}
+() fun_hva1_vec_long_16_t: return value location: {0x90, 0x40}
+() fun_hva1_vec_int128_16_t: return value location: {0x90, 0x40}
+() fun_hva1_vec_float_16_t: return value location: {0x90, 0x40}
+() fun_hva1_vec_double_16_t: return value location: {0x90, 0x40}
+() fun_hva2_vec_char_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8}
+() fun_hva2_vec_short_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8}
+() fun_hva2_vec_int_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8}
+() fun_hva2_vec_long_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8}
+() fun_hva2_vec_float_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8}
+() fun_hva2_vec_double_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8}
+() fun_hva2_vec_char_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10}
+() fun_hva2_vec_short_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10}
+() fun_hva2_vec_int_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10}
+() fun_hva2_vec_long_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10}
+() fun_hva2_vec_int128_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10}
+() fun_hva2_vec_float_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10}
+() fun_hva2_vec_double_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10}
+() fun_hva3_vec_char_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8}
+() fun_hva3_vec_short_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8}
+() fun_hva3_vec_int_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8}
+() fun_hva3_vec_long_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8}
+() fun_hva3_vec_float_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8}
+() fun_hva3_vec_double_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8}
+() fun_hva3_vec_char_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10}
+() fun_hva3_vec_short_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10}
+() fun_hva3_vec_int_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10}
+() fun_hva3_vec_long_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10}
+() fun_hva3_vec_int128_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10}
+() fun_hva3_vec_float_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10}
+() fun_hva3_vec_double_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10}
+() fun_hva4_vec_char_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8} {0x90, 0x43} {0x93, 0x8}
+() fun_hva4_vec_short_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8} {0x90, 0x43} {0x93, 0x8}
+() fun_hva4_vec_int_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8} {0x90, 0x43} {0x93, 0x8}
+() fun_hva4_vec_long_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8} {0x90, 0x43} {0x93, 0x8}
+() fun_hva4_vec_float_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8} {0x90, 0x43} {0x93, 0x8}
+() fun_hva4_vec_double_8: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8} {0x90, 0x43} {0x93, 0x8}
+() fun_hva4_vec_char_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10} {0x90, 0x43} {0x93, 0x10}
+() fun_hva4_vec_short_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10} {0x90, 0x43} {0x93, 0x10}
+() fun_hva4_vec_int_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10} {0x90, 0x43} {0x93, 0x10}
+() fun_hva4_vec_long_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10} {0x90, 0x43} {0x93, 0x10}
+() fun_hva4_vec_int128_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10} {0x90, 0x43} {0x93, 0x10}
+() fun_hva4_vec_float_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10} {0x90, 0x43} {0x93, 0x10}
+() fun_hva4_vec_double_16_t: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10} {0x90, 0x43} {0x93, 0x10}
+() fun_mixed_hfa3_cff: return value location: {0x90, 0x40} {0x93, 0x4} {0x90, 0x41} {0x93, 0x4} {0x90, 0x42} {0x93, 0x4}
+() fun_mixed_hfa3_cdd: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8}
+() fun_mixed_hfa3_cldld: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10}
+() fun_mixed_hfa3_fcf: return value location: {0x90, 0x40} {0x93, 0x4} {0x90, 0x41} {0x93, 0x4} {0x90, 0x42} {0x93, 0x4}
+() fun_mixed_hfa3_dcd: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8} {0x90, 0x42} {0x93, 0x8}
+() fun_mixed_hfa3_ldcld: return value location: {0x90, 0x40} {0x93, 0x10} {0x90, 0x41} {0x93, 0x10} {0x90, 0x42} {0x93, 0x10}
+() fun_mixed_hfa2_fltsht_t: return value location: {0x90, 0x40} {0x93, 0x8} {0x90, 0x41} {0x93, 0x8}
+() main: return value location: {0x50, 0}
+EOF
+
+exit 0
index a0e48c1..d236f5c 100755 (executable)
@@ -19,7 +19,7 @@
 
 testfiles testfile25
 
-testrun_compare ./funcscopes -e testfile25 incr <<\EOF
+testrun_compare ${abs_builddir}/funcscopes -e testfile25 incr <<\EOF
 testfile25: 0x8048000 .. 0x8049528
     inline-test.c (0x11): 0x8048348 (/home/roland/build/stock-elfutils/inline-test.c:7) .. 0x804834f (/home/roland/build/stock-elfutils/inline-test.c:9)
         incr (0x2e): 0x8048348 (/home/roland/build/stock-elfutils/inline-test.c:7) .. 0x804834f (/home/roland/build/stock-elfutils/inline-test.c:9)
index f3949f4..62cae5f 100755 (executable)
@@ -20,7 +20,7 @@
 
 testfiles testfile testfile2
 
-testrun_compare ./get-aranges testfile testfile2 <<\EOF
+testrun_compare ${abs_builddir}/get-aranges testfile testfile2 <<\EOF
 0x804842b: not in range
 CU name: "m.c"
 CU name: "m.c"
index 6eadcd5..a2f2373 100755 (executable)
@@ -20,7 +20,7 @@
 
 testfiles testfile testfile2
 
-testrun_compare ./get-files testfile testfile2 <<\EOF
+testrun_compare ${abs_builddir}/get-files testfile testfile2 <<\EOF
 cuhl = 11, o = 0, asz = 4, osz = 4, ncu = 191
  dirs[0] = "/home/drepper/gnu/new-bu/build/ttt"
  file[0] = "???"
index 8c8c71e..fb48c77 100755 (executable)
@@ -1,5 +1,5 @@
 #! /bin/sh
-# Copyright (C) 1999, 2000, 2002, 2004, 2005 Red Hat, Inc.
+# Copyright (C) 1999, 2000, 2002, 2004, 2005, 2013 Red Hat, Inc.
 # This file is part of elfutils.
 # Written by Ulrich Drepper <drepper@redhat.com>, 1999.
 #
@@ -18,9 +18,9 @@
 
 . $srcdir/test-subr.sh
 
-testfiles testfile testfile2
+testfiles testfile testfile2 testfilenolines
 
-testrun_compare ./get-lines testfile testfile2 <<\EOF
+testrun_compare ${abs_builddir}/get-lines testfile testfile2 <<\EOF
 cuhl = 11, o = 0, asz = 4, osz = 4, ncu = 191
  5 lines
 804842c: /home/drepper/gnu/new-bu/build/ttt/m.c:5:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
@@ -61,4 +61,31 @@ cuhl = 11, o = 267, asz = 4, osz = 4, ncu = 2680
 10000514: /shoggoth/drepper/m.c:8:0: is_stmt:yes, end_seq:yes, bb:no, prologue:no, epilogue:no
 EOF
 
+# - lines.c
+# int ft;
+#
+# int
+# main (int argc, char **argv)
+# {
+#   return ft - 42;
+# }
+#
+# - nolines.c
+# int ft = 42;
+#
+# gcc -g -c lines.c
+# gcc -g -c nolines.c
+# gcc -g -o testfilenolines lines.o nolines.o
+
+testrun_compare ${abs_builddir}/get-lines testfilenolines <<\EOF
+cuhl = 11, o = 0, asz = 8, osz = 4, ncu = 169
+ 4 lines
+400474: /home/mark/src/tests/lines.c:5:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+40047f: /home/mark/src/tests/lines.c:6:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+400488: /home/mark/src/tests/lines.c:7:0: is_stmt:yes, end_seq:no, bb:no, prologue:no, epilogue:no
+40048a: /home/mark/src/tests/lines.c:7:0: is_stmt:yes, end_seq:yes, bb:no, prologue:no, epilogue:no
+cuhl = 11, o = 125, asz = 8, osz = 4, ncu = 243
+ 0 lines
+EOF
+
 exit 0
index a8a1759..912793e 100755 (executable)
@@ -20,7 +20,7 @@
 
 testfiles testfile testfile2
 
-testrun_compare ./get-pubnames testfile testfile2 <<\EOF
+testrun_compare ${abs_builddir}/get-pubnames testfile testfile2 <<\EOF
  [ 0] "main", die: 104, cu: 11
 CU name: "m.c"
 object name: "main"
index 768cf69..3b6c445 100755 (executable)
 
 testfiles testfile testfile2 testfile8 testfile14 testfile23
 
-testrun_compare ./line2addr -e testfile f.c:4 testfile f.c:8 <<\EOF
+testrun_compare ${abs_builddir}/line2addr -e testfile f.c:4 testfile f.c:8 <<\EOF
 f.c:4 -> 0x804846b (/home/drepper/gnu/new-bu/build/ttt/f.c:4)
 EOF
 
-testrun_compare ./line2addr -e testfile2 m.c:6 b.c:1 <<\EOF
+testrun_compare ${abs_builddir}/line2addr -e testfile2 m.c:6 b.c:1 <<\EOF
 m.c:6 -> 0x100004cc (/shoggoth/drepper/m.c:6)
 b.c:1 -> 0x10000470 (/shoggoth/drepper/b.c:4)
 EOF
 
-testrun_compare ./line2addr -e testfile8 strip.c:953 strip.c:365 <<\EOF
+testrun_compare ${abs_builddir}/line2addr -e testfile8 strip.c:953 strip.c:365 <<\EOF
 strip.c:953 -> (.text)+0x169f (/home/drepper/gnu/elfutils/build/src/../../src/strip.c:953)
 strip.c:953 -> (.text)+0x16aa (/home/drepper/gnu/elfutils/build/src/../../src/strip.c:953)
 strip.c:365 -> (.text)+0x278b (/home/drepper/gnu/elfutils/build/src/../../src/strip.c:365)
 strip.c:365 -> (.text)+0x2797 (/home/drepper/gnu/elfutils/build/src/../../src/strip.c:365)
 EOF
 
-testrun_compare ./line2addr -e testfile14 v.c:6 <<\EOF
+testrun_compare ${abs_builddir}/line2addr -e testfile14 v.c:6 <<\EOF
 v.c:6 -> 0x400468 (/home/drepper/local/elfutils-build/20050425/v.c:6)
 v.c:6 -> 0x400487 (/home/drepper/local/elfutils-build/20050425/v.c:6)
 EOF
 
-testrun_compare ./line2addr -e testfile23 foo.c:2 foo.c:6 <<\EOF
+testrun_compare ${abs_builddir}/line2addr -e testfile23 foo.c:2 foo.c:6 <<\EOF
 foo.c:2 -> (.init.text)+0xc (/home/roland/stock-elfutils-build/foo.c:2)
 foo.c:6 -> (.text)+0xc (/home/roland/stock-elfutils-build/foo.c:6)
 EOF
index eb6f8cf..ab5f2c3 100755 (executable)
 # gcc -g -o main main.c
 testfiles testfile_low_high_pc
 
-testrun ./low_high_pc -e ./testfile_low_high_pc
-testrun ./low_high_pc -e ./low_high_pc
-testrun ./low_high_pc -e ../src/strip
-testrun ./low_high_pc -e ../src/strip.o
-testrun ./low_high_pc -e ../libelf/libelf.so
+testrun ${abs_builddir}/low_high_pc -e ./testfile_low_high_pc
+testrun ${abs_builddir}/low_high_pc -e ${abs_builddir}/low_high_pc
+testrun ${abs_builddir}/low_high_pc -e ${abs_top_builddir}/src/strip
+testrun ${abs_builddir}/low_high_pc -e ${abs_top_builddir}/src/strip.o
+testrun ${abs_builddir}/low_high_pc -e ${abs_top_builddir}/libelf/libelf.so
 
 exit 0
index 70a16ed..79b0d88 100755 (executable)
 # gcc -gstrict-dwarf -gdwarf-4 -g3 -o testfile-macinfo macro.c
 
 testfiles testfile-macinfo testfile-macros
+tempfiles readelf.macros.out
 
 status=0
 
-testrun ../src/readelf --debug-dump=info testfile-macinfo \
+testrun ${abs_top_builddir}/src/readelf --debug-dump=info testfile-macinfo \
        | grep macro_info > readelf.macros.out ||
   { echo "*** failure readelf --debug-dump=info testfile-macinfo"; status=1; }
 testrun_compare cat readelf.macros.out <<\EOF
            macro_info           (sec_offset) 0
 EOF
 
-testrun ../src/readelf --debug-dump=info testfile-macros \
+testrun ${abs_top_builddir}/src/readelf --debug-dump=info testfile-macros \
        | grep GNU_macros > readelf.macros.out ||
   { echo "*** failure readelf --debug-dump=info testfile-macros"; status=1; }
 testrun_compare cat readelf.macros.out <<\EOF
            GNU_macros           (sec_offset) 0
 EOF
 
-rm -f readelf.macros.out
-
 exit $status
index ed7672f..d19007f 100755 (executable)
@@ -1,5 +1,5 @@
 #! /bin/sh
-# Copyright (C) 2005, 2006 Red Hat, Inc.
+# Copyright (C) 2005, 2006, 2013 Red Hat, Inc.
 # This file is part of elfutils.
 #
 # This file is free software; you can redistribute it and/or modify
@@ -45,7 +45,14 @@ native_cleanup()
   test_cleanup
 }
 
-trap native_cleanup 0 1 2 15
+native_exit()
+{
+  native_cleanup
+  exit_cleanup
+}
+
+trap native_cleanup 1 2 15
+trap native_exit 0
 
 for cc in "$HOSTCC" "$HOST_CC" cc gcc "$CC"; do
   test "x$cc" != x || continue
@@ -70,8 +77,8 @@ native_test()
   test $native -eq 0 || testrun "$@" -p $native > /dev/null
 }
 
-native_test ./allregs
-native_test ./funcretval
+native_test ${abs_builddir}/allregs
+native_test ${abs_builddir}/funcretval
 
 # We do this explicitly rather than letting the trap 0 cover it,
 # because as of version 3.1 bash prints the "Killed" report for
index 0fe0ec6..6a31afc 100755 (executable)
@@ -1,5 +1,5 @@
 #! /bin/sh
-# Copyright (C) 2012 Red Hat, Inc.
+# Copyright (C) 2012, 2014 Red Hat, Inc.
 # This file is part of elfutils.
 #
 # This file is free software; you can redistribute it and/or modify
 
 . $srcdir/test-subr.sh
 
+# Test different command line combinations on the nm binary itself.
+# Test on nm ET_REL, ET_EXEC and ET_DYN files.
+ET_REL=${abs_top_builddir}/src/nm.o
+ET_EXEC=${abs_top_builddir}/src/nm
+ET_DYN=${abs_top_builddir}/libelf/libelf.so
 for what_arg in --debug-syms --defined-only --dynamic --extern-only; do
   for format_arg in --format=bsd --format=sysv --format=posix; do
     for out_arg in --numeric-sort --no-sort --reverse-sort; do
-      testrun_on_self_quiet ../src/nm $what_arg $format_arg $out_arg
+      for self_file in $ET_REL $ET_EXEC $ET_DYN; do
+       # --dynamic doesn't make sense for ET_REL.
+       if ! test "$what_arg" = "--dynamic" -a "$self_file" = "$ET_REL"; then
+         testrun ${abs_top_builddir}/src/nm $what_arg $format_arg $out_arg $self_file > /dev/null
+       fi
+      done
     done
   done
 done
index 52bb284..3398c0d 100755 (executable)
@@ -1,5 +1,5 @@
 #! /bin/sh
-# Copyright (C) 2011 Red Hat, Inc.
+# Copyright (C) 2011-2013 Red Hat, Inc.
 # This file is part of elfutils.
 #
 # This file is free software; you can redistribute it and/or modify
@@ -33,7 +33,7 @@
 testfiles testfile52-32.so testfile52-32.so.debug
 testfiles testfile52-32.prelink.so testfile52-32.noshdrs.so
 tempfiles testmaps52-32 testfile52-32.noshdrs.so.debug
-ln -s testfile52-32.so.debug testfile52-32.noshdrs.so.debug
+ln -snf testfile52-32.so.debug testfile52-32.noshdrs.so.debug
 
 cat > testmaps52-32 <<EOF
 00111000-00112000 r-xp 00000000 fd:01 1 `pwd`/testfile52-32.so
@@ -47,7 +47,7 @@ EOF
 # Prior to commit 1743d7f, libdwfl would fail on the second address,
 # because it didn't notice that prelink added a 0x20-byte offset from
 # what the .debug file reports.
-testrun_compare ../src/addr2line -S -M testmaps52-32 \
+testrun_compare ${abs_top_builddir}/src/addr2line -S -M testmaps52-32 \
     0x11140c 0x4100042d 0x4200040e <<\EOF
 foo
 /home/jistone/src/elfutils/tests/testfile52-32.c:2
@@ -62,7 +62,7 @@ EOF
 testfiles testfile52-64.so testfile52-64.so.debug
 testfiles testfile52-64.prelink.so testfile52-64.noshdrs.so
 tempfiles testmaps52-64 testfile52-64.noshdrs.so.debug
-ln -s testfile52-64.so.debug testfile52-64.noshdrs.so.debug
+ln -snf testfile52-64.so.debug testfile52-64.noshdrs.so.debug
 
 cat > testmaps52-64 <<EOF
 1000000000-1000001000 r-xp 00000000 fd:11 1 `pwd`/testfile52-64.so
@@ -76,7 +76,7 @@ cat > testmaps52-64 <<EOF
 3800200000-3800201000 rw-p 00000000 fd:11 3 `pwd`/testfile52-64.noshdrs.so
 EOF
 
-testrun_compare ../src/addr2line -S -M testmaps52-64 \
+testrun_compare ${abs_top_builddir}/src/addr2line -S -M testmaps52-64 \
     0x100000056c 0x300000056d 0x380000056e <<\EOF
 foo
 /home/jistone/src/elfutils/tests/testfile52-64.c:2
@@ -97,7 +97,7 @@ EOF
 # prelink -N testfile53-32.prelink
 testfiles testfile53-32 testfile53-32.debug testfile53-32.prelink
 
-testrun_compare ../src/addr2line -S -e testfile53-32 0x8048394 0x8048395 <<\EOF
+testrun_compare ${abs_top_builddir}/src/addr2line -S -e testfile53-32 0x8048394 0x8048395 <<\EOF
 main
 /home/jistone/src/elfutils/tests/testfile53-32.c:2
 main+0x1
@@ -105,7 +105,7 @@ main+0x1
 EOF
 
 # prelink shuffled some of the sections, but .text is in the same place.
-testrun_compare ../src/addr2line -S -e testfile53-32.prelink 0x8048396 0x8048397 <<\EOF
+testrun_compare ${abs_top_builddir}/src/addr2line -S -e testfile53-32.prelink 0x8048396 0x8048397 <<\EOF
 main+0x2
 /home/jistone/src/elfutils/tests/testfile53-32.c:2
 main+0x3
@@ -116,14 +116,14 @@ EOF
 # prelink section shuffling.
 testfiles testfile53-64 testfile53-64.debug testfile53-64.prelink
 
-testrun_compare ../src/addr2line -S -e testfile53-64 0x400474 0x400475 <<\EOF
+testrun_compare ${abs_top_builddir}/src/addr2line -S -e testfile53-64 0x400474 0x400475 <<\EOF
 main
 /home/jistone/src/elfutils/tests/testfile53-64.c:2
 main+0x1
 /home/jistone/src/elfutils/tests/testfile53-64.c:2
 EOF
 
-testrun_compare ../src/addr2line -S -e testfile53-64.prelink 0x400476 0x400477 <<\EOF
+testrun_compare ${abs_top_builddir}/src/addr2line -S -e testfile53-64.prelink 0x400476 0x400477 <<\EOF
 main+0x2
 /home/jistone/src/elfutils/tests/testfile53-64.c:2
 main+0x3
@@ -159,7 +159,7 @@ cat > testmaps54-32 <<EOF
 42001000-42002000 rw-p 00000000 fd:01 3 `pwd`/testfile54-32.noshdrs.so
 EOF
 
-testrun_compare ../src/addr2line -S -M testmaps54-32 \
+testrun_compare ${abs_top_builddir}/src/addr2line -S -M testmaps54-32 \
     0x1111fc 0x1122a4 0x410001fd 0x410012a5 0x420001fe <<\EOF
 foo
 ??:0
@@ -193,7 +193,7 @@ cat > testmaps54-64 <<EOF
 3800200000-3800201000 rw-p 00000000 fd:11 3 `pwd`/testfile54-64.noshdrs.so
 EOF
 
-testrun_compare ../src/addr2line -S -M testmaps54-64 \
+testrun_compare ${abs_top_builddir}/src/addr2line -S -M testmaps54-64 \
     0x10000002f8 0x1000200448 0x30000002f9 0x3000200449 0x38000002fa <<\EOF
 foo
 ??:0
@@ -218,7 +218,7 @@ EOF
 # prelink -N testfile55-32.prelink
 testfiles testfile55-32 testfile55-32.debug testfile55-32.prelink
 
-testrun_compare ../src/addr2line -S -e testfile55-32 0x80483b4 0x80483b5 <<\EOF
+testrun_compare ${abs_top_builddir}/src/addr2line -S -e testfile55-32 0x80483b4 0x80483b5 <<\EOF
 main
 /home/jistone/src/elfutils/tests/testfile55-32.c:2
 main+0x1
@@ -227,7 +227,7 @@ EOF
 
 # prelink splits .bss into .dynbss+.bss, so the start of .bss changes, but the
 # total size remains the same, and .text doesn't move at all.
-testrun_compare ../src/addr2line -S -e testfile55-32.prelink 0x80483b6 0x80483b7 <<\EOF
+testrun_compare ${abs_top_builddir}/src/addr2line -S -e testfile55-32.prelink 0x80483b6 0x80483b7 <<\EOF
 main+0x2
 /home/jistone/src/elfutils/tests/testfile55-32.c:2
 main+0x3
@@ -237,14 +237,14 @@ EOF
 # Repeat testfile55 in 64-bit
 testfiles testfile55-64 testfile55-64.debug testfile55-64.prelink
 
-testrun_compare ../src/addr2line -S -e testfile55-64 0x4004b4 0x4004b5 <<\EOF
+testrun_compare ${abs_top_builddir}/src/addr2line -S -e testfile55-64 0x4004b4 0x4004b5 <<\EOF
 main
 /home/jistone/src/elfutils/tests/testfile55-64.c:2
 main+0x1
 /home/jistone/src/elfutils/tests/testfile55-64.c:2
 EOF
 
-testrun_compare ../src/addr2line -S -e testfile55-64.prelink 0x4004b6 0x4004b7 <<\EOF
+testrun_compare ${abs_top_builddir}/src/addr2line -S -e testfile55-64.prelink 0x4004b6 0x4004b7 <<\EOF
 main+0x2
 /home/jistone/src/elfutils/tests/testfile55-64.c:2
 main+0x3
index ce109cf..0b34cbb 100755 (executable)
@@ -30,7 +30,7 @@ EOF
 
 cp ranlib-test.a ranlib-test.a-copy
 
-testrun ../src/ranlib ranlib-test.a
+testrun ${abs_top_builddir}/src/ranlib ranlib-test.a
 
 # The ranlib call should not have changed anything.
 cmp ranlib-test.a ranlib-test.a-copy
index 75d00b3..dbc57ec 100755 (executable)
@@ -23,7 +23,7 @@ indexed=${indexed:-testfile19.index}
 
 testfiles $original $indexed
 
-testrun ../src/ranlib $original
+testrun ${abs_top_builddir}/src/ranlib $original
 
 if test -z "$noindex"; then
   # The date in the index is different.  The reference file has it blanked
diff --git a/tests/run-readelf-aranges.sh b/tests/run-readelf-aranges.sh
new file mode 100755 (executable)
index 0000000..3fc3c54
--- /dev/null
@@ -0,0 +1,161 @@
+#! /bin/sh
+# Copyright (C) 2013 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
+
+# Tests readelf --debug-dump=aranges and --debug-dump=decodedaranges
+#
+# - foobarbaz.h
+#
+# int bar ();
+# int baz (int i);
+#
+# - bar.c
+#
+# #include "foobarbaz.h"
+#
+# static int bi;
+#
+# static int
+# barbaz (int i)
+# {
+#   return i * 2 - 1;
+# }
+#
+# __attribute__ ((constructor)) void
+# nobar ()
+# {
+#   bi = 1;
+# }
+#
+# int
+# bar ()
+# {
+#   bi++;
+#   return barbaz (bi);
+# }
+#
+# - foo.c
+#
+# include "foobarbaz.h"
+#
+# static int fi = 0;
+#
+# static int
+# foo (int i, int j)
+# {
+#   if (i > j)
+#     return i - j + fi;
+#   else
+#     return (2 * j) - i + fi;
+# }
+#
+# int
+# main (int argc, char **argv)
+# {
+#   int a = bar ();
+#   int b = baz (a + argc);
+#   int r = foo (a, b) - 1;
+#
+#   return r - 48;
+# }
+#
+# - baz.c
+# include "foobarbaz.h"
+#
+# static int bj;
+#
+# static int
+# bazbaz (int j)
+# {
+#   return bj * j - bar ();
+# }
+#
+# __attribute__ ((constructor)) void
+# nobaz ()
+# {
+#   bj = 1;
+# }
+#
+# int
+# baz (int i)
+# {
+#   if (i < 0)
+#     return bazbaz (i);
+#   else
+#     {
+#       while (i-- > 0)
+#         bj += bar ();
+#     }
+#   return bazbaz (i);
+# }
+#
+# gcc -g -O2 -m32 -c baz.c
+# gcc -g -O2 -m32 -c bar.c
+# gcc -g -O2 -m32 -c foo.c
+# gcc -g -O2 -m32 -o testfilefoobarbaz foo.o bar.o baz.o
+
+testfiles testfilefoobarbaz
+
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=aranges testfilefoobarbaz <<EOF
+
+DWARF section [27] '.debug_aranges' at offset 0x1044:
+
+Table at offset 0:
+
+ Length:            28
+ DWARF version:      2
+ CU offset:          0
+ Address size:       4
+ Segment size:       0
+
+   0x080482f0 <main>..0x08048323 <main+0x33>
+
+Table at offset 32:
+
+ Length:            36
+ DWARF version:      2
+ CU offset:        136
+ Address size:       4
+ Segment size:       0
+
+   0x08048440 <bar>..0x08048451 <bar+0x11>
+   0x08048330 <nobar>..0x0804833a <nobar+0xa>
+
+Table at offset 72:
+
+ Length:            36
+ DWARF version:      2
+ CU offset:        1d1
+ Address size:       4
+ Segment size:       0
+
+   0x08048460 <baz>..0x080484bb <baz+0x5b>
+   0x08048340 <nobaz>..0x0804834a <nobaz+0xa>
+EOF
+
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=decodedaranges testfilefoobarbaz <<\EOF
+
+DWARF section [27] '.debug_aranges' at offset 0x1044 contains 5 entries:
+ [0] start: 0x080482f0, length:    52, CU DIE offset:     11
+ [1] start: 0x08048330, length:    11, CU DIE offset:    321
+ [2] start: 0x08048340, length:    11, CU DIE offset:    476
+ [3] start: 0x08048440, length:    18, CU DIE offset:    321
+ [4] start: 0x08048460, length:    92, CU DIE offset:    476
+EOF
+
+exit 0
index 3e4b7bf..d0b6ed2 100755 (executable)
@@ -32,7 +32,7 @@
 
 testfiles testlib_dynseg.so
 
-testrun_compare ../src/readelf -d testlib_dynseg.so <<\EOF
+testrun_compare ${abs_top_builddir}/src/readelf -d testlib_dynseg.so <<\EOF
 
 Dynamic segment contains 28 entries:
  Addr: 0x00000000000017e0  Offset: 0x0007e0  Link to section: [ 3] '.dynstr'
index aadbbbe..27e0f38 100755 (executable)
@@ -1,5 +1,5 @@
 #! /bin/sh
-# Copyright (C) 2012 Red Hat, Inc.
+# Copyright (C) 2012, 2013 Red Hat, Inc.
 # This file is part of elfutils.
 #
 # This file is free software; you can redistribute it and/or modify
 # gcc -g -o testfile_multi_main -L. -ltestfile_multi_shared main.c -Wl,-rpath,.
 # dwz -m testfile_multi.dwz testfile_multi_main libtestfile_multi_shared.so
 
+# main.c
+#
+# struct foobarbaz
+# {
+#   int counter;
+#   char *bookstore;
+# };
+#
+# int
+# main (int argc, char **argv)
+# {
+#   struct foobarbaz fbb;
+#   return 0;
+# }
+
+# gcc -g -o testfile-dwzstr main.c
+# cp testfile-dwzstr testfile-dwzstr.alt
+# dwz -m testfile-dwzstr.multi testfile-dwzstr testfile-dwzstr.alt
+
 testfiles libtestfile_multi_shared.so testfile_multi_main testfile_multi.dwz
+testfiles testfile-dwzstr testfile-dwzstr.multi
+
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info testfile_multi_main <<\EOF
+
+DWARF section [28] '.debug_info' at offset 0x1078:
+ [Offset]
+ Compilation unit at offset 0:
+ Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4
+ [     b]  compile_unit
+           producer             (strp) "GNU C 4.7.0 20120507 (Red Hat 4.7.0-5) -mtune=generic -march=x86-64 -g"
+           language             (data1) C89 (1)
+           name                 (strp) "main.c"
+           comp_dir             (GNU_strp_alt) "/home/mark/src/tests/dwz"
+           low_pc               (addr) 0x00000000004006ac <main>
+           high_pc              (udata) 44 (0x00000000004006d8)
+           stmt_list            (sec_offset) 0
+ [    26]    imported_unit
+             import               (GNU_ref_alt) [     b]
+ [    2b]    pointer_type
+             byte_size            (data1) 8
+             type                 (GNU_ref_alt) [    53]
+ [    31]    subprogram
+             external             (flag_present) 
+             name                 (strp) "main"
+             decl_file            (data1) 1
+             decl_line            (data1) 3
+             prototyped           (flag_present) 
+             type                 (GNU_ref_alt) [    3e]
+             low_pc               (addr) 0x00000000004006ac <main>
+             high_pc              (udata) 44 (0x00000000004006d8)
+             frame_base           (exprloc) 
+              [   0] call_frame_cfa
+             GNU_all_tail_call_sites (flag_present) 
+             sibling              (ref_udata) [    6e]
+ [    48]      formal_parameter
+               name                 (strp) "argc"
+               decl_file            (data1) 1
+               decl_line            (data1) 3
+               type                 (GNU_ref_alt) [    3e]
+               location             (exprloc) 
+                [   0] fbreg -36
+ [    56]      formal_parameter
+               name                 (strp) "argv"
+               decl_file            (data1) 1
+               decl_line            (data1) 3
+               type                 (ref_udata) [    6e]
+               location             (exprloc) 
+                [   0] fbreg -48
+ [    61]      variable
+               name                 (string) "b"
+               decl_file            (data1) 1
+               decl_line            (data1) 5
+               type                 (GNU_ref_alt) [    5a]
+               location             (exprloc) 
+                [   0] fbreg -32
+ [    6e]    pointer_type
+             byte_size            (data1) 8
+             type                 (ref_udata) [    2b]
+EOF
 
-testrun_compare ../src/readelf --debug-dump=info testfile_multi_main <<\EOF
+# Same as above, but find alt debug file in a .dwz subdir.
+mkdir .dwz
+mv testfile_multi.dwz .dwz
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info testfile_multi_main <<\EOF
 
 DWARF section [28] '.debug_info' at offset 0x1078:
  [Offset]
@@ -70,7 +151,7 @@ DWARF section [28] '.debug_info' at offset 0x1078:
            name                 (strp) "main.c"
            comp_dir             (GNU_strp_alt) "/home/mark/src/tests/dwz"
            low_pc               (addr) 0x00000000004006ac <main>
-           high_pc              (udata) 44
+           high_pc              (udata) 44 (0x00000000004006d8)
            stmt_list            (sec_offset) 0
  [    26]    imported_unit
              import               (GNU_ref_alt) [     b]
@@ -85,7 +166,7 @@ DWARF section [28] '.debug_info' at offset 0x1078:
              prototyped           (flag_present) 
              type                 (GNU_ref_alt) [    3e]
              low_pc               (addr) 0x00000000004006ac <main>
-             high_pc              (udata) 44
+             high_pc              (udata) 44 (0x00000000004006d8)
              frame_base           (exprloc) 
               [   0] call_frame_cfa
              GNU_all_tail_call_sites (flag_present) 
@@ -115,8 +196,10 @@ DWARF section [28] '.debug_info' at offset 0x1078:
              byte_size            (data1) 8
              type                 (ref_udata) [    2b]
 EOF
+mv .dwz/testfile_multi.dwz .
+rmdir .dwz
 
-testrun_compare ../src/readelf --debug-dump=info libtestfile_multi_shared.so <<\EOF
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info libtestfile_multi_shared.so <<\EOF
 
 DWARF section [25] '.debug_info' at offset 0x106c:
  [Offset]
@@ -128,7 +211,7 @@ DWARF section [25] '.debug_info' at offset 0x106c:
            name                 (strp) "shared.c"
            comp_dir             (GNU_strp_alt) "/home/mark/src/tests/dwz"
            low_pc               (addr) +0x0000000000000670 <call_foo>
-           high_pc              (udata) 23
+           high_pc              (udata) 23 (+0x0000000000000687)
            stmt_list            (sec_offset) 0
  [    26]    imported_unit
              import               (GNU_ref_alt) [     b]
@@ -140,7 +223,7 @@ DWARF section [25] '.debug_info' at offset 0x106c:
              prototyped           (flag_present) 
              type                 (GNU_ref_alt) [    3e]
              low_pc               (addr) +0x0000000000000670 <call_foo>
-             high_pc              (udata) 23
+             high_pc              (udata) 23 (+0x0000000000000687)
              frame_base           (exprloc) 
               [   0] call_frame_cfa
              GNU_all_call_sites   (flag_present) 
@@ -153,4 +236,97 @@ DWARF section [25] '.debug_info' at offset 0x106c:
                 [   0] fbreg -24
 EOF
 
+# Same as above, but find alt debug file in a .dwz subdir.
+mkdir .dwz
+mv testfile_multi.dwz .dwz
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info libtestfile_multi_shared.so <<\EOF
+
+DWARF section [25] '.debug_info' at offset 0x106c:
+ [Offset]
+ Compilation unit at offset 0:
+ Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4
+ [     b]  compile_unit
+           producer             (strp) "GNU C 4.7.0 20120507 (Red Hat 4.7.0-5) -fpreprocessed -mtune=generic -march=x86-64 -g -fPIC"
+           language             (data1) C89 (1)
+           name                 (strp) "shared.c"
+           comp_dir             (GNU_strp_alt) "/home/mark/src/tests/dwz"
+           low_pc               (addr) +0x0000000000000670 <call_foo>
+           high_pc              (udata) 23 (+0x0000000000000687)
+           stmt_list            (sec_offset) 0
+ [    26]    imported_unit
+             import               (GNU_ref_alt) [     b]
+ [    2b]    subprogram
+             external             (flag_present) 
+             name                 (strp) "call_foo"
+             decl_file            (data1) 1
+             decl_line            (data1) 3
+             prototyped           (flag_present) 
+             type                 (GNU_ref_alt) [    3e]
+             low_pc               (addr) +0x0000000000000670 <call_foo>
+             high_pc              (udata) 23 (+0x0000000000000687)
+             frame_base           (exprloc) 
+              [   0] call_frame_cfa
+             GNU_all_call_sites   (flag_present) 
+ [    41]      formal_parameter
+               name                 (string) "fb"
+               decl_file            (data1) 1
+               decl_line            (data1) 3
+               type                 (GNU_ref_alt) [    76]
+               location             (exprloc) 
+                [   0] fbreg -24
+EOF
+mv .dwz/testfile_multi.dwz .
+rmdir .dwz
+
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=info testfile-dwzstr <<\EOF
+
+DWARF section [28] '.debug_info' at offset 0x1088:
+ [Offset]
+ Compilation unit at offset 0:
+ Version: 4, Abbreviation section offset: 0, Address size: 8, Offset size: 4
+ [     b]  compile_unit
+           producer             (GNU_strp_alt) "GNU C 4.7.2 20121109 (Red Hat 4.7.2-8) -mtune=generic -march=x86-64 -g"
+           language             (data1) C89 (1)
+           name                 (GNU_strp_alt) "main.c"
+           comp_dir             (GNU_strp_alt) "/home/mark/src/tests"
+           low_pc               (addr) 0x00000000004004ec <main>
+           high_pc              (udata) 18 (0x00000000004004fe)
+           stmt_list            (sec_offset) 0
+ [    26]    imported_unit
+             import               (GNU_ref_alt) [     b]
+ [    2b]    subprogram
+             external             (flag_present) 
+             name                 (GNU_strp_alt) "main"
+             decl_file            (data1) 1
+             decl_line            (data1) 8
+             prototyped           (flag_present) 
+             type                 (GNU_ref_alt) [    30]
+             low_pc               (addr) 0x00000000004004ec <main>
+             high_pc              (udata) 18 (0x00000000004004fe)
+             frame_base           (exprloc) 
+              [   0] call_frame_cfa
+             GNU_all_call_sites   (flag_present) 
+ [    41]      formal_parameter
+               name                 (GNU_strp_alt) "argc"
+               decl_file            (data1) 1
+               decl_line            (data1) 8
+               type                 (GNU_ref_alt) [    30]
+               location             (exprloc) 
+                [   0] fbreg -36
+ [    4f]      formal_parameter
+               name                 (GNU_strp_alt) "argv"
+               decl_file            (data1) 1
+               decl_line            (data1) 8
+               type                 (GNU_ref_alt) [    41]
+               location             (exprloc) 
+                [   0] fbreg -48
+ [    5d]      variable
+               name                 (string) "fbb"
+               decl_file            (data1) 1
+               decl_line            (data1) 10
+               type                 (GNU_ref_alt) [    14]
+               location             (exprloc) 
+                [   0] fbreg -32
+EOF
+
 exit 0
index 31c94c1..fcbc3c5 100755 (executable)
@@ -65,7 +65,7 @@
 
 testfiles testfilegdbindex5 testfilegdbindex7
 
-testrun_compare ../src/readelf --debug-dump=gdb_index testfilegdbindex5 <<\EOF
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=gdb_index testfilegdbindex5 <<\EOF
 
 GDB section [33] '.gdb_index' at offset 0xe76 contains 8383 bytes :
  Version:         5
@@ -96,7 +96,7 @@ GDB section [33] '.gdb_index' at offset 0xe76 contains 8383 bytes :
  [ 754] symbol: int, CUs: 0
 EOF
 
-testrun_compare ../src/readelf --debug-dump=gdb_index testfilegdbindex7 <<\EOF
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=gdb_index testfilegdbindex7 <<\EOF
 
 GDB section [33] '.gdb_index' at offset 0xe76 contains 8399 bytes :
  Version:         7
diff --git a/tests/run-readelf-line.sh b/tests/run-readelf-line.sh
new file mode 100755 (executable)
index 0000000..32bcf9d
--- /dev/null
@@ -0,0 +1,259 @@
+#! /bin/sh
+# Copyright (C) 2013 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
+
+# Tests readelf --debug-dump=line and --debug-dump=decodedline
+# See run-readelf-aranges for testfiles.
+
+testfiles testfilefoobarbaz
+
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=line testfilefoobarbaz <<EOF
+
+DWARF section [30] '.debug_line' at offset 0x15f6:
+
+Table at offset 0:
+
+ Length:                     83
+ DWARF version:              2
+ Prologue length:            43
+ Minimum instruction length: 1
+ Maximum operations per instruction: 1
+ Initial value if 'is_stmt': 1
+ Line base:                  -5
+ Line range:                 14
+ Opcode base:                13
+
+Opcodes:
+  [ 1]  0 arguments
+  [ 2]  1 argument
+  [ 3]  1 argument
+  [ 4]  1 argument
+  [ 5]  1 argument
+  [ 6]  0 arguments
+  [ 7]  0 arguments
+  [ 8]  0 arguments
+  [ 9]  1 argument
+  [10]  0 arguments
+  [11]  0 arguments
+  [12]  1 argument
+
+Directory table:
+
+File name table:
+ Entry Dir   Time      Size      Name
+ 1     0     0         0         foo.c
+ 2     0     0         0         foobarbaz.h
+
+Line number statements:
+ [    35] extended opcode 2:  set address to 0x80482f0 <main>
+ [    3c] advance line by constant 15 to 16
+ [    3e] copy
+ [    3f] special opcode 159: address+10 = 0x80482fa <main+0xa>, line+1 = 17
+ [    40] special opcode 117: address+7 = 0x8048301 <main+0x11>, line+1 = 18
+ [    41] advance line by constant -9 to 9
+ [    43] special opcode 200: address+13 = 0x804830e <main+0x1e>, line+0 = 9
+ [    44] special opcode 48: address+2 = 0x8048310 <main+0x20>, line+2 = 11
+ [    45] special opcode 58: address+3 = 0x8048313 <main+0x23>, line-2 = 9
+ [    46] special opcode 48: address+2 = 0x8048315 <main+0x25>, line+2 = 11
+ [    47] special opcode 44: address+2 = 0x8048317 <main+0x27>, line-2 = 9
+ [    48] advance line by constant 13 to 22
+ [    4a] special opcode 46: address+2 = 0x8048319 <main+0x29>, line+0 = 22
+ [    4b] advance line by constant -13 to 9
+ [    4d] special opcode 60: address+3 = 0x804831c <main+0x2c>, line+0 = 9
+ [    4e] advance line by constant 12 to 21
+ [    50] special opcode 60: address+3 = 0x804831f <main+0x2f>, line+0 = 21
+ [    51] special opcode 61: address+3 = 0x8048322 <main+0x32>, line+1 = 22
+ [    52] advance address by 2 to 0x8048324
+ [    54] extended opcode 1:  end of sequence
+
+Table at offset 87:
+
+ Length:                     72
+ DWARF version:              2
+ Prologue length:            28
+ Minimum instruction length: 1
+ Maximum operations per instruction: 1
+ Initial value if 'is_stmt': 1
+ Line base:                  -5
+ Line range:                 14
+ Opcode base:                13
+
+Opcodes:
+  [ 1]  0 arguments
+  [ 2]  1 argument
+  [ 3]  1 argument
+  [ 4]  1 argument
+  [ 5]  1 argument
+  [ 6]  0 arguments
+  [ 7]  0 arguments
+  [ 8]  0 arguments
+  [ 9]  1 argument
+  [10]  0 arguments
+  [11]  0 arguments
+  [12]  1 argument
+
+Directory table:
+
+File name table:
+ Entry Dir   Time      Size      Name
+ 1     0     0         0         bar.c
+
+Line number statements:
+ [    7d] extended opcode 2:  set address to 0x8048330 <nobar>
+ [    84] advance line by constant 12 to 13
+ [    86] copy
+ [    87] special opcode 19: address+0 = 0x8048330 <nobar>, line+1 = 14
+ [    88] advance address by 11 to 0x804833b
+ [    8a] extended opcode 1:  end of sequence
+ [    8d] extended opcode 2:  set address to 0x8048440 <bar>
+ [    94] advance line by constant 18 to 19
+ [    96] copy
+ [    97] special opcode 19: address+0 = 0x8048440 <bar>, line+1 = 20
+ [    98] advance line by constant -12 to 8
+ [    9a] special opcode 200: address+13 = 0x804844d <bar+0xd>, line+0 = 8
+ [    9b] advance line by constant 14 to 22
+ [    9d] special opcode 74: address+4 = 0x8048451 <bar+0x11>, line+0 = 22
+ [    9e] advance address by 1 to 0x8048452
+ [    a0] extended opcode 1:  end of sequence
+
+Table at offset 163:
+
+ Length:                     106
+ DWARF version:              2
+ Prologue length:            43
+ Minimum instruction length: 1
+ Maximum operations per instruction: 1
+ Initial value if 'is_stmt': 1
+ Line base:                  -5
+ Line range:                 14
+ Opcode base:                13
+
+Opcodes:
+  [ 1]  0 arguments
+  [ 2]  1 argument
+  [ 3]  1 argument
+  [ 4]  1 argument
+  [ 5]  1 argument
+  [ 6]  0 arguments
+  [ 7]  0 arguments
+  [ 8]  0 arguments
+  [ 9]  1 argument
+  [10]  0 arguments
+  [11]  0 arguments
+  [12]  1 argument
+
+Directory table:
+
+File name table:
+ Entry Dir   Time      Size      Name
+ 1     0     0         0         baz.c
+ 2     0     0         0         foobarbaz.h
+
+Line number statements:
+ [    d8] extended opcode 2:  set address to 0x8048340 <nobaz>
+ [    df] advance line by constant 12 to 13
+ [    e1] copy
+ [    e2] special opcode 19: address+0 = 0x8048340 <nobaz>, line+1 = 14
+ [    e3] advance address by 11 to 0x804834b
+ [    e5] extended opcode 1:  end of sequence
+ [    e8] extended opcode 2:  set address to 0x8048460 <baz>
+ [    ef] advance line by constant 18 to 19
+ [    f1] copy
+ [    f2] special opcode 74: address+4 = 0x8048464 <baz+0x4>, line+0 = 19
+ [    f3] special opcode 75: address+4 = 0x8048468 <baz+0x8>, line+1 = 20
+ [    f4] extended opcode 4:  set discriminator to 1
+ [    f8] special opcode 78: address+4 = 0x804846c <baz+0xc>, line+4 = 24
+ [    f9] special opcode 187: address+12 = 0x8048478 <baz+0x18>, line+1 = 25
+ [    fa] special opcode 87: address+5 = 0x804847d <baz+0x1d>, line-1 = 24
+ [    fb] special opcode 61: address+3 = 0x8048480 <baz+0x20>, line+1 = 25
+ [    fc] special opcode 101: address+6 = 0x8048486 <baz+0x26>, line-1 = 24
+ [    fd] special opcode 61: address+3 = 0x8048489 <baz+0x29>, line+1 = 25
+ [    fe] special opcode 87: address+5 = 0x804848e <baz+0x2e>, line-1 = 24
+ [    ff] advance line by constant -16 to 8
+ [   101] special opcode 46: address+2 = 0x8048490 <baz+0x30>, line+0 = 8
+ [   102] advance line by constant 20 to 28
+ [   104] special opcode 186: address+12 = 0x804849c <baz+0x3c>, line+0 = 28
+ [   105] advance line by constant -20 to 8
+ [   107] special opcode 88: address+5 = 0x80484a1 <baz+0x41>, line+0 = 8
+ [   108] advance line by constant 13 to 21
+ [   10a] advance address by constant 17 to 0x80484b2 <baz+0x52>
+ [   10b] special opcode 32: address+1 = 0x80484b3 <baz+0x53>, line+0 = 21
+ [   10c] advance address by 9 to 0x80484bc
+ [   10e] extended opcode 1:  end of sequence
+EOF
+
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=decodedline testfilefoobarbaz <<\EOF
+
+DWARF section [30] '.debug_line' at offset 0x15f6:
+
+ CU [b] foo.c
+  line:col SBPE* disc isa op address (Statement Block Prologue Epilogue *End)
+  /home/mark/src/tests/foobarbaz/foo.c (mtime: 0, length: 0)
+    16:0   S        0   0  0 0x080482f0 <main>
+    17:0   S        0   0  0 0x080482fa <main+0xa>
+    18:0   S        0   0  0 0x08048301 <main+0x11>
+     9:0   S        0   0  0 0x0804830e <main+0x1e>
+    11:0   S        0   0  0 0x08048310 <main+0x20>
+     9:0   S        0   0  0 0x08048313 <main+0x23>
+    11:0   S        0   0  0 0x08048315 <main+0x25>
+     9:0   S        0   0  0 0x08048317 <main+0x27>
+    22:0   S        0   0  0 0x08048319 <main+0x29>
+     9:0   S        0   0  0 0x0804831c <main+0x2c>
+    21:0   S        0   0  0 0x0804831f <main+0x2f>
+    22:0   S        0   0  0 0x08048322 <main+0x32>
+    22:0   S   *    0   0  0 0x08048323 <main+0x33>
+
+ CU [141] bar.c
+  line:col SBPE* disc isa op address (Statement Block Prologue Epilogue *End)
+  /home/mark/src/tests/foobarbaz/bar.c (mtime: 0, length: 0)
+    13:0   S        0   0  0 0x08048330 <nobar>
+    14:0   S        0   0  0 0x08048330 <nobar>
+    14:0   S   *    0   0  0 0x0804833a <nobar+0xa>
+
+    19:0   S        0   0  0 0x08048440 <bar>
+    20:0   S        0   0  0 0x08048440 <bar>
+     8:0   S        0   0  0 0x0804844d <bar+0xd>
+    22:0   S        0   0  0 0x08048451 <bar+0x11>
+    22:0   S   *    0   0  0 0x08048451 <bar+0x11>
+
+ CU [1dc] baz.c
+  line:col SBPE* disc isa op address (Statement Block Prologue Epilogue *End)
+  /home/mark/src/tests/foobarbaz/baz.c (mtime: 0, length: 0)
+    13:0   S        0   0  0 0x08048340 <nobaz>
+    14:0   S        0   0  0 0x08048340 <nobaz>
+    14:0   S   *    0   0  0 0x0804834a <nobaz+0xa>
+
+    19:0   S        0   0  0 0x08048460 <baz>
+    19:0   S        0   0  0 0x08048464 <baz+0x4>
+    20:0   S        0   0  0 0x08048468 <baz+0x8>
+    24:0   S        1   0  0 0x0804846c <baz+0xc>
+    25:0   S        0   0  0 0x08048478 <baz+0x18>
+    24:0   S        0   0  0 0x0804847d <baz+0x1d>
+    25:0   S        0   0  0 0x08048480 <baz+0x20>
+    24:0   S        0   0  0 0x08048486 <baz+0x26>
+    25:0   S        0   0  0 0x08048489 <baz+0x29>
+    24:0   S        0   0  0 0x0804848e <baz+0x2e>
+     8:0   S        0   0  0 0x08048490 <baz+0x30>
+    28:0   S        0   0  0 0x0804849c <baz+0x3c>
+     8:0   S        0   0  0 0x080484a1 <baz+0x41>
+    21:0   S        0   0  0 0x080484b3 <baz+0x53>
+    21:0   S   *    0   0  0 0x080484bb <baz+0x5b>
+
+EOF
+
+exit 0
diff --git a/tests/run-readelf-loc.sh b/tests/run-readelf-loc.sh
new file mode 100755 (executable)
index 0000000..98870fc
--- /dev/null
@@ -0,0 +1,109 @@
+#! /bin/sh
+# Copyright (C) 2013 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
+
+# - hello.c
+# int say (const char *prefix);
+#
+# static char *
+# subject (char *word, int count)
+# {
+#   return count > 0 ? word : (word + count);
+# }
+#
+# int
+# main (int argc, char **argv)
+# {
+#    return say (subject (argv[0], argc));
+# }
+#
+# - world.c
+# static int
+# sad (char c)
+# {
+#   return c > 0 ? c : c + 1;
+# }
+#
+# static int
+# happy (const char *w)
+# {
+#   return sad (w[1]);
+# }
+#
+# int
+# say (const char *prefix)
+# {
+#   const char *world = "World";
+#   return prefix ? sad (prefix[0]) : happy (world);
+# }
+#
+# gcc -g -O2 -c hello.c
+# gcc -g -O2 -c world.c
+# gcc -g -o testfileloc hello.o world.o
+
+testfiles testfileloc
+
+# Process values as offsets from base addresses and resolve to symbols.
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=loc --debug-dump=ranges \
+  testfileloc<<\EOF
+
+DWARF section [33] '.debug_loc' at offset 0xd2a:
+ [     0]  0x0000000000400480 <main>..0x000000000040048d <main+0xd> [   0] reg5
+ [    23]  0x0000000000400485 <main+0x5>..0x000000000040048d <main+0xd> [   0] reg5
+ [    46]  0x00000000004004b2 <say+0x12>..0x00000000004004ba <say+0x1a> [   0] breg5 0
+
+DWARF section [34] '.debug_ranges' at offset 0xd94:
+ [     0]  0x0000000000400480 <main>..0x0000000000400482 <main+0x2>
+           0x0000000000400485 <main+0x5>..0x000000000040048d <main+0xd>
+ [    30]  0x00000000004004ad <say+0xd>..0x00000000004004af <say+0xf>
+           0x00000000004004b2 <say+0x12>..0x00000000004004ba <say+0x1a>
+EOF
+
+# Don't resolve addresses to symbols.
+testrun_compare ${abs_top_builddir}/src/readelf -N --debug-dump=loc --debug-dump=ranges \
+  testfileloc<<\EOF
+
+DWARF section [33] '.debug_loc' at offset 0xd2a:
+ [     0]  0x0000000000400480..0x000000000040048d [   0] reg5
+ [    23]  0x0000000000400485..0x000000000040048d [   0] reg5
+ [    46]  0x00000000004004b2..0x00000000004004ba [   0] breg5 0
+
+DWARF section [34] '.debug_ranges' at offset 0xd94:
+ [     0]  0x0000000000400480..0x0000000000400482
+           0x0000000000400485..0x000000000040048d
+ [    30]  0x00000000004004ad..0x00000000004004af
+           0x00000000004004b2..0x00000000004004ba
+EOF
+
+# Produce "raw" unprocessed content.
+testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc --debug-dump=ranges \
+  testfileloc<<\EOF
+
+DWARF section [33] '.debug_loc' at offset 0xd2a:
+ [     0]  000000000000000000..0x000000000000000d [   0] reg5
+ [    23]  0x0000000000000005..0x000000000000000d [   0] reg5
+ [    46]  0x0000000000000012..0x000000000000001a [   0] breg5 0
+
+DWARF section [34] '.debug_ranges' at offset 0xd94:
+ [     0]  000000000000000000..0x0000000000000002
+           0x0000000000000005..0x000000000000000d
+ [    30]  0x000000000000000d..0x000000000000000f
+           0x0000000000000012..0x000000000000001a
+EOF
+
+exit 0
index c65992b..8693203 100755 (executable)
@@ -59,7 +59,7 @@
 
 testfiles testfilemacro
 
-testrun_compare ../src/readelf --debug-dump=macro testfilemacro <<\EOF
+testrun_compare ${abs_top_builddir}/src/readelf --debug-dump=macro testfilemacro <<\EOF
 
 DWARF section [32] '.debug_macro' at offset 0x2480:
 
diff --git a/tests/run-readelf-mixed-corenote.sh b/tests/run-readelf-mixed-corenote.sh
new file mode 100755 (executable)
index 0000000..01e4594
--- /dev/null
@@ -0,0 +1,493 @@
+#! /bin/sh
+# Copyright (C) 2012, 2013, 2014 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 testfile63
+
+testrun_compare ${abs_top_builddir}/src/readelf -n testfile63 <<\EOF
+
+Note segment of 892 bytes at offset 0x274:
+  Owner          Data size  Type
+  CORE                 148  PRSTATUS
+    info.si_signo: 11, info.si_code: 0, info.si_errno: 0, cursig: 11
+    sigpend: <>
+    sighold: <>
+    pid: 11087, ppid: 11063, pgrp: 11087, sid: 11063
+    utime: 0.000000, stime: 0.010000, cutime: 0.000000, cstime: 0.000000
+    orig_r0: -1, fpvalid: 1
+    r0:             1  r1:   -1091672508  r2:   -1091672500
+    r3:             0  r4:             0  r5:             0
+    r6:         33728  r7:             0  r8:             0
+    r9:             0  r10:  -1225703496  r11:  -1091672844
+    r12:            0  sp:    0xbeee64f4  lr:    0xb6dc3f48
+    pc:    0x00008500  spsr:  0x60000010
+  CORE                 124  PRPSINFO
+    state: 0, sname: R, zomb: 0, nice: 0, flag: 0x00400500
+    uid: 0, gid: 0, pid: 11087, ppid: 11063, pgrp: 11087, sid: 11063
+    fname: a.out, psargs: ./a.out 
+  CORE                 144  AUXV
+    HWCAP: 0xe8d7  <swp half thumb fast-mult vfp edsp>
+    PAGESZ: 4096
+    CLKTCK: 100
+    PHDR: 0x8034
+    PHENT: 32
+    PHNUM: 8
+    BASE: 0xb6eee000
+    FLAGS: 0
+    ENTRY: 0x83c0
+    UID: 0
+    EUID: 0
+    GID: 0
+    EGID: 0
+    SECURE: 0
+    RANDOM: 0xbeee674e
+    EXECFN: 0xbeee6ff4
+    PLATFORM: 0xbeee675e
+    NULL
+  CORE                 116  FPREGSET
+    f0: 0x000000000000000000000000  f1: 0x000000000000000000000000
+    f2: 0x000000000000000000000000  f3: 0x000000000000000000000000
+    f4: 0x000000000000000000000000  f5: 0x000000000000000000000000
+    f6: 0x000000000000000000000000  f7: 0x000000000000000000000000
+  LINUX                260  ARM_VFP
+    fpscr: 0x00000000
+    d0:  0x0000000000000000  d1:  0x0000000000000000
+    d2:  0x0000000000000000  d3:  0x0000000000000000
+    d4:  0x0000000000000000  d5:  0x0000000000000000
+    d6:  0x0000000000000000  d7:  0x0000000000000000
+    d8:  0x0000000000000000  d9:  0x0000000000000000
+    d10: 0x0000000000000000  d11: 0x0000000000000000
+    d12: 0x0000000000000000  d13: 0x0000000000000000
+    d14: 0x0000000000000000  d15: 0x0000000000000000
+    d16: 0x0000000000000000  d17: 0x0000000000000000
+    d18: 0x0000000000000000  d19: 0x0000000000000000
+    d20: 0x0000000000000000  d21: 0x0000000000000000
+    d22: 0x0000000000000000  d23: 0x0000000000000000
+    d24: 0x0000000000000000  d25: 0x0000000000000000
+    d26: 0x0000000000000000  d27: 0x0000000000000000
+    d28: 0x0000000000000000  d29: 0x0000000000000000
+    d30: 0x0000000000000000  d31: 0x0000000000000000
+EOF
+
+testfiles testfile67
+testrun_compare ${abs_top_builddir}/src/readelf -n testfile67 <<\EOF
+
+Note segment of 1044 bytes at offset 0xe8:
+  Owner          Data size  Type
+  CORE                 336  PRSTATUS
+    info.si_signo: 4, info.si_code: 0, info.si_errno: 0, cursig: 4
+    sigpend: <>
+    sighold: <>
+    pid: 805, ppid: 804, pgrp: 804, sid: 699
+    utime: 0.000042, stime: 0.000103, cutime: 0.000000, cstime: 0.000000
+    orig_r2: 2571552016, fpvalid: 1
+    pswm:   0x0705c00180000000  pswa:   0x00000000800000d6
+    r0:         4393751543808  r1:         4398002544388
+    r2:                    11  r3:            2571578208
+    r4:            2571702016  r5:         4398003235624
+    r6:            2571580768  r7:            2571702016
+    r8:            2571578208  r9:            2571552016
+    r10:           2571552016  r11:                    0
+    r12:        4398003499008  r13:           2148274656
+    r14:                    0  r15:        4398040761216
+    a0:   0x000003ff  a1:   0xfd54a6f0  a2:   0x00000000  a3:   0x00000000
+    a4:   0x00000000  a5:   0x00000000  a6:   0x00000000  a7:   0x00000000
+    a8:   0x00000000  a9:   0x00000000  a10:  0x00000000  a11:  0x00000000
+    a12:  0x00000000  a13:  0x00000000  a14:  0x00000000  a15:  0x00000000
+  CORE                 136  PRPSINFO
+    state: 0, sname: R, zomb: 0, nice: 0, flag: 0x0000000000400400
+    uid: 0, gid: 0, pid: 805, ppid: 804, pgrp: 804, sid: 699
+    fname: 1, psargs: ./1 
+  CORE                 304  AUXV
+    SYSINFO_EHDR: 0
+    HWCAP: 0x37f
+    PAGESZ: 4096
+    CLKTCK: 100
+    PHDR: 0x80000040
+    PHENT: 56
+    PHNUM: 2
+    BASE: 0
+    FLAGS: 0
+    ENTRY: 0x800000d4
+    UID: 0
+    EUID: 0
+    GID: 0
+    EGID: 0
+    SECURE: 0
+    RANDOM: 0x3ffffa8463c
+    EXECFN: 0x3ffffa85ff4
+    PLATFORM: 0x3ffffa8464c
+    NULL
+  CORE                 136  FPREGSET
+    fpc: 0x00000000
+    f0:  0x0000000000000040  f1:  0x4b00000000000000
+    f2:  0x0000000000000041  f3:  0x3ad50b5555555600
+    f4:  0x0000000000000000  f5:  0x0000000000000000
+    f6:  0x0000000000000000  f7:  0x0000000000000000
+    f8:  0x0000000000000000  f9:  0x0000000000000000
+    f10: 0x0000000000000000  f11: 0x0000000000000000
+    f12: 0x0000000000000000  f13: 0x0000000000000000
+    f14: 0x0000000000000000  f15: 0x0000000000000000
+  LINUX                  8  S390_LAST_BREAK
+    last_break: 0x000003fffd75ccbe
+  LINUX                  4  S390_SYSTEM_CALL
+    system_call: 0
+EOF
+
+testfiles testfile68
+testrun_compare ${abs_top_builddir}/src/readelf -n testfile68 <<\EOF
+
+Note segment of 852 bytes at offset 0x94:
+  Owner          Data size  Type
+  CORE                 224  PRSTATUS
+    info.si_signo: 4, info.si_code: 0, info.si_errno: 0, cursig: 4
+    sigpend: <>
+    sighold: <>
+    pid: 839, ppid: 838, pgrp: 838, sid: 699
+    utime: 0.000043, stime: 0.000102, cutime: 0.000000, cstime: 0.000000
+    orig_r2: -1723388288, fpvalid: 1
+    pswm:  0x070dc000  pswa:  0x8040009a
+    r0:            0  r1:    -43966716  r2:           11  r3:  -1723238816
+    r4:  -1723265280  r5:    -43275480  r6:  -1723245280  r7:  -1723265280
+    r8:  -1723238816  r9:  -1723388288  r10: -1723388288  r11:           0
+    r12:   -43012096  r13: -2146692640  r14:           0  r15:  2139883440
+    a0:   0x000003ff  a1:   0xfd54a6f0  a2:   0x00000000  a3:   0x00000000
+    a4:   0x00000000  a5:   0x00000000  a6:   0x00000000  a7:   0x00000000
+    a8:   0x00000000  a9:   0x00000000  a10:  0x00000000  a11:  0x00000000
+    a12:  0x00000000  a13:  0x00000000  a14:  0x00000000  a15:  0x00000000
+  CORE                 124  PRPSINFO
+    state: 0, sname: R, zomb: 0, nice: 0, flag: 0x00400400
+    uid: 0, gid: 0, pid: 839, ppid: 838, pgrp: 838, sid: 699
+    fname: 2, psargs: ./2 
+  CORE                 152  AUXV
+    SYSINFO_EHDR: 0
+    HWCAP: 0x37f
+    PAGESZ: 4096
+    CLKTCK: 100
+    PHDR: 0x400034
+    PHENT: 32
+    PHNUM: 2
+    BASE: 0
+    FLAGS: 0
+    ENTRY: 0x400098
+    UID: 0
+    EUID: 0
+    GID: 0
+    EGID: 0
+    SECURE: 0
+    RANDOM: 0x7f8c090c
+    EXECFN: 0x7f8c1ff4
+    PLATFORM: 0x7f8c091c
+    NULL
+  CORE                 136  FPREGSET
+    fpc: 0x00000000
+    f0:  0x0000000000000040  f1:  0x4b00000000000000
+    f2:  0x0000000000000041  f3:  0x3ad50b5555555600
+    f4:  0x0000000000000000  f5:  0x0000000000000000
+    f6:  0x0000000000000000  f7:  0x0000000000000000
+    f8:  0x0000000000000000  f9:  0x0000000000000000
+    f10: 0x0000000000000000  f11: 0x0000000000000000
+    f12: 0x0000000000000000  f13: 0x0000000000000000
+    f14: 0x0000000000000000  f15: 0x0000000000000000
+  LINUX                  8  S390_LAST_BREAK
+    last_break: 0xfd75ccbe
+  LINUX                  4  S390_SYSTEM_CALL
+    system_call: 0
+  LINUX                 64  S390_HIGH_GPRS
+    high_r0: 0x000003ff, high_r1: 0x000003ff, high_r2: 0x00000000
+    high_r3: 0x00000000, high_r4: 0x00000000, high_r5: 0x000003ff
+    high_r6: 0x00000000, high_r7: 0x00000000, high_r8: 0x00000000
+    high_r9: 0x00000000, high_r10: 0x00000000, high_r11: 0x00000000
+    high_r12: 0x000003ff, high_r13: 0x00000000, high_r14: 0x00000000
+    high_r15: 0x00000000
+EOF
+
+# To reproduce this core dump, do this on x86_64 machine with Linux
+# 3.7 or later:
+# $ gcc -x c <(echo 'int main () { return *(int *)0x12345678; }')
+# $ ./a.out
+testfiles testfile71
+testrun_compare ${abs_top_builddir}/src/readelf -n testfile71 <<\EOF
+
+Note segment of 1476 bytes at offset 0x430:
+  Owner          Data size  Type
+  CORE                 336  PRSTATUS
+    info.si_signo: 11, info.si_code: 0, info.si_errno: 0, cursig: 11
+    sigpend: <>
+    sighold: <>
+    pid: 9664, ppid: 2868, pgrp: 9664, sid: 2868
+    utime: 0.000000, stime: 0.004000, cutime: 0.000000, cstime: 0.000000
+    orig_rax: -1, fpvalid: 0
+    r15:                       0  r14:                       0
+    r13:         140734971656848  r12:                 4195328
+    rbp:      0x00007fff69fe39b0  rbx:                       0
+    r11:            266286012928  r10:         140734971656256
+    r9:                        0  r8:             266289790592
+    rax:               305419896  rcx:                 4195584
+    rdx:         140734971656872  rsi:         140734971656856
+    rdi:                       1  rip:      0x00000000004004f9
+    rflags:   0x0000000000010246  rsp:      0x00007fff69fe39b0
+    fs.base:   0x00007fa1c8933740  gs.base:   0x0000000000000000
+    cs: 0x0033  ss: 0x002b  ds: 0x0000  es: 0x0000  fs: 0x0000  gs: 0x0000
+  CORE                 136  PRPSINFO
+    state: 0, sname: R, zomb: 0, nice: 0, flag: 0x0000000000000200
+    uid: 1000, gid: 1000, pid: 9664, ppid: 2868, pgrp: 9664, sid: 2868
+    fname: a.out, psargs: ./a.out 
+  CORE                 128  SIGINFO
+    si_signo: 11, si_errno: 0, si_code: 1
+    fault address: 0x12345678
+  CORE                 304  AUXV
+    SYSINFO_EHDR: 0x7fff69ffe000
+    HWCAP: 0xafebfbff  <fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss tm pbe>
+    PAGESZ: 4096
+    CLKTCK: 100
+    PHDR: 0x400040
+    PHENT: 56
+    PHNUM: 9
+    BASE: 0
+    FLAGS: 0
+    ENTRY: 0x400400
+    UID: 1000
+    EUID: 1000
+    GID: 1000
+    EGID: 1000
+    SECURE: 0
+    RANDOM: 0x7fff69fe3d19
+    EXECFN: 0x7fff69fe4ff0
+    PLATFORM: 0x7fff69fe3d29
+    NULL
+  CORE                 469  FILE
+    10 files:
+      00400000-00401000 00000000 4096                /home/petr/a.out
+      00600000-00601000 00000000 4096                /home/petr/a.out
+      00601000-00602000 00001000 4096                /home/petr/a.out
+      3dffa00000-3dffa21000 00000000 135168          /usr/lib64/ld-2.17.so
+      3dffc20000-3dffc21000 00020000 4096            /usr/lib64/ld-2.17.so
+      3dffc21000-3dffc22000 00021000 4096            /usr/lib64/ld-2.17.so
+      3dffe00000-3dfffb6000 00000000 1794048         /usr/lib64/libc-2.17.so
+      3dfffb6000-3e001b6000 001b6000 2097152         /usr/lib64/libc-2.17.so
+      3e001b6000-3e001ba000 001b6000 16384           /usr/lib64/libc-2.17.so
+      3e001ba000-3e001bc000 001ba000 8192            /usr/lib64/libc-2.17.so
+EOF
+
+# To reproduce this core dump, do this on an aarch64 machine:
+# $ gcc -x c <(echo 'int main () { return *(int *)0x12345678; }')
+# $ ./a.out
+testfiles testfile_aarch64_core
+testrun_compare ${abs_top_builddir}/src/readelf -n testfile_aarch64_core <<\EOF
+
+Note segment of 2512 bytes at offset 0x270:
+  Owner          Data size  Type
+  CORE                 392  PRSTATUS
+    info.si_signo: 11, info.si_code: 0, info.si_errno: 0, cursig: 11
+    sigpend: <>
+    sighold: <>
+    pid: 16547, ppid: 3822, pgrp: 16547, sid: 3822
+    utime: 0.010000, stime: 0.000000, cutime: 0.000000, cstime: 0.000000
+    pc: 0x0000000000400548, pstate: 0x0000000060000000, fpvalid: 1
+    x0:             305419896  x1:          548685596648
+    x2:          548685596664  x3:               4195648
+    x4:                     0  x5:          548536191688
+    x6:                     0  x7:  -6341196323062964528
+    x8:                   135  x9:            4294967295
+    x10:              4195026  x11:               184256
+    x12:                  144  x13:                   15
+    x14:         548536635328  x15:                    0
+    x16:         548534815304  x17:              4262024
+    x18:         548685596000  x19:                    0
+    x20:                    0  x21:              4195296
+    x22:                    0  x23:                    0
+    x24:                    0  x25:                    0
+    x26:                    0  x27:                    0
+    x28:                    0  x29:         548685596320
+    x30:         548534815544  sp:    0x0000007fc035c6a0
+  CORE                 136  PRPSINFO
+    state: 0, sname: R, zomb: 0, nice: 0, flag: 0x0000000000400400
+    uid: 0, gid: 0, pid: 16547, ppid: 3822, pgrp: 16547, sid: 3822
+    fname: a.out, psargs: ./a.out 
+  CORE                 128  SIGINFO
+    si_signo: 11, si_errno: 0, si_code: 1
+    fault address: 0x12345678
+  CORE                 304  AUXV
+    SYSINFO_EHDR: 0x7fb7500000
+    HWCAP: 0x3
+    PAGESZ: 65536
+    CLKTCK: 100
+    PHDR: 0x400040
+    PHENT: 56
+    PHNUM: 7
+    BASE: 0x7fb7520000
+    FLAGS: 0
+    ENTRY: 0x4003e0
+    UID: 0
+    EUID: 0
+    GID: 0
+    EGID: 0
+    SECURE: 0
+    RANDOM: 0x7fc035c9e8
+    EXECFN: 0x7fc035fff0
+    PLATFORM: 0x7fc035c9f8
+    NULL
+  CORE                 306  FILE
+    6 files:
+      00400000-00410000 00000000 65536               /root/elfutils/build/a.out
+      00410000-00420000 00000000 65536               /root/elfutils/build/a.out
+      7fb7370000-7fb74d0000 00000000 1441792         /usr/lib64/libc-2.17.so
+      7fb74d0000-7fb74f0000 00150000 131072          /usr/lib64/libc-2.17.so
+      7fb7520000-7fb7540000 00000000 131072          /usr/lib64/ld-2.17.so
+      7fb7540000-7fb7550000 00010000 65536           /usr/lib64/ld-2.17.so
+  CORE                 528  FPREGSET
+    fpsr: 0x00000000, fpcr: 0x00000000
+    v0:  0x00000000000af54b000000000000fe02
+    v1:  0x00000000000000000000000000000000
+    v2:  0x00000000000000000000000000000000
+    v3:  0x00000000000000000000000000000000
+    v4:  0x00000000000000000000000000000000
+    v5:  0x00000000000000000000000000000000
+    v6:  0x00000000000000000000000000000000
+    v7:  0x00000000000000000000000000000000
+    v8:  0x00000000000000000000000000000000
+    v9:  0x00000000000000000000000000000000
+    v10: 0x00000000000000000000000000000000
+    v11: 0x00000000000000000000000000000000
+    v12: 0x00000000000000000000000000000000
+    v13: 0x00000000000000000000000000000000
+    v14: 0x00000000000000000000000000000000
+    v15: 0x00000000000000000000000000000000
+    v16: 0x00000000000000000000000000000000
+    v17: 0x00000000000000000000000000000000
+    v18: 0x00000000000000000000000000000000
+    v19: 0x00000000000000000000000000000000
+    v20: 0x00000000000000000000000000000000
+    v21: 0x00000000000000000000000000000000
+    v22: 0x00000000000000000000000000000000
+    v23: 0x00000000000000000000000000000000
+    v24: 0x00000000000000000000000000000000
+    v25: 0x00000000000000000000000000000000
+    v26: 0x00000000000000000000000000000000
+    v27: 0x00000000000000000000000000000000
+    v28: 0x00000000000000000000000000000000
+    v29: 0x00000000000000000000000000000000
+    v30: 0x00000000000000000000000000000000
+    v31: 0x00000000000000000000000000000000
+  LINUX                  8  ARM_TLS
+    tls: 0x0000007fb73606f0
+  LINUX                264  ARM_HW_BREAK
+    dbg_info: 0x00000610
+    DBGBVR0_EL1: 0x0000000000000000, DBGBCR0_EL1: 0x00000000
+    DBGBVR1_EL1: 0x0000000000000000, DBGBCR1_EL1: 0x00000000
+    DBGBVR2_EL1: 0x0000000000000000, DBGBCR2_EL1: 0x00000000
+    DBGBVR3_EL1: 0x0000000000000000, DBGBCR3_EL1: 0x00000000
+    DBGBVR4_EL1: 0x0000000000000000, DBGBCR4_EL1: 0x00000000
+    DBGBVR5_EL1: 0x0000000000000000, DBGBCR5_EL1: 0x00000000
+    DBGBVR6_EL1: 0x0000000000000000, DBGBCR6_EL1: 0x00000000
+    DBGBVR7_EL1: 0x0000000000000000, DBGBCR7_EL1: 0x00000000
+    DBGBVR8_EL1: 0x0000000000000000, DBGBCR8_EL1: 0x00000000
+    DBGBVR9_EL1: 0x0000000000000000, DBGBCR9_EL1: 0x00000000
+    DBGBVR10_EL1: 0x0000000000000000, DBGBCR10_EL1: 0x00000000
+    DBGBVR11_EL1: 0x0000000000000000, DBGBCR11_EL1: 0x00000000
+    DBGBVR12_EL1: 0x0000000000000000, DBGBCR12_EL1: 0x00000000
+    DBGBVR13_EL1: 0x0000000000000000, DBGBCR13_EL1: 0x00000000
+    DBGBVR14_EL1: 0x0000000000000000, DBGBCR14_EL1: 0x00000000
+    DBGBVR15_EL1: 0x0000000000000000, DBGBCR15_EL1: 0x00000000
+  LINUX                264  ARM_HW_WATCH
+    dbg_info: 0x00000610
+    DBGWVR0_EL1: 0x0000000000000000, DBGWCR0_EL1: 0x00000000
+    DBGWVR1_EL1: 0x0000000000000000, DBGWCR1_EL1: 0x00000000
+    DBGWVR2_EL1: 0x0000000000000000, DBGWCR2_EL1: 0x00000000
+    DBGWVR3_EL1: 0x0000000000000000, DBGWCR3_EL1: 0x00000000
+    DBGWVR4_EL1: 0x0000000000000000, DBGWCR4_EL1: 0x00000000
+    DBGWVR5_EL1: 0x0000000000000000, DBGWCR5_EL1: 0x00000000
+    DBGWVR6_EL1: 0x0000000000000000, DBGWCR6_EL1: 0x00000000
+    DBGWVR7_EL1: 0x0000000000000000, DBGWCR7_EL1: 0x00000000
+    DBGWVR8_EL1: 0x0000000000000000, DBGWCR8_EL1: 0x00000000
+    DBGWVR9_EL1: 0x0000000000000000, DBGWCR9_EL1: 0x00000000
+    DBGWVR10_EL1: 0x0000000000000000, DBGWCR10_EL1: 0x00000000
+    DBGWVR11_EL1: 0x0000000000000000, DBGWCR11_EL1: 0x00000000
+    DBGWVR12_EL1: 0x0000000000000000, DBGWCR12_EL1: 0x00000000
+    DBGWVR13_EL1: 0x0000000000000000, DBGWCR13_EL1: 0x00000000
+    DBGWVR14_EL1: 0x0000000000000000, DBGWCR14_EL1: 0x00000000
+    DBGWVR15_EL1: 0x0000000000000000, DBGWCR15_EL1: 0x00000000
+EOF
+
+# To reproduce this core dump, do this on an i686 machine:
+# $ gcc -x c <(echo 'int main () { return *(int *)0x12345678; }')
+# $ ./a.out
+testfiles testfile_i686_core
+testrun_compare ${abs_top_builddir}/src/readelf -n testfile_i686_core <<\EOF
+
+Note segment of 1000 bytes at offset 0x214:
+  Owner          Data size  Type
+  CORE                 144  PRSTATUS
+    info.si_signo: 11, info.si_code: 0, info.si_errno: 0, cursig: 11
+    sigpend: <>
+    sighold: <>
+    pid: 27395, ppid: 1130, pgrp: 27395, sid: 1130
+    utime: 0.000000, stime: 0.001000, cutime: 0.000000, cstime: 0.000000
+    orig_eax: -1, fpvalid: 0
+    ebx:     1334976512  ecx:    -1239415396  edx:    -1079283900
+    esi:              0  edi:              0  ebp:     0xbfab6f18
+    eax:      305419896  eip:     0x08048408  eflags:  0x00010246
+    esp:     0xbfab6f18
+    ds: 0x007b  es: 0x007b  fs: 0x0000  gs: 0x0033  cs: 0x0073  ss: 0x007b
+  CORE                 124  PRPSINFO
+    state: 0, sname: R, zomb: 0, nice: 0, flag: 0x00000200
+    uid: 1000, gid: 1000, pid: 27395, ppid: 1130, pgrp: 27395, sid: 1130
+    fname: a.out, psargs: ./a.out 
+  CORE                 128  SIGINFO
+    si_signo: 11, si_errno: 0, si_code: 1
+    fault address: 0x12345678
+  CORE                 160  AUXV
+    SYSINFO: 0xb77fc414
+    SYSINFO_EHDR: 0xb77fc000
+    HWCAP: 0x780abfd  <fpu de pse tsc msr pae mce cx8 apic sep pge cmov mmx fxsr sse sse2>
+    PAGESZ: 4096
+    CLKTCK: 100
+    PHDR: 0x8048034
+    PHENT: 32
+    PHNUM: 9
+    BASE: 0
+    FLAGS: 0
+    ENTRY: 0x80482f0
+    UID: 1000
+    EUID: 1000
+    GID: 1000
+    EGID: 1000
+    SECURE: 0
+    RANDOM: 0xbfab70eb
+    EXECFN: 0xbfab7ff4
+    PLATFORM: 0xbfab70fb
+    NULL
+  CORE                 275  FILE
+    9 files:
+      08048000-08049000 00000000 4096                /tmp/a.out
+      08049000-0804a000 00000000 4096                /tmp/a.out
+      0804a000-0804b000 00001000 4096                /tmp/a.out
+      4f744000-4f763000 00000000 126976              /usr/lib/ld-2.18.so
+      4f764000-4f765000 0001f000 4096                /usr/lib/ld-2.18.so
+      4f765000-4f766000 00020000 4096                /usr/lib/ld-2.18.so
+      4f768000-4f920000 00000000 1802240             /usr/lib/libc-2.18.so
+      4f920000-4f922000 001b8000 8192                /usr/lib/libc-2.18.so
+      4f922000-4f923000 001ba000 4096                /usr/lib/libc-2.18.so
+  LINUX                 48  386_TLS
+    index: 6, base: 0xb77da700, limit: 0x000fffff, flags: 0x00000051
+    index: 7, base: 0x00000000, limit: 0x00000000, flags: 0x00000028
+    index: 8, base: 0x00000000, limit: 0x00000000, flags: 0x00000028
+EOF
+
+exit 0
diff --git a/tests/run-readelf-s.sh b/tests/run-readelf-s.sh
new file mode 100755 (executable)
index 0000000..59407d1
--- /dev/null
@@ -0,0 +1,378 @@
+#! /bin/sh
+# Copyright (C) 2013 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
+
+# Tests readelf -s and readelf --elf-section -s
+# See also run-dwflsyms.sh
+#
+# - bar.c
+#
+# static int b1 = 1;
+# int b2 = 1;
+#
+# static int
+# foo (int a)
+# {
+#   return a + b2;
+# }
+#
+# int bar (int b)
+# {
+#   return b - foo (b - b1);
+# }
+#
+# - foo.c
+#
+# extern int bar (int b);
+# extern int b2;
+#
+# int
+# main (int argc, char ** argv)
+# {
+#   return bar (argc + b2);
+# }
+#
+# gcc -pie -g -c foo.c
+# gcc -pie -g -c bar.c
+# gcc -pie -g -o baz foo.o bar.o
+#
+# - testfilebaztab (dynsym + symtab)
+# cp baz testfilebaztab
+#
+# - testfilebazdbg (dynsym + .debug file)
+# eu-strip --remove-comment -f testfilebazdbg.debug baz
+# cp baz testfilebazdbg
+#
+#-  testfilebazdyn (dynsym only)
+# objcopy --remove-section=.gnu_debuglink baz testfilebazdyn
+#
+# - testfilebazmdb (dynsym + gnu_debugdata + .debug)
+#   This is how rpmbuild does it:
+# nm -D baz --format=posix --defined-only | awk '{ print $1 }' | sort > dynsyms
+# nm baz.debug --format=posix --defined-only | awk '{ if ($2 == "T" || $2 == "t") print $1 }' | sort > funcsyms
+# comm -13 dynsyms funcsyms > keep_symbols
+# objcopy -S --remove-section .gdb_index --remove-section .comment --keep-symbols=keep_symbols baz.debug mini_debuginfo
+# rm -f mini_debuginfo.xz
+# xz mini_debuginfo
+# objcopy --add-section .gnu_debugdata=mini_debuginfo.xz baz
+# cp baz testfilebazmdb
+#
+# - testfilebazmin (dynsym + gnu_debugdata)
+# objcopy --remove-section=.gnu_debuglink baz testfilebazmin
+#
+#
+# Special auxiliary only, can happen with static binaries.
+# - start.c
+#
+# extern int main (int argc, char ** argv);
+# void _start (void) { for (;;) main (1, 0); }
+#
+# gcc -g -c start.c
+# gcc -static -nostdlib -o bas foo.o bar.o start.o
+#
+# eu-strip --remove-comment -f bas.debug bas
+# nm bas.debug --format=posix --defined-only | awk '{ if ($2 == "T" || $2 == "t") print $1 }' | sort > funcsyms
+# objcopy -S --remove-section .gdb_index --remove-section .comment --keep-symbols=funcsyms bas.debug mini_debuginfo
+# rm -f mini_debuginfo.xz
+# xz mini_debuginfo
+# objcopy --add-section .gnu_debugdata=mini_debuginfo.xz bas
+# rm bas.debug
+# mv bas testfilebasmin
+#
+#
+# Make sure that find_aux_sym doesn't corrupt relocations, avoiding a kernel
+# heuristic that forces ET_EXEC->ET_DYN.  NB: ld.gold doesn't seem to produce
+# the mismatched load addrs between the main file and the mini_debuginfo, so
+# this is forcing ld.bfd.
+#
+# gcc -g -o bax foo.c bar.c -fuse-ld=bfd
+# eu-strip --remove-comment -f bax.debug bax
+# nm -D bax --format=posix --defined-only | awk '{ print $1 }' | sort > dynsyms
+# nm bax.debug --format=posix --defined-only | awk '{ if ($2 == "T" || $2 == "t") print $1 }' | sort > funcsyms
+# comm -13 dynsyms funcsyms > keep_symbols
+# objcopy -S --remove-section .gdb_index --remove-section .comment --keep-symbols=keep_symbols bax.debug mini_debuginfo
+# rm -f mini_debuginfo.xz
+# xz mini_debuginfo
+# objcopy --add-section .gnu_debugdata=mini_debuginfo.xz bax
+# objcopy --remove-section=.gnu_debuglink bax testfilebaxmin
+
+
+testfiles testfilebaztab
+testfiles testfilebazdbg testfilebazdbg.debug
+testfiles testfilebazdyn
+testfiles testfilebazmdb
+testfiles testfilebazmin
+testfiles testfilebasmin
+testfiles testfilebaxmin
+
+tempfiles testfile.dynsym.in testfile.symtab.in testfile.minsym.in
+
+cat > testfile.dynsym.in <<\EOF
+
+Symbol table [ 5] '.dynsym' contains 14 entries:
+ 2 local symbols  String table: [ 6] '.dynstr'
+  Num:            Value   Size Type    Bind   Vis          Ndx Name
+    0: 0000000000000000      0 NOTYPE  LOCAL  DEFAULT    UNDEF 
+    1: 0000000000000238      0 SECTION LOCAL  DEFAULT        1 
+    2: 0000000000000000      0 NOTYPE  WEAK   DEFAULT    UNDEF _ITM_deregisterTMCloneTable
+    3: 0000000000000000      0 FUNC    GLOBAL DEFAULT    UNDEF __libc_start_main@GLIBC_2.2.5 (2)
+    4: 0000000000000000      0 NOTYPE  WEAK   DEFAULT    UNDEF __gmon_start__
+    5: 0000000000000000      0 NOTYPE  WEAK   DEFAULT    UNDEF _Jv_RegisterClasses
+    6: 0000000000000000      0 NOTYPE  WEAK   DEFAULT    UNDEF _ITM_registerTMCloneTable
+    7: 0000000000000000      0 FUNC    WEAK   DEFAULT    UNDEF __cxa_finalize@GLIBC_2.2.5 (2)
+    8: 000000000020103c      0 NOTYPE  GLOBAL DEFAULT       25 _edata
+    9: 0000000000201040      0 NOTYPE  GLOBAL DEFAULT       26 _end
+   10: 0000000000000860    137 FUNC    GLOBAL DEFAULT       13 __libc_csu_init
+   11: 000000000020103c      0 NOTYPE  GLOBAL DEFAULT       26 __bss_start
+   12: 00000000000007f0     35 FUNC    GLOBAL DEFAULT       13 main
+   13: 00000000000008f0      2 FUNC    GLOBAL DEFAULT       13 __libc_csu_fini
+EOF
+
+cat > testfile.symtab.in <<\EOF
+
+Symbol table [34] '.symtab' contains 76 entries:
+ 54 local symbols  String table: [35] '.strtab'
+  Num:            Value   Size Type    Bind   Vis          Ndx Name
+    0: 0000000000000000      0 NOTYPE  LOCAL  DEFAULT    UNDEF 
+    1: 0000000000000238      0 SECTION LOCAL  DEFAULT        1 
+    2: 0000000000000254      0 SECTION LOCAL  DEFAULT        2 
+    3: 0000000000000274      0 SECTION LOCAL  DEFAULT        3 
+    4: 0000000000000298      0 SECTION LOCAL  DEFAULT        4 
+    5: 00000000000002d8      0 SECTION LOCAL  DEFAULT        5 
+    6: 0000000000000428      0 SECTION LOCAL  DEFAULT        6 
+    7: 00000000000004f2      0 SECTION LOCAL  DEFAULT        7 
+    8: 0000000000000510      0 SECTION LOCAL  DEFAULT        8 
+    9: 0000000000000530      0 SECTION LOCAL  DEFAULT        9 
+   10: 0000000000000638      0 SECTION LOCAL  DEFAULT       10 
+   11: 0000000000000680      0 SECTION LOCAL  DEFAULT       11 
+   12: 00000000000006a0      0 SECTION LOCAL  DEFAULT       12 
+   13: 00000000000006e0      0 SECTION LOCAL  DEFAULT       13 
+   14: 00000000000008f4      0 SECTION LOCAL  DEFAULT       14 
+   15: 0000000000000900      0 SECTION LOCAL  DEFAULT       15 
+   16: 0000000000000904      0 SECTION LOCAL  DEFAULT       16 
+   17: 0000000000000948      0 SECTION LOCAL  DEFAULT       17 
+   18: 0000000000200dd0      0 SECTION LOCAL  DEFAULT       18 
+   19: 0000000000200dd8      0 SECTION LOCAL  DEFAULT       19 
+   20: 0000000000200de0      0 SECTION LOCAL  DEFAULT       20 
+   21: 0000000000200de8      0 SECTION LOCAL  DEFAULT       21 
+   22: 0000000000200df0      0 SECTION LOCAL  DEFAULT       22 
+   23: 0000000000200fc0      0 SECTION LOCAL  DEFAULT       23 
+   24: 0000000000201000      0 SECTION LOCAL  DEFAULT       24 
+   25: 0000000000201030      0 SECTION LOCAL  DEFAULT       25 
+   26: 000000000020103c      0 SECTION LOCAL  DEFAULT       26 
+   27: 0000000000000000      0 SECTION LOCAL  DEFAULT       27 
+   28: 0000000000000000      0 SECTION LOCAL  DEFAULT       28 
+   29: 0000000000000000      0 SECTION LOCAL  DEFAULT       29 
+   30: 0000000000000000      0 SECTION LOCAL  DEFAULT       30 
+   31: 0000000000000000      0 SECTION LOCAL  DEFAULT       31 
+   32: 0000000000000000      0 SECTION LOCAL  DEFAULT       32 
+   33: 0000000000000000      0 FILE    LOCAL  DEFAULT      ABS crtstuff.c
+   34: 0000000000200de0      0 OBJECT  LOCAL  DEFAULT       20 __JCR_LIST__
+   35: 0000000000000710      0 FUNC    LOCAL  DEFAULT       13 deregister_tm_clones
+   36: 0000000000000740      0 FUNC    LOCAL  DEFAULT       13 register_tm_clones
+   37: 0000000000000780      0 FUNC    LOCAL  DEFAULT       13 __do_global_dtors_aux
+   38: 000000000020103c      1 OBJECT  LOCAL  DEFAULT       26 completed.6137
+   39: 0000000000200dd8      0 OBJECT  LOCAL  DEFAULT       19 __do_global_dtors_aux_fini_array_entry
+   40: 00000000000007c0      0 FUNC    LOCAL  DEFAULT       13 frame_dummy
+   41: 0000000000200dd0      0 OBJECT  LOCAL  DEFAULT       18 __frame_dummy_init_array_entry
+   42: 0000000000000000      0 FILE    LOCAL  DEFAULT      ABS foo.c
+   43: 0000000000000000      0 FILE    LOCAL  DEFAULT      ABS bar.c
+   44: 0000000000201034      4 OBJECT  LOCAL  DEFAULT       25 b1
+   45: 0000000000000814     20 FUNC    LOCAL  DEFAULT       13 foo
+   46: 0000000000000000      0 FILE    LOCAL  DEFAULT      ABS crtstuff.c
+   47: 0000000000000a58      0 OBJECT  LOCAL  DEFAULT       17 __FRAME_END__
+   48: 0000000000200de0      0 OBJECT  LOCAL  DEFAULT       20 __JCR_END__
+   49: 0000000000000000      0 FILE    LOCAL  DEFAULT      ABS 
+   50: 0000000000200dd8      0 NOTYPE  LOCAL  DEFAULT       18 __init_array_end
+   51: 0000000000200df0      0 OBJECT  LOCAL  DEFAULT       22 _DYNAMIC
+   52: 0000000000200dd0      0 NOTYPE  LOCAL  DEFAULT       18 __init_array_start
+   53: 0000000000201000      0 OBJECT  LOCAL  DEFAULT       24 _GLOBAL_OFFSET_TABLE_
+   54: 00000000000008f0      2 FUNC    GLOBAL DEFAULT       13 __libc_csu_fini
+   55: 0000000000000000      0 NOTYPE  WEAK   DEFAULT    UNDEF _ITM_deregisterTMCloneTable
+   56: 0000000000201030      0 NOTYPE  WEAK   DEFAULT       25 data_start
+   57: 000000000020103c      0 NOTYPE  GLOBAL DEFAULT       25 _edata
+   58: 0000000000000828     44 FUNC    GLOBAL DEFAULT       13 bar
+   59: 00000000000008f4      0 FUNC    GLOBAL DEFAULT       14 _fini
+   60: 0000000000000000      0 FUNC    GLOBAL DEFAULT    UNDEF __libc_start_main@@GLIBC_2.2.5
+   61: 0000000000201030      0 NOTYPE  GLOBAL DEFAULT       25 __data_start
+   62: 0000000000000000      0 NOTYPE  WEAK   DEFAULT    UNDEF __gmon_start__
+   63: 0000000000200de8      0 OBJECT  GLOBAL HIDDEN        21 __dso_handle
+   64: 0000000000000900      4 OBJECT  GLOBAL DEFAULT       15 _IO_stdin_used
+   65: 0000000000201038      4 OBJECT  GLOBAL DEFAULT       25 b2
+   66: 0000000000000860    137 FUNC    GLOBAL DEFAULT       13 __libc_csu_init
+   67: 0000000000201040      0 NOTYPE  GLOBAL DEFAULT       26 _end
+   68: 00000000000006e0      0 FUNC    GLOBAL DEFAULT       13 _start
+   69: 000000000020103c      0 NOTYPE  GLOBAL DEFAULT       26 __bss_start
+   70: 00000000000007f0     35 FUNC    GLOBAL DEFAULT       13 main
+   71: 0000000000000000      0 NOTYPE  WEAK   DEFAULT    UNDEF _Jv_RegisterClasses
+   72: 0000000000201040      0 OBJECT  GLOBAL HIDDEN        25 __TMC_END__
+   73: 0000000000000000      0 NOTYPE  WEAK   DEFAULT    UNDEF _ITM_registerTMCloneTable
+   74: 0000000000000000      0 FUNC    WEAK   DEFAULT    UNDEF __cxa_finalize@@GLIBC_2.2.5
+   75: 0000000000000680      0 FUNC    GLOBAL DEFAULT       11 _init
+EOF
+
+cat > testfile.minsym.in <<\EOF
+
+Symbol table [28] '.symtab' contains 40 entries:
+ 36 local symbols  String table: [29] '.strtab'
+  Num:            Value   Size Type    Bind   Vis          Ndx Name
+    0: 0000000000000000      0 NOTYPE  LOCAL  DEFAULT    UNDEF 
+    1: 0000000000000710      0 FUNC    LOCAL  DEFAULT       13 deregister_tm_clones
+    2: 0000000000000740      0 FUNC    LOCAL  DEFAULT       13 register_tm_clones
+    3: 0000000000000780      0 FUNC    LOCAL  DEFAULT       13 __do_global_dtors_aux
+    4: 0000000000200dd8      0 OBJECT  LOCAL  DEFAULT       19 __do_global_dtors_aux_fini_array_entry
+    5: 00000000000007c0      0 FUNC    LOCAL  DEFAULT       13 frame_dummy
+    6: 0000000000200dd0      0 OBJECT  LOCAL  DEFAULT       18 __frame_dummy_init_array_entry
+    7: 0000000000000814     20 FUNC    LOCAL  DEFAULT       13 foo
+    8: 0000000000200dd8      0 NOTYPE  LOCAL  DEFAULT       18 __init_array_end
+    9: 0000000000200dd0      0 NOTYPE  LOCAL  DEFAULT       18 __init_array_start
+   10: 0000000000000238      0 SECTION LOCAL  DEFAULT        1 
+   11: 0000000000000254      0 SECTION LOCAL  DEFAULT        2 
+   12: 0000000000000274      0 SECTION LOCAL  DEFAULT        3 
+   13: 0000000000000298      0 SECTION LOCAL  DEFAULT        4 
+   14: 00000000000002d8      0 SECTION LOCAL  DEFAULT        5 
+   15: 0000000000000428      0 SECTION LOCAL  DEFAULT        6 
+   16: 00000000000004f2      0 SECTION LOCAL  DEFAULT        7 
+   17: 0000000000000510      0 SECTION LOCAL  DEFAULT        8 
+   18: 0000000000000530      0 SECTION LOCAL  DEFAULT        9 
+   19: 0000000000000638      0 SECTION LOCAL  DEFAULT       10 
+   20: 0000000000000680      0 SECTION LOCAL  DEFAULT       11 
+   21: 00000000000006a0      0 SECTION LOCAL  DEFAULT       12 
+   22: 00000000000006e0      0 SECTION LOCAL  DEFAULT       13 
+   23: 00000000000008f4      0 SECTION LOCAL  DEFAULT       14 
+   24: 0000000000000900      0 SECTION LOCAL  DEFAULT       15 
+   25: 0000000000000904      0 SECTION LOCAL  DEFAULT       16 
+   26: 0000000000000948      0 SECTION LOCAL  DEFAULT       17 
+   27: 0000000000200dd0      0 SECTION LOCAL  DEFAULT       18 
+   28: 0000000000200dd8      0 SECTION LOCAL  DEFAULT       19 
+   29: 0000000000200de0      0 SECTION LOCAL  DEFAULT       20 
+   30: 0000000000200de8      0 SECTION LOCAL  DEFAULT       21 
+   31: 0000000000200df0      0 SECTION LOCAL  DEFAULT       22 
+   32: 0000000000200fc0      0 SECTION LOCAL  DEFAULT       23 
+   33: 0000000000201000      0 SECTION LOCAL  DEFAULT       24 
+   34: 0000000000201030      0 SECTION LOCAL  DEFAULT       25 
+   35: 000000000020103c      0 SECTION LOCAL  DEFAULT       26 
+   36: 0000000000000828     44 FUNC    GLOBAL DEFAULT       13 bar
+   37: 00000000000008f4      0 FUNC    GLOBAL DEFAULT       14 _fini
+   38: 00000000000006e0      0 FUNC    GLOBAL DEFAULT       13 _start
+   39: 0000000000000680      0 FUNC    GLOBAL DEFAULT       11 _init
+EOF
+
+cat testfile.dynsym.in testfile.symtab.in \
+  | testrun_compare ${abs_top_builddir}/src/readelf -s testfilebaztab
+
+cat testfile.dynsym.in \
+  | testrun_compare ${abs_top_builddir}/src/readelf -s testfilebazdbg
+
+cat testfile.symtab.in \
+  | testrun_compare ${abs_top_builddir}/src/readelf -s testfilebazdbg.debug
+
+cat testfile.dynsym.in \
+  | testrun_compare ${abs_top_builddir}/src/readelf -s testfilebazdyn
+
+cat testfile.dynsym.in \
+  | testrun_compare ${abs_top_builddir}/src/readelf -s testfilebazmdb
+
+cat testfile.minsym.in \
+  | testrun_compare ${abs_top_builddir}/src/readelf --elf-section -s testfilebazmdb
+
+cat testfile.dynsym.in \
+  | testrun_compare ${abs_top_builddir}/src/readelf -s testfilebazmin
+
+cat testfile.minsym.in \
+  | testrun_compare ${abs_top_builddir}/src/readelf --elf-section -s testfilebazmin
+
+testrun_compare ${abs_top_builddir}/src/readelf -s testfilebasmin <<EOF
+EOF
+
+testrun_compare ${abs_top_builddir}/src/readelf --elf-section -s testfilebasmin <<\EOF
+
+Symbol table [ 6] '.symtab' contains 9 entries:
+ 6 local symbols  String table: [ 7] '.strtab'
+  Num:            Value   Size Type    Bind   Vis          Ndx Name
+    0: 0000000000000000      0 NOTYPE  LOCAL  DEFAULT    UNDEF 
+    1: 0000000000400168     18 FUNC    LOCAL  DEFAULT        2 foo
+    2: 0000000000400120      0 SECTION LOCAL  DEFAULT        1 
+    3: 0000000000400144      0 SECTION LOCAL  DEFAULT        2 
+    4: 00000000004001c0      0 SECTION LOCAL  DEFAULT        3 
+    5: 0000000000600258      0 SECTION LOCAL  DEFAULT        4 
+    6: 00000000004001a8     21 FUNC    GLOBAL DEFAULT        2 _start
+    7: 0000000000400144     33 FUNC    GLOBAL DEFAULT        2 main
+    8: 000000000040017a     44 FUNC    GLOBAL DEFAULT        2 bar
+EOF
+
+testrun_compare ${abs_top_builddir}/src/readelf -s testfilebaxmin <<EOF
+
+Symbol table [ 5] '.dynsym' contains 3 entries:
+ 1 local symbol  String table: [ 6] '.dynstr'
+  Num:            Value   Size Type    Bind   Vis          Ndx Name
+    0: 0000000000000000      0 NOTYPE  LOCAL  DEFAULT    UNDEF 
+    1: 0000000000000000      0 FUNC    GLOBAL DEFAULT    UNDEF __libc_start_main@GLIBC_2.2.5 (2)
+    2: 0000000000000000      0 NOTYPE  WEAK   DEFAULT    UNDEF __gmon_start__
+EOF
+
+testrun_compare ${abs_top_builddir}/src/readelf --elf-section -s testfilebaxmin <<\EOF
+
+Symbol table [27] '.symtab' contains 42 entries:
+ 35 local symbols  String table: [28] '.strtab'
+  Num:            Value   Size Type    Bind   Vis          Ndx Name
+    0: 0000000000000000      0 NOTYPE  LOCAL  DEFAULT    UNDEF 
+    1: 0000000000400430      0 FUNC    LOCAL  DEFAULT       13 deregister_tm_clones
+    2: 0000000000400460      0 FUNC    LOCAL  DEFAULT       13 register_tm_clones
+    3: 00000000004004a0      0 FUNC    LOCAL  DEFAULT       13 __do_global_dtors_aux
+    4: 0000000000600e18      0 OBJECT  LOCAL  DEFAULT       19 __do_global_dtors_aux_fini_array_entry
+    5: 00000000004004c0      0 FUNC    LOCAL  DEFAULT       13 frame_dummy
+    6: 0000000000600e10      0 OBJECT  LOCAL  DEFAULT       18 __frame_dummy_init_array_entry
+    7: 00000000004004f0     20 FUNC    LOCAL  DEFAULT       13 foo
+    8: 0000000000600e18      0 NOTYPE  LOCAL  DEFAULT       18 __init_array_end
+    9: 0000000000600e10      0 NOTYPE  LOCAL  DEFAULT       18 __init_array_start
+   10: 0000000000400238      0 SECTION LOCAL  DEFAULT        1 
+   11: 0000000000400254      0 SECTION LOCAL  DEFAULT        2 
+   12: 0000000000400274      0 SECTION LOCAL  DEFAULT        3 
+   13: 0000000000400298      0 SECTION LOCAL  DEFAULT        4 
+   14: 00000000004002b8      0 SECTION LOCAL  DEFAULT        5 
+   15: 0000000000400300      0 SECTION LOCAL  DEFAULT        6 
+   16: 0000000000400338      0 SECTION LOCAL  DEFAULT        7 
+   17: 0000000000400340      0 SECTION LOCAL  DEFAULT        8 
+   18: 0000000000400360      0 SECTION LOCAL  DEFAULT        9 
+   19: 0000000000400378      0 SECTION LOCAL  DEFAULT       10 
+   20: 00000000004003a8      0 SECTION LOCAL  DEFAULT       11 
+   21: 00000000004003d0      0 SECTION LOCAL  DEFAULT       12 
+   22: 0000000000400400      0 SECTION LOCAL  DEFAULT       13 
+   23: 00000000004005c4      0 SECTION LOCAL  DEFAULT       14 
+   24: 00000000004005d0      0 SECTION LOCAL  DEFAULT       15 
+   25: 00000000004005e0      0 SECTION LOCAL  DEFAULT       16 
+   26: 0000000000400628      0 SECTION LOCAL  DEFAULT       17 
+   27: 0000000000600e10      0 SECTION LOCAL  DEFAULT       18 
+   28: 0000000000600e18      0 SECTION LOCAL  DEFAULT       19 
+   29: 0000000000600e20      0 SECTION LOCAL  DEFAULT       20 
+   30: 0000000000600e28      0 SECTION LOCAL  DEFAULT       21 
+   31: 0000000000600ff8      0 SECTION LOCAL  DEFAULT       22 
+   32: 0000000000601000      0 SECTION LOCAL  DEFAULT       23 
+   33: 0000000000601028      0 SECTION LOCAL  DEFAULT       24 
+   34: 0000000000601034      0 SECTION LOCAL  DEFAULT       25 
+   35: 00000000004005c0      2 FUNC    GLOBAL DEFAULT       13 __libc_csu_fini
+   36: 0000000000400504     40 FUNC    GLOBAL DEFAULT       13 bar
+   37: 00000000004005c4      0 FUNC    GLOBAL DEFAULT       14 _fini
+   38: 0000000000400550    101 FUNC    GLOBAL DEFAULT       13 __libc_csu_init
+   39: 0000000000400400      0 FUNC    GLOBAL DEFAULT       13 _start
+   40: 000000000040052c     35 FUNC    GLOBAL DEFAULT       13 main
+   41: 00000000004003a8      0 FUNC    GLOBAL DEFAULT       11 _init
+EOF
+
+exit 0
index 4602712..7ffb357 100755 (executable)
@@ -18,4 +18,4 @@
 . $srcdir/test-subr.sh
 
 # Just makes sure readelf doesn't crash
-testrun_on_self_quiet ../src/readelf -a -w
+testrun_on_self_quiet ${abs_top_builddir}/src/readelf -a -w
index b64103e..4725049 100755 (executable)
@@ -26,7 +26,7 @@ testfiles testfile3
 
 tempfiles testfile.temp
 
-testrun ../src/readelf -r testfile3 > testfile.temp
+testrun ${abs_top_builddir}/src/readelf -r testfile3 > testfile.temp
 
 diff -u - testfile.temp <<EOF
 
index 676fcde..9030624 100755 (executable)
@@ -19,7 +19,7 @@
 
 testfiles testfile28
 
-testrun_compare ../src/readelf -x .strtab testfile28 <<\EOF
+testrun_compare ${abs_top_builddir}/src/readelf -x .strtab testfile28 <<\EOF
 
 Hex dump of section [6] '.strtab', 1 bytes at offset 0x290:
   0x00000000 00                                  .
index 15f0ba5..cc0a191 100755 (executable)
@@ -19,7 +19,7 @@
 
 testfiles testfile40.debug
 
-testrun_compare ../src/readelf -n testfile40.debug <<\EOF
+testrun_compare ${abs_top_builddir}/src/readelf -n testfile40.debug <<\EOF
 
 Note section [ 6] '.note' of 60 bytes at offset 0x120:
   Owner          Data size  Type
index 16cf802..ca0526a 100755 (executable)
@@ -19,7 +19,7 @@
 
 testfiles testfile19.index
 
-testrun_compare ../src/readelf -c testfile19.index <<\EOF
+testrun_compare ${abs_top_builddir}/src/readelf -c testfile19.index <<\EOF
 
 Index of archive 'testfile19.index' has 4 entries:
 Archive member 'u1.o' contains:
index d12f57f..46eec7b 100755 (executable)
@@ -19,6 +19,6 @@
 
 testfiles testfile14
 
-testrun >/dev/null ../src/readelf -w testfile14 testfile14
+testrun >/dev/null ${abs_top_builddir}/src/readelf -w testfile14 testfile14
 
 exit 0
diff --git a/tests/run-readelf-vmcoreinfo.sh b/tests/run-readelf-vmcoreinfo.sh
new file mode 100755 (executable)
index 0000000..b1732fc
--- /dev/null
@@ -0,0 +1,114 @@
+#! /bin/sh
+# Copyright (C) 2012 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 testfile62
+
+testrun_compare ${abs_top_builddir}/src/readelf -n testfile62 <<\EOF
+
+Note segment of 2104 bytes at offset 0x158:
+  Owner          Data size  Type
+  CORE                 336  PRSTATUS
+    info.si_signo: 0, info.si_code: 0, info.si_errno: 0, cursig: 0
+    sigpend: <>
+    sighold: <>
+    pid: 3519, ppid: 0, pgrp: 0, sid: 0
+    utime: 0.000000, stime: 0.000000, cutime: 0.000000, cstime: 0.000000
+    orig_rax: -1, fpvalid: 0
+    r15:                     662  r14:                       4
+    r13:             -2119649152  r12:                       0
+    rbp:      0xffff880067e39e48  rbx:                      99
+    r11:        -131940469531936  r10:             -2124150080
+    r9:         -131940469531936  r8:                        0
+    rax:                      16  rcx:                    7813
+    rdx:                       0  rsi:                       0
+    rdi:                      99  rip:      0xffffffff812ba86f
+    rflags:   0x0000000000010096  rsp:      0xffff880067e39e48
+    fs.base:   0x00007f95a7b09720  gs.base:   0x0000000000000000
+    cs: 0x0010  ss: 0x0018  ds: 0x0000  es: 0x0000  fs: 0x0000  gs: 0x0000
+  CORE                 336  PRSTATUS
+    info.si_signo: 0, info.si_code: 0, info.si_errno: 0, cursig: 0
+    sigpend: <>
+    sighold: <>
+    pid: 0, ppid: 0, pgrp: 0, sid: 0
+    utime: 0.000000, stime: 0.000000, cutime: 0.000000, cstime: 0.000000
+    orig_rax: -1, fpvalid: 0
+    r15:                       0  r14:                       0
+    r13:     1348173392195389970  r12:                       1
+    rbp:      0xffff88007a829e48  rbx:                      16
+    r11:        -131940468065880  r10:            435505529489
+    r9:                   158960  r8:                        0
+    rax:                      16  rcx:                       1
+    rdx:                       0  rsi:                       3
+    rdi:        -131939339960320  rip:      0xffffffff810118bb
+    rflags:   0x0000000000000046  rsp:      0xffff88007a829e38
+    fs.base:   0x0000000000000000  gs.base:   0x0000000000000000
+    cs: 0x0010  ss: 0x0018  ds: 0x0000  es: 0x0000  fs: 0x0000  gs: 0x0000
+  VMCOREINFO          1366  <unknown>: 0
+    OSRELEASE=2.6.35.11-83.fc14.x86_64
+    PAGESIZE=4096
+    SYMBOL(init_uts_ns)=ffffffff81a4c5b0
+    SYMBOL(node_online_map)=ffffffff81b840b0
+    SYMBOL(swapper_pg_dir)=ffffffff81a42000
+    SYMBOL(_stext)=ffffffff81000190
+    SYMBOL(vmlist)=ffffffff81db07e8
+    SYMBOL(mem_section)=ffffffff81dbab00
+    LENGTH(mem_section)=4096
+    SIZE(mem_section)=32
+    OFFSET(mem_section.section_mem_map)=0
+    SIZE(page)=56
+    SIZE(pglist_data)=81664
+    SIZE(zone)=1792
+    SIZE(free_area)=88
+    SIZE(list_head)=16
+    SIZE(nodemask_t)=64
+    OFFSET(page.flags)=0
+    OFFSET(page._count)=8
+    OFFSET(page.mapping)=24
+    OFFSET(page.lru)=40
+    OFFSET(pglist_data.node_zones)=0
+    OFFSET(pglist_data.nr_zones)=81472
+    OFFSET(pglist_data.node_start_pfn)=81496
+    OFFSET(pglist_data.node_spanned_pages)=81512
+    OFFSET(pglist_data.node_id)=81520
+    OFFSET(zone.free_area)=112
+    OFFSET(zone.vm_stat)=1328
+    OFFSET(zone.spanned_pages)=1704
+    OFFSET(free_area.free_list)=0
+    OFFSET(list_head.next)=0
+    OFFSET(list_head.prev)=8
+    OFFSET(vm_struct.addr)=8
+    LENGTH(zone.free_area)=11
+    SYMBOL(log_buf)=ffffffff81a532a8
+    SYMBOL(log_end)=ffffffff81d0bc50
+    SYMBOL(log_buf_len)=ffffffff81a532a4
+    SYMBOL(logged_chars)=ffffffff81d0bd70
+    LENGTH(free_area.free_list)=5
+    NUMBER(NR_FREE_PAGES)=0
+    NUMBER(PG_lru)=5
+    NUMBER(PG_private)=11
+    NUMBER(PG_swapcache)=16
+    SYMBOL(phys_base)=ffffffff81a4a010
+    SYMBOL(init_level4_pgt)=ffffffff81a42000
+    SYMBOL(node_data)=ffffffff81b80df0
+    LENGTH(node_data)=512
+    CRASHTIME=1348173392
+
+EOF
+
+exit 0
diff --git a/tests/run-readelf-zdebug.sh b/tests/run-readelf-zdebug.sh
new file mode 100755 (executable)
index 0000000..37cf7ea
--- /dev/null
@@ -0,0 +1,539 @@
+#! /bin/sh
+# Copyright (C) 2014 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
+
+# - testfile-zdebug.c
+# #define UINT64_MAX 18446744073709551615UL
+#
+# int
+# main (int argc, char **argv)
+# {
+#   unsigned long a = UINT64_MAX - 8;
+#   unsigned long b = 42 + argc;
+#
+#   if ( a + b < b )
+#     argc = a + argc;
+#   else
+#      b--;
+#
+#   return a - b;
+# }
+#
+# gcc -g3 -O3 -fuse-ld=gold -Xlinker --compress-debug-sections=none \
+#     -fno-asynchronous-unwind-tables -o testfile-debug testfile-zdebug.c
+# gcc -g3 -O3 -fuse-ld=gold -Xlinker --compress-debug-sections=zlib \
+#     -fno-asynchronous-unwind-tables -o testfile-zdebug testfile-zdebug.c
+
+testfiles testfile-debug testfile-zdebug
+tempfiles readelf.out
+tempfiles loc.out aranges.out ranges.out macro.out line.out frame.out
+
+cat > loc.out << \EOF
+
+DWARF section [30] '.debug_loc' at offset 0xa17:
+ [     0]  0x00000000004003c0..0x00000000004003c3 [   0] reg5
+           0x00000000004003c3..0x00000000004003d6 [   0] breg5 -42
+                                                  [   2] stack_value
+           0x00000000004003d6..0x00000000004003d9 [   0] GNU_entry_value:
+       [   0] reg5
+                                                  [   3] stack_value
+EOF
+
+cat loc.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-debug
+
+cat loc.out | sed -e "s/.debug_loc' at offset 0xa17/.zdebug_loc' at offset 0x1a27/" | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=loc testfile-zdebug
+
+cat > aranges.out << \EOF
+
+DWARF section [31] '.debug_aranges' at offset 0xa65:
+
+Table at offset 0:
+
+ Length:            44
+ DWARF version:      2
+ CU offset:          0
+ Address size:       8
+ Segment size:       0
+
+   0x00000000004003c0..0x0000000000000019
+EOF
+
+cat aranges.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=aranges testfile-debug
+
+cat aranges.out | sed -e "s/.debug_aranges' at offset 0xa65/.zdebug_aranges' at offset 0x1a5f/" | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=aranges testfile-zdebug
+
+cat > ranges.out << \EOF
+
+DWARF section [32] '.debug_ranges' at offset 0xa95:
+ [     0]  0x00000000004003c0..0x00000000004003d9
+EOF
+
+cat ranges.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=ranges testfile-debug
+
+cat ranges.out | sed -e "s/.debug_ranges' at offset 0xa95/.zdebug_ranges' at offset 0x1a87/" | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=ranges testfile-zdebug
+
+cat > macro.out << \EOF
+
+DWARF section [33] '.debug_macro' at offset 0xab5:
+
+ Offset:             0x0
+ Version:            4
+ Flag:               0x2
+ Offset length:      4
+ .debug_line offset: 0x0
+
+ #include offset 0x17
+ start_file 0, [1] /tmp/testfile-zdebug.c
+  #define UINT64_MAX 18446744073709551615UL, line 1 (indirect)
+ end_file
+
+ Offset:             0x17
+ Version:            4
+ Flag:               0x0
+ Offset length:      4
+
+ #define __STDC__ 1, line 1 (indirect)
+ #define __STDC_HOSTED__ 1, line 1 (indirect)
+ #define __GNUC__ 4, line 1 (indirect)
+ #define __GNUC_MINOR__ 8, line 1 (indirect)
+ #define __GNUC_PATCHLEVEL__ 2, line 1 (indirect)
+ #define __VERSION__ "4.8.2 20140120 (Red Hat 4.8.2-15)", line 1 (indirect)
+ #define __GNUC_RH_RELEASE__ 15, line 1 (indirect)
+ #define __ATOMIC_RELAXED 0, line 1 (indirect)
+ #define __ATOMIC_SEQ_CST 5, line 1 (indirect)
+ #define __ATOMIC_ACQUIRE 2, line 1 (indirect)
+ #define __ATOMIC_RELEASE 3, line 1 (indirect)
+ #define __ATOMIC_ACQ_REL 4, line 1 (indirect)
+ #define __ATOMIC_CONSUME 1, line 1 (indirect)
+ #define __OPTIMIZE__ 1, line 1 (indirect)
+ #define __FINITE_MATH_ONLY__ 0, line 1 (indirect)
+ #define _LP64 1, line 1 (indirect)
+ #define __LP64__ 1, line 1 (indirect)
+ #define __SIZEOF_INT__ 4, line 1 (indirect)
+ #define __SIZEOF_LONG__ 8, line 1 (indirect)
+ #define __SIZEOF_LONG_LONG__ 8, line 1 (indirect)
+ #define __SIZEOF_SHORT__ 2, line 1 (indirect)
+ #define __SIZEOF_FLOAT__ 4, line 1 (indirect)
+ #define __SIZEOF_DOUBLE__ 8, line 1 (indirect)
+ #define __SIZEOF_LONG_DOUBLE__ 16, line 1 (indirect)
+ #define __SIZEOF_SIZE_T__ 8, line 1 (indirect)
+ #define __CHAR_BIT__ 8, line 1 (indirect)
+ #define __BIGGEST_ALIGNMENT__ 16, line 1 (indirect)
+ #define __ORDER_LITTLE_ENDIAN__ 1234, line 1 (indirect)
+ #define __ORDER_BIG_ENDIAN__ 4321, line 1 (indirect)
+ #define __ORDER_PDP_ENDIAN__ 3412, line 1 (indirect)
+ #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__, line 1 (indirect)
+ #define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__, line 1 (indirect)
+ #define __SIZEOF_POINTER__ 8, line 1 (indirect)
+ #define __SIZE_TYPE__ long unsigned int, line 1 (indirect)
+ #define __PTRDIFF_TYPE__ long int, line 1 (indirect)
+ #define __WCHAR_TYPE__ int, line 1 (indirect)
+ #define __WINT_TYPE__ unsigned int, line 1 (indirect)
+ #define __INTMAX_TYPE__ long int, line 1 (indirect)
+ #define __UINTMAX_TYPE__ long unsigned int, line 1 (indirect)
+ #define __CHAR16_TYPE__ short unsigned int, line 1 (indirect)
+ #define __CHAR32_TYPE__ unsigned int, line 1 (indirect)
+ #define __SIG_ATOMIC_TYPE__ int, line 1 (indirect)
+ #define __INT8_TYPE__ signed char, line 1 (indirect)
+ #define __INT16_TYPE__ short int, line 1 (indirect)
+ #define __INT32_TYPE__ int, line 1 (indirect)
+ #define __INT64_TYPE__ long int, line 1 (indirect)
+ #define __UINT8_TYPE__ unsigned char, line 1 (indirect)
+ #define __UINT16_TYPE__ short unsigned int, line 1 (indirect)
+ #define __UINT32_TYPE__ unsigned int, line 1 (indirect)
+ #define __UINT64_TYPE__ long unsigned int, line 1 (indirect)
+ #define __INT_LEAST8_TYPE__ signed char, line 1 (indirect)
+ #define __INT_LEAST16_TYPE__ short int, line 1 (indirect)
+ #define __INT_LEAST32_TYPE__ int, line 1 (indirect)
+ #define __INT_LEAST64_TYPE__ long int, line 1 (indirect)
+ #define __UINT_LEAST8_TYPE__ unsigned char, line 1 (indirect)
+ #define __UINT_LEAST16_TYPE__ short unsigned int, line 1 (indirect)
+ #define __UINT_LEAST32_TYPE__ unsigned int, line 1 (indirect)
+ #define __UINT_LEAST64_TYPE__ long unsigned int, line 1 (indirect)
+ #define __INT_FAST8_TYPE__ signed char, line 1 (indirect)
+ #define __INT_FAST16_TYPE__ long int, line 1 (indirect)
+ #define __INT_FAST32_TYPE__ long int, line 1 (indirect)
+ #define __INT_FAST64_TYPE__ long int, line 1 (indirect)
+ #define __UINT_FAST8_TYPE__ unsigned char, line 1 (indirect)
+ #define __UINT_FAST16_TYPE__ long unsigned int, line 1 (indirect)
+ #define __UINT_FAST32_TYPE__ long unsigned int, line 1 (indirect)
+ #define __UINT_FAST64_TYPE__ long unsigned int, line 1 (indirect)
+ #define __INTPTR_TYPE__ long int, line 1 (indirect)
+ #define __UINTPTR_TYPE__ long unsigned int, line 1 (indirect)
+ #define __GXX_ABI_VERSION 1002, line 1 (indirect)
+ #define __SCHAR_MAX__ 127, line 1 (indirect)
+ #define __SHRT_MAX__ 32767, line 1 (indirect)
+ #define __INT_MAX__ 2147483647, line 1 (indirect)
+ #define __LONG_MAX__ 9223372036854775807L, line 1 (indirect)
+ #define __LONG_LONG_MAX__ 9223372036854775807LL, line 1 (indirect)
+ #define __WCHAR_MAX__ 2147483647, line 1 (indirect)
+ #define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1), line 1 (indirect)
+ #define __WINT_MAX__ 4294967295U, line 1 (indirect)
+ #define __WINT_MIN__ 0U, line 1 (indirect)
+ #define __PTRDIFF_MAX__ 9223372036854775807L, line 1 (indirect)
+ #define __SIZE_MAX__ 18446744073709551615UL, line 1 (indirect)
+ #define __INTMAX_MAX__ 9223372036854775807L, line 1 (indirect)
+ #define __INTMAX_C(c) c ## L, line 1 (indirect)
+ #define __UINTMAX_MAX__ 18446744073709551615UL, line 1 (indirect)
+ #define __UINTMAX_C(c) c ## UL, line 1 (indirect)
+ #define __SIG_ATOMIC_MAX__ 2147483647, line 1 (indirect)
+ #define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1), line 1 (indirect)
+ #define __INT8_MAX__ 127, line 1 (indirect)
+ #define __INT16_MAX__ 32767, line 1 (indirect)
+ #define __INT32_MAX__ 2147483647, line 1 (indirect)
+ #define __INT64_MAX__ 9223372036854775807L, line 1 (indirect)
+ #define __UINT8_MAX__ 255, line 1 (indirect)
+ #define __UINT16_MAX__ 65535, line 1 (indirect)
+ #define __UINT32_MAX__ 4294967295U, line 1 (indirect)
+ #define __UINT64_MAX__ 18446744073709551615UL, line 1 (indirect)
+ #define __INT_LEAST8_MAX__ 127, line 1 (indirect)
+ #define __INT8_C(c) c, line 1 (indirect)
+ #define __INT_LEAST16_MAX__ 32767, line 1 (indirect)
+ #define __INT16_C(c) c, line 1 (indirect)
+ #define __INT_LEAST32_MAX__ 2147483647, line 1 (indirect)
+ #define __INT32_C(c) c, line 1 (indirect)
+ #define __INT_LEAST64_MAX__ 9223372036854775807L, line 1 (indirect)
+ #define __INT64_C(c) c ## L, line 1 (indirect)
+ #define __UINT_LEAST8_MAX__ 255, line 1 (indirect)
+ #define __UINT8_C(c) c, line 1 (indirect)
+ #define __UINT_LEAST16_MAX__ 65535, line 1 (indirect)
+ #define __UINT16_C(c) c, line 1 (indirect)
+ #define __UINT_LEAST32_MAX__ 4294967295U, line 1 (indirect)
+ #define __UINT32_C(c) c ## U, line 1 (indirect)
+ #define __UINT_LEAST64_MAX__ 18446744073709551615UL, line 1 (indirect)
+ #define __UINT64_C(c) c ## UL, line 1 (indirect)
+ #define __INT_FAST8_MAX__ 127, line 1 (indirect)
+ #define __INT_FAST16_MAX__ 9223372036854775807L, line 1 (indirect)
+ #define __INT_FAST32_MAX__ 9223372036854775807L, line 1 (indirect)
+ #define __INT_FAST64_MAX__ 9223372036854775807L, line 1 (indirect)
+ #define __UINT_FAST8_MAX__ 255, line 1 (indirect)
+ #define __UINT_FAST16_MAX__ 18446744073709551615UL, line 1 (indirect)
+ #define __UINT_FAST32_MAX__ 18446744073709551615UL, line 1 (indirect)
+ #define __UINT_FAST64_MAX__ 18446744073709551615UL, line 1 (indirect)
+ #define __INTPTR_MAX__ 9223372036854775807L, line 1 (indirect)
+ #define __UINTPTR_MAX__ 18446744073709551615UL, line 1 (indirect)
+ #define __FLT_EVAL_METHOD__ 0, line 1 (indirect)
+ #define __DEC_EVAL_METHOD__ 2, line 1 (indirect)
+ #define __FLT_RADIX__ 2, line 1 (indirect)
+ #define __FLT_MANT_DIG__ 24, line 1 (indirect)
+ #define __FLT_DIG__ 6, line 1 (indirect)
+ #define __FLT_MIN_EXP__ (-125), line 1 (indirect)
+ #define __FLT_MIN_10_EXP__ (-37), line 1 (indirect)
+ #define __FLT_MAX_EXP__ 128, line 1 (indirect)
+ #define __FLT_MAX_10_EXP__ 38, line 1 (indirect)
+ #define __FLT_DECIMAL_DIG__ 9, line 1 (indirect)
+ #define __FLT_MAX__ 3.40282346638528859812e+38F, line 1 (indirect)
+ #define __FLT_MIN__ 1.17549435082228750797e-38F, line 1 (indirect)
+ #define __FLT_EPSILON__ 1.19209289550781250000e-7F, line 1 (indirect)
+ #define __FLT_DENORM_MIN__ 1.40129846432481707092e-45F, line 1 (indirect)
+ #define __FLT_HAS_DENORM__ 1, line 1 (indirect)
+ #define __FLT_HAS_INFINITY__ 1, line 1 (indirect)
+ #define __FLT_HAS_QUIET_NAN__ 1, line 1 (indirect)
+ #define __DBL_MANT_DIG__ 53, line 1 (indirect)
+ #define __DBL_DIG__ 15, line 1 (indirect)
+ #define __DBL_MIN_EXP__ (-1021), line 1 (indirect)
+ #define __DBL_MIN_10_EXP__ (-307), line 1 (indirect)
+ #define __DBL_MAX_EXP__ 1024, line 1 (indirect)
+ #define __DBL_MAX_10_EXP__ 308, line 1 (indirect)
+ #define __DBL_DECIMAL_DIG__ 17, line 1 (indirect)
+ #define __DBL_MAX__ ((double)1.79769313486231570815e+308L), line 1 (indirect)
+ #define __DBL_MIN__ ((double)2.22507385850720138309e-308L), line 1 (indirect)
+ #define __DBL_EPSILON__ ((double)2.22044604925031308085e-16L), line 1 (indirect)
+ #define __DBL_DENORM_MIN__ ((double)4.94065645841246544177e-324L), line 1 (indirect)
+ #define __DBL_HAS_DENORM__ 1, line 1 (indirect)
+ #define __DBL_HAS_INFINITY__ 1, line 1 (indirect)
+ #define __DBL_HAS_QUIET_NAN__ 1, line 1 (indirect)
+ #define __LDBL_MANT_DIG__ 64, line 1 (indirect)
+ #define __LDBL_DIG__ 18, line 1 (indirect)
+ #define __LDBL_MIN_EXP__ (-16381), line 1 (indirect)
+ #define __LDBL_MIN_10_EXP__ (-4931), line 1 (indirect)
+ #define __LDBL_MAX_EXP__ 16384, line 1 (indirect)
+ #define __LDBL_MAX_10_EXP__ 4932, line 1 (indirect)
+ #define __DECIMAL_DIG__ 21, line 1 (indirect)
+ #define __LDBL_MAX__ 1.18973149535723176502e+4932L, line 1 (indirect)
+ #define __LDBL_MIN__ 3.36210314311209350626e-4932L, line 1 (indirect)
+ #define __LDBL_EPSILON__ 1.08420217248550443401e-19L, line 1 (indirect)
+ #define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L, line 1 (indirect)
+ #define __LDBL_HAS_DENORM__ 1, line 1 (indirect)
+ #define __LDBL_HAS_INFINITY__ 1, line 1 (indirect)
+ #define __LDBL_HAS_QUIET_NAN__ 1, line 1 (indirect)
+ #define __DEC32_MANT_DIG__ 7, line 1 (indirect)
+ #define __DEC32_MIN_EXP__ (-94), line 1 (indirect)
+ #define __DEC32_MAX_EXP__ 97, line 1 (indirect)
+ #define __DEC32_MIN__ 1E-95DF, line 1 (indirect)
+ #define __DEC32_MAX__ 9.999999E96DF, line 1 (indirect)
+ #define __DEC32_EPSILON__ 1E-6DF, line 1 (indirect)
+ #define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF, line 1 (indirect)
+ #define __DEC64_MANT_DIG__ 16, line 1 (indirect)
+ #define __DEC64_MIN_EXP__ (-382), line 1 (indirect)
+ #define __DEC64_MAX_EXP__ 385, line 1 (indirect)
+ #define __DEC64_MIN__ 1E-383DD, line 1 (indirect)
+ #define __DEC64_MAX__ 9.999999999999999E384DD, line 1 (indirect)
+ #define __DEC64_EPSILON__ 1E-15DD, line 1 (indirect)
+ #define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD, line 1 (indirect)
+ #define __DEC128_MANT_DIG__ 34, line 1 (indirect)
+ #define __DEC128_MIN_EXP__ (-6142), line 1 (indirect)
+ #define __DEC128_MAX_EXP__ 6145, line 1 (indirect)
+ #define __DEC128_MIN__ 1E-6143DL, line 1 (indirect)
+ #define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL, line 1 (indirect)
+ #define __DEC128_EPSILON__ 1E-33DL, line 1 (indirect)
+ #define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL, line 1 (indirect)
+ #define __REGISTER_PREFIX__ , line 1 (indirect)
+ #define __USER_LABEL_PREFIX__ , line 1 (indirect)
+ #define __GNUC_GNU_INLINE__ 1, line 1 (indirect)
+ #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1, line 1 (indirect)
+ #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1, line 1 (indirect)
+ #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1, line 1 (indirect)
+ #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1, line 1 (indirect)
+ #define __GCC_ATOMIC_BOOL_LOCK_FREE 2, line 1 (indirect)
+ #define __GCC_ATOMIC_CHAR_LOCK_FREE 2, line 1 (indirect)
+ #define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2, line 1 (indirect)
+ #define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2, line 1 (indirect)
+ #define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2, line 1 (indirect)
+ #define __GCC_ATOMIC_SHORT_LOCK_FREE 2, line 1 (indirect)
+ #define __GCC_ATOMIC_INT_LOCK_FREE 2, line 1 (indirect)
+ #define __GCC_ATOMIC_LONG_LOCK_FREE 2, line 1 (indirect)
+ #define __GCC_ATOMIC_LLONG_LOCK_FREE 2, line 1 (indirect)
+ #define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1, line 1 (indirect)
+ #define __GCC_ATOMIC_POINTER_LOCK_FREE 2, line 1 (indirect)
+ #define __GCC_HAVE_DWARF2_CFI_ASM 1, line 1 (indirect)
+ #define __PRAGMA_REDEFINE_EXTNAME 1, line 1 (indirect)
+ #define __SIZEOF_INT128__ 16, line 1 (indirect)
+ #define __SIZEOF_WCHAR_T__ 4, line 1 (indirect)
+ #define __SIZEOF_WINT_T__ 4, line 1 (indirect)
+ #define __SIZEOF_PTRDIFF_T__ 8, line 1 (indirect)
+ #define __amd64 1, line 1 (indirect)
+ #define __amd64__ 1, line 1 (indirect)
+ #define __x86_64 1, line 1 (indirect)
+ #define __x86_64__ 1, line 1 (indirect)
+ #define __ATOMIC_HLE_ACQUIRE 65536, line 1 (indirect)
+ #define __ATOMIC_HLE_RELEASE 131072, line 1 (indirect)
+ #define __k8 1, line 1 (indirect)
+ #define __k8__ 1, line 1 (indirect)
+ #define __code_model_small__ 1, line 1 (indirect)
+ #define __MMX__ 1, line 1 (indirect)
+ #define __SSE__ 1, line 1 (indirect)
+ #define __SSE2__ 1, line 1 (indirect)
+ #define __FXSR__ 1, line 1 (indirect)
+ #define __SSE_MATH__ 1, line 1 (indirect)
+ #define __SSE2_MATH__ 1, line 1 (indirect)
+ #define __gnu_linux__ 1, line 1 (indirect)
+ #define __linux 1, line 1 (indirect)
+ #define __linux__ 1, line 1 (indirect)
+ #define linux 1, line 1 (indirect)
+ #define __unix 1, line 1 (indirect)
+ #define __unix__ 1, line 1 (indirect)
+ #define unix 1, line 1 (indirect)
+ #define __ELF__ 1, line 1 (indirect)
+ #define __DECIMAL_BID_FORMAT__ 1, line 1 (indirect)
+
+EOF
+
+cat macro.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=macro testfile-debug
+
+cat macro.out | sed -e "s/.debug_macro' at offset 0xab5/.zdebug_macro' at offset 0x1aa7/" | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=macro testfile-zdebug
+
+cat > line.out << \EOF
+
+DWARF section [34] '.debug_line' at offset 0x104c:
+
+Table at offset 0:
+
+ Length:                     70
+ DWARF version:              2
+ Prologue length:            40
+ Minimum instruction length: 1
+ Maximum operations per instruction: 1
+ Initial value if 'is_stmt': 1
+ Line base:                  -5
+ Line range:                 14
+ Opcode base:                13
+
+Opcodes:
+  [ 1]  0 arguments
+  [ 2]  1 argument
+  [ 3]  1 argument
+  [ 4]  1 argument
+  [ 5]  1 argument
+  [ 6]  0 arguments
+  [ 7]  0 arguments
+  [ 8]  0 arguments
+  [ 9]  1 argument
+  [10]  0 arguments
+  [11]  0 arguments
+  [12]  1 argument
+
+Directory table:
+
+File name table:
+ Entry Dir   Time      Size      Name
+ 1     0     0         0         testfile-zdebug.c
+
+Line number statements:
+ [    32] extended opcode 2:  set address to 0x4003c0
+ [    3d] special opcode 22: address+0 = 0x4003c0, line+4 = 5
+ [    3e] special opcode 20: address+0 = 0x4003c0, line+2 = 7
+ [    3f] special opcode 104: address+6 = 0x4003c6, line+2 = 9
+ [    40] special opcode 77: address+4 = 0x4003ca, line+3 = 12
+ [    41] special opcode 62: address+3 = 0x4003cd, line+2 = 14
+ [    42] special opcode 86: address+5 = 0x4003d2, line-2 = 12
+ [    43] special opcode 76: address+4 = 0x4003d6, line+2 = 14
+ [    44] special opcode 47: address+2 = 0x4003d8, line+1 = 15
+ [    45] advance address by 1 to 0x4003d9
+ [    47] extended opcode 1:  end of sequence
+EOF
+
+cat line.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=line testfile-debug
+
+cat line.out | sed -e "s/.debug_line' at offset 0x104c/.zdebug_line' at offset 0x1d53/" | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=line testfile-zdebug
+
+
+cat > frame.out << \EOF
+
+Call frame information section [16] '.eh_frame' at offset 0x5b8:
+
+ [     0] CIE length=20
+   CIE_id:                   0
+   version:                  1
+   augmentation:             "zR"
+   code_alignment_factor:    1
+   data_alignment_factor:    -8
+   return_address_register:  16
+   Augmentation data:        0x1b (FDE address encoding: sdata4 pcrel)
+
+   Program:
+     def_cfa r7 (rsp) at offset 8
+     offset r16 (rip) at cfa-8
+     nop
+     nop
+
+ [    18] FDE length=20 cie=[     0]
+   CIE_pointer:              28
+   initial_location:         0x00000000ffffff08 (offset: 0x4e0)
+   address_range:            0x2 (end offset: 0x4e2)
+
+   Program:
+     nop
+     nop
+     nop
+     nop
+     nop
+     nop
+     nop
+
+ [    30] FDE length=44 cie=[     0]
+   CIE_pointer:              52
+   initial_location:         0x00000000ffffff00 (offset: 0x4f0)
+   address_range:            0x89 (end offset: 0x579)
+
+   Program:
+     advance_loc 17 to 0x501
+     offset r12 (r12) at cfa-40
+     offset r6 (rbp) at cfa-48
+     advance_loc 31 to 0x520
+     def_cfa_offset 64
+     offset r3 (rbx) at cfa-56
+     offset r15 (r15) at cfa-16
+     offset r14 (r14) at cfa-24
+     offset r13 (r13) at cfa-32
+     advance_loc1 88 to 0x578
+     def_cfa_offset 8
+     nop
+     nop
+     nop
+     nop
+     nop
+     nop
+     nop
+     nop
+     nop
+     nop
+     nop
+
+ [    60] FDE length=36 cie=[     0]
+   CIE_pointer:              100
+   initial_location:         0x00000000fffffd80 (offset: 0x3a0)
+   address_range:            0x20 (end offset: 0x3c0)
+
+   Program:
+     def_cfa_offset 16
+     advance_loc 6 to 0x3a6
+     def_cfa_offset 24
+     advance_loc 10 to 0x3b0
+     def_cfa_expression 11
+          [   0] breg7 8
+          [   2] breg16 0
+          [   4] lit15
+          [   5] and
+          [   6] lit11
+          [   7] ge
+          [   8] lit3
+          [   9] shl
+          [  10] plus
+     nop
+     nop
+     nop
+     nop
+
+ [    88] Zero terminator
+
+Call frame search table section [17] '.eh_frame_hdr':
+ version:          1
+ eh_frame_ptr_enc: 0x1b (sdata4 pcrel)
+ fde_count_enc:    0x3 (udata4)
+ table_enc:        0x3b (sdata4 datarel)
+ eh_frame_ptr:     0xffffffffffffff70 (offset: 0x5b8)
+ fde_count:        3
+ Table:
+  0xfffffd5c (offset:  0x3a0) -> 0xffffffd4 fde=[    60]
+  0xfffffe9c (offset:  0x4e0) -> 0xffffff8c fde=[    18]
+  0xfffffeac (offset:  0x4f0) -> 0xffffffa4 fde=[    30]
+
+DWARF section [36] '.debug_frame' at offset 0x29b8:
+
+ [     0] CIE length=20
+   CIE_id:                   18446744073709551615
+   version:                  1
+   augmentation:             ""
+   code_alignment_factor:    1
+   data_alignment_factor:    -8
+   return_address_register:  16
+
+   Program:
+     def_cfa r7 (rsp) at offset 8
+     offset r16 (rip) at cfa-8
+     nop
+     nop
+     nop
+     nop
+     nop
+     nop
+
+ [    18] FDE length=20 cie=[     0]
+   CIE_pointer:              0
+   initial_location:         0x00000000004003c0
+   address_range:            0x19
+
+   Program:
+EOF
+
+cat frame.out | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=frame testfile-debug
+
+cat frame.out | sed -e "s/.debug_frame' at offset 0x29b8/.zdebug_frame' at offset 0x2728/" | testrun_compare ${abs_top_builddir}/src/readelf -U --debug-dump=frame testfile-zdebug
+
+
index 3a4cb1c..f437284 100755 (executable)
@@ -19,7 +19,7 @@
 
 testfiles testfile56 testfile57
 
-testrun ./rerequest_tag testfile56
-testrun ./rerequest_tag testfile57
+testrun ${abs_builddir}/rerequest_tag testfile56
+testrun ${abs_builddir}/rerequest_tag testfile57
 
 exit 0
index 351730f..40d0e36 100755 (executable)
@@ -20,7 +20,7 @@
 
 testfiles testfile testfile2
 
-testrun_compare ./show-abbrev testfile testfile2 <<\EOF
+testrun_compare ${abs_builddir}/show-abbrev testfile testfile2 <<\EOF
 abbrev[0]: code = 1, tag = 17, children = 1
 abbrev[0]: attr[0]: code = 16, form = 6, offset = 0
 abbrev[0]: attr[1]: code = 18, form = 1, offset = 2
index cbe60f9..f92ee48 100755 (executable)
@@ -20,7 +20,7 @@
 
 testfiles testfile5 testfile2
 
-testrun_compare ./show-die-info testfile5 testfile2 <<\EOF
+testrun_compare ${abs_builddir}/show-die-info testfile5 testfile2 <<\EOF
 file: testfile5
 New CU: off = 0, hsize = 11, ab = 0, as = 4, os = 4
      DW_TAG_compile_unit
diff --git a/tests/run-stack-d-test.sh b/tests/run-stack-d-test.sh
new file mode 100755 (executable)
index 0000000..040c2fa
--- /dev/null
@@ -0,0 +1,112 @@
+#! /bin/sh
+# Copyright (C) 2014 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
+
+# // g++ dwarfinlines.cpp -g -o testfiledwarfinlines -O2
+# int
+# fubar (int x)
+# {
+#   __asm__ ( "nop" ::: );
+#   return 42 / x - 2;
+# }
+#
+# void foobar (int z1, int z2)
+# {
+#   __asm__ ( "nop" ::: );
+#   int x = z1 + z2;
+#   while (z1 + x + 1 != 42)
+#     x = fubar (z1 + z2 + x);
+# }
+#
+# void bar (int z)
+# {
+#   int a, b;
+#   a = b = z / 2;
+#   foobar(a, b);
+# }
+#
+# void foo (int x)
+# {
+#   if (x > 0)
+#     bar(x - 2);
+# }
+#
+# void fu (int y)
+# {
+#   __asm__ ( "nop" ::: );
+#   foo (y + 1);
+# }
+#
+# int
+# main (int argc, char **argv)
+# {
+#   fu (argc);
+# }
+testfiles testfiledwarfinlines testfiledwarfinlines.core
+
+# Depending on whether we are running make check or make installcheck
+# the actual binary name under test might be different. It is used in
+# the error message, which we also try to match.
+if test "$elfutils_testrun" = "installed"; then
+STACKCMD=${bindir}/`program_transform stack`
+else
+STACKCMD=${abs_top_builddir}/src/stack
+fi
+
+# Without -d the top function comes out as fu.
+testrun_compare ${abs_top_builddir}/src/stack -n 2 -e testfiledwarfinlines --core testfiledwarfinlines.core<<EOF
+PID 13654 - core
+TID 13654:
+#0  0x00000000004006c8 fu(int)
+#1  0x00000000004004c5 main
+$STACKCMD: tid 13654: shown max number of frames (2, use -n 0 for unlimited)
+EOF
+
+# But when asking for source we see it is actually on line 6.
+# (Which is in function fubar, not fu).
+testrun_compare ${abs_top_builddir}/src/stack -n 2 -s -e testfiledwarfinlines --core testfiledwarfinlines.core<<EOF
+PID 13654 - core
+TID 13654:
+#0  0x00000000004006c8 fu(int)
+    /home/mark/src/tests/dwarfinlines.cpp:6
+#1  0x00000000004004c5 main
+    /home/mark/src/tests/dwarfinlines.cpp:39
+$STACKCMD: tid 13654: shown max number of frames (2, use -n 0 for unlimited)
+EOF
+
+# So with --debugname we get the function correct as fubar.
+testrun_compare ${abs_top_builddir}/src/stack -n 2 -d -e testfiledwarfinlines --core testfiledwarfinlines.core<<EOF
+PID 13654 - core
+TID 13654:
+#0  0x00000000004006c8 fubar
+#1  0x00000000004004c5 main
+$STACKCMD: tid 13654: shown max number of frames (2, use -n 0 for unlimited)
+EOF
+
+# Which now matches the source line (again 6 of course).
+testrun_compare ${abs_top_builddir}/src/stack -n 2 -s -d -e testfiledwarfinlines --core testfiledwarfinlines.core<<EOF
+PID 13654 - core
+TID 13654:
+#0  0x00000000004006c8 fubar
+    /home/mark/src/tests/dwarfinlines.cpp:6
+#1  0x00000000004004c5 main
+    /home/mark/src/tests/dwarfinlines.cpp:39
+$STACKCMD: tid 13654: shown max number of frames (2, use -n 0 for unlimited)
+EOF
+
+exit 0
diff --git a/tests/run-stack-i-test.sh b/tests/run-stack-i-test.sh
new file mode 100755 (executable)
index 0000000..2d09ec0
--- /dev/null
@@ -0,0 +1,70 @@
+#! /bin/sh
+# Copyright (C) 2014 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
+
+# See run-stack-d-test.sh for dwarfinlines.cpp source.
+testfiles testfiledwarfinlines testfiledwarfinlines.core
+
+# Depending on whether we are running make check or make installcheck
+# the actual binary name under test might be different. It is used in
+# the error message, which we also try to match.
+if test "$elfutils_testrun" = "installed"; then
+STACKCMD=${bindir}/`program_transform stack`
+else
+STACKCMD=${abs_top_builddir}/src/stack
+fi
+
+# Compare with run-stack-d-test.sh to see the output without --inlines.
+# Only two call frames are visible (there is a jump from main to fu or
+# fubar).
+
+# With --inlines we get all inlined calls. Note they share the same
+# address.
+testrun_compare ${abs_top_builddir}/src/stack -n 6 -i -e testfiledwarfinlines --core testfiledwarfinlines.core<<EOF
+PID 13654 - core
+TID 13654:
+#0  0x00000000004006c8 fubar
+#1  0x00000000004006c8 foobar
+#2  0x00000000004006c8 bar
+#3  0x00000000004006c8 foo
+#4  0x00000000004006c8 fu(int)
+#5  0x00000000004004c5 main
+$STACKCMD: tid 13654: shown max number of frames (6, use -n 0 for unlimited)
+EOF
+
+# With --source we can also see where in the source the inlined frames
+# where originally called from.
+testrun_compare ${abs_top_builddir}/src/stack -n 6 -s -i -e testfiledwarfinlines --core testfiledwarfinlines.core<<EOF
+PID 13654 - core
+TID 13654:
+#0  0x00000000004006c8 fubar
+    /home/mark/src/tests/dwarfinlines.cpp:6
+#1  0x00000000004006c8 foobar
+    /home/mark/src/tests/dwarfinlines.cpp:14
+#2  0x00000000004006c8 bar
+    /home/mark/src/tests/dwarfinlines.cpp:21
+#3  0x00000000004006c8 foo
+    /home/mark/src/tests/dwarfinlines.cpp:27
+#4  0x00000000004006c8 fu(int)
+    /home/mark/src/tests/dwarfinlines.cpp:33
+#5  0x00000000004004c5 main
+    /home/mark/src/tests/dwarfinlines.cpp:39
+$STACKCMD: tid 13654: shown max number of frames (6, use -n 0 for unlimited)
+EOF
+
+exit 0
index 6bfc87e..33f2d64 100755 (executable)
@@ -21,7 +21,7 @@
 files="testfile `seq 2 9 | while read n; do echo testfile$n; done`"
 testfiles $files
 
-testrun_compare ../src/strings -tx -f $files <<\EOF
+testrun_compare ${abs_top_builddir}/src/strings -tx -f $files <<\EOF
 testfile:      f4 /lib/ld-linux.so.2
 testfile:     1c9 __gmon_start__
 testfile:     1d8 libc.so.6
index 86d1d44..1c836a4 100755 (executable)
@@ -49,7 +49,7 @@ dbgfile=$infile.debug
 testfiles $infile
 tempfiles $outfile $dbgfile
 
-testrun ../src/strip -o $outfile -f $dbgfile $infile
-testrun ../src/elflint -q $infile
-testrun ../src/elflint -q $outfile
-testrun ../src/elflint -q -d $dbgfile
+testrun ${abs_top_builddir}/src/strip -o $outfile -f $dbgfile $infile
+testrun ${abs_top_builddir}/src/elflint -q $infile
+testrun ${abs_top_builddir}/src/elflint -q $outfile
+testrun ${abs_top_builddir}/src/elflint -q -d $dbgfile
index 603fb7c..a3245fd 100755 (executable)
@@ -1,5 +1,5 @@
 #! /bin/sh
-# Copyright (C) 2011 Red Hat, Inc.
+# Copyright (C) 2011, 2013 Red Hat, Inc.
 # This file is part of elfutils.
 #
 # This file is free software; you can redistribute it and/or modify
 
 . $srcdir/test-subr.sh
 
-testfiles hello_i386.ko hello_x86_64.ko hello_ppc64.ko hello_s390.ko
+testfiles hello_i386.ko hello_x86_64.ko hello_ppc64.ko hello_s390.ko \
+       hello_aarch64.ko
+
+tempfiles readelf.out readelf.out1 readelf.out2
+tempfiles out.stripped1 out.debug1 out.stripped2 out.debug2
 
 status=0
 runtest() {
@@ -28,18 +32,18 @@ runtest() {
   outfile2=out.stripped2
   debugfile2=out.debug2
 
-  testrun ../src/strip -o $outfile1 -f $debugfile1 $infile ||
+  testrun ${abs_top_builddir}/src/strip -o $outfile1 -f $debugfile1 $infile ||
   { echo "*** failure strip $infile"; status=1; }
 
-  testrun ../src/strip --reloc-debug-sections -o $outfile2 \
+  testrun ${abs_top_builddir}/src/strip --reloc-debug-sections -o $outfile2 \
        -f $debugfile2 $infile ||
   { echo "*** failure strip --reloc-debug-sections $infile"; status=1; }
 
   # shouldn't make any difference for stripped files.
-  testrun ../src/readelf -a $outfile1 > readelf.out ||
+  testrun ${abs_top_builddir}/src/readelf -a $outfile1 > readelf.out ||
   { echo "*** failure readelf -a outfile1 $infile"; status=1; }
 
-  testrun_compare ../src/readelf -a $outfile2 < readelf.out ||
+  testrun_compare ${abs_top_builddir}/src/readelf -a $outfile2 < readelf.out ||
   { echo "*** failure compare stripped files $infile"; status=1; }
 
   # debug files however should be smaller, when ET_REL.
@@ -51,18 +55,16 @@ runtest() {
 
   # Strip of DWARF section lines, offset will not match.
   # Everything else should match.
-  testrun ../src/readelf -w $debugfile1 \
+  testrun ${abs_top_builddir}/src/readelf -w $debugfile1 \
        | grep -v ^DWARF\ section > readelf.out1 ||
   { echo "*** failure readelf -w debugfile1 $infile"; status=1; }
 
-  testrun ../src/readelf -w $debugfile2 \
+  testrun ${abs_top_builddir}/src/readelf -w $debugfile2 \
        | grep -v ^DWARF\ section > readelf.out2 ||
   { echo "*** failure readelf -w debugfile2 $infile"; status=1; }
 
   testrun_compare cat readelf.out1 < readelf.out2 ||
   { echo "*** failure readelf -w compare $infile"; status=1; }
-
-  rm -f $outfile1 $debugfile1 $outfile2 $debugfile2 readelf.out*
 }
 
 # Most simple hello world kernel module for various architectures.
@@ -99,9 +101,10 @@ runtest hello_i386.ko 1
 runtest hello_x86_64.ko 1
 runtest hello_ppc64.ko 1
 runtest hello_s390.ko 1
+runtest hello_aarch64.ko 1
 
 # self test, shouldn't impact non-ET_REL files at all.
-runtest ../src/strip 0
-runtest ../src/strip.o 1
+runtest ${abs_top_builddir}/src/strip 0
+runtest ${abs_top_builddir}/src/strip.o 1
 
 exit $status
index c6c7c09..c558e90 100755 (executable)
@@ -27,30 +27,30 @@ test x$stripped = xtestfile.temp || testfiles $stripped $debugfile
 
 tempfiles testfile.temp testfile.debug.temp testfile.unstrip
 
-testrun ../src/strip -o testfile.temp $debugout $original
+testrun ${abs_top_builddir}/src/strip -o testfile.temp $debugout $original
 
 status=0
 
 cmp $stripped testfile.temp || status=$?
 
 # Check elflint and the expected result.
-testrun ../src/elflint -q testfile.temp || status=$?
+testrun ${abs_top_builddir}/src/elflint -q testfile.temp || status=$?
 
 test -z "$debugfile" || {
 cmp $debugfile testfile.debug.temp || status=$?
 
 # Check elflint and the expected result.
-testrun ../src/elflint -q -d testfile.debug.temp || status=$?
+testrun ${abs_top_builddir}/src/elflint -q -d testfile.debug.temp || status=$?
 
 # Now test unstrip recombining those files.
-testrun ../src/unstrip -o testfile.unstrip testfile.temp testfile.debug.temp
+testrun ${abs_top_builddir}/src/unstrip -o testfile.unstrip testfile.temp testfile.debug.temp
 
 # Check that it came back whole.
-testrun ../src/elfcmp --hash-inexact $original testfile.unstrip
+testrun ${abs_top_builddir}/src/elfcmp --hash-inexact $original testfile.unstrip
 }
 
 tempfiles testfile.sections
-testrun ../src/readelf -S testfile.temp > testfile.sections || status=$?
+testrun ${abs_top_builddir}/src/readelf -S testfile.temp > testfile.sections || status=$?
 fgrep ' .debug_' testfile.sections && status=1
 
 exit $status
index 26552ac..43df16e 100755 (executable)
@@ -26,7 +26,7 @@
 #  ar cru testarchive64.a aaa.o bbb.o ccc.o
 testfiles testarchive64.a
 
-testrun_compare ../src/readelf -c testarchive64.a <<\EOF
+testrun_compare ${abs_top_builddir}/src/readelf -c testarchive64.a <<\EOF
 
 Index of archive 'testarchive64.a' has 7 entries:
 Archive member 'aaa.o' contains:
index 1566756..9bedf17 100755 (executable)
@@ -19,4 +19,4 @@
 
 testfiles testfile
 
-testrun ./test-flag-nobits testfile
+testrun ${abs_builddir}/test-flag-nobits testfile
index 3a453ab..605ee2a 100755 (executable)
 
 testfiles testfile59
 
-testrun_compare ./typeiter testfile59 <<\EOF
+testrun_compare ${abs_builddir}/typeiter testfile59 <<\EOF
+ok
+EOF
+
+testrun_compare ${abs_builddir}/typeiter2 testfile59 <<\EOF
 ok
 EOF
 
diff --git a/tests/run-unstrip-M.sh b/tests/run-unstrip-M.sh
new file mode 100755 (executable)
index 0000000..614a8aa
--- /dev/null
@@ -0,0 +1,51 @@
+#! /bin/sh
+# Copyright (C) 2013 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
+
+# Linux /proc/PID/maps file with some non-file entries (and fake exe/lib names).
+tempfiles testmaps
+cat > testmaps <<EOF
+00400000-024aa000 r-xp 00000000 08:02 159659                             /opt/TestBins/bin/arwijn
+026aa000-026b2000 rwxp 020aa000 08:02 159659                             /opt/TestBins/bin/arwijn
+026b2000-026bf000 rwxp 00000000 00:00 0
+0335a000-03e6f000 rwxp 00000000 00:00 0                                  [heap]
+2b7b38282000-2b7b38302000 rwxs 00000000 00:06 493872                     socket:[493872]
+2b7b38302000-2b7b38312000 rwxs 00000000 00:06 493872                     socket:[493872]
+2b7b38312000-2b7b38b12000 r-xs 00000000 00:06 493872                     socket:[493872]
+2b7b38b12000-2b7b38b22000 rwxs 00000000 00:06 493872                     socket:[493872]
+2b7b38b22000-2b7b39322000 rwxs 00000000 00:06 493872                     socket:[493872]
+2b7b4439f000-2b7b45ea1000 rwxp 00000000 00:00 0
+7f31e7d9f000-7f31e7f29000 r-xp 00000000 fd:00 917531                     /lib64/libc-1.13.so
+7f31e7f29000-7f31e8128000 ---p 0018a000 fd:00 917531                     /lib64/libc-1.13.so
+7f31e8128000-7f31e812c000 r--p 00189000 fd:00 917531                     /lib64/libc-1.13.so
+7f31e812c000-7f31e812d000 rw-p 0018d000 fd:00 917531                     /lib64/libc-1.13.so
+7f31e812d000-7f31e8132000 rw-p 00000000 00:00 0 
+7f31ea3f9000-7f31ea3fc000 rw-s 00000000 00:09 3744                       anon_inode:kvm-vcpu
+7f31ea3fc000-7f31ea3ff000 rw-s 00000000 00:09 3744                       anon_inode:kvm-vcpu
+7f31ea400000-7f31ea402000 rw-p 00000000 00:00 0 
+7fff26cf7000-7fff26d0c000 rwxp 00000000 00:00 0                          [stack]
+7fff26dff000-7fff26e00000 r-xp 00000000 00:00 0                          [vdso]
+ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
+EOF
+
+testrun_compare ${abs_top_builddir}/src/unstrip -n -M testmaps <<\EOF
+0x400000+0x22b2000 - - - /opt/TestBins/bin/arwijn
+0x7f31e7d9f000+0x38e000 - - - /lib64/libc-1.13.so
+EOF
+
+exit 0
index 1353b1d..12c3822 100755 (executable)
 
 testfiles testcore-rtlib testcore-rtlib-ppc
 
-testrun_compare ../src/unstrip -n --core=testcore-rtlib <<\EOF
+testrun_compare ${abs_top_builddir}/src/unstrip -n --core=testcore-rtlib <<\EOF
 0x8048000+0x2000 f1c600bc36cb91bf01f9a63a634ecb79aa4c3199@0x8048178 . - [exe]
+0xf75e9000+0x1a000 29a103420abe341e92072fb14274e250e4072148@0xf75e9164 - - libpthread.so.0
+0xf7603000+0x1b0000 0b9bf374699e141e5dfc14757ff42b8c2373b4de@0xf7603184 - - libc.so.6
+0xf77b3000+0x9000 c6c5b5e35ab9589d4762ac85b4bd56b1b2720e37@0xf77b3164 - - librt.so.1
 0xf77d6000+0x1000 676560b1b765cde9c2e53f134f4ee354ea894747@0xf77d6210 . - linux-gate.so.1
-0xf77b3000+0x9000 c6c5b5e35ab9589d4762ac85b4bd56b1b2720e37@0xf77b3164 /lib/librt.so.1 - librt.so.1
-0xf7603000+0x1b0000 0b9bf374699e141e5dfc14757ff42b8c2373b4de@0xf7603184 /lib/libc.so.6 - libc.so.6
-0xf75e9000+0x1a000 29a103420abe341e92072fb14274e250e4072148@0xf75e9164 /lib/libpthread.so.0 - libpthread.so.0
-0xf77d7000+0x21000 6d2cb32650054f1c176d01d48713a4a5e5e84c1a@0xf77d7124 /lib/ld-linux.so.2 - ld-linux.so.2
+0xf77d7000+0x21000 6d2cb32650054f1c176d01d48713a4a5e5e84c1a@0xf77d7124 - - ld-linux.so.2
 EOF
 
-testrun_compare ../src/unstrip -n --core=testcore-rtlib-ppc <<\EOF
-0x10000000+0x20000 979b7a26747cc09bd84a42b311b5288c704baea5@0x10000174 . - [exe]
+testrun_compare ${abs_top_builddir}/src/unstrip -n --core=testcore-rtlib-ppc <<\EOF
 0x100000+0x10000 708b900b05176964512a6b0fe90c2a0c9d73d726@0x100334 . - linux-vdso32.so.1
-0xfd50000+0x30000 3f7d21508470322d2f47acddc20ab10516edba99@0xfd50164 /lib/librt.so.1 - librt.so.1
-0xfdf0000+0x1c0000 edf3dd232e09d01b90683889bd16b9406c52d4de@0xfdf0184 /lib/libc.so.6 - libc.so.6
-0xfdb0000+0x40000 f6ee91d4c629bc7dacc10534cb30056914e7e0b5@0xfdb0164 /lib/libpthread.so.0 - libpthread.so.0
-0xffb0000+0x50000 edec437a85026a1cf8cda94003706202733130c1@0xffb0124 /lib/ld.so.1 - ld.so.1
+0xfd50000+0x30000 3f7d21508470322d2f47acddc20ab10516edba99@0xfd50164 . - librt.so.1
+0xfdb0000+0x40000 f6ee91d4c629bc7dacc10534cb30056914e7e0b5@0xfdb0164 - - libpthread.so.0
+0xfdf0000+0x1c0000 edf3dd232e09d01b90683889bd16b9406c52d4de@0xfdf0184 - - libc.so.6
+0xffb0000+0x50000 edec437a85026a1cf8cda94003706202733130c1@0xffb0124 - - ld.so.1
+0x10000000+0x20000 979b7a26747cc09bd84a42b311b5288c704baea5@0x10000174 . - [exe]
+EOF
+
+# FAIL was 0x7f67f2caf000 for test-core-lib.so .
+# /lib64/libc.so.6 and /lib64/ld-linux-x86-64.so.2 from link map
+# do not have ELF header stored in the core file.
+# ELF headers in the core file:
+# Offset   VirtAddr          
+# 0x014000 0x00007f67f2caf000 ./test-core-lib.so
+# 0x03a000 0x00007fff1596c000 linux-vdso.so.1
+testfiles test-core.core test-core.exec
+rm -f test-core-lib.so
+outfile=test-core.out
+testrun_out $outfile ${abs_top_builddir}/src/unstrip -n -e test-core.exec --core=test-core.core
+outfile2=test-core.out2
+remove_files="$remove_files $outfile2"
+grep -v libc.so.6 $outfile | sort >$outfile2
+diff -u $outfile2 - <<EOF
+0x400000+0x202038 - test-core.exec - test-core.exec
+0x7f67f2aaf000+0x202000 - . - test-core-lib.so
+0x7fff1596c000+0x1000 a9cf37f53897b5468ee018655760be61b8633d3c@0x7fff1596c340 . - linux-vdso.so.1
 EOF
 
 test_cleanup
index 3654943..dc7d3a4 100755 (executable)
@@ -29,15 +29,15 @@ tempfiles testfile.unstrip testfile.inplace
 # stripped sections that shrank in the stripped file.  strip
 # no longer does that, but unstrip must still handle it.
 
-testrun ../src/unstrip -o testfile.unstrip $stripped $debugfile
+testrun ${abs_top_builddir}/src/unstrip -o testfile.unstrip $stripped $debugfile
 
-testrun ../src/elfcmp --hash-inexact $original testfile.unstrip
+testrun ${abs_top_builddir}/src/elfcmp --hash-inexact $original testfile.unstrip
 
 # Also test modifying the file in place.
 
 rm -f testfile.inplace
 cp $debugfile testfile.inplace
 chmod 644 testfile.inplace
-testrun ../src/unstrip $stripped testfile.inplace
+testrun ${abs_top_builddir}/src/unstrip $stripped testfile.inplace
 
-testrun ../src/elfcmp --hash-inexact $original testfile.inplace
+testrun ${abs_top_builddir}/src/elfcmp --hash-inexact $original testfile.inplace
diff --git a/tests/run-varlocs.sh b/tests/run-varlocs.sh
new file mode 100755 (executable)
index 0000000..9c4b313
--- /dev/null
@@ -0,0 +1,128 @@
+#! /bin/sh
+# Copyright (C) 2013 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
+
+# See the source files testfile_const_type.c testfile_implicit_value.c
+# testfile_entry_value.c testfile_parameter_ref.c testfile_implicit_pointer.c
+# how to regenerate the test files (needs GCC 4.8+).
+
+testfiles testfile_const_type testfile_implicit_value testfile_entry_value
+testfiles testfile_parameter_ref testfile_implicit_pointer
+
+testrun_compare ${abs_top_builddir}/tests/varlocs -e testfile_const_type <<\EOF
+module 'testfile_const_type'
+[b] CU 'const_type.c'@0
+  [33] function 'f1'@80483f0
+    frame_base: {call_frame_cfa {bregx(4,4)}}
+    [4b] parameter 'd'
+      [80483f0,804841b) {fbreg(0)}
+    [57] variable 'w'
+      [80483f0,804841b) {fbreg(0), GNU_deref_type(8){long long int,signed,64@[25]}, GNU_const_type{long long int,signed,64@[25]}(8)[0000806745230100], div, GNU_convert{long long unsigned int,unsigned,64@[2c]}, stack_value}
+  [7d] function 'main'@80482f0
+    frame_base: {call_frame_cfa {bregx(4,4)}}
+EOF
+
+testrun_compare ${abs_top_builddir}/tests/varlocs -e testfile_implicit_value <<\EOF
+module 'testfile_implicit_value'
+[b] CU 'implicit_value.c'@0
+  [25] function 'foo'@80483f0
+    frame_base: {call_frame_cfa {bregx(4,4)}}
+    [3e] variable 'a'
+      [80483f0,80483f6) {implicit_value(8){0200000000000000}, piece(8), implicit_value(8){1500000000000000}, piece(8)}
+  [86] function 'main'@80482f0
+    frame_base: {call_frame_cfa {bregx(4,4)}}
+EOF
+
+testrun_compare ${abs_top_builddir}/tests/varlocs -e testfile_entry_value <<\EOF
+module 'testfile_entry_value'
+[b] CU 'entry_value.c'@0
+  [29] function 'foo'@400500
+    frame_base: {call_frame_cfa {bregx(7,8)}}
+    [4a] parameter 'x'
+      [400500,400504) {reg5}
+    [55] parameter 'y'
+      [400500,400504) {reg4}
+  [68] function 'bar'@400510
+    frame_base: {call_frame_cfa {bregx(7,8)}}
+    [89] parameter 'x'
+      [400510,40051c) {reg5}
+      [40051c,40052b) {reg6}
+      [40052b,400531) {GNU_entry_value(1) {reg5}, stack_value}
+    [96] parameter 'y'
+      [400510,40051c) {reg4}
+      [40051c,40052a) {reg3}
+      [40052a,400531) {GNU_entry_value(1) {reg4}, stack_value}
+    [a3] variable 'z'
+      [400524,400528) {reg0}
+      [400528,400529) {reg12}
+      [400529,40052e) {breg0(0), breg12(0), plus, stack_value}
+      [40052e,400531) {reg0}
+  [e9] function 'main'@400400
+    frame_base: {call_frame_cfa {bregx(7,8)}}
+    [10a] parameter 'argc'
+      [400400,400406) {reg5}
+      [400406,40040a) {breg5(-1), stack_value}
+      [40040a,40040b) {GNU_entry_value(1) {reg5}, stack_value}
+    [119] parameter 'argv'
+      [400400,400403) {reg4}
+      [400403,40040b) {GNU_entry_value(1) {reg4}, stack_value}
+EOF
+
+testrun_compare ${abs_top_builddir}/tests/varlocs -e testfile_parameter_ref <<\EOF
+module 'testfile_parameter_ref'
+[b] CU 'parameter_ref.c'@0
+  [77] function 'foo'@400510
+    frame_base: {call_frame_cfa {bregx(7,8)}}
+    [92] parameter 'x'
+      [400510,400523) {reg5}
+    [99] parameter 'y'
+      [400510,400523) {GNU_parameter_ref[42], stack_value}
+    [a5] variable 'a'
+      [400510,400523) {breg5(0), lit1, shl, stack_value}
+    [b0] variable 'b'
+      [400510,400523) {GNU_parameter_ref[42], lit1, shl, stack_value}
+    [be] variable 'c'
+      <constant value>
+    [c4] parameter 'z'
+      <constant value>
+  [cb] function 'main'@400400
+    frame_base: {call_frame_cfa {bregx(7,8)}}
+    [ec] parameter 'x'
+      [400400,400408) {reg5}
+      [400408,400421) {reg3}
+      [400421,400423) {GNU_entry_value(1) {reg5}, stack_value}
+    [f9] parameter 'argv'
+      [400400,400408) {reg4}
+      [400408,400423) {GNU_entry_value(1) {reg4}, stack_value}
+EOF
+
+testrun_compare ${abs_top_builddir}/tests/varlocs -e testfile_implicit_pointer <<\EOF
+module 'testfile_implicit_pointer'
+[b] CU 'implicit_pointer.c'@0
+  [29] function 'foo'@400500
+    frame_base: {call_frame_cfa {bregx(7,8)}}
+    [4a] parameter 'i'
+      [400500,400503) {reg5}
+    [55] variable 'p'
+      [400500,400503) {GNU_implicit_pointer([4a],0) {reg5}}
+  [73] function 'main'@400400
+    frame_base: {call_frame_cfa {bregx(7,8)}}
+EOF
+
+
+exit 0
diff --git a/tests/test-core-lib.so.bz2 b/tests/test-core-lib.so.bz2
new file mode 100755 (executable)
index 0000000..bb2da88
Binary files /dev/null and b/tests/test-core-lib.so.bz2 differ
diff --git a/tests/test-core.core.bz2 b/tests/test-core.core.bz2
new file mode 100644 (file)
index 0000000..4d4346b
Binary files /dev/null and b/tests/test-core.core.bz2 differ
diff --git a/tests/test-core.exec.bz2 b/tests/test-core.exec.bz2
new file mode 100755 (executable)
index 0000000..49ce551
Binary files /dev/null and b/tests/test-core.exec.bz2 differ
diff --git a/tests/test-offset-loop.alt.bz2 b/tests/test-offset-loop.alt.bz2
new file mode 100644 (file)
index 0000000..c1906b6
Binary files /dev/null and b/tests/test-offset-loop.alt.bz2 differ
diff --git a/tests/test-offset-loop.bz2 b/tests/test-offset-loop.bz2
new file mode 100755 (executable)
index 0000000..62185c0
Binary files /dev/null and b/tests/test-offset-loop.bz2 differ
index ff29136..5e796b4 100644 (file)
@@ -1,5 +1,5 @@
 #! /bin/sh
-# Copyright (C) 2005-2012 Red Hat, Inc.
+# Copyright (C) 2005-2014 Red Hat, Inc.
 # This file is part of elfutils.
 #
 # This file is free software; you can redistribute it and/or modify
 
 set -e
 
+# Each test runs in its own directory to make sure they can run in parallel.
+test_dir="test-$$"
+mkdir -p "$test_dir"
+cd "$test_dir"
+
 #LC_ALL=C
 #export LC_ALL
 
 remove_files=
-trap 'rm -f $remove_files' 0
+
+# Tests that trap EXIT (0) themselves should call this explicitly.
+exit_cleanup()
+{
+  rm -f $remove_files; cd ..; rmdir $test_dir
+}
+trap exit_cleanup 0
 
 tempfiles()
 {
@@ -36,7 +47,7 @@ tempfiles()
 testfiles()
 {
   for file; do
-    bunzip2 -c $srcdir/${file}.bz2 > ${file} 2>/dev/null || exit 77
+    bunzip2 -c ${abs_srcdir}/${file}.bz2 > ${file} 2>/dev/null || exit 77
     remove_files="$remove_files $file"
   done
 }
@@ -72,7 +83,7 @@ testrun()
 built_testrun()
 {
   LD_LIBRARY_PATH="${built_library_path}${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH"\
-  "$@"
+  $VALGRIND_CMD "$@"
 }
 
 installed_testrun()
@@ -80,22 +91,22 @@ installed_testrun()
   program="$1"
   shift
   case "$program" in
-  ./*)
+  ${abs_builddir}/*)
     if [ "x$elfutils_tests_rpath" != xno ]; then
       echo >&2 installcheck not possible with --enable-tests-rpath
       exit 77
     fi
     ;;
-  ../*)
+  ${abs_top_builddir}/src/*)
     program=${bindir}/`program_transform ${program##*/}`
     ;;
   esac
   if [ "${libdir}" != /usr/lib ] && [ "${libdir}" != /usr/lib64 ]; then
     LD_LIBRARY_PATH="${libdir}:${libdir}/elfutils\
 ${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH" \
-    $program ${1+"$@"}
+    $VALGRIND_CMD $program ${1+"$@"}
   else
-    $program ${1+"$@"}
+    $VALGRIND_CMD $program ${1+"$@"}
   fi
 }
 
@@ -104,10 +115,15 @@ program_transform()
   echo "$*" | sed "${program_transform_name}"
 }
 
-self_test_files=`echo ../src/addr2line ../src/elfcmp ../src/elflint \
-../src/findtextrel ../src/ld ../src/nm ../src/objdump ../src/readelf \
-../src/size ../src/strip ../libelf/libelf.so ../libdw/libdw.so \
-../libasm/libasm.so ../backends/libebl_*.so`
+self_test_files=`echo ${abs_top_builddir}/src/addr2line \
+${abs_top_builddir}/src/elfcmp ${abs_top_builddir}/src/elflint \
+${abs_top_builddir}/src/nm ${abs_top_builddir}/src/objdump \
+${abs_top_builddir}/src/readelf \
+${abs_top_builddir}/src/size.o ${abs_top_builddir}/src/strip.o \
+${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`
 
 # Provide a command to run on all self-test files with testrun.
 testrun_on_self()
index 96ddb74..09b4d49 100755 (executable)
@@ -58,4 +58,8 @@ case "$1" in
   ;;
 esac
 
+if [ "x$VALGRIND_CMD" != "x" ]; then
+  export VALGRIND_CMD
+fi
+
 exec "$@"
diff --git a/tests/testfile-backtrace-demangle.bz2 b/tests/testfile-backtrace-demangle.bz2
new file mode 100755 (executable)
index 0000000..f0294df
Binary files /dev/null and b/tests/testfile-backtrace-demangle.bz2 differ
diff --git a/tests/testfile-backtrace-demangle.cc b/tests/testfile-backtrace-demangle.cc
new file mode 100644 (file)
index 0000000..27fff68
--- /dev/null
@@ -0,0 +1,47 @@
+/* Test program for C++ demangled unwinding.
+   Copyright (C) 2014 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/>.  */
+
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+#define NOINLINE_NOCLONE __attribute__ ((noinline, noclone))
+#else
+#define NOINLINE_NOCLONE __attribute__ ((noinline))
+#endif
+
+void NOINLINE_NOCLONE
+cxxfunc (int i)
+{
+  *(volatile int *)0=0;
+  // Avoid tail call optimization.
+  asm volatile ("");
+}
+
+extern "C"
+{
+  void NOINLINE_NOCLONE
+  f (void)
+  {
+    cxxfunc(1);
+    // Avoid tail call optimization.
+    asm volatile ("");
+  }
+}
+
+int
+main()
+{
+  f();
+}
diff --git a/tests/testfile-backtrace-demangle.core.bz2 b/tests/testfile-backtrace-demangle.core.bz2
new file mode 100644 (file)
index 0000000..263c304
Binary files /dev/null and b/tests/testfile-backtrace-demangle.core.bz2 differ
diff --git a/tests/testfile-debug.bz2 b/tests/testfile-debug.bz2
new file mode 100755 (executable)
index 0000000..88e59de
Binary files /dev/null and b/tests/testfile-debug.bz2 differ
diff --git a/tests/testfile-dwfl-report-elf-align-shlib.so.bz2 b/tests/testfile-dwfl-report-elf-align-shlib.so.bz2
new file mode 100755 (executable)
index 0000000..1f35df9
Binary files /dev/null and b/tests/testfile-dwfl-report-elf-align-shlib.so.bz2 differ
diff --git a/tests/testfile-dwzstr.bz2 b/tests/testfile-dwzstr.bz2
new file mode 100755 (executable)
index 0000000..8d2d326
Binary files /dev/null and b/tests/testfile-dwzstr.bz2 differ
diff --git a/tests/testfile-dwzstr.multi.bz2 b/tests/testfile-dwzstr.multi.bz2
new file mode 100644 (file)
index 0000000..5e84991
Binary files /dev/null and b/tests/testfile-dwzstr.multi.bz2 differ
diff --git a/tests/testfile-inlines.bz2 b/tests/testfile-inlines.bz2
new file mode 100755 (executable)
index 0000000..6a0c7c5
Binary files /dev/null and b/tests/testfile-inlines.bz2 differ
diff --git a/tests/testfile-zdebug.bz2 b/tests/testfile-zdebug.bz2
new file mode 100755 (executable)
index 0000000..784041c
Binary files /dev/null and b/tests/testfile-zdebug.bz2 differ
diff --git a/tests/testfile42_noshdrs.bz2 b/tests/testfile42_noshdrs.bz2
new file mode 100644 (file)
index 0000000..e50f750
Binary files /dev/null and b/tests/testfile42_noshdrs.bz2 differ
diff --git a/tests/testfile61.bz2 b/tests/testfile61.bz2
new file mode 100644 (file)
index 0000000..d139389
Binary files /dev/null and b/tests/testfile61.bz2 differ
diff --git a/tests/testfile62.bz2 b/tests/testfile62.bz2
new file mode 100644 (file)
index 0000000..8a42cf6
Binary files /dev/null and b/tests/testfile62.bz2 differ
diff --git a/tests/testfile63.bz2 b/tests/testfile63.bz2
new file mode 100644 (file)
index 0000000..4be87cd
Binary files /dev/null and b/tests/testfile63.bz2 differ
diff --git a/tests/testfile64.bz2 b/tests/testfile64.bz2
new file mode 100644 (file)
index 0000000..674bd53
Binary files /dev/null and b/tests/testfile64.bz2 differ
diff --git a/tests/testfile65.bz2 b/tests/testfile65.bz2
new file mode 100644 (file)
index 0000000..5e925f8
Binary files /dev/null and b/tests/testfile65.bz2 differ
diff --git a/tests/testfile66.bz2 b/tests/testfile66.bz2
new file mode 100755 (executable)
index 0000000..4797590
Binary files /dev/null and b/tests/testfile66.bz2 differ
diff --git a/tests/testfile66.core.bz2 b/tests/testfile66.core.bz2
new file mode 100644 (file)
index 0000000..12e2d44
Binary files /dev/null and b/tests/testfile66.core.bz2 differ
diff --git a/tests/testfile67.bz2 b/tests/testfile67.bz2
new file mode 100644 (file)
index 0000000..bb64745
Binary files /dev/null and b/tests/testfile67.bz2 differ
diff --git a/tests/testfile68.bz2 b/tests/testfile68.bz2
new file mode 100644 (file)
index 0000000..3fe6792
Binary files /dev/null and b/tests/testfile68.bz2 differ
diff --git a/tests/testfile69.core.bz2 b/tests/testfile69.core.bz2
new file mode 100644 (file)
index 0000000..9955318
Binary files /dev/null and b/tests/testfile69.core.bz2 differ
diff --git a/tests/testfile69.so.bz2 b/tests/testfile69.so.bz2
new file mode 100755 (executable)
index 0000000..fdddab9
Binary files /dev/null and b/tests/testfile69.so.bz2 differ
diff --git a/tests/testfile70.core.bz2 b/tests/testfile70.core.bz2
new file mode 100644 (file)
index 0000000..6c47c6d
Binary files /dev/null and b/tests/testfile70.core.bz2 differ
diff --git a/tests/testfile70.exec.bz2 b/tests/testfile70.exec.bz2
new file mode 100644 (file)
index 0000000..f1b969a
Binary files /dev/null and b/tests/testfile70.exec.bz2 differ
diff --git a/tests/testfile71.bz2 b/tests/testfile71.bz2
new file mode 100644 (file)
index 0000000..ce5b08f
Binary files /dev/null and b/tests/testfile71.bz2 differ
diff --git a/tests/testfile_aarch64_core.bz2 b/tests/testfile_aarch64_core.bz2
new file mode 100644 (file)
index 0000000..9d56268
Binary files /dev/null and b/tests/testfile_aarch64_core.bz2 differ
diff --git a/tests/testfile_class_func.bz2 b/tests/testfile_class_func.bz2
new file mode 100755 (executable)
index 0000000..e40dcf2
Binary files /dev/null and b/tests/testfile_class_func.bz2 differ
diff --git a/tests/testfile_const_type.bz2 b/tests/testfile_const_type.bz2
new file mode 100755 (executable)
index 0000000..fea4a9c
Binary files /dev/null and b/tests/testfile_const_type.bz2 differ
diff --git a/tests/testfile_const_type.c b/tests/testfile_const_type.c
new file mode 100644 (file)
index 0000000..259007d
--- /dev/null
@@ -0,0 +1,14 @@
+// gcc -m32 -g -O2 -o const_type const_type.c
+
+__attribute__((noinline, noclone)) int
+f1 (long long d)
+{
+  long long w = d / 0x1234567800000LL;
+  return w;
+}
+
+int
+main ()
+{
+  return f1 (4LL) - f1 (4LL);
+}
diff --git a/tests/testfile_entry_value.bz2 b/tests/testfile_entry_value.bz2
new file mode 100755 (executable)
index 0000000..fde86c6
Binary files /dev/null and b/tests/testfile_entry_value.bz2 differ
diff --git a/tests/testfile_entry_value.c b/tests/testfile_entry_value.c
new file mode 100644 (file)
index 0000000..d2f232b
--- /dev/null
@@ -0,0 +1,19 @@
+// gcc -g -O2 -o entry_value entry_value.c
+int __attribute__((noinline, noclone)) foo (int x, int y)
+{
+  return x + y;
+}
+
+int __attribute__((noinline, noclone)) bar (int x, int y)
+{
+  int z;
+  z = foo (x, y);
+  z += foo (y, x);
+  return z;
+}
+
+int
+main (int argc, char **argv)
+{
+  return bar (argc + 1, argc - 1);
+}
diff --git a/tests/testfile_i686_core.bz2 b/tests/testfile_i686_core.bz2
new file mode 100644 (file)
index 0000000..8412776
Binary files /dev/null and b/tests/testfile_i686_core.bz2 differ
diff --git a/tests/testfile_implicit_pointer.bz2 b/tests/testfile_implicit_pointer.bz2
new file mode 100755 (executable)
index 0000000..72f6a69
Binary files /dev/null and b/tests/testfile_implicit_pointer.bz2 differ
diff --git a/tests/testfile_implicit_pointer.c b/tests/testfile_implicit_pointer.c
new file mode 100644 (file)
index 0000000..d7e28a0
--- /dev/null
@@ -0,0 +1,12 @@
+// gcc -g -O2 -o implicit_pointer implicit_pointer.c
+
+static __attribute__((noinline, noclone)) int foo (int i)
+{
+  int *p = &i;
+  return *p;
+}
+
+int main (void)
+{
+  return foo (23) - 23;
+}
diff --git a/tests/testfile_implicit_value.bz2 b/tests/testfile_implicit_value.bz2
new file mode 100755 (executable)
index 0000000..c365a99
Binary files /dev/null and b/tests/testfile_implicit_value.bz2 differ
diff --git a/tests/testfile_implicit_value.c b/tests/testfile_implicit_value.c
new file mode 100644 (file)
index 0000000..8885bbf
--- /dev/null
@@ -0,0 +1,12 @@
+// gcc -m32 -g -O2 -o implicit_value implicit_value.c
+
+static __attribute__((noinline, noclone)) int foo ()
+{
+  unsigned long long a[] = { 2, 21 };
+  return a[0] * a[1];
+}
+
+int main (void)
+{
+  return foo () - 42;
+}
diff --git a/tests/testfile_nested_funcs.bz2 b/tests/testfile_nested_funcs.bz2
new file mode 100755 (executable)
index 0000000..d36b603
Binary files /dev/null and b/tests/testfile_nested_funcs.bz2 differ
diff --git a/tests/testfile_parameter_ref.bz2 b/tests/testfile_parameter_ref.bz2
new file mode 100755 (executable)
index 0000000..8ff900d
Binary files /dev/null and b/tests/testfile_parameter_ref.bz2 differ
diff --git a/tests/testfile_parameter_ref.c b/tests/testfile_parameter_ref.c
new file mode 100644 (file)
index 0000000..7fe985f
--- /dev/null
@@ -0,0 +1,20 @@
+// gcc -g -O2 -o parameter_ref parameter_ref.c
+
+volatile int vv;
+
+/* Don't inline, but do allow clone to create specialized versions.  */
+static __attribute__((noinline)) int
+foo (int x, int y, int z)
+{
+  int a = x * 2;
+  int b = y * 2;
+  int c = z * 2;
+  vv++;
+  return x + z;
+}
+
+int
+main (int x, char **argv)
+{
+  return foo (x, 2, 3) + foo (x, 4, 3) + foo (x + 6, x, 3) + x;
+}
diff --git a/tests/testfileaarch64.bz2 b/tests/testfileaarch64.bz2
new file mode 100755 (executable)
index 0000000..72e5ef0
Binary files /dev/null and b/tests/testfileaarch64.bz2 differ
diff --git a/tests/testfilearm.bz2 b/tests/testfilearm.bz2
new file mode 100755 (executable)
index 0000000..d6cd090
Binary files /dev/null and b/tests/testfilearm.bz2 differ
diff --git a/tests/testfilebasmin.bz2 b/tests/testfilebasmin.bz2
new file mode 100755 (executable)
index 0000000..3843972
Binary files /dev/null and b/tests/testfilebasmin.bz2 differ
diff --git a/tests/testfilebaxmin.bz2 b/tests/testfilebaxmin.bz2
new file mode 100755 (executable)
index 0000000..c450cc8
Binary files /dev/null and b/tests/testfilebaxmin.bz2 differ
diff --git a/tests/testfilebazdbg.bz2 b/tests/testfilebazdbg.bz2
new file mode 100755 (executable)
index 0000000..8e58636
Binary files /dev/null and b/tests/testfilebazdbg.bz2 differ
diff --git a/tests/testfilebazdbg.debug.bz2 b/tests/testfilebazdbg.debug.bz2
new file mode 100755 (executable)
index 0000000..3b01176
Binary files /dev/null and b/tests/testfilebazdbg.debug.bz2 differ
diff --git a/tests/testfilebazdbg_pl.bz2 b/tests/testfilebazdbg_pl.bz2
new file mode 100755 (executable)
index 0000000..9e06a80
Binary files /dev/null and b/tests/testfilebazdbg_pl.bz2 differ
diff --git a/tests/testfilebazdbg_plr.bz2 b/tests/testfilebazdbg_plr.bz2
new file mode 100755 (executable)
index 0000000..1bc43dd
Binary files /dev/null and b/tests/testfilebazdbg_plr.bz2 differ
diff --git a/tests/testfilebazdbgppc64.bz2 b/tests/testfilebazdbgppc64.bz2
new file mode 100755 (executable)
index 0000000..17e77d6
Binary files /dev/null and b/tests/testfilebazdbgppc64.bz2 differ
diff --git a/tests/testfilebazdbgppc64.debug.bz2 b/tests/testfilebazdbgppc64.debug.bz2
new file mode 100755 (executable)
index 0000000..8faa17a
Binary files /dev/null and b/tests/testfilebazdbgppc64.debug.bz2 differ
diff --git a/tests/testfilebazdbgppc64_pl.bz2 b/tests/testfilebazdbgppc64_pl.bz2
new file mode 100755 (executable)
index 0000000..9f372fb
Binary files /dev/null and b/tests/testfilebazdbgppc64_pl.bz2 differ
diff --git a/tests/testfilebazdbgppc64_plr.bz2 b/tests/testfilebazdbgppc64_plr.bz2
new file mode 100755 (executable)
index 0000000..70f8e00
Binary files /dev/null and b/tests/testfilebazdbgppc64_plr.bz2 differ
diff --git a/tests/testfilebazdyn.bz2 b/tests/testfilebazdyn.bz2
new file mode 100755 (executable)
index 0000000..bb623bb
Binary files /dev/null and b/tests/testfilebazdyn.bz2 differ
diff --git a/tests/testfilebazdynppc64.bz2 b/tests/testfilebazdynppc64.bz2
new file mode 100755 (executable)
index 0000000..2e01699
Binary files /dev/null and b/tests/testfilebazdynppc64.bz2 differ
diff --git a/tests/testfilebazmdb.bz2 b/tests/testfilebazmdb.bz2
new file mode 100755 (executable)
index 0000000..561eca1
Binary files /dev/null and b/tests/testfilebazmdb.bz2 differ
diff --git a/tests/testfilebazmdbppc64.bz2 b/tests/testfilebazmdbppc64.bz2
new file mode 100755 (executable)
index 0000000..16c2dd0
Binary files /dev/null and b/tests/testfilebazmdbppc64.bz2 differ
diff --git a/tests/testfilebazmin.bz2 b/tests/testfilebazmin.bz2
new file mode 100755 (executable)
index 0000000..12bcc6b
Binary files /dev/null and b/tests/testfilebazmin.bz2 differ
diff --git a/tests/testfilebazmin_pl.bz2 b/tests/testfilebazmin_pl.bz2
new file mode 100755 (executable)
index 0000000..73cef4a
Binary files /dev/null and b/tests/testfilebazmin_pl.bz2 differ
diff --git a/tests/testfilebazmin_plr.bz2 b/tests/testfilebazmin_plr.bz2
new file mode 100755 (executable)
index 0000000..e4fcf85
Binary files /dev/null and b/tests/testfilebazmin_plr.bz2 differ
diff --git a/tests/testfilebazminppc64.bz2 b/tests/testfilebazminppc64.bz2
new file mode 100755 (executable)
index 0000000..364d84c
Binary files /dev/null and b/tests/testfilebazminppc64.bz2 differ
diff --git a/tests/testfilebazminppc64_pl.bz2 b/tests/testfilebazminppc64_pl.bz2
new file mode 100755 (executable)
index 0000000..6686340
Binary files /dev/null and b/tests/testfilebazminppc64_pl.bz2 differ
diff --git a/tests/testfilebazminppc64_plr.bz2 b/tests/testfilebazminppc64_plr.bz2
new file mode 100755 (executable)
index 0000000..4610285
Binary files /dev/null and b/tests/testfilebazminppc64_plr.bz2 differ
diff --git a/tests/testfilebaztab.bz2 b/tests/testfilebaztab.bz2
new file mode 100755 (executable)
index 0000000..a99b739
Binary files /dev/null and b/tests/testfilebaztab.bz2 differ
diff --git a/tests/testfilebaztabppc64.bz2 b/tests/testfilebaztabppc64.bz2
new file mode 100755 (executable)
index 0000000..03afb8c
Binary files /dev/null and b/tests/testfilebaztabppc64.bz2 differ
diff --git a/tests/testfiledwarfinlines.bz2 b/tests/testfiledwarfinlines.bz2
new file mode 100755 (executable)
index 0000000..db14f81
Binary files /dev/null and b/tests/testfiledwarfinlines.bz2 differ
diff --git a/tests/testfiledwarfinlines.core.bz2 b/tests/testfiledwarfinlines.core.bz2
new file mode 100644 (file)
index 0000000..2299e1e
Binary files /dev/null and b/tests/testfiledwarfinlines.core.bz2 differ
diff --git a/tests/testfilefoobarbaz.bz2 b/tests/testfilefoobarbaz.bz2
new file mode 100755 (executable)
index 0000000..0e721ff
Binary files /dev/null and b/tests/testfilefoobarbaz.bz2 differ
diff --git a/tests/testfileloc.bz2 b/tests/testfileloc.bz2
new file mode 100755 (executable)
index 0000000..a436965
Binary files /dev/null and b/tests/testfileloc.bz2 differ
diff --git a/tests/testfilenolines.bz2 b/tests/testfilenolines.bz2
new file mode 100755 (executable)
index 0000000..23cd722
Binary files /dev/null and b/tests/testfilenolines.bz2 differ
diff --git a/tests/testfileppc32.bz2 b/tests/testfileppc32.bz2
new file mode 100755 (executable)
index 0000000..f57763a
Binary files /dev/null and b/tests/testfileppc32.bz2 differ
diff --git a/tests/testfileppc64.bz2 b/tests/testfileppc64.bz2
new file mode 100755 (executable)
index 0000000..870046b
Binary files /dev/null and b/tests/testfileppc64.bz2 differ
diff --git a/tests/testfiles390.bz2 b/tests/testfiles390.bz2
new file mode 100755 (executable)
index 0000000..14ebf6c
Binary files /dev/null and b/tests/testfiles390.bz2 differ
diff --git a/tests/testfiles390x.bz2 b/tests/testfiles390x.bz2
new file mode 100755 (executable)
index 0000000..eb63ed8
Binary files /dev/null and b/tests/testfiles390x.bz2 differ
diff --git a/tests/typeiter2.c b/tests/typeiter2.c
new file mode 100644 (file)
index 0000000..6ddfa38
--- /dev/null
@@ -0,0 +1,89 @@
+/* Copyright (C) 2012, 2013 Red Hat, Inc.
+   This file is part of elfutils.
+
+   This file is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   elfutils is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <fcntl.h>
+#include ELFUTILS_HEADER(dw)
+#include <stdio.h>
+#include <unistd.h>
+#include <dwarf.h>
+
+int
+main (int argc, char *argv[])
+{
+  for (int i = 1; i < argc; ++i)
+    {
+      int fd = open (argv[i], O_RDONLY);
+
+      Dwarf *dbg = dwarf_begin (fd, DWARF_C_READ);
+      if (dbg != NULL)
+       {
+         Dwarf_Off off = 0;
+         size_t cuhl;
+         Dwarf_Off noff;
+         uint64_t type_sig;
+
+         while (dwarf_next_unit (dbg, off, &noff, &cuhl, NULL, NULL, NULL,
+                                 NULL, &type_sig, NULL) == 0)
+           {
+             Dwarf_Die die_mem;
+             dwarf_offdie_types (dbg, off + cuhl, &die_mem);
+             off = noff;
+           }
+
+         off = 0;
+
+         while (dwarf_nextcu (dbg, off, &noff, &cuhl, NULL, NULL, NULL) == 0)
+           {
+             Dwarf_Die die_mem;
+             Dwarf_Die *die = dwarf_offdie (dbg, off + cuhl, &die_mem);
+
+             Dwarf_Die iter_mem;
+             Dwarf_Die *iter = &iter_mem;
+             dwarf_child (die, &iter_mem);
+
+             while (1)
+               {
+                 if (dwarf_tag (iter) == DW_TAG_variable)
+                   {
+                     Dwarf_Attribute attr_mem;
+                     Dwarf_Die form_mem, *form;
+                     form = dwarf_formref_die (dwarf_attr (iter, DW_AT_type,
+                                                           &attr_mem),
+                                               &form_mem);
+
+                     if (form == NULL)
+                       printf ("fail\n");
+                     else
+                       printf ("ok\n");
+                   }
+
+                 if (dwarf_siblingof (iter, &iter_mem) != 0)
+                   break;
+               }
+
+             off = noff;
+           }
+
+         dwarf_end (dbg);
+       }
+
+      close (fd);
+    }
+}
index 9e40686..f4c1475 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 
 
 int
 main (int argc, char *argv[] __attribute__ ((unused)))
 {
-  const char *fname = "xxx";
+  const char *fname = "xxx_update1";
   int fd;
   Elf *elf;
   Elf32_Ehdr *ehdr;
@@ -120,5 +121,7 @@ main (int argc, char *argv[] __attribute__ ((unused)))
       exit (1);
     }
 
+  unlink (fname);
+
   return 0;
 }
index 4232694..5805163 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 
 
 int
 main (int argc, char *argv[] __attribute__ ((unused)))
 {
-  const char *fname = "xxx";
+  const char *fname = "xxx_update2";
   int fd;
   Elf *elf;
   Elf32_Ehdr *ehdr;
@@ -143,5 +144,7 @@ main (int argc, char *argv[] __attribute__ ((unused)))
       exit (1);
     }
 
+  unlink (fname);
+
   return 0;
 }
index 1a62b34..d760687 100644 (file)
@@ -26,6 +26,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 
 #include ELFUTILS_HEADER(ebl)
 
@@ -33,7 +34,7 @@
 int
 main (int argc, char *argv[] __attribute__ ((unused)))
 {
-  const char *fname = "xxx";
+  const char *fname = "xxx_update3";
   int fd;
   Elf *elf;
   Elf32_Ehdr *ehdr;
@@ -198,5 +199,7 @@ main (int argc, char *argv[] __attribute__ ((unused)))
       exit (1);
     }
 
+  unlink (fname);
+
   return 0;
 }
index f5f91e3..85de6c3 100644 (file)
@@ -34,7 +34,7 @@
 int
 main (int argc, char *argv[] __attribute__ ((unused)))
 {
-  const char fname[] = "xxx";
+  const char fname[] = "xxx_update4";
   int fd;
   Elf *elf;
   Elf32_Ehdr *ehdr;
diff --git a/tests/varlocs.c b/tests/varlocs.c
new file mode 100644 (file)
index 0000000..04f17ff
--- /dev/null
@@ -0,0 +1,826 @@
+/* Test program for dwarf location functions.
+   Copyright (C) 2013 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/>.  */
+
+#include <config.h>
+#include <assert.h>
+#include <argp.h>
+#include <inttypes.h>
+#include <errno.h>
+#include ELFUTILS_HEADER(dw)
+#include ELFUTILS_HEADER(dwfl)
+#include <dwarf.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <error.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "../libdw/known-dwarf.h"
+
+// The Dwarf, Dwarf_CFIs and address bias of
+// cfi table to adjust DWARF addresses against.
+// Needed for DW_OP_call_frame_cfa.
+static Dwarf *dw;
+Dwarf_CFI *cfi_debug;
+Dwarf_CFI *cfi_eh;
+Dwarf_Addr cfi_eh_bias;
+
+// Whether the current function has a DW_AT_frame_base defined.
+// Needed for DW_OP_fbreg.
+bool has_frame_base;
+
+static void
+print_die (Dwarf_Die *die, const char *what, int indent)
+{
+  Dwarf_Addr entrypc;
+  const char *name = dwarf_diename (die) ?: "<unknown>";
+  if (dwarf_entrypc (die, &entrypc) == 0)
+    printf ("%*s[%" PRIx64 "] %s '%s'@%" PRIx64 "\n", indent * 2, "",
+           dwarf_dieoffset (die), what, name, entrypc);
+  else
+    printf ("%*s[%" PRIx64 "] %s '%s'\n", indent * 2, "",
+           dwarf_dieoffset (die), what, name);
+}
+
+static const char *
+dwarf_encoding_string (unsigned int code)
+{
+  static const char *const known[] =
+    {
+#define ONE_KNOWN_DW_ATE(NAME, CODE) [CODE] = #NAME,
+      ALL_KNOWN_DW_ATE
+#undef ONE_KNOWN_DW_ATE
+    };
+
+  if (likely (code < sizeof (known) / sizeof (known[0])))
+    return known[code];
+
+  return NULL;
+}
+
+/* BASE must be a base type DIE referenced by a typed DWARF expression op.  */
+static void
+print_base_type (Dwarf_Die *base)
+{
+  assert (dwarf_tag (base) == DW_TAG_base_type);
+
+  Dwarf_Attribute encoding;
+  Dwarf_Word enctype;
+  if (dwarf_attr (base, DW_AT_encoding, &encoding) == NULL
+      || dwarf_formudata (&encoding, &enctype) != 0)
+    error (EXIT_FAILURE, 0, "base type without encoding");
+
+  Dwarf_Attribute bsize;
+  Dwarf_Word bits;
+  if (dwarf_attr (base, DW_AT_byte_size, &bsize) != NULL
+      && dwarf_formudata (&bsize, &bits) == 0)
+    bits *= 8;
+  else if (dwarf_attr (base, DW_AT_bit_size, &bsize) == NULL
+          || dwarf_formudata (&bsize, &bits) != 0)
+    error (EXIT_FAILURE, 0, "base type without byte or bit size");
+
+  printf ("{%s,%s,%" PRIu64 "@[%" PRIx64 "]}",
+         dwarf_diename (base),
+         dwarf_encoding_string (enctype),
+         bits,
+         dwarf_dieoffset (base));
+}
+
+static const char *
+dwarf_opcode_string (unsigned int code)
+{
+  static const char *const known[] =
+    {
+#define ONE_KNOWN_DW_OP_DESC(NAME, CODE, DESC) ONE_KNOWN_DW_OP (NAME, CODE)
+#define ONE_KNOWN_DW_OP(NAME, CODE) [CODE] = #NAME,
+      ALL_KNOWN_DW_OP
+#undef ONE_KNOWN_DW_OP
+#undef ONE_KNOWN_DW_OP_DESC
+    };
+
+  if (likely (code < sizeof (known) / sizeof (known[0])))
+    return known[code];
+
+  return NULL;
+}
+
+// Forward reference for print_expr_block.
+static void print_expr (Dwarf_Attribute *, Dwarf_Op *, Dwarf_Addr);
+
+static void
+print_expr_block (Dwarf_Attribute *attr, Dwarf_Op *exprs, int len,
+                 Dwarf_Addr addr)
+{
+  printf ("{");
+  for (int i = 0; i < len; i++)
+    {
+      print_expr (attr, &exprs[i], addr);
+      printf ("%s", (i + 1 < len ? ", " : ""));
+    }
+  printf ("}");
+}
+
+static void
+print_expr_block_addrs (Dwarf_Attribute *attr,
+                       Dwarf_Addr begin, Dwarf_Addr end,
+                       Dwarf_Op *exprs, int len)
+{
+  printf ("      [%" PRIx64 ",%" PRIx64 ") ", begin, end);
+  print_expr_block (attr, exprs, len, begin);
+  printf ("\n");
+}
+
+static void
+print_expr (Dwarf_Attribute *attr, Dwarf_Op *expr, Dwarf_Addr addr)
+{
+  uint8_t atom = expr->atom;
+  const char *opname = dwarf_opcode_string (atom);
+  assert (opname != NULL);
+
+  switch (atom)
+    {
+    case DW_OP_deref:
+    case DW_OP_dup:
+    case DW_OP_drop:
+    case DW_OP_over:
+    case DW_OP_swap:
+    case DW_OP_rot:
+    case DW_OP_xderef:
+    case DW_OP_abs:
+    case DW_OP_and:
+    case DW_OP_div:
+    case DW_OP_minus:
+    case DW_OP_mod:
+    case DW_OP_mul:
+    case DW_OP_neg:
+    case DW_OP_not:
+    case DW_OP_or:
+    case DW_OP_plus:
+    case DW_OP_shl:
+    case DW_OP_shr:
+    case DW_OP_shra:
+    case DW_OP_xor:
+    case DW_OP_eq:
+    case DW_OP_ge:
+    case DW_OP_gt:
+    case DW_OP_le:
+    case DW_OP_lt:
+    case DW_OP_ne:
+    case DW_OP_lit0 ... DW_OP_lit31:
+    case DW_OP_reg0 ... DW_OP_reg31:
+    case DW_OP_nop:
+    case DW_OP_stack_value:
+      /* No arguments. */
+      printf ("%s", opname);
+      break;
+
+    case DW_OP_form_tls_address:
+      /* No arguments. Special. Pops an address and pushes the
+        corresponding address in the current thread local
+        storage. Uses the thread local storage block of the defining
+        module (executable, shared library). */
+      printf ("%s", opname);
+      break;
+
+    case DW_OP_GNU_push_tls_address:
+      /* No arguments. Special. Not the same as DW_OP_form_tls_address.
+        Pops an offset into the current thread local strorage and
+        pushes back the actual address. */
+      printf ("%s", opname);
+      break;
+
+    case DW_OP_call_frame_cfa:
+      /* No arguments. Special. Pushes Call Frame Address as computed
+        by CFI data (dwarf_cfi_addrframe will fetch that info (either from
+        the .eh_frame or .debug_frame CFI) and dwarf_frame_cfa translatesr
+         the CFI instructions into a plain DWARF expression.
+        Never used in CFI itself. */
+
+      if (attr == NULL)
+       error (EXIT_FAILURE, 0, "%s used in CFI", opname);
+
+      printf ("%s ", opname);
+      if (cfi_eh == NULL && cfi_debug == NULL)
+       error (EXIT_FAILURE, 0, "DW_OP_call_frame_cfa used but no cfi found.");
+
+      Dwarf_Frame *frame;
+      if (dwarf_cfi_addrframe (cfi_eh, addr + cfi_eh_bias, &frame) != 0
+         && dwarf_cfi_addrframe (cfi_debug, addr, &frame) != 0)
+       error (EXIT_FAILURE, 0, "dwarf_cfi_addrframe 0x%" PRIx64 ": %s",
+              addr, dwarf_errmsg (-1));
+
+      Dwarf_Op *cfa_ops;
+      size_t cfa_nops;
+      if (dwarf_frame_cfa (frame, &cfa_ops, &cfa_nops) != 0)
+       error (EXIT_FAILURE, 0, "dwarf_frame_cfa 0x%" PRIx64 ": %s",
+              addr, dwarf_errmsg (-1));
+      if (cfa_nops < 1)
+       error (EXIT_FAILURE, 0, "dwarf_frame_cfa no ops");
+      print_expr_block (NULL, cfa_ops, cfa_nops, 0);
+      free (frame);
+      break;
+
+    case DW_OP_push_object_address:
+      /* No arguments. Special. Pushes object address explicitly.
+       Normally only done implicitly by DW_AT_data_member_location.
+       Never used in CFI. */
+      if (attr == NULL)
+       error (EXIT_FAILURE, 0, "%s used in CFI", opname);
+      printf ("%s", opname);
+      break;
+
+    case DW_OP_addr:
+      /* 1 address argument. */
+      printf ("%s(0x%" PRIx64 ")", opname, (Dwarf_Addr) expr->number);
+      break;
+
+    case DW_OP_const1u:
+    case DW_OP_const2u:
+    case DW_OP_const4u:
+    case DW_OP_const8u:
+    case DW_OP_constu:
+    case DW_OP_pick:
+    case DW_OP_plus_uconst:
+    case DW_OP_regx:
+    case DW_OP_piece:
+    case DW_OP_deref_size:
+    case DW_OP_xderef_size:
+      /* 1 numeric unsigned argument. */
+      printf ("%s(%" PRIu64 ")", opname, expr->number);
+      break;
+
+    case DW_OP_call2:
+    case DW_OP_call4:
+    case DW_OP_call_ref:
+      /* 1 DIE offset argument for more ops in location attribute of DIE.
+         Never used in CFI.  */
+      {
+       if (attr == NULL)
+         error (EXIT_FAILURE, 0, "%s used in CFI", opname);
+
+       Dwarf_Attribute call_attr;
+       if (dwarf_getlocation_attr (attr, expr, &call_attr) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_getlocation_attr for %s error %s",
+                opname, dwarf_errmsg (-1));
+
+       Dwarf_Die call_die;
+       if (dwarf_getlocation_die (attr, expr, &call_die) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_getlocation_die for %s error %s",
+                opname, dwarf_errmsg (-1));
+
+       Dwarf_Op *call_ops;
+       size_t call_len;
+       if (dwarf_getlocation (&call_attr, &call_ops, &call_len) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_getlocation for entry: %s",
+                dwarf_errmsg (-1));
+
+       printf ("%s([%" PRIx64 "]) ", opname, dwarf_dieoffset (&call_die));
+       print_expr_block (&call_attr, call_ops, call_len, addr);
+      }
+      break;
+
+    case DW_OP_const1s:
+    case DW_OP_const2s:
+    case DW_OP_const4s:
+    case DW_OP_const8s:
+    case DW_OP_consts:
+    case DW_OP_skip:
+    case DW_OP_bra:
+    case DW_OP_breg0 ... DW_OP_breg31:
+      /* 1 numeric signed argument. */
+      printf ("%s(%" PRId64 ")", opname, (Dwarf_Sword) expr->number);
+      break;
+
+    case DW_OP_fbreg:
+      /* 1 numeric signed argument. Offset from frame base. */
+      if (attr == NULL)
+         error (EXIT_FAILURE, 0, "%s used in CFI", opname);
+
+      if (! has_frame_base)
+       error (EXIT_FAILURE, 0, "DW_OP_fbreg used without a frame base");
+
+      printf ("%s(%" PRId64 ")", opname, (Dwarf_Sword) expr->number);
+      break;
+
+    case DW_OP_bregx:
+      /* 2 arguments, unsigned register number, signed offset. */
+      printf ("%s(%" PRIu64 ",%" PRId64 ")", opname,
+             expr->number, (Dwarf_Sword) expr->number2);
+      break;
+
+    case DW_OP_bit_piece:
+      /* 2 arguments, unsigned size, unsigned offset. */
+      printf ("%s(%" PRIu64 ",%" PRIu64 ")", opname,
+             expr->number, expr->number2);
+      break;
+
+    case DW_OP_implicit_value:
+      /* Special, unsigned size plus block. */
+      {
+       Dwarf_Attribute const_attr;
+       Dwarf_Block block;
+       if (dwarf_getlocation_attr (attr, expr, &const_attr) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_getlocation_attr: %s",
+                dwarf_errmsg (-1));
+
+       if (dwarf_formblock (&const_attr, &block) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_formblock: %s",
+                dwarf_errmsg (-1));
+
+       /* This is the "old" way. Check they result in the same.  */
+       Dwarf_Block block_impl;
+       if (dwarf_getlocation_implicit_value (attr, expr, &block_impl) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_getlocation_implicit_value: %s",
+                dwarf_errmsg (-1));
+
+       assert (expr->number == block.length);
+       assert (block.length == block_impl.length);
+       printf ("%s(%" PRIu64 "){", opname, block.length);
+       for (size_t i = 0; i < block.length; i++)
+         {
+           printf ("%02x", block.data[i]);
+           assert (block.data[i] == block_impl.data[i]);
+         }
+       printf("}");
+      }
+      break;
+
+    case DW_OP_GNU_implicit_pointer:
+      /* Special, DIE offset, signed offset. Referenced DIE has a
+        location or const_value attribute. */
+      {
+       if (attr == NULL)
+         error (EXIT_FAILURE, 0, "%s used in CFI", opname);
+
+       Dwarf_Attribute attrval;
+       if (dwarf_getlocation_implicit_pointer (attr, expr, &attrval) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_getlocation_implicit_pointer: %s",
+                dwarf_errmsg (-1));
+
+       // Sanity check, results should be the same.
+       Dwarf_Attribute attrval2;
+       if (dwarf_getlocation_attr (attr, expr, &attrval2) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_getlocation_attr: %s",
+                dwarf_errmsg (-1));
+
+       assert (dwarf_whatattr (&attrval) == dwarf_whatattr (&attrval2));
+       assert (dwarf_whatform (&attrval) == dwarf_whatform (&attrval2));
+       // In theory two different valp pointers could point to the same
+       // value. But here we really expect them to be the equal.
+       assert (attrval.valp == attrval2.valp);
+
+       Dwarf_Die impl_die;
+       if (dwarf_getlocation_die (attr, expr, &impl_die) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_getlocation_due: %s",
+                dwarf_errmsg (-1));
+
+       printf ("%s([%" PRIx64 "],%" PRId64 ") ", opname,
+               dwarf_dieoffset (&impl_die), expr->number2);
+
+       if (dwarf_whatattr (&attrval) == DW_AT_const_value)
+         printf ("<constant value>"); // Lookup type...
+       else
+         {
+           // Lookup the location description at the current address.
+           Dwarf_Op *exprval;
+           size_t exprval_len;
+           int locs = dwarf_getlocation_addr (&attrval, addr,
+                                              &exprval, &exprval_len, 1);
+           if (locs == 0)
+             printf ("<no location>"); // This means "optimized out".
+           else if (locs == 1)
+             print_expr_block (&attrval, exprval, exprval_len, addr);
+           else
+             error (EXIT_FAILURE, 0,
+                    "dwarf_getlocation_addr attrval at addr 0x%" PRIx64
+                    ", locs (%d): %s", addr, locs, dwarf_errmsg (-1));
+         }
+      }
+      break;
+
+    case DW_OP_GNU_entry_value:
+      /* Special, unsigned size plus expression block. All registers
+        inside the block should be interpreted as they had on
+        entering the function. dwarf_getlocation_attr will return an
+        attribute containing the block as locexpr which can be
+        retrieved with dwarf_getlocation.  */
+      {
+       Dwarf_Attribute entry_attr;
+       if (dwarf_getlocation_attr (attr, expr, &entry_attr) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_getlocation_attr: %s",
+                dwarf_errmsg (-1));
+
+       Dwarf_Op *entry_ops;
+       size_t entry_len;
+       if (dwarf_getlocation (&entry_attr, &entry_ops, &entry_len) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_getlocation for entry: %s",
+                dwarf_errmsg (-1));
+
+       printf ("%s(%zd) ", opname, entry_len);
+       print_expr_block (attr, entry_ops, entry_len, addr);
+      }
+      break;
+
+    case DW_OP_GNU_parameter_ref:
+      /* Special, unsigned CU relative DIE offset pointing to a
+        DW_TAG_formal_parameter. The value that parameter had at the
+        call site of the current function will be put on the DWARF
+        stack. The value can be retrieved by finding the
+        DW_TAG_GNU_call_site_parameter which has as
+        DW_AT_abstract_origin the same formal parameter DIE. */
+      {
+       Dwarf_Die param;
+       if (dwarf_getlocation_die (attr, expr, &param) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_getlocation_die: %s",
+                dwarf_errmsg (-1));
+       // XXX actually lookup DW_TAG_GNU_call_site_parameter
+       printf ("%s[%" PRIx64 "]", opname, dwarf_dieoffset (&param));
+       assert (expr->number == dwarf_cuoffset (&param));
+       assert (dwarf_tag (&param) == DW_TAG_formal_parameter);
+      }
+      break;
+
+    case DW_OP_GNU_convert:
+    case DW_OP_GNU_reinterpret:
+      /* Special, unsigned CU relative DIE offset pointing to a
+        DW_TAG_base_type. Pops a value, converts or reinterprets the
+        value to the given type. When the argument is zero the value
+        becomes untyped again. */
+      {
+       Dwarf_Die type;
+       Dwarf_Off off = expr->number;
+       if (off != 0)
+         {
+           if (dwarf_getlocation_die (attr, expr, &type) != 0)
+             error (EXIT_FAILURE, 0, "dwarf_getlocation_die: %s",
+                    dwarf_errmsg (-1));
+           off = dwarf_dieoffset (&type);
+           assert (expr->number == dwarf_cuoffset (&type));
+           printf ("%s", opname);
+           print_base_type (&type);
+         }
+       else
+         printf ("%s[%" PRIu64 "]", opname, off);
+
+      }
+      break;
+
+    case DW_OP_GNU_regval_type:
+      /* Special, unsigned register number plus unsigned CU relative
+         DIE offset pointing to a DW_TAG_base_type. */
+      {
+       Dwarf_Die type;
+       if (dwarf_getlocation_die (attr, expr, &type) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_getlocation_die: %s",
+                dwarf_errmsg (-1));
+       assert (expr->number2 == dwarf_cuoffset (&type));
+       // XXX check size against base_type size?
+       printf ("%s(reg%" PRIu64 ")", opname, expr->number);
+       print_base_type (&type);
+      }
+      break;
+
+    case DW_OP_GNU_deref_type:
+      /* Special, unsigned size plus unsigned CU relative DIE offset
+        pointing to a DW_TAG_base_type. */ 
+      {
+       Dwarf_Die type;
+       if (dwarf_getlocation_die (attr, expr, &type) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_getlocation_die: %s",
+                dwarf_errmsg (-1));
+       assert (expr->number2 == dwarf_cuoffset (&type));
+       // XXX check size against base_type size?
+       printf ("%s(%" PRIu64 ")", opname, expr->number);
+       print_base_type (&type);
+      }
+      break;
+
+    case DW_OP_GNU_const_type:
+      /* Special, unsigned CU relative DIE offset pointing to a
+        DW_TAG_base_type, an unsigned size length plus a block with
+        the constant value. */
+      {
+       Dwarf_Die type;
+       if (dwarf_getlocation_die (attr, expr, &type) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_getlocation_die: %s",
+                dwarf_errmsg (-1));
+       assert (expr->number == dwarf_cuoffset (&type));
+
+       Dwarf_Attribute const_attr;
+       if (dwarf_getlocation_attr (attr, expr, &const_attr) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_getlocation_attr for type: %s",
+                dwarf_errmsg (-1));
+         
+       Dwarf_Block block;
+       if (dwarf_formblock (&const_attr, &block) != 0)
+         error (EXIT_FAILURE, 0, "dwarf_formblock for type: %s",
+                dwarf_errmsg (-1));
+
+       printf ("%s", opname);
+       print_base_type (&type);
+       printf ("(%" PRIu64 ")[", block.length);
+       for (size_t i = 0; i < block.length; i++)
+         printf ("%02x", block.data[i]);
+       printf("]");
+      }
+      break;
+
+    default:
+      error (EXIT_FAILURE, 0, "unhandled opcode: DW_OP_%s (0x%x)",
+            opname, atom);
+    }
+}
+
+/* Get all variables and print their value expressions. */
+static void
+print_varlocs (Dwarf_Die *funcdie)
+{
+  // Display frame base for function if it exists.
+  // Should be used for DW_OP_fbreg.
+  has_frame_base = dwarf_hasattr (funcdie, DW_AT_frame_base);
+  if (has_frame_base)
+    {
+      Dwarf_Attribute fb_attr;
+      if (dwarf_attr (funcdie, DW_AT_frame_base, &fb_attr) == NULL)
+       error (EXIT_FAILURE, 0, "dwarf_attr fb: %s", dwarf_errmsg (-1));
+
+      Dwarf_Op *fb_expr;
+      size_t fb_exprlen;
+      if (dwarf_getlocation (&fb_attr, &fb_expr, &fb_exprlen) == 0)
+       {
+         // Covers all of function.
+         Dwarf_Addr entrypc;
+         if (dwarf_entrypc (funcdie, &entrypc) != 0)
+           error (EXIT_FAILURE, 0, "dwarf_entrypc: %s", dwarf_errmsg (-1));
+
+         printf ("    frame_base: ");
+         if (entrypc == 0)
+           printf ("XXX zero address"); // XXX bad DWARF?
+         else
+           print_expr_block (&fb_attr, fb_expr, fb_exprlen, entrypc);
+         printf ("\n");
+       }
+      else
+       {
+         Dwarf_Addr base, start, end;
+         ptrdiff_t off = 0;
+         printf ("    frame_base:\n");
+          while ((off = dwarf_getlocations (&fb_attr, off, &base,
+                                           &start, &end,
+                                           &fb_expr, &fb_exprlen)) > 0)
+           {
+             printf ("      (%" PRIx64 ",%" PRIx64 ") ", start, end);
+             print_expr_block (&fb_attr, fb_expr, fb_exprlen, start);
+             printf ("\n");
+           }
+
+         if (off < 0)
+           error (EXIT_FAILURE, 0, "dwarf_getlocations fb: %s",
+                  dwarf_errmsg (-1));
+       }
+    }
+  else if (dwarf_tag (funcdie) == DW_TAG_inlined_subroutine)
+    {
+      // See whether the subprogram we are inlined into has a frame
+      // base we should use.
+      Dwarf_Die *scopes;
+      int n = dwarf_getscopes_die (funcdie, &scopes);
+      if (n <= 0)
+       error (EXIT_FAILURE, 0, "dwarf_getscopes_die: %s", dwarf_errmsg (-1));
+
+      while (n-- > 0)
+       if (dwarf_tag (&scopes[n]) == DW_TAG_subprogram
+           && dwarf_hasattr (&scopes[n], DW_AT_frame_base))
+         {
+           has_frame_base = true;
+           break;
+         }
+      free (scopes);
+    }
+
+  if (! dwarf_haschildren (funcdie))
+    return;
+
+  Dwarf_Die child;
+  int res = dwarf_child (funcdie, &child);
+  if (res < 0)
+    error (EXIT_FAILURE, 0, "dwarf_child: %s", dwarf_errmsg (-1));
+
+  /* We thought there was a child, but the child list was actually
+     empty. This isn't technically an error in the DWARF, but it is
+     certainly non-optimimal.  */
+  if (res == 1)
+    return;
+
+  do
+    {
+      int tag = dwarf_tag (&child);
+      if (tag == DW_TAG_variable || tag == DW_TAG_formal_parameter)
+       {
+         const char *what = tag == DW_TAG_variable ? "variable" : "parameter";
+         print_die (&child, what, 2);
+
+         if (dwarf_hasattr (&child, DW_AT_location))
+           {
+             Dwarf_Attribute attr;
+             if (dwarf_attr (&child, DW_AT_location, &attr) == NULL)
+               error (EXIT_FAILURE, 0, "dwarf_attr: %s", dwarf_errmsg (-1));
+
+             Dwarf_Op *expr;
+             size_t exprlen;
+             if (dwarf_getlocation (&attr, &expr, &exprlen) == 0)
+               {
+                 // Covers all ranges of the function.
+                 // Evaluate the expression block for each range.
+                 ptrdiff_t offset = 0;
+                 Dwarf_Addr base, begin, end;
+                 do
+                   {
+                     offset = dwarf_ranges (funcdie, offset, &base,
+                                            &begin, &end);
+                     if (offset < 0)
+                       error (EXIT_FAILURE, 0, "dwarf_ranges: %s",
+                              dwarf_errmsg (-1));
+
+                     if (offset > 0)
+                       {
+                         if (exprlen == 0)
+                           printf ("      (%"
+                                   PRIx64 ",%" PRIx64
+                                   ") <empty expression>\n", begin, end);
+                         else
+                           print_expr_block_addrs (&attr, begin, end,
+                                                   expr, exprlen);
+                       }
+                   }
+                 while (offset > 0);
+
+                 if (offset < 0)
+                   error (EXIT_FAILURE, 0, "dwarf_ranges: %s",
+                          dwarf_errmsg (-1));
+               }
+             else
+               {
+                 Dwarf_Addr base, begin, end;
+                 ptrdiff_t offset = 0;
+                 while ((offset = dwarf_getlocations (&attr, offset,
+                                                      &base, &begin, &end,
+                                                      &expr, &exprlen)) > 0)
+                   if (begin >= end)
+                     printf ("      (%" PRIx64 ",%" PRIx64
+                             ") <empty range>\n", begin, end); // XXX report?
+                   else
+                     {
+                       print_expr_block_addrs (&attr, begin, end,
+                                               expr, exprlen);
+
+                       // Extra sanity check for dwarf_getlocation_addr
+                       // Must at least find one range for begin and end-1.
+                       Dwarf_Op *expraddr;
+                       size_t expraddr_len;
+                       int locs = dwarf_getlocation_addr (&attr, begin,
+                                                          &expraddr,
+                                                          &expraddr_len, 1);
+                       assert (locs == 1);
+                       locs = dwarf_getlocation_addr (&attr, end - 1,
+                                                      &expraddr,
+                                                      &expraddr_len, 1);
+                       assert (locs == 1);
+                     }
+
+                 if (offset < 0)
+                   error (EXIT_FAILURE, 0, "dwarf_getlocations: %s",
+                          dwarf_errmsg (-1));
+               }
+           }
+         else if (dwarf_hasattr (&child, DW_AT_const_value))
+           {
+             printf ("      <constant value>\n"); // Lookup type and print.
+           }
+         else
+           {
+             printf ("      <no value>\n");
+           }
+       }
+    }
+  while (dwarf_siblingof (&child, &child) == 0);
+}
+
+static int
+handle_instance (Dwarf_Die *funcdie, void *arg __attribute__ ((unused)))
+{
+  print_die (funcdie, "inlined function", 1);
+  print_varlocs (funcdie);
+
+  return DWARF_CB_OK;
+}
+
+static int
+handle_function (Dwarf_Die *funcdie, void *arg __attribute__((unused)))
+{
+  if (dwarf_func_inline (funcdie) > 0)
+    {
+      // abstract inline definition, find all inlined instances.
+
+      // Note this is convenient for listing all instances together
+      // so you can easily compare the location expressions describing
+      // the variables and parameters, but it isn't very efficient
+      // since it will walk the DIE tree multiple times.
+      if (dwarf_func_inline_instances (funcdie, &handle_instance, NULL) != 0)
+       error (EXIT_FAILURE, 0, "dwarf_func_inline_instances: %s",
+              dwarf_errmsg (-1));
+    }
+  else
+    {
+      // Contains actual code, not just a declaration?
+      Dwarf_Addr entrypc;
+      if (dwarf_entrypc (funcdie, &entrypc) == 0)
+       {
+         print_die (funcdie, "function", 1);
+         print_varlocs (funcdie);
+       }
+    }
+
+  return DWARF_CB_OK;
+}
+
+int
+main (int argc, char *argv[])
+{
+  int remaining;
+  Dwfl *dwfl;
+  (void) argp_parse (dwfl_standard_argp (), argc, argv, 0, &remaining,
+                     &dwfl);
+  assert (dwfl != NULL);
+
+  Dwarf_Die *cu = NULL;
+  Dwarf_Addr dwbias;
+  while ((cu = dwfl_nextcu (dwfl, cu, &dwbias)) != NULL)
+    {
+      /* Only walk actual compile units (not partial units) that
+        contain code.  */
+      Dwarf_Addr cubase;
+      if (dwarf_tag (cu) == DW_TAG_compile_unit
+         && dwarf_lowpc (cu, &cubase) == 0)
+       {
+         Dwfl_Module *mod = dwfl_cumodule (cu);
+         Dwarf_Addr modbias;
+         dw = dwfl_module_getdwarf (mod, &modbias);
+         assert (dwbias == modbias);
+
+         const char *mainfile;
+         const char *modname = dwfl_module_info (mod, NULL,
+                                                 NULL, NULL,
+                                                 NULL, NULL,
+                                                 &mainfile,
+                                                 NULL);
+         if (modname == NULL)
+           error (EXIT_FAILURE, 0, "dwfl_module_info: %s", dwarf_errmsg (-1));
+
+         const char *name = (modname[0] != '\0'
+                             ? modname
+                             :  basename (mainfile));
+         printf ("module '%s'\n", name);
+         print_die (cu, "CU", 0);
+
+         Dwarf_Addr elfbias;
+         Elf *elf = dwfl_module_getelf (mod, &elfbias);
+
+         // CFI. We need both since sometimes neither is complete.
+         cfi_debug = dwarf_getcfi (dw); // No bias needed, same file.
+         cfi_eh = dwarf_getcfi_elf (elf);
+         cfi_eh_bias = dwbias - elfbias;
+
+         // Get the actual CU DIE and walk all functions inside it.
+         Dwarf_Die cudie;
+         uint8_t offsize;
+         uint8_t addrsize;
+         if (dwarf_diecu (cu, &cudie, &addrsize, &offsize) == NULL)
+           error (EXIT_FAILURE, 0, "dwarf_diecu %s", dwarf_errmsg (-1));
+
+         if (dwarf_getfuncs (cu, handle_function, NULL, 0) != 0)
+           error (EXIT_FAILURE, 0, "dwarf_getfuncs %s",
+                  dwarf_errmsg (-1));
+       }
+    }
+
+  dwfl_end (dwfl);
+  return 0;
+}
index fa3a5c0..a7f509d 100644 (file)
--- a/version.h
+++ b/version.h
@@ -30,7 +30,7 @@
 #ifndef _ELFUTILS_VERSION_H
 #define _ELFUTILS_VERSION_H    1
 
-#define _ELFUTILS_VERSION      155
+#define _ELFUTILS_VERSION      160
 
 #define _ELFUTILS_PREREQ(major, minor) \
   (_ELFUTILS_VERSION >= ((major) * 1000 + (minor)))