summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland McGrath <roland@redhat.com>2010-05-20 17:04:15 -0700
committerRoland McGrath <roland@redhat.com>2010-05-20 17:04:15 -0700
commit844f20f64770e9ed4177aa7285c9b96a11ec7547 (patch)
tree38c73449e465eade3d36f891b9c5db2bee0e4c3b
parentfb65cc365e5d51f2434128467dab554f6921727b (diff)
parenta0635db0fbe13ad7b531ee99eeb063a8eded923c (diff)
downloadelfutils-844f20f64770e9ed4177aa7285c9b96a11ec7547.tar.gz
Merge branch 'master' into roland/notes
Conflicts: libdw/libdw.map libdwfl/Makefile.am libdwfl/argp-std.c libdwfl/core-file.c libdwfl/libdwfl.h libdwfl/libdwflP.h libdwfl/linux-proc-maps.c libelf/Makefile.am libelf/common.h libelf/elf_begin.c libelf/elf_readall.c libelf/libelf.map libelf/libelfP.h tests/Makefile.am
-rw-r--r--.gitignore31
-rw-r--r--ABOUT-NLS1165
-rw-r--r--AUTHORS2
-rw-r--r--ChangeLog76
-rw-r--r--Makefile.am6
-rw-r--r--NEWS164
-rw-r--r--README6
-rw-r--r--THANKS2
-rw-r--r--TODO40
-rw-r--r--backends/ChangeLog193
-rw-r--r--backends/Makefile.am78
-rw-r--r--backends/alpha_auxv.c46
-rw-r--r--backends/alpha_init.c4
-rw-r--r--backends/alpha_symbol.c46
-rw-r--r--backends/arm_attrs.c242
-rw-r--r--backends/arm_auxv.c46
-rw-r--r--backends/arm_corenote.c73
-rw-r--r--backends/arm_init.c10
-rw-r--r--backends/arm_regs.c117
-rw-r--r--backends/arm_reloc.def6
-rw-r--r--backends/arm_retval.c137
-rw-r--r--backends/arm_symbol.c73
-rw-r--r--backends/i386_cfi.c65
-rw-r--r--backends/i386_corenote.c33
-rw-r--r--backends/i386_init.c5
-rw-r--r--backends/i386_reloc.def6
-rw-r--r--backends/i386_syscall.c47
-rw-r--r--backends/ia64_retval.c36
-rw-r--r--backends/ia64_symbol.c6
-rw-r--r--backends/linux-core-note.c62
-rw-r--r--backends/ppc64_init.c3
-rw-r--r--backends/ppc64_retval.c27
-rw-r--r--backends/ppc_attrs.c86
-rw-r--r--backends/ppc_corenote.c22
-rw-r--r--backends/ppc_init.c4
-rw-r--r--backends/ppc_regs.c9
-rw-r--r--backends/ppc_retval.c46
-rw-r--r--backends/ppc_syscall.c50
-rw-r--r--backends/sh_corenote.c85
-rw-r--r--backends/sh_init.c5
-rw-r--r--backends/sh_regs.c188
-rw-r--r--backends/sh_retval.c139
-rw-r--r--backends/sh_symbol.c35
-rw-r--r--backends/sparc_init.c6
-rw-r--r--backends/sparc_reloc.def164
-rw-r--r--backends/sparc_retval.c37
-rw-r--r--backends/sparc_symbol.c79
-rw-r--r--backends/x86_64_cfi.c60
-rw-r--r--backends/x86_64_corenote.c5
-rw-r--r--backends/x86_64_init.c5
-rw-r--r--backends/x86_64_reloc.def11
-rw-r--r--backends/x86_64_retval.c7
-rw-r--r--backends/x86_64_syscall.c47
-rw-r--r--backends/x86_corenote.c48
-rw-r--r--config/ChangeLog48
-rw-r--r--config/Makefile.am23
-rw-r--r--config/elfutils.spec.in131
-rw-r--r--config/eu.am60
-rw-r--r--config/known-dwarf.awk55
-rw-r--r--config/version.h.in58
-rw-r--r--configure.ac212
-rw-r--r--lib/ChangeLog48
-rw-r--r--lib/Makefile.am18
-rw-r--r--lib/eu-config.h203
-rw-r--r--lib/md5.c446
-rw-r--r--lib/md5.h107
-rw-r--r--lib/sha1.c386
-rw-r--r--lib/sha1.h90
-rw-r--r--lib/system.h14
-rw-r--r--libasm/ChangeLog35
-rw-r--r--libasm/Makefile.am40
-rw-r--r--libasm/asm_error.c113
-rw-r--r--libasm/disasm_begin.c61
-rw-r--r--libasm/disasm_cb.c176
-rw-r--r--libasm/disasm_end.c42
-rw-r--r--libasm/disasm_str.c69
-rw-r--r--libasm/libasm.h35
-rw-r--r--libasm/libasm.map5
-rw-r--r--libasm/libasmP.h24
-rw-r--r--libcpu/ChangeLog340
-rw-r--r--libcpu/Makefile.am51
-rw-r--r--libcpu/defs/i386970
-rw-r--r--libcpu/defs/i386.doc74
-rw-r--r--libcpu/i386_data.h1415
-rw-r--r--libcpu/i386_dis.c1
-rw-r--r--libcpu/i386_disasm.c1054
-rw-r--r--libcpu/i386_gendis.c69
-rw-r--r--libcpu/i386_lex.l126
-rw-r--r--libcpu/i386_parse.y1684
-rw-r--r--libcpu/memory-access.h179
-rw-r--r--libcpu/x86_64_disasm.c31
-rw-r--r--libdw/ChangeLog434
-rw-r--r--libdw/Makefile.am53
-rw-r--r--libdw/cfi.c505
-rw-r--r--libdw/cfi.h253
-rw-r--r--libdw/cie.c193
-rw-r--r--libdw/dwarf.h124
-rw-r--r--libdw/dwarf_aggregate_size.c243
-rw-r--r--libdw/dwarf_arrayorder.c8
-rw-r--r--libdw/dwarf_begin_elf.c3
-rw-r--r--libdw/dwarf_bitoffset.c8
-rw-r--r--libdw/dwarf_bitsize.c8
-rw-r--r--libdw/dwarf_bytesize.c8
-rw-r--r--libdw/dwarf_cfi_addrframe.c78
-rw-r--r--libdw/dwarf_cfi_end.c70
-rw-r--r--libdw/dwarf_child.c18
-rw-r--r--libdw/dwarf_decl_column.c4
-rw-r--r--libdw/dwarf_decl_file.c9
-rw-r--r--libdw/dwarf_decl_line.c9
-rw-r--r--libdw/dwarf_diecu.c5
-rw-r--r--libdw/dwarf_end.c8
-rw-r--r--libdw/dwarf_entry_breakpoints.c11
-rw-r--r--libdw/dwarf_error.c84
-rw-r--r--libdw/dwarf_formaddr.c8
-rw-r--r--libdw/dwarf_formflag.c8
-rw-r--r--libdw/dwarf_formref.c8
-rw-r--r--libdw/dwarf_formref_die.c7
-rw-r--r--libdw/dwarf_formstring.c12
-rw-r--r--libdw/dwarf_formudata.c65
-rw-r--r--libdw/dwarf_frame_cfa.c101
-rw-r--r--libdw/dwarf_frame_info.c74
-rw-r--r--libdw/dwarf_frame_register.c142
-rw-r--r--libdw/dwarf_getaranges.c48
-rw-r--r--libdw/dwarf_getattrs.c48
-rw-r--r--libdw/dwarf_getcfi.c94
-rw-r--r--libdw/dwarf_getcfi_elf.c336
-rw-r--r--libdw/dwarf_getlocation.c346
-rw-r--r--libdw/dwarf_getmacros.c46
-rw-r--r--libdw/dwarf_getpubnames.c31
-rw-r--r--libdw/dwarf_getscopevar.c6
-rw-r--r--libdw/dwarf_getsrc_file.c19
-rw-r--r--libdw/dwarf_getsrclines.c36
-rw-r--r--libdw/dwarf_hasattr_integrate.c2
-rw-r--r--libdw/dwarf_haschildren.c10
-rw-r--r--libdw/dwarf_next_cfi.c234
-rw-r--r--libdw/dwarf_nextcu.c46
-rw-r--r--libdw/dwarf_ranges.c108
-rw-r--r--libdw/dwarf_siblingof.c20
-rw-r--r--libdw/dwarf_srclang.c9
-rw-r--r--libdw/dwarf_tag.c7
-rw-r--r--libdw/encoded-value.h202
-rw-r--r--libdw/fde.c306
-rw-r--r--libdw/frame-cache.c87
-rw-r--r--libdw/libdw.h188
-rw-r--r--libdw/libdw.map68
-rw-r--r--libdw/libdwP.h244
-rw-r--r--libdw/libdw_form.c9
-rw-r--r--libdw/memory-access.h61
-rw-r--r--libdwarf/ChangeLog4
-rw-r--r--libdwarf/libdwarf.h2
-rw-r--r--libdwfl/ChangeLog517
-rw-r--r--libdwfl/Makefile.am50
-rw-r--r--libdwfl/argp-std.c21
-rw-r--r--libdwfl/bzip2.c4
-rw-r--r--libdwfl/core-file.c1085
-rw-r--r--libdwfl/derelocate.c29
-rw-r--r--libdwfl/dwfl_addrmodule.c32
-rw-r--r--libdwfl/dwfl_build_id_find_debuginfo.c22
-rw-r--r--libdwfl/dwfl_build_id_find_elf.c35
-rw-r--r--libdwfl/dwfl_end.c22
-rw-r--r--libdwfl/dwfl_error.c88
-rw-r--r--libdwfl/dwfl_getdwarf.c38
-rw-r--r--libdwfl/dwfl_getmodules.c54
-rw-r--r--libdwfl/dwfl_module.c77
-rw-r--r--libdwfl/dwfl_module_addrsym.c47
-rw-r--r--libdwfl/dwfl_module_build_id.c43
-rw-r--r--libdwfl/dwfl_module_dwarf_cfi.c92
-rw-r--r--libdwfl/dwfl_module_eh_cfi.c78
-rw-r--r--libdwfl/dwfl_module_getdwarf.c178
-rw-r--r--libdwfl/dwfl_module_getelf.c88
-rw-r--r--libdwfl/dwfl_module_getsrc.c5
-rw-r--r--libdwfl/dwfl_module_getsym.c26
-rw-r--r--libdwfl/dwfl_module_report_build_id.c5
-rw-r--r--libdwfl/dwfl_report_elf.c32
-rw-r--r--libdwfl/dwfl_segment_report_module.c669
-rw-r--r--libdwfl/find-debuginfo.c40
-rw-r--r--libdwfl/gzip.c316
-rw-r--r--libdwfl/image-header.c124
-rw-r--r--libdwfl/libdwfl.h75
-rw-r--r--libdwfl/libdwflP.h142
-rw-r--r--libdwfl/link_map.c890
-rw-r--r--libdwfl/linux-kernel-modules.c149
-rw-r--r--libdwfl/linux-proc-maps.c29
-rw-r--r--libdwfl/lzma.c4
-rw-r--r--libdwfl/offline.c27
-rw-r--r--libdwfl/open.c203
-rw-r--r--libdwfl/relocate.c71
-rw-r--r--libdwfl/segment.c350
-rw-r--r--libebl/ChangeLog119
-rw-r--r--libebl/Makefile.am31
-rw-r--r--libebl/ebl-hooks.h27
-rw-r--r--libebl/ebl_check_special_section.c65
-rw-r--r--libebl/ebl_syscall_abi.c66
-rw-r--r--libebl/eblabicfi.c63
-rw-r--r--libebl/eblauxvinfo.c9
-rw-r--r--libebl/eblcheckobjattr.c81
-rw-r--r--libebl/eblcorenote.c14
-rw-r--r--libebl/eblcorenotetypename.c6
-rw-r--r--libebl/ebldynamictagname.c4
-rw-r--r--libebl/eblobjnote.c9
-rw-r--r--libebl/eblobjnotetypename.c3
-rw-r--r--libebl/eblopenbackend.c67
-rw-r--r--libebl/eblreloctypename.c4
-rw-r--r--libebl/eblsectiontypename.c51
-rw-r--r--libebl/eblstrtab.c22
-rw-r--r--libebl/eblsymbolbindingname.c8
-rw-r--r--libebl/eblsymboltypename.c8
-rw-r--r--libebl/libebl.h64
-rw-r--r--libebl/libeblP.h9
-rw-r--r--libelf/ChangeLog340
-rw-r--r--libelf/Makefile.am41
-rw-r--r--libelf/common.h7
-rw-r--r--libelf/elf.h231
-rw-r--r--libelf/elf32_checksum.c27
-rw-r--r--libelf/elf32_getehdr.c46
-rw-r--r--libelf/elf32_getphdr.c55
-rw-r--r--libelf/elf32_getshdr.c331
-rw-r--r--libelf/elf32_newphdr.c32
-rw-r--r--libelf/elf32_offscn.c12
-rw-r--r--libelf/elf32_updatefile.c215
-rw-r--r--libelf/elf32_updatenull.c30
-rw-r--r--libelf/elf_begin.c259
-rw-r--r--libelf/elf_error.c87
-rw-r--r--libelf/elf_getarhdr.c17
-rw-r--r--libelf/elf_getaroff.c4
-rw-r--r--libelf/elf_getdata.c94
-rw-r--r--libelf/elf_getdata_rawchunk.c15
-rw-r--r--libelf/elf_getphdrnum.c116
-rw-r--r--libelf/elf_getshdrnum.c (renamed from libelf/elf_getshnum.c)24
-rw-r--r--libelf/elf_getshdrstrndx.c (renamed from libelf/elf_getshstrndx.c)8
-rw-r--r--libelf/elf_next.c16
-rw-r--r--libelf/elf_rand.c6
-rw-r--r--libelf/elf_rawfile.c8
-rw-r--r--libelf/elf_readall.c24
-rw-r--r--libelf/elf_scnshndx.c71
-rw-r--r--libelf/elf_strptr.c39
-rw-r--r--libelf/elf_update.c4
-rw-r--r--libelf/gelf_getehdr.c19
-rw-r--r--libelf/gelf_getphdr.c23
-rw-r--r--libelf/gelf_getshdr.c6
-rw-r--r--libelf/gelf_update_phdr.c18
-rw-r--r--libelf/gelf_update_shdr.c6
-rw-r--r--libelf/libelf.h38
-rw-r--r--libelf/libelf.map20
-rw-r--r--libelf/libelfP.h107
-rw-r--r--libelf/note_xlate.h4
-rw-r--r--m4/ChangeLog19
-rw-r--r--m4/Makefile.am4
-rw-r--r--m4/gettext.m442
-rw-r--r--m4/iconv.m487
-rw-r--r--m4/po.m425
-rw-r--r--m4/zip.m418
-rw-r--r--po/ChangeLog18
-rw-r--r--po/LINGUAS5
-rw-r--r--po/Makefile.in.in42
-rw-r--r--po/Makevars2
-rw-r--r--po/POTFILES.in39
-rw-r--r--po/de.po5706
-rw-r--r--po/es.po6026
-rw-r--r--po/fr.po5665
-rw-r--r--po/it.po5666
-rw-r--r--po/ja.po5945
-rw-r--r--po/nl.po5666
-rw-r--r--po/pl.po6151
-rw-r--r--po/ru.po5665
-rw-r--r--po/uk.po6279
-rw-r--r--po/zh_CN.po5666
-rw-r--r--src/ChangeLog685
-rw-r--r--src/Makefile.am58
-rw-r--r--src/addr2line.c218
-rw-r--r--src/ar.c74
-rw-r--r--src/debugpred.h53
-rw-r--r--src/elf32-i386.script36
-rw-r--r--src/elfcmp.c87
-rw-r--r--src/elflint.c568
-rw-r--r--src/findtextrel.c13
-rw-r--r--src/i386_ld.c462
-rw-r--r--src/ld.c110
-rw-r--r--src/ld.h54
-rw-r--r--src/ldgeneric.c1010
-rw-r--r--src/ldlex.l4
-rw-r--r--src/ldscript.y6
-rw-r--r--src/nm.c61
-rw-r--r--src/objdump.c282
-rw-r--r--src/ranlib.c11
-rw-r--r--src/readelf.c2365
-rw-r--r--src/size.c30
-rw-r--r--src/strings.c17
-rw-r--r--src/strip.c594
-rw-r--r--src/unaligned.h8
-rw-r--r--src/unstrip.c23
-rw-r--r--tests/ChangeLog252
-rw-r--r--tests/Makefile.am63
-rw-r--r--tests/addrcfi.c207
-rw-r--r--tests/asm-tst9.c12
-rw-r--r--tests/dwarf-getmacros.c64
-rw-r--r--tests/dwfl-bug-fd-leak.c4
-rw-r--r--tests/dwfl-bug-getmodules.c74
-rw-r--r--tests/early-offscn.c60
-rw-r--r--tests/line2addr.c2
-rw-r--r--tests/msg_tst.c2
-rwxr-xr-xtests/run-addrname-test.sh161
-rwxr-xr-xtests/run-allregs.sh4
-rwxr-xr-xtests/run-disasm-x86-64.sh36
-rwxr-xr-xtests/run-disasm-x86.sh36
-rwxr-xr-xtests/run-dwarf-getmacros.sh296
-rwxr-xr-xtests/run-dwfl-addr-sect.sh9
-rwxr-xr-xtests/run-early-offscn.sh32
-rwxr-xr-xtests/run-elflint-test.sh5
-rwxr-xr-xtests/run-strings-test.sh5
-rwxr-xr-xtests/run-strip-test.sh9
-rwxr-xr-xtests/run-strip-test8.sh5
-rwxr-xr-xtests/run-test-flag-nobits.sh30
-rw-r--r--tests/sha1-tst.c79
-rw-r--r--tests/test-flag-nobits.c43
-rw-r--r--tests/test-subr.sh5
-rw-r--r--tests/testfile16.bz2bin8424 -> 8413 bytes
-rw-r--r--tests/testfile16.debug.bz2bin23520 -> 24257 bytes
-rw-r--r--tests/testfile44.S.bz2bin0 -> 18296 bytes
-rw-r--r--tests/testfile44.expect.bz2bin0 -> 60096 bytes
-rw-r--r--tests/testfile45.S.bz2bin0 -> 24742 bytes
-rw-r--r--tests/testfile45.expect.bz2bin0 -> 82002 bytes
-rw-r--r--tests/testfile46.bz2bin0 -> 322 bytes
-rw-r--r--tests/testfile47.bz2bin0 -> 793 bytes
-rw-r--r--tests/testfile48.bz2bin0 -> 408 bytes
-rw-r--r--tests/testfile48.debug.bz2bin0 -> 758 bytes
-rw-r--r--tests/testfile49.bz2bin0 -> 337 bytes
-rw-r--r--tests/testfile50.bz2bin0 -> 229 bytes
-rwxr-xr-xtests/testfile51.bz2bin0 -> 4294 bytes
329 files changed, 88470 insertions, 5139 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..cc1bae8e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,31 @@
+*~
+#*
+*#
+.#*
+=*
+.glimpse_*
+autom4te.*
+*.o
+*.so
+*.a
+*.orig
+*.patch
+*.rej
+Makefile.in
+*/Makefile.in
+aclocal.m4
+INSTALL
+config.h.in
+config/config.guess
+config/config.sub
+config/depcomp
+config/install-sh
+config/missing
+config/ylwrap
+configure
+elfutils.spec
+*.pot
+*.gmo
+po/en@boldquot.po
+po/en@quot.po
+libdw/known-dwarf.h
diff --git a/ABOUT-NLS b/ABOUT-NLS
index ec20977e..83bc72ec 100644
--- a/ABOUT-NLS
+++ b/ABOUT-NLS
@@ -101,8 +101,11 @@ codes, stating which languages are allowed.
As a user, if your language has been installed for this package, you
only have to set the `LANG' environment variable to the appropriate
-`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code,
-and `CC' is an ISO 3166 two-letter country code. For example, let's
+`LL_CC' combination. If you happen to have the `LC_ALL' or some other
+`LC_xxx' environment variables set, you should unset them before
+setting `LANG', otherwise the setting of `LANG' will not have the
+desired effect. Here `LL' is an ISO 639 two-letter language code, and
+`CC' is an ISO 3166 two-letter country code. For example, let's
suppose that you speak German and live in Germany. At the shell
prompt, merely execute `setenv LANG de_DE' (in `csh'),
`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash').
@@ -153,8 +156,7 @@ people who like their own language and write it well, and who are also
able to synergize with other translators speaking the same language.
Each translation team has its own mailing list. The up-to-date list of
teams can be found at the Free Translation Project's homepage,
-`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams"
-area.
+`http://translationproject.org/', in the "Teams" area.
If you'd like to volunteer to _work_ at translating messages, you
should become a member of the translating team for your own language.
@@ -168,8 +170,8 @@ message to `sv-request@li.org', having this message body:
_actively_ in translations, or at solving translational difficulties,
rather than merely lurking around. If your team does not exist yet and
you want to start one, or if you are unsure about what to do or how to
-get started, please write to `translation@iro.umontreal.ca' to reach the
-coordinator for all translator teams.
+get started, please write to `coordinator@translationproject.org' to
+reach the coordinator for all translator teams.
The English team is special. It works at improving and uniformizing
the terminology in use. Proven linguistic skills are praised more than
@@ -179,67 +181,62 @@ programming skills, here.
======================
Languages are not equally supported in all packages. The following
-matrix shows the current state of internationalization, as of October
-2006. The matrix shows, in regard of each package, for which languages
+matrix shows the current state of internationalization, as of November
+2007. The matrix shows, in regard of each package, for which languages
PO files have been submitted to translation coordination, with a
translation percentage of at least 50%.
Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo
+----------------------------------------------------+
- GNUnet | [] |
+ Compendium | [] [] [] [] |
a2ps | [] [] [] [] [] |
aegis | () |
ant-phone | () |
anubis | [] |
ap-utils | |
aspell | [] [] [] [] [] |
- bash | [] [] [] |
- batchelor | [] |
+ bash | [] |
bfd | |
bibshelf | [] |
- binutils | [] |
+ binutils | |
bison | [] [] |
- bison-runtime | |
+ bison-runtime | [] |
bluez-pin | [] [] [] [] [] |
cflow | [] |
- clisp | [] [] |
+ clisp | [] [] [] |
console-tools | [] [] |
- coreutils | [] [] [] |
+ coreutils | [] [] [] [] |
cpio | |
cpplib | [] [] [] |
cryptonit | [] |
- darkstat | [] () [] |
- dialog | [] [] [] [] [] [] |
+ dialog | |
diffutils | [] [] [] [] [] [] |
doodle | [] |
e2fsprogs | [] [] |
enscript | [] [] [] [] |
- error | [] [] [] [] |
- fetchmail | [] [] () [] |
- fileutils | [] [] |
- findutils | [] [] [] |
+ fetchmail | [] [] () [] [] |
+ findutils | [] |
+ findutils_stable | [] [] [] |
flex | [] [] [] |
- fslint | [] |
+ fslint | |
gas | |
gawk | [] [] [] |
- gbiff | [] |
gcal | [] |
gcc | [] |
gettext-examples | [] [] [] [] [] |
gettext-runtime | [] [] [] [] [] |
gettext-tools | [] [] |
- gimp-print | [] [] [] [] |
gip | [] |
- gliv | [] |
+ gliv | [] [] |
glunarclock | [] |
gmult | [] [] |
gnubiff | () |
- gnucash | () () [] |
- gnucash-glossary | [] () |
+ gnucash | [] [] () () [] |
gnuedu | |
- gnulib | [] [] [] [] [] [] |
+ gnulib | [] |
+ gnunet | |
gnunet-gtk | |
- gnutls | |
+ gnutls | [] |
gpe-aerial | [] [] |
gpe-beam | [] [] |
gpe-calendar | |
@@ -260,40 +257,43 @@ translation percentage of at least 50%.
gpe-todo | |
gphoto2 | [] [] [] [] |
gprof | [] [] |
- gpsdrive | () () |
+ gpsdrive | |
gramadoir | [] [] |
- grep | [] [] [] [] [] [] |
- gretl | |
+ grep | [] [] |
+ gretl | () |
gsasl | |
gss | |
- gst-plugins | [] [] [] [] |
- gst-plugins-base | [] [] [] |
- gst-plugins-good | [] [] [] [] [] [] [] |
+ gst-plugins-bad | [] [] |
+ gst-plugins-base | [] [] |
+ gst-plugins-good | [] [] [] |
+ gst-plugins-ugly | [] [] |
gstreamer | [] [] [] [] [] [] [] |
gtick | () |
- gtkam | [] [] [] |
+ gtkam | [] [] [] [] |
gtkorphan | [] [] |
gtkspell | [] [] [] [] |
gutenprint | [] |
hello | [] [] [] [] [] |
- id-utils | [] [] |
- impost | |
- indent | [] [] [] |
- iso_3166 | [] [] |
+ herrie | [] |
+ hylafax | |
+ idutils | [] [] |
+ indent | [] [] [] [] |
+ iso_15924 | |
+ iso_3166 | [] [] [] [] [] [] [] [] [] [] [] |
iso_3166_2 | |
- iso_4217 | [] |
- iso_639 | [] [] |
+ iso_4217 | [] [] [] |
+ iso_639 | [] [] [] [] |
jpilot | [] |
jtag | |
jwhois | |
kbd | [] [] [] [] |
- keytouch | |
- keytouch-editor | |
- keytouch-keyboa... | |
+ keytouch | [] [] |
+ keytouch-editor | [] |
+ keytouch-keyboa... | [] |
latrine | () |
ld | [] |
leafpad | [] [] [] [] [] |
- libc | [] [] [] [] [] |
+ libc | [] [] [] [] |
libexif | [] |
libextractor | [] |
libgpewidget | [] [] [] |
@@ -302,76 +302,70 @@ translation percentage of at least 50%.
libgphoto2_port | [] [] |
libgsasl | |
libiconv | [] [] |
- libidn | [] [] |
+ libidn | [] [] [] |
lifelines | [] () |
lilypond | [] |
lingoteach | |
+ lprng | |
lynx | [] [] [] [] |
m4 | [] [] [] [] |
+ mailfromd | |
mailutils | [] |
make | [] [] |
- man-db | [] () [] [] |
+ man-db | [] [] [] |
minicom | [] [] [] |
- mysecretdiary | [] [] |
nano | [] [] [] |
- nano_1_0 | [] () [] [] |
opcodes | [] |
- parted | |
- pilot-qof | [] |
+ parted | [] [] |
+ pilot-qof | |
+ popt | [] [] [] |
psmisc | [] |
pwdutils | |
- python | |
qof | |
radius | [] |
recode | [] [] [] [] [] [] |
- rpm | [] [] |
+ rpm | [] |
screem | |
scrollkeeper | [] [] [] [] [] [] [] [] |
sed | [] [] [] |
- sh-utils | [] [] |
- shared-mime-info | [] [] [] [] |
+ shared-mime-info | [] [] [] [] () [] [] [] |
sharutils | [] [] [] [] [] [] |
shishi | |
- silky | |
skencil | [] () |
- sketch | [] () |
solfege | |
soundtracker | [] [] |
sp | [] |
- stardict | [] |
system-tools-ba... | [] [] [] [] [] [] [] [] [] |
- tar | [] |
+ tar | [] [] |
texinfo | [] [] [] |
- textutils | [] [] [] |
tin | () () |
- tp-robot | [] |
- tuxpaint | [] [] [] [] [] |
+ tuxpaint | [] [] [] [] [] [] |
unicode-han-tra... | |
unicode-transla... | |
util-linux | [] [] [] [] |
- vorbis-tools | [] [] [] [] |
+ util-linux-ng | [] [] [] [] |
+ vorbis-tools | [] |
wastesedge | () |
wdiff | [] [] [] [] |
- wget | [] [] |
- xchat | [] [] [] [] [] [] |
- xkeyboard-config | |
- xpad | [] [] |
+ wget | [] [] [] |
+ xchat | [] [] [] [] [] [] [] |
+ xkeyboard-config | [] |
+ xpad | [] [] [] |
+----------------------------------------------------+
af am ar az be bg bs ca cs cy da de el en en_GB eo
- 10 0 1 2 9 22 1 42 41 2 60 95 16 1 17 16
+ 6 0 2 1 8 26 2 40 48 2 56 88 15 1 15 18
es et eu fa fi fr ga gl gu he hi hr hu id is it
+--------------------------------------------------+
- GNUnet | |
+ Compendium | [] [] [] [] [] |
a2ps | [] [] [] () |
aegis | |
ant-phone | [] |
anubis | [] |
ap-utils | [] [] |
aspell | [] [] [] |
- bash | [] [] [] |
- batchelor | [] [] |
- bfd | [] |
+ bash | [] |
+ bfd | [] [] |
bibshelf | [] [] [] |
binutils | [] [] [] |
bison | [] [] [] [] [] [] |
@@ -384,36 +378,32 @@ translation percentage of at least 50%.
cpio | [] [] [] |
cpplib | [] [] |
cryptonit | [] |
- darkstat | [] () [] [] [] |
- dialog | [] [] [] [] [] [] [] [] |
+ dialog | [] [] [] |
diffutils | [] [] [] [] [] [] [] [] [] |
doodle | [] [] |
e2fsprogs | [] [] [] |
enscript | [] [] [] |
- error | [] [] [] [] [] |
fetchmail | [] |
- fileutils | [] [] [] [] [] [] |
- findutils | [] [] [] [] |
+ findutils | [] [] [] |
+ findutils_stable | [] [] [] [] |
flex | [] [] [] |
- fslint | [] |
+ fslint | |
gas | [] [] |
- gawk | [] [] [] [] |
- gbiff | [] |
+ gawk | [] [] [] [] () |
gcal | [] [] |
gcc | [] |
- gettext-examples | [] [] [] [] [] [] |
+ gettext-examples | [] [] [] [] [] [] [] |
gettext-runtime | [] [] [] [] [] [] |
- gettext-tools | [] [] [] |
- gimp-print | [] [] |
- gip | [] [] [] |
+ gettext-tools | [] [] [] [] |
+ gip | [] [] [] [] |
gliv | () |
glunarclock | [] [] [] |
gmult | [] [] [] |
gnubiff | () () |
gnucash | () () () |
- gnucash-glossary | [] [] |
gnuedu | [] |
- gnulib | [] [] [] [] [] [] [] [] |
+ gnulib | [] [] [] |
+ gnunet | |
gnunet-gtk | |
gnutls | |
gpe-aerial | [] [] |
@@ -435,68 +425,71 @@ translation percentage of at least 50%.
gpe-today | [] [] [] [] |
gpe-todo | [] |
gphoto2 | [] [] [] [] [] |
- gprof | [] [] [] [] |
- gpsdrive | () () [] () |
+ gprof | [] [] [] [] [] |
+ gpsdrive | [] |
gramadoir | [] [] |
- grep | [] [] [] [] [] [] [] [] [] [] [] [] |
- gretl | [] [] [] |
+ grep | [] [] [] |
+ gretl | [] [] [] () |
gsasl | [] [] |
- gss | [] |
- gst-plugins | [] [] [] |
- gst-plugins-base | [] [] |
- gst-plugins-good | [] [] [] |
+ gss | [] [] |
+ gst-plugins-bad | [] [] [] [] |
+ gst-plugins-base | [] [] [] [] |
+ gst-plugins-good | [] [] [] [] [] |
+ gst-plugins-ugly | [] [] [] [] |
gstreamer | [] [] [] |
- gtick | [] |
+ gtick | [] [] [] |
gtkam | [] [] [] [] |
gtkorphan | [] [] |
- gtkspell | [] [] [] [] [] [] |
+ gtkspell | [] [] [] [] [] [] [] |
gutenprint | [] |
hello | [] [] [] [] [] [] [] [] [] [] [] [] [] |
- id-utils | [] [] [] [] [] |
- impost | [] [] |
+ herrie | [] |
+ hylafax | |
+ idutils | [] [] [] [] [] |
indent | [] [] [] [] [] [] [] [] [] [] |
- iso_3166 | [] [] [] |
+ iso_15924 | [] |
+ iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] |
iso_3166_2 | [] |
- iso_4217 | [] [] [] [] |
- iso_639 | [] [] [] [] [] |
+ iso_4217 | [] [] [] [] [] [] |
+ iso_639 | [] [] [] [] [] [] |
jpilot | [] [] |
jtag | [] |
jwhois | [] [] [] [] [] |
kbd | [] [] |
- keytouch | [] |
+ keytouch | [] [] [] |
keytouch-editor | [] |
- keytouch-keyboa... | [] |
- latrine | [] [] [] |
- ld | [] [] |
+ keytouch-keyboa... | [] [] |
+ latrine | [] [] |
+ ld | [] [] [] [] |
leafpad | [] [] [] [] [] [] |
libc | [] [] [] [] [] |
libexif | [] |
libextractor | [] |
libgpewidget | [] [] [] [] [] |
- libgpg-error | |
+ libgpg-error | [] |
libgphoto2 | [] [] [] |
libgphoto2_port | [] [] |
libgsasl | [] [] |
- libiconv | [] [] |
+ libiconv | [] [] [] |
libidn | [] [] |
lifelines | () |
- lilypond | [] |
+ lilypond | [] [] [] |
lingoteach | [] [] [] |
+ lprng | |
lynx | [] [] [] |
m4 | [] [] [] [] |
+ mailfromd | |
mailutils | [] [] |
make | [] [] [] [] [] [] [] [] |
- man-db | () |
+ man-db | [] |
minicom | [] [] [] [] |
- mysecretdiary | [] [] [] |
- nano | [] [] [] [] [] [] |
- nano_1_0 | [] [] [] [] [] |
+ nano | [] [] [] [] [] [] [] |
opcodes | [] [] [] [] |
- parted | [] [] [] [] |
+ parted | [] [] [] |
pilot-qof | |
- psmisc | [] [] [] |
+ popt | [] [] [] [] |
+ psmisc | [] [] |
pwdutils | |
- python | |
qof | [] |
radius | [] [] |
recode | [] [] [] [] [] [] [] [] |
@@ -504,565 +497,539 @@ translation percentage of at least 50%.
screem | |
scrollkeeper | [] [] [] |
sed | [] [] [] [] [] |
- sh-utils | [] [] [] [] [] [] [] |
shared-mime-info | [] [] [] [] [] [] |
sharutils | [] [] [] [] [] [] [] [] |
- shishi | |
- silky | [] |
+ shishi | [] |
skencil | [] [] |
- sketch | [] [] |
solfege | [] |
soundtracker | [] [] [] |
sp | [] |
- stardict | [] |
- system-tools-ba... | [] [] [] [] [] [] [] [] |
- tar | [] [] [] [] [] [] [] |
- texinfo | [] [] |
- textutils | [] [] [] [] [] |
+ system-tools-ba... | [] [] [] [] [] [] [] [] [] |
+ tar | [] [] [] [] [] |
+ texinfo | [] [] [] |
tin | [] () |
- tp-robot | [] [] [] [] |
tuxpaint | [] [] |
unicode-han-tra... | |
unicode-transla... | [] [] |
util-linux | [] [] [] [] [] [] [] |
- vorbis-tools | [] [] |
+ util-linux-ng | [] [] [] [] [] [] [] |
+ vorbis-tools | |
wastesedge | () |
wdiff | [] [] [] [] [] [] [] [] |
wget | [] [] [] [] [] [] [] [] |
- xchat | [] [] [] [] [] [] [] [] |
- xkeyboard-config | [] [] [] [] |
+ xchat | [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] [] [] |
xpad | [] [] [] |
+--------------------------------------------------+
es et eu fa fi fr ga gl gu he hi hr hu id is it
- 88 22 14 2 40 115 61 14 1 8 1 6 59 31 0 52
+ 85 22 14 2 48 101 61 12 2 8 2 6 53 29 1 52
- ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no
- +-------------------------------------------------+
- GNUnet | |
- a2ps | () [] [] () |
- aegis | () |
- ant-phone | [] |
- anubis | [] [] [] |
- ap-utils | [] |
- aspell | [] [] |
- bash | [] |
- batchelor | [] [] |
- bfd | |
- bibshelf | [] |
- binutils | |
- bison | [] [] [] |
- bison-runtime | [] [] [] |
- bluez-pin | [] [] [] |
- cflow | |
- clisp | [] |
- console-tools | |
- coreutils | [] |
- cpio | |
- cpplib | [] |
- cryptonit | [] |
- darkstat | [] [] |
- dialog | [] [] |
- diffutils | [] [] [] |
- doodle | |
- e2fsprogs | [] |
- enscript | [] |
- error | [] |
- fetchmail | [] [] |
- fileutils | [] [] |
- findutils | [] |
- flex | [] [] |
- fslint | [] [] |
- gas | |
- gawk | [] [] |
- gbiff | [] |
- gcal | |
- gcc | |
- gettext-examples | [] [] |
- gettext-runtime | [] [] [] |
- gettext-tools | [] [] |
- gimp-print | [] [] |
- gip | [] [] |
- gliv | [] |
- glunarclock | [] [] |
- gmult | [] [] |
- gnubiff | |
- gnucash | () () |
- gnucash-glossary | [] |
- gnuedu | |
- gnulib | [] [] [] [] |
- gnunet-gtk | |
- gnutls | |
- gpe-aerial | [] |
- gpe-beam | [] |
- gpe-calendar | [] |
- gpe-clock | [] [] [] |
- gpe-conf | [] [] |
- gpe-contacts | [] |
- gpe-edit | [] [] [] |
- gpe-filemanager | [] [] |
- gpe-go | [] [] [] |
- gpe-login | [] [] [] |
- gpe-ownerinfo | [] [] |
- gpe-package | [] [] |
- gpe-sketchbook | [] [] |
- gpe-su | [] [] [] |
- gpe-taskmanager | [] [] [] [] |
- gpe-timesheet | [] |
- gpe-today | [] [] |
- gpe-todo | [] |
- gphoto2 | [] [] |
- gprof | |
- gpsdrive | () () () |
- gramadoir | () |
- grep | [] [] [] [] |
- gretl | |
- gsasl | [] |
- gss | |
- gst-plugins | [] |
- gst-plugins-base | |
- gst-plugins-good | [] |
- gstreamer | [] |
- gtick | |
- gtkam | [] |
- gtkorphan | [] |
- gtkspell | [] [] |
- gutenprint | |
- hello | [] [] [] [] [] [] |
- id-utils | [] |
- impost | |
- indent | [] [] |
- iso_3166 | [] |
- iso_3166_2 | [] |
- iso_4217 | [] [] [] |
- iso_639 | [] [] |
- jpilot | () () () |
- jtag | |
- jwhois | [] |
- kbd | [] |
- keytouch | [] |
- keytouch-editor | |
- keytouch-keyboa... | |
- latrine | [] |
- ld | |
- leafpad | [] [] |
- libc | [] [] [] [] [] |
- libexif | |
- libextractor | |
- libgpewidget | [] |
- libgpg-error | |
- libgphoto2 | [] |
- libgphoto2_port | [] |
- libgsasl | [] |
- libiconv | |
- libidn | [] [] |
- lifelines | [] |
- lilypond | |
- lingoteach | [] |
- lynx | [] [] |
- m4 | [] [] |
- mailutils | |
- make | [] [] [] |
- man-db | () |
- minicom | [] |
- mysecretdiary | [] |
- nano | [] [] [] |
- nano_1_0 | [] [] [] |
- opcodes | [] |
- parted | [] [] |
- pilot-qof | |
- psmisc | [] [] [] |
- pwdutils | |
- python | |
- qof | |
- radius | |
- recode | [] |
- rpm | [] [] |
- screem | [] |
- scrollkeeper | [] [] [] [] |
- sed | [] [] |
- sh-utils | [] [] |
- shared-mime-info | [] [] [] [] [] |
- sharutils | [] [] |
- shishi | |
- silky | [] |
- skencil | |
- sketch | |
- solfege | |
- soundtracker | |
- sp | () |
- stardict | [] [] |
- system-tools-ba... | [] [] [] [] |
- tar | [] [] [] |
- texinfo | [] [] [] |
- textutils | [] [] [] |
- tin | |
- tp-robot | [] |
- tuxpaint | [] |
- unicode-han-tra... | |
- unicode-transla... | |
- util-linux | [] [] |
- vorbis-tools | [] |
- wastesedge | [] |
- wdiff | [] [] |
- wget | [] [] |
- xchat | [] [] [] [] |
- xkeyboard-config | [] |
- xpad | [] [] [] |
- +-------------------------------------------------+
- ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no
- 52 24 2 2 1 3 0 2 3 21 0 15 1 97 5 1
+ ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn
+ +--------------------------------------------------+
+ Compendium | [] |
+ a2ps | () [] [] |
+ aegis | () |
+ ant-phone | [] |
+ anubis | [] [] [] |
+ ap-utils | [] |
+ aspell | [] [] |
+ bash | [] |
+ bfd | |
+ bibshelf | [] |
+ binutils | |
+ bison | [] [] [] |
+ bison-runtime | [] [] [] |
+ bluez-pin | [] [] [] |
+ cflow | |
+ clisp | [] |
+ console-tools | |
+ coreutils | [] |
+ cpio | [] |
+ cpplib | [] |
+ cryptonit | [] |
+ dialog | [] [] |
+ diffutils | [] [] [] |
+ doodle | |
+ e2fsprogs | [] |
+ enscript | [] |
+ fetchmail | [] [] |
+ findutils | [] |
+ findutils_stable | [] |
+ flex | [] [] |
+ fslint | |
+ gas | |
+ gawk | [] [] |
+ gcal | |
+ gcc | |
+ gettext-examples | [] [] [] |
+ gettext-runtime | [] [] [] |
+ gettext-tools | [] [] |
+ gip | [] [] |
+ gliv | [] |
+ glunarclock | [] [] |
+ gmult | [] [] [] |
+ gnubiff | |
+ gnucash | () () () |
+ gnuedu | |
+ gnulib | [] [] |
+ gnunet | |
+ gnunet-gtk | |
+ gnutls | [] |
+ gpe-aerial | [] |
+ gpe-beam | [] |
+ gpe-calendar | [] |
+ gpe-clock | [] [] [] |
+ gpe-conf | [] [] [] |
+ gpe-contacts | [] |
+ gpe-edit | [] [] [] |
+ gpe-filemanager | [] [] |
+ gpe-go | [] [] [] |
+ gpe-login | [] [] [] |
+ gpe-ownerinfo | [] [] |
+ gpe-package | [] [] |
+ gpe-sketchbook | [] [] |
+ gpe-su | [] [] [] |
+ gpe-taskmanager | [] [] [] [] |
+ gpe-timesheet | [] |
+ gpe-today | [] [] |
+ gpe-todo | [] |
+ gphoto2 | [] [] |
+ gprof | [] |
+ gpsdrive | [] |
+ gramadoir | () |
+ grep | [] [] |
+ gretl | |
+ gsasl | [] |
+ gss | |
+ gst-plugins-bad | [] |
+ gst-plugins-base | [] |
+ gst-plugins-good | [] |
+ gst-plugins-ugly | [] |
+ gstreamer | [] |
+ gtick | [] |
+ gtkam | [] [] |
+ gtkorphan | [] |
+ gtkspell | [] [] |
+ gutenprint | [] |
+ hello | [] [] [] [] [] [] [] |
+ herrie | [] |
+ hylafax | |
+ idutils | [] |
+ indent | [] [] |
+ iso_15924 | [] |
+ iso_3166 | [] [] [] [] [] [] [] [] |
+ iso_3166_2 | [] |
+ iso_4217 | [] [] [] |
+ iso_639 | [] [] [] [] |
+ jpilot | () () |
+ jtag | |
+ jwhois | [] |
+ kbd | [] |
+ keytouch | [] |
+ keytouch-editor | [] |
+ keytouch-keyboa... | |
+ latrine | [] |
+ ld | |
+ leafpad | [] [] |
+ libc | [] [] [] |
+ libexif | |
+ libextractor | |
+ libgpewidget | [] |
+ libgpg-error | |
+ libgphoto2 | [] |
+ libgphoto2_port | [] |
+ libgsasl | [] |
+ libiconv | [] |
+ libidn | [] [] |
+ lifelines | [] |
+ lilypond | [] |
+ lingoteach | [] |
+ lprng | |
+ lynx | [] [] |
+ m4 | [] [] |
+ mailfromd | |
+ mailutils | |
+ make | [] [] [] |
+ man-db | |
+ minicom | [] |
+ nano | [] [] [] |
+ opcodes | [] |
+ parted | [] [] |
+ pilot-qof | |
+ popt | [] [] [] |
+ psmisc | [] [] [] |
+ pwdutils | |
+ qof | |
+ radius | |
+ recode | [] |
+ rpm | [] [] |
+ screem | [] |
+ scrollkeeper | [] [] [] [] |
+ sed | [] [] |
+ shared-mime-info | [] [] [] [] [] [] [] |
+ sharutils | [] [] |
+ shishi | |
+ skencil | |
+ solfege | () () |
+ soundtracker | |
+ sp | () |
+ system-tools-ba... | [] [] [] [] |
+ tar | [] [] [] |
+ texinfo | [] [] |
+ tin | |
+ tuxpaint | () [] [] |
+ unicode-han-tra... | |
+ unicode-transla... | |
+ util-linux | [] [] |
+ util-linux-ng | [] [] |
+ vorbis-tools | |
+ wastesedge | [] |
+ wdiff | [] [] |
+ wget | [] [] |
+ xchat | [] [] [] [] |
+ xkeyboard-config | [] [] [] |
+ xpad | [] [] [] |
+ +--------------------------------------------------+
+ ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn
+ 51 2 25 3 2 0 6 0 2 2 20 0 11 1 103 6
- nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta
- +------------------------------------------------------+
- GNUnet | |
- a2ps | () [] [] [] [] [] [] |
- aegis | () () |
- ant-phone | [] [] |
- anubis | [] [] [] |
- ap-utils | () |
- aspell | [] [] |
- bash | [] [] [] |
- batchelor | [] [] |
- bfd | |
- bibshelf | [] |
- binutils | [] [] |
- bison | [] [] [] [] [] |
- bison-runtime | [] [] [] [] |
- bluez-pin | [] [] [] [] [] [] [] [] [] |
- cflow | [] |
- clisp | [] |
- console-tools | [] |
- coreutils | [] [] [] [] |
- cpio | [] [] [] |
- cpplib | [] |
- cryptonit | [] [] |
- darkstat | [] [] [] [] [] [] |
- dialog | [] [] [] [] [] [] [] [] [] |
- diffutils | [] [] [] [] [] [] |
- doodle | [] [] |
- e2fsprogs | [] [] |
- enscript | [] [] [] [] [] |
- error | [] [] [] [] |
- fetchmail | [] [] [] |
- fileutils | [] [] [] [] [] |
- findutils | [] [] [] [] [] [] |
- flex | [] [] [] [] [] |
- fslint | [] [] [] [] |
- gas | |
- gawk | [] [] [] [] |
- gbiff | [] |
- gcal | [] |
- gcc | [] |
- gettext-examples | [] [] [] [] [] [] [] [] |
- gettext-runtime | [] [] [] [] [] [] [] [] |
- gettext-tools | [] [] [] [] [] [] [] |
- gimp-print | [] [] |
- gip | [] [] [] [] |
- gliv | [] [] [] [] |
- glunarclock | [] [] [] [] [] [] |
- gmult | [] [] [] [] |
- gnubiff | () |
- gnucash | () [] |
- gnucash-glossary | [] [] [] |
- gnuedu | |
- gnulib | [] [] [] [] [] |
- gnunet-gtk | [] |
- gnutls | [] [] |
- gpe-aerial | [] [] [] [] [] [] [] |
- gpe-beam | [] [] [] [] [] [] [] |
- gpe-calendar | [] |
- gpe-clock | [] [] [] [] [] [] [] [] |
- gpe-conf | [] [] [] [] [] [] [] |
- gpe-contacts | [] [] [] [] [] |
- gpe-edit | [] [] [] [] [] [] [] [] |
- gpe-filemanager | [] [] |
- gpe-go | [] [] [] [] [] [] |
- gpe-login | [] [] [] [] [] [] [] [] |
- gpe-ownerinfo | [] [] [] [] [] [] [] [] |
- gpe-package | [] [] |
- gpe-sketchbook | [] [] [] [] [] [] [] [] |
- gpe-su | [] [] [] [] [] [] [] [] |
- gpe-taskmanager | [] [] [] [] [] [] [] [] |
- gpe-timesheet | [] [] [] [] [] [] [] [] |
- gpe-today | [] [] [] [] [] [] [] [] |
- gpe-todo | [] [] [] [] |
- gphoto2 | [] [] [] [] [] |
- gprof | [] [] [] |
- gpsdrive | [] [] [] |
- gramadoir | [] [] |
- grep | [] [] [] [] [] [] [] [] |
- gretl | [] |
- gsasl | [] [] [] |
- gss | [] [] [] |
- gst-plugins | [] [] [] [] |
- gst-plugins-base | [] |
- gst-plugins-good | [] [] [] [] |
- gstreamer | [] [] [] |
- gtick | [] |
- gtkam | [] [] [] [] |
- gtkorphan | [] |
- gtkspell | [] [] [] [] [] [] [] [] |
- gutenprint | [] |
- hello | [] [] [] [] [] [] [] [] |
- id-utils | [] [] [] [] |
- impost | [] |
- indent | [] [] [] [] [] [] |
- iso_3166 | [] [] [] [] [] [] |
- iso_3166_2 | |
- iso_4217 | [] [] [] [] |
- iso_639 | [] [] [] [] |
- jpilot | |
- jtag | [] |
- jwhois | [] [] [] [] |
- kbd | [] [] [] |
- keytouch | [] |
- keytouch-editor | [] |
- keytouch-keyboa... | [] |
- latrine | [] [] |
- ld | [] |
- leafpad | [] [] [] [] [] [] |
- libc | [] [] [] [] [] |
- libexif | [] |
- libextractor | [] [] |
- libgpewidget | [] [] [] [] [] [] [] |
- libgpg-error | [] [] |
- libgphoto2 | [] |
- libgphoto2_port | [] [] [] |
- libgsasl | [] [] [] [] |
- libiconv | [] [] |
- libidn | [] [] () |
- lifelines | [] [] |
- lilypond | |
- lingoteach | [] |
- lynx | [] [] [] |
- m4 | [] [] [] [] [] |
- mailutils | [] [] [] [] |
- make | [] [] [] [] |
- man-db | [] [] |
- minicom | [] [] [] [] [] |
- mysecretdiary | [] [] [] [] |
- nano | [] [] [] |
- nano_1_0 | [] [] [] [] |
- opcodes | [] [] |
- parted | [] |
- pilot-qof | [] |
- psmisc | [] [] |
- pwdutils | [] [] |
- python | |
- qof | [] [] |
- radius | [] [] |
- recode | [] [] [] [] [] [] [] |
- rpm | [] [] [] [] |
- screem | |
- scrollkeeper | [] [] [] [] [] [] [] |
- sed | [] [] [] [] [] [] [] [] [] |
- sh-utils | [] [] [] |
- shared-mime-info | [] [] [] [] [] |
- sharutils | [] [] [] [] |
- shishi | [] |
- silky | [] |
- skencil | [] [] [] |
- sketch | [] [] [] |
- solfege | [] |
- soundtracker | [] [] |
- sp | |
- stardict | [] [] [] |
- system-tools-ba... | [] [] [] [] [] [] [] [] [] |
- tar | [] [] [] [] [] |
- texinfo | [] [] [] [] |
- textutils | [] [] [] |
- tin | () |
- tp-robot | [] |
- tuxpaint | [] [] [] [] [] |
- unicode-han-tra... | |
- unicode-transla... | |
- util-linux | [] [] [] [] |
- vorbis-tools | [] [] |
- wastesedge | |
- wdiff | [] [] [] [] [] [] |
- wget | [] [] [] [] |
- xchat | [] [] [] [] [] [] [] |
- xkeyboard-config | [] [] |
- xpad | [] [] [] |
- +------------------------------------------------------+
- nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta
- 0 2 3 58 30 54 5 73 72 4 40 46 11 50 128 2
+ or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta
+ +--------------------------------------------------+
+ Compendium | [] [] [] [] [] |
+ a2ps | () [] [] [] [] [] [] |
+ aegis | () () |
+ ant-phone | [] [] |
+ anubis | [] [] [] |
+ ap-utils | () |
+ aspell | [] [] [] |
+ bash | [] [] |
+ bfd | |
+ bibshelf | [] |
+ binutils | [] [] |
+ bison | [] [] [] [] [] |
+ bison-runtime | [] [] [] [] [] |
+ bluez-pin | [] [] [] [] [] [] [] [] [] |
+ cflow | [] |
+ clisp | [] |
+ console-tools | [] |
+ coreutils | [] [] [] [] |
+ cpio | [] [] [] |
+ cpplib | [] |
+ cryptonit | [] [] |
+ dialog | [] |
+ diffutils | [] [] [] [] [] [] |
+ doodle | [] [] |
+ e2fsprogs | [] [] |
+ enscript | [] [] [] [] [] |
+ fetchmail | [] [] [] |
+ findutils | [] [] [] |
+ findutils_stable | [] [] [] [] [] [] |
+ flex | [] [] [] [] [] |
+ fslint | [] |
+ gas | |
+ gawk | [] [] [] [] |
+ gcal | [] |
+ gcc | [] [] |
+ gettext-examples | [] [] [] [] [] [] [] [] |
+ gettext-runtime | [] [] [] [] [] [] [] [] |
+ gettext-tools | [] [] [] [] [] [] [] |
+ gip | [] [] [] [] |
+ gliv | [] [] [] [] [] [] |
+ glunarclock | [] [] [] [] [] [] |
+ gmult | [] [] [] [] |
+ gnubiff | () [] |
+ gnucash | () [] |
+ gnuedu | |
+ gnulib | [] [] [] |
+ gnunet | |
+ gnunet-gtk | [] |
+ gnutls | [] [] |
+ gpe-aerial | [] [] [] [] [] [] [] |
+ gpe-beam | [] [] [] [] [] [] [] |
+ gpe-calendar | [] [] [] [] |
+ gpe-clock | [] [] [] [] [] [] [] [] |
+ gpe-conf | [] [] [] [] [] [] [] |
+ gpe-contacts | [] [] [] [] [] |
+ gpe-edit | [] [] [] [] [] [] [] [] [] |
+ gpe-filemanager | [] [] |
+ gpe-go | [] [] [] [] [] [] [] [] |
+ gpe-login | [] [] [] [] [] [] [] [] |
+ gpe-ownerinfo | [] [] [] [] [] [] [] [] |
+ gpe-package | [] [] |
+ gpe-sketchbook | [] [] [] [] [] [] [] [] |
+ gpe-su | [] [] [] [] [] [] [] [] |
+ gpe-taskmanager | [] [] [] [] [] [] [] [] |
+ gpe-timesheet | [] [] [] [] [] [] [] [] |
+ gpe-today | [] [] [] [] [] [] [] [] |
+ gpe-todo | [] [] [] [] |
+ gphoto2 | [] [] [] [] [] [] |
+ gprof | [] [] [] |
+ gpsdrive | [] [] |
+ gramadoir | [] [] |
+ grep | [] [] [] [] |
+ gretl | [] [] [] |
+ gsasl | [] [] [] |
+ gss | [] [] [] [] |
+ gst-plugins-bad | [] [] [] |
+ gst-plugins-base | [] [] |
+ gst-plugins-good | [] [] |
+ gst-plugins-ugly | [] [] [] |
+ gstreamer | [] [] [] [] |
+ gtick | [] |
+ gtkam | [] [] [] [] [] |
+ gtkorphan | [] |
+ gtkspell | [] [] [] [] [] [] [] [] |
+ gutenprint | [] |
+ hello | [] [] [] [] [] [] [] [] |
+ herrie | [] [] [] |
+ hylafax | |
+ idutils | [] [] [] [] [] |
+ indent | [] [] [] [] [] [] [] |
+ iso_15924 | |
+ iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] |
+ iso_3166_2 | |
+ iso_4217 | [] [] [] [] [] [] [] |
+ iso_639 | [] [] [] [] [] [] [] |
+ jpilot | |
+ jtag | [] |
+ jwhois | [] [] [] [] |
+ kbd | [] [] [] |
+ keytouch | [] |
+ keytouch-editor | [] |
+ keytouch-keyboa... | [] |
+ latrine | |
+ ld | [] |
+ leafpad | [] [] [] [] [] [] |
+ libc | [] [] [] [] |
+ libexif | [] [] |
+ libextractor | [] [] |
+ libgpewidget | [] [] [] [] [] [] [] [] |
+ libgpg-error | [] [] [] |
+ libgphoto2 | [] |
+ libgphoto2_port | [] [] [] |
+ libgsasl | [] [] [] [] |
+ libiconv | [] [] [] |
+ libidn | [] [] () |
+ lifelines | [] [] |
+ lilypond | |
+ lingoteach | [] |
+ lprng | [] |
+ lynx | [] [] [] |
+ m4 | [] [] [] [] [] |
+ mailfromd | [] |
+ mailutils | [] [] [] |
+ make | [] [] [] [] |
+ man-db | [] [] [] [] |
+ minicom | [] [] [] [] [] |
+ nano | [] [] [] [] |
+ opcodes | [] [] |
+ parted | [] |
+ pilot-qof | |
+ popt | [] [] [] [] |
+ psmisc | [] [] |
+ pwdutils | [] [] |
+ qof | [] [] |
+ radius | [] [] |
+ recode | [] [] [] [] [] [] [] |
+ rpm | [] [] [] [] |
+ screem | |
+ scrollkeeper | [] [] [] [] [] [] [] |
+ sed | [] [] [] [] [] [] [] [] [] |
+ shared-mime-info | [] [] [] [] [] [] |
+ sharutils | [] [] [] [] |
+ shishi | [] |
+ skencil | [] [] [] |
+ solfege | [] |
+ soundtracker | [] [] |
+ sp | |
+ system-tools-ba... | [] [] [] [] [] [] [] [] [] |
+ tar | [] [] [] [] |
+ texinfo | [] [] [] [] |
+ tin | () |
+ tuxpaint | [] [] [] [] [] [] |
+ unicode-han-tra... | |
+ unicode-transla... | |
+ util-linux | [] [] [] [] |
+ util-linux-ng | [] [] [] [] |
+ vorbis-tools | [] |
+ wastesedge | |
+ wdiff | [] [] [] [] [] [] [] |
+ wget | [] [] [] [] |
+ xchat | [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] [] |
+ xpad | [] [] [] |
+ +--------------------------------------------------+
+ or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta
+ 0 5 77 31 53 4 58 72 3 45 46 9 45 122 3
tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu
+---------------------------------------------------+
- GNUnet | [] | 2
+ Compendium | [] [] [] [] | 19
a2ps | [] [] [] | 19
- aegis | | 0
+ aegis | [] | 1
ant-phone | [] [] | 6
anubis | [] [] [] | 11
ap-utils | () [] | 4
- aspell | [] [] [] | 15
- bash | [] | 11
- batchelor | [] [] | 9
- bfd | | 1
+ aspell | [] [] [] | 16
+ bash | [] | 6
+ bfd | | 2
bibshelf | [] | 7
- binutils | [] [] [] | 9
- bison | [] [] [] | 19
- bison-runtime | [] [] [] | 15
+ binutils | [] [] [] [] | 9
+ bison | [] [] [] [] | 20
+ bison-runtime | [] [] [] [] | 18
bluez-pin | [] [] [] [] [] [] | 28
cflow | [] [] | 5
- clisp | | 6
+ clisp | | 9
console-tools | [] [] | 5
- coreutils | [] [] | 16
- cpio | [] [] [] | 9
- cpplib | [] [] [] [] | 11
- cryptonit | | 5
- darkstat | [] () () | 15
- dialog | [] [] [] [] [] | 30
- diffutils | [] [] [] [] | 28
+ coreutils | [] [] [] | 18
+ cpio | [] [] [] [] | 11
+ cpplib | [] [] [] [] [] | 12
+ cryptonit | [] | 6
+ dialog | [] [] [] | 9
+ diffutils | [] [] [] [] [] | 29
doodle | [] | 6
e2fsprogs | [] [] | 10
enscript | [] [] [] | 16
- error | [] [] [] [] | 18
fetchmail | [] [] | 12
- fileutils | [] [] [] | 18
- findutils | [] [] [] | 17
+ findutils | [] [] [] | 11
+ findutils_stable | [] [] [] [] | 18
flex | [] [] | 15
- fslint | [] | 9
+ fslint | [] | 2
gas | [] | 3
- gawk | [] [] | 15
- gbiff | [] | 5
+ gawk | [] [] [] | 16
gcal | [] | 5
- gcc | [] [] [] | 6
- gettext-examples | [] [] [] [] [] [] | 27
+ gcc | [] [] [] | 7
+ gettext-examples | [] [] [] [] [] [] | 29
gettext-runtime | [] [] [] [] [] [] | 28
- gettext-tools | [] [] [] [] [] | 19
- gimp-print | [] [] | 12
- gip | [] [] | 12
- gliv | [] [] | 8
+ gettext-tools | [] [] [] [] [] | 20
+ gip | [] [] | 13
+ gliv | [] [] | 11
glunarclock | [] [] [] | 15
- gmult | [] [] [] [] | 15
- gnubiff | [] | 1
- gnucash | () | 2
- gnucash-glossary | [] [] | 9
+ gmult | [] [] [] [] | 16
+ gnubiff | [] | 2
+ gnucash | () [] | 5
gnuedu | [] | 2
- gnulib | [] [] [] [] [] | 28
- gnunet-gtk | | 1
- gnutls | | 2
+ gnulib | [] | 10
+ gnunet | | 0
+ gnunet-gtk | [] [] | 3
+ gnutls | | 4
gpe-aerial | [] [] | 14
gpe-beam | [] [] | 14
- gpe-calendar | [] | 3
+ gpe-calendar | [] [] | 7
gpe-clock | [] [] [] [] | 21
- gpe-conf | [] [] | 14
+ gpe-conf | [] [] [] | 16
gpe-contacts | [] [] | 10
- gpe-edit | [] [] [] [] | 20
- gpe-filemanager | [] | 6
- gpe-go | [] [] | 15
+ gpe-edit | [] [] [] [] [] | 22
+ gpe-filemanager | [] [] | 7
+ gpe-go | [] [] [] [] | 19
gpe-login | [] [] [] [] [] | 21
gpe-ownerinfo | [] [] [] [] | 21
gpe-package | [] | 6
gpe-sketchbook | [] [] | 16
- gpe-su | [] [] [] | 20
- gpe-taskmanager | [] [] [] | 20
+ gpe-su | [] [] [] [] | 21
+ gpe-taskmanager | [] [] [] [] | 21
gpe-timesheet | [] [] [] [] | 18
gpe-today | [] [] [] [] [] | 21
- gpe-todo | [] | 7
- gphoto2 | [] [] [] [] | 20
- gprof | [] [] | 11
- gpsdrive | | 4
+ gpe-todo | [] [] | 8
+ gphoto2 | [] [] [] [] | 21
+ gprof | [] [] | 13
+ gpsdrive | [] | 5
gramadoir | [] | 7
- grep | [] [] [] [] | 34
- gretl | | 4
- gsasl | [] [] | 8
- gss | [] | 5
- gst-plugins | [] [] [] | 15
- gst-plugins-base | [] [] [] | 9
- gst-plugins-good | [] [] [] [] [] | 20
- gstreamer | [] [] [] | 17
- gtick | [] | 3
- gtkam | [] | 13
+ grep | [] | 12
+ gretl | | 6
+ gsasl | [] [] [] | 9
+ gss | [] | 7
+ gst-plugins-bad | [] [] [] | 13
+ gst-plugins-base | [] [] | 11
+ gst-plugins-good | [] [] [] [] [] | 16
+ gst-plugins-ugly | [] [] [] | 13
+ gstreamer | [] [] [] | 18
+ gtick | [] [] | 7
+ gtkam | [] | 16
gtkorphan | [] | 7
- gtkspell | [] [] [] [] [] [] | 26
- gutenprint | | 3
- hello | [] [] [] [] [] | 37
- id-utils | [] [] | 14
- impost | [] | 4
- indent | [] [] [] [] | 25
- iso_3166 | [] [] [] [] | 16
- iso_3166_2 | | 2
- iso_4217 | [] [] | 14
- iso_639 | [] | 14
+ gtkspell | [] [] [] [] [] [] | 27
+ gutenprint | | 4
+ hello | [] [] [] [] [] | 38
+ herrie | [] [] | 8
+ hylafax | | 0
+ idutils | [] [] | 15
+ indent | [] [] [] [] [] | 28
+ iso_15924 | [] [] | 4
+ iso_3166 | [] [] [] [] [] [] [] [] [] | 54
+ iso_3166_2 | [] [] | 4
+ iso_4217 | [] [] [] [] [] | 24
+ iso_639 | [] [] [] [] [] | 26
jpilot | [] [] [] [] | 7
jtag | [] | 3
jwhois | [] [] [] | 13
- kbd | [] [] | 12
- keytouch | [] | 4
- keytouch-editor | | 2
- keytouch-keyboa... | [] | 3
- latrine | [] [] | 8
- ld | [] [] [] [] | 8
- leafpad | [] [] [] [] | 23
- libc | [] [] [] | 23
- libexif | [] | 4
+ kbd | [] [] [] | 13
+ keytouch | [] | 8
+ keytouch-editor | [] | 5
+ keytouch-keyboa... | [] | 5
+ latrine | [] [] | 5
+ ld | [] [] [] [] | 10
+ leafpad | [] [] [] [] [] | 24
+ libc | [] [] [] | 19
+ libexif | [] | 5
libextractor | [] | 5
- libgpewidget | [] [] [] | 19
- libgpg-error | [] | 4
- libgphoto2 | [] | 8
+ libgpewidget | [] [] [] | 20
+ libgpg-error | [] | 6
+ libgphoto2 | [] [] | 9
libgphoto2_port | [] [] [] | 11
libgsasl | [] | 8
- libiconv | [] | 7
- libidn | [] [] | 10
+ libiconv | [] [] | 11
+ libidn | [] [] | 11
lifelines | | 4
- lilypond | | 2
+ lilypond | [] | 6
lingoteach | [] | 6
+ lprng | [] | 2
lynx | [] [] [] | 15
m4 | [] [] [] | 18
- mailutils | [] | 8
+ mailfromd | [] [] | 3
+ mailutils | [] [] | 8
make | [] [] [] | 20
- man-db | [] | 6
+ man-db | [] | 9
minicom | [] | 14
- mysecretdiary | [] [] | 12
- nano | [] [] | 17
- nano_1_0 | [] [] [] | 18
+ nano | [] [] [] | 20
opcodes | [] [] | 10
- parted | [] [] [] | 10
- pilot-qof | [] | 3
- psmisc | [] | 10
+ parted | [] [] [] | 11
+ pilot-qof | [] | 1
+ popt | [] [] [] [] | 18
+ psmisc | [] [] | 10
pwdutils | [] | 3
- python | | 0
qof | [] | 4
- radius | [] | 6
+ radius | [] [] | 7
recode | [] [] [] | 25
- rpm | [] [] [] [] | 14
+ rpm | [] [] [] [] | 13
screem | [] | 2
scrollkeeper | [] [] [] [] | 26
- sed | [] [] [] | 22
- sh-utils | [] | 15
- shared-mime-info | [] [] [] [] | 24
+ sed | [] [] [] [] | 23
+ shared-mime-info | [] [] [] | 29
sharutils | [] [] [] | 23
- shishi | | 1
- silky | [] | 4
+ shishi | [] | 3
skencil | [] | 7
- sketch | | 6
- solfege | | 2
+ solfege | [] | 3
soundtracker | [] [] | 9
sp | [] | 3
- stardict | [] [] [] [] | 11
- system-tools-ba... | [] [] [] [] [] [] [] | 37
- tar | [] [] [] [] | 20
+ system-tools-ba... | [] [] [] [] [] [] [] | 38
+ tar | [] [] [] | 17
texinfo | [] [] [] | 15
- textutils | [] [] [] | 17
tin | | 1
- tp-robot | [] [] [] | 10
- tuxpaint | [] [] [] | 16
+ tuxpaint | [] [] [] | 19
unicode-han-tra... | | 0
unicode-transla... | | 2
util-linux | [] [] [] | 20
- vorbis-tools | [] [] | 11
+ util-linux-ng | [] [] [] | 20
+ vorbis-tools | [] [] | 4
wastesedge | | 1
- wdiff | [] [] | 22
- wget | [] [] [] | 19
+ wdiff | [] [] | 23
+ wget | [] [] [] | 20
xchat | [] [] [] [] | 29
- xkeyboard-config | [] [] [] [] | 11
- xpad | [] [] [] | 14
+ xkeyboard-config | [] [] [] | 14
+ xpad | [] [] [] | 15
+---------------------------------------------------+
- 77 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu
- 170 domains 0 1 1 77 39 0 136 10 1 48 5 54 0 2028
+ 76 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu
+ 163 domains 0 3 1 74 51 0 143 21 1 57 7 45 0 2036
Some counters in the preceding matrix are higher than the number of
visible blocks let us expect. This is because a few extra PO files are
@@ -1075,10 +1042,10 @@ distributed as such by its maintainer. There might be an observable
lag between the mere existence a PO file and its wide availability in a
distribution.
- If October 2006 seems to be old, you may fetch a more recent copy of
-this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date
-matrix with full percentage details can be found at
-`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'.
+ If November 2007 seems to be old, you may fetch a more recent copy
+of this `ABOUT-NLS' file on most GNU archive sites. The most
+up-to-date matrix with full percentage details can be found at
+`http://translationproject.org/extra/matrix.html'.
1.6 Using `gettext' in new packages
===================================
@@ -1096,6 +1063,6 @@ the use of `gettext' the only thing missing are the translations. The
Free Translation Project is also available for packages which are not
developed inside the GNU project. Therefore the information given above
applies also for every other Free Software Project. Contact
-`translation@iro.umontreal.ca' to make the `.pot' files available to
-the translation teams.
+`coordinator@translationproject.org' to make the `.pot' files available
+to the translation teams.
diff --git a/AUTHORS b/AUTHORS
index 29b776f0..ef3c5430 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,2 +1,4 @@
For Now:
Ulrich Drepper.
+Roland McGrath
+Petr Machata
diff --git a/ChangeLog b/ChangeLog
index 9a55c005..018a1025 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,79 @@
+2010-04-15 Roland McGrath <roland@redhat.com>
+
+ * configure.ac (LOCALEDIR, DATADIRNAME): Removed.
+
+2009-09-21 Ulrich Drepper <drepper@redhat.com>
+
+ * configure.ac: Update for more modern autoconf.
+
+2009-08-26 Roland McGrath <roland@redhat.com>
+
+ * configure.ac (zip_LIBS): Check for liblzma too.
+
+2009-04-19 Roland McGrath <roland@redhat.com>
+
+ * configure.ac (eu_version): Round down here, not in version.h macros.
+
+2009-04-17 Roland McGrath <roland@redhat.com>
+
+ * configure.ac (eu_version): Compute number 1000 times larger,
+ let $PACKAGE_VERSION be x.y.z as well as x.y (implied x.y.0).
+
+2009-01-23 Roland McGrath <roland@redhat.com>
+
+ * configure.ac (zlib check): Check for gzdirect, need zlib >= 1.2.2.3.
+
+ * configure.ac (__thread check): Use AC_LINK_IFELSE, in case of
+ building with compiler support but no working runtime support.
+
+2009-01-22 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am (rpm): The tarball is now bzip2-compressed.
+
+2009-01-10 Ulrich Drepper <drepper@redhat.com>
+
+ * configure.ac: Require gcc with TLS support.
+ Rename USE_TLS to USE_LOCKS. The option is renamed to
+ --enable-thread-safety.
+
+2009-01-08 Roland McGrath <roland@redhat.com>
+
+ * configure.ac (eu_ZIPLIB): Moved to m4/zip.am.
+
+2009-01-05 Roland McGrath <roland@redhat.com>
+
+ * configure.ac (eu_ZIPLIB): New macro.
+ Use it to test for -lz, -lbz2, set .am ZLIB, BZLIB, zip_LIBS.
+
+2008-12-30 Ulrich Drepper <drepper@redhat.com>
+
+ * configure.ac: We need automake 1.8 now.
+
+2008-12-24 Roland McGrath <roland@redhat.com>
+
+ * configure.ac: Use automake flags dist-bzip2 no-dist-gzip,
+ distribute only in .tar.bz2 form now.
+
+2008-12-16 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am (pkginclude_HEADERS): New variable, install version.h.
+ * configure.ac: Create it, substituting @eu_version@ with
+ PACKAGE_VERSION canonicalized to four digits of decimal.
+
+2008-08-25 Roland McGrath <roland@redhat.com>
+
+ * configure.ac (--enable-tls): Set AM_CONDITIONAL USE_TLS too.
+
+2008-08-21 Roland McGrath <roland@redhat.com>
+
+ * configure.ac (AH_BOTTOM): Emit #include <eu-config.h> and
+ move the contents to lib/eu-config.h instead of keeping them here.
+
+2007-12-20 Ulrich Drepper <drepper@redhat.com>
+
+ * configure.ac: Add support for --enable-debugpred.
+ Update likely/unlikely macros for it.
+
2007-06-05 Ulrich Drepper <drepper@redhat.com>
* Makefile.am: Remove traces of mini builds.
diff --git a/Makefile.am b/Makefile.am
index 9306fe69..4decc55f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,7 +1,7 @@
## Process this file with automake to create Makefile.in
## Configure input file for elfutils.
##
-## Copyright (C) 1996-2002, 2003, 2004, 2005, 2006 Red Hat, Inc.
+## Copyright (C) 1996-2002, 2003, 2004, 2005, 2006, 2008, 2009 Red Hat, Inc.
## This file is part of Red Hat elfutils.
##
## Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -27,6 +27,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
@@ -44,7 +46,7 @@ distcheck-hook:
chmod -R u+w $(distdir)
rpm: dist
- rpmbuild -ts --sign elfutils-@PACKAGE_VERSION@.tar.gz
+ rpmbuild -ts --sign elfutils-@PACKAGE_VERSION@.tar.bz2
# Tell version 3.79 and up of GNU make to not build goals in this
# directory in parallel.
diff --git a/NEWS b/NEWS
index ac1aba8d..40cd9623 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,167 @@
+Version 0.148:
+
+libdwfl: Fixes in core-file handling, support cores from PIEs.
+ When working from build IDs, don't open a named file that mismatches.
+
+Version 0.147:
+
+libdw: Fixes in CFI handling, best possible handling of bogus CFA ops.
+
+libdwfl: Ignore R_*_NONE relocs, works around old (binutils) ld -r bugs.
+
+Version 0.146:
+
+libdwfl: New function dwfl_core_file_report.
+
+Version 0.145:
+
+Fix build with --disable-dependency-tracking.
+
+Fix build with most recent glibc headers.
+
+libelf: More robust to bogus section headers.
+
+libdw: Fix CFI decoding.
+
+libdwfl: Fix address bias returned by CFI accessors.
+ Fix core file module layout identification.
+
+readelf: Fix CFI decoding.
+
+Version 0.144:
+
+libelf: New function elf_getphdrnum.
+ Now support using more than 65536 program headers in a file.
+
+libdw: New function dwarf_aggregate_size for computing (constant) type
+ sizes, including array_type cases with nontrivial calculation.
+
+readelf: Don't give errors for missing info under -a.
+ Handle Linux "VMCOREINFO" notes under -n.
+
+Version 0.143:
+
+libdw: Various convenience functions for individual attributes now use
+ dwarf_attr_integrate to look up indirect inherited attributes.
+ Location expression handling now supports DW_OP_implicit_value.
+
+libdwfl: Support automatic decompression of files in XZ format,
+ and of Linux kernel images made with bzip2 or LZMA (as well as gzip).
+
+Version 0.142:
+
+libelf: Add elf_getshdrnum alias for elf_getshnum and elf_getshdrstrndx alias
+ for elf_getshstrndx and deprecate original names. Sun screwed up
+ their implementation and asked for a solution.
+
+libebl: Add support for STB_GNU_UNIQUE.
+
+elflint: Add support for STB_GNU_UNIQUE.
+
+readelf: Add -N option, speeds up DWARF printing without address->name lookups.
+
+libdw: Add support for decoding DWARF CFI into location description form.
+ Handle some new DWARF 3 expression operations previously omitted.
+ Basic handling of some new encodings slated for DWARF 4.
+
+Version 0.141:
+
+libebl: sparc backend fixes;
+ some more arm backend support
+
+libdwfl: fix dwfl_module_build_id for prelinked DSO case;
+ fixes in core file support;
+ dwfl_module_getsym interface improved for non-address symbols
+
+strip: fix infinite loop on strange inputs with -f
+
+addr2line: take -j/--section=NAME option for binutils compatibility
+ (same effect as '(NAME)0x123' syntax already supported)
+
+Version 0.140:
+
+libelf: Fix regression in creation of section header
+
+libdwfl: Less strict behavior if DWARF reader ist just used to display data
+
+Version 0.139:
+
+libcpu: Add Intel SSE4 disassembler support
+
+readelf: Implement call frame information and exception handling dumping.
+ Add -e option. Enable it implicitly for -a.
+
+elflint: Check PT_GNU_EH_FRAME program header entry.
+
+libdwfl: Support automatic gzip/bzip2 decompression of ELF files.
+
+Version 0.138:
+
+Install <elfutils/version.h> header file for applications to use in source
+version compatibility checks.
+
+libebl: backend fixes for i386 TLS relocs; backend support for NT_386_IOPERM
+
+libcpu: disassembler fixes
+
+libdwfl: bug fixes
+
+libelf: bug fixes
+
+nm: bug fixes for handling corrupt input files
+
+Version 0.137:
+
+Minor fixes for unreleased 0.136 release.
+
+Version 0.136:
+
+libdwfl: bug fixes; new "segment" interfaces;
+ all the libdwfl-based tools now support --core=COREFILE option
+
+Version 0.135:
+
+libdwfl: bug fixes
+
+strip: changed handling of ET_REL files wrt symbol tables and relocs
+
+Version 0.134:
+
+elflint: backend improvements for sparc, alpha
+
+libdwfl, libelf: bug fixes
+
+Version 0.133:
+
+readelf, elflint, libebl: SHT_GNU_ATTRIBUTE section handling (readelf -A)
+
+readelf: core note handling for NT_386_TLS, NT_PPC_SPE, Alpha NT_AUXV
+
+libdwfl: bug fixes and optimization in relocation handling
+
+elfcmp: bug fix for non-allocated section handling
+
+ld: implement newer features of binutils linker.
+
+Version 0.132:
+
+libcpu: Implement x86 and x86-64 disassembler.
+libasm: Add interface for disassembler.
+
+all programs: add debugging of branch prediction.
+
+libelf: new function elf_scnshndx.
+
+Version 0.131:
+
+libdw: DW_FORM_ref_addr support; dwarf_formref entry point now deprecated;
+ bug fixes for oddly-formatted DWARF
+
+libdwfl: bug fixes in offline archive support, symbol table handling;
+ apply partial relocations for dwfl_module_address_section on ET_REL
+
+libebl: powerpc backend support for Altivec registers
+
Version 0.130:
readelf: -p option can take an argument like -x for one section,
diff --git a/README b/README
index afc94077..33cac74f 100644
--- a/README
+++ b/README
@@ -4,3 +4,9 @@ Fundamental design decision:
This leaves byte ordering aside. While assuming this the code can be
greatly simplified and speed increases. Since no change violating this
assumption is in sight this is believed to be a worthwhile optimization.
+
+- the ABI of the backend modules is not guaranteed. Really, not guarantee
+ whatsoever. We are enforcing this in the code. The modules and their
+ users must match. No third-party EBL module are supported or allowed.
+ The only reason there are separate modules is to not have the code for
+ all architectures in all the binaries.
diff --git a/THANKS b/THANKS
index 3ee88d16..887c067a 100644
--- a/THANKS
+++ b/THANKS
@@ -3,4 +3,4 @@ At least the following have submitted valuable patches:
Jeff Johnson building. rpm wrestling
Alexander Larsson separate debug info
Jakub Jelinek bug fixes, testing
-Roland McGrath lots of libdw{,fl} hacking
+Denys Vlasenko bug fuxes
diff --git a/TODO b/TODO
index b3b4441b..0012a566 100644
--- a/TODO
+++ b/TODO
@@ -1,7 +1,7 @@
ToDo list for elfutils -*-outline-*-
----------------------
-Time-stamp: <2006-06-11 11:07:01 drepper>
+Time-stamp: <2009-02-05 22:08:01 drepper>
* mkinstalldirs
@@ -22,6 +22,13 @@ Time-stamp: <2006-06-11 11:07:01 drepper>
archives and only when having the archive handling separately this
remains maintainable.
+** shdrs in read-only files
+
+ When reading (ELF_C_READ*) then there is no need to malloc Shdr
+ structure in elfXX_getshdr if file is mmaped and unaligned access
+ is allowed or the structure is aligned. Use ELF_F_MALLOCED flag
+ to differentiate.
+
* libdw
@@ -38,6 +45,20 @@ Time-stamp: <2006-06-11 11:07:01 drepper>
** Rename dwarf_getabbrev
+* libcpu
+
+** x86
+
+*** Opcodes
+
+ crc32
+ extractps
+ pextrb
+ pextrd/pextrq
+ pextrw
+ pinsrq
+ popcnt 64-bit reg
+
* nm:
** add demangler support
@@ -89,6 +110,13 @@ Time-stamp: <2006-06-11 11:07:01 drepper>
Not implemented at all in the moment except for recognition of the option
itself.
+** variables with aliases in executables
+
+ When linking an executable with a references against a variable in a
+ DSO, create symbol table entries for all the aliases of the variable
+ in the DSO and create a relocation for one of them (a non-weak
+ definition)
+
* elflint
** additional checks
@@ -102,6 +130,14 @@ Time-stamp: <2006-06-11 11:07:01 drepper>
check whether any relocation is for a merge-able section
+ check TLS relocation depencies
+
+ Check content of .eh_frame_hdr, .eh_frame, .gcc_except_table
+
+*** for x86
+
+ check that R_386_TLS_GD is followed by R_386_PLT32 for __tls_get_addr
+
** relax
prelink generated files
@@ -150,5 +186,5 @@ Time-stamp: <2006-06-11 11:07:01 drepper>
-V Print on standard error the version number of mcs.
Local Variables:
-eval:(hide-body)
+eval:(hide-sublevels 3)
End:
diff --git a/backends/ChangeLog b/backends/ChangeLog
index 2bb61f2b..9fd9745d 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,192 @@
+2010-04-10 Matt Fleming <matt@console-pimps.org>
+
+ * sh_corenote.c: New file.
+ * sh_regs.c: New file.
+ * sh_retval.c: New file.
+ * sh_symbol.c (sh_machine_flag_check): New function.
+ * Makefile.am (sh_SRCS): Add new files.
+ * sh_init.c (sh_init): Add initializers.
+
+2010-04-07 Roland McGrath <roland@redhat.com>
+
+ * arm_reloc.def: Accept PC24 and ABS32 in EXEC|DYN too.
+
+2010-03-04 Ulrich Drepper <drepper@redhat.com>
+
+ * x86_64_reloc.def: Add entries for R_X86_64_SIZE32 and
+ R_X86_64_SIZE64.
+
+2010-02-18 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am (libebl_%.so): Use multi-target pattern rule instead of
+ intermediate dependency file for libebl_%.map, working around apparent
+ make -j timing-sensitive bugs.
+
+2010-02-15 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am: Use config/eu.am for common stuff.
+
+2010-01-05 Roland McGrath <roland@redhat.com>
+
+ * arm_retval.c (arm_return_value_location): Use dwarf_aggregate_size.
+ * ia64_retval.c (ia64_return_value_location): Likewise.
+ * ppc_retval.c (ppc_return_value_location): Likewise.
+ * ppc64_retval.c (ppc64_return_value_location): Likewise.
+ * sparc_retval.c (sparc_return_value_location): Likewise.
+
+ * ppc64_retval.c (ppc64_return_value_location):
+ Use vr2 for DW_TAG_array_type with DW_AT_GNU_vector.
+ * ppc_retval.c (ppc_return_value_location): Likewise.
+
+2010-01-04 Roland McGrath <roland@redhat.com>
+
+ * linux-core-note.c (vmcoreinfo_items): New static const variable.
+ (EBLHOOK(core_note)): Update arguments for new protocol.
+ Validate the name as "CORE" or "LINUX" for known n_type cases.
+ Handle name "VMCOREINFO" n_type=0 with vmcoreinfo_items.
+ * i386_corenote.c (EXTRA_NOTES): Update parameter usage.
+ * x86_corenote.c (EXTRA_NOTES_IOPERM): Likewise.
+
+2009-09-10 Mark Wielaard <mjw@redhat.com>
+
+ * sparc_retval.c: Fix license header.
+
+2009-08-07 Roland McGrath <roland@redhat.com>
+
+ * x86_64_reloc.def: Add PC64, GOTOFF64, GOTPC32, GOTPC32_TLSDESC,
+ TLSDESC_CALL, TLSDESC.
+
+2009-07-08 Roland McGrath <roland@redhat.com>
+
+ * x86_64_cfi.c (x86_64_abi_cfi): New file.
+ * Makefile.am (x86_64_SRCS): Add it.
+ * x86_64_init.c (x86_64_init): Add initializer.
+
+ * i386_cfi.c (i386_abi_cfi): New file.
+ * Makefile.am (i386_SRCS): Add it.
+ * i386_init.c (i386_init): Initialize abi_cfi hook.
+
+2009-06-01 Ulrich Drepper <drepper@redhat.com>
+
+ * i386_reloc.def: Add IRELATIVE entry.
+ * x86_64_reloc.def: Likewise.
+
+2009-04-16 Roland McGrath <roland@redhat.com>
+
+ * arm_regs.c (arm_register_info): Handle VFP registers.
+
+ * i386_corenote.c (EXTRA_NOTES): NT_PRXFPREG -> NT_PRXFPREG
+
+2009-04-14 Roland McGrath <roland@redhat.com>
+
+ * arm_retval.c: New file.
+ * arm_attrs.c: New file.
+ * Makefile.am (arm_SRCS): Add them.
+ * arm_symbol.c (arm_segment_type_name): New function.
+ (arm_section_type_name): New function.
+ (arm_machine_flag_check): New function.
+ * arm_init.c (arm_init): Initialize those hooks.
+
+ * arm_regs.c: New file.
+ * arm_corenote.c: New file.
+ * arm_auxv.c: New file.
+ * Makefile.am (arm_SRCS): Add them.
+ * arm_init.c (arm_init): Initialize core_note, register_info,
+ and auxv_info hooks.
+
+ * ia64_symbol.c (ia64_section_type_name): Remove "SHT_" prefixes.
+
+2009-04-01 Roland McGrath <roland@redhat.com>
+
+ * sparc_reloc.def: Update table.
+ Data from Dave Miller <davem@davemloft.net>.
+
+2009-02-15 Roland McGrath <roland@redhat.com>
+
+ * ppc_attrs.c (ppc_check_object_attribute): Handle tag
+ GNU_Power_ABI_Struct_Return.
+
+2008-10-04 Ulrich Drepper <drepper@redhat.com>
+
+ * i386_reloc.def: Fix entries for TLS_GOTDESC, TLS_DESC_CALL, and
+ TLS_DESC.
+
+2008-08-01 Roland McGrath <roland@redhat.com>
+
+ * x86_corenote.c: New file.
+ * Makefile.am (noinst_HEADERS): Add it.
+ * i386_corenote.c: Include it, use EXTRA_NOTES_IOPERM in EXTRA_NOTES.
+ * x86_64_corenote.c: Likewise.
+
+ * linux-core-note.c (prstatus_items): Use 'B' instead of 'b'
+ for sigpend and sighold.
+
+2008-07-04 Roland McGrath <roland@redhat.com>
+
+ * i386_syscall.c: New file.
+ * x86_64_syscall.c: New file.
+ * ppc_syscall.c: New file.
+ * Makefile.am (i386_SRCS, x86_64_SRCS, ppc_SRCS, ppc64_SRCS): Add them.
+ * i386_init.c (i386_init): Initialize syscall_abi hook.
+ * x86_64_init.c (x86_64_init): Likewise.
+ * ppc_init.c (ppc_init): Likewise.
+ * ppc64_init.c (ppc64_init): Likewise.
+
+ * ppc_corenote.c (PRSTATUS_REGSET_ITEMS): Add nip.
+ Fix offset calculation for 64-bit case.
+
+2008-04-04 Roland McGrath <roland@redhat.com>
+
+ * alpha_symbol.c (alpha_check_special_section): New function.
+ * alpha_init.c (alpha_init): Initialize check_special_section hook.
+
+2008-03-31 Roland McGrath <roland@redhat.com>
+
+ * sparc_symbol.c (sparc_symbol_type_name): New function.
+ (sparc_dynamic_tag_name): New function.
+ (sparc_dynamic_tag_check): New function.
+ * sparc_init.c (sparc_init): Initialize those hooks.
+
+ * sparc_symbol.c (sparc_check_special_section): New function.
+ * sparc_init.c (sparc_init): Initialize check_special_section hook.
+
+2008-02-20 Roland McGrath <roland@redhat.com>
+
+ * ppc_attrs.c: New file.
+ * Makefile.am (ppc_SRCS, ppc64_SRCS): Add it.
+ * ppc_init.c (ppc_init): Initialize check_object_attribute hook.
+
+2008-02-14 Roland McGrath <roland@redhat.com>
+
+ * alpha_auxv.c: New file.
+ * Makefile.am (alpha_SRCS): Add it.
+ * alpha_init.c (alpha_init): Initialize auxv_info hook.
+
+2008-02-08 Roland McGrath <roland@redhat.com>
+
+ * ppc_corenote.c (spe_regs): New const variable.
+ (EXTRA_NOTES): Use it for NT_PPC_SPE.
+
+2008-01-02 Roland McGrath <roland@redhat.com>
+
+ * i386_corenote.c (tls_items): New const table.
+ (tls_info): New function, uses it.
+ (EXTRA_NOTES): Use it to handle NT_386_TLS.
+
+2008-01-08 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am: Add x86-64 disassembler.
+ * x86_64_init.c (x86_64_init): Hook up disassembler.
+
+2007-12-28 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am: Add x86 disassembler.
+ * i386_init.c (i386_init): Hook up disassembler.
+
+2007-12-15 Roland McGrath <roland@redhat.com>
+
+ * ppc_regs.c (ppc_register_info): Return "spefscr", not "spr512".
+
2007-10-18 Roland McGrath <roland@redhat.com>
* ppc_regs.c (ppc_register_info): Assign 67 to "vscr".
@@ -38,6 +227,10 @@
* sparc_retval.c: Likewise.
* x86_64_retval.c: Likewise.
+2007-10-31 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am: More dependencies for the libebl_* libraries.
+
2007-08-23 Roland McGrath <roland@redhat.com>
* x86_64_regs.c (x86_64_register_info): Put %rflags in "integer" set.
diff --git a/backends/Makefile.am b/backends/Makefile.am
index 4174f8e3..3ce448a9 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to create Makefile.in
##
-## Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Red Hat, Inc.
+## Copyright (C) 2000-2010 Red Hat, Inc.
## This file is part of Red Hat elfutils.
##
## Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -24,17 +24,9 @@
## Network licensing program, please visit www.openinventionnetwork.com
## <http://www.openinventionnetwork.com>.
##
-DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DOBJDIR=\"$(shell pwd)\"
-if MUDFLAP
-AM_CFLAGS = -fmudflap
-else
-AM_CFLAGS =
-endif
-AM_CFLAGS += -fpic -Wall -Wshadow -Werror -Wunused -Wextra -Wformat=2 \
- -std=gnu99
-INCLUDES = -I$(srcdir) -I$(top_srcdir)/libebl \
- -I$(top_srcdir)/libelf -I$(top_srcdir)/libdw \
- -I$(top_srcdir)/lib -I..
+include $(top_srcdir)/config/eu.am
+INCLUDES += -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
@@ -49,37 +41,24 @@ noinst_DATA = $(libebl_pic:_pic.a=.so)
if MUDFLAP
libelf = ../libelf/libelf.a
libdw = ../libdw/libdw.a
-libmudflap = -lmudflap
else
libelf = ../libelf/libelf.so
libdw = ../libdw/libdw.so
-libmudflap =
endif
-
-textrel_check = if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
-
-libebl_%.so: libebl_%_pic.a libebl_%.map $(libelf) $(libdw)
- $(LINK) -shared -o $@ -Wl,--whole-archive,$<,--no-whole-archive \
- -Wl,--version-script,$(word 2,$^) \
- -Wl,-z,defs -Wl,--as-needed $(libelf) $(libdw) $(libmudflap)
- $(textrel_check)
-
-libebl_%.map: Makefile
- echo 'ELFUTILS_$(PACKAGE_VERSION) { global: $*_init; local: *; };' > $@
-
-
-i386_SRCS = i386_init.c i386_symbol.c i386_corenote.c \
- i386_retval.c i386_regs.c i386_auxv.c
+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
+cpu_i386 = ../libcpu/libcpu_i386.a
libebl_i386_pic_a_SOURCES = $(i386_SRCS)
am_libebl_i386_pic_a_OBJECTS = $(i386_SRCS:.c=.os)
-sh_SRCS = sh_init.c sh_symbol.c
+sh_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_retval.c x86_64_regs.c i386_auxv.c
+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
+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)
@@ -88,11 +67,12 @@ libebl_ia64_pic_a_SOURCES = $(ia64_SRCS)
am_libebl_ia64_pic_a_OBJECTS = $(ia64_SRCS:.c=.os)
alpha_SRCS = alpha_init.c alpha_symbol.c alpha_retval.c alpha_regs.c \
- alpha_corenote.c
+ alpha_corenote.c alpha_auxv.c
libebl_alpha_pic_a_SOURCES = $(alpha_SRCS)
am_libebl_alpha_pic_a_OBJECTS = $(alpha_SRCS:.c=.os)
-arm_SRCS = arm_init.c arm_symbol.c
+arm_SRCS = arm_init.c arm_symbol.c arm_regs.c arm_corenote.c \
+ arm_auxv.c arm_attrs.c arm_retval.c
libebl_arm_pic_a_SOURCES = $(arm_SRCS)
am_libebl_arm_pic_a_OBJECTS = $(arm_SRCS:.c=.os)
@@ -102,12 +82,12 @@ 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_corenote.c ppc_auxv.c ppc_attrs.c ppc_syscall.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
+ ppc64_corenote.c ppc_regs.c ppc_auxv.c ppc_attrs.c ppc_syscall.c
libebl_ppc64_pic_a_SOURCES = $(ppc64_SRCS)
am_libebl_ppc64_pic_a_OBJECTS = $(ppc64_SRCS:.c=.os)
@@ -116,12 +96,18 @@ libebl_s390_pic_a_SOURCES = $(s390_SRCS)
am_libebl_s390_pic_a_OBJECTS = $(s390_SRCS:.c=.os)
-%.os: %.c
- if $(COMPILE) -c -o $@ -fpic -DPIC -DSHARED -MT $@ -MD -MP \
- -MF "$(DEPDIR)/$*.Tpo" `test -f '$<' || echo '$(srcdir)/'`$<; \
- then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
- else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
- fi
+libebl_%.so libebl_%.map: libebl_%_pic.a $(libelf) $(libdw)
+ @rm -f $(@:.so=.map)
+ echo 'ELFUTILS_$(PACKAGE_VERSION) { global: $*_init; local: *; };' \
+ > $(@:.so=.map)
+ $(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)
+ $(textrel_check)
+
+libebl_i386.so: $(cpu_i386)
+libebl_x86_64.so: $(cpu_x86_64)
install: install-am install-ebl-modules
install-ebl-modules:
@@ -138,9 +124,9 @@ uninstall: uninstall-am
done
rmdir --ignore-fail-on-non-empty $(DESTDIR)$(libdir)/$(LIBEBL_SUBDIR)
-noinst_HEADERS = libebl_CPU.h common-reloc.c linux-core-note.c
+noinst_HEADERS = libebl_CPU.h common-reloc.c linux-core-note.c x86_corenote.c
EXTRA_DIST = $(foreach m,$(modules),$($(m)_SRCS)) $(modules:=_reloc.def)
-CLEANFILES = *.gcno *.gcda \
- $(foreach m,$(modules),\
- libebl_$(m).so $(am_libebl_$(m)_pic_a_OBJECTS))
+CLEANFILES += $(foreach m,$(modules),\
+ libebl_$(m).map libebl_$(m).so \
+ $(am_libebl_$(m)_pic_a_OBJECTS))
diff --git a/backends/alpha_auxv.c b/backends/alpha_auxv.c
new file mode 100644
index 00000000..38a8bcdf
--- /dev/null
+++ b/backends/alpha_auxv.c
@@ -0,0 +1,46 @@
+/* Alpha-specific auxv handling.
+ Copyright (C) 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#define BACKEND alpha_
+#include "libebl_CPU.h"
+
+int
+EBLHOOK(auxv_info) (GElf_Xword a_type, const char **name, const char **format)
+{
+ if (a_type != AT_HWCAP)
+ return 0;
+
+ *name = "HWCAP";
+ *format = "b"
+ "bwx\0" "fix\0" "cix\0" "0x08\0"
+ "0x10\0" "0x20\0" "0x40\0" "0x80\0"
+ "max\0" "precise_trap\0"
+ "\0";
+ return 1;
+}
diff --git a/backends/alpha_init.c b/backends/alpha_init.c
index 794d412a..1ca99abc 100644
--- a/backends/alpha_init.c
+++ b/backends/alpha_init.c
@@ -1,5 +1,5 @@
/* Initialization of Alpha specific backend library.
- Copyright (C) 2002, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2002, 2005, 2006, 2007, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -55,8 +55,10 @@ alpha_init (elf, machine, eh, ehlen)
HOOK (eh, reloc_simple_type);
HOOK (eh, return_value_location);
HOOK (eh, machine_section_flag_check);
+ HOOK (eh, check_special_section);
HOOK (eh, register_info);
HOOK (eh, core_note);
+ HOOK (eh, auxv_info);
eh->sysvhash_entrysize = sizeof (Elf64_Xword);
return MODVERSION;
diff --git a/backends/alpha_symbol.c b/backends/alpha_symbol.c
index dc3cce56..aa45c61e 100644
--- a/backends/alpha_symbol.c
+++ b/backends/alpha_symbol.c
@@ -1,5 +1,5 @@
/* Alpha specific symbolic name handling.
- Copyright (C) 2002, 2005, 2007 Red Hat, Inc.
+ Copyright (C) 2002,2005,2007,2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -77,3 +77,47 @@ alpha_machine_section_flag_check (GElf_Xword sh_flags)
{
return (sh_flags &~ (SHF_ALPHA_GPREL)) == 0;
}
+
+bool
+alpha_check_special_section (Ebl *ebl,
+ int ndx __attribute__ ((unused)),
+ const GElf_Shdr *shdr,
+ const char *sname __attribute__ ((unused)))
+{
+ if ((shdr->sh_flags
+ & (SHF_WRITE | SHF_EXECINSTR)) == (SHF_WRITE | SHF_EXECINSTR)
+ && shdr->sh_addr != 0)
+ {
+ /* This is ordinarily flagged, but is valid for an old-style PLT.
+
+ Look for the SHT_DYNAMIC section and the DT_PLTGOT tag in it.
+ Its d_ptr should match the .plt section's sh_addr. */
+
+ Elf_Scn *scn = NULL;
+ while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
+ {
+ GElf_Shdr scn_shdr;
+ if (likely (gelf_getshdr (scn, &scn_shdr) != NULL)
+ && scn_shdr.sh_type == SHT_DYNAMIC
+ && scn_shdr.sh_entsize != 0)
+ {
+ GElf_Addr pltgot = 0;
+ Elf_Data *data = elf_getdata (scn, NULL);
+ if (data != NULL)
+ for (size_t i = 0; i < data->d_size / scn_shdr.sh_entsize; ++i)
+ {
+ GElf_Dyn dyn;
+ if (unlikely (gelf_getdyn (data, i, &dyn) == NULL))
+ break;
+ if (dyn.d_tag == DT_PLTGOT)
+ pltgot = dyn.d_un.d_ptr;
+ else if (dyn.d_tag == DT_ALPHA_PLTRO && dyn.d_un.d_val != 0)
+ return false; /* This PLT should not be writable. */
+ }
+ return pltgot == shdr->sh_addr;
+ }
+ }
+ }
+
+ return false;
+}
diff --git a/backends/arm_attrs.c b/backends/arm_attrs.c
new file mode 100644
index 00000000..84f4d451
--- /dev/null
+++ b/backends/arm_attrs.c
@@ -0,0 +1,242 @@
+/* Object attribute tags for ARM.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+#include <dwarf.h>
+
+#define BACKEND arm_
+#include "libebl_CPU.h"
+
+#define KNOWN_VALUES(...) do \
+ { \
+ static const char *table[] = { __VA_ARGS__ }; \
+ if (value < sizeof table / sizeof table[0]) \
+ *value_name = table[value]; \
+ } while (0)
+
+bool
+arm_check_object_attribute (ebl, vendor, tag, value, tag_name, value_name)
+ Ebl *ebl __attribute__ ((unused));
+ const char *vendor;
+ int tag;
+ uint64_t value __attribute__ ((unused));
+ const char **tag_name;
+ const char **value_name;
+{
+ if (!strcmp (vendor, "aeabi"))
+ switch (tag)
+ {
+ case 4:
+ *tag_name = "CPU_raw_name";
+ return true;
+ case 5:
+ *tag_name = "CPU_name";
+ return true;
+ case 6:
+ *tag_name = "CPU_arch";
+ KNOWN_VALUES ("Pre-v4",
+ "v4",
+ "v4T",
+ "v5T",
+ "v5TE",
+ "v5TEJ",
+ "v6",
+ "v6KZ",
+ "v6T2",
+ "v6K",
+ "v7",
+ "v6-M",
+ "v6S-M");
+ return true;
+ case 7:
+ *tag_name = "CPU_arch_profile";
+ switch (value)
+ {
+ case 'A':
+ *value_name = "Application";
+ break;
+ case 'R':
+ *value_name = "Realtime";
+ break;
+ case 'M':
+ *value_name = "Microcontroller";
+ break;
+ }
+ return true;
+ case 8:
+ *tag_name = "ARM_ISA_use";
+ KNOWN_VALUES ("No", "Yes");
+ return true;
+ case 9:
+ *tag_name = "THUMB_ISA_use";
+ KNOWN_VALUES ("No", "Thumb-1", "Thumb-2");
+ return true;
+ case 10:
+ *tag_name = "VFP_arch";
+ KNOWN_VALUES ("No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16");
+ return true;
+ case 11:
+ *tag_name = "WMMX_arch";
+ KNOWN_VALUES ("No", "WMMXv1", "WMMXv2");
+ return true;
+ case 12:
+ *tag_name = "Advanced_SIMD_arch";
+ KNOWN_VALUES ("No", "NEONv1");
+ return true;
+ case 13:
+ *tag_name = "PCS_config";
+ KNOWN_VALUES ("None",
+ "Bare platform",
+ "Linux application",
+ "Linux DSO",
+ "PalmOS 2004",
+ "PalmOS (reserved)",
+ "SymbianOS 2004",
+ "SymbianOS (reserved)");
+ return true;
+ case 14:
+ *tag_name = "ABI_PCS_R9_use";
+ KNOWN_VALUES ("V6", "SB", "TLS", "Unused");
+ return true;
+ case 15:
+ *tag_name = "ABI_PCS_RW_data";
+ KNOWN_VALUES ("Absolute", "PC-relative", "SB-relative", "None");
+ return true;
+ case 16:
+ *tag_name = "ABI_PCS_RO_data";
+ KNOWN_VALUES ("Absolute", "PC-relative", "None");
+ return true;
+ case 17:
+ *tag_name = "ABI_PCS_GOT_use";
+ KNOWN_VALUES ("None", "direct", "GOT-indirect");
+ return true;
+ case 18:
+ *tag_name = "ABI_PCS_wchar_t";
+ return true;
+ case 19:
+ *tag_name = "ABI_FP_rounding";
+ KNOWN_VALUES ("Unused", "Needed");
+ return true;
+ case 20:
+ *tag_name = "ABI_FP_denormal";
+ KNOWN_VALUES ("Unused", "Needed", "Sign only");
+ return true;
+ case 21:
+ *tag_name = "ABI_FP_exceptions";
+ KNOWN_VALUES ("Unused", "Needed");
+ return true;
+ case 22:
+ *tag_name = "ABI_FP_user_exceptions";
+ KNOWN_VALUES ("Unused", "Needed");
+ return true;
+ case 23:
+ *tag_name = "ABI_FP_number_model";
+ KNOWN_VALUES ("Unused", "Finite", "RTABI", "IEEE 754");
+ return true;
+ case 24:
+ *tag_name = "ABI_align8_needed";
+ KNOWN_VALUES ("No", "Yes", "4-byte");
+ return true;
+ case 25:
+ *tag_name = "ABI_align8_preserved";
+ KNOWN_VALUES ("No", "Yes, except leaf SP", "Yes");
+ return true;
+ case 26:
+ *tag_name = "ABI_enum_size";
+ KNOWN_VALUES ("Unused", "small", "int", "forced to int");
+ return true;
+ case 27:
+ *tag_name = "ABI_HardFP_use";
+ KNOWN_VALUES ("as VFP_arch", "SP only", "DP only", "SP and DP");
+ return true;
+ case 28:
+ *tag_name = "ABI_VFP_args";
+ KNOWN_VALUES ("AAPCS", "VFP registers", "custom");
+ return true;
+ case 29:
+ *tag_name = "ABI_WMMX_args";
+ KNOWN_VALUES ("AAPCS", "WMMX registers", "custom");
+ return true;
+ case 30:
+ *tag_name = "ABI_optimization_goals";
+ KNOWN_VALUES ("None",
+ "Prefer Speed",
+ "Aggressive Speed",
+ "Prefer Size",
+ "Aggressive Size",
+ "Prefer Debug",
+ "Aggressive Debug");
+ return true;
+ case 31:
+ *tag_name = "ABI_FP_optimization_goals";
+ KNOWN_VALUES ("None",
+ "Prefer Speed",
+ "Aggressive Speed",
+ "Prefer Size",
+ "Aggressive Size",
+ "Prefer Accuracy",
+ "Aggressive Accuracy");
+ return true;
+ case 34:
+ *tag_name = "CPU_unaligned_access";
+ KNOWN_VALUES ("None", "v6");
+ return true;
+ case 36:
+ *tag_name = "VFP_HP_extension";
+ KNOWN_VALUES ("Not Allowed", "Allowed");
+ return true;
+ case 38:
+ *tag_name = "ABI_FP_16bit_format";
+ KNOWN_VALUES ("None", "IEEE 754", "Alternative Format");
+ return true;
+ case 64:
+ *tag_name = "nodefaults";
+ return true;
+ case 65:
+ *tag_name = "also_compatible_with";
+ return true;
+ case 66:
+ *tag_name = "T2EE_use";
+ KNOWN_VALUES ("Not Allowed", "Allowed");
+ return true;
+ case 67:
+ *tag_name = "conformance";
+ return true;
+ case 68:
+ *tag_name = "Virtualization_use";
+ KNOWN_VALUES ("Not Allowed", "Allowed");
+ return true;
+ case 70:
+ *tag_name = "MPextension_use";
+ KNOWN_VALUES ("Not Allowed", "Allowed");
+ return true;
+ }
+
+ return false;
+}
diff --git a/backends/arm_auxv.c b/backends/arm_auxv.c
new file mode 100644
index 00000000..728f940d
--- /dev/null
+++ b/backends/arm_auxv.c
@@ -0,0 +1,46 @@
+/* ARM-specific auxv handling.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#define BACKEND arm_
+#include "libebl_CPU.h"
+
+int
+EBLHOOK(auxv_info) (GElf_Xword a_type, const char **name, const char **format)
+{
+ if (a_type != AT_HWCAP)
+ return 0;
+
+ *name = "HWCAP";
+ *format = "b"
+ "swp\0" "half\0" "thumb\0" "26bit\0"
+ "fast-mult\0" "fpa\0" "vfp\0" "edsp\0"
+ "java\0" "iwmmxt\0"
+ "\0";
+ return 1;
+}
diff --git a/backends/arm_corenote.c b/backends/arm_corenote.c
new file mode 100644
index 00000000..6f2d3a3e
--- /dev/null
+++ b/backends/arm_corenote.c
@@ -0,0 +1,73 @@
+/* ARM specific core note handling.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#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 arm_
+#include "libebl_CPU.h"
+
+
+static const Ebl_Register_Location prstatus_regs[] =
+ {
+ { .offset = 0, .regno = 0, .count = 16, .bits = 32 }, /* r0..r15 */
+ { .offset = 16 * 4, .regno = 128, .count = 1, .bits = 32 }, /* cpsr */
+ };
+#define PRSTATUS_REGS_SIZE (18 * 4)
+
+#define PRSTATUS_REGSET_ITEMS \
+ { \
+ .name = "orig_r0", .type = ELF_T_SWORD, .format = 'd', \
+ .offset = offsetof (struct EBLHOOK(prstatus), pr_reg) + (4 * 17), \
+ .group = "register" \
+ }
+
+static const Ebl_Register_Location fpregset_regs[] =
+ {
+ { .offset = 0, .regno = 96, .count = 8, .bits = 96 }, /* f0..f7 */
+ };
+#define FPREGSET_SIZE 140
+
+#define ULONG uint32_t
+#define PID_T int32_t
+#define UID_T uint16_t
+#define GID_T uint16_t
+#define ALIGN_ULONG 4
+#define ALIGN_PID_T 4
+#define ALIGN_UID_T 2
+#define ALIGN_GID_T 2
+#define TYPE_ULONG ELF_T_WORD
+#define TYPE_PID_T ELF_T_SWORD
+#define TYPE_UID_T ELF_T_HALF
+#define TYPE_GID_T ELF_T_HALF
+
+#include "linux-core-note.c"
diff --git a/backends/arm_init.c b/backends/arm_init.c
index 172af198..15c0ee67 100644
--- a/backends/arm_init.c
+++ b/backends/arm_init.c
@@ -1,5 +1,5 @@
/* Initialization of Arm specific backend library.
- Copyright (C) 2002, 2005 Red Hat, Inc.
+ Copyright (C) 2002, 2005, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -50,7 +50,15 @@ arm_init (elf, machine, eh, ehlen)
/* We handle it. */
eh->name = "ARM";
arm_init_reloc (eh);
+ HOOK (eh, segment_type_name);
+ HOOK (eh, section_type_name);
+ HOOK (eh, machine_flag_check);
HOOK (eh, reloc_simple_type);
+ HOOK (eh, register_info);
+ HOOK (eh, core_note);
+ HOOK (eh, auxv_info);
+ HOOK (eh, check_object_attribute);
+ HOOK (eh, return_value_location);
return MODVERSION;
}
diff --git a/backends/arm_regs.c b/backends/arm_regs.c
new file mode 100644
index 00000000..0a9536d4
--- /dev/null
+++ b/backends/arm_regs.c
@@ -0,0 +1,117 @@
+/* Register names and numbers for ARM DWARF.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+#include <dwarf.h>
+
+#define BACKEND arm_
+#include "libebl_CPU.h"
+
+ssize_t
+arm_register_info (Ebl *ebl __attribute__ ((unused)),
+ int regno, char *name, size_t namelen,
+ const char **prefix, const char **setname,
+ int *bits, int *type)
+{
+ if (name == NULL)
+ return 320;
+
+ if (regno < 0 || regno > 320 || namelen < 5)
+ return -1;
+
+ *prefix = NULL;
+ *bits = 32;
+ *type = DW_ATE_signed;
+ *setname = "integer";
+
+ switch (regno)
+ {
+ case 0 ... 9:
+ name[0] = 'r';
+ name[1] = regno + '0';
+ namelen = 2;
+ break;
+
+ case 10 ... 12:
+ name[0] = 'r';
+ name[1] = '1';
+ name[2] = regno % 10 + '0';
+ namelen = 3;
+ break;
+
+ case 13 ... 15:
+ *type = DW_ATE_address;
+ name[0] = "slp"[regno - 13];
+ name[1] = "prc"[regno - 13];
+ namelen = 2;
+ break;
+
+ case 16 + 0 ... 16 + 7:
+ regno += 96 - 16;
+ /* Fall through. */
+ case 96 + 0 ... 96 + 7:
+ *setname = "FPA";
+ *type = DW_ATE_float;
+ *bits = 96;
+ name[0] = 'f';
+ name[1] = regno - 96 + '0';
+ namelen = 2;
+ break;
+
+ case 128:
+ *type = DW_ATE_unsigned;
+ return stpcpy (name, "spsr") + 1 - name;
+
+ case 256 + 0 ... 256 + 9:
+ *setname = "VFP";
+ *type = DW_ATE_float;
+ *bits = 64;
+ name[0] = 'd';
+ name[1] = regno - 256 + '0';
+ namelen = 2;
+ break;
+
+ case 256 + 10 ... 256 + 31:
+ *setname = "VFP";
+ *type = DW_ATE_float;
+ *bits = 64;
+ name[0] = 'd';
+ name[1] = (regno - 256) / 10 + '0';
+ name[2] = (regno - 256) % 10 + '0';
+ namelen = 3;
+ break;
+
+ default:
+ *setname = NULL;
+ return 0;
+ }
+
+ name[namelen++] = '\0';
+ return namelen;
+}
diff --git a/backends/arm_reloc.def b/backends/arm_reloc.def
index c5a72cc0..4dc54b7e 100644
--- a/backends/arm_reloc.def
+++ b/backends/arm_reloc.def
@@ -1,5 +1,5 @@
/* List the relocation types for arm. -*- C -*-
- Copyright (C) 2005 Red Hat, Inc.
+ Copyright (C) 2005-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -26,8 +26,8 @@
/* NAME, REL|EXEC|DYN */
RELOC_TYPE (NONE, REL) /* It really is used in ET_REL on ARM. */
-RELOC_TYPE (PC24, REL)
-RELOC_TYPE (ABS32, REL)
+RELOC_TYPE (PC24, REL|EXEC|DYN)
+RELOC_TYPE (ABS32, REL|EXEC|DYN)
RELOC_TYPE (REL32, REL)
RELOC_TYPE (PC13, REL)
RELOC_TYPE (ABS16, REL)
diff --git a/backends/arm_retval.c b/backends/arm_retval.c
new file mode 100644
index 00000000..191cb174
--- /dev/null
+++ b/backends/arm_retval.c
@@ -0,0 +1,137 @@
+/* Function return value location for ARM EABI.
+ Copyright (C) 2009-2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+#include <dwarf.h>
+
+#define BACKEND arm_
+#include "libebl_CPU.h"
+
+
+/* r0, or pair r0, r1, or aggregate up to r0-r3. */
+static const Dwarf_Op loc_intreg[] =
+ {
+ { .atom = DW_OP_reg0 }, { .atom = DW_OP_piece, .number = 4 },
+ { .atom = DW_OP_reg1 }, { .atom = DW_OP_piece, .number = 4 },
+ { .atom = DW_OP_reg2 }, { .atom = DW_OP_piece, .number = 4 },
+ { .atom = DW_OP_reg3 }, { .atom = DW_OP_piece, .number = 4 },
+ };
+#define nloc_intreg 1
+#define nloc_intregs(n) (2 * (n))
+
+/* The return value is a structure and is actually stored in stack space
+ passed in a hidden argument by the caller. But, the compiler
+ helpfully returns the address of that space in r0. */
+static const Dwarf_Op loc_aggregate[] =
+ {
+ { .atom = DW_OP_breg0, .number = 0 }
+ };
+#define nloc_aggregate 1
+
+
+int
+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_Word size;
+ switch (tag)
+ {
+ case -1:
+ return -1;
+
+ case DW_TAG_subrange_type:
+ if (! dwarf_hasattr_integrate (typedie, DW_AT_byte_size))
+ {
+ attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
+ typedie = dwarf_formref_die (attr, &die_mem);
+ tag = dwarf_tag (typedie);
+ }
+ /* Fall through. */
+
+ case DW_TAG_base_type:
+ 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;
+
+ case DW_TAG_structure_type:
+ case DW_TAG_class_type:
+ case DW_TAG_union_type:
+ case DW_TAG_array_type:
+ if (dwarf_aggregate_size (typedie, &size) == 0
+ && size > 0 && size <= 4)
+ goto intreg;
+ goto aggregate;
+ }
+
+ /* XXX We don't have a good way to return specific errors from ebl calls.
+ This value means we do not understand the type, but it is well-formed
+ DWARF and might be valid. */
+ return -2;
+}
diff --git a/backends/arm_symbol.c b/backends/arm_symbol.c
index 6d2f56d3..e08874bb 100644
--- a/backends/arm_symbol.c
+++ b/backends/arm_symbol.c
@@ -1,7 +1,6 @@
/* Arm specific symbolic name handling.
- Copyright (C) 2002, 2005 Red Hat, Inc.
+ Copyright (C) 2002-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
- Written by Ulrich Drepper <drepper@redhat.com>, 2002.
Red Hat elfutils is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by the
@@ -34,6 +33,76 @@
#define BACKEND arm_
#include "libebl_CPU.h"
+
+const char *
+arm_segment_type_name (int segment, char *buf __attribute__ ((unused)),
+ size_t len __attribute__ ((unused)))
+{
+ switch (segment)
+ {
+ case PT_ARM_EXIDX:
+ return "ARM_EXIDX";
+ }
+ return NULL;
+}
+
+/* Return symbolic representation of section type. */
+const char *
+arm_section_type_name (int type,
+ char *buf __attribute__ ((unused)),
+ size_t len __attribute__ ((unused)))
+{
+ switch (type)
+ {
+ case SHT_ARM_EXIDX:
+ return "ARM_EXIDX";
+ case SHT_ARM_PREEMPTMAP:
+ return "ARM_PREEMPTMAP";
+ case SHT_ARM_ATTRIBUTES:
+ return "ARM_ATTRIBUTES";
+ }
+
+ return NULL;
+}
+
+/* Check whether machine flags are valid. */
+bool
+arm_machine_flag_check (GElf_Word flags)
+{
+ switch (flags & EF_ARM_EABIMASK)
+ {
+ case EF_ARM_EABI_UNKNOWN:
+ case EF_ARM_EABI_VER1:
+ case EF_ARM_EABI_VER2:
+ case EF_ARM_EABI_VER3:
+ case EF_ARM_EABI_VER4:
+ case EF_ARM_EABI_VER5:
+ break;
+ default:
+ return false;
+ }
+
+ return ((flags &~ (EF_ARM_EABIMASK
+ | EF_ARM_RELEXEC
+ | EF_ARM_HASENTRY
+ | EF_ARM_INTERWORK
+ | EF_ARM_APCS_26
+ | EF_ARM_APCS_FLOAT
+ | EF_ARM_PIC
+ | EF_ARM_ALIGN8
+ | EF_ARM_NEW_ABI
+ | EF_ARM_OLD_ABI
+ | EF_ARM_SOFT_FLOAT
+ | EF_ARM_VFP_FLOAT
+ | EF_ARM_MAVERICK_FLOAT
+ | EF_ARM_SYMSARESORTED
+ | EF_ARM_DYNSYMSUSESEGIDX
+ | EF_ARM_MAPSYMSFIRST
+ | EF_ARM_EABIMASK
+ | EF_ARM_BE8
+ | EF_ARM_LE8)) == 0);
+}
+
/* Check for the simple reloc types. */
Elf_Type
arm_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type)
diff --git a/backends/i386_cfi.c b/backends/i386_cfi.c
new file mode 100644
index 00000000..77478f7e
--- /dev/null
+++ b/backends/i386_cfi.c
@@ -0,0 +1,65 @@
+/* i386 ABI-specified defaults for DWARF CFI.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <dwarf.h>
+
+#define BACKEND i386_
+#include "libebl_CPU.h"
+
+int
+i386_abi_cfi (Ebl *ebl __attribute__ ((unused)), Dwarf_CIE *abi_info)
+{
+ static const uint8_t abi_cfi[] =
+ {
+ /* Call-saved regs. */
+ DW_CFA_same_value, ULEB128_7 (3), /* %ebx */
+ DW_CFA_same_value, ULEB128_7 (5), /* %ebp */
+ DW_CFA_same_value, ULEB128_7 (6), /* %esi */
+ DW_CFA_same_value, ULEB128_7 (7), /* %edi */
+
+ /* The CFA is the SP. */
+ DW_CFA_val_offset, ULEB128_7 (4), ULEB128_7 (0),
+
+ /* Segment registers are call-saved if ever used at all. */
+ DW_CFA_same_value, ULEB128_7 (40), /* %es */
+ DW_CFA_same_value, ULEB128_7 (41), /* %cs */
+ DW_CFA_same_value, ULEB128_7 (42), /* %ss */
+ DW_CFA_same_value, ULEB128_7 (43), /* %ds */
+ DW_CFA_same_value, ULEB128_7 (44), /* %fs */
+ DW_CFA_same_value, ULEB128_7 (45), /* %gs */
+ };
+
+ 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 = 8; /* %eip */
+
+ return 0;
+}
diff --git a/backends/i386_corenote.c b/backends/i386_corenote.c
index f6c4c1de..40b6a24e 100644
--- a/backends/i386_corenote.c
+++ b/backends/i386_corenote.c
@@ -1,5 +1,5 @@
/* i386 specific core note handling.
- Copyright (C) 2007 Red Hat, Inc.
+ Copyright (C) 2007-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -101,6 +101,35 @@ static const Ebl_Register_Location prxfpreg_regs[] =
};
#define EXTRA_NOTES \
- EXTRA_REGSET (NT_PRFPXREG, 512, prxfpreg_regs)
+ EXTRA_REGSET (NT_PRXFPREG, 512, prxfpreg_regs) \
+ case NT_386_TLS: \
+ return tls_info (nhdr->n_descsz, regs_offset, nregloc, reglocs, \
+ nitems, items); \
+ EXTRA_NOTES_IOPERM
+static const Ebl_Core_Item tls_items[] =
+ {
+ { .type = ELF_T_WORD, .offset = 0x0, .format = 'd', .name = "index" },
+ { .type = ELF_T_WORD, .offset = 0x4, .format = 'x', .name = "base" },
+ { .type = ELF_T_WORD, .offset = 0x8, .format = 'x', .name = "limit" },
+ { .type = ELF_T_WORD, .offset = 0xc, .format = 'x', .name = "flags" },
+ };
+
+static int
+tls_info (GElf_Word descsz, GElf_Word *regs_offset,
+ size_t *nregloc, const Ebl_Register_Location **reglocs,
+ size_t *nitems, const Ebl_Core_Item **items)
+{
+ if (descsz % 16 != 0)
+ return 0;
+
+ *regs_offset = 0;
+ *nregloc = 0;
+ *reglocs = NULL;
+ *nitems = sizeof tls_items / sizeof tls_items[0];
+ *items = tls_items;
+ return 1;
+}
+
+#include "x86_corenote.c"
#include "linux-core-note.c"
diff --git a/backends/i386_init.c b/backends/i386_init.c
index f25e1eb9..be9bbf90 100644
--- a/backends/i386_init.c
+++ b/backends/i386_init.c
@@ -1,5 +1,5 @@
/* Initialization of i386 specific backend library.
- Copyright (C) 2000, 2001, 2002, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2000-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2000.
@@ -56,7 +56,10 @@ i386_init (elf, machine, eh, ehlen)
HOOK (eh, debugscn_p);
HOOK (eh, return_value_location);
HOOK (eh, register_info);
+ HOOK (eh, syscall_abi);
HOOK (eh, auxv_info);
+ HOOK (eh, disasm);
+ HOOK (eh, abi_cfi);
return MODVERSION;
}
diff --git a/backends/i386_reloc.def b/backends/i386_reloc.def
index d8116f3d..1befd1b6 100644
--- a/backends/i386_reloc.def
+++ b/backends/i386_reloc.def
@@ -1,5 +1,5 @@
/* List the relocation types for i386. -*- C -*-
- Copyright (C) 2000, 2001, 2002, 2003, 2005 Red Hat, Inc.
+ Copyright (C) 2000, 2001, 2002, 2003, 2005, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -61,3 +61,7 @@ RELOC_TYPE (TLS_LE_32, REL)
RELOC_TYPE (TLS_DTPMOD32, EXEC|DYN)
RELOC_TYPE (TLS_DTPOFF32, EXEC|DYN)
RELOC_TYPE (TLS_TPOFF32, EXEC|DYN)
+RELOC_TYPE (TLS_GOTDESC, REL)
+RELOC_TYPE (TLS_DESC_CALL, REL)
+RELOC_TYPE (TLS_DESC, EXEC)
+RELOC_TYPE (IRELATIVE, EXEC|DYN)
diff --git a/backends/i386_syscall.c b/backends/i386_syscall.c
new file mode 100644
index 00000000..4d6e438c
--- /dev/null
+++ b/backends/i386_syscall.c
@@ -0,0 +1,47 @@
+/* Linux/i386 system call ABI in DWARF register numbers.
+ Copyright (C) 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#define BACKEND i386_
+#include "libebl_CPU.h"
+
+int
+i386_syscall_abi (Ebl *ebl __attribute__ ((unused)),
+ int *sp, int *pc, int *callno, int args[6])
+{
+ *sp = 4; /* %esp */
+ *pc = 8; /* %eip */
+ *callno = 0; /* %eax */
+ args[0] = 3; /* %ebx */
+ args[1] = 1; /* %ecx */
+ args[2] = 2; /* %edx */
+ args[3] = 6; /* %esi */
+ args[4] = 7; /* %edi */
+ args[5] = 5; /* %ebp */
+ return 0;
+}
diff --git a/backends/ia64_retval.c b/backends/ia64_retval.c
index 238cd9ef..7645c3c8 100644
--- a/backends/ia64_retval.c
+++ b/backends/ia64_retval.c
@@ -1,5 +1,5 @@
/* Function return value location for IA64 ABI.
- Copyright (C) 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2006-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -89,7 +89,8 @@ static const Dwarf_Op loc_aggregate[] =
/* If this type is an HFA small enough to be returned in FP registers,
return the number of registers to use. Otherwise 9, or -1 for errors. */
static int
-hfa_type (Dwarf_Die *typedie, const Dwarf_Op **locp, int fpregs_used)
+hfa_type (Dwarf_Die *typedie, Dwarf_Word size,
+ const Dwarf_Op **locp, int fpregs_used)
{
/* Descend the type structure, counting elements and finding their types.
If we find a datum that's not an FP type (and not quad FP), punt.
@@ -114,10 +115,6 @@ hfa_type (Dwarf_Die *typedie, const Dwarf_Op **locp, int fpregs_used)
return -1;
case DW_TAG_base_type:;
- int size = dwarf_bytesize (typedie);
- if (size < 0)
- return -1;
-
Dwarf_Word encoding;
if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_encoding,
&attr_mem), &encoding) != 0)
@@ -178,9 +175,13 @@ hfa_type (Dwarf_Die *typedie, const Dwarf_Op **locp, int fpregs_used)
DW_AT_type,
&attr_mem),
&child_type_mem);
+ Dwarf_Word child_size;
+ if (dwarf_aggregate_size (child_typedie, &child_size) != 0)
+ return -1;
if (tag == DW_TAG_union_type)
{
- int used = hfa_type (child_typedie, locp, fpregs_used);
+ int used = hfa_type (child_typedie, child_size,
+ locp, fpregs_used);
if (used < 0 || used > 8)
return used;
if (used > max_used)
@@ -188,7 +189,8 @@ hfa_type (Dwarf_Die *typedie, const Dwarf_Op **locp, int fpregs_used)
}
else
{
- fpregs_used = hfa_type (child_typedie, locp, fpregs_used);
+ fpregs_used = hfa_type (child_typedie, child_size,
+ locp, fpregs_used);
if (fpregs_used < 0 || fpregs_used > 8)
return fpregs_used;
}
@@ -200,10 +202,7 @@ hfa_type (Dwarf_Die *typedie, const Dwarf_Op **locp, int fpregs_used)
}
break;
- case DW_TAG_array_type:;
- size = dwarf_bytesize (typedie);
- if (size < 0)
- return 9;
+ case DW_TAG_array_type:
if (size == 0)
break;
@@ -212,14 +211,16 @@ hfa_type (Dwarf_Die *typedie, const Dwarf_Op **locp, int fpregs_used)
= dwarf_formref_die (dwarf_attr_integrate (typedie, DW_AT_type,
&attr_mem),
&base_type_mem);
+ Dwarf_Word base_size;
+ if (dwarf_aggregate_size (base_typedie, &base_size) != 0)
+ return -1;
- int used = hfa_type (base_typedie, locp, 0);
+ int used = hfa_type (base_typedie, base_size, locp, 0);
if (used < 0 || used > 8)
return used;
if (size % (*locp)[1].number != 0)
return 0;
- size /= (*locp)[1].number;
- fpregs_used += used * size;
+ fpregs_used += used * (size / (*locp)[1].number);
break;
default:
@@ -346,13 +347,12 @@ ia64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
case DW_TAG_class_type:
case DW_TAG_union_type:
case DW_TAG_array_type:
- if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
- &attr_mem), &size) != 0)
+ if (dwarf_aggregate_size (typedie, &size) != 0)
return -1;
/* If this qualifies as an homogeneous floating-point aggregate
(HFA), then it should be returned in FP regs. */
- int nfpreg = hfa_type (typedie, locp, 0);
+ int nfpreg = hfa_type (typedie, size, locp, 0);
if (nfpreg < 0)
return nfpreg;
else if (nfpreg > 0 && nfpreg <= 8)
diff --git a/backends/ia64_symbol.c b/backends/ia64_symbol.c
index 2609db0f..1edef8b5 100644
--- a/backends/ia64_symbol.c
+++ b/backends/ia64_symbol.c
@@ -1,5 +1,5 @@
/* IA-64 specific symbolic name handling.
- Copyright (C) 2002, 2003, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2002-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -102,9 +102,9 @@ ia64_section_type_name (int type,
switch (type)
{
case SHT_IA_64_EXT:
- return "SHT_IA_64_EXT";
+ return "IA_64_EXT";
case SHT_IA_64_UNWIND:
- return "SHT_IA_64_UNWIND";
+ return "IA_64_UNWIND";
}
return NULL;
diff --git a/backends/linux-core-note.c b/backends/linux-core-note.c
index 3dc41373..9d01219c 100644
--- a/backends/linux-core-note.c
+++ b/backends/linux-core-note.c
@@ -1,5 +1,5 @@
/* Common core note type descriptions for Linux.
- Copyright (C) 2007 Red Hat, Inc.
+ Copyright (C) 2007-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -23,6 +23,8 @@
Network licensing program, please visit www.openinventionnetwork.com
<http://www.openinventionnetwork.com>. */
+#include <string.h>
+
/* The including CPU_corenote.c file provides prstatus_regs and
defines macros ULONG, [PUG]ID_T, and ALIGN_*, TYPE_*.
@@ -118,8 +120,8 @@ 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'),
+ FIELD (signal, ULONG, sigpend, 'B'),
+ FIELD (signal, ULONG, sighold, 'B'),
FIELD (identity, PID_T, pid, 'd', .thread_identifier = true),
FIELD (identity, PID_T, ppid, 'd'),
FIELD (identity, PID_T, pgrp, 'd'),
@@ -163,23 +165,61 @@ static const Ebl_Core_Item prpsinfo_items[] =
FIELD (command, CHAR, psargs, 's', .count = PRARGSZ),
};
+static const Ebl_Core_Item vmcoreinfo_items[] =
+ {
+ {
+ .type = ELF_T_BYTE, .format = '\n'
+ }
+ };
+
#undef FIELD
int
-EBLHOOK(core_note) (n_type, descsz,
- regs_offset, nregloc, reglocs, nitems, items)
- GElf_Word n_type;
- GElf_Word descsz;
+EBLHOOK(core_note) (nhdr, name, regs_offset, nregloc, reglocs, nitems, items)
+ const GElf_Nhdr *nhdr;
+ const char *name;
GElf_Word *regs_offset;
size_t *nregloc;
const Ebl_Register_Location **reglocs;
size_t *nitems;
const Ebl_Core_Item **items;
{
- switch (n_type)
+ switch (nhdr->n_namesz)
+ {
+ case sizeof "CORE" - 1: /* Buggy old Linux kernels. */
+ if (memcmp (name, "CORE", nhdr->n_namesz) == 0)
+ break;
+ return 0;
+
+ case sizeof "CORE":
+ if (memcmp (name, "CORE", nhdr->n_namesz) == 0)
+ break;
+ /* Buggy old Linux kernels didn't terminate "LINUX".
+ Fall through. */
+
+ case sizeof "LINUX":
+ if (memcmp (name, "LINUX", nhdr->n_namesz) == 0)
+ break;
+ return 0;
+
+ case sizeof "VMCOREINFO":
+ if (nhdr->n_type != 0
+ || memcmp (name, "VMCOREINFO", sizeof "VMCOREINFO") != 0)
+ return 0;
+ *regs_offset = 0;
+ *nregloc = 0;
+ *nitems = 1;
+ *items = vmcoreinfo_items;
+ return 1;
+
+ default:
+ return 0;
+ }
+
+ switch (nhdr->n_type)
{
case NT_PRSTATUS:
- if (descsz != sizeof (struct EBLHOOK(prstatus)))
+ if (nhdr->n_descsz != sizeof (struct EBLHOOK(prstatus)))
return 0;
*regs_offset = offsetof (struct EBLHOOK(prstatus), pr_reg);
*nregloc = sizeof prstatus_regs / sizeof prstatus_regs[0];
@@ -189,7 +229,7 @@ EBLHOOK(core_note) (n_type, descsz,
return 1;
case NT_PRPSINFO:
- if (descsz != sizeof (struct EBLHOOK(prpsinfo)))
+ if (nhdr->n_descsz != sizeof (struct EBLHOOK(prpsinfo)))
return 0;
*regs_offset = 0;
*nregloc = 0;
@@ -200,7 +240,7 @@ EBLHOOK(core_note) (n_type, descsz,
#define EXTRA_REGSET(type, size, table) \
case type: \
- if (descsz != size) \
+ if (nhdr->n_descsz != size) \
return 0; \
*regs_offset = 0; \
*nregloc = sizeof table / sizeof table[0]; \
diff --git a/backends/ppc64_init.c b/backends/ppc64_init.c
index 02a592fd..3060a605 100644
--- a/backends/ppc64_init.c
+++ b/backends/ppc64_init.c
@@ -1,5 +1,5 @@
/* Initialization of PPC64 specific backend library.
- Copyright (C) 2004, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2004, 2005, 2006, 2007, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2004.
@@ -58,6 +58,7 @@ ppc64_init (elf, machine, eh, ehlen)
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);
diff --git a/backends/ppc64_retval.c b/backends/ppc64_retval.c
index 454897cc..a5fc0dc8 100644
--- a/backends/ppc64_retval.c
+++ b/backends/ppc64_retval.c
@@ -1,5 +1,5 @@
/* Function return value location for Linux/PPC64 ABI.
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -53,6 +53,13 @@ static const Dwarf_Op loc_fpreg[] =
#define nloc_fp2regs 4
#define nloc_fp4regs 8
+/* vr2. */
+static const Dwarf_Op loc_vmxreg[] =
+ {
+ { .atom = DW_OP_regx, .number = 1124 + 2 }
+ };
+#define nloc_vmxreg 1
+
/* The return value is a structure and is actually stored in stack space
passed in a hidden argument by the caller. But, the compiler
helpfully returns the address of that space in r3. */
@@ -150,11 +157,21 @@ ppc64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
*locp = loc_aggregate;
return nloc_aggregate;
- case DW_TAG_string_type:
case DW_TAG_array_type:
- if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
- &attr_mem), &size) == 0
- && size <= 8)
+ {
+ bool is_vector;
+ if (dwarf_formflag (dwarf_attr_integrate (typedie, DW_AT_GNU_vector,
+ &attr_mem), &is_vector) == 0
+ && is_vector)
+ {
+ *locp = loc_vmxreg;
+ return nloc_vmxreg;
+ }
+ }
+ /* Fall through. */
+
+ case DW_TAG_string_type:
+ if (dwarf_aggregate_size (typedie, &size) == 0 && size <= 8)
{
if (tag == DW_TAG_array_type)
{
diff --git a/backends/ppc_attrs.c b/backends/ppc_attrs.c
new file mode 100644
index 00000000..985df3f9
--- /dev/null
+++ b/backends/ppc_attrs.c
@@ -0,0 +1,86 @@
+/* Object attribute tags for PowerPC.
+ Copyright (C) 2008, 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+#include <dwarf.h>
+
+#define BACKEND ppc_
+#include "libebl_CPU.h"
+
+bool
+ppc_check_object_attribute (ebl, vendor, tag, value, tag_name, value_name)
+ Ebl *ebl __attribute__ ((unused));
+ const char *vendor;
+ int tag;
+ uint64_t value;
+ const char **tag_name;
+ const char **value_name;
+{
+ if (!strcmp (vendor, "gnu"))
+ switch (tag)
+ {
+ case 4:
+ *tag_name = "GNU_Power_ABI_FP";
+ static const char *fp_kinds[] =
+ {
+ "Hard or soft float",
+ "Hard float",
+ "Soft float",
+ };
+ if (value < sizeof fp_kinds / sizeof fp_kinds[0])
+ *value_name = fp_kinds[value];
+ return true;
+
+ case 8:
+ *tag_name = "GNU_Power_ABI_Vector";
+ static const char *vector_kinds[] =
+ {
+ "Any", "Generic", "AltiVec", "SPE"
+ };
+ if (value < sizeof vector_kinds / sizeof vector_kinds[0])
+ *value_name = vector_kinds[value];
+ return true;
+
+ case 12:
+ *tag_name = "GNU_Power_ABI_Struct_Return";
+ static const char *struct_return_kinds[] =
+ {
+ "Any", "r3/r4", "Memory"
+ };
+ if (value < sizeof struct_return_kinds / sizeof struct_return_kinds[0])
+ *value_name = struct_return_kinds[value];
+ return true;
+ }
+
+ return false;
+}
+
+__typeof (ppc_check_object_attribute)
+ ppc64_check_object_attribute
+ __attribute__ ((alias ("ppc_check_object_attribute")));
diff --git a/backends/ppc_corenote.c b/backends/ppc_corenote.c
index daadbb48..af0c46aa 100644
--- a/backends/ppc_corenote.c
+++ b/backends/ppc_corenote.c
@@ -1,5 +1,5 @@
/* PowerPC specific core note handling.
- Copyright (C) 2007 Red Hat, Inc.
+ Copyright (C) 2007, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -81,8 +81,19 @@ static const Ebl_Register_Location altivec_regs[] =
{ .offset = 33 * 16, .regno = 356, .count = 1, .bits = 32, .pad = 12 }
};
+static const Ebl_Register_Location spe_regs[] =
+ {
+ /* evr0-evr31
+ { .offset = 0, .regno = ???, .count = 32, .bits = 32 },
+ * acc *
+ { .offset = 32 * 4, .regno = ???, .count = 1, .bits = 64 }, */
+ /* spefscr */
+ { .offset = 34 * 4, .regno = 612, .count = 1, .bits = 32 }
+ };
+
#define EXTRA_NOTES \
- EXTRA_REGSET (NT_PPC_VMX, 34 * 16, altivec_regs)
+ EXTRA_REGSET (NT_PPC_VMX, 34 * 16, altivec_regs) \
+ EXTRA_REGSET (NT_PPC_SPE, 35 * 4, spe_regs)
#if BITS == 32
# define ULONG uint32_t
@@ -107,8 +118,13 @@ static const Ebl_Register_Location altivec_regs[] =
#define PRSTATUS_REGSET_ITEMS \
{ \
+ .name = "nip", .type = ELF_T_ADDR, .format = 'x', \
+ .offset = offsetof (struct EBLHOOK(prstatus), pr_reg[32]), \
+ .group = "register" \
+ }, \
+ { \
.name = "orig_gpr3", .type = TYPE_LONG, .format = 'd', \
- .offset = offsetof (struct EBLHOOK(prstatus), pr_reg) + (4 * 34), \
+ .offset = offsetof (struct EBLHOOK(prstatus), pr_reg[34]), \
.group = "register" \
}
diff --git a/backends/ppc_init.c b/backends/ppc_init.c
index 7edc8fad..523c6583 100644
--- a/backends/ppc_init.c
+++ b/backends/ppc_init.c
@@ -1,5 +1,5 @@
/* Initialization of PPC specific backend library.
- Copyright (C) 2004, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2004, 2005, 2006, 2007, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2004.
@@ -57,8 +57,10 @@ ppc_init (elf, machine, eh, ehlen)
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, check_object_attribute);
return MODVERSION;
}
diff --git a/backends/ppc_regs.c b/backends/ppc_regs.c
index cc7d84fa..637c25d1 100644
--- a/backends/ppc_regs.c
+++ b/backends/ppc_regs.c
@@ -42,7 +42,7 @@ ppc_register_info (Ebl *ebl __attribute__ ((unused)),
if (name == NULL)
return 1156;
- if (regno < 0 || regno > 1155 || namelen < 7)
+ if (regno < 0 || regno > 1155 || namelen < 8)
return -1;
*prefix = NULL;
@@ -58,7 +58,7 @@ ppc_register_info (Ebl *ebl __attribute__ ((unused)),
if (ebl->machine != EM_PPC64 && regno < 64)
*bits = 64;
}
- else if (regno == 67 || regno == 356 || regno >= 1124)
+ else if (regno == 67 || regno == 356 || regno == 612 || regno >= 1124)
{
*setname = "vector";
*bits = regno >= 1124 ? 128 : 32;
@@ -132,6 +132,8 @@ ppc_register_info (Ebl *ebl __attribute__ ((unused)),
return stpcpy (name, "dec") + 1 - name;
case 356:
return stpcpy (name, "vrsave") + 1 - name;
+ case 612:
+ return stpcpy (name, "spefscr") + 1 - name;
case 100:
if (*bits == 32)
return stpcpy (name, "mq") + 1 - name;
@@ -156,7 +158,8 @@ ppc_register_info (Ebl *ebl __attribute__ ((unused)),
break;
case 200 ... 355:
- case 357 ... 999:
+ case 357 ... 611:
+ case 613 ... 999:
name[0] = 's';
name[1] = 'p';
name[2] = 'r';
diff --git a/backends/ppc_retval.c b/backends/ppc_retval.c
index fa0e303c..15a0dba8 100644
--- a/backends/ppc_retval.c
+++ b/backends/ppc_retval.c
@@ -1,5 +1,5 @@
/* Function return value location for Linux/PPC ABI.
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005, 2006, 2007, 2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -38,14 +38,17 @@
#define SVR4_STRUCT_RETURN 0
-/* r3, or pair r3, r4. */
+/* r3, or pair r3, r4, or quad r3-r6. */
static const Dwarf_Op loc_intreg[] =
{
{ .atom = DW_OP_reg3 }, { .atom = DW_OP_piece, .number = 4 },
{ .atom = DW_OP_reg4 }, { .atom = DW_OP_piece, .number = 4 },
+ { .atom = DW_OP_reg5 }, { .atom = DW_OP_piece, .number = 4 },
+ { .atom = DW_OP_reg6 }, { .atom = DW_OP_piece, .number = 4 },
};
#define nloc_intreg 1
#define nloc_intregpair 4
+#define nloc_intregquad 8
/* f1. */
static const Dwarf_Op loc_fpreg[] =
@@ -54,6 +57,13 @@ static const Dwarf_Op loc_fpreg[] =
};
#define nloc_fpreg 1
+/* vr2. */
+static const Dwarf_Op loc_vmxreg[] =
+ {
+ { .atom = DW_OP_regx, .number = 1124 + 2 }
+ };
+#define nloc_vmxreg 1
+
/* The return value is a structure and is actually stored in stack space
passed in a hidden argument by the caller. But, the compiler
helpfully returns the address of that space in r3. */
@@ -64,6 +74,13 @@ static const Dwarf_Op loc_aggregate[] =
#define nloc_aggregate 1
+/* XXX We should check the SHT_GNU_ATTRIBUTES bits here (or in ppc_init). */
+static bool
+ppc_altivec_abi (void)
+{
+ return true;
+}
+
int
ppc_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
{
@@ -143,13 +160,32 @@ ppc_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
*locp = loc_aggregate;
return nloc_aggregate;
+ case DW_TAG_array_type:
+ {
+ bool is_vector;
+ if (dwarf_formflag (dwarf_attr_integrate (typedie, DW_AT_GNU_vector,
+ &attr_mem), &is_vector) == 0
+ && is_vector
+ && dwarf_aggregate_size (typedie, &size) == 0)
+ switch (size)
+ {
+ case 16:
+ if (ppc_altivec_abi ())
+ {
+ *locp = loc_vmxreg;
+ return nloc_vmxreg;
+ }
+ *locp = loc_intreg;
+ return nloc_intregquad;
+ }
+ }
+ /* Fall through. */
+
case DW_TAG_structure_type:
case DW_TAG_class_type:
case DW_TAG_union_type:
- case DW_TAG_array_type:
if (SVR4_STRUCT_RETURN
- && dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
- &attr_mem), &size) == 0
+ && dwarf_aggregate_size (typedie, &size) == 0
&& size > 0 && size <= 8)
goto intreg;
goto aggregate;
diff --git a/backends/ppc_syscall.c b/backends/ppc_syscall.c
new file mode 100644
index 00000000..23eff812
--- /dev/null
+++ b/backends/ppc_syscall.c
@@ -0,0 +1,50 @@
+/* Linux/PPC system call ABI in DWARF register numbers.
+ Copyright (C) 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#define BACKEND ppc_
+#include "libebl_CPU.h"
+
+int
+ppc_syscall_abi (Ebl *ebl __attribute__ ((unused)),
+ int *sp, int *pc, int *callno, int args[6])
+{
+ *sp = 1;
+ *pc = -1;
+ *callno = 0;
+ args[0] = 3;
+ args[1] = 4;
+ args[2] = 5;
+ args[3] = 6;
+ args[4] = 7;
+ args[5] = 8;
+ return 0;
+}
+
+__typeof (ppc_syscall_abi)
+ppc64_syscall_abi __attribute__ ((alias ("ppc_syscall_abi")));
diff --git a/backends/sh_corenote.c b/backends/sh_corenote.c
new file mode 100644
index 00000000..80bcd6f8
--- /dev/null
+++ b/backends/sh_corenote.c
@@ -0,0 +1,85 @@
+/* SH specific core note handling.
+ Copyright (C) 2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Contributed Matt Fleming <matt@console-pimps.org>.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#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 sh_
+#include "libebl_CPU.h"
+
+static const Ebl_Register_Location prstatus_regs[] =
+ {
+#define GR(at, n, dwreg) \
+ { .offset = at * 4, .regno = dwreg, .count = n, .bits = 32 }
+ GR (0, 16, 0), /* r0-r15 */
+ GR (16, 1, 16), /* pc */
+ GR (17, 1, 17), /* pr */
+ GR (18, 1, 22), /* sr */
+ GR (19, 1, 18), /* gbr */
+ GR (20, 1, 20), /* mach */
+ GR (21, 1, 21), /* macl */
+ /* 22, 1, tra */
+#undef GR
+ };
+#define PRSTATUS_REGS_SIZE (23 * 4)
+
+#define ULONG uint32_t
+#define PID_T int32_t
+#define UID_T uint16_t
+#define GID_T uint16_t
+#define ALIGN_ULONG 4
+#define ALIGN_PID_T 4
+#define ALIGN_UID_T 2
+#define ALIGN_GID_T 2
+#define TYPE_ULONG ELF_T_WORD
+#define TYPE_PID_T ELF_T_SWORD
+#define TYPE_UID_T ELF_T_HALF
+#define TYPE_GID_T ELF_T_HALF
+
+#define PRSTATUS_REGSET_ITEMS \
+ { \
+ .name = "tra", .type = ELF_T_ADDR, .format = 'x', \
+ .offset = offsetof (struct EBLHOOK(prstatus), pr_reg[22]), \
+ .group = "register" \
+ }
+
+static const Ebl_Register_Location fpregset_regs[] =
+ {
+ { .offset = 0, .regno = 25, .count = 16, .bits = 32 }, /* fr0-fr15 */
+ { .offset = 16, .regno = 87, .count = 16, .bits = 32 }, /* xf0-xf15 */
+ { .offset = 32, .regno = 24, .count = 1, .bits = 32 }, /* fpscr */
+ { .offset = 33, .regno = 23, .count = 1, .bits = 32 } /* fpul */
+ };
+#define FPREGSET_SIZE (50 * 4)
+
+#include "linux-core-note.c"
diff --git a/backends/sh_init.c b/backends/sh_init.c
index 02502ab2..7b36e7a3 100644
--- a/backends/sh_init.c
+++ b/backends/sh_init.c
@@ -51,6 +51,11 @@ sh_init (elf, machine, eh, ehlen)
eh->name = "Hitachi SH";
sh_init_reloc (eh);
HOOK (eh, reloc_simple_type);
+ HOOK (eh, gotpc_reloc_check);
+ HOOK (eh, machine_flag_check);
+ HOOK (eh, core_note);
+ HOOK (eh, register_info);
+ HOOK (eh, return_value_location);
return MODVERSION;
}
diff --git a/backends/sh_regs.c b/backends/sh_regs.c
new file mode 100644
index 00000000..fc6705e4
--- /dev/null
+++ b/backends/sh_regs.c
@@ -0,0 +1,188 @@
+/* Register names and numbers for SH DWARF.
+ Copyright (C) 2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Contributed by Matt Fleming <matt@console-pimps.org>.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+#include <dwarf.h>
+#include <string.h>
+
+#define BACKEND sh_
+#include "libebl_CPU.h"
+
+ssize_t
+sh_register_info (Ebl *ebl __attribute__ ((unused)),
+ int regno, char *name, size_t namelen,
+ const char **prefix, const char **setname,
+ int *bits, int *type)
+{
+ if (name == NULL)
+ return 104;
+
+ if (regno < 0 || regno > 103 || namelen < 6)
+ return -1;
+
+ *prefix = NULL;
+ *bits = 32;
+ *type = DW_ATE_signed;
+
+ switch (regno)
+ {
+ case 0 ... 9:
+ *setname = "integer";
+ name[0] = 'r';
+ name[1] = regno + '0';
+ namelen = 2;
+ break;
+
+ case 10 ... 15:
+ *setname = "integer";
+ name[0] = 'r';
+ name[1] = '1';
+ name[2] = regno - 10 + '0';
+ namelen = 3;
+ break;
+
+ case 16:
+ *setname = "system";
+ *type = DW_ATE_address;
+ name[0] = 'p';
+ name[1] = 'c';
+ namelen = 2;
+ break;
+
+ case 17:
+ *setname = "system";
+ *type = DW_ATE_address;
+ name[0] = 'p';
+ name[1] = 'r';
+ namelen = 2;
+ break;
+
+ case 18:
+ *setname = "control";
+ *type = DW_ATE_unsigned;
+ name[0] = 's';
+ name[1] = 'r';
+ namelen = 2;
+ break;
+
+ case 19:
+ *setname = "control";
+ *type = DW_ATE_unsigned;
+ name[0] = 'g';
+ name[1] = 'b';
+ name[2] = 'r';
+ namelen = 3;
+ break;
+
+ case 20:
+ *setname = "system";
+ name[0] = 'm';
+ name[1] = 'a';
+ name[2] = 'c';
+ name[3] = 'h';
+ namelen = 4;
+ break;
+
+ case 21:
+ *setname = "system";
+ name[0] = 'm';
+ name[1] = 'a';
+ name[2] = 'c';
+ name[3] = 'l';
+ namelen = 4;
+
+ break;
+
+ case 23:
+ *setname = "system";
+ *type = DW_ATE_unsigned;
+ name[0] = 'f';
+ name[1] = 'p';
+ name[2] = 'u';
+ name[3] = 'l';
+ namelen = 4;
+ break;
+
+ case 24:
+ *setname = "system";
+ *type = DW_ATE_unsigned;
+ name[0] = 'f';
+ name[1] = 'p';
+ name[2] = 's';
+ name[3] = 'c';
+ name[4] = 'r';
+ namelen = 5;
+ break;
+
+ case 25 ... 34:
+ *setname = "fpu";
+ *type = DW_ATE_float;
+ name[0] = 'f';
+ name[1] = 'r';
+ name[2] = regno - 25 + '0';
+ namelen = 3;
+ break;
+
+ case 35 ... 40:
+ *setname = "fpu";
+ *type = DW_ATE_float;
+ name[0] = 'f';
+ name[1] = 'r';
+ name[2] = '1';
+ name[3] = regno - 35 + '0';
+ namelen = 4;
+ break;
+
+ case 87 ... 96:
+ *type = DW_ATE_float;
+ *setname = "fpu";
+ name[0] = 'x';
+ name[1] = 'f';
+ name[2] = regno - 87 + '0';
+ namelen = 3;
+ break;
+
+ case 97 ... 103:
+ *type = DW_ATE_float;
+ *setname = "fpu";
+ name[0] = 'x';
+ name[1] = 'f';
+ name[2] = '1';
+ name[3] = regno - 97 + '0';
+ namelen = 4;
+ break;
+
+ default:
+ return 0;
+ }
+
+ name[namelen++] = '\0';
+ return namelen;
+}
diff --git a/backends/sh_retval.c b/backends/sh_retval.c
new file mode 100644
index 00000000..096d955d
--- /dev/null
+++ b/backends/sh_retval.c
@@ -0,0 +1,139 @@
+/* Function return value location for Linux/SH ABI.
+ Copyright (C) 2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Contributed by Matt Fleming <matt@console-pimps.org>.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+#include <dwarf.h>
+
+#define BACKEND sh_
+#include "libebl_CPU.h"
+
+
+/* This is the SVR4 ELF ABI convention, but AIX and Linux do not use it. */
+#define SVR4_STRUCT_RETURN 0
+
+
+/* r0, or pair r0, r1. */
+static const Dwarf_Op loc_intreg[] =
+ {
+ { .atom = DW_OP_reg0 }, { .atom = DW_OP_piece, .number = 4 },
+ { .atom = DW_OP_reg1 }, { .atom = DW_OP_piece, .number = 4 },
+ };
+#define nloc_intreg 1
+#define nloc_intregpair 4
+
+/* fr0 or fr1. */
+static const Dwarf_Op loc_fpreg[] =
+ {
+ { .atom = DW_OP_reg25 }, { .atom = DW_OP_piece, .number = 4 },
+ { .atom = DW_OP_reg26 }, { .atom = DW_OP_piece, .number = 4 },
+ };
+#define nloc_fpreg 1
+#define nloc_fpregpair 2
+
+int
+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_Word size;
+ switch (tag)
+ {
+ case -1:
+ return -1;
+
+ case DW_TAG_subrange_type:
+ if (! dwarf_hasattr_integrate (typedie, DW_AT_byte_size))
+ {
+ attr = dwarf_attr_integrate (typedie, DW_AT_type, &attr_mem);
+ typedie = dwarf_formref_die (attr, &die_mem);
+ tag = dwarf_tag (typedie);
+ }
+ /* Fall through. */
+
+ case DW_TAG_base_type:
+ 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 <= 8)
+ {
+ 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;
+ if (encoding == DW_ATE_float)
+ {
+ *locp = loc_fpreg;
+ return size <= 4 ? nloc_fpreg : nloc_fpregpair;
+ }
+ }
+ *locp = loc_intreg;
+ return size <= 4 ? nloc_intreg : nloc_intregpair;
+ }
+ }
+
+ /* XXX We don't have a good way to return specific errors from ebl calls.
+ This value means we do not understand the type, but it is well-formed
+ DWARF and might be valid. */
+ return -2;
+}
diff --git a/backends/sh_symbol.c b/backends/sh_symbol.c
index 26000ccb..9fb5db44 100644
--- a/backends/sh_symbol.c
+++ b/backends/sh_symbol.c
@@ -54,3 +54,38 @@ sh_reloc_simple_type (Ebl *ebl __attribute__ ((unused)), int type)
return ELF_T_NUM;
}
}
+
+/* Check whether machine flags are valid. */
+bool
+sh_machine_flag_check (GElf_Word flags)
+{
+ switch (flags & EF_SH_MACH_MASK)
+ {
+ case EF_SH_UNKNOWN:
+ case EF_SH1:
+ case EF_SH2:
+ case EF_SH3:
+ case EF_SH_DSP:
+ case EF_SH3_DSP:
+ case EF_SH4AL_DSP:
+ case EF_SH3E:
+ case EF_SH4:
+ case EF_SH2E:
+ case EF_SH4A:
+ case EF_SH2A:
+ case EF_SH4_NOFPU:
+ case EF_SH4A_NOFPU:
+ case EF_SH4_NOMMU_NOFPU:
+ case EF_SH2A_NOFPU:
+ case EF_SH3_NOMMU:
+ case EF_SH2A_SH4_NOFPU:
+ case EF_SH2A_SH3_NOFPU:
+ case EF_SH2A_SH4:
+ case EF_SH2A_SH3E:
+ break;
+ default:
+ return false;
+ }
+
+ return ((flags &~ (EF_SH_MACH_MASK)) == 0);
+}
diff --git a/backends/sparc_init.c b/backends/sparc_init.c
index 8da845e2..856bd48c 100644
--- a/backends/sparc_init.c
+++ b/backends/sparc_init.c
@@ -1,5 +1,5 @@
/* Initialization of SPARC specific backend library.
- Copyright (C) 2002, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2002, 2005, 2006, 2007, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -57,6 +57,10 @@ sparc_init (elf, machine, eh, ehlen)
sparc_init_reloc (eh);
HOOK (eh, reloc_simple_type);
HOOK (eh, machine_flag_check);
+ HOOK (eh, check_special_section);
+ HOOK (eh, symbol_type_name);
+ HOOK (eh, dynamic_tag_name);
+ HOOK (eh, dynamic_tag_check);
if (eh->class == ELFCLASS64)
eh->core_note = sparc64_core_note;
else
diff --git a/backends/sparc_reloc.def b/backends/sparc_reloc.def
index de650974..a7ea52a3 100644
--- a/backends/sparc_reloc.def
+++ b/backends/sparc_reloc.def
@@ -1,5 +1,5 @@
/* List the relocation types for sparc. -*- C -*-
- Copyright (C) 2005 Red Hat, Inc.
+ Copyright (C) 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -25,82 +25,94 @@
/* NAME, REL|EXEC|DYN */
-RELOC_TYPE (NONE, 0)
-RELOC_TYPE (8, 0)
-RELOC_TYPE (16, 0)
-RELOC_TYPE (32, 0)
-RELOC_TYPE (DISP8, 0)
-RELOC_TYPE (DISP16, 0)
-RELOC_TYPE (DISP32, 0)
-RELOC_TYPE (WDISP30, 0)
-RELOC_TYPE (WDISP22, 0)
-RELOC_TYPE (HI22, 0)
-RELOC_TYPE (22, 0)
-RELOC_TYPE (13, 0)
-RELOC_TYPE (LO10, 0)
-RELOC_TYPE (GOT10, 0)
-RELOC_TYPE (GOT13, 0)
-RELOC_TYPE (GOT22, 0)
-RELOC_TYPE (PC10, 0)
-RELOC_TYPE (PC22, 0)
-RELOC_TYPE (WPLT30, 0)
+RELOC_TYPE (NONE, REL)
+RELOC_TYPE (8, REL)
+RELOC_TYPE (16, REL)
+RELOC_TYPE (32, REL|DYN)
+RELOC_TYPE (DISP8, REL)
+RELOC_TYPE (DISP16, REL)
+RELOC_TYPE (DISP32, REL)
+RELOC_TYPE (WDISP30, REL)
+RELOC_TYPE (WDISP22, REL)
+RELOC_TYPE (HI22, REL)
+RELOC_TYPE (22, REL)
+RELOC_TYPE (13, REL)
+RELOC_TYPE (LO10, REL)
+RELOC_TYPE (GOT10, REL)
+RELOC_TYPE (GOT13, REL)
+RELOC_TYPE (GOT22, REL)
+RELOC_TYPE (PC10, REL)
+RELOC_TYPE (PC22, REL)
+RELOC_TYPE (WPLT30, REL)
RELOC_TYPE (COPY, EXEC)
RELOC_TYPE (GLOB_DAT, EXEC|DYN)
RELOC_TYPE (JMP_SLOT, EXEC|DYN)
RELOC_TYPE (RELATIVE, EXEC|DYN)
-RELOC_TYPE (UA32, 0)
-RELOC_TYPE (PLT32, 0)
-RELOC_TYPE (HIPLT22, 0)
-RELOC_TYPE (LOPLT10, 0)
-RELOC_TYPE (PCPLT32, 0)
-RELOC_TYPE (PCPLT22, 0)
-RELOC_TYPE (PCPLT10, 0)
-RELOC_TYPE (10, 0)
-RELOC_TYPE (11, 0)
-RELOC_TYPE (64, 0)
-RELOC_TYPE (OLO10, 0)
-RELOC_TYPE (HH22, 0)
-RELOC_TYPE (HM10, 0)
-RELOC_TYPE (LM22, 0)
-RELOC_TYPE (PC_HH22, 0)
-RELOC_TYPE (PC_HM10, 0)
-RELOC_TYPE (PC_LM22, 0)
-RELOC_TYPE (WDISP16, 0)
-RELOC_TYPE (WDISP19, 0)
-RELOC_TYPE (7, 0)
-RELOC_TYPE (5, 0)
-RELOC_TYPE (6, 0)
-RELOC_TYPE (DISP64, 0)
-RELOC_TYPE (PLT64, 0)
-RELOC_TYPE (HIX22, 0)
-RELOC_TYPE (LOX10, 0)
-RELOC_TYPE (H44, 0)
-RELOC_TYPE (M44, 0)
-RELOC_TYPE (L44, 0)
-RELOC_TYPE (REGISTER, 0)
-RELOC_TYPE (UA64, 0)
-RELOC_TYPE (UA16, 0)
-RELOC_TYPE (TLS_GD_HI22, 0)
-RELOC_TYPE (TLS_GD_LO10, 0)
-RELOC_TYPE (TLS_GD_ADD, 0)
-RELOC_TYPE (TLS_GD_CALL, 0)
-RELOC_TYPE (TLS_LDM_HI22, 0)
-RELOC_TYPE (TLS_LDM_LO10, 0)
-RELOC_TYPE (TLS_LDM_ADD, 0)
-RELOC_TYPE (TLS_LDM_CALL, 0)
-RELOC_TYPE (TLS_LDO_HIX22, 0)
-RELOC_TYPE (TLS_LDO_LOX10, 0)
-RELOC_TYPE (TLS_LDO_ADD, 0)
-RELOC_TYPE (TLS_IE_HI22, 0)
-RELOC_TYPE (TLS_IE_LO10, 0)
-RELOC_TYPE (TLS_IE_LD, 0)
-RELOC_TYPE (TLS_IE_LDX, 0)
-RELOC_TYPE (TLS_IE_ADD, 0)
-RELOC_TYPE (TLS_LE_HIX22, 0)
-RELOC_TYPE (TLS_LE_LOX10, 0)
-RELOC_TYPE (TLS_DTPMOD32, 0)
-RELOC_TYPE (TLS_DTPMOD64, 0)
-RELOC_TYPE (TLS_DTPOFF32, 0)
-RELOC_TYPE (TLS_DTPOFF64, 0)
-RELOC_TYPE (TLS_TPOFF32, 0)
-RELOC_TYPE (TLS_TPOFF64, 0)
+RELOC_TYPE (UA32, REL)
+RELOC_TYPE (PLT32, REL)
+RELOC_TYPE (HIPLT22, REL)
+RELOC_TYPE (LOPLT10, REL)
+RELOC_TYPE (PCPLT32, REL)
+RELOC_TYPE (PCPLT22, REL)
+RELOC_TYPE (PCPLT10, REL)
+RELOC_TYPE (10, REL)
+RELOC_TYPE (11, REL)
+RELOC_TYPE (64, REL|DYN)
+RELOC_TYPE (OLO10, REL)
+RELOC_TYPE (HH22, REL)
+RELOC_TYPE (HM10, REL)
+RELOC_TYPE (LM22, REL)
+RELOC_TYPE (PC_HH22, REL)
+RELOC_TYPE (PC_HM10, REL)
+RELOC_TYPE (PC_LM22, REL)
+RELOC_TYPE (WDISP16, REL)
+RELOC_TYPE (WDISP19, REL)
+RELOC_TYPE (GLOB_JMP, EXEC|DYN)
+RELOC_TYPE (7, REL)
+RELOC_TYPE (5, REL)
+RELOC_TYPE (6, REL)
+RELOC_TYPE (DISP64, REL)
+RELOC_TYPE (PLT64, REL)
+RELOC_TYPE (HIX22, REL)
+RELOC_TYPE (LOX10, REL)
+RELOC_TYPE (H44, REL)
+RELOC_TYPE (M44, REL)
+RELOC_TYPE (L44, REL)
+RELOC_TYPE (REGISTER, REL)
+RELOC_TYPE (UA64, REL)
+RELOC_TYPE (UA16, REL)
+RELOC_TYPE (TLS_GD_HI22, REL)
+RELOC_TYPE (TLS_GD_LO10, REL)
+RELOC_TYPE (TLS_GD_ADD, REL)
+RELOC_TYPE (TLS_GD_CALL, REL)
+RELOC_TYPE (TLS_LDM_HI22, REL)
+RELOC_TYPE (TLS_LDM_LO10, REL)
+RELOC_TYPE (TLS_LDM_ADD, REL)
+RELOC_TYPE (TLS_LDM_CALL, REL)
+RELOC_TYPE (TLS_LDO_HIX22, REL)
+RELOC_TYPE (TLS_LDO_LOX10, REL)
+RELOC_TYPE (TLS_LDO_ADD, REL)
+RELOC_TYPE (TLS_IE_HI22, REL)
+RELOC_TYPE (TLS_IE_LO10, REL)
+RELOC_TYPE (TLS_IE_LD, REL)
+RELOC_TYPE (TLS_IE_LDX, REL)
+RELOC_TYPE (TLS_IE_ADD, REL)
+RELOC_TYPE (TLS_LE_HIX22, REL)
+RELOC_TYPE (TLS_LE_LOX10, REL)
+RELOC_TYPE (TLS_DTPMOD32, DYN)
+RELOC_TYPE (TLS_DTPMOD64, DYN)
+RELOC_TYPE (TLS_DTPOFF32, DYN)
+RELOC_TYPE (TLS_DTPOFF64, DYN)
+RELOC_TYPE (TLS_TPOFF32, DYN)
+RELOC_TYPE (TLS_TPOFF64, DYN)
+RELOC_TYPE (GOTDATA_HIX22, REL)
+RELOC_TYPE (GOTDATA_LOX10, REL)
+RELOC_TYPE (GOTDATA_OP_HIX22, DYN)
+RELOC_TYPE (GOTDATA_OP_LOX10, DYN)
+RELOC_TYPE (GOTDATA_OP, DYN)
+RELOC_TYPE (H34, REL)
+RELOC_TYPE (SIZE32, REL)
+RELOC_TYPE (SIZE64, REL)
+RELOC_TYPE (GNU_VTINHERIT, REL)
+RELOC_TYPE (GNU_VTENTRY, REL)
+RELOC_TYPE (REV32, REL)
diff --git a/backends/sparc_retval.c b/backends/sparc_retval.c
index 7cd38273..dcff67a2 100644
--- a/backends/sparc_retval.c
+++ b/backends/sparc_retval.c
@@ -1,15 +1,27 @@
/* Function return value location for SPARC.
- Copyright (C) 2006, 2007 Red Hat, Inc.
-
- This program is Open Source software; you can redistribute it and/or
- modify it under the terms of the Open Software License version 1.0 as
- published by the Open Source Initiative.
-
- You should have received a copy of the Open Software License along
- with this program; if not, you may obtain a copy of the Open Software
- License version 1.0 from http://www.opensource.org/licenses/osl.php or
- by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
- 3001 King Ranch Road, Ukiah, CA 95482. */
+ Copyright (C) 2006-2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
#ifdef HAVE_CONFIG_H
# include <config.h>
@@ -142,8 +154,7 @@ sparc_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
case DW_TAG_class_type:
case DW_TAG_union_type:
case DW_TAG_array_type:
- if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
- &attr_mem), &size) == 0
+ if (dwarf_aggregate_size (typedie, &size) == 0
&& size > 0 && size <= 8)
goto intreg;
goto aggregate;
diff --git a/backends/sparc_symbol.c b/backends/sparc_symbol.c
index 237620c9..7896e9f4 100644
--- a/backends/sparc_symbol.c
+++ b/backends/sparc_symbol.c
@@ -1,5 +1,5 @@
/* SPARC specific symbolic name handling.
- Copyright (C) 2002, 2003, 2005, 2007 Red Hat, Inc.
+ Copyright (C) 2002, 2003, 2005, 2007, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Jakub Jelinek <jakub@redhat.com>, 2002.
@@ -66,3 +66,80 @@ sparc_machine_flag_check (GElf_Word flags)
| EF_SPARC_SUN_US1
| EF_SPARC_SUN_US3)) == 0);
}
+
+bool
+sparc_check_special_section (Ebl *ebl,
+ int ndx __attribute__ ((unused)),
+ const GElf_Shdr *shdr,
+ const char *sname __attribute__ ((unused)))
+{
+ if ((shdr->sh_flags & (SHF_WRITE | SHF_EXECINSTR))
+ == (SHF_WRITE | SHF_EXECINSTR))
+ {
+ /* This is ordinarily flagged, but is valid for a PLT on SPARC.
+
+ Look for the SHT_DYNAMIC section and the DT_PLTGOT tag in it.
+ Its d_ptr should match the .plt section's sh_addr. */
+
+ Elf_Scn *scn = NULL;
+ while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
+ {
+ GElf_Shdr scn_shdr;
+ if (likely (gelf_getshdr (scn, &scn_shdr) != NULL)
+ && scn_shdr.sh_type == SHT_DYNAMIC
+ && scn_shdr.sh_entsize != 0)
+ {
+ Elf_Data *data = elf_getdata (scn, NULL);
+ if (data != NULL)
+ for (size_t i = 0; i < data->d_size / scn_shdr.sh_entsize; ++i)
+ {
+ GElf_Dyn dyn;
+ if (unlikely (gelf_getdyn (data, i, &dyn) == NULL))
+ break;
+ if (dyn.d_tag == DT_PLTGOT)
+ return dyn.d_un.d_ptr == shdr->sh_addr;
+ }
+ break;
+ }
+ }
+ }
+
+ return false;
+}
+
+const char *
+sparc_symbol_type_name (int type,
+ char *buf __attribute__ ((unused)),
+ size_t len __attribute__ ((unused)))
+{
+ switch (type)
+ {
+ case STT_SPARC_REGISTER:
+ return "SPARC_REGISTER";
+ }
+ return NULL;
+}
+
+const char *
+sparc_dynamic_tag_name (int64_t tag,
+ char *buf __attribute__ ((unused)),
+ size_t len __attribute__ ((unused)))
+{
+ switch (tag)
+ {
+ case DT_SPARC_REGISTER:
+ return "SPARC_REGISTER";
+ }
+ return NULL;
+}
+
+bool
+sparc_dynamic_tag_check (int64_t tag)
+{
+ switch (tag)
+ {
+ case DT_SPARC_REGISTER:
+ return true;
+ }
+ return false;
+}
diff --git a/backends/x86_64_cfi.c b/backends/x86_64_cfi.c
new file mode 100644
index 00000000..caaee44e
--- /dev/null
+++ b/backends/x86_64_cfi.c
@@ -0,0 +1,60 @@
+/* x86-64 ABI-specified defaults for DWARF CFI.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <dwarf.h>
+
+#define BACKEND x86_64_
+#include "libebl_CPU.h"
+
+int
+x86_64_abi_cfi (Ebl *ebl __attribute__ ((unused)), Dwarf_CIE *abi_info)
+{
+ static const uint8_t abi_cfi[] =
+ {
+ /* Call-saved regs. */
+ DW_CFA_same_value, ULEB128_7 (0), /* %rbx */
+ DW_CFA_same_value, ULEB128_7 (6), /* %rbp */
+ DW_CFA_same_value, ULEB128_7 (12), /* %r12 */
+ DW_CFA_same_value, ULEB128_7 (13), /* %r13 */
+ DW_CFA_same_value, ULEB128_7 (14), /* %r14 */
+ DW_CFA_same_value, ULEB128_7 (15), /* %r15 */
+ DW_CFA_same_value, ULEB128_7 (16), /* %r16 */
+
+ /* The CFA is the SP. */
+ DW_CFA_val_offset, ULEB128_7 (7), ULEB128_7 (0),
+ };
+
+ abi_info->initial_instructions = abi_cfi;
+ abi_info->initial_instructions_end = &abi_cfi[sizeof abi_cfi];
+ abi_info->data_alignment_factor = 8;
+
+ abi_info->return_address_register = 16; /* %rip */
+
+ return 0;
+}
diff --git a/backends/x86_64_corenote.c b/backends/x86_64_corenote.c
index c2bc72e9..552ac88b 100644
--- a/backends/x86_64_corenote.c
+++ b/backends/x86_64_corenote.c
@@ -1,5 +1,5 @@
/* x86-64 specific core note handling.
- Copyright (C) 2005, 2007 Red Hat, Inc.
+ Copyright (C) 2005, 2007, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -103,4 +103,7 @@ static const Ebl_Register_Location fpregset_regs[] =
};
#define FPREGSET_SIZE 512
+#define EXTRA_NOTES EXTRA_NOTES_IOPERM
+
+#include "x86_corenote.c"
#include "linux-core-note.c"
diff --git a/backends/x86_64_init.c b/backends/x86_64_init.c
index b1764832..32f32e02 100644
--- a/backends/x86_64_init.c
+++ b/backends/x86_64_init.c
@@ -1,5 +1,5 @@
/* Initialization of x86-64 specific backend library.
- Copyright (C) 2002, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2002-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -53,7 +53,10 @@ x86_64_init (elf, machine, eh, ehlen)
HOOK (eh, core_note);
HOOK (eh, return_value_location);
HOOK (eh, register_info);
+ HOOK (eh, syscall_abi);
HOOK (eh, auxv_info);
+ HOOK (eh, disasm);
+ HOOK (eh, abi_cfi);
return MODVERSION;
}
diff --git a/backends/x86_64_reloc.def b/backends/x86_64_reloc.def
index e6c5a84b..ef302e55 100644
--- a/backends/x86_64_reloc.def
+++ b/backends/x86_64_reloc.def
@@ -1,5 +1,5 @@
/* List the relocation types for x86-64. -*- C -*-
- Copyright (C) 2000, 2001, 2002, 2003, 2005 Red Hat, Inc.
+ Copyright (C) 2000, 2001, 2002, 2003, 2005, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -49,3 +49,12 @@ RELOC_TYPE (TLSLD, REL)
RELOC_TYPE (DTPOFF32, REL)
RELOC_TYPE (GOTTPOFF, REL)
RELOC_TYPE (TPOFF32, REL)
+RELOC_TYPE (PC64, REL|EXEC|DYN)
+RELOC_TYPE (GOTOFF64, REL)
+RELOC_TYPE (GOTPC32, REL)
+RELOC_TYPE (SIZE32, REL|EXEC|DYN)
+RELOC_TYPE (SIZE64, REL|EXEC|DYN)
+RELOC_TYPE (GOTPC32_TLSDESC, REL)
+RELOC_TYPE (TLSDESC_CALL, REL)
+RELOC_TYPE (TLSDESC, REL|EXEC|DYN)
+RELOC_TYPE (IRELATIVE, EXEC|DYN)
diff --git a/backends/x86_64_retval.c b/backends/x86_64_retval.c
index 3109431e..ba772bb9 100644
--- a/backends/x86_64_retval.c
+++ b/backends/x86_64_retval.c
@@ -1,5 +1,5 @@
/* Function return value location for Linux/x86-64 ABI.
- Copyright (C) 2005, 2007 Red Hat, Inc.
+ Copyright (C) 2005-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -181,9 +181,8 @@ x86_64_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
case DW_TAG_class_type:
case DW_TAG_union_type:
case DW_TAG_array_type:
- if (dwarf_formudata (dwarf_attr_integrate (typedie, DW_AT_byte_size,
- &attr_mem), &size) != 0)
- return -1;
+ if (dwarf_aggregate_size (typedie, &size) != 0)
+ goto large;
if (size > 16)
goto large;
diff --git a/backends/x86_64_syscall.c b/backends/x86_64_syscall.c
new file mode 100644
index 00000000..c3db715d
--- /dev/null
+++ b/backends/x86_64_syscall.c
@@ -0,0 +1,47 @@
+/* Linux/x86-64 system call ABI in DWARF register numbers.
+ Copyright (C) 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#define BACKEND x86_64_
+#include "libebl_CPU.h"
+
+int
+x86_64_syscall_abi (Ebl *ebl __attribute__ ((unused)),
+ int *sp, int *pc, int *callno, int args[6])
+{
+ *sp = 7; /* %rsp */
+ *pc = 16; /* %rip */
+ *callno = 0; /* %rax */
+ args[0] = 5; /* %rdi */
+ args[1] = 4; /* %rsi */
+ args[2] = 1; /* %rdx */
+ args[3] = 10; /* %r10 */
+ args[4] = 8; /* %r8 */
+ args[5] = 9; /* %r9 */
+ return 0;
+}
diff --git a/backends/x86_corenote.c b/backends/x86_corenote.c
new file mode 100644
index 00000000..78849a66
--- /dev/null
+++ b/backends/x86_corenote.c
@@ -0,0 +1,48 @@
+/* x86-specific core note handling, pieces common to x86-64 and i386.
+ Copyright (C) 2005-2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#define EXTRA_NOTES_IOPERM \
+ case NT_386_IOPERM: \
+ return ioperm_info (nhdr->n_descsz, \
+ regs_offset, nregloc, reglocs, nitems, items);
+
+static int
+ioperm_info (GElf_Word descsz, GElf_Word *regs_offset,
+ size_t *nregloc, const Ebl_Register_Location **reglocs,
+ size_t *nitems, const Ebl_Core_Item **items)
+{
+ static const Ebl_Core_Item ioperm_item =
+ { .type = ELF_T_WORD, .format = 'b', .name = "ioperm" };
+
+ if (descsz % 4 != 0)
+ return 0;
+
+ *regs_offset = 0;
+ *nregloc = 0;
+ *reglocs = NULL;
+ *nitems = 1;
+ *items = &ioperm_item;
+ return 1;
+}
diff --git a/config/ChangeLog b/config/ChangeLog
index e61bac2c..04aa9e8d 100644
--- a/config/ChangeLog
+++ b/config/ChangeLog
@@ -1,3 +1,51 @@
+2010-04-15 Roland McGrath <roland@redhat.com>
+
+ * eu.am (DEFS): Add -DLOCALEDIR=... here.
+
+2010-02-15 Roland McGrath <roland@redhat.com>
+
+ * eu.am: New file.
+
+2009-04-19 Roland McGrath <roland@redhat.com>
+
+ * version.h.in: Revert last change.
+
+2009-04-17 Roland McGrath <roland@redhat.com>
+
+ * version.h.in (_ELFUTILS_PREREQ): Multiple major by 1000000 and minor
+ by 1000; now _ELFUTILS_VERSION is 789000 for version 0.789.
+
+2009-01-22 Ulrich Drepper <drepper@redhat.com>
+
+ * elfutils.spec.in: Distribute <elfutils/version.h> in
+ elfutils-libelf-devel.
+
+2009-01-22 Roland McGrath <roland@redhat.com>
+
+ * known-dwarf.awk: Handle DW_FOO_BAR_* sets better.
+
+2009-01-11 Roland McGrath <roland@redhat.com>
+
+ * known-dwarf.awk: New file.
+ * Makefile.am (EXTRA_DIST): Add it.
+
+2008-12-24 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am ($(srcdir)/elfutils.spec.in): Rewrite awk magic.
+ Put the target inside [if MAINTAINER_MODE].
+
+2008-12-16 Roland McGrath <roland@redhat.com>
+
+ * version.h.in: New file.
+
+2008-01-12 Ulrich Drepper <drepper@redhat.com>
+
+ * elfutils.spec.in: Add m4 to build requirements.
+
+2008-01-02 Ulrich Drepper <drepper@redhat.com>
+
+ * elfutils.spec.in: Changes for disasm branch merge.
+
2007-08-08 Roland McGrath <roland@redhat.com>
* elfutils.spec.in (License): Canonicalize.
diff --git a/config/Makefile.am b/config/Makefile.am
index 60e9bfe6..91adeee5 100644
--- a/config/Makefile.am
+++ b/config/Makefile.am
@@ -1,7 +1,7 @@
## Process this file with automake to produce Makefile.in -*-Makefile-*-
## Configure input file for elfutils.
##
-## Copyright (C) 2004, 2005 Red Hat, Inc.
+## Copyright (C) 2004, 2005, 2008, 2009 Red Hat, Inc.
## This file is part of Red Hat elfutils.
##
## Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -25,23 +25,24 @@
## Network licensing program, please visit www.openinventionnetwork.com
## <http://www.openinventionnetwork.com>.
##
-EXTRA_DIST = elfutils.spec.in
+EXTRA_DIST = elfutils.spec.in known-dwarf.awk
+if MAINTAINER_MODE
$(srcdir)/elfutils.spec.in: $(top_srcdir)/NEWS
@tmpname=$$(mktemp $${TMPDIR:-/tmp}/elfutils.XXXXXX); \
date +'* %a %b %e %Y' | tr '[\n]' '[ ]' > $$tmpname; \
getent passwd "$$(whoami)" | \
awk 'BEGIN {FS=":"} { printf $$5; exit 0}' >> $$tmpname; \
echo -n " <$$(whoami)@redhat.com> " >> $$tmpname; \
- sed 's/Version \(.*\):$$/\1-1/;q' $(top_srcdir)/NEWS >> $$tmpname; \
- sed '2,/^Version /p;d' $(top_srcdir)/NEWS | \
- head -n -1 | \
- awk '{ if ($$0 == "") { if (line != "") { printf "- "; fflush(); system("echo \"" line "\" | fold -w 70"); line=""; } } else { line=line $$0; }} END { if (line != "") { printf "- "; system("echo \"" line "\" | fold -w 70")}}' >> $$tmpname; \
- echo >> $$tmpname; \
+ awk '\
+ $$1 == "Version" && started { exit } \
+ $$1 == "Version" { started=1; line=""; sub(/:/,"",$$2); \
+ print $$2 "-1"; next } \
+ NF > 0 { line = (line != "") ? (line " " $$0) : ("- " $$0) } \
+ NF == 0 && line != "" { print line; line="" } \
+ END { if (line != "") print line; print "" }' $< \
+ | fold -s -w 70 | sed '1!s/^[^-]/ &/' >> $$tmpname; \
sed "/^%changelog/r $$tmpname" $@ > $@.new; \
rm -f $$tmpname; \
mv -f $@.new $@
- -@if [ -d $(srcdir)/CVS ]; then \
- cd $(srcdir); \
- cvs ci -m "Added changelog." $(@F); \
- fi
+endif
diff --git a/config/elfutils.spec.in b/config/elfutils.spec.in
index ffcf129e..102d723f 100644
--- a/config/elfutils.spec.in
+++ b/config/elfutils.spec.in
@@ -5,18 +5,20 @@ Version: @PACKAGE_VERSION@
Release: 1
License: GPLv2 with exceptions
Group: Development/Tools
-Source: elfutils-%{version}.tar.gz
+Source: elfutils-%{version}.tar.bz2
Obsoletes: libelf libelf-devel
Requires: elfutils-libelf = %{version}-%{release}
-Requires: glibc >= 2.3.1-2
+Requires: glibc >= 2.7
# ExcludeArch: xxx
BuildRoot: %{_tmppath}/%{name}-root
-BuildRequires: gcc >= 3.4
+BuildRequires: gcc >= 4.1.2-33
+BuildRequires: glibc >= 2.7
BuildRequires: bison >= 1.875
BuildRequires: flex >= 2.5.4a
BuildRequires: bzip2
+BuildRequires: m4
%define _gnu %{nil}
%define _programprefix eu-
@@ -104,8 +106,6 @@ chmod +x ${RPM_BUILD_ROOT}%{_prefix}/%{_lib}/elfutils/lib*.so*
{ cd ${RPM_BUILD_ROOT}
rm -f .%{_bindir}/eu-ld
rm -f .%{_includedir}/elfutils/libasm.h
- rm -f .%{_libdir}/libasm-%{version}.so
- rm -f .%{_libdir}/libasm.so.*
rm -f .%{_libdir}/libasm.so
rm -f .%{_libdir}/libasm.a
}
@@ -140,10 +140,11 @@ rm -rf ${RPM_BUILD_ROOT}
%{_bindir}/eu-objdump
%{_bindir}/eu-ar
%{_bindir}/eu-unstrip
+%{_bindir}/eu-make-debug-archive
#%{_bindir}/eu-ld
-#%{_libdir}/libasm-%{version}.so
+%{_libdir}/libasm-%{version}.so
%{_libdir}/libdw-%{version}.so
-#%{_libdir}/libasm.so.*
+%{_libdir}/libasm.so.*
%{_libdir}/libdw.so.*
%dir %{_libdir}/elfutils
%{_libdir}/elfutils/lib*.so
@@ -153,6 +154,7 @@ rm -rf ${RPM_BUILD_ROOT}
%{_includedir}/dwarf.h
%dir %{_includedir}/elfutils
%{_includedir}/elfutils/elf-knowledge.h
+#%{_includedir}/elfutils/libasm.h
%{_includedir}/elfutils/libebl.h
%{_includedir}/elfutils/libdw.h
%{_includedir}/elfutils/libdwfl.h
@@ -174,12 +176,127 @@ rm -rf ${RPM_BUILD_ROOT}
%{_includedir}/libelf.h
%{_includedir}/gelf.h
%{_includedir}/nlist.h
+%{_includedir}/elfutils/version.h
%{_libdir}/libelf.so
%files libelf-devel-static
%{_libdir}/libelf.a
%changelog
+* Mon May 3 2010 Ulrich Drepper <drepper@redhat.com> 0.147-1
+- libdw: Fixes in CFI handling, best possible handling of bogus CFA
+ ops.
+- libdwfl: Ignore R_*_NONE relocs, works around old (binutils) ld -r
+ bugs.
+
+* Wed Apr 21 2010 <drepper@redhat.com> 0.146-1
+- libdwfl: New function dwfl_core_file_report.
+
+* Tue Feb 23 2010 Ulrich Drepper <drepper@redhat.com> 0.145-1
+- Fix build with --disable-dependency-tracking.
+- Fix build with most recent glibc headers.
+- libelf: More robust to bogus section headers.
+- libdw: Fix CFI decoding.
+- libdwfl: Fix address bias returned by CFI accessors. Fix core
+ file module layout identification.
+- readelf: Fix CFI decoding.
+
+* Thu Jan 14 2010 <drepper@redhat.com> 0.144-1
+- libelf: New function elf_getphdrnum. Now support using more than
+ 65536 program headers in a file.
+- libdw: New function dwarf_aggregate_size for computing (constant)
+ type sizes, including array_type cases with nontrivial
+ calculation.
+- readelf: Don't give errors for missing info under -a.
+ Handle Linux "VMCOREINFO" notes under -n.
+
+* Mon Sep 21 2009 <drepper@redhat.com> 0.143-1
+- libdw: Various convenience functions for individual attributes now
+ use dwarf_attr_integrate to look up indirect inherited
+ attributes. Location expression handling now supports
+ DW_OP_implicit_value.
+- libdwfl: Support automatic decompression of files in XZ format,
+ and of Linux kernel images made with bzip2 or LZMA (as well
+ as gzip).
+
+* Mon Jun 29 2009 <drepper@redhat.com> 0.142-1
+- libelf: Add elf_getshdrnum alias for elf_getshnum and elf_getshdrstrndx alias
+ for elf_getshstrndx and deprecate original names. Sun screwed up
+ their implementation and asked for a solution.
+- libebl: Add support for STB_GNU_UNIQUE.
+- elflint: Add support for STB_GNU_UNIQUE.
+- readelf: Add -N option, speeds up DWARF printing without address->name lookups.
+- libdw: Add support for decoding DWARF CFI into location description form.
+ Handle some new DWARF 3 expression operations previously omitted.
+ Basic handling of some new encodings slated for DWARF
+
+* Thu Apr 23 2009 Ulrich Drepper <drepper@redhat.com> 0.141-1
+- libebl: sparc backend fixes; some more arm backend support
+- libdwfl: fix dwfl_module_build_id for prelinked DSO case;
+ fixes in core file support; dwfl_module_getsym interface
+ improved for non-address symbols
+- strip: fix infinite loop on strange inputs with -f
+- addr2line: take -j/--section=NAME option for binutils compatibility
+ (same effect as '(NAME)0x123' syntax already supported)
+
+* Mon Feb 16 2009 Ulrich Drepper <drepper@redhat.com> 0.140-1
+- libelf: Fix regression in creation of section header
+- libdwfl: Less strict behavior if DWARF reader ist just used to
+ display data
+
+* Thu Jan 22 2009 Ulrich Drepper <drepper@redhat.com> 0.139-1
+- libcpu: Add Intel SSE4 disassembler support
+- readelf: Implement call frame information and exception handling
+ dumping. Add -e option. Enable it implicitly for -a.
+- elflint: Check PT_GNU_EH_FRAME program header entry.
+- libdwfl: Support automatic gzip/bzip2 decompression of ELF files.
+
+* Wed Dec 31 2008 Roland McGrath <roland@redhat.com> 0.138-1
+- Install <elfutils/version.h> header file for applications to use in
+ source version compatibility checks.
+- libebl: backend fixes for i386 TLS relocs; backend support for
+ NT_386_IOPERM
+- libcpu: disassembler fixes
+- libdwfl: bug fixes
+- libelf: bug fixes
+- nm: bug fixes for handling corrupt input files
+
+* Tue Aug 26 2008 Ulrich Drepper <drepper@redhat.com> 0.137-1
+- Minor fixes for unreleased 0.136 release.
+
+* Mon Aug 25 2008 Ulrich Drepper <drepper@redhat.com> 0.136-1
+- libdwfl: bug fixes; new segment interfaces; all the libdwfl-based
+ tools now support --core=COREFILE option
+
+* Mon May 12 2008 Ulrich Drepper <drepper@redhat.com> 0.135-1
+- libdwfl: bug fixes
+- strip: changed handling of ET_REL files wrt symbol tables and relocs
+
+* Tue Apr 8 2008 Ulrich Drepper <drepper@redhat.com> 0.134-1
+- elflint: backend improvements for sparc, alpha
+- libdwfl, libelf: bug fixes
+
+* Sat Mar 1 2008 Ulrich Drepper <drepper@redhat.com> 0.133-1
+- readelf, elflint, libebl: SHT_GNU_ATTRIBUTE section handling (readelf -A)
+- readelf: core note handling for NT_386_TLS, NT_PPC_SPE, Alpha NT_AUXV
+- libdwfl: bug fixes and optimization in relocation handling
+- elfcmp: bug fix for non-allocated section handling
+- ld: implement newer features of binutils linker.
+
+* Mon Jan 21 2008 Ulrich Drepper <drepper@redhat.com> 0.132-1
+- libcpu: Implement x86 and x86-64 disassembler.
+- libasm: Add interface for disassembler.
+- all programs: add debugging of branch prediction.
+- libelf: new function elf_scnshndx.
+
+* Sun Nov 11 2007 Ulrich Drepper <drepper@redhat.com> 0.131-1
+- libdw: DW_FORM_ref_addr support; dwarf_formref entry point now depreca
+ted; bug fixes for oddly-formatted DWARF
+- libdwfl: bug fixes in offline archive support, symbol table handling;
+ apply partial relocations for dwfl_module_address_section on
+ET_REL
+- libebl: powerpc backend support for Altivec registers
+
* Mon Oct 15 2007 Ulrich Drepper <drepper@redhat.com> 0.130-1
- readelf: -p option can take an argument like -x for one section,
or no argument (as before) for all SHF_STRINGS sections;
diff --git a/config/eu.am b/config/eu.am
new file mode 100644
index 00000000..f259c5bb
--- /dev/null
+++ b/config/eu.am
@@ -0,0 +1,60 @@
+## Common automake fragments for elfutils subdirectory makefiles.
+##
+## Copyright (C) 2010 Red Hat, Inc.
+## This file is part of Red Hat elfutils.
+##
+## Red Hat elfutils 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; version 2 of the License.
+##
+## Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+## Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+##
+## Red Hat elfutils is an included package of the Open Invention Network.
+## An included package of the Open Invention Network is a package for which
+## Open Invention Network licensees cross-license their patents. No patent
+## license is granted, either expressly or impliedly, by designation as an
+## included package. Should you wish to participate in the Open Invention
+## Network licensing program, please visit www.openinventionnetwork.com
+## <http://www.openinventionnetwork.com>.
+##
+
+DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DLOCALEDIR='"${localedir}"'
+INCLUDES = -I. -I$(srcdir) -I$(top_srcdir)/lib -I..
+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)
+
+if MUDFLAP
+AM_CFLAGS += -fmudflap
+libmudflap = -lmudflap
+else
+libmudflap =
+endif
+
+COMPILE.os = $(filter-out -fprofile-arcs -ftest-coverage $(no_mudflap.os),\
+ $(COMPILE))
+
+%.os: %.c %.o
+if AMDEP
+ if $(COMPILE.os) -c -o $@ -fpic -DPIC -DSHARED -MT $@ -MD -MP \
+ -MF "$(DEPDIR)/$*.Tpo" `test -f '$<' || echo '$(srcdir)/'`$<; \
+ then cat "$(DEPDIR)/$*.Tpo" >> "$(DEPDIR)/$*.Po"; \
+ rm -f "$(DEPDIR)/$*.Tpo"; \
+ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
+ fi
+else
+ $(COMPILE.os) -c -o $@ -fpic -DPIC -DSHARED $<
+endif
+
+CLEANFILES = *.gcno *.gcda
+
+textrel_check = if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
diff --git a/config/known-dwarf.awk b/config/known-dwarf.awk
new file mode 100644
index 00000000..3089dd27
--- /dev/null
+++ b/config/known-dwarf.awk
@@ -0,0 +1,55 @@
+#!/bin/awk -f
+
+$1 == "enum" { set = ""; next }
+
+set == "" && $1 ~ /DW_([A-Z_]+)_([^ ]+)/ {
+ set = $1;
+ sub(/^DW_/, "", set);
+ sub(/_[^[:upper:]_].*$/, "", set);
+ if (set ~ /LANG_.+/) set = "LANG";
+}
+
+$1 ~ /DW([_A-Z]+)_([^ ]+)/ {
+ match($1, ("DW_" set "_([^ ]+)"), fields);
+ elt = fields[1];
+ if (set in DW)
+ DW[set] = DW[set] "," elt;
+ else
+ DW[set] = elt;
+ if ($NF == "*/" && $4 == "/*") {
+ c = $5;
+ for (i = 6; i < NF; ++i) c = c " " $i;
+ comment[set, elt] = c;
+ }
+}
+
+END {
+ print "/* Generated by config/dwarf-known.awk from libdw.h contents. */";
+ n = asorti(DW, sets);
+ for (i = 1; i <= n; ++i) {
+ set = sets[i];
+ if (what && what != set) continue;
+ split(DW[set], elts, ",");
+ m = asort(elts);
+ lo = hi = "";
+ if (m == 0) continue;
+ print "\n#define ALL_KNOWN_DW_" set " \\";
+ for (j = 1; j <= m; ++j) {
+ elt = elts[j];
+ if (elt ~ /(lo|low)_user$/) {
+ lo = elt;
+ continue;
+ }
+ if (elt ~ /(hi|high)_user$/) {
+ hi = elt;
+ continue;
+ }
+ if (comment[set, elt])
+ print " ONE_KNOWN_DW_" set "_DESC (" elt ", DW_" set "_" elt \
+ ", \"" comment[set, elt] "\") \\";
+ else
+ print " ONE_KNOWN_DW_" set " (" elt ", DW_" set "_" elt ") \\";
+ }
+ print " /* End of DW_" set "_*. */";
+ }
+}
diff --git a/config/version.h.in b/config/version.h.in
new file mode 100644
index 00000000..82c846e9
--- /dev/null
+++ b/config/version.h.in
@@ -0,0 +1,58 @@
+/* Version information about elfutils development libraries.
+ Copyright (C) 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifndef _ELFUTILS_VERSION_H
+#define _ELFUTILS_VERSION_H 1
+
+#define _ELFUTILS_VERSION @eu_version@
+
+#define _ELFUTILS_PREREQ(major, minor) \
+ (_ELFUTILS_VERSION >= ((major) * 1000 + (minor)))
+
+#endif /* elfutils/version.h */
diff --git a/configure.ac b/configure.ac
index bf08914e..4addfec0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,7 @@
dnl Process this file with autoconf to produce a configure script.
dnl Configure input file for elfutils. -*-autoconf-*-
dnl
-dnl Copyright (C) 1996-2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
+dnl Copyright (C) 1996-2010 Red Hat, Inc.
dnl
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
@@ -16,17 +16,16 @@ dnl You should have received a copy of the GNU General Public License
dnl along with this program; if not, write to the Free Software Foundation,
dnl Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
dnl
-AC_INIT([Red Hat elfutils],[0.130],[http://bugzilla.redhat.com/bugzilla/],
- [elfutils])
+AC_INIT([Red Hat elfutils],[0.147],[http://bugzilla.redhat.com/bugzilla/],[elfutils])
AC_CONFIG_AUX_DIR([config])
AC_CONFIG_FILES([config/Makefile])
-AC_COPYRIGHT([Copyright (C) 1996-2003, 2004, 2005, 2006, 2007 Red Hat, Inc.])
-AC_PREREQ(2.59) dnl Minimum Autoconf version required.
+AC_COPYRIGHT([Copyright (C) 1996-2010 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.7 -Wno-portability])
+AM_INIT_AUTOMAKE([gnits 1.8 -Wno-portability dist-bzip2 no-dist-gzip])
AM_MAINTAINER_MODE
dnl Unique ID for this build.
@@ -48,10 +47,13 @@ AC_CONFIG_FILES([elfutils.spec:config/elfutils.spec.in])
AC_CANONICAL_HOST
-AC_ARG_ENABLE([tls],
-AS_HELP_STRING([--enable-tls], [enable use of thread local storage]),
-AC_DEFINE(USE_TLS))
-AH_TEMPLATE([USE_TLS], [Defined if thread local storage should be used.])
+AC_ARG_ENABLE([thread-safety],
+AS_HELP_STRING([--enable-thread-safety], [enable thread safety of libraries]),
+use_tls=locks, use_locks=no)
+AM_CONDITIONAL(USE_LOCKS, test "$use_locks" = yes)
+AS_IF([test "$use_locks" = yes], [AC_DEFINE(USE_LOCKS)])
+
+AH_TEMPLATE([USE_LOCKS], [Defined if libraries should be thread-safe.])
dnl Add all the languages for which translations are available.
ALL_LINGUAS=
@@ -71,13 +73,22 @@ CFLAGS="$old_CFLAGS"])
AS_IF([test "x$ac_cv_c99" != xyes],
AC_MSG_ERROR([gcc with C99 support required]))
-LOCALEDIR=$datadir
-AC_SUBST(LOCALEDIR)
-AC_DEFINE_UNQUOTED(LOCALEDIR, "$LOCALEDIR")
-AH_TEMPLATE([LOCALEDIR], [Directory to place translation files in.])
-
-DATADIRNAME=$datadir
-AC_SUBST(DATADIRNAME)
+AC_CACHE_CHECK([for __thread support], ac_cv_tls, [dnl
+# 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"
+AC_LINK_IFELSE([dnl
+AC_LANG_PROGRAM([[#undef __thread
+static __thread int a; int foo (int b) { return a + b; }]],
+ [[exit (foo (0));]])],
+ ac_cv_tls=yes, ac_cv_tls=no)
+CFLAGS="$save_CFLAGS"
+LDFLAGS="$save_LDFLAGS"])
+AS_IF([test "x$ac_cv_tls" != xyes],
+ AC_MSG_ERROR([__thread support required]))
dnl This test must come as early as possible after the compiler configuration
dnl tests, because the choice of the file model can (in principle) affect
@@ -126,7 +137,7 @@ if test "x$enable_mudflap" = xyes; then
# Check whether the compiler support -fmudflap.
old_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -fmudflap"
- AC_TRY_COMPILE([], [], use_mudflap=yes, use_mudflap=fail)
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[use_mudflap=yes],[use_mudflap=fail])
CFLAGS="$old_CFLAGS"
fi])
if test "$use_mudflap" = fail; then
@@ -134,10 +145,16 @@ if test "$use_mudflap" = fail; then
fi
AM_CONDITIONAL(MUDFLAP, test "$use_mudflap" = yes)
-# Enable gprof suport.
+dnl enable debugging of branch prediction.
+use_debugpred=0
+AC_ARG_ENABLE([debugpred],
+AS_HELP_STRING([--enable-debugpred],[build binaries with support to debug branch prediction]),
+[use_debugpred=1], [use_debugpred=0])
+AC_SUBST([DEBUGPRED], $use_debugpred)
+
+dnl Enable gprof suport.
AC_ARG_ENABLE([gprof],
-AC_HELP_STRING([--enable-gprof],
-[build binaries with gprof support]), [use_gprof=yes], [use_gprof=no])
+AS_HELP_STRING([--enable-gprof],[build binaries with gprof support]), [use_gprof=yes], [use_gprof=no])
if test "$use_gprof" = yes; then
CFLAGS="$CFLAGS -pg"
LDFLAGS="$LDFLAGS -pg"
@@ -146,8 +163,7 @@ AM_CONDITIONAL(GPROF, test "$use_gprof" = yes)
# Enable gcov suport.
AC_ARG_ENABLE([gcov],
-AC_HELP_STRING([--enable-gcov],
-[build binaries with gcov support]), [use_gcov=yes], [use_gcov=no])
+AS_HELP_STRING([--enable-gcov],[build binaries with gcov support]), [use_gcov=yes], [use_gcov=no])
if test "$use_gcov" = yes; then
CFLAGS="$CFLAGS -fprofile-arcs -ftest-coverage"
LDFLAGS="$LDFLAGS -fprofile-arcs"
@@ -158,7 +174,7 @@ AM_CONDITIONAL(BUILD_STATIC, [dnl
test "$use_mudflap" = yes -o "$use_gprof" = yes -o "$use_gcov" = yes])
AC_ARG_ENABLE([tests-rpath],
-AC_HELP_STRING([--enable-tests-rpath], [build $ORIGIN-using rpath into tests]),
+AS_HELP_STRING([--enable-tests-rpath],[build $ORIGIN-using rpath into tests]),
[tests_use_rpath=yes], [tests_use_rpath=no])
AM_CONDITIONAL(TESTS_RPATH, test "$tests_use_rpath" = yes)
@@ -171,6 +187,17 @@ AC_SUBST([LIBEBL_SUBDIR])
AC_DEFINE_UNQUOTED(LIBEBL_SUBDIR, "$LIBEBL_SUBDIR")
AH_TEMPLATE([LIBEBL_SUBDIR], [$libdir subdirectory containing libebl modules.])
+dnl Test for zlib and bzlib, gives ZLIB/BZLIB .am
+dnl conditional and config.h USE_ZLIB/USE_BZLIB #define.
+save_LIBS="$LIBS"
+LIBS=
+eu_ZIPLIB(zlib,ZLIB,z,gzdirect,gzip)
+eu_ZIPLIB(bzlib,BZLIB,bz2,BZ2_bzdopen,bzip2)
+eu_ZIPLIB(lzma,LZMA,lzma,lzma_auto_decoder,[LZMA (xz)])
+zip_LIBS="$LIBS"
+LIBS="$save_LIBS"
+AC_SUBST([zip_LIBS])
+
dnl The directories with content.
dnl Documentation.
@@ -214,102 +241,45 @@ AC_CONFIG_FILES([tests/Makefile])
AC_SUBST(USE_NLS, yes)
AM_PO_SUBDIRS
-
-dnl Test of the config.h file. We hide all kinds of configuration magic
-dnl in there.
-AH_BOTTOM([
-/* Eventually we will allow multi-threaded applications to use the
- libraries. Therefore we will add the necessary locking although
- the macros used expand to nothing for now. */
-#define lock_lock(lock) ((void) (lock))
-#define rwlock_define(class,name) class int name
-#define rwlock_init(lock) ((void) (lock))
-#define rwlock_fini(lock) ((void) (lock))
-#define rwlock_rdlock(lock) ((void) (lock))
-#define rwlock_wrlock(lock) ((void) (lock))
-#define rwlock_unlock(lock) ((void) (lock))
-#define tls_key_t void *
-#define key_create(keyp, freefct) (1)
-#define getspecific(key) key
-#define setspecific(key,val) key = val
-#define once_define(class,name) class int name
-#define once_execute(name,fct) \
- do { \
- if (name == 0) \
- fct (); \
- name = 1; \
- } while (0)
-
-/* gettext helper macro. */
-#define N_(Str) Str
-
-/* Compiler-specific definitions. */
-#define strong_alias(name, aliasname) \
- extern __typeof (name) aliasname __attribute__ ((alias (#name)));
-
-#ifdef __i386__
-# define internal_function __attribute__ ((regparm (3), stdcall))
-#else
-# define internal_function /* nothing */
-#endif
-
-#define internal_strong_alias(name, aliasname) \
- extern __typeof (name) aliasname __attribute__ ((alias (#name))) internal_function;
-
-#define attribute_hidden \
- __attribute__ ((visibility ("hidden")))
-
-/* Define ALLOW_UNALIGNED if the architecture allows operations on
- unaligned memory locations. */
-#if defined __i386__ || defined __x86_64__
-# define ALLOW_UNALIGNED 1
-#else
-# define ALLOW_UNALIGNED 0
-#endif
-
-#define unlikely(expr) __builtin_expect (expr, 0)
-#define likely(expr) __builtin_expect (expr, 1)
-
-#define obstack_calloc(ob, size) \
- ({ size_t _s = (size); memset (obstack_alloc (ob, _s), '\0', _s); })
-#define obstack_strdup(ob, str) \
- ({ const char *_s = (str); obstack_copy0 (ob, _s, strlen (_s)); })
-#define obstack_strndup(ob, str, n) \
- ({ const char *_s = (str); obstack_copy0 (ob, _s, strnlen (_s, n)); })
-
-#if __STDC_VERSION__ >= 199901L
-# define flexarr_size /* empty */
-#else
-# define flexarr_size 0
-#endif
-
-/* Calling conventions. */
-#ifdef __i386__
-# define CALLING_CONVENTION regparm (3), stdcall
-# define AND_CALLING_CONVENTION , regparm (3), stdcall
-#else
-# define CALLING_CONVENTION
-# define AND_CALLING_CONVENTION
-#endif
-
-/* Avoid PLT entries. */
-#ifdef PIC
-# define INTUSE(name) _INTUSE(name)
-# define _INTUSE(name) __##name##_internal
-# define INTDEF(name) _INTDEF(name)
-# define _INTDEF(name) \
- extern __typeof__ (name) __##name##_internal __attribute__ ((alias (#name)));
-# define INTDECL(name) _INTDECL(name)
-# define _INTDECL(name) \
- extern __typeof__ (name) __##name##_internal attribute_hidden;
-#else
-# define INTUSE(name) name
-# define INTDEF(name) /* empty */
-# define INTDECL(name) /* empty */
-#endif
-
-/* This macro is used by the tests conditionalize for standalone building. */
-#define ELFUTILS_HEADER(name) <lib##name.h>
-])
+dnl Appended to the config.h file.
+dnl We hide all kinds of configuration magic in lib/eu-config.h.
+AH_BOTTOM([#include <eu-config.h>])
+
+dnl Version compatibility header.
+AC_CONFIG_FILES([version.h:config/version.h.in])
+AC_SUBST([eu_version])
+
+# 1.234<whatever> -> 1234<whatever>
+case "$PACKAGE_VERSION" in
+[[0-9]].*) eu_version="${PACKAGE_VERSION/./}" ;;
+*) AC_MSG_ERROR([confused by version number '$PACKAGE_VERSION']) ;;
+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" ;;
+ *) AC_MSG_ERROR([confused by version number '$PACKAGE_VERSION']) ;;
+ 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";;
+*) AC_MSG_ERROR([confused by version number '$PACKAGE_VERSION']) ;;
+esac
+
+# Round up to the next release API (x.y) version.
+[eu_version=$[($eu_version + 999) / 1000]]
AC_OUTPUT
diff --git a/lib/ChangeLog b/lib/ChangeLog
index cc2850c3..089747aa 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,51 @@
+2010-02-15 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am: Use config/eu.am for common stuff.
+
+2009-08-09 Roland McGrath <roland@redhat.com>
+
+ * eu-config.h (OLD_VERSION, NEW_VERSION, COMPAT_VERSION): New macros.
+
+2009-01-23 Roland McGrath <roland@redhat.com>
+
+ * eu-config.h: Add multiple inclusion protection.
+
+2009-01-17 Ulrich Drepper <drepper@redhat.com>
+
+ * system.h (ARGP_PROGRAM_VERSION_HOOK_DEF): Define.
+ (ARGP_PROGRAM_BUG_ADDRESS_DEF): Define.
+
+2009-01-10 Ulrich Drepper <drepper@redhat.com>
+
+ * eu-config.h: Remove tls_key_t, key_create, getspecific, setspecific,
+ once_define, and once_execute macros. Use USE_LOCKS instead of
+ USE_TLS.
+
+2008-08-25 Roland McGrath <roland@redhat.com>
+
+ * eu-config.h [USE_TLS] (RWLOCK_CALL): New macro.
+ (rwlock_init, rwlock_fini, rwlock_rdlock, rwlock_wrlock, rwlock_unlock):
+ Use it.
+
+2008-08-24 Roland McGrath <roland@redhat.com>
+
+ * eu-config.h: New file.
+ * Makefile.am (noinst_HEADERS): Add it.
+
+2008-02-01 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am (libeu_a_SOURCES): Add sha1.c.
+ (noinst_HEADERS): Add sha1.h.
+ * sha1.c: New file.
+ * sha1.h: New file.
+
+2008-01-31 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am (libeu_a_SOURCES): Add md5.c.
+ (noinst_HEADERS): Add md5.h.
+ * md5.c: New file.
+ * md5.h: New file.
+
2006-04-04 Ulrich Drepper <drepper@redhat.com>
* Makefile.am (libeu_a_SOURCES): We don't need xstrdup in the moment.
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 4218e963..50d55c56 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to create Makefile.in
##
-## Copyright (C) 1996-2001, 2002, 2004, 2005 Red Hat, Inc.
+## Copyright (C) 1996-2010 Red Hat, Inc.
## This file is part of Red Hat elfutils.
##
## Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -24,21 +24,17 @@
## Network licensing program, please visit www.openinventionnetwork.com
## <http://www.openinventionnetwork.com>.
##
-DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H
-if MUDFLAP
-AM_CFLAGS = -fmudflap
-else
-AM_CFLAGS =
-endif
-AM_CFLAGS += -fpic -Wall -Wshadow -Werror -Wunused -Wextra $($(*F)_CFLAGS)
-INCLUDES = -I$(srcdir)/../libelf -I..
+include $(top_srcdir)/config/eu.am
+AM_CFLAGS += -fpic
+INCLUDES += -I$(srcdir)/../libelf
noinst_LIBRARIES = libeu.a
libeu_a_SOURCES = xstrndup.c xmalloc.c next_prime.c \
- crc32.c crc32_file.c
+ crc32.c crc32_file.c md5.c sha1.c
-noinst_HEADERS = fixedsizehash.h system.h dynamicsizehash.h list.h
+noinst_HEADERS = fixedsizehash.h system.h dynamicsizehash.h list.h md5.h \
+ sha1.h eu-config.h
EXTRA_DIST = dynamicsizehash.c
if !GPROF
diff --git a/lib/eu-config.h b/lib/eu-config.h
new file mode 100644
index 00000000..f814604f
--- /dev/null
+++ b/lib/eu-config.h
@@ -0,0 +1,203 @@
+/* Configuration definitions.
+ Copyright (C) 2008, 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under an Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) and to distribute linked
+ combinations including the two. Non-GPL Code permitted under this
+ exception must only link to the code of Red Hat elfutils through those
+ well defined interfaces identified in the file named EXCEPTION found in
+ the source code files (the "Approved Interfaces"). The files of Non-GPL
+ Code may instantiate templates or use macros or inline functions from
+ the Approved Interfaces without causing the resulting work to be covered
+ by the GNU General Public License. Only Red Hat, Inc. may make changes
+ or additions to the list of Approved Interfaces. Red Hat's grant of
+ this exception is conditioned upon your not adding any new exceptions.
+ If you wish to add a new Approved Interface or exception, please contact
+ Red Hat. You must obey the GNU General Public License in all respects
+ for all of the Red Hat elfutils code and other code used in conjunction
+ with Red Hat elfutils except the Non-GPL Code covered by this exception.
+ If you modify this file, you may extend this exception to your version
+ of the file, but you are not obligated to do so. If you do not wish to
+ provide this exception without modification, you must delete this
+ exception statement from your version and license this file solely under
+ the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifndef EU_CONFIG_H
+#define EU_CONFIG_H 1
+
+#ifdef USE_LOCKS
+# include <pthread.h>
+# include <assert.h>
+# define rwlock_define(class,name) class pthread_rwlock_t name
+# define RWLOCK_CALL(call) \
+ ({ int _err = pthread_rwlock_ ## call; assert_perror (_err); })
+# define rwlock_init(lock) RWLOCK_CALL (init (&lock, NULL))
+# define rwlock_fini(lock) RWLOCK_CALL (destroy (&lock))
+# define rwlock_rdlock(lock) RWLOCK_CALL (rdlock (&lock))
+# define rwlock_wrlock(lock) RWLOCK_CALL (wrlock (&lock))
+# define rwlock_unlock(lock) RWLOCK_CALL (unlock (&lock))
+#else
+/* Eventually we will allow multi-threaded applications to use the
+ libraries. Therefore we will add the necessary locking although
+ the macros used expand to nothing for now. */
+# define rwlock_define(class,name) class int name
+# define rwlock_init(lock) ((void) (lock))
+# define rwlock_fini(lock) ((void) (lock))
+# define rwlock_rdlock(lock) ((void) (lock))
+# define rwlock_wrlock(lock) ((void) (lock))
+# define rwlock_unlock(lock) ((void) (lock))
+#endif /* USE_LOCKS */
+
+/* gettext helper macro. */
+#define N_(Str) Str
+
+/* Compiler-specific definitions. */
+#define strong_alias(name, aliasname) \
+ extern __typeof (name) aliasname __attribute__ ((alias (#name)));
+
+#ifdef __i386__
+# define internal_function __attribute__ ((regparm (3), stdcall))
+#else
+# define internal_function /* nothing */
+#endif
+
+#define internal_strong_alias(name, aliasname) \
+ extern __typeof (name) aliasname __attribute__ ((alias (#name))) internal_function;
+
+#define attribute_hidden \
+ __attribute__ ((visibility ("hidden")))
+
+/* Define ALLOW_UNALIGNED if the architecture allows operations on
+ unaligned memory locations. */
+#if defined __i386__ || defined __x86_64__
+# define ALLOW_UNALIGNED 1
+#else
+# define ALLOW_UNALIGNED 0
+#endif
+
+#if DEBUGPRED
+# ifdef __x86_64__
+asm (".section predict_data, \"aw\"; .previous\n"
+ ".section predict_line, \"a\"; .previous\n"
+ ".section predict_file, \"a\"; .previous");
+# ifndef PIC
+# define debugpred__(e, E) \
+ ({ long int _e = !!(e); \
+ asm volatile (".pushsection predict_data; ..predictcnt%=: .quad 0; .quad 0\n" \
+ ".section predict_line; .quad %c1\n" \
+ ".section predict_file; .quad %c2; .popsection\n" \
+ "addq $1,..predictcnt%=(,%0,8)" \
+ : : "r" (_e == E), "i" (__LINE__), "i" (__FILE__)); \
+ __builtin_expect (_e, E); \
+ })
+# endif
+# elif defined __i386__
+asm (".section predict_data, \"aw\"; .previous\n"
+ ".section predict_line, \"a\"; .previous\n"
+ ".section predict_file, \"a\"; .previous");
+# ifndef PIC
+# define debugpred__(e, E) \
+ ({ long int _e = !!(e); \
+ asm volatile (".pushsection predict_data; ..predictcnt%=: .long 0; .long 0\n" \
+ ".section predict_line; .long %c1\n" \
+ ".section predict_file; .long %c2; .popsection\n" \
+ "incl ..predictcnt%=(,%0,8)" \
+ : : "r" (_e == E), "i" (__LINE__), "i" (__FILE__)); \
+ __builtin_expect (_e, E); \
+ })
+# endif
+# endif
+# ifdef debugpred__
+# define unlikely(e) debugpred__ (e,0)
+# define likely(e) debugpred__ (e,1)
+# endif
+#endif
+#ifndef likely
+# define unlikely(expr) __builtin_expect (!!(expr), 0)
+# define likely(expr) __builtin_expect (!!(expr), 1)
+#endif
+
+#define obstack_calloc(ob, size) \
+ ({ size_t _s = (size); memset (obstack_alloc (ob, _s), '\0', _s); })
+#define obstack_strdup(ob, str) \
+ ({ const char *_s = (str); obstack_copy0 (ob, _s, strlen (_s)); })
+#define obstack_strndup(ob, str, n) \
+ ({ const char *_s = (str); obstack_copy0 (ob, _s, strnlen (_s, n)); })
+
+#if __STDC_VERSION__ >= 199901L
+# define flexarr_size /* empty */
+#else
+# define flexarr_size 0
+#endif
+
+/* Calling conventions. */
+#ifdef __i386__
+# define CALLING_CONVENTION regparm (3), stdcall
+# define AND_CALLING_CONVENTION , regparm (3), stdcall
+#else
+# define CALLING_CONVENTION
+# define AND_CALLING_CONVENTION
+#endif
+
+/* Avoid PLT entries. */
+#ifdef PIC
+# define INTUSE(name) _INTUSE(name)
+# define _INTUSE(name) __##name##_internal
+# define INTDEF(name) _INTDEF(name)
+# define _INTDEF(name) \
+ extern __typeof__ (name) __##name##_internal __attribute__ ((alias (#name)));
+# define INTDECL(name) _INTDECL(name)
+# define _INTDECL(name) \
+ extern __typeof__ (name) __##name##_internal attribute_hidden;
+#else
+# define INTUSE(name) name
+# define INTDEF(name) /* empty */
+# define INTDECL(name) /* empty */
+#endif
+
+/* This macro is used by the tests conditionalize for standalone building. */
+#define ELFUTILS_HEADER(name) <lib##name.h>
+
+
+#ifdef SHARED
+# define OLD_VERSION(name, version) \
+ asm (".globl _compat." #version "." #name "\n" \
+ "_compat." #version "." #name " = " #name "\n" \
+ ".symver _compat." #version "." #name "," #name "@" #version);
+# define NEW_VERSION(name, version) \
+ asm (".symver " #name "," #name "@@@" #version);
+# define COMPAT_VERSION(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(name, version, prefix) error "should use #ifdef SHARED"
+#endif
+
+
+#endif /* eu-config.h */
diff --git a/lib/md5.c b/lib/md5.c
new file mode 100644
index 00000000..0770561c
--- /dev/null
+++ b/lib/md5.c
@@ -0,0 +1,446 @@
+/* Functions to compute MD5 message digest of files or memory blocks.
+ according to the definition of MD5 in RFC 1321 from April 1992.
+ Copyright (C) 1995,1996,1997,1999,2000,2001,2005 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Written by Ulrich Drepper <drepper@redhat.com>, 1995.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <endian.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "md5.h"
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+# define SWAP(n) \
+ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
+#else
+# define SWAP(n) (n)
+#endif
+
+
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. (RFC 1321, 3.1: Step 1) */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/* Initialize structure containing state of computation.
+ (RFC 1321, 3.3: Step 3) */
+void
+md5_init_ctx (ctx)
+ struct md5_ctx *ctx;
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result
+ must be in little endian byte order.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+void *
+md5_read_ctx (ctx, resbuf)
+ const struct md5_ctx *ctx;
+ void *resbuf;
+{
+ ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
+ ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B);
+ ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C);
+ ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D);
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+void *
+md5_finish_ctx (ctx, resbuf)
+ struct md5_ctx *ctx;
+ void *resbuf;
+{
+ /* Take yet unprocessed bytes into account. */
+ md5_uint32 bytes = ctx->buflen;
+ size_t pad;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] += bytes;
+ if (ctx->total[0] < bytes)
+ ++ctx->total[1];
+
+ pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
+ memcpy (&ctx->buffer[bytes], fillbuf, pad);
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer. */
+ *(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3);
+ *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3) |
+ (ctx->total[0] >> 29));
+
+ /* Process last bytes. */
+ md5_process_block (ctx->buffer, bytes + pad + 8, ctx);
+
+ return md5_read_ctx (ctx, resbuf);
+}
+
+
+#ifdef NEED_MD5_STREAM
+/* Compute MD5 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+int
+md5_stream (stream, resblock)
+ FILE *stream;
+ void *resblock;
+{
+ /* Important: BLOCKSIZE must be a multiple of 64. */
+#define BLOCKSIZE 4096
+ struct md5_ctx ctx;
+ char buffer[BLOCKSIZE + 72];
+ size_t sum;
+
+ /* Initialize the computation context. */
+ md5_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ do
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+ }
+ while (sum < BLOCKSIZE && n != 0);
+ if (n == 0 && ferror (stream))
+ return 1;
+
+ /* If end of file is reached, end the loop. */
+ if (n == 0)
+ break;
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ md5_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ /* Add the last bytes if necessary. */
+ if (sum > 0)
+ md5_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ md5_finish_ctx (&ctx, resblock);
+ return 0;
+}
+#endif
+
+
+#ifdef NEED_MD5_BUFFER
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+md5_buffer (buffer, len, resblock)
+ const char *buffer;
+ size_t len;
+ void *resblock;
+{
+ struct md5_ctx ctx;
+
+ /* Initialize the computation context. */
+ md5_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ md5_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return md5_finish_ctx (&ctx, resblock);
+}
+#endif
+
+
+void
+md5_process_bytes (buffer, len, ctx)
+ const void *buffer;
+ size_t len;
+ struct md5_ctx *ctx;
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 128 - left_over > len ? len : 128 - left_over;
+
+ memcpy (&ctx->buffer[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 64)
+ {
+ md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
+
+ ctx->buflen &= 63;
+ /* The regions in the following copy operation cannot overlap. */
+ memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 64)
+ {
+#if !_STRING_ARCH_unaligned
+/* To check alignment gcc has an appropriate operator. Other
+ compilers don't. */
+# if __GNUC__ >= 2
+# define UNALIGNED_P(p) (((md5_uintptr) p) % __alignof__ (md5_uint32) != 0)
+# else
+# define UNALIGNED_P(p) (((md5_uintptr) p) % sizeof (md5_uint32) != 0)
+# endif
+ if (UNALIGNED_P (buffer))
+ while (len > 64)
+ {
+ md5_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+ buffer = (const char *) buffer + 64;
+ len -= 64;
+ }
+ else
+#endif
+ {
+ md5_process_block (buffer, len & ~63, ctx);
+ buffer = (const char *) buffer + (len & ~63);
+ len &= 63;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&ctx->buffer[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 64)
+ {
+ md5_process_block (ctx->buffer, 64, ctx);
+ left_over -= 64;
+ memcpy (ctx->buffer, &ctx->buffer[64], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+
+/* These are the four functions used in the four steps of the MD5 algorithm
+ and defined in the RFC 1321. The first function is a little bit optimized
+ (as found in Colin Plumbs public domain implementation). */
+/* #define FF(b, c, d) ((b & c) | (~b & d)) */
+#define FF(b, c, d) (d ^ (b & (c ^ d)))
+#define FG(b, c, d) FF (d, b, c)
+#define FH(b, c, d) (b ^ c ^ d)
+#define FI(b, c, d) (c ^ (b | ~d))
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0. */
+
+void
+md5_process_block (buffer, len, ctx)
+ const void *buffer;
+ size_t len;
+ struct md5_ctx *ctx;
+{
+ md5_uint32 correct_words[16];
+ const md5_uint32 *words = buffer;
+ size_t nwords = len / sizeof (md5_uint32);
+ const md5_uint32 *endp = words + nwords;
+ md5_uint32 A = ctx->A;
+ md5_uint32 B = ctx->B;
+ md5_uint32 C = ctx->C;
+ md5_uint32 D = ctx->D;
+
+ /* First increment the byte count. RFC 1321 specifies the possible
+ length of the file up to 2^64 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] += len;
+ if (ctx->total[0] < len)
+ ++ctx->total[1];
+
+ /* Process all bytes in the buffer with 64 bytes in each round of
+ the loop. */
+ while (words < endp)
+ {
+ md5_uint32 *cwp = correct_words;
+ md5_uint32 A_save = A;
+ md5_uint32 B_save = B;
+ md5_uint32 C_save = C;
+ md5_uint32 D_save = D;
+
+ /* First round: using the given function, the context and a constant
+ the next context is computed. Because the algorithms processing
+ unit is a 32-bit word and it is determined to work on words in
+ little endian byte order we perhaps have to change the byte order
+ before the computation. To reduce the work for the next steps
+ we store the swapped words in the array CORRECT_WORDS. */
+
+#define OP(a, b, c, d, s, T) \
+ do \
+ { \
+ a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
+ ++words; \
+ CYCLIC (a, s); \
+ a += b; \
+ } \
+ while (0)
+
+ /* It is unfortunate that C does not provide an operator for
+ cyclic rotation. Hope the C compiler is smart enough. */
+#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
+
+ /* Before we start, one word to the strange constants.
+ They are defined in RFC 1321 as
+
+ T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
+ */
+
+ /* Round 1. */
+ OP (A, B, C, D, 7, 0xd76aa478);
+ OP (D, A, B, C, 12, 0xe8c7b756);
+ OP (C, D, A, B, 17, 0x242070db);
+ OP (B, C, D, A, 22, 0xc1bdceee);
+ OP (A, B, C, D, 7, 0xf57c0faf);
+ OP (D, A, B, C, 12, 0x4787c62a);
+ OP (C, D, A, B, 17, 0xa8304613);
+ OP (B, C, D, A, 22, 0xfd469501);
+ OP (A, B, C, D, 7, 0x698098d8);
+ OP (D, A, B, C, 12, 0x8b44f7af);
+ OP (C, D, A, B, 17, 0xffff5bb1);
+ OP (B, C, D, A, 22, 0x895cd7be);
+ OP (A, B, C, D, 7, 0x6b901122);
+ OP (D, A, B, C, 12, 0xfd987193);
+ OP (C, D, A, B, 17, 0xa679438e);
+ OP (B, C, D, A, 22, 0x49b40821);
+
+ /* For the second to fourth round we have the possibly swapped words
+ in CORRECT_WORDS. Redefine the macro to take an additional first
+ argument specifying the function to use. */
+#undef OP
+#define OP(f, a, b, c, d, k, s, T) \
+ do \
+ { \
+ a += f (b, c, d) + correct_words[k] + T; \
+ CYCLIC (a, s); \
+ a += b; \
+ } \
+ while (0)
+
+ /* Round 2. */
+ OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
+ OP (FG, D, A, B, C, 6, 9, 0xc040b340);
+ OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
+ OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
+ OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
+ OP (FG, D, A, B, C, 10, 9, 0x02441453);
+ OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
+ OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
+ OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
+ OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
+ OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
+ OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
+ OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
+ OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
+ OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
+ OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
+
+ /* Round 3. */
+ OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
+ OP (FH, D, A, B, C, 8, 11, 0x8771f681);
+ OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
+ OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
+ OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
+ OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
+ OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
+ OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
+ OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
+ OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
+ OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
+ OP (FH, B, C, D, A, 6, 23, 0x04881d05);
+ OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
+ OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
+ OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
+ OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
+
+ /* Round 4. */
+ OP (FI, A, B, C, D, 0, 6, 0xf4292244);
+ OP (FI, D, A, B, C, 7, 10, 0x432aff97);
+ OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
+ OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
+ OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
+ OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
+ OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
+ OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
+ OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
+ OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
+ OP (FI, C, D, A, B, 6, 15, 0xa3014314);
+ OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
+ OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
+ OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
+ OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
+ OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
+
+ /* Add the starting values of the context. */
+ A += A_save;
+ B += B_save;
+ C += C_save;
+ D += D_save;
+ }
+
+ /* Put checksum in context given as argument. */
+ ctx->A = A;
+ ctx->B = B;
+ ctx->C = C;
+ ctx->D = D;
+}
diff --git a/lib/md5.h b/lib/md5.h
new file mode 100644
index 00000000..3c8b8f31
--- /dev/null
+++ b/lib/md5.h
@@ -0,0 +1,107 @@
+/* Declaration of functions and data types used for MD5 sum computing
+ library functions.
+ Copyright (C) 1995,1996,1997,1999-2001,2004,2005,2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Written by Ulrich Drepper <drepper@redhat.com>, 1995.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifndef _MD5_H
+#define _MD5_H 1
+
+#include <limits.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#define MD5_DIGEST_SIZE 16
+#define MD5_BLOCK_SIZE 64
+
+typedef uint32_t md5_uint32;
+typedef uintptr_t md5_uintptr;
+
+/* Structure to save state of computation between the single steps. */
+struct md5_ctx
+{
+ md5_uint32 A;
+ md5_uint32 B;
+ md5_uint32 C;
+ md5_uint32 D;
+
+ md5_uint32 total[2];
+ md5_uint32 buflen;
+ char buffer[128] __attribute__ ((__aligned__ (__alignof__ (md5_uint32))));
+};
+
+/*
+ * The following three functions are build up the low level used in
+ * the functions `md5_stream' and `md5_buffer'.
+ */
+
+/* Initialize structure containing state of computation.
+ (RFC 1321, 3.3: Step 3) */
+extern void md5_init_ctx (struct md5_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+extern void md5_process_block (const void *buffer, size_t len,
+ struct md5_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void md5_process_bytes (const void *buffer, size_t len,
+ struct md5_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 16 bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+extern void *md5_finish_ctx (struct md5_ctx *ctx, void *resbuf);
+
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+extern void *md5_read_ctx (const struct md5_ctx *ctx, void *resbuf);
+
+
+/* Compute MD5 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+extern int md5_stream (FILE *stream, void *resblock);
+
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *md5_buffer (const char *buffer, size_t len, void *resblock);
+
+#endif /* md5.h */
diff --git a/lib/sha1.c b/lib/sha1.c
new file mode 100644
index 00000000..0459cd6d
--- /dev/null
+++ b/lib/sha1.c
@@ -0,0 +1,386 @@
+/* Functions to compute SHA1 message digest of files or memory blocks.
+ according to the definition of SHA1 in FIPS 180-1 from April 1997.
+ Copyright (C) 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2008.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <endian.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "sha1.h"
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+# include <byteswap.h>
+# define SWAP(n) bswap_32 (n)
+#else
+# define SWAP(n) (n)
+#endif
+
+
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/* Initialize structure containing state of computation. */
+void
+sha1_init_ctx (ctx)
+ struct sha1_ctx *ctx;
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+ ctx->E = 0xc3d2e1f0;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+/* Put result from CTX in first 20 bytes following RESBUF. The result
+ must be in little endian byte order.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+void *
+sha1_read_ctx (ctx, resbuf)
+ const struct sha1_ctx *ctx;
+ void *resbuf;
+{
+ ((sha1_uint32 *) resbuf)[0] = SWAP (ctx->A);
+ ((sha1_uint32 *) resbuf)[1] = SWAP (ctx->B);
+ ((sha1_uint32 *) resbuf)[2] = SWAP (ctx->C);
+ ((sha1_uint32 *) resbuf)[3] = SWAP (ctx->D);
+ ((sha1_uint32 *) resbuf)[4] = SWAP (ctx->E);
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+void *
+sha1_finish_ctx (ctx, resbuf)
+ struct sha1_ctx *ctx;
+ void *resbuf;
+{
+ /* Take yet unprocessed bytes into account. */
+ sha1_uint32 bytes = ctx->buflen;
+ size_t pad;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] += bytes;
+ if (ctx->total[0] < bytes)
+ ++ctx->total[1];
+
+ pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
+ memcpy (&ctx->buffer[bytes], fillbuf, pad);
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer. */
+ *(sha1_uint32 *) &ctx->buffer[bytes + pad] = SWAP ((ctx->total[1] << 3) |
+ (ctx->total[0] >> 29));
+ *(sha1_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP (ctx->total[0] << 3);
+
+ /* Process last bytes. */
+ sha1_process_block (ctx->buffer, bytes + pad + 8, ctx);
+
+ return sha1_read_ctx (ctx, resbuf);
+}
+
+
+void
+sha1_process_bytes (buffer, len, ctx)
+ const void *buffer;
+ size_t len;
+ struct sha1_ctx *ctx;
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 128 - left_over > len ? len : 128 - left_over;
+
+ memcpy (&ctx->buffer[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 64)
+ {
+ sha1_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
+
+ ctx->buflen &= 63;
+ /* The regions in the following copy operation cannot overlap. */
+ memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 64)
+ {
+#if !_STRING_ARCH_unaligned
+/* To check alignment gcc has an appropriate operator. Other
+ compilers don't. */
+# if __GNUC__ >= 2
+# define UNALIGNED_P(p) (((sha1_uintptr) p) % __alignof__ (sha1_uint32) != 0)
+# else
+# define UNALIGNED_P(p) (((sha1_uintptr) p) % sizeof (sha1_uint32) != 0)
+# endif
+ if (UNALIGNED_P (buffer))
+ while (len > 64)
+ {
+ sha1_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+ buffer = (const char *) buffer + 64;
+ len -= 64;
+ }
+ else
+#endif
+ {
+ sha1_process_block (buffer, len & ~63, ctx);
+ buffer = (const char *) buffer + (len & ~63);
+ len &= 63;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&ctx->buffer[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 64)
+ {
+ sha1_process_block (ctx->buffer, 64, ctx);
+ left_over -= 64;
+ memcpy (ctx->buffer, &ctx->buffer[64], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+
+/* These are the four functions used in the four steps of the SHA1 algorithm
+ and defined in the FIPS 180-1. */
+/* #define FF(b, c, d) ((b & c) | (~b & d)) */
+#define FF(b, c, d) (d ^ (b & (c ^ d)))
+#define FG(b, c, d) (b ^ c ^ d)
+/* define FH(b, c, d) ((b & c) | (b & d) | (c & d)) */
+#define FH(b, c, d) (((b | c) & d) | (b & c))
+
+/* It is unfortunate that C does not provide an operator for cyclic
+ rotation. Hope the C compiler is smart enough. */
+#define CYCLIC(w, s) (((w) << s) | ((w) >> (32 - s)))
+
+/* Magic constants. */
+#define K0 0x5a827999
+#define K1 0x6ed9eba1
+#define K2 0x8f1bbcdc
+#define K3 0xca62c1d6
+
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0. */
+
+void
+sha1_process_block (buffer, len, ctx)
+ const void *buffer;
+ size_t len;
+ struct sha1_ctx *ctx;
+{
+ sha1_uint32 computed_words[16];
+#define W(i) computed_words[(i) % 16]
+ const sha1_uint32 *words = buffer;
+ size_t nwords = len / sizeof (sha1_uint32);
+ const sha1_uint32 *endp = words + nwords;
+ sha1_uint32 A = ctx->A;
+ sha1_uint32 B = ctx->B;
+ sha1_uint32 C = ctx->C;
+ sha1_uint32 D = ctx->D;
+ sha1_uint32 E = ctx->E;
+
+ /* First increment the byte count. FIPS 180-1 specifies the possible
+ length of the file up to 2^64 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] += len;
+ if (ctx->total[0] < len)
+ ++ctx->total[1];
+
+ /* Process all bytes in the buffer with 64 bytes in each round of
+ the loop. */
+ while (words < endp)
+ {
+ sha1_uint32 A_save = A;
+ sha1_uint32 B_save = B;
+ sha1_uint32 C_save = C;
+ sha1_uint32 D_save = D;
+ sha1_uint32 E_save = E;
+
+ /* First round: using the given function, the context and a constant
+ the next context is computed. Because the algorithms processing
+ unit is a 32-bit word and it is determined to work on words in
+ little endian byte order we perhaps have to change the byte order
+ before the computation. */
+
+#define OP(i, a, b, c, d, e) \
+ do \
+ { \
+ W (i) = SWAP (*words); \
+ e = CYCLIC (a, 5) + FF (b, c, d) + e + W (i) + K0; \
+ ++words; \
+ b = CYCLIC (b, 30); \
+ } \
+ while (0)
+
+ /* Steps 0 to 15. */
+ OP (0, A, B, C, D, E);
+ OP (1, E, A, B, C, D);
+ OP (2, D, E, A, B, C);
+ OP (3, C, D, E, A, B);
+ OP (4, B, C, D, E, A);
+ OP (5, A, B, C, D, E);
+ OP (6, E, A, B, C, D);
+ OP (7, D, E, A, B, C);
+ OP (8, C, D, E, A, B);
+ OP (9, B, C, D, E, A);
+ OP (10, A, B, C, D, E);
+ OP (11, E, A, B, C, D);
+ OP (12, D, E, A, B, C);
+ OP (13, C, D, E, A, B);
+ OP (14, B, C, D, E, A);
+ OP (15, A, B, C, D, E);
+
+ /* For the remaining 64 steps we have a more complicated
+ computation of the input data-derived values. Redefine the
+ macro to take an additional second argument specifying the
+ function to use and a new last parameter for the magic
+ constant. */
+#undef OP
+#define OP(i, f, a, b, c, d, e, K) \
+ do \
+ { \
+ W (i) = CYCLIC (W (i - 3) ^ W (i - 8) ^ W (i - 14) ^ W (i - 16), 1);\
+ e = CYCLIC (a, 5) + f (b, c, d) + e + W (i) + K; \
+ b = CYCLIC (b, 30); \
+ } \
+ while (0)
+
+ /* Steps 16 to 19. */
+ OP (16, FF, E, A, B, C, D, K0);
+ OP (17, FF, D, E, A, B, C, K0);
+ OP (18, FF, C, D, E, A, B, K0);
+ OP (19, FF, B, C, D, E, A, K0);
+
+ /* Steps 20 to 39. */
+ OP (20, FG, A, B, C, D, E, K1);
+ OP (21, FG, E, A, B, C, D, K1);
+ OP (22, FG, D, E, A, B, C, K1);
+ OP (23, FG, C, D, E, A, B, K1);
+ OP (24, FG, B, C, D, E, A, K1);
+ OP (25, FG, A, B, C, D, E, K1);
+ OP (26, FG, E, A, B, C, D, K1);
+ OP (27, FG, D, E, A, B, C, K1);
+ OP (28, FG, C, D, E, A, B, K1);
+ OP (29, FG, B, C, D, E, A, K1);
+ OP (30, FG, A, B, C, D, E, K1);
+ OP (31, FG, E, A, B, C, D, K1);
+ OP (32, FG, D, E, A, B, C, K1);
+ OP (33, FG, C, D, E, A, B, K1);
+ OP (34, FG, B, C, D, E, A, K1);
+ OP (35, FG, A, B, C, D, E, K1);
+ OP (36, FG, E, A, B, C, D, K1);
+ OP (37, FG, D, E, A, B, C, K1);
+ OP (38, FG, C, D, E, A, B, K1);
+ OP (39, FG, B, C, D, E, A, K1);
+
+ /* Steps 40 to 59. */
+ OP (40, FH, A, B, C, D, E, K2);
+ OP (41, FH, E, A, B, C, D, K2);
+ OP (42, FH, D, E, A, B, C, K2);
+ OP (43, FH, C, D, E, A, B, K2);
+ OP (44, FH, B, C, D, E, A, K2);
+ OP (45, FH, A, B, C, D, E, K2);
+ OP (46, FH, E, A, B, C, D, K2);
+ OP (47, FH, D, E, A, B, C, K2);
+ OP (48, FH, C, D, E, A, B, K2);
+ OP (49, FH, B, C, D, E, A, K2);
+ OP (50, FH, A, B, C, D, E, K2);
+ OP (51, FH, E, A, B, C, D, K2);
+ OP (52, FH, D, E, A, B, C, K2);
+ OP (53, FH, C, D, E, A, B, K2);
+ OP (54, FH, B, C, D, E, A, K2);
+ OP (55, FH, A, B, C, D, E, K2);
+ OP (56, FH, E, A, B, C, D, K2);
+ OP (57, FH, D, E, A, B, C, K2);
+ OP (58, FH, C, D, E, A, B, K2);
+ OP (59, FH, B, C, D, E, A, K2);
+
+ /* Steps 60 to 79. */
+ OP (60, FG, A, B, C, D, E, K3);
+ OP (61, FG, E, A, B, C, D, K3);
+ OP (62, FG, D, E, A, B, C, K3);
+ OP (63, FG, C, D, E, A, B, K3);
+ OP (64, FG, B, C, D, E, A, K3);
+ OP (65, FG, A, B, C, D, E, K3);
+ OP (66, FG, E, A, B, C, D, K3);
+ OP (67, FG, D, E, A, B, C, K3);
+ OP (68, FG, C, D, E, A, B, K3);
+ OP (69, FG, B, C, D, E, A, K3);
+ OP (70, FG, A, B, C, D, E, K3);
+ OP (71, FG, E, A, B, C, D, K3);
+ OP (72, FG, D, E, A, B, C, K3);
+ OP (73, FG, C, D, E, A, B, K3);
+ OP (74, FG, B, C, D, E, A, K3);
+ OP (75, FG, A, B, C, D, E, K3);
+ OP (76, FG, E, A, B, C, D, K3);
+ OP (77, FG, D, E, A, B, C, K3);
+ OP (78, FG, C, D, E, A, B, K3);
+ OP (79, FG, B, C, D, E, A, K3);
+
+ /* Add the starting values of the context. */
+ A += A_save;
+ B += B_save;
+ C += C_save;
+ D += D_save;
+ E += E_save;
+ }
+
+ /* Put checksum in context given as argument. */
+ ctx->A = A;
+ ctx->B = B;
+ ctx->C = C;
+ ctx->D = D;
+ ctx->E = E;
+}
diff --git a/lib/sha1.h b/lib/sha1.h
new file mode 100644
index 00000000..97617546
--- /dev/null
+++ b/lib/sha1.h
@@ -0,0 +1,90 @@
+/* Declaration of functions and data types used for SHA1 sum computing
+ library functions.
+ Copyright (C) 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2008.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifndef _SHA1_H
+#define _SHA1_H 1
+
+#include <limits.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#define SHA1_DIGEST_SIZE 20
+#define SHA1_BLOCK_SIZE 64
+
+typedef uint32_t sha1_uint32;
+typedef uintptr_t sha1_uintptr;
+
+/* Structure to save state of computation between the single steps. */
+struct sha1_ctx
+{
+ sha1_uint32 A;
+ sha1_uint32 B;
+ sha1_uint32 C;
+ sha1_uint32 D;
+ sha1_uint32 E;
+
+ sha1_uint32 total[2];
+ sha1_uint32 buflen;
+ char buffer[128] __attribute__ ((__aligned__ (__alignof__ (sha1_uint32))));
+};
+
+/* Initialize structure containing state of computation. */
+extern void sha1_init_ctx (struct sha1_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+extern void sha1_process_block (const void *buffer, size_t len,
+ struct sha1_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void sha1_process_bytes (const void *buffer, size_t len,
+ struct sha1_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 20 bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+extern void *sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf);
+
+
+/* Put result from CTX in first 20 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+extern void *sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf);
+
+#endif /* sha1.h */
diff --git a/lib/system.h b/lib/system.h
index 23c666ad..10b4734a 100644
--- a/lib/system.h
+++ b/lib/system.h
@@ -1,5 +1,5 @@
/* Declarations for common convenience functions.
- Copyright (C) 2006 Red Hat, Inc.
+ Copyright (C) 2006, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -78,4 +78,16 @@ extern int crc32_file (int fd, uint32_t *resp);
#define pread_retry(fd, buf, len, off) \
TEMP_FAILURE_RETRY (pread (fd, buf, len, off))
+
+/* We need define two variables, argp_program_version_hook and
+ argp_program_bug_address, in all programs. argp.h declares these
+ variables as non-const (which is correct in general). But we can
+ do better, it is not going to change. So we want to move them into
+ the .rodata section. Define macros to do the trick. */
+#define ARGP_PROGRAM_VERSION_HOOK_DEF \
+ void (*const apvh) (FILE *, struct argp_state *) \
+ __asm ("argp_program_version_hook")
+#define ARGP_PROGRAM_BUG_ADDRESS_DEF \
+ const char *const apba__ __asm ("argp_program_bug_address")
+
#endif /* system.h */
diff --git a/libasm/ChangeLog b/libasm/ChangeLog
index 99fb5e4f..ef31dbb2 100644
--- a/libasm/ChangeLog
+++ b/libasm/ChangeLog
@@ -1,3 +1,38 @@
+2010-02-15 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am: Use config/eu.am for common stuff.
+
+2009-01-10 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am: Use USE_LOCKS instead of USE_TLS.
+ * asm_error.c: Always use __thread. Remove all !USE_TLS code.
+
+2008-12-03 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am [USE_TLS]: Like libasm.so with libpthread.
+
+2008-01-11 Ulrich Drepper <drepper@redhat.com>
+
+ * libasm.h (DisasmGetSymCB_t): Change type of fourth and fifth
+ parameter.
+ * disasm_cb.c: Adjust accordingly.
+
+2008-01-08 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am (euinclude): Variable removed.
+ (pkginclude_HEADERS): Set this instead of euinclude_HEADERS.
+
+2007-12-20 Ulrich Drepper <drepper@redhat.com>
+
+ * disasm_cb.c: Add initial support to resolve addresses to symbols.
+
+2007-02-05 Ulrich Drepper <drepper@redhat.com>
+
+ * disasm_begin.c: New file.
+ * disasm_cb.c: New file.
+ * disasm_end.c: New file.
+ * disasm_str.c: New file.
+
2006-08-29 Roland McGrath <roland@redhat.com>
* Makefile.am (CLEANFILES): Add libasm.so.$(VERSION).
diff --git a/libasm/Makefile.am b/libasm/Makefile.am
index 3bea3747..52de7a3b 100644
--- a/libasm/Makefile.am
+++ b/libasm/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to create Makefile.in
##
-## Copyright (C) 2002, 2004, 2005, 2006 Red Hat, Inc.
+## Copyright (C) 2002-2010 Red Hat, Inc.
## This file is part of Red Hat elfutils.
##
## Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -24,29 +24,18 @@
## Network licensing program, please visit www.openinventionnetwork.com
## <http://www.openinventionnetwork.com>.
##
-DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H
-if MUDFLAP
-AM_CFLAGS = -fmudflap
-else
-AM_CFLAGS =
-endif
-AM_CFLAGS += -std=gnu99 -Wall -Wshadow -Werror -Wunused -Wextra -Wformat=2
-INCLUDES = -I. -I$(srcdir) -I.. \
- -I$(top_srcdir)/libelf -I$(top_srcdir)/libebl -I$(top_srcdir)/libdw\
- -I$(top_srcdir)/lib
+include $(top_srcdir)/config/eu.am
+INCLUDES += -I$(top_srcdir)/libelf -I$(top_srcdir)/libebl -I$(top_srcdir)/libdw
+
GCC_INCLUDE = -I$(shell $(CC) -print-file-name=include)
VERSION = 1
-COMPILE.os = $(filter-out -fprofile-arcs, $(filter-out -ftest-coverage, \
- $(COMPILE)))
-
lib_LIBRARIES = libasm.a
if !MUDFLAP
noinst_LIBRARIES = libasm_pic.a
noinst_PROGRAMS = $(noinst_LIBRARIES:_pic.a=.so)
endif
-euincludedir = ${includedir}/elfutils
-euinclude_HEADERS = libasm.h
+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 \
@@ -59,30 +48,27 @@ libasm_a_SOURCES = asm_begin.c asm_abort.c asm_end.c asm_error.c \
asm_addint32.c asm_adduint32.c \
asm_addint64.c asm_adduint64.c \
asm_adduleb128.c asm_addsleb128.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)
+libasm_so_LDLIBS =
+if USE_LOCKS
+libasm_so_LDLIBS += -lpthread
+endif
+
libasm_so_SOURCES =
libasm.so: 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
+ ../libebl/libebl.a ../libelf/libelf.so $(libasm_so_LDLIBS)
if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
ln -fs $@ $@.$(VERSION)
-
-%.os: %.c %.o
- if $(COMPILE.os) -c -o $@ -fpic -DPIC -DSHARED -MT $@ -MD -MP \
- -MF "$(DEPDIR)/$*.Tpo" `test -f '$<' || echo '$(srcdir)/'`$<; \
- then cat "$(DEPDIR)/$*.Tpo" >> "$(DEPDIR)/$*.Po"; \
- rm -f "$(DEPDIR)/$*.Tpo"; \
- else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
- fi
-
install: install-am libasm.so
$(mkinstalldirs) $(DESTDIR)$(libdir)
$(INSTALL_PROGRAM) libasm.so $(DESTDIR)$(libdir)/libasm-$(PACKAGE_VERSION).so
@@ -99,4 +85,4 @@ endif
noinst_HEADERS = libasmP.h symbolhash.h
EXTRA_DIST = libasm.map
-CLEANFILES = $(am_libasm_pic_a_OBJECTS) *.gcno *.gcda libasm.so.$(VERSION)
+CLEANFILES += $(am_libasm_pic_a_OBJECTS) libasm.so.$(VERSION)
diff --git a/libasm/asm_error.c b/libasm/asm_error.c
index f91bb78e..4d249e9f 100644
--- a/libasm/asm_error.c
+++ b/libasm/asm_error.c
@@ -1,5 +1,5 @@
/* Error handling in libasm.
- Copyright (C) 2002, 2004, 2005 Red Hat, Inc.
+ Copyright (C) 2002, 2004, 2005, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -36,50 +36,13 @@
/* This is the key for the thread specific memory. */
-static tls_key_t key;
-
-/* The error number. Used in non-threaded programs. */
-static int global_error;
-static bool threaded;
-/* We need to initialize the thread-specific data. */
-once_define (static, once);
-
-/* The initialization and destruction functions. */
-static void init (void);
-static void free_key_mem (void *mem);
+static __thread int global_error;
int
asm_errno (void)
{
- int result;
-
- /* If we have not yet initialized the buffer do it now. */
- once_execute (once, init);
-
- if (threaded)
- {
- /* We have a key. Use it to get the thread-specific buffer. */
- int *buffer = getspecific (key);
- if (buffer == NULL)
- {
- /* No buffer allocated so far. */
- buffer = (int *) malloc (sizeof (int));
- if (buffer == NULL)
- /* No more memory available. We use the static buffer. */
- buffer = &global_error;
-
- setspecific (key, buffer);
-
- *buffer = 0;
- }
-
- result = *buffer;
- *buffer = ASM_E_NOERROR;
- return result;
- }
-
- result = global_error;
+ int result = global_error;
global_error = ASM_E_NOERROR;
return result;
}
@@ -89,27 +52,6 @@ void
__libasm_seterrno (value)
int value;
{
- /* If we have not yet initialized the buffer do it now. */
- once_execute (once, init);
-
- if (threaded)
- {
- /* We have a key. Use it to get the thread-specific buffer. */
- int *buffer = getspecific (key);
- if (buffer == NULL)
- {
- /* No buffer allocated so far. */
- buffer = malloc (sizeof (int));
- if (buffer == NULL)
- /* No more memory available. We use the static buffer. */
- buffer = &global_error;
-
- setspecific (key, buffer);
- }
-
- *buffer = value;
- }
-
global_error = value;
}
@@ -126,37 +68,14 @@ static const char *msgs[ASM_E_NUM] =
[ASM_E_DUPLSYM] = N_("duplicate symbol"),
[ASM_E_TYPE] = N_("invalid section type for operation"),
[ASM_E_IOERROR] = N_("error during output of data"),
+ [ASM_E_ENOSUP] = N_("no backend support available"),
};
const char *
asm_errmsg (error)
int error;
{
- int last_error;
-
- /* If we have not yet initialized the buffer do it now. */
- once_execute (once, init);
-
- if ((error == 0 || error == -1) && threaded)
- {
- /* We have a key. Use it to get the thread-specific buffer. */
- int *buffer = (int *) getspecific (key);
- if (buffer == NULL)
- {
- /* No buffer allocated so far. */
- buffer = (int *) malloc (sizeof (int));
- if (buffer == NULL)
- /* No more memory available. We use the static buffer. */
- buffer = &global_error;
-
- setspecific (key, buffer);
- *buffer = 0;
- }
-
- last_error = *buffer;
- }
- else
- last_error = global_error;
+ int last_error = global_error;
if (error < -1)
return _("unknown error");
@@ -172,25 +91,3 @@ asm_errmsg (error)
return _(msgs[last_error]);
}
-
-
-/* Free the thread specific data, this is done if a thread terminates. */
-static void
-free_key_mem (void *mem)
-{
- free (mem);
- setspecific (key, NULL);
-}
-
-
-/* Initialize the key for the global variable. */
-static void
-init (void)
-{
- // XXX Screw you, gcc4, the unused function attribute does not work.
- __asm ("" :: "r" (free_key_mem));
-
- if (key_create (&key, free_key_mem) == 0)
- /* Creating the key succeeded. */
- threaded = true;
-}
diff --git a/libasm/disasm_begin.c b/libasm/disasm_begin.c
new file mode 100644
index 00000000..5b98b2a3
--- /dev/null
+++ b/libasm/disasm_begin.c
@@ -0,0 +1,61 @@
+/* Create context descriptor for disassembler.
+ Copyright (C) 2005, 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2005.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#include "libasmP.h"
+#include "../libebl/libeblP.h"
+
+
+DisasmCtx_t *
+disasm_begin (Ebl *ebl, Elf *elf, DisasmGetSymCB_t symcb)
+{
+ if (ebl == NULL)
+ return NULL;
+
+ if (ebl->disasm == NULL)
+ {
+ __libasm_seterrno (ASM_E_ENOSUP);
+ return NULL;
+ }
+
+ DisasmCtx_t *ctx = (DisasmCtx_t *) malloc (sizeof (DisasmCtx_t));
+ if (ctx == NULL)
+ {
+ __libasm_seterrno (ASM_E_NOMEM);
+ return NULL;
+ }
+
+ ctx->ebl = ebl;
+ ctx->elf = elf;
+ ctx->symcb = symcb;
+
+ return ctx;
+}
diff --git a/libasm/disasm_cb.c b/libasm/disasm_cb.c
new file mode 100644
index 00000000..56101258
--- /dev/null
+++ b/libasm/disasm_cb.c
@@ -0,0 +1,176 @@
+/* Copyright (C) 2005, 2007, 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2005.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#include "libasmP.h"
+#include "../libebl/libeblP.h"
+
+
+struct symtoken
+{
+ DisasmCtx_t *ctx;
+ void *symcbarg;
+};
+
+
+static int
+default_elf_getsym (GElf_Addr addr, Elf32_Word scnndx, GElf_Addr value,
+ char **buf, size_t *buflen, void *arg)
+{
+ struct symtoken *symtoken = (struct symtoken *) arg;
+
+ /* First try the user provided function. */
+ if (symtoken->ctx->symcb != NULL)
+ {
+ int res = symtoken->ctx->symcb (addr, scnndx, value, buf, buflen,
+ symtoken->symcbarg);
+ if (res >= 0)
+ return res;
+ }
+
+ // XXX Look up in ELF file.
+
+ return -1;
+}
+
+
+struct symaddrpair
+{
+ GElf_Addr addr;
+ const char *name;
+};
+
+
+static void
+read_symtab_exec (DisasmCtx_t *ctx)
+{
+ /* We simply use all we can get our hands on. This will produce
+ some duplicate information but this is no problem, we simply
+ ignore the latter definitions. */
+ Elf_Scn *scn= NULL;
+ while ((scn = elf_nextscn (ctx->elf, scn)) != NULL)
+ {
+ GElf_Shdr shdr_mem;
+ GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+ Elf_Data *data;
+ if (shdr == NULL || shdr->sh_type != SHT_SYMTAB
+ || (data = elf_getdata (scn, NULL)) == NULL)
+ continue;
+
+ int xndxscnidx = elf_scnshndx (scn);
+ Elf_Data *xndxdata = NULL;
+ if (xndxscnidx > 0)
+ xndxdata = elf_getdata (elf_getscn (ctx->elf, xndxscnidx), NULL);
+
+ /* Iterate over all symbols. Add all defined symbols. */
+ int nsyms = shdr->sh_size / shdr->sh_entsize;
+ for (int cnt = 1; cnt < nsyms; ++cnt)
+ {
+ Elf32_Word xshndx;
+ GElf_Sym sym_mem;
+ GElf_Sym *sym = gelf_getsymshndx (data, xndxdata, cnt, &sym_mem,
+ &xshndx);
+ if (sym == NULL)
+ continue;
+
+ /* Undefined symbols are useless here. */
+ if (sym->st_shndx == SHN_UNDEF)
+ continue;
+
+
+ }
+ }
+}
+
+
+static void
+read_symtab (DisasmCtx_t *ctx)
+{
+ /* Find the symbol table(s). */
+ GElf_Ehdr ehdr_mem;
+ GElf_Ehdr *ehdr = gelf_getehdr (ctx->elf, &ehdr_mem);
+ if (ehdr == NULL)
+ return;
+
+ switch (ehdr->e_type)
+ {
+ case ET_EXEC:
+ case ET_DYN:
+ read_symtab_exec (ctx);
+ break;
+
+ case ET_REL:
+ // XXX Handle
+ break;
+
+ default:
+ break;
+ }
+}
+
+
+static int
+null_elf_getsym (GElf_Addr addr __attribute__ ((unused)),
+ Elf32_Word scnndx __attribute__ ((unused)),
+ GElf_Addr value __attribute__ ((unused)),
+ char **buf __attribute__ ((unused)),
+ size_t *buflen __attribute__ ((unused)),
+ void *arg __attribute__ ((unused)))
+{
+ return -1;
+}
+
+
+int
+disasm_cb (DisasmCtx_t *ctx, const uint8_t **startp, const uint8_t *end,
+ GElf_Addr addr, const char *fmt, DisasmOutputCB_t outcb,
+ void *outcbarg, void *symcbarg)
+{
+ struct symtoken symtoken;
+ DisasmGetSymCB_t getsym = ctx->symcb ?: null_elf_getsym;
+
+ if (ctx->elf != NULL)
+ {
+ /* Read all symbols of the ELF file and stuff them into a hash
+ table. The key is the address and the section index. */
+ read_symtab (ctx);
+
+ symtoken.ctx = ctx;
+ symtoken.symcbarg = symcbarg;
+
+ symcbarg = &symtoken;
+
+ getsym = default_elf_getsym;
+ }
+
+ return ctx->ebl->disasm (startp, end, addr, fmt, outcb, getsym, outcbarg,
+ symcbarg);
+}
+INTDEF (disasm_cb)
diff --git a/libasm/disasm_end.c b/libasm/disasm_end.c
new file mode 100644
index 00000000..ee8b2f98
--- /dev/null
+++ b/libasm/disasm_end.c
@@ -0,0 +1,42 @@
+/* Release descriptor for disassembler.
+ Copyright (C) 2005, 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2005.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#include "libasmP.h"
+
+
+int
+disasm_end (DisasmCtx_t *ctx)
+{
+ free (ctx);
+
+ return 0;
+}
diff --git a/libasm/disasm_str.c b/libasm/disasm_str.c
new file mode 100644
index 00000000..856fd11d
--- /dev/null
+++ b/libasm/disasm_str.c
@@ -0,0 +1,69 @@
+/* Copyright (C) 2005, 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2007.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#include "libasmP.h"
+
+
+struct buffer
+{
+ char *buf;
+ size_t len;
+};
+
+
+static int
+buffer_cb (char *str, size_t len, void *arg)
+{
+ struct buffer *buffer = (struct buffer *) arg;
+
+ if (len > buffer->len)
+ /* Return additional needed space. */
+ return len - buffer->len;
+
+ buffer->buf = mempcpy (buffer->buf, str, len);
+ buffer->len = len;
+
+ return 0;
+}
+
+
+int
+disasm_str (DisasmCtx_t *ctx, const uint8_t **startp, const uint8_t *end,
+ GElf_Addr addr, const char *fmt, char **bufp, size_t len,
+ void *symcbarg)
+{
+ struct buffer buffer = { .buf = *bufp, .len = len };
+
+ int res = INTUSE(disasm_cb) (ctx, startp, end, addr, fmt, buffer_cb, &buffer,
+ symcbarg);
+ *bufp = buffer.buf;
+ return res;
+}
diff --git a/libasm/libasm.h b/libasm/libasm.h
index 6daf221e..307c7349 100644
--- a/libasm/libasm.h
+++ b/libasm/libasm.h
@@ -1,5 +1,5 @@
/* Interface for libasm.
- Copyright (C) 2002, 2005 Red Hat, Inc.
+ Copyright (C) 2002, 2005, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -45,6 +45,20 @@ typedef struct AsmScnGrp AsmScnGrp_t;
typedef struct AsmSym AsmSym_t;
+/* Opaque type for the disassembler context descriptor. */
+typedef struct DisasmCtx DisasmCtx_t;
+
+/* Type used for callback functions to retrieve symbol name. The
+ symbol reference is in the section designated by the second parameter
+ at an offset described by the first parameter. The value is the
+ third parameter. */
+typedef int (*DisasmGetSymCB_t) (GElf_Addr, Elf32_Word, GElf_Addr, char **,
+ size_t *, void *);
+
+/* Output function callback. */
+typedef int (*DisasmOutputCB_t) (char *, size_t, void *);
+
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -159,6 +173,25 @@ extern int asm_errno (void);
string is returned. */
extern const char *asm_errmsg (int __error);
+
+/* Create context descriptor for disassembler. */
+extern DisasmCtx_t *disasm_begin (Ebl *ebl, Elf *elf, DisasmGetSymCB_t symcb);
+
+/* Release descriptor for disassembler. */
+extern int disasm_end (DisasmCtx_t *ctx);
+
+/* Produce of disassembly output for given memory, store text in
+ provided buffer. */
+extern int disasm_str (DisasmCtx_t *ctx, const uint8_t **startp,
+ const uint8_t *end, GElf_Addr addr, const char *fmt,
+ char **bufp, size_t len, void *symcbarg);
+
+/* Produce disassembly output for given memory and output it using the
+ given callback functions. */
+extern int disasm_cb (DisasmCtx_t *ctx, const uint8_t **startp,
+ const uint8_t *end, GElf_Addr addr, const char *fmt,
+ DisasmOutputCB_t outcb, void *outcbarg, void *symcbarg);
+
#ifdef __cplusplus
}
#endif
diff --git a/libasm/libasm.map b/libasm/libasm.map
index b0b5b5b7..a36cdbfe 100644
--- a/libasm/libasm.map
+++ b/libasm/libasm.map
@@ -28,6 +28,11 @@ ELFUTILS_1.0 {
asm_newsym;
asm_scngrp_newsignature;
+ disasm_begin;
+ disasm_cb;
+ disasm_end;
+ disasm_str;
+
local:
*;
};
diff --git a/libasm/libasmP.h b/libasm/libasmP.h
index e6401575..ee7005f5 100644
--- a/libasm/libasmP.h
+++ b/libasm/libasmP.h
@@ -47,6 +47,7 @@ enum
ASM_E_LIBELF, /* Refer to error in libelf. */
ASM_E_TYPE, /* Invalid section type for operation. */
ASM_E_IOERROR, /* Error during output of data. */
+ ASM_E_ENOSUP, /* No backend support. */
ASM_E_NUM /* Keep this entry as the last. */
};
@@ -235,6 +236,21 @@ struct AsmScnGrp
};
+/* Descriptor for disassembler. */
+struct DisasmCtx
+{
+ /* Handle for the backend library with the disassembler routine. */
+ Ebl *ebl;
+
+ /* ELF file containing all the data passed to the function. This
+ allows to look up symbols. */
+ Elf *elf;
+
+ /* Callback function to determine symbol names. */
+ DisasmGetSymCB_t symcb;
+};
+
+
/* The default fill pattern: one zero byte. */
extern const struct FillPattern *__libasm_default_pattern
attribute_hidden;
@@ -269,6 +285,14 @@ extern int __asm_addint64_internal (AsmScn_t *asmscn, int64_t num)
attribute_hidden;
+/* Produce disassembly output for given memory and output it using the
+ given callback functions. */
+extern int __disasm_cb_internal (DisasmCtx_t *ctx, const uint8_t **startp,
+ const uint8_t *end, GElf_Addr addr,
+ const char *fmt, DisasmOutputCB_t outcb,
+ void *outcbarp, void *symcbarg)
+ attribute_hidden;
+
/* Test whether given symbol is an internal symbol and if yes, whether
we should nevertheless emit it in the symbol table. */
diff --git a/libcpu/ChangeLog b/libcpu/ChangeLog
index 5c2a4ac7..9d517fc8 100644
--- a/libcpu/ChangeLog
+++ b/libcpu/ChangeLog
@@ -1,3 +1,343 @@
+2010-02-15 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am: Use config/eu.am for common stuff.
+
+2009-04-14 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am (AM_CFLAGS): Add -fdollars-in-identifiers; it is not the
+ default on every machine.
+
+2009-01-23 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am (i386_parse_CFLAGS): Use quotes around command
+ substitution that can produce leading whitespace.
+
+2009-01-01 Ulrich Drepper <drepper@redhat.com>
+
+ * i386_parse.y (instrtable_out): Optimize match_data table by not
+ emitting 0xff masks for leading bytes.
+ * i386_disasm.c (i386_disasm): Adjust reader of match_data.
+
+ * i386_disasm.c (i386_disasm): Reset bufcnt when not matched. We
+ don't expect snprintf to fail.
+
+2008-12-31 Ulrich Drepper <drepper@redhat.com>
+
+ * defs/i386: Add dppd, dpps, insertps, movntdqa, mpsadbw, packusdw,
+ pblendvb, pblendw, pcmpeqq, pcmpestri, pcmpestrm, pcmpistri, pcmpistrm,
+ pcmpgtq, phminposuw, pinsrb, pinsrd, pmaxsb, pmaxsd, pmaxud, pmaxuw,
+ pminsb, pminsd, pminud, pminuw, pmovsxbw, pmovsxbd, pmovsxbq, pmovsxwd,
+ pmovsxwq, pmovsxdq, pmovzxbw, pmovzxbd, pmovzxbq, pmovzxwd, pmovzxwq,
+ pmovzxdq, pmuldq, pmulld, popcnt, ptest, roundss, roundps, roundpd,
+ and roundsd opcodes.
+
+ * i386_disasm.c (i386_disasm): Correct resizing of buffer.
+
+ * i386_parse.y (struct argstring): Add off element.
+ (off_op_str): New global variable.
+ (print_op_str): Print strings as concatenated strings. Keep track
+ of index and length. Update ->off element.
+ (print_op_str_idx): New function.
+ (instrtable_out): Mark op%d_fct as const.
+ Emit two tables for the strings: the string itself (op%d_str) and the
+ index table (op%d_str_idx).
+ * i386_disasm.c (i386_disasm): Adjust for new op%d_str definition.
+
+ * i386_disasm.c [X86_64] (i386_disasm): Handle rex prefix when
+ printing only prefix.
+
+ * i386_disasm.c (i386_disasm): Minor optimizations.
+
+ * i386_parse.y (instrtable_out): No need to emit index, the reader can
+ keep track.
+ * i386_disasm.c (i386_disasm): The index is not emitted anymore, no
+ need to skip it.
+
+ * i386_disasm.c (amd3dnow): Mark as const.
+
+ * defs/i386: Add blendvpd and blendvps opcodes.
+
+2008-12-30 Ulrich Drepper <drepper@redhat.com>
+
+ * defs/i386: Add blendpd and blendps opcodes.
+
+2008-12-19 Ulrich Drepper <drepper@redhat.com>
+
+ * defs/i386: Add entry for AMD 3DNOW.
+ * i386_disasm.c: Implement AMD 3DNOW disassembly.
+
+2008-12-17 Ulrich Drepper <drepper@redhat.com>
+
+ * i386_disasm.c (i386_disasm): If instruction matches prefix,
+ undoing the prefix match finishes the instruction.
+
+2008-01-21 Roland McGrath <roland@redhat.com>
+
+ * defs/i386: Fix typo in comment.
+ * i386_disasm.c (i386_disasm): Handle cltq, cqto.
+
+ * i386_parse.y: Add sanity check for NMNES macro value.
+ * Makefile.am (i386_parse.o): Fix target in dependency rule.
+ (i386_parse.h): New target with empty commands.
+ (i386_lex.o): Depend on it in place of i386_parse.c.
+
+2008-01-21 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am (EXTRA_DIST): Remove defs/x86_64.
+
+2008-01-14 Ulrich Drepper <drepper@redhat.com>
+
+ * defs/i386: Add fixes for opcodes with register number in opcode,
+ 64-bit immediate forms, nop with rex.B.
+ * i386_data.h [X86_64] (FCT_imm64$w): New function.
+ (FCT_oreg): New function.
+ (FCT_oreg$w): New function.
+ * i386_disasm.c (i386_disasm): Reinitialize fmt always before
+ starting the loop to process the string. Handle 0x90 special for
+ x86-64.
+ * i386_parse.y (fillin_arg): Expand synonyms before concatening to
+ form the function name.
+
+2008-01-11 Ulrich Drepper <drepper@redhat.com>
+
+ * i386_disasm.c (struct output_buffer): Remove symcb and symcbarg.
+ (i386_disasm): Remove appropriate initializers.
+ Use symcb to lookup symbol strings.
+
+ * i386_disasm.c (struct output_buffer): Add labelbuf, labelbufsize,
+ symaddr_use, and symaddr fields.
+ (i386_disasm): Remove labelbuf and labelbufsize variables.
+ Add back %e format. Implement %a and %l formats.
+
+ * i386_data.h (general_mod$r_m): Set symaddr_use and symaddr for %rip
+ base addressing.
+
+ * i386_disasm.c (i386_disasm): Resize output buffer if necessary.
+ Optimize output_data initialization. Free buffers before return.
+ (struct output_data): Remove op1str field. Adjust code.
+ (i386_disasm): Store final NUL btye at end of functions.
+
+2008-01-10 Ulrich Drepper <drepper@redhat.com>
+
+ * i386_data.h (FCT_crdb): New function.
+ (FCT_ccc): Use FCT_crdb.
+ (FCT_ddd): Likewise.
+
+ * defs/i386: Fix a few instructions with immediate arguments.
+
+ * i386_disasm.c: Rewrite interface to callback functions for operands
+ to take a single pointer to a structure.
+ * i386_data.h: Adjust all functions.
+
+2008-01-08 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am: Enable x86-64 again.
+ * defs/i386: Lots of changes for x86-64.
+ * i386_data.h: Add support for use in x86-64 disassembler.
+ * i386_disasm.c: Likewise.
+ * i386_parse.y: Likewise.
+ * defs/x86_64: Removed.
+
+2008-01-04 Ulrich Drepper <drepper@redhat.com>
+
+ * defs/i386: Cleanups, remove masks which are not needed.
+ Add remaining Intel opcodes.
+ * i386_data.h (FCT_imm8): Check for input buffer overrun.
+ * i386_disasm.c (i386_disasm): Likewise.
+ * i386_parse.y: Remove suffixes which are not needed anymore.
+
+2008-01-03 Ulrich Drepper <drepper@redhat.com>
+
+ * defs/i386: Add yet more SSE instructions.
+
+2008-01-02 Ulrich Drepper <drepper@redhat.com>
+
+ * i386_disasm.c (i386_disasm): Extend matcher to allow tables to
+ contain instructions with prefixes.
+ * defs/i386: Use for many SSE operations.
+ * i386_data.h (FCT_mmxreg2): Removed.
+
+2008-01-01 Ulrich Drepper <drepper@redhat.com>
+
+ * defs/i386: More 0f prefix support.
+ * i386_data.h (FCT_mmxreg): Implement.
+ (FCT_mmxreg2): Implement.
+ (FCT_mmreg): Remove.
+ * i386_disasm.c (i386_disasm): More special instructions.
+ Fix tttn suffix for cmov.
+ * i386_parse.y: Simplify test for mod/r_m mode.
+
+2007-12-31 Ulrich Drepper <drepper@redhat.com>
+
+ * defs/i386: Fix order or arguments for mov of control/debug registers.
+ * i386_data.h (FCT_ccc): Implement
+ (FCT_ddd): Implement
+
+2007-12-30 Ulrich Drepper <drepper@redhat.com>
+
+ * defs/i386: Fix 0f groups 6 and 7.
+ * i386_data.c (FCT_mod$16r_m): Implement.
+ * i386_disasm.c (i386_disasm): Third parameter can also have string.
+
+2007-12-29 Ulrich Drepper <drepper@redhat.com>
+
+ * defs/i386: Add lots of floating point ops.
+ * i386_data.h (FCT_fmod$fr_m): Removed.
+ (FCT_freg): Implement.
+ * i386_disasm.c (i386_disasm): Implement suffix_D.
+ * i386_parse.y: Emit suffix_D.
+
+ * defs/i386: Use rel instead of dispA.
+ Fix lcall, dec, div, idiv, imul, inc, jmp, ljmp, mul, neg, not, push,
+ test.
+
+ * i386_data.h (FCT_dispA): Removed.
+ (FCT_ds_xx): Add test for end of input buffer.
+ * i386_disasm.c (ABORT_ENTRY): Removed.
+ (i386_disasm): Fix handling of SIB. Pass correct address value to
+ operand callbacks.
+
+ * Makefile.am (*.mnemonics): Filter out INVALID entry.
+ * defs/i386: Define imms8 and use in appropriate places.
+ Add INVALID entries for special opcodes with special mnemonics.
+ Fix int3. Fix typo in shl. Correct xlat.
+ * i386_data.h (FCT_ds_xx): New function.
+ (FCT_ds_si): Use it.
+ (FCT_ds_bx): New function.
+ (FCT_imms8): New function.
+ * i386_disasm.c (MNE_INVALID): Define.
+ (i386_disasm): Handle invalid opcodes in mnemonics printing, not
+ separately. Fix address value passed to operand handlers.
+ * i386_parse.y (bx_reg): Define.
+ (instrtable_out): Handle INVALID entries differently, just use
+ MNE_INVALID value for .mnemonic.
+
+2007-12-28 Ulrich Drepper <drepper@redhat.com>
+
+ * defs/i386: Fix shift and mov immediate instructions.
+ * i386_data.h (FCT_imm16): Implement.
+
+ * defs/i386: Use absval instead of abs of lcall and ljmp.
+ Add parameters for cmps. Fix test and mov immediate.
+ * i386_data.h: Implement FCT_absval.
+ * i386_disasm.c: Handle data16 for suffix_w and FCT_imm.
+
+ * defs/i386: Move entries with 0x9b prefix together.
+ * i386_disasm.c (i386_disasm): Fix recognizing insufficient bytes in
+ input. Handle data16 with suffix_W.
+
+ * i386_data.h (FCT_*): Add end parameter to all functions. Check
+ before using more bytes.
+ (FCT_sel): Implement.
+ * i386_disasm.c (i386_disasm): Better handle end of input buffer.
+ Specal opcode 0x99.
+
+ * Makefile.am: Use m4 to preprocess defs/* files.
+ * defs/i386: Adjust appropriately.
+ * i386_data.c (FCT_ax): Implement.
+ (FCT_ax$w): Use FCT_ax.
+ * i386_disasm.c (ADD_STRING): Use _len instead of len.
+ (i386_disasm): If no instruction can be matched because of lack of
+ input and prefixes have been matched, print prefixes.
+ Recognize abort entries.
+ Handle special cases.
+ * i386_gendis.c: Recognize - input file name.
+ * i386_lex.c: Recognize INVALID token.
+ * i386_parse.y: Handle INVALID token input.
+
+ * defs/i386: Fix mov, pop.
+ * i386_data.h (FCT_sreg3): Implement.
+
+2007-12-27 Ulrich Drepper <drepper@redhat.com>
+
+ * defs/i386: Fix adc, add, cmp, or, sbb, sub, xchg, xor.
+ * i386_data.h (FCT_imms): New function.
+ (FCT_imm$s): Use FCT_imms for handling of signed values.
+ (FCT_imm8): Sign extend values.
+ * i386_disasm.c (i386_disasm): Implement suffix_w0.
+ * i386_parse.y: Emit suffix w0.
+
+ * i386_data.h (FCT_disp8): Add 0x prefix.
+ (FCT_ds_si): Implement.
+ * i386_disasm.c (i386_disasm): Increment addr for invalid prefixes.
+ Implement tttn suffix.
+ * i386_parse.y: Emit tttn suffix definition.
+
+2007-12-26 Ulrich Drepper <drepper@redhat.com>
+
+ * i386_data.h (struct instr_enc): Use suffix field.
+ (FCT_dx): Fill in body.
+ (FCT_es_di): Likewise.
+ (FCT_imm$s): Sign-extended byte values.
+ * i386_disasm.c: Protect ADD_CHAR and ADD_STRING macros. Adjust uses.
+ (i386_disasm): Handle suffix.
+ * i386_parse.y: Emit suffix information.
+ * defs/i386: Remove unnecessary suffixes.
+
+ * Makefile.am: Disable building x86-64 version for now.
+
+ * defs/i386: Fix and, bound, cmp, or, pop, sbb, sub, xor.
+ * i386_data.h: Pass pointer to prefix to functions. If not prefixes
+ are consumed this means invalid input.
+ * i386_disasm.c: Fix prefix printing. Adjust function calls for
+ parameter change.
+ * i386_parse.y: Recognize moda prefix.
+
+2007-12-21 Ulrich Drepper <drepper@redhat.com>
+
+ * i386_data.h: Fix SIB handling.
+ * i386_disasm.c: Likewise.
+
+2007-12-19 Ulrich Drepper <drepper@redhat.com>
+
+ * defs/i386: Fix up 'and' opcode.
+
+2007-10-31 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am: Add dependencies of the generated files on the source
+ files.
+ (i386_lex_CFLAGS): Add -Wno-sign-compare.
+
+ * defs/i386: A lot more data.
+ * defs/x86_64: Likewise.
+ * i386_data.h (struct instr_enc): Add off1_3, off2_3, and off3_3
+ fields.
+ (opfct_t): Add parameter for third operand.
+ (FCT_*): Likewise.
+ (data_prefix): New function.
+ (FCT_abs): Implement.
+ (FCT_ax): Renamed to FCT_ax$w amd implement.
+ (FCT_disp8): Implement.
+ (FCT_dispA): Implement.
+ (FCT_imm): Implement.
+ (FCT_imm$w): Implement.
+ (FCT_imm$s): Don't zero-pad numbers.
+ (FCT_imm8): Likewise.
+ (FCT_rel): Likewise.
+ (general_mod$r_m): New function.
+ (FCT_mod$r_m): Use it.
+ (FCT_mod$r_m$w): New function.
+ (FCT_mod$8r_m): New function.
+ (FCT_reg): Correctly handle 16-bit registers.
+ (FCT_reg$w): New function.
+ * i386_disasm.c (i386_disasm): Handle prefixes better.
+ Pass third parameter to operand functions.
+ * i386_parse.y (struct instruction): Add off3 field.
+ Handle third operand throughout.
+
+2007-02-05 Ulrich Drepper <drepper@redhat.com>
+
+ * i386_disasm.c: New file.
+ * i386_data.h: New file.
+ * i386_gendis.c: New file.
+ * i386_lex.l: New file.
+ * i386_parse.y: New file.
+ * memory-access.h: New file.
+ * x86_64_disasm.c: New file.
+ * defs/i386: New file.
+ * defs/i386.doc: New file.
+ * defs/x86_64: New file.
+
2005-02-15 Ulrich Drepper <drepper@redhat.com>
* Makefile (AM_CFLAGS): Add -Wunused -Wextra -Wformat=2.
diff --git a/libcpu/Makefile.am b/libcpu/Makefile.am
index 23222bec..ca334bb6 100644
--- a/libcpu/Makefile.am
+++ b/libcpu/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to create Makefile.in
##
-## Copyright (C) 2002, 2005 Red Hat, Inc.
+## Copyright (C) 2002-2010 Red Hat, Inc.
## This file is part of Red Hat elfutils.
##
## Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -24,10 +24,49 @@
## Network licensing program, please visit www.openinventionnetwork.com
## <http://www.openinventionnetwork.com>.
##
-DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H
-AM_CFLAGS = -Wall -Wshadow -Werror -Wextra -Wformat=2 -Wunused
-INCLUDES = -I$(srcdir)
+include $(top_srcdir)/config/eu.am
+INCLUDES += -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=)
+LEX_OUTPUT_ROOT = lex.$(<F:lex.l=)
+AM_YFLAGS = -p$(<F:parse.y=)
-noinst_LIBRARIES = libcpu_i386.a
+noinst_LIBRARIES = libcpu_i386.a libcpu_x86_64.a
+noinst_PROGRAMS = i386_gendis
-libcpu_i386_a_SOURCES = i386_dis.c
+libcpu_i386_a_SOURCES = i386_disasm.c
+libcpu_x86_64_a_SOURCES = x86_64_disasm.c
+
+i386_gendis_SOURCES = i386_gendis.c i386_lex.l i386_parse.y
+
+i386_disasm.o: i386.mnemonics i386_dis.h
+x86_64_disasm.o: x86_64.mnemonics x86_64_dis.h i386_disasm.c
+
+i386_dis.h: i386_gendis $(srcdir)/defs/i386
+ m4 -Di386 -DDISASSEMBLER $(srcdir)/defs/i386 | ./i386_gendis - > $@
+x86_64_dis.h: i386_gendis $(srcdir)/defs/i386
+ m4 -Dx86_64 -DDISASSEMBLER $(srcdir)/defs/i386 | ./i386_gendis - > $@
+
+i386.mnemonics x86_64.mnemonics: %.mnemonics: $(srcdir)/defs/i386
+ m4 -D$(@:.mnemonics=) -DDISASSEMBLER $^ \
+ | sed '1,/^%%/d;/^#/d;/^[[:space:]]*$$/d;s/[^:]*:\([^[:space:]]*\).*/MNE(\1)/;s/{[^}]*}//g;/INVALID/d' \
+ | sort -u > $@
+
+i386_lex_no_Werror = yes
+
+libeu = ../lib/libeu.a
+
+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_parse.h: i386_parse.c ;
+
+noinst_HEADERS = memory-access.h i386_parse.h i386_data.h
+
+EXTRA_DIST = defs/i386
+
+CLEANFILES += i386.mnemonics i386_dis.h x86_64.mnemonics x86_64_dis.h
diff --git a/libcpu/defs/i386 b/libcpu/defs/i386
new file mode 100644
index 00000000..e0db28dc
--- /dev/null
+++ b/libcpu/defs/i386
@@ -0,0 +1,970 @@
+%mask {s} 1
+%mask {w} 1
+%mask {w1} 1
+%mask {W1} 1
+%mask {W2} 1
+dnl floating point reg suffix
+%mask {D} 1
+%mask {imm8} 8
+%mask {imms8} 8
+%mask {imm16} 16
+%mask {reg} 3
+%mask {oreg} 3
+%mask {reg16} 3
+%mask {reg64} 3
+%mask {tttn} 4
+%mask {mod} 2
+%mask {moda} 2
+%mask {MOD} 2
+%mask {r_m} 3
+dnl like {r_m} but referencing byte register
+%mask {8r_m} 3
+dnl like {r_m} but referencing 16-bit register
+%mask {16r_m} 3
+dnl like {r_m} but referencing 32- or 64-bit register
+%mask {64r_m} 3
+%mask {disp8} 8
+dnl imm really is 8/16/32 bit depending on the situation.
+%mask {imm} 8
+%mask {imm64} 8
+%mask {imms} 8
+%mask {rel} 32
+%mask {abs} 32
+%mask {absval} 32
+%mask {sel} 16
+%mask {imm32} 32
+%mask {ccc} 3
+%mask {ddd} 3
+%mask {sreg3} 3
+%mask {sreg2} 2
+%mask {mmxreg} 3
+%mask {R_M} 3
+%mask {Mod} 2
+%mask {xmmreg} 3
+%mask {R_m} 3
+%mask {xmmreg1} 3
+%mask {xmmreg2} 3
+%mask {mmxreg1} 3
+%mask {mmxreg2} 3
+%mask {predps} 8
+%mask {freg} 3
+%mask {fmod} 2
+%mask {fr_m} 3
+%prefix {R}
+%prefix {RE}
+%suffix {W}
+%suffix {w0}
+%synonym {xmmreg1} {xmmreg}
+%synonym {xmmreg2} {xmmreg}
+%synonym {mmxreg1} {mmxreg}
+%synonym {mmxreg2} {mmxreg}
+ifdef(`i386',
+`%synonym {oreg} {reg}
+%synonym {imm64} {imm}
+')dnl
+
+%%
+ifdef(`i386',
+`00110111:aaa
+11010101,00001010:aad
+11010100,00001010:aam
+00111111:aas
+')dnl
+0001010{w},{imm}:adc {imm}{w},{ax}{w}
+1000000{w},{mod}010{r_m},{imm}:adc{w} {imm}{w},{mod}{r_m}{w}
+1000001{w},{mod}010{r_m},{imms8}:adc{w} {imms8},{mod}{r_m}
+0001000{w},{mod}{reg}{r_m}:adc {reg}{w},{mod}{r_m}{w}
+0001001{w},{mod}{reg}{r_m}:adc {mod}{r_m}{w},{reg}{w}
+0000010{w},{imm}:add {imm}{w},{ax}{w}
+1000000{w},{mod}000{r_m},{imm}:add{w} {imm}{w},{mod}{r_m}{w}
+10000011,{mod}000{r_m},{imms8}:add{w} {imms8},{mod}{r_m}
+0000000{w},{mod}{reg}{r_m}:add {reg}{w},{mod}{r_m}{w}
+0000001{w},{mod}{reg}{r_m}:add {mod}{r_m}{w},{reg}{w}
+01100110,00001111,11010000,{Mod}{xmmreg}{R_m}:addsubpd {Mod}{R_m},{xmmreg}
+11110010,00001111,11010000,{Mod}{xmmreg}{R_m}:addsubps {Mod}{R_m},{xmmreg}
+0010010{w},{imm}:and {imm}{w},{ax}{w}
+1000000{w},{mod}100{r_m},{imm}:and{w} {imm}{w},{mod}{r_m}{w}
+1000001{w},{mod}100{r_m},{imms8}:and{w} {imms8},{mod}{r_m}
+0010000{w},{mod}{reg}{r_m}:and {reg}{w},{mod}{r_m}{w}
+0010001{w},{mod}{reg}{r_m}:and {mod}{r_m}{w},{reg}{w}
+01100110,00001111,01010100,{Mod}{xmmreg}{R_m}:andpd {Mod}{R_m},{xmmreg}
+00001111,01010100,{Mod}{xmmreg}{R_m}:andps {Mod}{R_m},{xmmreg}
+01100110,00001111,01010101,{Mod}{xmmreg}{R_m}:andnpd {Mod}{R_m},{xmmreg}
+00001111,01010101,{Mod}{xmmreg}{R_m}:andnps {Mod}{R_m},{xmmreg}
+ifdef(`i386',
+`01100011,{mod}{reg16}{r_m}:arpl {reg16},{mod}{r_m}
+01100010,{moda}{reg}{r_m}:bound {reg},{moda}{r_m}
+',
+`01100011,{mod}{reg64}{r_m}:movslq {mod}{r_m},{reg64}
+')dnl
+00001111,10111100,{mod}{reg}{r_m}:bsf {mod}{r_m},{reg}
+00001111,10111101,{mod}{reg}{r_m}:bsr {mod}{r_m},{reg}
+00001111,11001{reg}:bswap {reg}
+00001111,10100011,{mod}{reg}{r_m}:bt {reg},{mod}{r_m}
+00001111,10111010,{mod}100{r_m},{imm8}:bt{w} {imm8},{mod}{r_m}
+00001111,10111011,{mod}{reg}{r_m}:btc {reg},{mod}{r_m}
+00001111,10111010,{mod}111{r_m},{imm8}:btc{w} {imm8},{mod}{r_m}
+00001111,10110011,{mod}{reg}{r_m}:btr {reg},{mod}{r_m}
+00001111,10111010,{mod}110{r_m},{imm8}:btr{w} {imm8},{mod}{r_m}
+00001111,10101011,{mod}{reg}{r_m}:bts {reg},{mod}{r_m}
+00001111,10111010,{mod}101{r_m},{imm8}:bts{w} {imm8},{mod}{r_m}
+11101000,{rel}:call{W} {rel}
+11111111,{mod}010{64r_m}:call{W} *{mod}{64r_m}
+ifdef(`i386',
+`10011010,{absval},{sel}:lcall {sel},{absval}
+')dnl
+11111111,{mod}011{64r_m}:lcall{W} *{mod}{64r_m}
+# SPECIAL 10011000:[{rex.w}?cltq:{dpfx}?cbtw:cwtl]
+10011000:INVALID
+# SPECIAL 10011001:[{rex.w}?cqto:{dpfx}?cltd:cwtd]
+10011001:INVALID
+11111000:clc
+11111100:cld
+11111010:cli
+00001111,00000101:syscall
+00001111,00000110:clts
+00001111,00000111:sysret
+00001111,00110100:sysenter
+00001111,00110101:sysexit
+11110101:cmc
+00001111,0100{tttn},{mod}{reg}{r_m}:cmov{tttn} {mod}{r_m},{reg}
+0011110{w},{imm}:cmp {imm}{w},{ax}{w}
+1000000{w},{mod}111{r_m},{imm}:cmp{w} {imm}{w},{mod}{r_m}{w}
+10000011,{mod}111{r_m},{imms8}:cmp{w} {imms8},{mod}{r_m}
+0011100{w},{mod}{reg}{r_m}:cmp {reg}{w},{mod}{r_m}{w}
+0011101{w},{mod}{reg}{r_m}:cmp {mod}{r_m}{w},{reg}{w}
+ifdef(`ASSEMBLER',
+`11110010,00001111,11000010,{Mod}{xmmreg}{R_m},{imm8}:cmpsd {imm8},{Mod}{R_m},{xmmreg}
+11110011,00001111,11000010,{Mod}{xmmreg}{R_m},{imm8}:cmpss {imm8},{Mod}{R_m},{xmmreg}
+01100110,00001111,11000010,{Mod}{xmmreg}{R_m},{imm8}:cmppd {imm8},{Mod}{R_m},{xmmreg}
+00001111,11000010,{Mod}{xmmreg}{R_m},{imm8}:cmpps {imm8},{Mod}{R_m},{xmmreg}
+',
+`11110010,00001111,11000010,{Mod}{xmmreg}{R_m},{imm8}:INVALID {Mod}{R_m},{xmmreg}
+11110011,00001111,11000010,{Mod}{xmmreg}{R_m},{imm8}:INVALID {Mod}{R_m},{xmmreg}
+01100110,00001111,11000010,{Mod}{xmmreg}{R_m},{imm8}:INVALID {Mod}{R_m},{xmmreg}
+00001111,11000010,{Mod}{xmmreg}{R_m},{imm8}:INVALID {Mod}{R_m},{xmmreg}
+')dnl
+1010011{w}:{RE}cmps{w} {es_di},{ds_si}
+00001111,1011000{w},{mod}{reg}{r_m}:cmpxchg {reg}{w},{mod}{r_m}{w}
+ifdef(`i386',
+`00001111,11000111,{mod}001{r_m}:cmpxchg8b {mod}{r_m}
+',
+`# SPECIAL 00001111,11000111,{mod}001{r_m}:[{rex.w}?cmpxchg16b:cmpxchg8b] {reg},{mod}{r_m}
+00001111,11000111,{mod}001{r_m}:INVALID {mod}{r_m}
+')dnl
+00001111,10100010:cpuid
+11110011,00001111,11100110,{Mod}{xmmreg}{R_m}:cvtdq2pd {Mod}{R_m},{xmmreg}
+11110010,00001111,11100110,{Mod}{xmmreg}{R_m}:cvtpd2dq {Mod}{R_m},{xmmreg}
+01100110,00001111,11100110,{Mod}{xmmreg}{R_m}:cvttpd2dq {Mod}{R_m},{xmmreg}
+ifdef(`i386',
+`00100111:daa
+00101111:das
+')dnl
+1111111{w},{mod}001{r_m}:dec{w} {mod}{r_m}{w}
+ifdef(`i386',
+`01001{reg}:dec {reg}
+')dnl
+1111011{w},{mod}110{r_m}:div{w} {mod}{r_m}{w}
+00001111,01110111:emms
+11001000,{imm16},{imm8}:enter{W} {imm16},{imm8}
+11011001,11010000:fnop
+11011001,11100000:fchs
+11011001,11100001:fabs
+11011001,11100100:ftst
+11011001,11100101:fxam
+11011001,11101000:fld1
+11011001,11101001:fldl2t
+11011001,11101010:fldl2e
+11011001,11101011:fldpi
+11011001,11101100:fldlg2
+11011001,11101101:fldln2
+11011001,11101110:fldz
+11011001,11110000:f2xm1
+11011001,11110001:fyl2x
+11011001,11110010:fptan
+11011001,11110011:fpatan
+11011001,11110100:fxtract
+11011001,11110101:fprem1
+11011001,11110110:fdecstp
+11011001,11110111:fincstp
+11011001,11111000:fprem
+11011001,11111001:fyl2xp1
+11011001,11111010:fsqrt
+11011001,11111011:fsincos
+11011001,11111100:frndint
+11011001,11111101:fscale
+11011001,11111110:fsin
+11011001,11111111:fcos
+# ORDER
+11011000,11000{freg}:fadd {freg},%st
+11011100,11000{freg}:fadd %st,{freg}
+11011{D}00,{mod}000{r_m}:fadd{D} {mod}{r_m}
+# ORDER END
+# ORDER
+11011000,11001{freg}:fmul {freg},%st
+11011100,11001{freg}:fmul %st,{freg}
+11011{D}00,{mod}001{r_m}:fmul{D} {mod}{r_m}
+# ORDER END
+# ORDER
+11011000,11100{freg}:fsub {freg},%st
+11011100,11100{freg}:fsub %st,{freg}
+11011{D}00,{mod}100{r_m}:fsub{D} {mod}{r_m}
+# ORDER END
+# ORDER
+11011000,11101{freg}:fsubr {freg},%st
+11011100,11101{freg}:fsubr %st,{freg}
+11011{D}00,{mod}101{r_m}:fsubr{D} {mod}{r_m}
+# ORDER END
+# ORDER
+11011101,11010{freg}:fst {freg}
+11011{D}01,{mod}010{r_m}:fst{D} {mod}{r_m}
+# ORDER END
+# ORDER
+11011101,11011{freg}:fstp {freg}
+11011{D}01,{mod}011{r_m}:fstp{D} {mod}{r_m}
+# ORDER END
+11011001,{mod}100{r_m}:fldenv {mod}{r_m}
+11011001,{mod}101{r_m}:fldcw {mod}{r_m}
+11011001,{mod}110{r_m}:fnstenv {mod}{r_m}
+11011001,{mod}111{r_m}:fnstcw {mod}{r_m}
+11011001,11001{freg}:fxch {freg}
+# ORDER
+11011110,11000{freg}:faddp %st,{freg}
+ifdef(`ASSEMBLER',
+`11011110,11000001:faddp
+')dnl
+# ORDER
+11011010,11000{freg}:fcmovb {freg},%st
+11011{w1}10,{mod}000{r_m}:fiadd{w1} {mod}{r_m}
+# ORDER END
+# ORDER
+11011010,11001{freg}:fcmove {freg},%st
+11011110,11001{freg}:fmulp %st,{freg}
+11011{w1}10,{mod}001{r_m}:fimul{w1} {mod}{r_m}
+# ORDER END
+# ORDER
+11011110,11100{freg}:fsubp %st,{freg}
+11011{w1}10,{mod}100{r_m}:fisub{w1} {mod}{r_m}
+# ORDER END
+# ORDER
+11011110,11101{freg}:fsubrp %st,{freg}
+11011{w1}10,{mod}101{r_m}:fisubr{w1} {mod}{r_m}
+# ORDER END
+# ORDER
+11011111,11100000:fnstsw %ax
+11011111,{mod}100{r_m}:fbld {mod}{r_m}
+# ORDER END
+# ORDER
+11011111,11110{freg}:fcomip {freg},%st
+11011111,{mod}110{r_m}:fbstp {mod}{r_m}
+# ORDER END
+11011001,11100000:fchs
+# ORDER
+10011011,11011011,11100010:fclex
+10011011,11011011,11100011:finit
+10011011:fwait
+# END ORDER
+11011011,11100010:fnclex
+11011010,11000{freg}:fcmovb {freg},%st
+11011010,11001{freg}:fcmove {freg},%st
+11011010,11010{freg}:fcmovbe {freg},%st
+11011010,11011{freg}:fcmovu {freg},%st
+11011011,11000{freg}:fcmovnb {freg},%st
+11011011,11001{freg}:fcmovne {freg},%st
+11011011,11010{freg}:fcmovnbe {freg},%st
+11011011,11011{freg}:fcmovnu {freg},%st
+# ORDER
+11011000,11010{freg}:fcom {freg}
+ifdef(`ASSEMBLER',
+`11011000,11010001:fcom
+')dnl
+11011{D}00,{mod}010{r_m}:fcom{D} {mod}{r_m}
+# END ORDER
+# ORDER
+11011000,11011{freg}:fcomp {freg}
+ifdef(`ASSEMBLER',
+`11011000,11011001:fcomp
+')dnl
+11011{D}00,{mod}011{r_m}:fcomp{D} {mod}{r_m}
+# END ORDER
+11011110,11011001:fcompp
+11011011,11110{freg}:fcomi {freg},%st
+11011111,11110{freg}:fcomip {freg},%st
+11011011,11101{freg}:fucomi {freg},%st
+11011111,11101{freg}:fucomip {freg},%st
+11011001,11111111:fcos
+11011001,11110110:fdecstp
+# ORDER
+11011000,11110{freg}:fdiv {freg},%st
+11011100,11110{freg}:fdiv %st,{freg}
+11011{D}00,{mod}110{r_m}:fdiv{D} {mod}{r_m}
+# END ORDER
+11011010,{mod}110{r_m}:fidivl {mod}{r_m}
+# ORDER
+11011110,11110{freg}:fdivp %st,{freg}
+11011110,{mod}110{r_m}:fidiv {mod}{r_m}
+# END ORDER
+11011110,11111{freg}:fdivrp %st,{freg}
+ifdef(`ASSEMBLER',
+`11011110,11111001:fdivp
+')dnl
+# ORDER
+11011000,11111{freg}:fdivr {freg},%st
+11011100,11111{freg}:fdivr %st,{freg}
+11011{D}00,{mod}111{r_m}:fdivr{D} {mod}{r_m}
+# END ORDER
+11011010,{mod}111{r_m}:fidivrl {mod}{r_m}
+11011110,{mod}111{r_m}:fidivr {mod}{r_m}
+11011110,11110{freg}:fdivrp %st,{freg}
+ifdef(`ASSEMBLER',
+`11011110,11110001:fdivrp
+')dnl
+11011101,11000{freg}:ffree {freg}
+11011010,11010{freg}:fcmovbe {freg}
+11011{w1}10,{mod}010{r_m}:ficom{w1} {mod}{r_m}
+11011010,11011{freg}:fcmovu {freg}
+11011{w1}10,{mod}011{r_m}:ficomp{w1} {mod}{r_m}
+11011111,{mod}000{r_m}:fild {mod}{r_m}
+11011011,{mod}000{r_m}:fildl {mod}{r_m}
+11011111,{mod}101{r_m}:fildll {mod}{r_m}
+11011001,11110111:fincstp
+11011011,11100011:fninit
+11011{w1}11,{mod}010{r_m}:fist{w1} {mod}{r_m}
+11011{w1}11,{mod}011{r_m}:fistp{w1} {mod}{r_m}
+11011111,{mod}111{r_m}:fistpll {mod}{r_m}
+11011{w1}11,{mod}001{r_m}:fisttp{w1} {mod}{r_m}
+11011101,{mod}001{r_m}:fisttpll {mod}{r_m}
+11011011,{mod}101{r_m}:fldt {mod}{r_m}
+11011011,{mod}111{r_m}:fstpt {mod}{r_m}
+# ORDER
+11011001,11000{freg}:fld {freg}
+11011{D}01,{mod}000{r_m}:fld{D} {mod}{r_m}
+# ORDER END
+# ORDER
+11011101,11100{freg}:fucom {freg}
+11011101,{mod}100{r_m}:frstor {mod}{r_m}
+# ORDER END
+11011101,11101{freg}:fucomp {freg}
+11011101,{mod}110{r_m}:fnsave {mod}{r_m}
+11011101,{mod}111{r_m}:fnstsw {mod}{r_m}
+#
+#
+#
+11110100:hlt
+1111011{w},{mod}111{r_m}:idiv{w} {mod}{r_m}{w}
+1111011{w},{mod}101{r_m}:imul{w} {mod}{r_m}{w}
+00001111,10101111,{mod}{reg}{r_m}:imul {mod}{r_m},{reg}
+011010{s}1,{mod}{reg}{r_m},{imm}:imul {imm}{s},{mod}{r_m},{reg}
+1110010{w},{imm8}:in {imm8},{ax}{w}
+1110110{w}:in {dx},{ax}{w}
+1111111{w},{mod}000{r_m}:inc{w} {mod}{r_m}{w}
+ifdef(`i386',
+`01000{reg}:inc {reg}
+')dnl
+0110110{w}:{R}ins{w} {dx},{es_di}
+11001101,{imm8}:int {imm8}
+11001100:int3
+ifdef(`i386',
+`11001110:into
+')dnl
+00001111,00001000:invd
+# ORDER
+00001111,00000001,11111000:swapgs
+00001111,00000001,{mod}111{r_m}:invlpg {mod}{r_m}
+# ORDER END
+11001111:iret{W1}
+0111{tttn},{disp8}:j{tttn} {disp8}
+00001111,1000{tttn},{rel}:j{tttn} {rel}
+00001111,1001{tttn},{mod}000{8r_m}:set{tttn} {mod}{8r_m}
+# SPECIAL 11100011,{disp8}:[{dpfx}?jcxz:jecxz] {disp8}
+11100011,{disp8}:INVALID {disp8}
+11101011,{disp8}:jmp {disp8}
+11101001,{rel}:jmp{W} {rel}
+11111111,{mod}100{64r_m}:jmp{W} *{mod}{64r_m}
+11101010,{absval},{sel}:ljmp {sel},{absval}
+11111111,{mod}101{64r_m}:ljmp{W} *{mod}{64r_m}
+10011111:lahf
+00001111,00000010,{mod}{reg}{16r_m}:lar {mod}{16r_m},{reg}
+ifdef(`i386',
+`11000101,{mod}{reg}{r_m}:lds {mod}{r_m},{reg}
+')dnl
+10001101,{mod}{reg}{r_m}:lea {mod}{r_m},{reg}
+11001001:leave{W}
+ifdef(`i386',
+`11000100,{mod}{reg}{r_m}:les {mod}{r_m},{reg}
+')dnl
+00001111,10110100,{mod}{reg}{r_m}:lfs {mod}{r_m},{reg}
+00001111,10110101,{mod}{reg}{r_m}:lgs {mod}{r_m},{reg}
+ifdef(`i386',
+`00001111,00000001,{mod}010{r_m}:lgdt{w0} {mod}{r_m}
+00001111,00000001,{mod}011{r_m}:lidt{w0} {mod}{r_m}
+',
+`00001111,00000001,{mod}010{r_m}:lgdt {mod}{r_m}
+00001111,00000001,{mod}011{r_m}:lidt {mod}{r_m}
+')dnl
+00001111,00000000,{mod}010{16r_m}:lldt {mod}{16r_m}
+00001111,00000001,{mod}110{16r_m}:lmsw {mod}{16r_m}
+11110000:lock
+1010110{w}:{R}lods {ds_si},{ax}{w}
+11100010,{disp8}:loop {disp8}
+11100001,{disp8}:loope {disp8}
+11100000,{disp8}:loopne {disp8}
+00001111,00000011,{mod}{reg}{16r_m}:lsl {mod}{16r_m},{reg}
+00001111,10110010,{mod}{reg}{r_m}:lss {mod}{r_m},{reg}
+00001111,00000000,{mod}011{16r_m}:ltr {mod}{16r_m}
+1000100{w},{mod}{reg}{r_m}:mov {reg}{w},{mod}{r_m}{w}
+1000101{w},{mod}{reg}{r_m}:mov {mod}{r_m}{w},{reg}{w}
+1100011{w},{mod}000{r_m},{imm}:mov{w} {imm}{w},{mod}{r_m}{w}
+1011{w}{oreg},{imm64}:mov {imm64}{w},{oreg}{w}
+1010000{w},{abs}:mov {abs},{ax}{w}
+1010001{w},{abs}:mov {ax}{w},{abs}
+00001111,00100000,11{ccc}{reg64}:mov {ccc},{reg64}
+00001111,00100010,11{ccc}{reg64}:mov {reg64},{ccc}
+00001111,00100001,11{ddd}{reg64}:mov {ddd},{reg64}
+00001111,00100011,11{ddd}{reg64}:mov {reg64},{ddd}
+10001100,{mod}{sreg3}{r_m}:mov {sreg3},{mod}{r_m}
+10001110,{mod}{sreg3}{r_m}:mov {mod}{r_m},{sreg3}
+1010010{w}:{R}movs{w} {ds_si},{es_di}
+00001111,10111110,{mod}{reg}{8r_m}:movsbl {mod}{8r_m},{reg}
+00001111,10111111,{mod}{reg}{16r_m}:movswl {mod}{16r_m},{reg}
+00001111,10110110,{mod}{reg}{8r_m}:movzbl {mod}{8r_m},{reg}
+00001111,10110111,{mod}{reg}{16r_m}:movzwl {mod}{16r_m},{reg}
+1111011{w},{mod}100{r_m}:mul{w} {mod}{r_m}{w}
+1111011{w},{mod}011{r_m}:neg{w} {mod}{r_m}{w}
+11110011,10010000:pause
+ifdef(`i386',
+`10010000:nop
+',
+`10010000:INVALID
+')dnl
+# ORDER before out
+11110011,00001111,10111000,{mod}{reg}{r_m}:popcnt {mod}{r_m},{reg}
+# END ORDER
+1111011{w},{mod}010{r_m}:not{w} {mod}{r_m}{w}
+0000100{w},{mod}{reg}{r_m}:or {reg}{w},{mod}{r_m}{w}
+0000101{w},{mod}{reg}{r_m}:or {mod}{r_m}{w},{reg}{w}
+1000000{w},{mod}001{r_m},{imm}:or{w} {imm}{w},{mod}{r_m}{w}
+1000001{w},{mod}001{r_m},{imms8}:or{w} {imms8},{mod}{r_m}{w}
+0000110{w},{imm}:or {imm}{w},{ax}{w}
+1110011{w},{imm8}:out {ax}{w},{imm8}
+1110111{w}:out {ax}{w},{dx}
+0110111{w}:{R}outs{w} {ds_si},{dx}
+ifdef(`i386',
+`10001111,{mod}000{r_m}:pop{w} {mod}{r_m}
+',
+# XXX This is not the cleanest way...
+`10001111,11000{reg64}:pop {reg64}
+10001111,{mod}000{r_m}:pop{W} {mod}{r_m}
+')dnl
+00001111,10{sreg3}001:pop{W} {sreg3}
+10011101:popf{W}
+# XXX This is not the cleanest way...
+ifdef(`i386',
+`11111111,{mod}110{r_m}:push{w} {mod}{r_m}
+',
+`11111111,11110{reg64}:push {reg64}
+11111111,{mod}110{r_m}:pushq {mod}{r_m}
+')dnl
+ifdef(`i386',
+`01010{reg}:push {reg}
+01011{reg}:pop {reg}
+',
+`01010{reg64}:push {reg64}
+01011{reg64}:pop {reg64}
+')dnl
+011010{s}0,{imm}:push{W} {imm}{s}
+000{sreg2}110:push {sreg2}
+00001111,10{sreg3}000:push{W} {sreg3}
+ifdef(`i386',
+`01100000:pusha{W}
+01100001:popa{W}
+')dnl
+10011100:pushf{W}
+1101000{w},{mod}010{r_m}:rcl{w} {mod}{r_m}{w}
+1101001{w},{mod}010{r_m}:rcl{w} %cl,{mod}{r_m}{w}
+1100000{w},{mod}010{r_m},{imm8}:rcl{w} {imm8},{mod}{r_m}{w}
+1101000{w},{mod}011{r_m}:rcr{w} {mod}{r_m}{w}
+1101001{w},{mod}011{r_m}:rcr{w} %cl,{mod}{r_m}{w}
+1100000{w},{mod}011{r_m},{imm8}:rcr{w} {imm8},{mod}{r_m}{w}
+00001111,00110010:rdmsr
+00001111,00110011:rdpmc
+00001111,00110001:rdtsc
+11000011:ret{W}
+11000010,{imm16}:ret{W} {imm16}
+11001011:lret
+11001010,{imm16}:lret {imm16}
+1101000{w},{mod}000{r_m}:rol{w} {mod}{r_m}{w}
+1101001{w},{mod}000{r_m}:rol{w} %cl,{mod}{r_m}{w}
+1100000{w},{mod}000{r_m},{imm8}:rol{w} {imm8},{mod}{r_m}{w}
+1101000{w},{mod}001{r_m}:ror{w} {mod}{r_m}{w}
+1101001{w},{mod}001{r_m}:ror{w} %cl,{mod}{r_m}{w}
+1100000{w},{mod}001{r_m},{imm8}:ror{w} {imm8},{mod}{r_m}{w}
+00001111,10101010:rsm
+10011110:sahf
+1101000{w},{mod}111{r_m}:sar{w} {mod}{r_m}{w}
+1101001{w},{mod}111{r_m}:sar{w} %cl,{mod}{r_m}{w}
+1100000{w},{mod}111{r_m},{imm8}:sar{w} {imm8},{mod}{r_m}{w}
+0001100{w},{mod}{reg}{r_m}:sbb {reg}{w},{mod}{r_m}{w}
+0001101{w},{mod}{reg}{r_m}:sbb {mod}{r_m}{w},{reg}{w}
+0001110{w},{imm}:sbb {imm}{w},{ax}{w}
+1000000{w},{mod}011{r_m},{imm}:sbb{w} {imm}{w},{mod}{r_m}{w}
+1000001{w},{mod}011{r_m},{imms8}:sbb{w} {imms8},{mod}{r_m}
+1010111{w}:{RE}scas {es_di},{ax}{w}
+00001111,1001{tttn},{mod}000{r_m}:set{tttn} {mod}{r_m}
+1101000{w},{mod}100{r_m}:shl{w} {mod}{r_m}{w}
+1101001{w},{mod}100{r_m}:shl{w} %cl,{mod}{r_m}{w}
+1100000{w},{mod}100{r_m},{imm8}:shl{w} {imm8},{mod}{r_m}{w}
+1101000{w},{mod}101{r_m}:shr{w} {mod}{r_m}{w}
+00001111,10100100,{mod}{reg}{r_m},{imm8}:shld {imm8},{reg},{mod}{r_m}
+00001111,10100101,{mod}{reg}{r_m}:shld %cl,{reg},{mod}{r_m}
+1101001{w},{mod}101{r_m}:shr{w} %cl,{mod}{r_m}{w}
+1100000{w},{mod}101{r_m},{imm8}:shr{w} {imm8},{mod}{r_m}{w}
+00001111,10101100,{mod}{reg}{r_m},{imm8}:shrd {imm8},{reg},{mod}{r_m}
+00001111,10101101,{mod}{reg}{r_m}:shrd %cl,{reg},{mod}{r_m}
+# ORDER
+00001111,00000001,11000001:vmcall
+00001111,00000001,11000010:vmlaunch
+00001111,00000001,11000011:vmresume
+00001111,00000001,11000100:vmxoff
+00001111,01111000,{mod}{reg64}{64r_m}:vmread {reg64},{mod}{64r_m}
+00001111,01111001,{mod}{reg64}{64r_m}:vmwrite {mod}{64r_m},{reg64}
+ifdef(`i386',
+`00001111,00000001,{mod}000{r_m}:sgdtl {mod}{r_m}
+',
+`00001111,00000001,{mod}000{r_m}:sgdt {mod}{r_m}
+')dnl
+# ORDER END
+# ORDER
+ifdef(`i386',
+`00001111,00000001,11001000:monitor %eax,%ecx,%edx
+00001111,00000001,11001001:mwait %eax,%ecx
+',
+`00001111,00000001,11001000:monitor %rax,%rcx,%rdx
+00001111,00000001,11001001:mwait %rax,%rcx
+')dnl
+ifdef(`i386',
+`00001111,00000001,{mod}001{r_m}:sidtl {mod}{r_m}
+',
+`00001111,00000001,{mod}001{r_m}:sidt {mod}{r_m}
+')dnl
+# ORDER END
+00001111,00000000,{mod}000{r_m}:sldt {mod}{r_m}
+00001111,00000001,{mod}100{r_m}:smsw {mod}{r_m}
+11111001:stc
+11111101:std
+11111011:sti
+1010101{w}:{R}stos {ax}{w},{es_di}
+00001111,00000000,{mod}001{r_m}:str {mod}{r_m}
+0010100{w},{mod}{reg}{r_m}:sub {reg}{w},{mod}{r_m}{w}
+0010101{w},{mod}{reg}{r_m}:sub {mod}{r_m}{w},{reg}{w}
+0010110{w},{imm}:sub {imm}{w},{ax}{w}
+1000000{w},{mod}101{r_m},{imm}:sub{w} {imm}{w},{mod}{r_m}{w}
+1000001{w},{mod}101{r_m},{imms8}:sub{w} {imms8},{mod}{r_m}
+1000010{w},{mod}{reg}{r_m}:test {reg}{w},{mod}{r_m}{w}
+1010100{w},{imm}:test {imm}{w},{ax}{w}
+1111011{w},{mod}000{r_m},{imm}:test{w} {imm}{w},{mod}{r_m}{w}
+00001111,00001011:ud2a
+00001111,00000000,{mod}100{16r_m}:verr {mod}{16r_m}
+00001111,00000000,{mod}101{16r_m}:verw {mod}{16r_m}
+00001111,00001001:wbinvd
+00001111,00001101,{mod}000{8r_m}:prefetch {mod}{8r_m}
+00001111,00001101,{mod}001{8r_m}:prefetchw {mod}{8r_m}
+00001111,00011000,{mod}000{r_m}:prefetchnta {mod}{r_m}
+00001111,00011000,{mod}001{r_m}:prefetcht0 {mod}{r_m}
+00001111,00011000,{mod}010{r_m}:prefetcht1 {mod}{r_m}
+00001111,00011000,{mod}011{r_m}:prefetcht2 {mod}{r_m}
+00001111,00011111,{mod}{reg}{r_m}:nop{w} {mod}{r_m}
+00001111,00110000:wrmsr
+00001111,1100000{w},{mod}{reg}{r_m}:xadd {reg}{w},{mod}{r_m}{w}
+1000011{w},{mod}{reg}{r_m}:xchg {reg}{w},{mod}{r_m}{w}
+10010{oreg}:xchg {ax},{oreg}
+11010111:xlat {ds_bx}
+0011000{w},{mod}{reg}{r_m}:xor {reg}{w},{mod}{r_m}{w}
+0011001{w},{mod}{reg}{r_m}:xor {mod}{r_m}{w},{reg}{w}
+0011010{w},{imm}:xor {imm}{w},{ax}{w}
+1000000{w},{mod}110{r_m},{imm}:xor{w} {imm}{w},{mod}{r_m}{w}
+1000001{w},{mod}110{r_m},{imms8}:xor{w} {imms8},{mod}{r_m}
+00001111,01110111:emms
+01100110,00001111,11011011,{Mod}{xmmreg}{R_m}:pand {Mod}{R_m},{xmmreg}
+00001111,11011011,{MOD}{mmxreg}{R_M}:pand {MOD}{R_M},{mmxreg}
+01100110,00001111,11011111,{Mod}{xmmreg}{R_m}:pandn {Mod}{R_m},{xmmreg}
+00001111,11011111,{MOD}{mmxreg}{R_M}:pandn {MOD}{R_M},{mmxreg}
+01100110,00001111,11110101,{Mod}{xmmreg}{R_m}:pmaddwd {Mod}{R_m},{xmmreg}
+00001111,11110101,{MOD}{mmxreg}{R_M}:pmaddwd {MOD}{R_M},{mmxreg}
+01100110,00001111,11101011,{Mod}{xmmreg}{R_m}:por {Mod}{R_m},{xmmreg}
+00001111,11101011,{MOD}{mmxreg}{R_M}:por {MOD}{R_M},{mmxreg}
+01100110,00001111,11101111,{Mod}{xmmreg}{R_m}:pxor {Mod}{R_m},{xmmreg}
+00001111,11101111,{MOD}{mmxreg}{R_M}:pxor {MOD}{R_M},{mmxreg}
+00001111,01010101,{Mod}{xmmreg}{R_m}:andnps {Mod}{R_m},{xmmreg}
+00001111,01010100,{Mod}{xmmreg}{R_m}:andps {Mod}{R_m},{xmmreg}
+00001111,11000010,{Mod}{xmmreg}{R_m},00000000:cmpeqps {Mod}{R_m},{xmmreg}
+00001111,11000010,{Mod}{xmmreg}{R_m},00000001:cmpltps {Mod}{R_m},{xmmreg}
+00001111,11000010,{Mod}{xmmreg}{R_m},00000010:cmpleps {Mod}{R_m},{xmmreg}
+00001111,11000010,{Mod}{xmmreg}{R_m},00000011:cmpunordps {Mod}{R_m},{xmmreg}
+00001111,11000010,{Mod}{xmmreg}{R_m},00000100:cmpneqps {Mod}{R_m},{xmmreg}
+00001111,11000010,{Mod}{xmmreg}{R_m},00000101:cmpnltps {Mod}{R_m},{xmmreg}
+00001111,11000010,{Mod}{xmmreg}{R_m},00000110:cmpnleps {Mod}{R_m},{xmmreg}
+00001111,11000010,{Mod}{xmmreg}{R_m},00000111:cmpordps {Mod}{R_m},{xmmreg}
+11110011,00001111,11000010,{Mod}{xmmreg}{R_m},00000000:cmpeqss {Mod}{R_m},{xmmreg}
+11110011,00001111,11000010,{Mod}{xmmreg}{R_m},00000001:cmpltss {Mod}{R_m},{xmmreg}
+11110011,00001111,11000010,{Mod}{xmmreg}{R_m},00000010:cmpless {Mod}{R_m},{xmmreg}
+11110011,00001111,11000010,{Mod}{xmmreg}{R_m},00000011:cmpunordss {Mod}{R_m},{xmmreg}
+11110011,00001111,11000010,{Mod}{xmmreg}{R_m},00000100:cmpneqss {Mod}{R_m},{xmmreg}
+11110011,00001111,11000010,{Mod}{xmmreg}{R_m},00000101:cmpnltss {Mod}{R_m},{xmmreg}
+11110011,00001111,11000010,{Mod}{xmmreg}{R_m},00000110:cmpnless {Mod}{R_m},{xmmreg}
+11110011,00001111,11000010,{Mod}{xmmreg}{R_m},00000111:cmpordss {Mod}{R_m},{xmmreg}
+00001111,10101110,{mod}001{r_m}:fxrstor {mod}{r_m}
+00001111,10101110,{mod}000{r_m}:fxsave {mod}{r_m}
+00001111,10101110,{mod}010{r_m}:ldmxcsr {mod}{r_m}
+00001111,10101110,{mod}011{r_m}:stmxcsr {mod}{r_m}
+11110010,00001111,00010000,{Mod}{xmmreg}{R_m}:movsd {Mod}{R_m},{xmmreg}
+11110011,00001111,00010000,{Mod}{xmmreg}{R_m}:movss {Mod}{R_m},{xmmreg}
+01100110,00001111,00010000,{Mod}{xmmreg}{R_m}:movupd {Mod}{R_m},{xmmreg}
+00001111,00010000,{Mod}{xmmreg}{R_m}:movups {Mod}{R_m},{xmmreg}
+11110010,00001111,00010001,{Mod}{xmmreg}{R_m}:movsd {xmmreg},{Mod}{R_m}
+11110011,00001111,00010001,{Mod}{xmmreg}{R_m}:movss {xmmreg},{Mod}{R_m}
+01100110,00001111,00010001,{Mod}{xmmreg}{R_m}:movupd {xmmreg},{Mod}{R_m}
+00001111,00010001,{Mod}{xmmreg}{R_m}:movups {xmmreg},{Mod}{R_m}
+11110010,00001111,00010010,{Mod}{xmmreg}{R_m}:movddup {Mod}{R_m},{xmmreg}
+11110011,00001111,00010010,{Mod}{xmmreg}{R_m}:movsldup {Mod}{R_m},{xmmreg}
+01100110,00001111,00010010,{Mod}{xmmreg}{R_m}:movlpd {Mod}{R_m},{xmmreg}
+00001111,00010010,11{xmmreg1}{xmmreg2}:movhlps {xmmreg2},{xmmreg1}
+00001111,00010010,{Mod}{xmmreg}{R_m}:movlps {Mod}{R_m},{xmmreg}
+01100110,00001111,00010011,11{xmmreg1}{xmmreg2}:movhlpd {xmmreg1},{xmmreg2}
+00001111,00010011,11{xmmreg1}{xmmreg2}:movhlps {xmmreg1},{xmmreg2}
+01100110,00001111,00010011,{Mod}{xmmreg}{R_m}:movlpd {xmmreg},{Mod}{R_m}
+00001111,00010011,{Mod}{xmmreg}{R_m}:movlps {xmmreg},{Mod}{R_m}
+01100110,00001111,00010100,{Mod}{xmmreg}{R_m}:unpcklpd {Mod}{R_m},{xmmreg}
+00001111,00010100,{Mod}{xmmreg}{R_m}:unpcklps {Mod}{R_m},{xmmreg}
+01100110,00001111,00010101,{Mod}{xmmreg}{R_m}:unpckhpd {Mod}{R_m},{xmmreg}
+00001111,00010101,{Mod}{xmmreg}{R_m}:unpckhps {Mod}{R_m},{xmmreg}
+11110011,00001111,00010110,{Mod}{xmmreg}{R_m}:movshdup {Mod}{R_m},{xmmreg}
+01100110,00001111,00010110,{Mod}{xmmreg}{R_m}:movhpd {Mod}{R_m},{xmmreg}
+00001111,00010110,11{xmmreg1}{xmmreg2}:movlhps {xmmreg2},{xmmreg1}
+00001111,00010110,{Mod}{xmmreg}{R_m}:movhps {Mod}{R_m},{xmmreg}
+01100110,00001111,00010111,11{xmmreg1}{xmmreg2}:movlhpd {xmmreg1},{xmmreg2}
+00001111,00010111,11{xmmreg1}{xmmreg2}:movlhps {xmmreg1},{xmmreg2}
+01100110,00001111,00010111,{Mod}{xmmreg}{R_m}:movhpd {xmmreg},{Mod}{R_m}
+00001111,00010111,{Mod}{xmmreg}{R_m}:movhps {xmmreg},{Mod}{R_m}
+01100110,00001111,00101000,{Mod}{xmmreg}{R_m}:movapd {Mod}{R_m},{xmmreg}
+00001111,00101000,{Mod}{xmmreg}{R_m}:movaps {Mod}{R_m},{xmmreg}
+01100110,00001111,00101001,{Mod}{xmmreg}{R_m}:movapd {xmmreg},{Mod}{R_m}
+00001111,00101001,{Mod}{xmmreg}{R_m}:movaps {xmmreg},{Mod}{R_m}
+11110010,00001111,00101010,{mod}{xmmreg}{r_m}:cvtsi2sd {mod}{r_m},{xmmreg}
+11110011,00001111,00101010,{mod}{xmmreg}{r_m}:cvtsi2ss {mod}{r_m},{xmmreg}
+01100110,00001111,00101010,{MOD}{xmmreg}{R_M}:cvtpi2pd {MOD}{R_M},{xmmreg}
+00001111,00101010,{MOD}{xmmreg}{R_M}:cvtpi2ps {MOD}{R_M},{xmmreg}
+01100110,00001111,00101011,{mod}{xmmreg}{r_m}:movntpd {xmmreg},{mod}{r_m}
+00001111,00101011,{mod}{xmmreg}{r_m}:movntps {xmmreg},{mod}{r_m}
+11110010,00001111,00101100,{Mod}{reg}{R_m}:cvttsd2si {Mod}{R_m},{reg}
+11110011,00001111,00101100,{Mod}{reg}{R_m}:cvttss2si {Mod}{R_m},{reg}
+01100110,00001111,00101100,{Mod}{mmxreg}{R_m}:cvttpd2pi {Mod}{R_m},{mmxreg}
+00001111,00101100,{Mod}{mmxreg}{R_m}:cvttps2pi {Mod}{R_m},{mmxreg}
+01100110,00001111,00101101,{Mod}{mmxreg}{R_m}:cvtpd2pi {Mod}{R_m},{mmxreg}
+11110010,00001111,00101101,{Mod}{reg}{R_m}:cvtsd2si {Mod}{R_m},{reg}
+11110011,00001111,00101101,{Mod}{reg}{R_m}:cvtss2si {Mod}{R_m},{reg}
+00001111,00101101,{Mod}{mmxreg}{R_m}:cvtps2pi {Mod}{R_m},{mmxreg}
+01100110,00001111,00101110,{Mod}{xmmreg}{R_m}:ucomisd {Mod}{R_m},{xmmreg}
+00001111,00101110,{Mod}{xmmreg}{R_m}:ucomiss {Mod}{R_m},{xmmreg}
+01100110,00001111,00101111,{Mod}{xmmreg}{R_m}:comisd {Mod}{R_m},{xmmreg}
+00001111,00101111,{Mod}{xmmreg}{R_m}:comiss {Mod}{R_m},{xmmreg}
+00001111,00110111:getsec
+01100110,00001111,01010000,11{reg}{xmmreg}:movmskpd {xmmreg},{reg}
+00001111,01010000,11{reg}{xmmreg}:movmskps {xmmreg},{reg}
+01100110,00001111,01010001,{Mod}{xmmreg}{R_m}:sqrtpd {Mod}{R_m},{xmmreg}
+11110010,00001111,01010001,{Mod}{xmmreg}{R_m}:sqrtsd {Mod}{R_m},{xmmreg}
+11110011,00001111,01010001,{Mod}{xmmreg}{R_m}:sqrtss {Mod}{R_m},{xmmreg}
+00001111,01010001,{Mod}{xmmreg}{R_m}:sqrtps {Mod}{R_m},{xmmreg}
+11110011,00001111,01010010,{Mod}{xmmreg}{R_m}:rsqrtss {Mod}{R_m},{xmmreg}
+00001111,01010010,{Mod}{xmmreg}{R_m}:rsqrtps {Mod}{R_m},{xmmreg}
+11110011,00001111,01010011,{Mod}{xmmreg}{R_m}:rcpss {Mod}{R_m},{xmmreg}
+00001111,01010011,{Mod}{xmmreg}{R_m}:rcpps {Mod}{R_m},{xmmreg}
+01100110,00001111,01010100,{Mod}{xmmreg}{R_m}:andpd {Mod}{R_m},{xmmreg}
+00001111,01010100,{Mod}{xmmreg}{R_m}:andps {Mod}{R_m},{xmmreg}
+01100110,00001111,01010101,{Mod}{xmmreg}{R_m}:andnpd {Mod}{R_m},{xmmreg}
+00001111,01010101,{Mod}{xmmreg}{R_m}:andnps {Mod}{R_m},{xmmreg}
+01100110,00001111,01010110,{Mod}{xmmreg}{R_m}:orpd {Mod}{R_m},{xmmreg}
+00001111,01010110,{Mod}{xmmreg}{R_m}:orps {Mod}{R_m},{xmmreg}
+01100110,00001111,01010111,{Mod}{xmmreg}{R_m}:xorpd {Mod}{R_m},{xmmreg}
+00001111,01010111,{Mod}{xmmreg}{R_m}:xorps {Mod}{R_m},{xmmreg}
+11110010,00001111,01011000,{Mod}{xmmreg}{R_m}:addsd {Mod}{R_m},{xmmreg}
+11110011,00001111,01011000,{Mod}{xmmreg}{R_m}:addss {Mod}{R_m},{xmmreg}
+01100110,00001111,01011000,{Mod}{xmmreg}{R_m}:addpd {Mod}{R_m},{xmmreg}
+00001111,01011000,{Mod}{xmmreg}{R_m}:addps {Mod}{R_m},{xmmreg}
+11110010,00001111,01011001,{Mod}{xmmreg}{R_m}:mulsd {Mod}{R_m},{xmmreg}
+11110011,00001111,01011001,{Mod}{xmmreg}{R_m}:mulss {Mod}{R_m},{xmmreg}
+01100110,00001111,01011001,{Mod}{xmmreg}{R_m}:mulpd {Mod}{R_m},{xmmreg}
+00001111,01011001,{Mod}{xmmreg}{R_m}:mulps {Mod}{R_m},{xmmreg}
+11110010,00001111,01011010,{Mod}{xmmreg}{R_m}:cvtsd2ss {Mod}{R_m},{xmmreg}
+11110011,00001111,01011010,{Mod}{xmmreg}{R_m}:cvtss2sd {Mod}{R_m},{xmmreg}
+01100110,00001111,01011010,{Mod}{xmmreg}{R_m}:cvtpd2ps {Mod}{R_m},{xmmreg}
+00001111,01011010,{Mod}{xmmreg}{R_m}:cvtps2pd {Mod}{R_m},{xmmreg}
+01100110,00001111,01011011,{Mod}{xmmreg}{R_m}:cvtps2dq {Mod}{R_m},{xmmreg}
+11110011,00001111,01011011,{Mod}{xmmreg}{R_m}:cvttps2dq {Mod}{R_m},{xmmreg}
+00001111,01011011,{Mod}{xmmreg}{R_m}:cvtdq2ps {Mod}{R_m},{xmmreg}
+11110010,00001111,01011100,{Mod}{xmmreg}{R_m}:subsd {Mod}{R_m},{xmmreg}
+11110011,00001111,01011100,{Mod}{xmmreg}{R_m}:subss {Mod}{R_m},{xmmreg}
+01100110,00001111,01011100,{Mod}{xmmreg}{R_m}:subpd {Mod}{R_m},{xmmreg}
+00001111,01011100,{Mod}{xmmreg}{R_m}:subps {Mod}{R_m},{xmmreg}
+11110010,00001111,01011101,{Mod}{xmmreg}{R_m}:minsd {Mod}{R_m},{xmmreg}
+11110011,00001111,01011101,{Mod}{xmmreg}{R_m}:minss {Mod}{R_m},{xmmreg}
+01100110,00001111,01011101,{Mod}{xmmreg}{R_m}:minpd {Mod}{R_m},{xmmreg}
+00001111,01011101,{Mod}{xmmreg}{R_m}:minps {Mod}{R_m},{xmmreg}
+11110010,00001111,01011110,{Mod}{xmmreg}{R_m}:divsd {Mod}{R_m},{xmmreg}
+11110011,00001111,01011110,{Mod}{xmmreg}{R_m}:divss {Mod}{R_m},{xmmreg}
+01100110,00001111,01011110,{Mod}{xmmreg}{R_m}:divpd {Mod}{R_m},{xmmreg}
+00001111,01011110,{Mod}{xmmreg}{R_m}:divps {Mod}{R_m},{xmmreg}
+11110010,00001111,01011111,{Mod}{xmmreg}{R_m}:maxsd {Mod}{R_m},{xmmreg}
+11110011,00001111,01011111,{Mod}{xmmreg}{R_m}:maxss {Mod}{R_m},{xmmreg}
+01100110,00001111,01011111,{Mod}{xmmreg}{R_m}:maxpd {Mod}{R_m},{xmmreg}
+00001111,01011111,{Mod}{xmmreg}{R_m}:maxps {Mod}{R_m},{xmmreg}
+01100110,00001111,01100000,{Mod}{xmmreg}{R_m}:punpcklbw {Mod}{R_m},{xmmreg}
+00001111,01100000,{MOD}{mmxreg}{R_M}:punpcklbw {MOD}{R_M},{mmxreg}
+01100110,00001111,01100001,{Mod}{xmmreg}{R_m}:punpcklwd {Mod}{R_m},{xmmreg}
+00001111,01100001,{MOD}{mmxreg}{R_M}:punpcklwd {MOD}{R_M},{mmxreg}
+01100110,00001111,01100010,{Mod}{xmmreg}{R_m}:punpckldq {Mod}{R_m},{xmmreg}
+00001111,01100010,{MOD}{mmxreg}{R_M}:punpckldq {MOD}{R_M},{mmxreg}
+01100110,00001111,01100011,{Mod}{xmmreg}{R_m}:packsswb {Mod}{R_m},{xmmreg}
+00001111,01100011,{MOD}{mmxreg}{R_M}:packsswb {MOD}{R_M},{mmxreg}
+01100110,00001111,01100100,{Mod}{xmmreg}{R_m}:pcmpgtb {Mod}{R_m},{xmmreg}
+00001111,01100100,{MOD}{mmxreg}{R_M}:pcmpgtb {MOD}{R_M},{mmxreg}
+01100110,00001111,01100101,{Mod}{xmmreg}{R_m}:pcmpgtw {Mod}{R_m},{xmmreg}
+00001111,01100101,{MOD}{mmxreg}{R_M}:pcmpgtw {MOD}{R_M},{mmxreg}
+01100110,00001111,01100110,{Mod}{xmmreg}{R_m}:pcmpgtd {Mod}{R_m},{xmmreg}
+00001111,01100110,{MOD}{mmxreg}{R_M}:pcmpgtd {MOD}{R_M},{mmxreg}
+01100110,00001111,01100111,{Mod}{xmmreg}{R_m}:packuswb {Mod}{R_m},{xmmreg}
+00001111,01100111,{MOD}{mmxreg}{R_M}:packuswb {MOD}{R_M},{mmxreg}
+01100110,00001111,01101000,{Mod}{xmmreg}{R_m}:punpckhbw {Mod}{R_m},{xmmreg}
+00001111,01101000,{MOD}{mmxreg}{R_M}:punpckhbw {MOD}{R_M},{mmxreg}
+01100110,00001111,01101001,{Mod}{xmmreg}{R_m}:punpckhwd {Mod}{R_m},{xmmreg}
+00001111,01101001,{MOD}{mmxreg}{R_M}:punpckhwd {MOD}{R_M},{mmxreg}
+01100110,00001111,01101010,{Mod}{xmmreg}{R_m}:punpckhdq {Mod}{R_m},{xmmreg}
+00001111,01101010,{MOD}{mmxreg}{R_M}:punpckhdq {MOD}{R_M},{mmxreg}
+01100110,00001111,01101011,{Mod}{xmmreg}{R_m}:packssdw {Mod}{R_m},{xmmreg}
+00001111,01101011,{MOD}{mmxreg}{R_M}:packssdw {MOD}{R_M},{mmxreg}
+01100110,00001111,01101100,{Mod}{xmmreg}{R_m}:punpcklqdq {Mod}{R_m},{xmmreg}
+01100110,00001111,01101101,{Mod}{xmmreg}{R_m}:punpckhqdq {Mod}{R_m},{xmmreg}
+01100110,00001111,01101110,{mod}{xmmreg}{r_m}:movd {mod}{r_m},{xmmreg}
+00001111,01101110,{mod}{mmxreg}{r_m}:movd {mod}{r_m},{mmxreg}
+01100110,00001111,01101111,{Mod}{xmmreg}{R_m}:movdqa {Mod}{R_m},{xmmreg}
+11110011,00001111,01101111,{Mod}{xmmreg}{R_m}:movdqu {Mod}{R_m},{xmmreg}
+00001111,01101111,{MOD}{mmxreg}{R_M}:movq {MOD}{R_M},{mmxreg}
+01100110,00001111,01110000,{Mod}{xmmreg}{R_m},{imm8}:pshufd {imm8},{Mod}{R_m},{xmmreg}
+11110010,00001111,01110000,{Mod}{xmmreg}{R_m},{imm8}:pshuflw {imm8},{Mod}{R_m},{xmmreg}
+11110011,00001111,01110000,{Mod}{xmmreg}{R_m},{imm8}:pshufhw {imm8},{Mod}{R_m},{xmmreg}
+00001111,01110000,{MOD}{mmxreg}{R_M},{imm8}:pshufw {imm8},{MOD}{R_M},{mmxreg}
+01100110,00001111,01110100,{Mod}{xmmreg}{R_m}:pcmpeqb {Mod}{R_m},{xmmreg}
+00001111,01110100,{MOD}{mmxreg}{R_M}:pcmpeqb {MOD}{R_M},{mmxreg}
+01100110,00001111,01110101,{Mod}{xmmreg}{R_m}:pcmpeqw {Mod}{R_m},{xmmreg}
+00001111,01110101,{MOD}{mmxreg}{R_M}:pcmpeqw {MOD}{R_M},{mmxreg}
+01100110,00001111,01110110,{Mod}{xmmreg}{R_m}:pcmpeqd {Mod}{R_m},{xmmreg}
+00001111,01110110,{MOD}{mmxreg}{R_M}:pcmpeqd {MOD}{R_M},{mmxreg}
+01100110,00001111,01111100,{Mod}{xmmreg}{R_m}:haddpd {Mod}{R_m},{xmmreg}
+11110010,00001111,01111100,{Mod}{xmmreg}{R_m}:haddps {Mod}{R_m},{xmmreg}
+01100110,00001111,01111101,{Mod}{xmmreg}{R_m}:hsubpd {Mod}{R_m},{xmmreg}
+11110010,00001111,01111101,{Mod}{xmmreg}{R_m}:hsubps {Mod}{R_m},{xmmreg}
+01100110,00001111,01111110,{mod}{xmmreg}{r_m}:movd {xmmreg},{mod}{r_m}
+11110011,00001111,01111110,{Mod}{xmmreg}{R_m}:movq {Mod}{R_m},{xmmreg}
+00001111,01111110,{mod}{mmxreg}{r_m}:movd {mmxreg},{mod}{r_m}
+01100110,00001111,01111111,{Mod}{xmmreg}{R_m}:movdqa {xmmreg},{Mod}{R_m}
+11110011,00001111,01111111,{Mod}{xmmreg}{R_m}:movdqu {xmmreg},{Mod}{R_m}
+00001111,01111111,{MOD}{mmxreg}{R_M}:movq {mmxreg},{MOD}{R_M}
+00001111,11000011,{mod}{reg}{r_m}:movnti {reg},{mod}{r_m}
+01100110,00001111,11000100,{mod}{xmmreg}{r_m},{imm8}:pinsrw {imm8},{mod}{r_m},{xmmreg}
+00001111,11000100,{mod}{mmxreg}{r_m},{imm8}:pinsrw {imm8},{mod}{r_m},{mmxreg}
+01100110,00001111,11000101,11{reg}{xmmreg},{imm8}:pextrw {imm8},{xmmreg},{reg}
+00001111,11000101,11{reg}{mmxreg},{imm8}:pextrw {imm8},{mmxreg},{reg}
+01100110,00001111,11000110,{Mod}{xmmreg}{R_m},{imm8}:shufpd {imm8},{Mod}{R_m},{xmmreg}
+00001111,11000110,{Mod}{xmmreg}{R_m},{imm8}:shufps {imm8},{Mod}{R_m},{xmmreg}
+01100110,00001111,11010001,{Mod}{xmmreg}{R_m}:psrlw {Mod}{R_m},{xmmreg}
+00001111,11010001,{MOD}{mmxreg}{R_M}:psrlw {MOD}{R_M},{mmxreg}
+01100110,00001111,11010010,{Mod}{xmmreg}{R_m}:psrld {Mod}{R_m},{xmmreg}
+00001111,11010010,{MOD}{mmxreg}{R_M}:psrld {MOD}{R_M},{mmxreg}
+01100110,00001111,11010011,{Mod}{xmmreg}{R_m}:psrlq {Mod}{R_m},{xmmreg}
+00001111,11010011,{MOD}{mmxreg}{R_M}:psrlq {MOD}{R_M},{mmxreg}
+01100110,00001111,11010100,{Mod}{xmmreg}{R_m}:paddq {Mod}{R_m},{xmmreg}
+00001111,11010100,{MOD}{mmxreg}{R_M}:paddq {MOD}{R_M},{mmxreg}
+01100110,00001111,11010101,{Mod}{xmmreg}{R_m}:pmullw {Mod}{R_m},{xmmreg}
+00001111,11010101,{MOD}{mmxreg}{R_M}:pmullw {MOD}{R_M},{mmxreg}
+01100110,00001111,11010110,{Mod}{xmmreg}{R_m}:movq {xmmreg},{Mod}{R_m}
+11110010,00001111,11010110,11{mmxreg}{xmmreg}:movdq2q {xmmreg},{mmxreg}
+11110011,00001111,11010110,11{xmmreg}{mmxreg}:movq2dq {mmxreg},{xmmreg}
+01100110,00001111,11010111,11{reg}{xmmreg}:pmovmskb {xmmreg},{reg}
+00001111,11010111,11{reg}{mmxreg}:pmovmskb {mmxreg},{reg}
+01100110,00001111,11011000,{Mod}{xmmreg}{R_m}:psubusb {Mod}{R_m},{xmmreg}
+00001111,11011000,{MOD}{mmxreg}{R_M}:psubusb {MOD}{R_M},{mmxreg}
+01100110,00001111,11011001,{Mod}{xmmreg}{R_m}:psubusw {Mod}{R_m},{xmmreg}
+00001111,11011001,{MOD}{mmxreg}{R_M}:psubusw {MOD}{R_M},{mmxreg}
+01100110,00001111,11011010,{Mod}{xmmreg}{R_m}:pminub {Mod}{R_m},{xmmreg}
+00001111,11011010,{MOD}{mmxreg}{R_M}:pminub {MOD}{R_M},{mmxreg}
+01100110,00001111,11011100,{Mod}{xmmreg}{R_m}:paddusb {Mod}{R_m},{xmmreg}
+00001111,11011100,{MOD}{mmxreg}{R_M}:paddusb {MOD}{R_M},{mmxreg}
+01100110,00001111,11011101,{Mod}{xmmreg}{R_m}:paddusw {Mod}{R_m},{xmmreg}
+00001111,11011101,{MOD}{mmxreg}{R_M}:paddusw {MOD}{R_M},{mmxreg}
+01100110,00001111,11011110,{Mod}{xmmreg}{R_m}:pmaxub {Mod}{R_m},{xmmreg}
+00001111,11011110,{MOD}{mmxreg}{R_M}:pmaxub {MOD}{R_M},{mmxreg}
+01100110,00001111,11100000,{Mod}{xmmreg}{R_m}:pavgb {Mod}{R_m},{xmmreg}
+00001111,11100000,{MOD}{mmxreg}{R_M}:pavgb {MOD}{R_M},{mmxreg}
+01100110,00001111,11100001,{Mod}{xmmreg}{R_m}:psraw {Mod}{R_m},{xmmreg}
+00001111,11100001,{MOD}{mmxreg}{R_M}:psraw {MOD}{R_M},{mmxreg}
+01100110,00001111,11100010,{Mod}{xmmreg}{R_m}:psrad {Mod}{R_m},{xmmreg}
+00001111,11100010,{MOD}{mmxreg}{R_M}:psrad {MOD}{R_M},{mmxreg}
+01100110,00001111,11100011,{Mod}{xmmreg}{R_m}:pavgw {Mod}{R_m},{xmmreg}
+00001111,11100011,{MOD}{mmxreg}{R_M}:pavgw {MOD}{R_M},{mmxreg}
+01100110,00001111,11100100,{Mod}{xmmreg}{R_m}:pmulhuw {Mod}{R_m},{xmmreg}
+00001111,11100100,{MOD}{mmxreg}{R_M}:pmulhuw {MOD}{R_M},{mmxreg}
+01100110,00001111,11100101,{Mod}{xmmreg}{R_m}:pmulhw {Mod}{R_m},{xmmreg}
+00001111,11100101,{MOD}{mmxreg}{R_M}:pmulhw {MOD}{R_M},{mmxreg}
+01100110,00001111,11100111,{Mod}{xmmreg}{R_m}:movntdq {xmmreg},{Mod}{R_m}
+00001111,11100111,{MOD}{mmxreg}{R_M}:movntq {mmxreg},{MOD}{R_M}
+01100110,00001111,11101000,{Mod}{xmmreg}{R_m}:psubsb {Mod}{R_m},{xmmreg}
+00001111,11101000,{MOD}{mmxreg}{R_M}:psubsb {MOD}{R_M},{mmxreg}
+01100110,00001111,11101001,{Mod}{xmmreg}{R_m}:psubsw {Mod}{R_m},{xmmreg}
+00001111,11101001,{MOD}{mmxreg}{R_M}:psubsw {MOD}{R_M},{mmxreg}
+01100110,00001111,11101010,{Mod}{xmmreg}{R_m}:pminsw {Mod}{R_m},{xmmreg}
+00001111,11101010,{MOD}{mmxreg}{R_M}:pminsw {MOD}{R_M},{mmxreg}
+01100110,00001111,11101100,{Mod}{xmmreg}{R_m}:paddsb {Mod}{R_m},{xmmreg}
+00001111,11101100,{MOD}{mmxreg}{R_M}:paddsb {MOD}{R_M},{mmxreg}
+01100110,00001111,11101101,{Mod}{xmmreg}{R_m}:paddsw {Mod}{R_m},{xmmreg}
+00001111,11101101,{MOD}{mmxreg}{R_M}:paddsw {MOD}{R_M},{mmxreg}
+01100110,00001111,11101110,{Mod}{xmmreg}{R_m}:pmaxsw {Mod}{R_m},{xmmreg}
+00001111,11101110,{MOD}{mmxreg}{R_M}:pmaxsw {MOD}{R_M},{mmxreg}
+11110010,00001111,11110000,{mod}{xmmreg}{r_m}:lddqu {mod}{r_m},{xmmreg}
+01100110,00001111,11110001,{Mod}{xmmreg}{R_m}:psllw {Mod}{R_m},{xmmreg}
+00001111,11110001,{MOD}{mmxreg}{R_M}:psllw {MOD}{R_M},{mmxreg}
+01100110,00001111,11110010,{Mod}{xmmreg}{R_m}:pslld {Mod}{R_m},{xmmreg}
+00001111,11110010,{MOD}{mmxreg}{R_M}:pslld {MOD}{R_M},{mmxreg}
+01100110,00001111,11110011,{Mod}{xmmreg}{R_m}:psllq {Mod}{R_m},{xmmreg}
+00001111,11110011,{MOD}{mmxreg}{R_M}:psllq {MOD}{R_M},{mmxreg}
+01100110,00001111,11110100,{Mod}{xmmreg}{R_m}:pmuludq {Mod}{R_m},{xmmreg}
+00001111,11110100,{MOD}{mmxreg}{R_M}:pmuludq {MOD}{R_M},{mmxreg}
+01100110,00001111,11110110,{Mod}{xmmreg}{R_m}:psadbw {Mod}{R_m},{xmmreg}
+00001111,11110110,{MOD}{mmxreg}{R_M}:psadbw {MOD}{R_M},{mmxreg}
+01100110,00001111,11110111,11{xmmreg1}{xmmreg2}:maskmovdqu {xmmreg2},{xmmreg1}
+00001111,11110111,11{mmxreg1}{mmxreg2}:maskmovq {mmxreg2},{mmxreg1}
+01100110,00001111,11111000,{Mod}{xmmreg}{R_m}:psubb {Mod}{R_m},{xmmreg}
+00001111,11111000,{MOD}{mmxreg}{R_M}:psubb {MOD}{R_M},{mmxreg}
+01100110,00001111,11111001,{Mod}{xmmreg}{R_m}:psubw {Mod}{R_m},{xmmreg}
+00001111,11111001,{MOD}{mmxreg}{R_M}:psubw {MOD}{R_M},{mmxreg}
+01100110,00001111,11111010,{Mod}{xmmreg}{R_m}:psubd {Mod}{R_m},{xmmreg}
+00001111,11111010,{MOD}{mmxreg}{R_M}:psubd {MOD}{R_M},{mmxreg}
+01100110,00001111,11111011,{Mod}{xmmreg}{R_m}:psubq {Mod}{R_m},{xmmreg}
+00001111,11111011,{MOD}{mmxreg}{R_M}:psubq {MOD}{R_M},{mmxreg}
+01100110,00001111,11111100,{Mod}{xmmreg}{R_m}:paddb {Mod}{R_m},{xmmreg}
+00001111,11111100,{MOD}{mmxreg}{R_M}:paddb {MOD}{R_M},{mmxreg}
+01100110,00001111,11111101,{Mod}{xmmreg}{R_m}:paddw {Mod}{R_m},{xmmreg}
+00001111,11111101,{MOD}{mmxreg}{R_M}:paddw {MOD}{R_M},{mmxreg}
+01100110,00001111,11111110,{Mod}{xmmreg}{R_m}:paddd {Mod}{R_m},{xmmreg}
+00001111,11111110,{MOD}{mmxreg}{R_M}:paddd {MOD}{R_M},{mmxreg}
+01100110,00001111,00111000,00000000,{Mod}{xmmreg}{R_m}:pshufb {Mod}{R_m},{xmmreg}
+00001111,00111000,00000000,{MOD}{mmxreg}{R_M}:pshufb {MOD}{R_M},{mmxreg}
+01100110,00001111,00111000,00000001,{Mod}{xmmreg}{R_m}:phaddw {Mod}{R_m},{xmmreg}
+00001111,00111000,00000001,{MOD}{mmxreg}{R_M}:phaddw {MOD}{R_M},{mmxreg}
+01100110,00001111,00111000,00000010,{Mod}{xmmreg}{R_m}:phaddd {Mod}{R_m},{xmmreg}
+00001111,00111000,00000010,{MOD}{mmxreg}{R_M}:phaddd {MOD}{R_M},{mmxreg}
+01100110,00001111,00111000,00000011,{Mod}{xmmreg}{R_m}:phaddsw {Mod}{R_m},{xmmreg}
+00001111,00111000,00000011,{MOD}{mmxreg}{R_M}:phaddsw {MOD}{R_M},{mmxreg}
+01100110,00001111,00111000,00000100,{Mod}{xmmreg}{R_m}:pmaddubsw {Mod}{R_m},{xmmreg}
+00001111,00111000,00000100,{MOD}{mmxreg}{R_M}:pmaddubsw {MOD}{R_M},{mmxreg}
+01100110,00001111,00111000,00000101,{Mod}{xmmreg}{R_m}:phsubw {Mod}{R_m},{xmmreg}
+00001111,00111000,00000101,{MOD}{mmxreg}{R_M}:phsubw {MOD}{R_M},{mmxreg}
+01100110,00001111,00111000,00000110,{Mod}{xmmreg}{R_m}:phsubd {Mod}{R_m},{xmmreg}
+00001111,00111000,00000110,{MOD}{mmxreg}{R_M}:phsubd {MOD}{R_M},{mmxreg}
+01100110,00001111,00111000,00000111,{Mod}{xmmreg}{R_m}:phsubsw {Mod}{R_m},{xmmreg}
+00001111,00111000,00000111,{MOD}{mmxreg}{R_M}:phsubsw {MOD}{R_M},{mmxreg}
+01100110,00001111,00111000,00001000,{Mod}{xmmreg}{R_m}:psignb {Mod}{R_m},{xmmreg}
+00001111,00111000,00001000,{MOD}{mmxreg}{R_M}:psignb {MOD}{R_M},{mmxreg}
+01100110,00001111,00111000,00001001,{Mod}{xmmreg}{R_m}:psignw {Mod}{R_m},{xmmreg}
+00001111,00111000,00001001,{MOD}{mmxreg}{R_M}:psignw {MOD}{R_M},{mmxreg}
+01100110,00001111,00111000,00001010,{Mod}{xmmreg}{R_m}:psignd {Mod}{R_m},{xmmreg}
+00001111,00111000,00001010,{MOD}{mmxreg}{R_M}:psignd {MOD}{R_M},{mmxreg}
+01100110,00001111,00111000,00001011,{Mod}{xmmreg}{R_m}:pmulhrsw {Mod}{R_m},{xmmreg}
+00001111,00111000,00001011,{MOD}{mmxreg}{R_M}:pmulhrsw {MOD}{R_M},{mmxreg}
+01100110,00001111,00111000,00011100,{Mod}{xmmreg}{R_m}:pabsb {Mod}{R_m},{xmmreg}
+00001111,00111000,00011100,{MOD}{mmxreg}{R_M}:pabsb {MOD}{R_M},{mmxreg}
+01100110,00001111,00111000,00011101,{Mod}{xmmreg}{R_m}:pabsw {Mod}{R_m},{xmmreg}
+00001111,00111000,00011101,{MOD}{mmxreg}{R_M}:pabsw {MOD}{R_M},{mmxreg}
+01100110,00001111,00111000,00011110,{Mod}{xmmreg}{R_m}:pabsd {Mod}{R_m},{xmmreg}
+00001111,00111000,00011110,{MOD}{mmxreg}{R_M}:pabsd {MOD}{R_M},{mmxreg}
+01100110,00001111,00111010,00001111,{Mod}{xmmreg}{R_m},{imm8}:palignr {imm8},{Mod}{R_m},{xmmreg}
+00001111,00111010,00001111,{MOD}{mmxreg}{R_M},{imm8}:palignr {imm8},{MOD}{R_M},{mmxreg}
+01100110,00001111,11000111,{mod}110{r_m}:vmclear {mod}{r_m}
+11110011,00001111,11000111,{mod}110{r_m}:vmxon {mod}{r_m}
+00001111,11000111,{mod}110{r_m}:vmptrld {mod}{r_m}
+00001111,11000111,{mod}111{r_m}:vmptrst {mod}{r_m}
+01100110,00001111,01110001,11010{xmmreg},{imm8}:psrlw {imm8},{xmmreg}
+00001111,01110001,11010{mmxreg},{imm8}:psrlw {imm8},{mmxreg}
+01100110,00001111,01110001,11100{xmmreg},{imm8}:psraw {imm8},{xmmreg}
+00001111,01110001,11100{mmxreg},{imm8}:psraw {imm8},{mmxreg}
+01100110,00001111,01110001,11110{xmmreg},{imm8}:psllw {imm8},{xmmreg}
+00001111,01110001,11110{mmxreg},{imm8}:psllw {imm8},{mmxreg}
+01100110,00001111,01110010,11010{xmmreg},{imm8}:psrld {imm8},{xmmreg}
+00001111,01110010,11010{mmxreg},{imm8}:psrld {imm8},{mmxreg}
+01100110,00001111,01110010,11100{xmmreg},{imm8}:psrad {imm8},{xmmreg}
+00001111,01110010,11100{mmxreg},{imm8}:psrad {imm8},{mmxreg}
+01100110,00001111,01110010,11110{xmmreg},{imm8}:pslld {imm8},{xmmreg}
+00001111,01110010,11110{mmxreg},{imm8}:pslld {imm8},{mmxreg}
+01100110,00001111,01110011,11010{xmmreg},{imm8}:psrlq {imm8},{xmmreg}
+00001111,01110011,11010{mmxreg},{imm8}:psrlq {imm8},{mmxreg}
+01100110,00001111,01110011,11011{xmmreg},{imm8}:psrldq {imm8},{xmmreg}
+01100110,00001111,01110011,11110{xmmreg},{imm8}:psllq {imm8},{xmmreg}
+00001111,01110011,11110{mmxreg},{imm8}:psllq {imm8},{mmxreg}
+01100110,00001111,01110011,11111{xmmreg},{imm8}:pslldq {imm8},{xmmreg}
+00001111,10101110,11101000:lfence
+00001111,10101110,11110000:mfence
+00001111,10101110,11111000:sfence
+00001111,10101110,{mod}111{r_m}:clflush {mod}{r_m}
+00001111,00001111,{MOD}{mmxreg}{R_M}:INVALID {MOD}{R_M},{mmxreg}
+01100110,00001111,00111010,00001100,{Mod}{xmmreg}{R_m},{imm8}:blendps {imm8},{Mod}{R_m},{xmmreg}
+01100110,00001111,00111010,00001101,{Mod}{xmmreg}{R_m},{imm8}:blendpd {imm8},{Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00010100,{Mod}{xmmreg}{R_m}:blendvps %xmm0,{Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00010101,{Mod}{xmmreg}{R_m}:blendvpd %xmm0,{Mod}{R_m},{xmmreg}
+01100110,00001111,00111010,01000000,{Mod}{xmmreg}{R_m},{imm8}:dpps {imm8},{Mod}{R_m},{xmmreg}
+01100110,00001111,00111010,01000001,{Mod}{xmmreg}{R_m},{imm8}:dppd {imm8},{Mod}{R_m},{xmmreg}
+01100110,00001111,00111010,00100001,{Mod}{xmmreg}{R_m},{imm8}:insertps {imm8},{Mod}{R_m},{xmmreg}
+# Mod == 11 is not valid
+01100110,00001111,00111000,00101010,{Mod}{xmmreg}{R_m}:movntdqa {Mod}{R_m},{xmmreg}
+01100110,00001111,00111010,01000010,{Mod}{xmmreg}{R_m},{imm8}:mpsadbw {imm8},{Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00101011,{Mod}{xmmreg}{R_m}:packusdw {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00010000,{Mod}{xmmreg}{R_m}:pblendvb %xmm0,{Mod}{R_m},{xmmreg}
+01100110,00001111,00111010,00001110,{Mod}{xmmreg}{R_m},{imm8}:pblendw {imm8},{Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00101001,{Mod}{xmmreg}{R_m}:pcmpeqq {Mod}{R_m},{xmmreg}
+01100110,00001111,00111010,01100001,{Mod}{xmmreg}{R_m},{imm8}:pcmpestri {imm8},{Mod}{R_m},{xmmreg}
+01100110,00001111,00111010,01100000,{Mod}{xmmreg}{R_m},{imm8}:pcmpestrm {imm8},{Mod}{R_m},{xmmreg}
+01100110,00001111,00111010,01100011,{Mod}{xmmreg}{R_m},{imm8}:pcmpistri {imm8},{Mod}{R_m},{xmmreg}
+01100110,00001111,00111010,01100010,{Mod}{xmmreg}{R_m},{imm8}:pcmpistrm {imm8},{Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00110111,{Mod}{xmmreg}{R_m}:pcmpgtq {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,01000001,{Mod}{xmmreg}{R_m}:phminposuw {Mod}{R_m},{xmmreg}
+01100110,00001111,00111010,00100000,{mod}{xmmreg}{r_m},{imm8}:pinsrb {imm8},{mod}{r_m},{xmmreg}
+01100110,00001111,00111010,00100010,{mod}{xmmreg}{r_m},{imm8}:pinsrd {imm8},{mod}{r_m},{xmmreg}
+01100110,00001111,00111000,00111100,{Mod}{xmmreg}{R_m}:pmaxsb {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00111101,{Mod}{xmmreg}{R_m}:pmaxsd {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00111111,{Mod}{xmmreg}{R_m}:pmaxud {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00111110,{Mod}{xmmreg}{R_m}:pmaxuw {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00111000,{Mod}{xmmreg}{R_m}:pminsb {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00111001,{Mod}{xmmreg}{R_m}:pminsd {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00111011,{Mod}{xmmreg}{R_m}:pminud {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00111010,{Mod}{xmmreg}{R_m}:pminuw {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00100000,{Mod}{xmmreg}{R_m}:pmovsxbw {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00100001,{Mod}{xmmreg}{R_m}:pmovsxbd {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00100010,{Mod}{xmmreg}{R_m}:pmovsxbq {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00100011,{Mod}{xmmreg}{R_m}:pmovsxwd {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00100100,{Mod}{xmmreg}{R_m}:pmovsxwq {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00100101,{Mod}{xmmreg}{R_m}:pmovsxdq {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00110000,{Mod}{xmmreg}{R_m}:pmovzxbw {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00110001,{Mod}{xmmreg}{R_m}:pmovzxbd {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00110010,{Mod}{xmmreg}{R_m}:pmovzxbq {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00110011,{Mod}{xmmreg}{R_m}:pmovzxwd {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00110100,{Mod}{xmmreg}{R_m}:pmovzxwq {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00110101,{Mod}{xmmreg}{R_m}:pmovzxdq {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00101000,{Mod}{xmmreg}{R_m}:pmuldq {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,01000000,{Mod}{xmmreg}{R_m}:pmulld {Mod}{R_m},{xmmreg}
+01100110,00001111,00111000,00010111,{Mod}{xmmreg}{R_m}:ptest {Mod}{R_m},{xmmreg}
+01100110,00001111,00111010,00001000,{Mod}{xmmreg}{R_m},{imm8}:roundps {imm8},{Mod}{R_m},{xmmreg}
+01100110,00001111,00111010,00001001,{Mod}{xmmreg}{R_m},{imm8}:roundpd {imm8},{Mod}{R_m},{xmmreg}
+01100110,00001111,00111010,00001010,{Mod}{xmmreg}{R_m},{imm8}:roundss {imm8},{Mod}{R_m},{xmmreg}
+01100110,00001111,00111010,00001011,{Mod}{xmmreg}{R_m},{imm8}:roundsd {imm8},{Mod}{R_m},{xmmreg}
+# ORDER:
+dnl Many previous entries depend on this being last.
+000{sreg2}111:pop {sreg2}
+# ORDER END:
diff --git a/libcpu/defs/i386.doc b/libcpu/defs/i386.doc
new file mode 100644
index 00000000..732cd238
--- /dev/null
+++ b/libcpu/defs/i386.doc
@@ -0,0 +1,74 @@
+{imm} only parameter:
+ - is {s} in opcode: {s} == 0, unsigned (8/)16/32 bit immediate
+ {s} == 1, signed 8 bit immediate
+
+{es:di}: segment register normally %es, can be overwritten
+ edi/di depending on apfx
+
+{ds:si}: segment register normally %ds, can be overwritten
+ esi/si depending on apfx
+
+{ax} al/ax/eax depending of dpfx and w
+
+{dx} (%edx) or (%dx) depending on apfx
+
+
+{w} 0 = b, 1 = { no dpfx = l, dpfx = w }
+
+{W} no dpfx = <empty>, dpfx = w
+{WW} no dpfx = l, dpfx = w
+
+{R} rep prefix possible
+{RE} repe or repne prefix possible
+
+{ccc} CRx registers
+{ddd} DRx registers
+
+{gg} 00 = b, 01 = w, 10 = d, 11 = <illegal>
+{0g} 00 = b, 01 = w, 10 = <illegal>, 11 = <illegal>
+{GG} 00 = <illegal>, 01 = w, 10 = d, 11 = q
+{gG} 00 = <illegal>, 01 = w, 10 = d, 11 = <illegal>
+
+{modr/m} normal registers
+{MODR/M} MMX registers
+{ModR/m} XMM registers
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Special opcodes (prefixes):
+
+
+01100111:{apfx}
+01100110:{dpfx}
+
+00101110:{cs}
+00111110:{ds}
+00100110:{es}
+01100100:{fs}
+01100101:{gs}
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+table format
+
+1bit RE flag
+1bit R flag
+16bit mnemonic
+3bit suffix
+
+5bit fct
+2bit string
+6bit offset1
+5bit offset2
+
+4bit fct
+1bit string
+6bit offset1
+4bit offset2
+
+2bit fct
+1bit string
+3bit offset1
+1bit offset2
+
+61bit
diff --git a/libcpu/i386_data.h b/libcpu/i386_data.h
new file mode 100644
index 00000000..42e66500
--- /dev/null
+++ b/libcpu/i386_data.h
@@ -0,0 +1,1415 @@
+/* Helper routines for disassembler for x86/x86-64.
+ Copyright (C) 2007, 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2007.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#include <inttypes.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <libasm.h>
+
+struct instr_enc
+{
+ /* The mnemonic. Especially encoded for the optimized table. */
+ unsigned int mnemonic : MNEMONIC_BITS;
+
+ /* The rep/repe prefixes. */
+ unsigned int rep : 1;
+ unsigned int repe : 1;
+
+ /* Mnemonic suffix. */
+ unsigned int suffix : SUFFIX_BITS;
+
+ /* Nonzero if the instruction uses modr/m. */
+ unsigned int modrm : 1;
+
+ /* 1st parameter. */
+ unsigned int fct1 : FCT1_BITS;
+#ifdef STR1_BITS
+ unsigned int str1 : STR1_BITS;
+#endif
+ unsigned int off1_1 : OFF1_1_BITS;
+ unsigned int off1_2 : OFF1_2_BITS;
+ unsigned int off1_3 : OFF1_3_BITS;
+
+ /* 2nd parameter. */
+ unsigned int fct2 : FCT2_BITS;
+#ifdef STR2_BITS
+ unsigned int str2 : STR2_BITS;
+#endif
+ unsigned int off2_1 : OFF2_1_BITS;
+ unsigned int off2_2 : OFF2_2_BITS;
+ unsigned int off2_3 : OFF2_3_BITS;
+
+ /* 3rd parameter. */
+ unsigned int fct3 : FCT3_BITS;
+#ifdef STR3_BITS
+ unsigned int str3 : STR3_BITS;
+#endif
+ unsigned int off3_1 : OFF3_1_BITS;
+#ifdef OFF3_2_BITS
+ unsigned int off3_2 : OFF3_2_BITS;
+#endif
+#ifdef OFF3_3_BITS
+ unsigned int off3_3 : OFF3_3_BITS;
+#endif
+};
+
+
+typedef int (*opfct_t) (struct output_data *);
+
+
+static int
+data_prefix (struct output_data *d)
+{
+ char ch = '\0';
+ if (*d->prefixes & has_cs)
+ {
+ ch = 'c';
+ *d->prefixes &= ~has_cs;
+ }
+ else if (*d->prefixes & has_ds)
+ {
+ ch = 'd';
+ *d->prefixes &= ~has_ds;
+ }
+ else if (*d->prefixes & has_es)
+ {
+ ch = 'e';
+ *d->prefixes &= ~has_es;
+ }
+ else if (*d->prefixes & has_fs)
+ {
+ ch = 'f';
+ *d->prefixes &= ~has_fs;
+ }
+ else if (*d->prefixes & has_gs)
+ {
+ ch = 'g';
+ *d->prefixes &= ~has_gs;
+ }
+ else if (*d->prefixes & has_ss)
+ {
+ ch = 's';
+ *d->prefixes &= ~has_ss;
+ }
+ else
+ return 0;
+
+ if (*d->bufcntp + 4 > d->bufsize)
+ return *d->bufcntp + 4 - d->bufsize;
+
+ d->bufp[(*d->bufcntp)++] = '%';
+ d->bufp[(*d->bufcntp)++] = ch;
+ d->bufp[(*d->bufcntp)++] = 's';
+ d->bufp[(*d->bufcntp)++] = ':';
+
+ return 0;
+}
+
+#ifdef X86_64
+static const char hiregs[8][4] =
+ {
+ "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
+ };
+static const char aregs[8][4] =
+ {
+ "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi"
+ };
+static const char dregs[8][4] =
+ {
+ "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"
+ };
+#else
+static const char aregs[8][4] =
+ {
+ "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"
+ };
+# define dregs aregs
+#endif
+
+static int
+general_mod$r_m (struct output_data *d)
+{
+ int r = data_prefix (d);
+ if (r != 0)
+ return r;
+
+ int prefixes = *d->prefixes;
+ const uint8_t *data = &d->data[d->opoff1 / 8];
+ char *bufp = d->bufp;
+ size_t *bufcntp = d->bufcntp;
+ size_t bufsize = d->bufsize;
+
+ uint_fast8_t modrm = data[0];
+#ifndef X86_64
+ if (unlikely ((prefixes & has_addr16) != 0))
+ {
+ int16_t disp = 0;
+ bool nodisp = false;
+
+ if ((modrm & 0xc7) == 6 || (modrm & 0xc0) == 0x80)
+ /* 16 bit displacement. */
+ disp = read_2sbyte_unaligned (&data[1]);
+ else if ((modrm & 0xc0) == 0x40)
+ /* 8 bit displacement. */
+ disp = *(const int8_t *) &data[1];
+ else if ((modrm & 0xc0) == 0)
+ nodisp = true;
+
+ char tmpbuf[sizeof ("-0x1234(%rr,%rr)")];
+ int n;
+ if ((modrm & 0xc7) == 6)
+ n = snprintf (tmpbuf, sizeof (tmpbuf), "0x%" PRIx16, disp);
+ else
+ {
+ n = 0;
+ if (!nodisp)
+ n = snprintf (tmpbuf, sizeof (tmpbuf), "%s0x%" PRIx16,
+ disp < 0 ? "-" : "", disp < 0 ? -disp : disp);
+
+ if ((modrm & 0x4) == 0)
+ n += snprintf (tmpbuf + n, sizeof (tmpbuf) - n, "(%%b%c,%%%ci)",
+ "xp"[(modrm >> 1) & 1], "sd"[modrm & 1]);
+ else
+ n += snprintf (tmpbuf + n, sizeof (tmpbuf) - n, "(%%%s)",
+ ((const char [4][3]) { "si", "di", "bp", "bx" })[modrm & 3]);
+ }
+
+ if (*bufcntp + n + 1 > bufsize)
+ return *bufcntp + n + 1 - bufsize;
+
+ memcpy (&bufp[*bufcntp], tmpbuf, n + 1);
+ *bufcntp += n;
+ }
+ else
+#endif
+ {
+ if ((modrm & 7) != 4)
+ {
+ int32_t disp = 0;
+ bool nodisp = false;
+
+ if ((modrm & 0xc7) == 5 || (modrm & 0xc0) == 0x80)
+ /* 32 bit displacement. */
+ disp = read_4sbyte_unaligned (&data[1]);
+ else if ((modrm & 0xc0) == 0x40)
+ /* 8 bit displacement. */
+ disp = *(const int8_t *) &data[1];
+ else if ((modrm & 0xc0) == 0)
+ nodisp = true;
+
+ char tmpbuf[sizeof ("-0x12345678(%rrrr)")];
+ int n;
+ if (nodisp)
+ {
+ n = snprintf (tmpbuf, sizeof (tmpbuf), "(%%%s)",
+#ifdef X86_64
+ (prefixes & has_rex_b) ? hiregs[modrm & 7] :
+#endif
+ aregs[modrm & 7]);
+#ifdef X86_64
+ if (prefixes & has_addr16)
+ {
+ if (prefixes & has_rex_b)
+ tmpbuf[n++] = 'd';
+ else
+ tmpbuf[2] = 'e';
+ }
+#endif
+ }
+ else if ((modrm & 0xc7) != 5)
+ {
+ int p;
+ n = snprintf (tmpbuf, sizeof (tmpbuf), "%s0x%" PRIx32 "(%%%n%s)",
+ disp < 0 ? "-" : "", disp < 0 ? -disp : disp, &p,
+#ifdef X86_64
+ (prefixes & has_rex_b) ? hiregs[modrm & 7] :
+#endif
+ aregs[modrm & 7]);
+#ifdef X86_64
+ if (prefixes & has_addr16)
+ {
+ if (prefixes & has_rex_b)
+ tmpbuf[n++] = 'd';
+ else
+ tmpbuf[p] = 'e';
+ }
+#endif
+ }
+ else
+ {
+#ifdef X86_64
+ n = snprintf (tmpbuf, sizeof (tmpbuf), "%s0x%" PRIx32 "(%%rip)",
+ disp < 0 ? "-" : "", disp < 0 ? -disp : disp);
+
+ d->symaddr_use = addr_rel_always;
+ d->symaddr = disp;
+#else
+ n = snprintf (tmpbuf, sizeof (tmpbuf), "0x%" PRIx32, disp);
+#endif
+ }
+
+ if (*bufcntp + n + 1 > bufsize)
+ return *bufcntp + n + 1 - bufsize;
+
+ memcpy (&bufp[*bufcntp], tmpbuf, n + 1);
+ *bufcntp += n;
+ }
+ else
+ {
+ /* SIB */
+ uint_fast8_t sib = data[1];
+ int32_t disp = 0;
+ bool nodisp = false;
+
+ if ((modrm & 0xc7) == 5 || (modrm & 0xc0) == 0x80
+ || ((modrm & 0xc7) == 0x4 && (sib & 0x7) == 0x5))
+ /* 32 bit displacement. */
+ disp = read_4sbyte_unaligned (&data[2]);
+ else if ((modrm & 0xc0) == 0x40)
+ /* 8 bit displacement. */
+ disp = *(const int8_t *) &data[2];
+ else
+ nodisp = true;
+
+ char tmpbuf[sizeof ("-0x12345678(%rrrr,%rrrr,N)")];
+ char *cp = tmpbuf;
+ int n;
+ if ((modrm & 0xc0) != 0 || (sib & 0x3f) != 0x25
+#ifdef X86_64
+ || (prefixes & has_rex_x) != 0
+#endif
+ )
+ {
+ if (!nodisp)
+ {
+ n = snprintf (cp, sizeof (tmpbuf), "%s0x%" PRIx32,
+ disp < 0 ? "-" : "", disp < 0 ? -disp : disp);
+ cp += n;
+ }
+
+ *cp++ = '(';
+
+ if ((modrm & 0xc7) != 0x4 || (sib & 0x7) != 0x5)
+ {
+ *cp++ = '%';
+ cp = stpcpy (cp,
+#ifdef X86_64
+ (prefixes & has_rex_b) ? hiregs[sib & 7] :
+ (prefixes & has_addr16) ? dregs[sib & 7] :
+#endif
+ aregs[sib & 7]);
+#ifdef X86_64
+ if ((prefixes & (has_rex_b | has_addr16))
+ == (has_rex_b | has_addr16))
+ *cp++ = 'd';
+#endif
+ }
+
+ if ((sib & 0x38) != 0x20
+#ifdef X86_64
+ || (prefixes & has_rex_x) != 0
+#endif
+ )
+ {
+ *cp++ = ',';
+ *cp++ = '%';
+ cp = stpcpy (cp,
+#ifdef X86_64
+ (prefixes & has_rex_x)
+ ? hiregs[(sib >> 3) & 7] :
+ (prefixes & has_addr16)
+ ? dregs[(sib >> 3) & 7] :
+#endif
+ aregs[(sib >> 3) & 7]);
+#ifdef X86_64
+ if ((prefixes & (has_rex_b | has_addr16))
+ == (has_rex_b | has_addr16))
+ *cp++ = 'd';
+#endif
+
+ *cp++ = ',';
+ *cp++ = '0' + (1 << (sib >> 6));
+ }
+
+ *cp++ = ')';
+ }
+ else
+ {
+ assert (! nodisp);
+#ifdef X86_64
+ if ((prefixes & has_addr16) == 0)
+ n = snprintf (cp, sizeof (tmpbuf), "0x%" PRIx64,
+ (int64_t) disp);
+ else
+#endif
+ n = snprintf (cp, sizeof (tmpbuf), "0x%" PRIx32, disp);
+ cp += n;
+ }
+
+ if (*bufcntp + (cp - tmpbuf) > bufsize)
+ return *bufcntp + (cp - tmpbuf) - bufsize;
+
+ memcpy (&bufp[*bufcntp], tmpbuf, cp - tmpbuf);
+ *bufcntp += cp - tmpbuf;
+ }
+ }
+ return 0;
+}
+
+
+static int
+FCT_MOD$R_M (struct output_data *d)
+{
+ assert (d->opoff1 % 8 == 0);
+ uint_fast8_t modrm = d->data[d->opoff1 / 8];
+ if ((modrm & 0xc0) == 0xc0)
+ {
+ assert (d->opoff1 / 8 == d->opoff2 / 8);
+ assert (d->opoff2 % 8 == 5);
+ //uint_fast8_t byte = d->data[d->opoff2 / 8] & 7;
+ uint_fast8_t byte = modrm & 7;
+
+ size_t *bufcntp = d->bufcntp;
+ char *buf = d->bufp + *bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ int needed;
+ if (*d->prefixes & (has_rep | has_repne))
+ needed = snprintf (buf, avail, "%%%s", dregs[byte]);
+ else
+ needed = snprintf (buf, avail, "%%mm%" PRIxFAST8, byte);
+ if ((size_t) needed > avail)
+ return needed - avail;
+ *bufcntp += needed;
+ return 0;
+ }
+
+ return general_mod$r_m (d);
+}
+
+
+static int
+FCT_Mod$R_m (struct output_data *d)
+{
+ assert (d->opoff1 % 8 == 0);
+ uint_fast8_t modrm = d->data[d->opoff1 / 8];
+ if ((modrm & 0xc0) == 0xc0)
+ {
+ assert (d->opoff1 / 8 == d->opoff2 / 8);
+ assert (d->opoff2 % 8 == 5);
+ //uint_fast8_t byte = data[opoff2 / 8] & 7;
+ uint_fast8_t byte = modrm & 7;
+
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "%%xmm%" PRIxFAST8,
+ byte);
+ if ((size_t) needed > avail)
+ return needed - avail;
+ *d->bufcntp += needed;
+ return 0;
+ }
+
+ return general_mod$r_m (d);
+}
+
+static int
+generic_abs (struct output_data *d, const char *absstring
+#ifdef X86_64
+ , int abslen
+#else
+# define abslen 4
+#endif
+ )
+{
+ int r = data_prefix (d);
+ if (r != 0)
+ return r;
+
+ assert (d->opoff1 % 8 == 0);
+ assert (d->opoff1 / 8 == 1);
+ if (*d->param_start + abslen > d->end)
+ return -1;
+ *d->param_start += abslen;
+#ifndef X86_64
+ uint32_t absval;
+# define ABSPRIFMT PRIx32
+#else
+ uint64_t absval;
+# define ABSPRIFMT PRIx64
+ if (abslen == 8)
+ absval = read_8ubyte_unaligned (&d->data[1]);
+ else
+#endif
+ absval = read_4ubyte_unaligned (&d->data[1]);
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "%s0x%" ABSPRIFMT,
+ absstring, absval);
+ if ((size_t) needed > avail)
+ return needed - avail;
+ *bufcntp += needed;
+ return 0;
+}
+
+
+static int
+FCT_absval (struct output_data *d)
+{
+ return generic_abs (d, "$"
+#ifdef X86_64
+ , 4
+#endif
+ );
+}
+
+static int
+FCT_abs (struct output_data *d)
+{
+ return generic_abs (d, ""
+#ifdef X86_64
+ , 8
+#endif
+ );
+}
+
+static int
+FCT_ax (struct output_data *d)
+{
+ int is_16bit = (*d->prefixes & has_data16) != 0;
+
+ size_t *bufcntp = d->bufcntp;
+ char *bufp = d->bufp;
+ size_t bufsize = d->bufsize;
+
+ if (*bufcntp + 4 - is_16bit > bufsize)
+ return *bufcntp + 4 - is_16bit - bufsize;
+
+ bufp[(*bufcntp)++] = '%';
+ if (! is_16bit)
+ bufp[(*bufcntp)++] = (
+#ifdef X86_64
+ (*d->prefixes & has_rex_w) ? 'r' :
+#endif
+ 'e');
+ bufp[(*bufcntp)++] = 'a';
+ bufp[(*bufcntp)++] = 'x';
+
+ return 0;
+}
+
+
+static int
+FCT_ax$w (struct output_data *d)
+{
+ if ((d->data[d->opoff2 / 8] & (1 << (7 - (d->opoff2 & 7)))) != 0)
+ return FCT_ax (d);
+
+ size_t *bufcntp = d->bufcntp;
+ char *bufp = d->bufp;
+ size_t bufsize = d->bufsize;
+
+ if (*bufcntp + 3 > bufsize)
+ return *bufcntp + 3 - bufsize;
+
+ bufp[(*bufcntp)++] = '%';
+ bufp[(*bufcntp)++] = 'a';
+ bufp[(*bufcntp)++] = 'l';
+
+ return 0;
+}
+
+
+static int
+__attribute__ ((noinline))
+FCT_crdb (struct output_data *d, const char *regstr)
+{
+ if (*d->prefixes & has_data16)
+ return -1;
+
+ size_t *bufcntp = d->bufcntp;
+
+ // XXX If this assert is true, use absolute offset below
+ assert (d->opoff1 / 8 == 2);
+ assert (d->opoff1 % 8 == 2);
+ size_t avail = d->bufsize - *bufcntp;
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "%%%s%" PRIx32,
+ regstr, (uint32_t) (d->data[d->opoff1 / 8] >> 3) & 7);
+ if ((size_t) needed > avail)
+ return needed - avail;
+ *bufcntp += needed;
+ return 0;
+}
+
+
+static int
+FCT_ccc (struct output_data *d)
+{
+ return FCT_crdb (d, "cr");
+}
+
+
+static int
+FCT_ddd (struct output_data *d)
+{
+ return FCT_crdb (d, "db");
+}
+
+
+static int
+FCT_disp8 (struct output_data *d)
+{
+ assert (d->opoff1 % 8 == 0);
+ if (*d->param_start >= d->end)
+ return -1;
+ int32_t offset = *(const int8_t *) (*d->param_start)++;
+
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "0x%" PRIx32,
+ (uint32_t) (d->addr + (*d->param_start - d->data)
+ + offset));
+ if ((size_t) needed > avail)
+ return needed - avail;
+ *bufcntp += needed;
+ return 0;
+}
+
+
+static int
+__attribute__ ((noinline))
+FCT_ds_xx (struct output_data *d, const char *reg)
+{
+ int prefix = *d->prefixes & SEGMENT_PREFIXES;
+
+ if (prefix == 0)
+ *d->prefixes |= prefix = has_ds;
+ /* Make sure only one bit is set. */
+ else if ((prefix - 1) & prefix)
+ return -1;
+
+ int r = data_prefix (d);
+
+ assert ((*d->prefixes & prefix) == 0);
+
+ if (r != 0)
+ return r;
+
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "(%%%s%s)",
+#ifdef X86_64
+ *d->prefixes & idx_addr16 ? "e" : "r",
+#else
+ *d->prefixes & idx_addr16 ? "" : "e",
+#endif
+ reg);
+ if ((size_t) needed > avail)
+ return (size_t) needed - avail;
+ *bufcntp += needed;
+
+ return 0;
+}
+
+
+static int
+FCT_ds_bx (struct output_data *d)
+{
+ return FCT_ds_xx (d, "bx");
+}
+
+
+static int
+FCT_ds_si (struct output_data *d)
+{
+ return FCT_ds_xx (d, "si");
+}
+
+
+static int
+FCT_dx (struct output_data *d)
+{
+ size_t *bufcntp = d->bufcntp;
+
+ if (*bufcntp + 7 > d->bufsize)
+ return *bufcntp + 7 - d->bufsize;
+
+ memcpy (&d->bufp[*bufcntp], "(%dx)", 5);
+ *bufcntp += 5;
+
+ return 0;
+}
+
+
+static int
+FCT_es_di (struct output_data *d)
+{
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "%%es:(%%%sdi)",
+#ifdef X86_64
+ *d->prefixes & idx_addr16 ? "e" : "r"
+#else
+ *d->prefixes & idx_addr16 ? "" : "e"
+#endif
+ );
+ if ((size_t) needed > avail)
+ return (size_t) needed - avail;
+ *bufcntp += needed;
+
+ return 0;
+}
+
+
+static int
+FCT_imm (struct output_data *d)
+{
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ int needed;
+ if (*d->prefixes & has_data16)
+ {
+ if (*d->param_start + 2 > d->end)
+ return -1;
+ uint16_t word = read_2ubyte_unaligned_inc (*d->param_start);
+ needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx16, word);
+ }
+ else
+ {
+ if (*d->param_start + 4 > d->end)
+ return -1;
+ int32_t word = read_4sbyte_unaligned_inc (*d->param_start);
+#ifdef X86_64
+ if (*d->prefixes & has_rex_w)
+ needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx64,
+ (int64_t) word);
+ else
+#endif
+ needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx32, word);
+ }
+ if ((size_t) needed > avail)
+ return (size_t) needed - avail;
+ *bufcntp += needed;
+ return 0;
+}
+
+
+static int
+FCT_imm$w (struct output_data *d)
+{
+ if ((d->data[d->opoff2 / 8] & (1 << (7 - (d->opoff2 & 7)))) != 0)
+ return FCT_imm (d);
+
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ if (*d->param_start>= d->end)
+ return -1;
+ uint_fast8_t word = *(*d->param_start)++;
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIxFAST8, word);
+ if ((size_t) needed > avail)
+ return (size_t) needed - avail;
+ *bufcntp += needed;
+ return 0;
+}
+
+
+#ifdef X86_64
+static int
+FCT_imm64$w (struct output_data *d)
+{
+ if ((d->data[d->opoff2 / 8] & (1 << (7 - (d->opoff2 & 7)))) == 0
+ || (*d->prefixes & has_data16) != 0)
+ return FCT_imm$w (d);
+
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ int needed;
+ if (*d->prefixes & has_rex_w)
+ {
+ if (*d->param_start + 8 > d->end)
+ return -1;
+ uint64_t word = read_8ubyte_unaligned_inc (*d->param_start);
+ needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx64, word);
+ }
+ else
+ {
+ if (*d->param_start + 4 > d->end)
+ return -1;
+ int32_t word = read_4sbyte_unaligned_inc (*d->param_start);
+ needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx32, word);
+ }
+ if ((size_t) needed > avail)
+ return (size_t) needed - avail;
+ *bufcntp += needed;
+ return 0;
+}
+#endif
+
+
+static int
+FCT_imms (struct output_data *d)
+{
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ if (*d->param_start>= d->end)
+ return -1;
+ int8_t byte = *(*d->param_start)++;
+#ifdef X86_64
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx64,
+ (int64_t) byte);
+#else
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx32,
+ (int32_t) byte);
+#endif
+ if ((size_t) needed > avail)
+ return (size_t) needed - avail;
+ *bufcntp += needed;
+ return 0;
+}
+
+
+static int
+FCT_imm$s (struct output_data *d)
+{
+ uint_fast8_t opcode = d->data[d->opoff2 / 8];
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ if ((opcode & 2) != 0)
+ return FCT_imms (d);
+
+ if ((*d->prefixes & has_data16) == 0)
+ {
+ if (*d->param_start + 4 > d->end)
+ return -1;
+ int32_t word = read_4sbyte_unaligned_inc (*d->param_start);
+#ifdef X86_64
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx64,
+ (int64_t) word);
+#else
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx32, word);
+#endif
+ if ((size_t) needed > avail)
+ return (size_t) needed - avail;
+ *bufcntp += needed;
+ }
+ else
+ {
+ if (*d->param_start + 2 > d->end)
+ return -1;
+ uint16_t word = read_2ubyte_unaligned_inc (*d->param_start);
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx16, word);
+ if ((size_t) needed > avail)
+ return (size_t) needed - avail;
+ *bufcntp += needed;
+ }
+ return 0;
+}
+
+
+static int
+FCT_imm16 (struct output_data *d)
+{
+ if (*d->param_start + 2 > d->end)
+ return -1;
+ uint16_t word = read_2ubyte_unaligned_inc (*d->param_start);
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx16, word);
+ if ((size_t) needed > avail)
+ return (size_t) needed - avail;
+ *bufcntp += needed;
+ return 0;
+}
+
+
+static int
+FCT_imms8 (struct output_data *d)
+{
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ if (*d->param_start >= d->end)
+ return -1;
+ int_fast8_t byte = *(*d->param_start)++;
+ int needed;
+#ifdef X86_64
+ if (*d->prefixes & has_rex_w)
+ needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx64,
+ (int64_t) byte);
+ else
+#endif
+ needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx32,
+ (int32_t) byte);
+ if ((size_t) needed > avail)
+ return (size_t) needed - avail;
+ *bufcntp += needed;
+ return 0;
+}
+
+
+static int
+FCT_imm8 (struct output_data *d)
+{
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ if (*d->param_start >= d->end)
+ return -1;
+ uint_fast8_t byte = *(*d->param_start)++;
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx32,
+ (uint32_t) byte);
+ if ((size_t) needed > avail)
+ return (size_t) needed - avail;
+ *bufcntp += needed;
+ return 0;
+}
+
+
+static int
+FCT_rel (struct output_data *d)
+{
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ if (*d->param_start + 4 > d->end)
+ return -1;
+ int32_t rel = read_4sbyte_unaligned_inc (*d->param_start);
+#ifdef X86_64
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "0x%" PRIx64,
+ (uint64_t) (d->addr + rel
+ + (*d->param_start - d->data)));
+#else
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "0x%" PRIx32,
+ (uint32_t) (d->addr + rel
+ + (*d->param_start - d->data)));
+#endif
+ if ((size_t) needed > avail)
+ return (size_t) needed - avail;
+ *bufcntp += needed;
+ return 0;
+}
+
+
+static int
+FCT_mmxreg (struct output_data *d)
+{
+ uint_fast8_t byte = d->data[d->opoff1 / 8];
+ assert (d->opoff1 % 8 == 2 || d->opoff1 % 8 == 5);
+ byte = (byte >> (5 - d->opoff1 % 8)) & 7;
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "%%mm%" PRIxFAST8, byte);
+ if ((size_t) needed > avail)
+ return needed - avail;
+ *bufcntp += needed;
+ return 0;
+}
+
+
+static int
+FCT_mod$r_m (struct output_data *d)
+{
+ assert (d->opoff1 % 8 == 0);
+ uint_fast8_t modrm = d->data[d->opoff1 / 8];
+ if ((modrm & 0xc0) == 0xc0)
+ {
+ int prefixes = *d->prefixes;
+ if (prefixes & has_addr16)
+ return -1;
+
+ int is_16bit = (prefixes & has_data16) != 0;
+
+ size_t *bufcntp = d->bufcntp;
+ char *bufp = d->bufp;
+ if (*bufcntp + 5 - is_16bit > d->bufsize)
+ return *bufcntp + 5 - is_16bit - d->bufsize;
+ bufp[(*bufcntp)++] = '%';
+
+ char *cp;
+#ifdef X86_64
+ if ((prefixes & has_rex_b) != 0 && !is_16bit)
+ {
+ cp = stpcpy (&bufp[*bufcntp], hiregs[modrm & 7]);
+ if ((prefixes & has_rex_w) == 0)
+ *cp++ = 'd';
+ }
+ else
+#endif
+ {
+ cp = stpcpy (&bufp[*bufcntp], dregs[modrm & 7] + is_16bit);
+#ifdef X86_64
+ if ((prefixes & has_rex_w) != 0)
+ bufp[*bufcntp] = 'r';
+#endif
+ }
+ *bufcntp = cp - bufp;
+ return 0;
+ }
+
+ return general_mod$r_m (d);
+}
+
+
+#ifndef X86_64
+static int
+FCT_moda$r_m (struct output_data *d)
+{
+ assert (d->opoff1 % 8 == 0);
+ uint_fast8_t modrm = d->data[d->opoff1 / 8];
+ if ((modrm & 0xc0) == 0xc0)
+ {
+ if (*d->prefixes & has_addr16)
+ return -1;
+
+ size_t *bufcntp = d->bufcntp;
+ if (*bufcntp + 3 > d->bufsize)
+ return *bufcntp + 3 - d->bufsize;
+
+ memcpy (&d->bufp[*bufcntp], "???", 3);
+ *bufcntp += 3;
+
+ return 0;
+ }
+
+ return general_mod$r_m (d);
+}
+#endif
+
+
+#ifdef X86_64
+static const char rex_8bit[8][3] =
+ {
+ [0] = "a", [1] = "c", [2] = "d", [3] = "b",
+ [4] = "sp", [5] = "bp", [6] = "si", [7] = "di"
+ };
+#endif
+
+
+static int
+FCT_mod$r_m$w (struct output_data *d)
+{
+ assert (d->opoff1 % 8 == 0);
+ const uint8_t *data = d->data;
+ uint_fast8_t modrm = data[d->opoff1 / 8];
+ if ((modrm & 0xc0) == 0xc0)
+ {
+ int prefixes = *d->prefixes;
+
+ if (prefixes & has_addr16)
+ return -1;
+
+ size_t *bufcntp = d->bufcntp;
+ char *bufp = d->bufp;
+ if (*bufcntp + 5 > d->bufsize)
+ return *bufcntp + 5 - d->bufsize;
+
+ if ((data[d->opoff3 / 8] & (1 << (7 - (d->opoff3 & 7)))) == 0)
+ {
+ bufp[(*bufcntp)++] = '%';
+
+#ifdef X86_64
+ if (prefixes & has_rex)
+ {
+ if (prefixes & has_rex_r)
+ *bufcntp += snprintf (bufp + *bufcntp, d->bufsize - *bufcntp,
+ "r%db", 8 + (modrm & 7));
+ else
+ {
+ char *cp = stpcpy (bufp + *bufcntp, hiregs[modrm & 7]);
+ *cp++ = 'l';
+ *bufcntp = cp - bufp;
+ }
+ }
+ else
+#endif
+ {
+ bufp[(*bufcntp)++] = "acdb"[modrm & 3];
+ bufp[(*bufcntp)++] = "lh"[(modrm & 4) >> 2];
+ }
+ }
+ else
+ {
+ int is_16bit = (prefixes & has_data16) != 0;
+
+ bufp[(*bufcntp)++] = '%';
+
+ char *cp;
+#ifdef X86_64
+ if ((prefixes & has_rex_b) != 0 && !is_16bit)
+ {
+ cp = stpcpy (&bufp[*bufcntp], hiregs[modrm & 7]);
+ if ((prefixes & has_rex_w) == 0)
+ *cp++ = 'd';
+ }
+ else
+#endif
+ {
+ cp = stpcpy (&bufp[*bufcntp], dregs[modrm & 7] + is_16bit);
+#ifdef X86_64
+ if ((prefixes & has_rex_w) != 0)
+ bufp[*bufcntp] = 'r';
+#endif
+ }
+ *bufcntp = cp - bufp;
+ }
+ return 0;
+ }
+
+ return general_mod$r_m (d);
+}
+
+
+static int
+FCT_mod$8r_m (struct output_data *d)
+{
+ assert (d->opoff1 % 8 == 0);
+ uint_fast8_t modrm = d->data[d->opoff1 / 8];
+ if ((modrm & 0xc0) == 0xc0)
+ {
+ size_t *bufcntp = d->bufcntp;
+ char *bufp = d->bufp;
+ if (*bufcntp + 3 > d->bufsize)
+ return *bufcntp + 3 - d->bufsize;
+ bufp[(*bufcntp)++] = '%';
+ bufp[(*bufcntp)++] = "acdb"[modrm & 3];
+ bufp[(*bufcntp)++] = "lh"[(modrm & 4) >> 2];
+ return 0;
+ }
+
+ return general_mod$r_m (d);
+}
+
+
+static int
+FCT_mod$16r_m (struct output_data *d)
+{
+ assert (d->opoff1 % 8 == 0);
+ uint_fast8_t modrm = d->data[d->opoff1 / 8];
+ if ((modrm & 0xc0) == 0xc0)
+ {
+ assert (d->opoff1 / 8 == d->opoff2 / 8);
+ //uint_fast8_t byte = data[opoff2 / 8] & 7;
+ uint_fast8_t byte = modrm & 7;
+
+ size_t *bufcntp = d->bufcntp;
+ if (*bufcntp + 3 > d->bufsize)
+ return *bufcntp + 3 - d->bufsize;
+ d->bufp[(*bufcntp)++] = '%';
+ memcpy (&d->bufp[*bufcntp], dregs[byte] + 1, sizeof (dregs[0]) - 1);
+ *bufcntp += 2;
+ return 0;
+ }
+
+ return general_mod$r_m (d);
+}
+
+
+#ifdef X86_64
+static int
+FCT_mod$64r_m (struct output_data *d)
+{
+ assert (d->opoff1 % 8 == 0);
+ uint_fast8_t modrm = d->data[d->opoff1 / 8];
+ if ((modrm & 0xc0) == 0xc0)
+ {
+ assert (d->opoff1 / 8 == d->opoff2 / 8);
+ //uint_fast8_t byte = data[opoff2 / 8] & 7;
+ uint_fast8_t byte = modrm & 7;
+
+ size_t *bufcntp = d->bufcntp;
+ if (*bufcntp + 4 > d->bufsize)
+ return *bufcntp + 4 - d->bufsize;
+ char *cp = &d->bufp[*bufcntp];
+ *cp++ = '%';
+ cp = stpcpy (cp,
+ (*d->prefixes & has_rex_b) ? hiregs[byte] : aregs[byte]);
+ *bufcntp = cp - d->bufp;
+ return 0;
+ }
+
+ return general_mod$r_m (d);
+}
+#else
+static typeof (FCT_mod$r_m) FCT_mod$64r_m __attribute__ ((alias ("FCT_mod$r_m")));
+#endif
+
+
+static int
+FCT_reg (struct output_data *d)
+{
+ uint_fast8_t byte = d->data[d->opoff1 / 8];
+ assert (d->opoff1 % 8 + 3 <= 8);
+ byte >>= 8 - (d->opoff1 % 8 + 3);
+ byte &= 7;
+ int is_16bit = (*d->prefixes & has_data16) != 0;
+ size_t *bufcntp = d->bufcntp;
+ if (*bufcntp + 5 > d->bufsize)
+ return *bufcntp + 5 - d->bufsize;
+ d->bufp[(*bufcntp)++] = '%';
+#ifdef X86_64
+ if ((*d->prefixes & has_rex_r) != 0 && !is_16bit)
+ {
+ *bufcntp += snprintf (&d->bufp[*bufcntp], d->bufsize - *bufcntp, "r%d",
+ 8 + byte);
+ if ((*d->prefixes & has_rex_w) == 0)
+ d->bufp[(*bufcntp)++] = 'd';
+ }
+ else
+#endif
+ {
+ memcpy (&d->bufp[*bufcntp], dregs[byte] + is_16bit, 3 - is_16bit);
+#ifdef X86_64
+ if ((*d->prefixes & has_rex_w) != 0 && !is_16bit)
+ d->bufp[*bufcntp] = 'r';
+#endif
+ *bufcntp += 3 - is_16bit;
+ }
+ return 0;
+}
+
+
+#ifdef X86_64
+static int
+FCT_oreg (struct output_data *d)
+{
+ /* Special form where register comes from opcode. The rex.B bit is used,
+ rex.R and rex.X are ignored. */
+ int save_prefixes = *d->prefixes;
+
+ *d->prefixes = ((save_prefixes & ~has_rex_r)
+ | ((save_prefixes & has_rex_b) << (idx_rex_r - idx_rex_b)));
+
+ int r = FCT_reg (d);
+
+ *d->prefixes = save_prefixes;
+
+ return r;
+}
+#endif
+
+
+static int
+FCT_reg64 (struct output_data *d)
+{
+ uint_fast8_t byte = d->data[d->opoff1 / 8];
+ assert (d->opoff1 % 8 + 3 <= 8);
+ byte >>= 8 - (d->opoff1 % 8 + 3);
+ byte &= 7;
+ if ((*d->prefixes & has_data16) != 0)
+ return -1;
+ size_t *bufcntp = d->bufcntp;
+ if (*bufcntp + 5 > d->bufsize)
+ return *bufcntp + 5 - d->bufsize;
+ d->bufp[(*bufcntp)++] = '%';
+#ifdef X86_64
+ if ((*d->prefixes & has_rex_r) != 0)
+ {
+ *bufcntp += snprintf (&d->bufp[*bufcntp], d->bufsize - *bufcntp, "r%d",
+ 8 + byte);
+ if ((*d->prefixes & has_rex_w) == 0)
+ d->bufp[(*bufcntp)++] = 'd';
+ }
+ else
+#endif
+ {
+ memcpy (&d->bufp[*bufcntp], aregs[byte], 3);
+ *bufcntp += 3;
+ }
+ return 0;
+}
+
+
+static int
+FCT_reg$w (struct output_data *d)
+{
+ if (d->data[d->opoff2 / 8] & (1 << (7 - (d->opoff2 & 7))))
+ return FCT_reg (d);
+
+ uint_fast8_t byte = d->data[d->opoff1 / 8];
+ assert (d->opoff1 % 8 + 3 <= 8);
+ byte >>= 8 - (d->opoff1 % 8 + 3);
+ byte &= 7;
+
+ size_t *bufcntp = d->bufcntp;
+ if (*bufcntp + 4 > d->bufsize)
+ return *bufcntp + 4 - d->bufsize;
+
+ d->bufp[(*bufcntp)++] = '%';
+
+#ifdef X86_64
+ if (*d->prefixes & has_rex)
+ {
+ if (*d->prefixes & has_rex_r)
+ *bufcntp += snprintf (d->bufp + *bufcntp, d->bufsize - *bufcntp,
+ "r%db", 8 + byte);
+ else
+ {
+ char* cp = stpcpy (d->bufp + *bufcntp, rex_8bit[byte]);
+ *cp++ = 'l';
+ *bufcntp = cp - d->bufp;
+ }
+ }
+ else
+#endif
+ {
+ d->bufp[(*bufcntp)++] = "acdb"[byte & 3];
+ d->bufp[(*bufcntp)++] = "lh"[byte >> 2];
+ }
+ return 0;
+}
+
+
+#ifdef X86_64
+static int
+FCT_oreg$w (struct output_data *d)
+{
+ /* Special form where register comes from opcode. The rex.B bit is used,
+ rex.R and rex.X are ignored. */
+ int save_prefixes = *d->prefixes;
+
+ *d->prefixes = ((save_prefixes & ~has_rex_r)
+ | ((save_prefixes & has_rex_b) << (idx_rex_r - idx_rex_b)));
+
+ int r = FCT_reg$w (d);
+
+ *d->prefixes = save_prefixes;
+
+ return r;
+}
+#endif
+
+
+static int
+FCT_freg (struct output_data *d)
+{
+ assert (d->opoff1 / 8 == 1);
+ assert (d->opoff1 % 8 == 5);
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "%%st(%" PRIx32 ")",
+ (uint32_t) (d->data[1] & 7));
+ if ((size_t) needed > avail)
+ return (size_t) needed - avail;
+ *bufcntp += needed;
+ return 0;
+}
+
+
+#ifndef X86_64
+static int
+FCT_reg16 (struct output_data *d)
+{
+ if (*d->prefixes & has_data16)
+ return -1;
+
+ *d->prefixes |= has_data16;
+ return FCT_reg (d);
+}
+#endif
+
+
+static int
+FCT_sel (struct output_data *d)
+{
+ assert (d->opoff1 % 8 == 0);
+ assert (d->opoff1 / 8 == 5);
+ if (*d->param_start + 2 > d->end)
+ return -1;
+ *d->param_start += 2;
+ uint16_t absval = read_2ubyte_unaligned (&d->data[5]);
+
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx16, absval);
+ if ((size_t) needed > avail)
+ return needed - avail;
+ *bufcntp += needed;
+ return 0;
+}
+
+
+static int
+FCT_sreg2 (struct output_data *d)
+{
+ uint_fast8_t byte = d->data[d->opoff1 / 8];
+ assert (d->opoff1 % 8 + 3 <= 8);
+ byte >>= 8 - (d->opoff1 % 8 + 2);
+
+ size_t *bufcntp = d->bufcntp;
+ char *bufp = d->bufp;
+ if (*bufcntp + 3 > d->bufsize)
+ return *bufcntp + 3 - d->bufsize;
+
+ bufp[(*bufcntp)++] = '%';
+ bufp[(*bufcntp)++] = "ecsd"[byte & 3];
+ bufp[(*bufcntp)++] = 's';
+
+ return 0;
+}
+
+
+static int
+FCT_sreg3 (struct output_data *d)
+{
+ uint_fast8_t byte = d->data[d->opoff1 / 8];
+ assert (d->opoff1 % 8 + 4 <= 8);
+ byte >>= 8 - (d->opoff1 % 8 + 3);
+
+ if ((byte & 7) >= 6)
+ return -1;
+
+ size_t *bufcntp = d->bufcntp;
+ char *bufp = d->bufp;
+ if (*bufcntp + 3 > d->bufsize)
+ return *bufcntp + 3 - d->bufsize;
+
+ bufp[(*bufcntp)++] = '%';
+ bufp[(*bufcntp)++] = "ecsdfg"[byte & 7];
+ bufp[(*bufcntp)++] = 's';
+
+ return 0;
+}
+
+
+static int
+FCT_string (struct output_data *d __attribute__ ((unused)))
+{
+ return 0;
+}
+
+
+static int
+FCT_xmmreg (struct output_data *d)
+{
+ uint_fast8_t byte = d->data[d->opoff1 / 8];
+ assert (d->opoff1 % 8 == 2 || d->opoff1 % 8 == 5);
+ byte = (byte >> (5 - d->opoff1 % 8)) & 7;
+
+ size_t *bufcntp = d->bufcntp;
+ size_t avail = d->bufsize - *bufcntp;
+ int needed = snprintf (&d->bufp[*bufcntp], avail, "%%xmm%" PRIxFAST8, byte);
+ if ((size_t) needed > avail)
+ return needed - avail;
+ *bufcntp += needed;
+ return 0;
+}
diff --git a/libcpu/i386_dis.c b/libcpu/i386_dis.c
deleted file mode 100644
index 971746e3..00000000
--- a/libcpu/i386_dis.c
+++ /dev/null
@@ -1 +0,0 @@
-int foo;
diff --git a/libcpu/i386_disasm.c b/libcpu/i386_disasm.c
new file mode 100644
index 00000000..c6bb0a58
--- /dev/null
+++ b/libcpu/i386_disasm.c
@@ -0,0 +1,1054 @@
+/* Disassembler for x86.
+ Copyright (C) 2007, 2008, 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2007.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+#include <config.h>
+#include <ctype.h>
+#include <endian.h>
+#include <errno.h>
+#include <gelf.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/param.h>
+
+#include "../libebl/libeblP.h"
+
+#define MACHINE_ENCODING __LITTLE_ENDIAN
+#include "memory-access.h"
+
+
+#ifndef MNEFILE
+# define MNEFILE "i386.mnemonics"
+#endif
+
+#define MNESTRFIELD(line) MNESTRFIELD1 (line)
+#define MNESTRFIELD1(line) str##line
+static const union mnestr_t
+{
+ struct
+ {
+#define MNE(name) char MNESTRFIELD (__LINE__)[sizeof (#name)];
+#include MNEFILE
+#undef MNE
+ };
+ char str[0];
+} mnestr =
+ {
+ {
+#define MNE(name) #name,
+#include MNEFILE
+#undef MNE
+ }
+ };
+
+/* The index can be stored in the instrtab. */
+enum
+ {
+#define MNE(name) MNE_##name,
+#include MNEFILE
+#undef MNE
+ MNE_INVALID
+ };
+
+static const unsigned short int mneidx[] =
+ {
+#define MNE(name) \
+ [MNE_##name] = offsetof (union mnestr_t, MNESTRFIELD (__LINE__)),
+#include MNEFILE
+#undef MNE
+ };
+
+
+enum
+ {
+ idx_rex_b = 0,
+ idx_rex_x,
+ idx_rex_r,
+ idx_rex_w,
+ idx_rex,
+ idx_cs,
+ idx_ds,
+ idx_es,
+ idx_fs,
+ idx_gs,
+ idx_ss,
+ idx_data16,
+ idx_addr16,
+ idx_rep,
+ idx_repne,
+ idx_lock
+ };
+
+enum
+ {
+#define prefbit(pref) has_##pref = 1 << idx_##pref
+ prefbit (rex_b),
+ prefbit (rex_x),
+ prefbit (rex_r),
+ prefbit (rex_w),
+ prefbit (rex),
+ prefbit (cs),
+ prefbit (ds),
+ prefbit (es),
+ prefbit (fs),
+ prefbit (gs),
+ prefbit (ss),
+ prefbit (data16),
+ prefbit (addr16),
+ prefbit (rep),
+ prefbit (repne),
+ prefbit (lock)
+#undef prefbit
+ };
+#define SEGMENT_PREFIXES \
+ (has_cs | has_ds | has_es | has_fs | has_gs | has_ss)
+
+#define prefix_cs 0x2e
+#define prefix_ds 0x3e
+#define prefix_es 0x26
+#define prefix_fs 0x64
+#define prefix_gs 0x65
+#define prefix_ss 0x36
+#define prefix_data16 0x66
+#define prefix_addr16 0x67
+#define prefix_rep 0xf3
+#define prefix_repne 0xf2
+#define prefix_lock 0xf0
+
+
+static const uint8_t known_prefixes[] =
+ {
+#define newpref(pref) [idx_##pref] = prefix_##pref
+ newpref (cs),
+ newpref (ds),
+ newpref (es),
+ newpref (fs),
+ newpref (gs),
+ newpref (ss),
+ newpref (data16),
+ newpref (addr16),
+ newpref (rep),
+ newpref (repne),
+ newpref (lock)
+#undef newpref
+ };
+#define nknown_prefixes (sizeof (known_prefixes) / sizeof (known_prefixes[0]))
+
+
+#if 0
+static const char *prefix_str[] =
+ {
+#define newpref(pref) [idx_##pref] = #pref
+ newpref (cs),
+ newpref (ds),
+ newpref (es),
+ newpref (fs),
+ newpref (gs),
+ newpref (ss),
+ newpref (data16),
+ newpref (addr16),
+ newpref (rep),
+ newpref (repne),
+ newpref (lock)
+#undef newpref
+ };
+#endif
+
+
+static const char amd3dnowstr[] =
+#define MNE_3DNOW_PAVGUSB 1
+ "pavgusb\0"
+#define MNE_3DNOW_PFADD (MNE_3DNOW_PAVGUSB + 8)
+ "pfadd\0"
+#define MNE_3DNOW_PFSUB (MNE_3DNOW_PFADD + 6)
+ "pfsub\0"
+#define MNE_3DNOW_PFSUBR (MNE_3DNOW_PFSUB + 6)
+ "pfsubr\0"
+#define MNE_3DNOW_PFACC (MNE_3DNOW_PFSUBR + 7)
+ "pfacc\0"
+#define MNE_3DNOW_PFCMPGE (MNE_3DNOW_PFACC + 6)
+ "pfcmpge\0"
+#define MNE_3DNOW_PFCMPGT (MNE_3DNOW_PFCMPGE + 8)
+ "pfcmpgt\0"
+#define MNE_3DNOW_PFCMPEQ (MNE_3DNOW_PFCMPGT + 8)
+ "pfcmpeq\0"
+#define MNE_3DNOW_PFMIN (MNE_3DNOW_PFCMPEQ + 8)
+ "pfmin\0"
+#define MNE_3DNOW_PFMAX (MNE_3DNOW_PFMIN + 6)
+ "pfmax\0"
+#define MNE_3DNOW_PI2FD (MNE_3DNOW_PFMAX + 6)
+ "pi2fd\0"
+#define MNE_3DNOW_PF2ID (MNE_3DNOW_PI2FD + 6)
+ "pf2id\0"
+#define MNE_3DNOW_PFRCP (MNE_3DNOW_PF2ID + 6)
+ "pfrcp\0"
+#define MNE_3DNOW_PFRSQRT (MNE_3DNOW_PFRCP + 6)
+ "pfrsqrt\0"
+#define MNE_3DNOW_PFMUL (MNE_3DNOW_PFRSQRT + 8)
+ "pfmul\0"
+#define MNE_3DNOW_PFRCPIT1 (MNE_3DNOW_PFMUL + 6)
+ "pfrcpit1\0"
+#define MNE_3DNOW_PFRSQIT1 (MNE_3DNOW_PFRCPIT1 + 9)
+ "pfrsqit1\0"
+#define MNE_3DNOW_PFRCPIT2 (MNE_3DNOW_PFRSQIT1 + 9)
+ "pfrcpit2\0"
+#define MNE_3DNOW_PMULHRW (MNE_3DNOW_PFRCPIT2 + 9)
+ "pmulhrw";
+
+#define AMD3DNOW_LOW_IDX 0x0d
+#define AMD3DNOW_HIGH_IDX (sizeof (amd3dnow) + AMD3DNOW_LOW_IDX - 1)
+#define AMD3DNOW_IDX(val) ((val) - AMD3DNOW_LOW_IDX)
+static const unsigned char amd3dnow[] =
+ {
+ [AMD3DNOW_IDX (0xbf)] = MNE_3DNOW_PAVGUSB,
+ [AMD3DNOW_IDX (0x9e)] = MNE_3DNOW_PFADD,
+ [AMD3DNOW_IDX (0x9a)] = MNE_3DNOW_PFSUB,
+ [AMD3DNOW_IDX (0xaa)] = MNE_3DNOW_PFSUBR,
+ [AMD3DNOW_IDX (0xae)] = MNE_3DNOW_PFACC,
+ [AMD3DNOW_IDX (0x90)] = MNE_3DNOW_PFCMPGE,
+ [AMD3DNOW_IDX (0xa0)] = MNE_3DNOW_PFCMPGT,
+ [AMD3DNOW_IDX (0xb0)] = MNE_3DNOW_PFCMPEQ,
+ [AMD3DNOW_IDX (0x94)] = MNE_3DNOW_PFMIN,
+ [AMD3DNOW_IDX (0xa4)] = MNE_3DNOW_PFMAX,
+ [AMD3DNOW_IDX (0x0d)] = MNE_3DNOW_PI2FD,
+ [AMD3DNOW_IDX (0x1d)] = MNE_3DNOW_PF2ID,
+ [AMD3DNOW_IDX (0x96)] = MNE_3DNOW_PFRCP,
+ [AMD3DNOW_IDX (0x97)] = MNE_3DNOW_PFRSQRT,
+ [AMD3DNOW_IDX (0xb4)] = MNE_3DNOW_PFMUL,
+ [AMD3DNOW_IDX (0xa6)] = MNE_3DNOW_PFRCPIT1,
+ [AMD3DNOW_IDX (0xa7)] = MNE_3DNOW_PFRSQIT1,
+ [AMD3DNOW_IDX (0xb6)] = MNE_3DNOW_PFRCPIT2,
+ [AMD3DNOW_IDX (0xb7)] = MNE_3DNOW_PMULHRW
+ };
+
+
+struct output_data
+{
+ GElf_Addr addr;
+ int *prefixes;
+ size_t opoff1;
+ size_t opoff2;
+ size_t opoff3;
+ char *bufp;
+ size_t *bufcntp;
+ size_t bufsize;
+ const uint8_t *data;
+ const uint8_t **param_start;
+ const uint8_t *end;
+ char *labelbuf;
+ size_t labelbufsize;
+ enum
+ {
+ addr_none = 0,
+ addr_abs_symbolic,
+ addr_abs_always,
+ addr_rel_symbolic,
+ addr_rel_always
+ } symaddr_use;
+ GElf_Addr symaddr;
+};
+
+
+#ifndef DISFILE
+# define DISFILE "i386_dis.h"
+#endif
+#include DISFILE
+
+
+#define ADD_CHAR(ch) \
+ do { \
+ if (unlikely (bufcnt == bufsize)) \
+ goto enomem; \
+ buf[bufcnt++] = (ch); \
+ } while (0)
+
+#define ADD_STRING(str) \
+ do { \
+ const char *_str = (str); \
+ size_t _len = strlen (_str); \
+ if (unlikely (bufcnt + _len > bufsize)) \
+ goto enomem; \
+ memcpy (buf + bufcnt, str, _len); \
+ bufcnt += _len; \
+ } while (0)
+
+
+int
+i386_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)
+{
+ const char *save_fmt = fmt;
+
+#define BUFSIZE 512
+ char initbuf[BUFSIZE];
+ int prefixes;
+ size_t bufcnt;
+ size_t bufsize = BUFSIZE;
+ char *buf = initbuf;
+ const uint8_t *param_start;
+
+ struct output_data output_data =
+ {
+ .prefixes = &prefixes,
+ .bufp = buf,
+ .bufsize = bufsize,
+ .bufcntp = &bufcnt,
+ .param_start = &param_start,
+ .end = end
+ };
+
+ int retval = 0;
+ while (1)
+ {
+ prefixes = 0;
+
+ const uint8_t *data = *startp;
+ const uint8_t *begin = data;
+
+ /* Recognize all prefixes. */
+ int last_prefix_bit = 0;
+ while (data < end)
+ {
+ unsigned int i;
+ for (i = idx_cs; i < nknown_prefixes; ++i)
+ if (known_prefixes[i] == *data)
+ break;
+ if (i == nknown_prefixes)
+ break;
+
+ prefixes |= last_prefix_bit = 1 << i;
+
+ ++data;
+ }
+
+#ifdef X86_64
+ if (data < end && (*data & 0xf0) == 0x40)
+ prefixes |= ((*data++) & 0xf) | has_rex;
+#endif
+
+ bufcnt = 0;
+ size_t cnt = 0;
+
+ const uint8_t *curr = match_data;
+ const uint8_t *const match_end = match_data + sizeof (match_data);
+
+ assert (data <= end);
+ if (data == end)
+ {
+ if (prefixes != 0)
+ goto print_prefix;
+
+ retval = -1;
+ goto do_ret;
+ }
+
+ next_match:
+ while (curr < match_end)
+ {
+ uint_fast8_t len = *curr++;
+ uint_fast8_t clen = len >> 4;
+ len &= 0xf;
+ const uint8_t *next_curr = curr + clen + (len - clen) * 2;
+
+ assert (len > 0);
+ assert (curr + clen + 2 * (len - clen) <= match_end);
+
+ const uint8_t *codep = data;
+ int correct_prefix = 0;
+ int opoff = 0;
+
+ if (data > begin && codep[-1] == *curr && clen > 0)
+ {
+ /* We match a prefix byte. This is exactly one byte and
+ is matched exactly, without a mask. */
+ --len;
+ --clen;
+ opoff = 8;
+
+ ++curr;
+
+ assert (last_prefix_bit != 0);
+ correct_prefix = last_prefix_bit;
+ }
+
+ size_t avail = len;
+ while (clen > 0)
+ {
+ if (*codep++ != *curr++)
+ goto not;
+ --avail;
+ --clen;
+ if (codep == end && avail > 0)
+ goto do_ret;
+ }
+
+ while (avail > 0)
+ {
+ uint_fast8_t masked = *codep++ & *curr++;
+ if (masked != *curr++)
+ {
+ not:
+ curr = next_curr;
+ ++cnt;
+ bufcnt = 0;
+ goto next_match;
+ }
+
+ --avail;
+ if (codep == end && avail > 0)
+ goto do_ret;
+ }
+
+ if (len > end - data)
+ /* There is not enough data for the entire instruction. The
+ caller can figure this out by looking at the pointer into
+ the input data. */
+ goto do_ret;
+
+ assert (correct_prefix == 0
+ || (prefixes & correct_prefix) != 0);
+ prefixes ^= correct_prefix;
+
+ if (0)
+ {
+ /* Resize the buffer. */
+ char *oldbuf;
+ enomem:
+ oldbuf = buf;
+ if (buf == initbuf)
+ buf = malloc (2 * bufsize);
+ else
+ buf = realloc (buf, 2 * bufsize);
+ if (buf == NULL)
+ {
+ buf = oldbuf;
+ retval = ENOMEM;
+ goto do_ret;
+ }
+ bufsize *= 2;
+
+ output_data.bufp = buf;
+ output_data.bufsize = bufsize;
+ bufcnt = 0;
+
+ if (data == end)
+ {
+ assert (prefixes != 0);
+ goto print_prefix;
+ }
+
+ /* gcc is not clever enough to see the following variables
+ are not used uninitialized. */
+ asm (""
+ : "=mr" (opoff), "=mr" (correct_prefix), "=mr" (codep),
+ "=mr" (next_curr), "=mr" (len));
+ }
+
+ size_t prefix_size = 0;
+
+ // XXXonly print as prefix if valid?
+ if ((prefixes & has_lock) != 0)
+ {
+ ADD_STRING ("lock ");
+ prefix_size += 5;
+ }
+
+ if (instrtab[cnt].rep)
+ {
+ if ((prefixes & has_rep) != 0)
+ {
+ ADD_STRING ("rep ");
+ prefix_size += 4;
+ }
+ }
+ else if (instrtab[cnt].repe
+ && (prefixes & (has_rep | has_repne)) != 0)
+ {
+ if ((prefixes & has_repne) != 0)
+ {
+ ADD_STRING ("repne ");
+ prefix_size += 6;
+ }
+ else if ((prefixes & has_rep) != 0)
+ {
+ ADD_STRING ("repe ");
+ prefix_size += 5;
+ }
+ }
+ else if ((prefixes & (has_rep | has_repne)) != 0)
+ {
+ uint_fast8_t byte;
+ print_prefix:
+ bufcnt = 0;
+ byte = *begin;
+ /* This is a prefix byte. Print it. */
+ switch (byte)
+ {
+ case prefix_rep:
+ ADD_STRING ("rep");
+ break;
+ case prefix_repne:
+ ADD_STRING ("repne");
+ break;
+ case prefix_cs:
+ ADD_STRING ("cs");
+ break;
+ case prefix_ds:
+ ADD_STRING ("ds");
+ break;
+ case prefix_es:
+ ADD_STRING ("es");
+ break;
+ case prefix_fs:
+ ADD_STRING ("fs");
+ break;
+ case prefix_gs:
+ ADD_STRING ("gs");
+ break;
+ case prefix_ss:
+ ADD_STRING ("ss");
+ break;
+ case prefix_data16:
+ ADD_STRING ("data16");
+ break;
+ case prefix_addr16:
+ ADD_STRING ("addr16");
+ break;
+ case prefix_lock:
+ ADD_STRING ("lock");
+ break;
+#ifdef X86_64
+ case 0x40 ... 0x4f:
+ ADD_STRING ("rex");
+ if (byte != 0x40)
+ {
+ ADD_CHAR ('.');
+ if (byte & 0x8)
+ ADD_CHAR ('w');
+ if (byte & 0x4)
+ ADD_CHAR ('r');
+ if (byte & 0x3)
+ ADD_CHAR ('x');
+ if (byte & 0x1)
+ ADD_CHAR ('b');
+ }
+ break;
+#endif
+ default:
+ /* Cannot happen. */
+ puts ("unknown prefix");
+ abort ();
+ }
+ data = begin + 1;
+ ++addr;
+
+ goto out;
+ }
+
+ /* We have a match. First determine how many bytes are
+ needed for the adressing mode. */
+ param_start = codep;
+ if (instrtab[cnt].modrm)
+ {
+ uint_fast8_t modrm = codep[-1];
+
+#ifndef X86_64
+ if (likely ((prefixes & has_addr16) != 0))
+ {
+ /* Account for displacement. */
+ if ((modrm & 0xc7) == 6 || (modrm & 0xc0) == 0x80)
+ param_start += 2;
+ else if ((modrm & 0xc0) == 0x40)
+ param_start += 1;
+ }
+ else
+#endif
+ {
+ /* Account for SIB. */
+ if ((modrm & 0xc0) != 0xc0 && (modrm & 0x7) == 0x4)
+ param_start += 1;
+
+ /* Account for displacement. */
+ if ((modrm & 0xc7) == 5 || (modrm & 0xc0) == 0x80
+ || ((modrm & 0xc7) == 0x4 && (codep[0] & 0x7) == 0x5))
+ param_start += 4;
+ else if ((modrm & 0xc0) == 0x40)
+ param_start += 1;
+ }
+
+ if (unlikely (param_start > end))
+ goto not;
+ }
+
+ output_data.addr = addr + (data - begin);
+ output_data.data = data;
+
+ unsigned long string_end_idx = 0;
+ fmt = save_fmt;
+ while (*fmt != '\0')
+ {
+ if (*fmt != '%')
+ {
+ char ch = *fmt++;
+ if (ch == '\\')
+ {
+ switch ((ch = *fmt++))
+ {
+ case '0' ... '7':
+ {
+ int val = ch - '0';
+ ch = *fmt;
+ if (ch >= '0' && ch <= '7')
+ {
+ val *= 8;
+ val += ch - '0';
+ ch = *++fmt;
+ if (ch >= '0' && ch <= '7' && val < 32)
+ {
+ val *= 8;
+ val += ch - '0';
+ ++fmt;
+ }
+ }
+ ch = val;
+ }
+ break;
+
+ case 'n':
+ ch = '\n';
+ break;
+
+ case 't':
+ ch = '\t';
+ break;
+
+ default:
+ retval = EINVAL;
+ goto do_ret;
+ }
+ }
+ ADD_CHAR (ch);
+ continue;
+ }
+ ++fmt;
+
+ int width = 0;
+ while (isdigit (*fmt))
+ width = width * 10 + (*fmt++ - '0');
+
+ int prec = 0;
+ if (*fmt == '.')
+ while (isdigit (*++fmt))
+ prec = prec * 10 + (*fmt - '0');
+
+ size_t start_idx = bufcnt;
+ switch (*fmt++)
+ {
+ char mnebuf[16];
+ const char *str;
+
+ case 'm':
+ /* Mnemonic. */
+
+ if (unlikely (instrtab[cnt].mnemonic == MNE_INVALID))
+ {
+ switch (*data)
+ {
+#ifdef X86_64
+ case 0x90:
+ if (prefixes & has_rex_b)
+ goto not;
+ str = "nop";
+ break;
+#endif
+
+ case 0x98:
+#ifdef X86_64
+ if (prefixes == (has_rex_w | has_rex))
+ {
+ str = "cltq";
+ break;
+ }
+#endif
+ if (prefixes & ~has_data16)
+ goto print_prefix;
+ str = prefixes & has_data16 ? "cbtw" : "cwtl";
+ break;
+
+ case 0x99:
+#ifdef X86_64
+ if (prefixes == (has_rex_w | has_rex))
+ {
+ str = "cqto";
+ break;
+ }
+#endif
+ if (prefixes & ~has_data16)
+ goto print_prefix;
+ str = prefixes & has_data16 ? "cwtd" : "cltd";
+ break;
+
+ case 0xe3:
+ if (prefixes & ~has_addr16)
+ goto print_prefix;
+#ifdef X86_64
+ str = prefixes & has_addr16 ? "jecxz" : "jrcxz";
+#else
+ str = prefixes & has_addr16 ? "jcxz" : "jecxz";
+#endif
+ break;
+
+ case 0x0f:
+ if (data[1] == 0x0f)
+ {
+ /* AMD 3DNOW. We need one more byte. */
+ if (param_start >= end)
+ goto not;
+ if (*param_start < AMD3DNOW_LOW_IDX
+ || *param_start > AMD3DNOW_HIGH_IDX)
+ goto not;
+ unsigned int idx
+ = amd3dnow[AMD3DNOW_IDX (*param_start)];
+ if (idx == 0)
+ goto not;
+ str = amd3dnowstr + idx - 1;
+ /* Eat the immediate byte indicating the
+ operation. */
+ ++param_start;
+ break;
+ }
+#ifdef X86_64
+ if (data[1] == 0xc7)
+ {
+ str = ((prefixes & has_rex_w)
+ ? "cmpxchg16b" : "cmpxchg8b");
+ break;
+ }
+#endif
+ if (data[1] == 0xc2)
+ {
+ if (param_start >= end)
+ goto not;
+ if (*param_start > 7)
+ goto not;
+ static const char cmpops[][9] =
+ {
+ [0] = "cmpeq",
+ [1] = "cmplt",
+ [2] = "cmple",
+ [3] = "cmpunord",
+ [4] = "cmpneq",
+ [5] = "cmpnlt",
+ [6] = "cmpnle",
+ [7] = "cmpord"
+ };
+ char *cp = stpcpy (mnebuf, cmpops[*param_start]);
+ if (correct_prefix & (has_rep | has_repne))
+ *cp++ = 's';
+ else
+ *cp++ = 'p';
+ if (correct_prefix & (has_data16 | has_repne))
+ *cp++ = 'd';
+ else
+ *cp++ = 's';
+ *cp = '\0';
+ str = mnebuf;
+ /* Eat the immediate byte indicating the
+ operation. */
+ ++param_start;
+ break;
+ }
+
+ default:
+ assert (! "INVALID not handled");
+ }
+ }
+ else
+ str = mnestr.str + mneidx[instrtab[cnt].mnemonic];
+
+ ADD_STRING (str);
+
+ switch (instrtab[cnt].suffix)
+ {
+ case suffix_none:
+ break;
+
+ case suffix_w:
+ if ((codep[-1] & 0xc0) != 0xc0)
+ {
+ char ch;
+
+ if (data[0] & 1)
+ {
+ if (prefixes & has_data16)
+ ch = 'w';
+#ifdef X86_64
+ else if (prefixes & has_rex_w)
+ ch = 'q';
+#endif
+ else
+ ch = 'l';
+ }
+ else
+ ch = 'b';
+
+ ADD_CHAR (ch);
+ }
+ break;
+
+ case suffix_w0:
+ if ((codep[-1] & 0xc0) != 0xc0)
+ ADD_CHAR ('l');
+ break;
+
+ case suffix_w1:
+ if ((data[0] & 0x4) == 0)
+ ADD_CHAR ('l');
+ break;
+
+ case suffix_W:
+ if (prefixes & has_data16)
+ {
+ ADD_CHAR ('w');
+ prefixes &= ~has_data16;
+ }
+#ifdef X86_64
+ else
+ ADD_CHAR ('q');
+#endif
+ break;
+
+ case suffix_W1:
+ if (prefixes & has_data16)
+ {
+ ADD_CHAR ('w');
+ prefixes &= ~has_data16;
+ }
+#ifdef X86_64
+ else if (prefixes & has_rex_w)
+ ADD_CHAR ('q');
+#endif
+ break;
+
+ case suffix_tttn:;
+ static const char tttn[16][3] =
+ {
+ "o", "no", "b", "ae", "e", "ne", "be", "a",
+ "s", "ns", "p", "np", "l", "ge", "le", "g"
+ };
+ ADD_STRING (tttn[codep[-1 - instrtab[cnt].modrm] & 0x0f]);
+ break;
+
+ case suffix_D:
+ if ((codep[-1] & 0xc0) != 0xc0)
+ ADD_CHAR ((data[0] & 0x04) == 0 ? 's' : 'l');
+ break;
+
+ default:
+ printf("unknown suffix %d\n", instrtab[cnt].suffix);
+ abort ();
+ }
+
+ string_end_idx = bufcnt;
+ break;
+
+ case 'o':
+ if (prec == 1 && instrtab[cnt].fct1 != 0)
+ {
+ /* First parameter. */
+ if (instrtab[cnt].str1 != 0)
+ ADD_STRING (op1_str
+ + op1_str_idx[instrtab[cnt].str1 - 1]);
+
+ output_data.opoff1 = (instrtab[cnt].off1_1
+ + OFF1_1_BIAS - opoff);
+ output_data.opoff2 = (instrtab[cnt].off1_2
+ + OFF1_2_BIAS - opoff);
+ output_data.opoff3 = (instrtab[cnt].off1_3
+ + OFF1_3_BIAS - opoff);
+ int r = op1_fct[instrtab[cnt].fct1] (&output_data);
+ if (r < 0)
+ goto not;
+ if (r > 0)
+ goto enomem;
+
+ string_end_idx = bufcnt;
+ }
+ else if (prec == 2 && instrtab[cnt].fct2 != 0)
+ {
+ /* Second parameter. */
+ if (instrtab[cnt].str2 != 0)
+ ADD_STRING (op2_str
+ + op2_str_idx[instrtab[cnt].str2 - 1]);
+
+ output_data.opoff1 = (instrtab[cnt].off2_1
+ + OFF2_1_BIAS - opoff);
+ output_data.opoff2 = (instrtab[cnt].off2_2
+ + OFF2_2_BIAS - opoff);
+ output_data.opoff3 = (instrtab[cnt].off2_3
+ + OFF2_3_BIAS - opoff);
+ int r = op2_fct[instrtab[cnt].fct2] (&output_data);
+ if (r < 0)
+ goto not;
+ if (r > 0)
+ goto enomem;
+
+ string_end_idx = bufcnt;
+ }
+ else if (prec == 3 && instrtab[cnt].fct3 != 0)
+ {
+ /* Third parameter. */
+ if (instrtab[cnt].str3 != 0)
+ ADD_STRING (op3_str
+ + op3_str_idx[instrtab[cnt].str3 - 1]);
+
+ output_data.opoff1 = (instrtab[cnt].off3_1
+ + OFF3_1_BIAS - opoff);
+ output_data.opoff2 = (instrtab[cnt].off3_2
+ + OFF3_2_BIAS - opoff);
+#ifdef OFF3_3_BITS
+ output_data.opoff3 = (instrtab[cnt].off3_3
+ + OFF3_3_BIAS - opoff);
+#else
+ output_data.opoff3 = 0;
+#endif
+ int r = op3_fct[instrtab[cnt].fct3] (&output_data);
+ if (r < 0)
+ goto not;
+ if (r > 0)
+ goto enomem;
+
+ string_end_idx = bufcnt;
+ }
+ else
+ bufcnt = string_end_idx;
+ break;
+
+ case 'e':
+ string_end_idx = bufcnt;
+ break;
+
+ case 'a':
+ /* Pad to requested column. */
+ while (bufcnt < (size_t) width)
+ ADD_CHAR (' ');
+ width = 0;
+ break;
+
+ case 'l':
+ if (output_data.labelbuf != NULL
+ && output_data.labelbuf[0] != '\0')
+ {
+ ADD_STRING (output_data.labelbuf);
+ output_data.labelbuf[0] = '\0';
+ string_end_idx = bufcnt;
+ }
+ else if (output_data.symaddr_use != addr_none)
+ {
+ GElf_Addr symaddr = output_data.symaddr;
+ if (output_data.symaddr_use >= addr_rel_symbolic)
+ symaddr += addr + param_start - begin;
+
+ // XXX Lookup symbol based on symaddr
+ const char *symstr = NULL;
+ if (symcb != NULL
+ && symcb (0 /* XXX */, 0 /* XXX */, symaddr,
+ &output_data.labelbuf,
+ &output_data.labelbufsize, symcbarg) == 0)
+ symstr = output_data.labelbuf;
+
+ size_t bufavail = bufsize - bufcnt;
+ int r = 0;
+ if (symstr != NULL)
+ r = snprintf (&buf[bufcnt], bufavail, "# <%s>",
+ symstr);
+ else if (output_data.symaddr_use == addr_abs_always
+ || output_data.symaddr_use == addr_rel_always)
+ r = snprintf (&buf[bufcnt], bufavail, "# %#" PRIx64,
+ (uint64_t) symaddr);
+
+ assert (r >= 0);
+ if ((size_t) r >= bufavail)
+ goto enomem;
+ bufcnt += r;
+ string_end_idx = bufcnt;
+
+ output_data.symaddr_use = addr_none;
+ }
+ break;
+ }
+
+ /* Pad according to the specified width. */
+ while (bufcnt + prefix_size < start_idx + width)
+ ADD_CHAR (' ');
+ prefix_size = 0;
+ }
+
+ if ((prefixes & SEGMENT_PREFIXES) != 0)
+ goto print_prefix;
+
+ assert (string_end_idx != ~0ul);
+ bufcnt = string_end_idx;
+
+ addr += param_start - begin;
+ data = param_start;
+
+ goto out;
+ }
+
+ /* Invalid (or at least unhandled) opcode. */
+ if (prefixes != 0)
+ goto print_prefix;
+ assert (*startp == data);
+ ++data;
+ ADD_STRING ("(bad)");
+ addr += data - begin;
+
+ out:
+ if (bufcnt == bufsize)
+ goto enomem;
+ buf[bufcnt] = '\0';
+
+ *startp = data;
+ retval = outcb (buf, bufcnt, outcbarg);
+ if (retval != 0)
+ goto do_ret;
+ }
+
+ do_ret:
+ free (output_data.labelbuf);
+ if (buf != initbuf)
+ free (buf);
+
+ return retval;
+}
diff --git a/libcpu/i386_gendis.c b/libcpu/i386_gendis.c
new file mode 100644
index 00000000..a8570f19
--- /dev/null
+++ b/libcpu/i386_gendis.c
@@ -0,0 +1,69 @@
+/* Generate tables for x86 disassembler.
+ Copyright (C) 2007, 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2007.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <error.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+extern int i386_parse (void);
+
+
+extern FILE *i386_in;
+extern int i386_debug;
+char *infname;
+
+FILE *outfile;
+
+int
+main (int argc, char *argv[argc])
+{
+ outfile = stdout;
+
+ if (argc == 1)
+ error (EXIT_FAILURE, 0, "usage: %s <MNEDEFFILE>", argv[0]);
+
+ //i386_debug = 1;
+ infname = argv[1];
+ if (strcmp (infname, "-") == 0)
+ i386_in = stdin;
+ else
+ {
+ i386_in = fopen (infname, "r");
+ if (i386_in == NULL)
+ error (EXIT_FAILURE, errno, "cannot open %s", argv[1]);
+ }
+
+ i386_parse ();
+
+ return error_message_count != 0;
+}
diff --git a/libcpu/i386_lex.l b/libcpu/i386_lex.l
new file mode 100644
index 00000000..828c5589
--- /dev/null
+++ b/libcpu/i386_lex.l
@@ -0,0 +1,126 @@
+%{
+/* Copyright (C) 2004, 2005, 2007, 2008 Red Hat, Inc.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2004.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <error.h>
+#include <libintl.h>
+
+#include <system.h>
+#include "i386_parse.h"
+
+
+static void eat_to_eol (void);
+static void invalid_char (int ch);
+%}
+
+ID [a-zA-Z_][a-zA-Z0-9_/]*
+ID2 [a-zA-Z0-9_:/]*
+NUMBER [0-9]+
+WHITE [[:space:]]+
+
+%option yylineno
+%option never-interactive
+%option noyywrap
+
+
+%x MAIN
+
+%%
+
+"%mask" { return kMASK; }
+
+"%prefix" { return kPREFIX; }
+"%suffix" { return kSUFFIX; }
+
+"%synonym" { return kSYNONYM; }
+
+{NUMBER} { i386_lval.num = strtoul (yytext, NULL, 10);
+ return kNUMBER; }
+
+"%%" { BEGIN (MAIN); return kPERCPERC; }
+
+
+<MAIN>"0" { return '0'; }
+<MAIN>"1" { return '1'; }
+
+<INITIAL,MAIN>"{"{ID2}"}" { i386_lval.str = xstrndup (yytext + 1,
+ yyleng - 2);
+ return kBITFIELD; }
+
+<MAIN>"INVALID" { i386_lval.str = (void *) -1l;
+ return kID; }
+
+<MAIN>{ID} { i386_lval.str = xstrndup (yytext, yyleng);
+ return kID; }
+
+<MAIN>"," { return ','; }
+
+<MAIN>":" { return ':'; }
+
+<INITIAL,MAIN>^"\n" { /* IGNORE */ }
+
+<INITIAL,MAIN>"\n" { return '\n'; }
+
+<INITIAL,MAIN>^"#" { eat_to_eol (); }
+
+{WHITE} { /* IGNORE */ }
+
+<MAIN>{WHITE} { return kSPACE; }
+
+<MAIN>. { i386_lval.ch = *yytext; return kCHAR; }
+
+. { invalid_char (*yytext); }
+
+
+%%
+
+static void
+eat_to_eol (void)
+{
+ while (1)
+ {
+ int c = input ();
+
+ if (c == EOF || c == '\n')
+ break;
+ }
+}
+
+static void
+invalid_char (int ch)
+{
+ error (0, 0, (isascii (ch)
+ ? gettext ("invalid character '%c' at line %d; ignored")
+ : gettext ("invalid character '\\%o' at line %d; ignored")),
+ ch, yylineno);
+}
+
+// Local Variables:
+// mode: C
+// End:
diff --git a/libcpu/i386_parse.y b/libcpu/i386_parse.y
new file mode 100644
index 00000000..bea0e335
--- /dev/null
+++ b/libcpu/i386_parse.y
@@ -0,0 +1,1684 @@
+%{
+/* Parser for i386 CPU description.
+ Copyright (C) 2004, 2005, 2007, 2008, 2009 Red Hat, Inc.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2004.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <error.h>
+#include <inttypes.h>
+#include <libintl.h>
+#include <math.h>
+#include <obstack.h>
+#include <search.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/param.h>
+
+#include <system.h>
+
+#define obstack_chunk_alloc xmalloc
+#define obstack_chunk_free free
+
+/* The error handler. */
+static void yyerror (const char *s);
+
+extern int yylex (void);
+extern int i386_lineno;
+extern char *infname;
+
+
+struct known_bitfield
+{
+ char *name;
+ unsigned long int bits;
+ int tmp;
+};
+
+
+struct bitvalue
+{
+ enum bittype { zeroone, field, failure } type;
+ union
+ {
+ unsigned int value;
+ struct known_bitfield *field;
+ };
+ struct bitvalue *next;
+};
+
+
+struct argname
+{
+ enum nametype { string, nfield } type;
+ union
+ {
+ char *str;
+ struct known_bitfield *field;
+ };
+ struct argname *next;
+};
+
+
+struct argument
+{
+ struct argname *name;
+ struct argument *next;
+};
+
+
+struct instruction
+{
+ /* The byte encoding. */
+ struct bitvalue *bytes;
+
+ /* Prefix possible. */
+ int repe;
+ int rep;
+
+ /* Mnemonic. */
+ char *mnemonic;
+
+ /* Suffix. */
+ enum { suffix_none = 0, suffix_w, suffix_w0, suffix_W, suffix_tttn,
+ suffix_w1, suffix_W1, suffix_D } suffix;
+
+ /* Flag set if modr/m is used. */
+ int modrm;
+
+ /* Operands. */
+ struct operand
+ {
+ char *fct;
+ char *str;
+ int off1;
+ int off2;
+ int off3;
+ } operands[3];
+
+ struct instruction *next;
+};
+
+
+struct synonym
+{
+ char *from;
+ char *to;
+};
+
+
+struct suffix
+{
+ char *name;
+ int idx;
+};
+
+
+struct argstring
+{
+ char *str;
+ int idx;
+ int off;
+};
+
+
+static struct known_bitfield ax_reg =
+ {
+ .name = "ax", .bits = 0, .tmp = 0
+ };
+
+static struct known_bitfield dx_reg =
+ {
+ .name = "dx", .bits = 0, .tmp = 0
+ };
+
+static struct known_bitfield di_reg =
+ {
+ .name = "es_di", .bits = 0, .tmp = 0
+ };
+
+static struct known_bitfield si_reg =
+ {
+ .name = "ds_si", .bits = 0, .tmp = 0
+ };
+
+static struct known_bitfield bx_reg =
+ {
+ .name = "ds_bx", .bits = 0, .tmp = 0
+ };
+
+
+static int bitfield_compare (const void *p1, const void *p2);
+static void new_bitfield (char *name, unsigned long int num);
+static void check_bits (struct bitvalue *value);
+static int check_duplicates (struct bitvalue *val);
+static int check_argsdef (struct bitvalue *bitval, struct argument *args);
+static int check_bitsused (struct bitvalue *bitval,
+ struct known_bitfield *suffix,
+ struct argument *args);
+static struct argname *combine (struct argname *name);
+static void fillin_arg (struct bitvalue *bytes, struct argname *name,
+ struct instruction *instr, int n);
+static void find_numbers (void);
+static int compare_syn (const void *p1, const void *p2);
+static int compare_suf (const void *p1, const void *p2);
+static void instrtable_out (void);
+#if 0
+static void create_mnemonic_table (void);
+#endif
+
+static void *bitfields;
+static struct instruction *instructions;
+static size_t ninstructions;
+static void *synonyms;
+static void *suffixes;
+static int nsuffixes;
+static void *mnemonics;
+size_t nmnemonics;
+extern FILE *outfile;
+
+/* Number of bits used mnemonics. */
+#if 0
+static size_t best_mnemonic_bits;
+#endif
+%}
+
+%union {
+ unsigned long int num;
+ char *str;
+ char ch;
+ struct known_bitfield *field;
+ struct bitvalue *bit;
+ struct argname *name;
+ struct argument *arg;
+}
+
+%token kMASK
+%token kPREFIX
+%token kSUFFIX
+%token kSYNONYM
+%token <str> kID
+%token <num> kNUMBER
+%token kPERCPERC
+%token <str> kBITFIELD
+%token <ch> kCHAR
+%token kSPACE
+
+%type <bit> bit byte bytes
+%type <field> bitfieldopt
+%type <name> argcomp arg
+%type <arg> args optargs
+
+%defines
+
+%%
+
+spec: masks kPERCPERC '\n' instrs
+ {
+ if (error_message_count != 0)
+ error (EXIT_FAILURE, 0,
+ "terminated due to previous error");
+
+ instrtable_out ();
+ }
+ ;
+
+masks: masks '\n' mask
+ | mask
+ ;
+
+mask: kMASK kBITFIELD kNUMBER
+ { new_bitfield ($2, $3); }
+ | kPREFIX kBITFIELD
+ { new_bitfield ($2, -1); }
+ | kSUFFIX kBITFIELD
+ { new_bitfield ($2, -2); }
+ | kSYNONYM kBITFIELD kBITFIELD
+ {
+ struct synonym *newp = xmalloc (sizeof (*newp));
+ newp->from = $2;
+ newp->to = $3;
+ if (tfind (newp, &synonyms, compare_syn) != NULL)
+ error (0, 0,
+ "%d: duplicate definition for synonym '%s'",
+ i386_lineno, $2);
+ else if (tsearch ( newp, &synonyms, compare_syn) == NULL)
+ error (EXIT_FAILURE, 0, "tsearch");
+ }
+ |
+ ;
+
+instrs: instrs '\n' instr
+ | instr
+ ;
+
+instr: bytes ':' bitfieldopt kID bitfieldopt optargs
+ {
+ if ($3 != NULL && strcmp ($3->name, "RE") != 0
+ && strcmp ($3->name, "R") != 0)
+ {
+ error (0, 0, "%d: only 'R' and 'RE' prefix allowed",
+ i386_lineno - 1);
+ }
+ if (check_duplicates ($1) == 0
+ && check_argsdef ($1, $6) == 0
+ && check_bitsused ($1, $5, $6) == 0)
+ {
+ struct instruction *newp = xcalloc (sizeof (*newp),
+ 1);
+ if ($3 != NULL)
+ {
+ if (strcmp ($3->name, "RE") == 0)
+ newp->repe = 1;
+ else if (strcmp ($3->name, "R") == 0)
+ newp->rep = 1;
+ }
+
+ newp->bytes = $1;
+ newp->mnemonic = $4;
+ if (newp->mnemonic != (void *) -1l
+ && tfind ($4, &mnemonics,
+ (comparison_fn_t) strcmp) == NULL)
+ {
+ if (tsearch ($4, &mnemonics,
+ (comparison_fn_t) strcmp) == NULL)
+ error (EXIT_FAILURE, errno, "tsearch");
+ ++nmnemonics;
+ }
+
+ if ($5 != NULL)
+ {
+ if (strcmp ($5->name, "w") == 0)
+ newp->suffix = suffix_w;
+ else if (strcmp ($5->name, "w0") == 0)
+ newp->suffix = suffix_w0;
+ else if (strcmp ($5->name, "tttn") == 0)
+ newp->suffix = suffix_tttn;
+ else if (strcmp ($5->name, "w1") == 0)
+ newp->suffix = suffix_w1;
+ else if (strcmp ($5->name, "W") == 0)
+ newp->suffix = suffix_W;
+ else if (strcmp ($5->name, "W1") == 0)
+ newp->suffix = suffix_W1;
+ else if (strcmp ($5->name, "D") == 0)
+ newp->suffix = suffix_D;
+ else
+ error (EXIT_FAILURE, 0,
+ "%s: %d: unknown suffix '%s'",
+ infname, i386_lineno - 1, $5->name);
+
+ struct suffix search = { .name = $5->name };
+ if (tfind (&search, &suffixes, compare_suf)
+ == NULL)
+ {
+ struct suffix *ns = xmalloc (sizeof (*ns));
+ ns->name = $5->name;
+ ns->idx = ++nsuffixes;
+ if (tsearch (ns, &suffixes, compare_suf)
+ == NULL)
+ error (EXIT_FAILURE, errno, "tsearch");
+ }
+ }
+
+ struct argument *args = $6;
+ int n = 0;
+ while (args != NULL)
+ {
+ fillin_arg ($1, args->name, newp, n);
+
+ args = args->next;
+ ++n;
+ }
+
+ newp->next = instructions;
+ instructions = newp;
+ ++ninstructions;
+ }
+ }
+ |
+ ;
+
+bitfieldopt: kBITFIELD
+ {
+ struct known_bitfield search;
+ search.name = $1;
+ struct known_bitfield **res;
+ res = tfind (&search, &bitfields, bitfield_compare);
+ if (res == NULL)
+ {
+ error (0, 0, "%d: unknown bitfield '%s'",
+ i386_lineno, search.name);
+ $$ = NULL;
+ }
+ else
+ $$ = *res;
+ }
+ |
+ { $$ = NULL; }
+ ;
+
+bytes: bytes ',' byte
+ {
+ check_bits ($3);
+
+ struct bitvalue *runp = $1;
+ while (runp->next != NULL)
+ runp = runp->next;
+ runp->next = $3;
+ $$ = $1;
+ }
+ | byte
+ {
+ check_bits ($1);
+ $$ = $1;
+ }
+ ;
+
+byte: byte bit
+ {
+ struct bitvalue *runp = $1;
+ while (runp->next != NULL)
+ runp = runp->next;
+ runp->next = $2;
+ $$ = $1;
+ }
+ | bit
+ { $$ = $1; }
+ ;
+
+bit: '0'
+ {
+ $$ = xmalloc (sizeof (struct bitvalue));
+ $$->type = zeroone;
+ $$->value = 0;
+ $$->next = NULL;
+ }
+ | '1'
+ {
+ $$ = xmalloc (sizeof (struct bitvalue));
+ $$->type = zeroone;
+ $$->value = 1;
+ $$->next = NULL;
+ }
+ | kBITFIELD
+ {
+ $$ = xmalloc (sizeof (struct bitvalue));
+ struct known_bitfield search;
+ search.name = $1;
+ struct known_bitfield **res;
+ res = tfind (&search, &bitfields, bitfield_compare);
+ if (res == NULL)
+ {
+ error (0, 0, "%d: unknown bitfield '%s'",
+ i386_lineno, search.name);
+ $$->type = failure;
+ }
+ else
+ {
+ $$->type = field;
+ $$->field = *res;
+ }
+ $$->next = NULL;
+ }
+ ;
+
+optargs: kSPACE args
+ { $$ = $2; }
+ |
+ { $$ = NULL; }
+ ;
+
+args: args ',' arg
+ {
+ struct argument *runp = $1;
+ while (runp->next != NULL)
+ runp = runp->next;
+ runp->next = xmalloc (sizeof (struct argument));
+ runp->next->name = combine ($3);
+ runp->next->next = NULL;
+ $$ = $1;
+ }
+ | arg
+ {
+ $$ = xmalloc (sizeof (struct argument));
+ $$->name = combine ($1);
+ $$->next = NULL;
+ }
+ ;
+
+arg: arg argcomp
+ {
+ struct argname *runp = $1;
+ while (runp->next != NULL)
+ runp = runp->next;
+ runp->next = $2;
+ $$ = $1;
+ }
+ | argcomp
+ { $$ = $1; }
+ ;
+argcomp: kBITFIELD
+ {
+ $$ = xmalloc (sizeof (struct argname));
+ $$->type = nfield;
+ $$->next = NULL;
+
+ struct known_bitfield search;
+ search.name = $1;
+ struct known_bitfield **res;
+ res = tfind (&search, &bitfields, bitfield_compare);
+ if (res == NULL)
+ {
+ if (strcmp ($1, "ax") == 0)
+ $$->field = &ax_reg;
+ else if (strcmp ($1, "dx") == 0)
+ $$->field = &dx_reg;
+ else if (strcmp ($1, "es_di") == 0)
+ $$->field = &di_reg;
+ else if (strcmp ($1, "ds_si") == 0)
+ $$->field = &si_reg;
+ else if (strcmp ($1, "ds_bx") == 0)
+ $$->field = &bx_reg;
+ else
+ {
+ error (0, 0, "%d: unknown bitfield '%s'",
+ i386_lineno, search.name);
+ $$->field = NULL;
+ }
+ }
+ else
+ $$->field = *res;
+ }
+ | kCHAR
+ {
+ $$ = xmalloc (sizeof (struct argname));
+ $$->type = string;
+ $$->next = NULL;
+ $$->str = xmalloc (2);
+ $$->str[0] = $1;
+ $$->str[1] = '\0';
+ }
+ | kID
+ {
+ $$ = xmalloc (sizeof (struct argname));
+ $$->type = string;
+ $$->next = NULL;
+ $$->str = $1;
+ }
+ | ':'
+ {
+ $$ = xmalloc (sizeof (struct argname));
+ $$->type = string;
+ $$->next = NULL;
+ $$->str = xmalloc (2);
+ $$->str[0] = ':';
+ $$->str[1] = '\0';
+ }
+ ;
+
+%%
+
+static void
+yyerror (const char *s)
+{
+ error (0, 0, gettext ("while reading i386 CPU description: %s at line %d"),
+ gettext (s), i386_lineno);
+}
+
+
+static int
+bitfield_compare (const void *p1, const void *p2)
+{
+ struct known_bitfield *f1 = (struct known_bitfield *) p1;
+ struct known_bitfield *f2 = (struct known_bitfield *) p2;
+
+ return strcmp (f1->name, f2->name);
+}
+
+
+static void
+new_bitfield (char *name, unsigned long int num)
+{
+ struct known_bitfield *newp = xmalloc (sizeof (struct known_bitfield));
+ newp->name = name;
+ newp->bits = num;
+ newp->tmp = 0;
+
+ if (tfind (newp, &bitfields, bitfield_compare) != NULL)
+ {
+ error (0, 0, "%d: duplicated definition of bitfield '%s'",
+ i386_lineno, name);
+ free (name);
+ return;
+ }
+
+ if (tsearch (newp, &bitfields, bitfield_compare) == NULL)
+ error (EXIT_FAILURE, errno, "%d: cannot insert new bitfield '%s'",
+ i386_lineno, name);
+}
+
+
+/* Check that the number of bits is a multiple of 8. */
+static void
+check_bits (struct bitvalue *val)
+{
+ struct bitvalue *runp = val;
+ unsigned int total = 0;
+
+ while (runp != NULL)
+ {
+ if (runp->type == zeroone)
+ ++total;
+ else if (runp->field == NULL)
+ /* No sense doing anything, the field is not known. */
+ return;
+ else
+ total += runp->field->bits;
+
+ runp = runp->next;
+ }
+
+ if (total % 8 != 0)
+ {
+ struct obstack os;
+ obstack_init (&os);
+
+ while (val != NULL)
+ {
+ if (val->type == zeroone)
+ obstack_printf (&os, "%u", val->value);
+ else
+ obstack_printf (&os, "{%s}", val->field->name);
+ val = val->next;
+ }
+ obstack_1grow (&os, '\0');
+
+ error (0, 0, "%d: field '%s' not a multiple of 8 bits in size",
+ i386_lineno, (char *) obstack_finish (&os));
+
+ obstack_free (&os, NULL);
+ }
+}
+
+
+static int
+check_duplicates (struct bitvalue *val)
+{
+ static int testcnt;
+ ++testcnt;
+
+ int result = 0;
+ while (val != NULL)
+ {
+ if (val->type == field && val->field != NULL)
+ {
+ if (val->field->tmp == testcnt)
+ {
+ error (0, 0, "%d: bitfield '%s' used more than once",
+ i386_lineno - 1, val->field->name);
+ result = 1;
+ }
+ val->field->tmp = testcnt;
+ }
+
+ val = val->next;
+ }
+
+ return result;
+}
+
+
+static int
+check_argsdef (struct bitvalue *bitval, struct argument *args)
+{
+ int result = 0;
+
+ while (args != NULL)
+ {
+ for (struct argname *name = args->name; name != NULL; name = name->next)
+ if (name->type == nfield && name->field != NULL
+ && name->field != &ax_reg && name->field != &dx_reg
+ && name->field != &di_reg && name->field != &si_reg
+ && name->field != &bx_reg)
+ {
+ struct bitvalue *runp = bitval;
+
+ while (runp != NULL)
+ if (runp->type == field && runp->field == name->field)
+ break;
+ else
+ runp = runp->next;
+
+ if (runp == NULL)
+ {
+ error (0, 0, "%d: unknown bitfield '%s' used in output format",
+ i386_lineno - 1, name->field->name);
+ result = 1;
+ }
+ }
+
+ args = args->next;
+ }
+
+ return result;
+}
+
+
+static int
+check_bitsused (struct bitvalue *bitval, struct known_bitfield *suffix,
+ struct argument *args)
+{
+ int result = 0;
+
+ while (bitval != NULL)
+ {
+ if (bitval->type == field && bitval->field != NULL
+ && bitval->field != suffix
+ /* {w} is handled special. */
+ && strcmp (bitval->field->name, "w") != 0)
+ {
+ struct argument *runp;
+ for (runp = args; runp != NULL; runp = runp->next)
+ {
+ struct argname *name = runp->name;
+
+ while (name != NULL)
+ if (name->type == nfield && name->field == bitval->field)
+ break;
+ else
+ name = name->next;
+
+ if (name != NULL)
+ break;
+ }
+
+#if 0
+ if (runp == NULL)
+ {
+ error (0, 0, "%d: bitfield '%s' not used",
+ i386_lineno - 1, bitval->field->name);
+ result = 1;
+ }
+#endif
+ }
+
+ bitval = bitval->next;
+ }
+
+ return result;
+}
+
+
+static struct argname *
+combine (struct argname *name)
+{
+ struct argname *last_str = NULL;
+ for (struct argname *runp = name; runp != NULL; runp = runp->next)
+ {
+ if (runp->type == string)
+ {
+ if (last_str == NULL)
+ last_str = runp;
+ else
+ {
+ last_str->str = xrealloc (last_str->str,
+ strlen (last_str->str)
+ + strlen (runp->str) + 1);
+ strcat (last_str->str, runp->str);
+ last_str->next = runp->next;
+ }
+ }
+ else
+ last_str = NULL;
+ }
+ return name;
+}
+
+
+#define obstack_grow_str(ob, str) obstack_grow (ob, str, strlen (str))
+
+
+static void
+fillin_arg (struct bitvalue *bytes, struct argname *name,
+ struct instruction *instr, int n)
+{
+ static struct obstack ob;
+ static int initialized;
+ if (! initialized)
+ {
+ initialized = 1;
+ obstack_init (&ob);
+ }
+
+ struct argname *runp = name;
+ int cnt = 0;
+ while (runp != NULL)
+ {
+ /* We ignore strings in the function name. */
+ if (runp->type == string)
+ {
+ if (instr->operands[n].str != NULL)
+ error (EXIT_FAILURE, 0,
+ "%d: cannot have more than one string parameter",
+ i386_lineno - 1);
+
+ instr->operands[n].str = runp->str;
+ }
+ else
+ {
+ assert (runp->type == nfield);
+
+ /* Construct the function name. */
+ if (cnt++ > 0)
+ obstack_1grow (&ob, '$');
+
+ if (runp->field == NULL)
+ /* Add some string which contains invalid characters. */
+ obstack_grow_str (&ob, "!!!INVALID!!!");
+ else
+ {
+ char *fieldname = runp->field->name;
+
+ struct synonym search = { .from = fieldname };
+
+ struct synonym **res = tfind (&search, &synonyms, compare_syn);
+ if (res != NULL)
+ fieldname = (*res)->to;
+
+ obstack_grow_str (&ob, fieldname);
+ }
+
+ /* Now compute the bit offset of the field. */
+ struct bitvalue *b = bytes;
+ int bitoff = 0;
+ if (runp->field != NULL)
+ while (b != NULL)
+ {
+ if (b->type == field && b->field != NULL)
+ {
+ if (strcmp (b->field->name, runp->field->name) == 0)
+ break;
+ bitoff += b->field->bits;
+ }
+ else
+ ++bitoff;
+
+ b = b->next;
+ }
+ if (instr->operands[n].off1 == 0)
+ instr->operands[n].off1 = bitoff;
+ else if (instr->operands[n].off2 == 0)
+ instr->operands[n].off2 = bitoff;
+ else if (instr->operands[n].off3 == 0)
+ instr->operands[n].off3 = bitoff;
+ else
+ error (EXIT_FAILURE, 0,
+ "%d: cannot have more than three fields in parameter",
+ i386_lineno - 1);
+
+ if (runp->field != NULL
+ && strncasecmp (runp->field->name, "mod", 3) == 0)
+ instr->modrm = 1;
+ }
+
+ runp = runp->next;
+ }
+ if (obstack_object_size (&ob) == 0)
+ obstack_grow_str (&ob, "string");
+ obstack_1grow (&ob, '\0');
+ char *fct = obstack_finish (&ob);
+
+ instr->operands[n].fct = fct;
+}
+
+
+#if 0
+static void
+nameout (const void *nodep, VISIT value, int level)
+{
+ if (value == leaf || value == postorder)
+ printf (" %s\n", *(const char **) nodep);
+}
+#endif
+
+
+static int
+compare_argstring (const void *p1, const void *p2)
+{
+ const struct argstring *a1 = (const struct argstring *) p1;
+ const struct argstring *a2 = (const struct argstring *) p2;
+
+ return strcmp (a1->str, a2->str);
+}
+
+
+static int maxoff[3][3];
+static int minoff[3][3] = { { 1000, 1000, 1000 },
+ { 1000, 1000, 1000 },
+ { 1000, 1000, 1000 } };
+static int nbitoff[3][3];
+static void *fct_names[3];
+static int nbitfct[3];
+static int nbitsuf;
+static void *strs[3];
+static int nbitstr[3];
+static int total_bits = 2; // Already counted the rep/repe bits.
+
+static void
+find_numbers (void)
+{
+ int nfct_names[3] = { 0, 0, 0 };
+ int nstrs[3] = { 0, 0, 0 };
+
+ /* We reverse the order of the instruction list while processing it.
+ Later phases need it in the order in which the input file has
+ them. */
+ struct instruction *reversed = NULL;
+
+ struct instruction *runp = instructions;
+ while (runp != NULL)
+ {
+ for (int i = 0; i < 3; ++i)
+ if (runp->operands[i].fct != NULL)
+ {
+ struct argstring search = { .str = runp->operands[i].fct };
+ if (tfind (&search, &fct_names[i], compare_argstring) == NULL)
+ {
+ struct argstring *newp = xmalloc (sizeof (*newp));
+ newp->str = runp->operands[i].fct;
+ newp->idx = 0;
+ if (tsearch (newp, &fct_names[i], compare_argstring) == NULL)
+ error (EXIT_FAILURE, errno, "tsearch");
+ ++nfct_names[i];
+ }
+
+ if (runp->operands[i].str != NULL)
+ {
+ search.str = runp->operands[i].str;
+ if (tfind (&search, &strs[i], compare_argstring) == NULL)
+ {
+ struct argstring *newp = xmalloc (sizeof (*newp));
+ newp->str = runp->operands[i].str;
+ newp->idx = 0;
+ if (tsearch (newp, &strs[i], compare_argstring) == NULL)
+ error (EXIT_FAILURE, errno, "tsearch");
+ ++nstrs[i];
+ }
+ }
+
+ maxoff[i][0] = MAX (maxoff[i][0], runp->operands[i].off1);
+ maxoff[i][1] = MAX (maxoff[i][1], runp->operands[i].off2);
+ maxoff[i][2] = MAX (maxoff[i][2], runp->operands[i].off3);
+
+ if (runp->operands[i].off1 > 0)
+ minoff[i][0] = MIN (minoff[i][0], runp->operands[i].off1);
+ if (runp->operands[i].off2 > 0)
+ minoff[i][1] = MIN (minoff[i][1], runp->operands[i].off2);
+ if (runp->operands[i].off3 > 0)
+ minoff[i][2] = MIN (minoff[i][2], runp->operands[i].off3);
+ }
+
+ struct instruction *old = runp;
+ runp = runp->next;
+
+ old->next = reversed;
+ reversed = old;
+ }
+ instructions = reversed;
+
+ int d;
+ int c;
+ for (int i = 0; i < 3; ++i)
+ {
+ // printf ("min1 = %d, min2 = %d, min3 = %d\n", minoff[i][0], minoff[i][1], minoff[i][2]);
+ // printf ("max1 = %d, max2 = %d, max3 = %d\n", maxoff[i][0], maxoff[i][1], maxoff[i][2]);
+
+ if (minoff[i][0] == 1000)
+ nbitoff[i][0] = 0;
+ else
+ {
+ nbitoff[i][0] = 1;
+ d = maxoff[i][0] - minoff[i][0];
+ c = 1;
+ while (c < d)
+ {
+ ++nbitoff[i][0];
+ c *= 2;
+ }
+ total_bits += nbitoff[i][0];
+ }
+
+ if (minoff[i][1] == 1000)
+ nbitoff[i][1] = 0;
+ else
+ {
+ nbitoff[i][1] = 1;
+ d = maxoff[i][1] - minoff[i][1];
+ c = 1;
+ while (c < d)
+ {
+ ++nbitoff[i][1];
+ c *= 2;
+ }
+ total_bits += nbitoff[i][1];
+ }
+
+ if (minoff[i][2] == 1000)
+ nbitoff[i][2] = 0;
+ else
+ {
+ nbitoff[i][2] = 1;
+ d = maxoff[i][2] - minoff[i][2];
+ c = 1;
+ while (c < d)
+ {
+ ++nbitoff[i][2];
+ c *= 2;
+ }
+ total_bits += nbitoff[i][2];
+ }
+ // printf ("off1 = %d, off2 = %d, off3 = %d\n", nbitoff[i][0], nbitoff[i][1], nbitoff[i][2]);
+
+ nbitfct[i] = 1;
+ d = nfct_names[i];
+ c = 1;
+ while (c < d)
+ {
+ ++nbitfct[i];
+ c *= 2;
+ }
+ total_bits += nbitfct[i];
+ // printf ("%d fct[%d], %d bits\n", nfct_names[i], i, nbitfct[i]);
+
+ if (nstrs[i] != 0)
+ {
+ nbitstr[i] = 1;
+ d = nstrs[i];
+ c = 1;
+ while (c < d)
+ {
+ ++nbitstr[i];
+ c *= 2;
+ }
+ total_bits += nbitstr[i];
+ }
+
+ // twalk (fct_names[i], nameout);
+ }
+
+ nbitsuf = 0;
+ d = nsuffixes;
+ c = 1;
+ while (c < d)
+ {
+ ++nbitsuf;
+ c *= 2;
+ }
+ total_bits += nbitsuf;
+ // printf ("%d suffixes, %d bits\n", nsuffixes, nbitsuf);
+}
+
+
+static int
+compare_syn (const void *p1, const void *p2)
+{
+ const struct synonym *s1 = (const struct synonym *) p1;
+ const struct synonym *s2 = (const struct synonym *) p2;
+
+ return strcmp (s1->from, s2->from);
+}
+
+
+static int
+compare_suf (const void *p1, const void *p2)
+{
+ const struct suffix *s1 = (const struct suffix *) p1;
+ const struct suffix *s2 = (const struct suffix *) p2;
+
+ return strcmp (s1->name, s2->name);
+}
+
+
+static int count_op_str;
+static int off_op_str;
+static void
+print_op_str (const void *nodep, VISIT value,
+ int level __attribute__ ((unused)))
+{
+ if (value == leaf || value == postorder)
+ {
+ const char *str = (*(struct argstring **) nodep)->str;
+ fprintf (outfile, "%s\n \"%s",
+ count_op_str == 0 ? "" : "\\0\"", str);
+ (*(struct argstring **) nodep)->idx = ++count_op_str;
+ (*(struct argstring **) nodep)->off = off_op_str;
+ off_op_str += strlen (str) + 1;
+ }
+}
+
+
+static void
+print_op_str_idx (const void *nodep, VISIT value,
+ int level __attribute__ ((unused)))
+{
+ if (value == leaf || value == postorder)
+ printf (" %d,\n", (*(struct argstring **) nodep)->off);
+}
+
+
+static void
+print_op_fct (const void *nodep, VISIT value,
+ int level __attribute__ ((unused)))
+{
+ if (value == leaf || value == postorder)
+ {
+ fprintf (outfile, " FCT_%s,\n", (*(struct argstring **) nodep)->str);
+ (*(struct argstring **) nodep)->idx = ++count_op_str;
+ }
+}
+
+
+#if NMNES < 2
+# error "bogus NMNES value"
+#endif
+
+static void
+instrtable_out (void)
+{
+ find_numbers ();
+
+#if 0
+ create_mnemonic_table ();
+
+ fprintf (outfile, "#define MNEMONIC_BITS %zu\n", best_mnemonic_bits);
+#else
+ fprintf (outfile, "#define MNEMONIC_BITS %ld\n",
+ lrint (ceil (log2 (NMNES))));
+#endif
+ fprintf (outfile, "#define SUFFIX_BITS %d\n", nbitsuf);
+ for (int i = 0; i < 3; ++i)
+ {
+ fprintf (outfile, "#define FCT%d_BITS %d\n", i + 1, nbitfct[i]);
+ if (nbitstr[i] != 0)
+ fprintf (outfile, "#define STR%d_BITS %d\n", i + 1, nbitstr[i]);
+ fprintf (outfile, "#define OFF%d_1_BITS %d\n", i + 1, nbitoff[i][0]);
+ fprintf (outfile, "#define OFF%d_1_BIAS %d\n", i + 1, minoff[i][0]);
+ if (nbitoff[i][1] != 0)
+ {
+ fprintf (outfile, "#define OFF%d_2_BITS %d\n", i + 1, nbitoff[i][1]);
+ fprintf (outfile, "#define OFF%d_2_BIAS %d\n", i + 1, minoff[i][1]);
+ }
+ if (nbitoff[i][2] != 0)
+ {
+ fprintf (outfile, "#define OFF%d_3_BITS %d\n", i + 1, nbitoff[i][2]);
+ fprintf (outfile, "#define OFF%d_3_BIAS %d\n", i + 1, minoff[i][2]);
+ }
+ }
+
+ fputs ("\n#include <i386_data.h>\n\n", outfile);
+
+
+#define APPEND(a, b) APPEND_ (a, b)
+#define APPEND_(a, b) a##b
+#define EMIT_SUFFIX(suf) \
+ fprintf (outfile, "#define suffix_%s %d\n", #suf, APPEND (suffix_, suf))
+ EMIT_SUFFIX (none);
+ EMIT_SUFFIX (w);
+ EMIT_SUFFIX (w0);
+ EMIT_SUFFIX (W);
+ EMIT_SUFFIX (tttn);
+ EMIT_SUFFIX (D);
+ EMIT_SUFFIX (w1);
+ EMIT_SUFFIX (W1);
+
+ fputc_unlocked ('\n', outfile);
+
+ for (int i = 0; i < 3; ++i)
+ {
+ /* Functions. */
+ count_op_str = 0;
+ fprintf (outfile, "static const opfct_t op%d_fct[] =\n{\n NULL,\n",
+ i + 1);
+ twalk (fct_names[i], print_op_fct);
+ fputs ("};\n", outfile);
+
+ /* The operand strings. */
+ if (nbitstr[i] != 0)
+ {
+ count_op_str = 0;
+ off_op_str = 0;
+ fprintf (outfile, "static const char op%d_str[] =", i + 1);
+ twalk (strs[i], print_op_str);
+ fputs ("\";\n", outfile);
+
+ fprintf (outfile, "static const uint8_t op%d_str_idx[] = {\n",
+ i + 1);
+ twalk (strs[i], print_op_str_idx);
+ fputs ("};\n", outfile);
+ }
+ }
+
+
+ fputs ("static const struct instr_enc instrtab[] =\n{\n", outfile);
+ struct instruction *instr;
+ for (instr = instructions; instr != NULL; instr = instr->next)
+ {
+ fputs (" {", outfile);
+ if (instr->mnemonic == (void *) -1l)
+ fputs (" .mnemonic = MNE_INVALID,", outfile);
+ else
+ fprintf (outfile, " .mnemonic = MNE_%s,", instr->mnemonic);
+ fprintf (outfile, " .rep = %d,", instr->rep);
+ fprintf (outfile, " .repe = %d,", instr->repe);
+ fprintf (outfile, " .suffix = %d,", instr->suffix);
+ fprintf (outfile, " .modrm = %d,", instr->modrm);
+
+ for (int i = 0; i < 3; ++i)
+ {
+ int idx = 0;
+ if (instr->operands[i].fct != NULL)
+ {
+ struct argstring search = { .str = instr->operands[i].fct };
+ struct argstring **res = tfind (&search, &fct_names[i],
+ compare_argstring);
+ assert (res != NULL);
+ idx = (*res)->idx;
+ }
+ fprintf (outfile, " .fct%d = %d,", i + 1, idx);
+
+ idx = 0;
+ if (instr->operands[i].str != NULL)
+ {
+ struct argstring search = { .str = instr->operands[i].str };
+ struct argstring **res = tfind (&search, &strs[i],
+ compare_argstring);
+ assert (res != NULL);
+ idx = (*res)->idx;
+ }
+ if (nbitstr[i] != 0)
+ fprintf (outfile, " .str%d = %d,", i + 1, idx);
+
+ fprintf (outfile, " .off%d_1 = %d,", i + 1,
+ MAX (0, instr->operands[i].off1 - minoff[i][0]));
+
+ if (nbitoff[i][1] != 0)
+ fprintf (outfile, " .off%d_2 = %d,", i + 1,
+ MAX (0, instr->operands[i].off2 - minoff[i][1]));
+
+ if (nbitoff[i][2] != 0)
+ fprintf (outfile, " .off%d_3 = %d,", i + 1,
+ MAX (0, instr->operands[i].off3 - minoff[i][2]));
+ }
+
+ fputs (" },\n", outfile);
+ }
+ fputs ("};\n", outfile);
+
+ fputs ("static const uint8_t match_data[] =\n{\n", outfile);
+ size_t cnt = 0;
+ for (instr = instructions; instr != NULL; instr = instr->next, ++cnt)
+ {
+ /* First count the number of bytes. */
+ size_t totalbits = 0;
+ size_t zerobits = 0;
+ bool leading_p = true;
+ size_t leadingbits = 0;
+ struct bitvalue *b = instr->bytes;
+ while (b != NULL)
+ {
+ if (b->type == zeroone)
+ {
+ ++totalbits;
+ zerobits = 0;
+ if (leading_p)
+ ++leadingbits;
+ }
+ else
+ {
+ totalbits += b->field->bits;
+ /* We must always count the mod/rm byte. */
+ if (strncasecmp (b->field->name, "mod", 3) == 0)
+ zerobits = 0;
+ else
+ zerobits += b->field->bits;
+ leading_p = false;
+ }
+ b = b->next;
+ }
+ size_t nbytes = (totalbits - zerobits + 7) / 8;
+ assert (nbytes > 0);
+ size_t leadingbytes = leadingbits / 8;
+
+ fprintf (outfile, " %#zx,", nbytes | (leadingbytes << 4));
+
+ /* Now create the mask and byte values. */
+ uint8_t byte = 0;
+ uint8_t mask = 0;
+ int nbits = 0;
+ b = instr->bytes;
+ while (b != NULL)
+ {
+ if (b->type == zeroone)
+ {
+ byte = (byte << 1) | b->value;
+ mask = (mask << 1) | 1;
+ if (++nbits == 8)
+ {
+ if (leadingbytes > 0)
+ {
+ assert (mask == 0xff);
+ fprintf (outfile, " %#" PRIx8 ",", byte);
+ --leadingbytes;
+ }
+ else
+ fprintf (outfile, " %#" PRIx8 ", %#" PRIx8 ",",
+ mask, byte);
+ byte = mask = nbits = 0;
+ if (--nbytes == 0)
+ break;
+ }
+ }
+ else
+ {
+ assert (leadingbytes == 0);
+
+ unsigned long int remaining = b->field->bits;
+ while (nbits + remaining > 8)
+ {
+ fprintf (outfile, " %#" PRIx8 ", %#" PRIx8 ",",
+ mask << (8 - nbits), byte << (8 - nbits));
+ remaining = nbits + remaining - 8;
+ byte = mask = nbits = 0;
+ if (--nbytes == 0)
+ break;
+ }
+ byte <<= remaining;
+ mask <<= remaining;
+ nbits += remaining;
+ if (nbits == 8)
+ {
+ fprintf (outfile, " %#" PRIx8 ", %#" PRIx8 ",", mask, byte);
+ byte = mask = nbits = 0;
+ if (--nbytes == 0)
+ break;
+ }
+ }
+ b = b->next;
+ }
+
+ fputc_unlocked ('\n', outfile);
+ }
+ fputs ("};\n", outfile);
+}
+
+
+#if 0
+static size_t mnemonic_maxlen;
+static size_t mnemonic_minlen;
+static size_t
+which_chars (const char *str[], size_t nstr)
+{
+ char used_char[256];
+ memset (used_char, '\0', sizeof (used_char));
+ mnemonic_maxlen = 0;
+ mnemonic_minlen = 10000;
+ for (size_t cnt = 0; cnt < nstr; ++cnt)
+ {
+ const unsigned char *cp = (const unsigned char *) str[cnt];
+ mnemonic_maxlen = MAX (mnemonic_maxlen, strlen ((char *) cp));
+ mnemonic_minlen = MIN (mnemonic_minlen, strlen ((char *) cp));
+ do
+ used_char[*cp++] = 1;
+ while (*cp != '\0');
+ }
+ size_t nused_char = 0;
+ for (size_t cnt = 0; cnt < 256; ++cnt)
+ if (used_char[cnt] != 0)
+ ++nused_char;
+ return nused_char;
+}
+
+
+static const char **mnemonic_strs;
+static size_t nmnemonic_strs;
+static void
+add_mnemonics (const void *nodep, VISIT value,
+ int level __attribute__ ((unused)))
+{
+ if (value == leaf || value == postorder)
+ mnemonic_strs[nmnemonic_strs++] = *(const char **) nodep;
+}
+
+
+struct charfreq
+{
+ char ch;
+ int freq;
+};
+static struct charfreq pfxfreq[256];
+static struct charfreq sfxfreq[256];
+
+
+static int
+compare_freq (const void *p1, const void *p2)
+{
+ const struct charfreq *c1 = (const struct charfreq *) p1;
+ const struct charfreq *c2 = (const struct charfreq *) p2;
+
+ if (c1->freq > c2->freq)
+ return -1;
+ if (c1->freq < c2->freq)
+ return 1;
+ return 0;
+}
+
+
+static size_t
+compute_pfxfreq (const char *str[], size_t nstr)
+{
+ memset (pfxfreq, '\0', sizeof (pfxfreq));
+
+ for (size_t i = 0; i < nstr; ++i)
+ pfxfreq[i].ch = i;
+
+ for (size_t i = 0; i < nstr; ++i)
+ ++pfxfreq[*((const unsigned char *) str[i])].freq;
+
+ qsort (pfxfreq, 256, sizeof (struct charfreq), compare_freq);
+
+ size_t n = 0;
+ while (n < 256 && pfxfreq[n].freq != 0)
+ ++n;
+ return n;
+}
+
+
+struct strsnlen
+{
+ const char *str;
+ size_t len;
+};
+
+static size_t
+compute_sfxfreq (size_t nstr, struct strsnlen *strsnlen)
+{
+ memset (sfxfreq, '\0', sizeof (sfxfreq));
+
+ for (size_t i = 0; i < nstr; ++i)
+ sfxfreq[i].ch = i;
+
+ for (size_t i = 0; i < nstr; ++i)
+ ++sfxfreq[((const unsigned char *) strchrnul (strsnlen[i].str, '\0'))[-1]].freq;
+
+ qsort (sfxfreq, 256, sizeof (struct charfreq), compare_freq);
+
+ size_t n = 0;
+ while (n < 256 && sfxfreq[n].freq != 0)
+ ++n;
+ return n;
+}
+
+
+static void
+create_mnemonic_table (void)
+{
+ mnemonic_strs = xmalloc (nmnemonics * sizeof (char *));
+
+ twalk (mnemonics, add_mnemonics);
+
+ (void) which_chars (mnemonic_strs, nmnemonic_strs);
+
+ size_t best_so_far = 100000000;
+ char *best_prefix = NULL;
+ char *best_suffix = NULL;
+ char *best_table = NULL;
+ size_t best_table_size = 0;
+ size_t best_table_bits = 0;
+ size_t best_prefix_bits = 0;
+
+ /* We can precompute the prefix characters. */
+ size_t npfx_char = compute_pfxfreq (mnemonic_strs, nmnemonic_strs);
+
+ /* Compute best size for string representation including explicit NUL. */
+ for (size_t pfxbits = 0; (1u << pfxbits) < 2 * npfx_char; ++pfxbits)
+ {
+ char prefix[1 << pfxbits];
+ size_t i;
+ for (i = 0; i < (1u << pfxbits) - 1; ++i)
+ prefix[i] = pfxfreq[i].ch;
+ prefix[i] = '\0';
+
+ struct strsnlen strsnlen[nmnemonic_strs];
+
+ for (i = 0; i < nmnemonic_strs; ++i)
+ {
+ if (strchr (prefix, *mnemonic_strs[i]) != NULL)
+ strsnlen[i].str = mnemonic_strs[i] + 1;
+ else
+ strsnlen[i].str = mnemonic_strs[i];
+ strsnlen[i].len = strlen (strsnlen[i].str);
+ }
+
+ /* With the prefixes gone, try to combine strings. */
+ size_t nstrsnlen = 1;
+ for (i = 1; i < nmnemonic_strs; ++i)
+ {
+ size_t j;
+ for (j = 0; j < nstrsnlen; ++j)
+ if (strsnlen[i].len > strsnlen[j].len
+ && strcmp (strsnlen[j].str,
+ strsnlen[i].str + (strsnlen[i].len
+ - strsnlen[j].len)) == 0)
+ {
+ strsnlen[j] = strsnlen[i];
+ break;
+ }
+ else if (strsnlen[i].len < strsnlen[j].len
+ && strcmp (strsnlen[i].str,
+ strsnlen[j].str + (strsnlen[j].len
+ - strsnlen[i].len)) == 0)
+ break;
+;
+ if (j == nstrsnlen)
+ strsnlen[nstrsnlen++] = strsnlen[i];
+ }
+
+ size_t nsfx_char = compute_sfxfreq (nstrsnlen, strsnlen);
+
+ for (size_t sfxbits = 0; (1u << sfxbits) < 2 * nsfx_char; ++sfxbits)
+ {
+ char suffix[1 << sfxbits];
+
+ for (i = 0; i < (1u << sfxbits) - 1; ++i)
+ suffix[i] = sfxfreq[i].ch;
+ suffix[i] = '\0';
+
+ size_t newlen[nstrsnlen];
+
+ for (i = 0; i < nstrsnlen; ++i)
+ if (strchr (suffix, strsnlen[i].str[strsnlen[i].len - 1]) != NULL)
+ newlen[i] = strsnlen[i].len - 1;
+ else
+ newlen[i] = strsnlen[i].len;
+
+ char charused[256];
+ memset (charused, '\0', sizeof (charused));
+ size_t ncharused = 0;
+
+ const char *tablestr[nstrsnlen];
+ size_t ntablestr = 1;
+ tablestr[0] = strsnlen[0].str;
+ size_t table = newlen[0] + 1;
+ for (i = 1; i < nstrsnlen; ++i)
+ {
+ size_t j;
+ for (j = 0; j < ntablestr; ++j)
+ if (newlen[i] > newlen[j]
+ && memcmp (tablestr[j],
+ strsnlen[i].str + (newlen[i] - newlen[j]),
+ newlen[j]) == 0)
+ {
+ table += newlen[i] - newlen[j];
+ tablestr[j] = strsnlen[i].str;
+ newlen[j] = newlen[i];
+ break;
+ }
+ else if (newlen[i] < newlen[j]
+ && memcmp (strsnlen[i].str,
+ tablestr[j] + (newlen[j] - newlen[i]),
+ newlen[i]) == 0)
+ break;
+
+ if (j == ntablestr)
+ {
+ table += newlen[i] + 1;
+ tablestr[ntablestr] = strsnlen[i].str;
+ newlen[ntablestr] = newlen[i];
+
+ ++ntablestr;
+ }
+
+ for (size_t x = 0; x < newlen[j]; ++x)
+ if (charused[((const unsigned char *) tablestr[j])[x]]++ == 0)
+ ++ncharused;
+ }
+
+ size_t ncharused_bits = 0;
+ i = 1;
+ while (i < ncharused)
+ {
+ i *= 2;
+ ++ncharused_bits;
+ }
+
+ size_t table_bits = 0;
+ i = 1;
+ while (i < table)
+ {
+ i *= 2;
+ ++table_bits;
+ }
+
+ size_t mnemonic_bits = table_bits + pfxbits + sfxbits;
+ size_t new_total = (((table + 7) / 8) * ncharused_bits + ncharused
+ + (pfxbits == 0 ? 0 : (1 << pfxbits) - 1)
+ + (sfxbits == 0 ? 0 : (1 << sfxbits) - 1)
+ + (((total_bits + mnemonic_bits + 7) / 8)
+ * ninstructions));
+
+ if (new_total < best_so_far)
+ {
+ best_so_far = new_total;
+ best_mnemonic_bits = mnemonic_bits;
+
+ free (best_suffix);
+ best_suffix = xstrdup (suffix);
+
+ free (best_prefix);
+ best_prefix = xstrdup (prefix);
+ best_prefix_bits = pfxbits;
+
+ best_table_size = table;
+ best_table_bits = table_bits;
+ char *cp = best_table = xrealloc (best_table, table);
+ for (i = 0; i < ntablestr; ++i)
+ {
+ assert (cp + newlen[i] + 1 <= best_table + table);
+ cp = mempcpy (cp, tablestr[i], newlen[i]);
+ *cp++ = '\0';
+ }
+ assert (cp == best_table + table);
+ }
+ }
+ }
+
+ fputs ("static const char mnemonic_table[] =\n\"", outfile);
+ for (size_t i = 0; i < best_table_size; ++i)
+ {
+ if (((i + 1) % 60) == 0)
+ fputs ("\"\n\"", outfile);
+ if (!isascii (best_table[i]) || !isprint (best_table[i]))
+ fprintf (outfile, "\\%03o", best_table[i]);
+ else
+ fputc (best_table[i], outfile);
+ }
+ fputs ("\";\n", outfile);
+
+ if (best_prefix[0] != '\0')
+ fprintf (outfile,
+ "static const char prefix[%zu] = \"%s\";\n"
+ "#define PREFIXCHAR_BITS %zu\n",
+ strlen (best_prefix), best_prefix, best_prefix_bits);
+ else
+ fputs ("#define NO_PREFIX\n", outfile);
+
+ if (best_suffix[0] != '\0')
+ fprintf (outfile, "static const char suffix[%zu] = \"%s\";\n",
+ strlen (best_suffix), best_suffix);
+ else
+ fputs ("#define NO_SUFFIX\n", outfile);
+
+ for (size_t i = 0; i < nmnemonic_strs; ++i)
+ {
+ const char *mne = mnemonic_strs[i];
+
+ size_t pfxval = 0;
+ char *cp = strchr (best_prefix, *mne);
+ if (cp != NULL)
+ {
+ pfxval = 1 + (cp - best_prefix);
+ ++mne;
+ }
+
+ size_t l = strlen (mne);
+
+ size_t sfxval = 0;
+ cp = strchr (best_suffix, mne[l - 1]);
+ if (cp != NULL)
+ {
+ sfxval = 1 + (cp - best_suffix);
+ --l;
+ }
+
+ char *off = memmem (best_table, best_table_size, mne, l);
+ while (off[l] != '\0')
+ {
+ off = memmem (off + 1, best_table_size, mne, l);
+ assert (off != NULL);
+ }
+
+ fprintf (outfile, "#define MNE_%s %#zx\n",
+ mnemonic_strs[i],
+ (off - best_table)
+ + ((pfxval + (sfxval << best_prefix_bits)) << best_table_bits));
+ }
+}
+#endif
diff --git a/libcpu/memory-access.h b/libcpu/memory-access.h
new file mode 100644
index 00000000..c68eb4a0
--- /dev/null
+++ b/libcpu/memory-access.h
@@ -0,0 +1,179 @@
+/* Unaligned memory access functionality.
+ Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2008 Red Hat, Inc.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2001.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifndef _MEMORY_ACCESS_H
+#define _MEMORY_ACCESS_H 1
+
+#include <byteswap.h>
+#include <endian.h>
+#include <limits.h>
+#include <stdint.h>
+
+
+/* When loading this file we require the macro MACHINE_ENCODING to be
+ defined to signal the endianness of the architecture which is
+ defined. */
+#ifndef MACHINE_ENCODING
+# error "MACHINE_ENCODING needs to be defined"
+#endif
+#if MACHINE_ENCODING != __BIG_ENDIAN && MACHINE_ENCODING != __LITTLE_ENDIAN
+# error "MACHINE_ENCODING must signal either big or little endian"
+#endif
+
+
+/* We use simple memory access functions in case the hardware allows it.
+ The caller has to make sure we don't have alias problems. */
+#if ALLOW_UNALIGNED
+
+# define read_2ubyte_unaligned(Addr) \
+ (unlikely (MACHINE_ENCODING != __BYTE_ORDER) \
+ ? bswap_16 (*((const uint16_t *) (Addr))) \
+ : *((const uint16_t *) (Addr)))
+# define read_2sbyte_unaligned(Addr) \
+ (unlikely (MACHINE_ENCODING != __BYTE_ORDER) \
+ ? (int16_t) bswap_16 (*((const int16_t *) (Addr))) \
+ : *((const int16_t *) (Addr)))
+
+# define read_4ubyte_unaligned_noncvt(Addr) \
+ *((const uint32_t *) (Addr))
+# define read_4ubyte_unaligned(Addr) \
+ (unlikely (MACHINE_ENCODING != __BYTE_ORDER) \
+ ? bswap_32 (*((const uint32_t *) (Addr))) \
+ : *((const uint32_t *) (Addr)))
+# define read_4sbyte_unaligned(Addr) \
+ (unlikely (MACHINE_ENCODING != __BYTE_ORDER) \
+ ? (int32_t) bswap_32 (*((const int32_t *) (Addr))) \
+ : *((const int32_t *) (Addr)))
+
+# define read_8ubyte_unaligned(Addr) \
+ (unlikely (MACHINE_ENCODING != __BYTE_ORDER) \
+ ? bswap_64 (*((const uint64_t *) (Addr))) \
+ : *((const uint64_t *) (Addr)))
+# define read_8sbyte_unaligned(Addr) \
+ (unlikely (MACHINE_ENCODING != __BYTE_ORDER) \
+ ? (int64_t) bswap_64 (*((const int64_t *) (Addr))) \
+ : *((const int64_t *) (Addr)))
+
+#else
+
+union unaligned
+ {
+ void *p;
+ uint16_t u2;
+ uint32_t u4;
+ uint64_t u8;
+ int16_t s2;
+ int32_t s4;
+ int64_t s8;
+ } __attribute__ ((packed));
+
+static inline uint16_t
+read_2ubyte_unaligned (const void *p)
+{
+ const union unaligned *up = p;
+ if (MACHINE_ENCODING != __BYTE_ORDER)
+ return bswap_16 (up->u2);
+ return up->u2;
+}
+static inline int16_t
+read_2sbyte_unaligned (const void *p)
+{
+ const union unaligned *up = p;
+ if (MACHINE_ENCODING != __BYTE_ORDER)
+ return (int16_t) bswap_16 (up->u2);
+ return up->s2;
+}
+
+static inline uint32_t
+read_4ubyte_unaligned_noncvt (const void *p)
+{
+ const union unaligned *up = p;
+ return up->u4;
+}
+static inline uint32_t
+read_4ubyte_unaligned (const void *p)
+{
+ const union unaligned *up = p;
+ if (MACHINE_ENCODING != __BYTE_ORDER)
+ return bswap_32 (up->u4);
+ return up->u4;
+}
+static inline int32_t
+read_4sbyte_unaligned (const void *p)
+{
+ const union unaligned *up = p;
+ if (MACHINE_ENCODING != __BYTE_ORDER)
+ return (int32_t) bswap_32 (up->u4);
+ return up->s4;
+}
+
+static inline uint64_t
+read_8ubyte_unaligned (const void *p)
+{
+ const union unaligned *up = p;
+ if (MACHINE_ENCODING != __BYTE_ORDER)
+ return bswap_64 (up->u8);
+ return up->u8;
+}
+static inline int64_t
+read_8sbyte_unaligned (const void *p)
+{
+ const union unaligned *up = p;
+ if (MACHINE_ENCODING != __BYTE_ORDER)
+ return (int64_t) bswap_64 (up->u8);
+ return up->s8;
+}
+
+#endif /* allow unaligned */
+
+
+#define read_2ubyte_unaligned_inc(Addr) \
+ ({ uint16_t t_ = read_2ubyte_unaligned (Addr); \
+ Addr = (__typeof (Addr)) (((uintptr_t) (Addr)) + 2); \
+ t_; })
+#define read_2sbyte_unaligned_inc(Addr) \
+ ({ int16_t t_ = read_2sbyte_unaligned (Addr); \
+ Addr = (__typeof (Addr)) (((uintptr_t) (Addr)) + 2); \
+ t_; })
+
+#define read_4ubyte_unaligned_inc(Addr) \
+ ({ uint32_t t_ = read_4ubyte_unaligned (Addr); \
+ Addr = (__typeof (Addr)) (((uintptr_t) (Addr)) + 4); \
+ t_; })
+#define read_4sbyte_unaligned_inc(Addr) \
+ ({ int32_t t_ = read_4sbyte_unaligned (Addr); \
+ Addr = (__typeof (Addr)) (((uintptr_t) (Addr)) + 4); \
+ t_; })
+
+#define read_8ubyte_unaligned_inc(Addr) \
+ ({ uint64_t t_ = read_8ubyte_unaligned (Addr); \
+ Addr = (__typeof (Addr)) (((uintptr_t) (Addr)) + 8); \
+ t_; })
+#define read_8sbyte_unaligned_inc(Addr) \
+ ({ int64_t t_ = read_8sbyte_unaligned (Addr); \
+ Addr = (__typeof (Addr)) (((uintptr_t) (Addr)) + 8); \
+ t_; })
+
+#endif /* memory-access.h */
diff --git a/libcpu/x86_64_disasm.c b/libcpu/x86_64_disasm.c
new file mode 100644
index 00000000..b793b78d
--- /dev/null
+++ b/libcpu/x86_64_disasm.c
@@ -0,0 +1,31 @@
+/* Disassembler for x86-64.
+ Copyright (C) 2007, 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2007.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#define i386_disasm x86_64_disasm
+#define DISFILE "x86_64_dis.h"
+#define MNEFILE "x86_64.mnemonics"
+#define X86_64
+#include "i386_disasm.c"
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index 1642ce85..c5679062 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,437 @@
+2010-05-08 Roland McGrath <roland@redhat.com>
+
+ * dwarf_getlocation.c (__libdw_intern_expression): Take new argument
+ REF_SIZE. Use that to handle DW_OP_call_ref correctly.
+ (getlocation): Update caller.
+ * dwarf_frame_cfa.c (dwarf_frame_cfa): Likewise.
+ * dwarf_frame_register.c (dwarf_frame_register): Likewise.
+ * libdwP.h: Update decl.
+
+2010-04-26 Roland McGrath <roland@redhat.com>
+
+ * cfi.h (struct Dwarf_Frame_s): Add cfa_invalid alternative in cfa_rule.
+ * cfi.c (execute_cfi): Set that instead of doing cfi_assert for
+ DW_CFA_def_cfa_{offset*,register} when a non-offset rule is in force.
+ * dwarf_frame_cfa.c (dwarf_frame_cfa): Handle cfa_invalid.
+
+ * dwarf_getlocation.c (__libdw_intern_expression): Take new arg CFAP.
+ Prepend DW_OP_call_frame_cfa if true.
+ (getlocation): Update caller.
+ * dwarf_frame_cfa.c (dwarf_frame_cfa): Likewise.
+ * dwarf_frame_register.c (dwarf_frame_register): Likewise.
+ * libdwP.h: Update decl.
+
+2010-04-22 Roland McGrath <roland@redhat.com>
+
+ * cfi.c (execute_cfi): Never return without cleanup.
+ Free FS on failure.
+ (cie_cache_initial_state): Adjust caller to expect that free.
+ (__libdw_frame_at_address): Likewise.
+
+2010-03-10 Roland McGrath <roland@redhat.com>
+
+ * libdw.map (ELFUTILS_0.146): New set. Add dwfl_core_file_report.
+
+2010-02-15 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am: Use config/eu.am for common stuff.
+
+2010-02-02 Mark Wielaard <mjw@redhat.com>
+
+ * fde.c (intern_fde): Fix length check for sized_augmentation_data.
+
+2010-01-07 Roland McGrath <roland@redhat.com>
+
+ * dwarf_getcfi_elf.c (getcfi_phdr): Use elf_getphdrnum.
+
+2010-01-05 Roland McGrath <roland@redhat.com>
+
+ * dwarf_aggregate_size.c: New file.
+ * Makefile.am (libdw_a_SOURCES): Add it.
+ * libdw.h: Declare it.
+ * libdwP.h: Add INTDECL.
+ * libdw.map (ELFUTILS_0.144): New set. Add dwarf_aggregate_size.
+
+ * dwarf_srclang.c: Add INTDEF.
+ * libdwP.h: Add INTDECL.
+
+ * dwarf.h: Add some more DW_AT_GNU_* types from gcc.
+
+ * dwarf.h: Add DW_AT_GNU_vector, DW_AT_GNU_template_name.
+
+2009-11-21 Roland McGrath <roland@redhat.com>
+
+ * dwarf_getlocation.c (check_constant_offset): Return 1 for all
+ non-constant forms.
+
+2009-10-15 Roland McGrath <roland@redhat.com>
+
+ * libdw_form.c (__libdw_form_val_len): Grok DW_FORM_sec_offset,
+ DW_FORM_exprloc, DW_FORM_flag_present, and DW_FORM_ref_sig8.
+
+2009-09-17 Roland McGrath <roland@redhat.com>
+
+ * dwarf_getlocation.c (dwarf_getlocation_implicit_value): Make OP
+ argument a pointer to const.
+ * libdw.h: Update decl.
+
+2009-09-10 Roland McGrath <roland@redhat.com>
+
+ * dwarf_getlocation.c (store_implicit_value): New function.
+ (__libdw_intern_expression): Use it, handle DW_OP_implicit_value.
+ (dwarf_getlocation_implicit_value): New function.
+ * libdw.h: Declare it.
+ * libdw.map (ELFUTILS_0.143): Add it.
+
+2009-09-09 Mark Wielaard <mjw@redhat.com>
+
+ * dwarf_getcfi.c (dwarf_getcfi): Clear cfi->ebl.
+
+2009-08-21 Josh Stone <jistone@redhat.com>
+
+ * dwarf_hasattr_integrate.c: Integrate DW_AT_specification too.
+
+2009-08-10 Roland McGrath <roland@redhat.com>
+
+ * dwarf_getscopevar.c: Use dwarf_diename.
+
+2009-08-09 Roland McGrath <roland@redhat.com>
+
+ * libdw.map (ELFUTILS_0.143): New version set,
+ inherits from ELFUTILS_0.142.
+ * dwarf_arrayorder.c: Use OLD_VERSION and NEW_VERSION to define an
+ alias in the ELFUTILS_0.122 version set and the default in the new set.
+ * dwarf_srclang.c: Likewise.
+ * dwarf_decl_file.c: Likewise.
+ * dwarf_decl_line.c: Likewise.
+ * dwarf_decl_column.c: Likewise.
+ * dwarf_bytesize.c: Likewise.
+ * dwarf_bitsize.c: Likewise.
+ * dwarf_bitoffset.c: Likewise.
+
+2009-08-07 Roland McGrath <roland@redhat.com>
+
+ * dwarf_arrayorder.c: Use dwarf_attr_integrate.
+ * dwarf_srclang.c: Likewise.
+ * dwarf_decl_file.c: Likewise.
+ * dwarf_decl_line.c (__libdw_attr_intval): Likewise.
+ * dwarf_bytesize.c: Likewise.
+ * dwarf_bitsize.c: Likewise.
+ * dwarf_bitoffset.c: Likewise.
+
+2009-07-22 Roland McGrath <roland@redhat.com>
+
+ * dwarf_frame_cfa.c: Change calling convention.
+ * libdw.h: Update decl.
+
+ * dwarf_frame_register.c: Change calling/return-value convention for
+ value-only results and undefined/same_value.
+ * libdw.h: Update decl.
+
+ * dwarf_getlocation.c (__libdw_intern_expression): Take new bool
+ argument, append DW_OP_stack_value if set. Don't take NOPS argument,
+ return that value instead.
+ (getlocation): Update caller.
+ * dwarf_frame_cfa.c: Likewise.
+ * libdwP.h: Update decl.
+
+2009-07-21 Roland McGrath <roland@redhat.com>
+
+ * dwarf_getsrc_file.c: Ignore a CU that just has no DW_AT_stmt_list.
+ Fix loop iteration after skipping a bogus or useless CU.
+
+ * dwarf_entry_breakpoints.c: Handle 0 dwarf_errno () as harmless
+ absence, not DWARF_E_NO_DEBUG_LINE.
+
+2009-07-20 Roland McGrath <roland@redhat.com>
+
+ * dwarf_getlocation.c (__libdw_intern_expression):
+ Handle DW_OP_stack_value.
+
+2009-07-16 Roland McGrath <roland@redhat.com>
+
+ * dwarf_formudata.c (__libdw_formptr): Handle DW_FORM_sec_offset,
+ reject others when CU's version > 3.
+
+ * dwarf_formflag.c: Handle DW_FORM_flag_present.
+
+ * dwarf.h: Add DW_OP_{implicit,stack}_value from DWARF 4 draft.
+ Also DW_TAG_type_unit and DW_TAG_rvalue_reference_type.
+ Also DW_AT_signature, DW_AT_main_subprogram, DW_AT_data_bit_offset,
+ and DW_AT_const_expr.
+ Also DW_FORM_sec_offset, DW_FORM_exprloc, DW_FORM_flag_present,
+ and DW_FORM_ref_sig8.
+
+2009-07-15 Roland McGrath <roland@redhat.com>
+
+ * dwarf_getlocation.c: Grok DW_OP_form_tls_address,
+ DW_OP_GNU_push_tls_address, and DW_OP_bit_piece.
+
+2009-07-13 Roland McGrath <roland@redhat.com>
+
+ * dwarf_getlocation.c: Grok DW_OP_call_frame_cfa.
+
+2009-07-08 Roland McGrath <roland@redhat.com>
+
+ * libdw.map (ELFUTILS_0.142): Add dwfl_module_dwarf_cfi,
+ dwfl_module_eh_cfi.
+
+ * libdwP.h (struct Dwarf): Add member `cfi'.
+ * dwarf_end.c (dwarf_end): Call __libdw_destroy_frame_cache on it.
+ * dwarf_getcfi.c: New file.
+ * dwarf_getcfi_elf.c: New file.
+ * dwarf_cfi_end.c: New file.
+ * dwarf_cfi_addrframe.c: New file.
+ * dwarf_frame_cfa.c: New file.
+ * dwarf_frame_register.c: New file.
+ * dwarf_frame_return_address_register.c: New file.
+ * Makefile.am (libdw_a_SOURCES): Add them.
+ * unwind.h: Declare those functions.
+ * libdw.map (ELFUTILS_0.142): Export them.
+
+ * dwarf_getlocation.c (__libdw_intern_expression): New function,
+ broken out of ...
+ (getlocation): ... here, call it.
+ * libdwP.h: Declare it.
+
+ * cie.c: New file.
+ * fde.c: New file.
+ * frame-cache.c: New file.
+ * cfi.c: New file.
+ * cfi.h: New file.
+ * encoded-value.h: New file.
+ * Makefile.am (libdw_a_SOURCES, noinst_HEADERS): Add them.
+ * libdwP.h: Add DWARF_E_INVALID_CFI to errors enum.
+ * dwarf_error.c (errmsgs): Add element for it.
+
+ * dwarf_next_cfi.c: New file.
+ * Makefile.am (libdw_a_SOURCES): Add it.
+ * libdw.h (Dwarf_CIE, Dwarf_FDE, Dwarf_CIE_Entry): New types.
+ Declare dwarf_next_cfi.
+ * libdw.map (ELFUTILS_0.142): New set, inherits from ELFUTILS_0.136.
+ Add dwarf_next_cfi.
+
+ * memory-access.h [! ALLOW_UNALIGNED]
+ (read_2ubyte_unaligned): Renamed to ...
+ (read_2ubyte_unaligned_1): ... this. Take bool rather than Dwarf *.
+ (read_2ubyte_unaligned): Define as macro passing dbg->other_byte_order.
+ (read_2sbyte_unaligned): Likewise.
+ (read_4ubyte_unaligned): Likewise.
+ (read_4sbyte_unaligned): Likewise.
+ (read_8ubyte_unaligned): Likewise.
+ (read_8sbyte_unaligned): Likewise.
+
+ * libdwP.h (IDX_eh_frame): Remove it.
+ * dwarf_begin_elf.c (dwarf_scnnames): Remove its element.
+
+2009-07-08 Roland McGrath <roland@redhat.com>
+
+ * libdwP.h (struct Dwarf_Line_s): Reorder members to pack better.
+
+ * dwarf_getlocation.c (check_constant_offset): New function.
+ (dwarf_getlocation, dwarf_getlocation_addr): Call it to
+ handle DW_AT_data_member_location of data[48] as constant offset.
+
+2009-06-18 Roland McGrath <roland@redhat.com>
+
+ * libdwP.h (__libdw_read_address_inc): Constify.
+ (__libdw_read_offset_inc): Likewise.
+ * dwarf_getaranges.c: Likewise.
+ * dwarf_getlocation.c: Likewise.
+ * dwarf_getsrclines.c: Likewise.
+ * dwarf_nextcu.c: Likewise.
+
+2009-05-05 Petr Machata <pmachata@redhat.com>
+
+ * libdwP.h (__libdw_formptr): Declare new function.
+ * dwarf_formudata.c: Implement it here.
+ * dwarf_getlocation.c (dwarf_getlocation_addr):
+ Call it instead of hand-rolled offset handling code.
+ * dwarf_getsrclines.c (dwarf_getsrclines): Likewise.
+ * dwarf_ranges.c (dwarf_ranges): Likewise.
+
+2009-05-04 Petr Machata <pmachata@redhat.com>
+
+ * libdwP.h (__libdw_read_begin_end_pair_inc): Declare new function.
+ * dwarf_ranges.c: Implement it here.
+ (dwarf_ranges): Call it.
+ * dwarf_getlocation.c (dwarf_getlocation_addr): Call it also here.
+
+2009-04-23 Petr Machata <pmachata@redhat.com>
+
+ * dwarf_formaddr.c (dwarf_formaddr): Call __libdw_read_* instead
+ of read_*ubyte_unaligned.
+ * dwarf_formref_die.c (dwarf_formref_die): Likewise.
+ * dwarf_formstring.c (dwarf_formstring): Likewise.
+ * dwarf_formudate.c (dwarf_formudata): Likewise.
+ * dwarf_getaranges.c (dwarf_getaranges): Likewise.
+ * dwarf_getlocation.c (dwarf_getlocation_addr): Likewise.
+ * dwarf_getpubnames.c (get_offsets): Likewise.
+ * dwarf_nextcu.c (dwarf_nextcu): Likewise.
+
+2009-04-23 Petr Machata <pmachata@redhat.com>
+
+ * libdwP.h (__libdw_read_addr_inc, __libdw_read_off_inc,
+ __libdw_read_addr, __libdw_read_off): Add four new internal
+ functions.
+
+2009-05-07 Roland McGrath <roland@redhat.com>
+
+ * dwarf_getmacros.c (dwarf_getmacros): Use absolute section offset in
+ return value and OFFSET argument, not CU-relative. Only fetch the
+ attribute data when called with OFFSET of 0.
+
+2009-05-07 Petr Machata <pmachata@redhat.com>
+
+ * dwarf_getmacros.c (dwarf_getmacros): Take into account offset in
+ DW_AT_macro_info attribute of CU DIE.
+
+2009-04-15 Roland McGrath <roland@redhat.com>
+
+ * dwarf.h (DW_CIE_ID): Removed.
+ (DW_CIE_ID_32, DW_CIE_ID_64): New constants replace it.
+
+2009-04-01 Roland McGrath <roland@redhat.com>
+
+ * dwarf.h: Add DW_CFA_GNU_negative_offset_extended.
+
+2009-01-28 Roland McGrath <roland@redhat.com>
+
+ * libdwP.h (struct Dwarf_Line_s): Move out of struct Dwarf_Lines_s
+ defn so C++ doesn't scope the name to not match the Dwarf_Line typedef.
+
+ * libdwP.h (struct Dwarf_Files_s): Replace dbg field with cu field.
+
+2009-01-26 Roland McGrath <roland@redhat.com>
+
+ * dwarf_ranges.c: Return 0 when no ranges or *_pc attrs at all.
+
+2009-01-25 Roland McGrath <roland@redhat.com>
+
+ * dwarf_getattrs.c: Correctly skip attribute values when restarting.
+
+2009-01-23 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am ($(srcdir)/known-dwarf.h): Target renamed back.
+ Put these rules under if MAINTAINER_MODE.
+
+2009-01-22 Roland McGrath <roland@redhat.com>
+
+ * dwarf.h: Add DW_OP_GNU_encoded_addr.
+
+2009-01-21 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am (CLEANFILES): Renamed to ...
+ (MOSTLYCLEANFILES): ... here.
+ (CLEANFILES): New variable, add known-dwarf.h.
+
+2009-01-17 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am (known-dwarf.h): Target renamed, not in $(srcdir).
+ Make it unconditional.
+ (BUILT_SOURCES): Updated.
+
+ * dwarf.h: Add description comments for DW_LANG_* values.
+
+ * Makefile.am [MAINTAINER_MODE]
+ ($(srcdir)/known-dwarf.h): New target.
+ (BUILT_SOURCES): Add it.
+
+ * dwarf.h: Add DW_OP_GNU_push_tls_address, DW_OP_GNU_uninit.
+
+2009-01-10 Ulrich Drepper <drepper@redhat.com>
+
+ * dwarf_error.c: Always use __thread. Remove all !USE_TLS code.
+
+2009-01-08 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am (libdw.so): Don't depend on $(zip_LIBS), just link it in.
+
+2008-01-06 Roland McGrath <roland@redhat.com>
+
+ * libdwP.h (struct Dwarf_Abbrev): Change type of 'has_children' to bool.
+ Reorder members.
+ * dwarf_haschildren.c: Return -1 for error case, not 0.
+
+ * Makefile.am (libdw.so): Link in $(zip_LIBS).
+
+2009-01-06 Ulrich Drepper <drepper@redhat.com>
+
+ * dwarf.h: Add definition for unwind and call frame information.
+
+ * memory-access.h: Define read_ubyte_unaligned, read_sbyte_unaligned,
+ read_ubyte_unaligned_inc, and read_sbyte_unaligned_inc.
+
+2008-08-15 Roland McGrath <roland@redhat.com>
+
+ * libdw.map (ELFUTILS_0.136): New version set, inherits from
+ ELFUTILS_0.130. Add dwfl_addrsegment, dwfl_report_segment.
+
+2008-01-21 Ulrich Drepper <drepper@redhat.com>
+
+ * dwarf_child.c: Minor optimizations.
+ * dwarf_getattrs.c: Likewise.
+ * dwarf_getpubnames.c: Likewise.
+ * dwarf_siblingof.c: Likewise.
+ * dwarf_tag.c: Likewise.
+
+2008-01-18 Ulrich Drepper <drepper@redhat.com>
+
+ * dwarf_getsrclines.c (dwarf_getsrclines): Don't require exact match
+ of DWARF_VERSION comparison, just fail if the file's version is newer.
+
+2008-01-17 Nick Clifton <nickc@redhat.com>
+
+ * dwarf.h (DWARF3_LENGTH_MIN_ESCAPE_CODE): New define.
+ (DWARF3_LENGTH_MAX_ESCAPE_CODE): New define.
+ (DWARF3_LENGTH_64_BIT): New define.
+ * dwarf_getaranges (dwarf_getaranges): Use the new definitions.
+ * dwarf_getpubnames: Include dwarf.h.
+ (get_offsets): Use the new definitions.
+ * dwarf_getsrclines.c (dwarf_getsrclines): Use the new defintions.
+ * dwarf_nextcu.c: Include dwarf.h. Correct comment.
+ (dwarf_nextcu): Use the new definitions.
+
+ * libdwP.h (DIE_OFFSET_FROM_CU_OFFSET): New macro.
+ * dwarf_diecu.c (dwarf_diecu): Use the new macro.
+ * dwarf_getaranges (dwarf_getaranges): Use the new macro.
+ * dwarf_nextcu.c (dwarf_nextcu): Use the new macro.
+
+ * dwarf_getpubnames (get_offsets): Replace assertion with test and
+ error return.
+
+ * dwarf_entry_breakpoints.c (dwarf_entry_breakpoints): Use CUDIE.
+
+ * dwarf_siblingof (dwarf_siblingof): Detect a NULL return pointer.
+ Set the address in the return structure to the address of the next
+ non-sibling die, if there is no sibling and the return pointer is
+ not the same as the die pointer.
+ * libdw.h: Expand the description of the dwarf_siblingof prototype.
+
+ * dwarf_child.c: Fix typo in comment.
+
+ * libdwP.h (DWARF_VERSION): Change to 3.
+
+ * dwarf_formref.c (__libdw_formref.c): Handle attributes which do
+ not have a initialised valp pointer.
+
+ * dwarf_getattrs.c (dwarf_getattrs): Return 1 rather than 0 when
+ the end of the attributes is reached. When the callback fails,
+ return the address of the failing attribute, not the address of
+ its successor.
+ * libdw.h: Expand the description of the dwarf_getattrs prototype.
+
+ * dwarf_child.c (__libdw_find_attr): Use the new definition.
+ (dwarf_child): Likewise.
+ * dwarf_tag.c (__libdw_findabbrev): Likewise.
+ (dwarf_tag): Likewise.
+
+2008-01-08 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am (euinclude): Variable removed.
+ (pkginclude_HEADERS): Set this instead of euinclude_HEADERS.
+ (libdw.so): Pass -Wl,--enable-new-dtags,-rpath,$(pkglibdir).
+
2007-08-04 Roland McGrath <roland@redhat.com>
* libdw.map (ELFUTILS_0.131): Add dwfl_module_build_id,
diff --git a/libdw/Makefile.am b/libdw/Makefile.am
index 62057dc9..4bd0f2a8 100644
--- a/libdw/Makefile.am
+++ b/libdw/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to create Makefile.in
##
-## Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
+## Copyright (C) 2002-2010 Red Hat, Inc.
## This file is part of Red Hat elfutils.
##
## Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -24,22 +24,14 @@
## Network licensing program, please visit www.openinventionnetwork.com
## <http://www.openinventionnetwork.com>.
##
-DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DIS_LIBDW
-if MUDFLAP
-AM_CFLAGS = -fmudflap
-else
-AM_CFLAGS =
-endif
+include $(top_srcdir)/config/eu.am
+DEFS += -DIS_LIBDW
if BUILD_STATIC
AM_CFLAGS += -fpic
endif
-AM_CFLAGS += -Wall -Werror -Wshadow -Wunused -Wformat=2 -Wextra -std=gnu99
-INCLUDES = -I. -I$(srcdir) -I$(srcdir)/../libelf -I.. -I$(srcdir)/../lib
+INCLUDES += -I$(srcdir)/../libelf
VERSION = 1
-COMPILE.os = $(filter-out -fprofile-arcs, $(filter-out -ftest-coverage, \
- $(COMPILE)))
-
lib_LIBRARIES = libdw.a
if !MUDFLAP
noinst_LIBRARIES = libdw_pic.a
@@ -47,8 +39,7 @@ noinst_PROGRAMS = $(noinst_LIBRARIES:_pic.a=.so)
endif
include_HEADERS = dwarf.h
-euincludedir = ${includedir}/elfutils
-euinclude_HEADERS = libdw.h
+pkginclude_HEADERS = libdw.h
libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \
dwarf_getpubnames.c dwarf_getabbrev.c dwarf_tag.c \
@@ -84,7 +75,21 @@ libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \
dwarf_func_inline.c dwarf_getsrc_file.c \
libdw_findcu.c libdw_form.c libdw_alloc.c memory-access.c \
libdw_visit_scopes.c \
- dwarf_entry_breakpoints.c
+ dwarf_entry_breakpoints.c \
+ dwarf_next_cfi.c \
+ cie.c fde.c cfi.c frame-cache.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
+
+if MAINTAINER_MODE
+BUILT_SOURCES = $(srcdir)/known-dwarf.h
+MAINTAINERCLEANFILES = $(srcdir)/known-dwarf.h
+$(srcdir)/known-dwarf.h: $(top_srcdir)/config/known-dwarf.awk $(srcdir)/dwarf.h
+ $(AWK) -f $^ > $@.new
+ mv -f $@.new $@
+endif
if !MUDFLAP
libdw_pic_a_SOURCES =
@@ -94,21 +99,16 @@ libdw_so_SOURCES =
libdw.so: $(srcdir)/libdw.map libdw_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.
$(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
+ -ldl $(zip_LIBS)
if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
ln -fs $@ $@.$(VERSION)
-%.os: %.c %.o
- if $(COMPILE.os) -c -o $@ -fpic -DPIC -DSHARED -MT $@ -MD -MP \
- -MF "$(DEPDIR)/$*.Tpo" `test -f '$<' || echo '$(srcdir)/'`$<; \
- then cat "$(DEPDIR)/$*.Tpo" >> "$(DEPDIR)/$*.Po"; \
- rm -f "$(DEPDIR)/$*.Tpo"; \
- else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
- fi
-
install: install-am libdw.so
$(mkinstalldirs) $(DESTDIR)$(libdir)
$(INSTALL_PROGRAM) libdw.so $(DESTDIR)$(libdir)/libdw-$(PACKAGE_VERSION).so
@@ -124,8 +124,9 @@ endif
libdw_a_LIBADD = $(addprefix ../libdwfl/,$(shell $(AR) t ../libdwfl/libdwfl.a))
-noinst_HEADERS = libdwP.h memory-access.h dwarf_abbrev_hash.h
+noinst_HEADERS = libdwP.h memory-access.h dwarf_abbrev_hash.h \
+ cfi.h encoded-value.h
EXTRA_DIST = libdw.map
-CLEANFILES = $(am_libdw_pic_a_OBJECTS) *.gcno *.gcda libdw.so.$(VERSION)
+MOSTLYCLEANFILES = $(am_libdw_pic_a_OBJECTS) libdw.so.$(VERSION)
diff --git a/libdw/cfi.c b/libdw/cfi.c
new file mode 100644
index 00000000..3cb378b6
--- /dev/null
+++ b/libdw/cfi.c
@@ -0,0 +1,505 @@
+/* CFI program execution.
+ Copyright (C) 2009-2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <dwarf.h>
+#include "../libebl/libebl.h"
+#include "cfi.h"
+#include "memory-access.h"
+#include "encoded-value.h"
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define CFI_PRIMARY_MAX 0x3f
+
+static Dwarf_Frame *
+duplicate_frame_state (const Dwarf_Frame *original,
+ Dwarf_Frame *prev)
+{
+ size_t size = offsetof (Dwarf_Frame, regs[original->nregs]);
+ Dwarf_Frame *copy = malloc (size);
+ if (likely (copy != NULL))
+ {
+ memcpy (copy, original, size);
+ copy->prev = prev;
+ }
+ return copy;
+}
+
+/* Returns a DWARF_E_* error code, usually NOERROR or INVALID_CFI.
+ Frees *STATE on failure. */
+static int
+execute_cfi (Dwarf_CFI *cache,
+ const struct dwarf_cie *cie,
+ Dwarf_Frame **state,
+ const uint8_t *program, const uint8_t *const end, bool abi_cfi,
+ Dwarf_Addr loc, Dwarf_Addr find_pc)
+{
+ /* The caller should not give us anything out of range. */
+ assert (loc <= find_pc);
+
+ int result = DWARF_E_NOERROR;
+
+#define cfi_assert(ok) do { \
+ if (likely (ok)) break; \
+ result = DWARF_E_INVALID_CFI; \
+ goto out; \
+ } while (0)
+
+ Dwarf_Frame *fs = *state;
+ inline bool enough_registers (Dwarf_Word reg)
+ {
+ if (fs->nregs <= reg)
+ {
+ size_t size = offsetof (Dwarf_Frame, regs[reg + 1]);
+ Dwarf_Frame *bigger = realloc (fs, size);
+ if (unlikely (bigger == NULL))
+ {
+ result = DWARF_E_NOMEM;
+ return false;
+ }
+ else
+ {
+ bigger->nregs = reg + 1;
+ fs = bigger;
+ }
+ }
+ return true;
+ }
+
+ inline void require_cfa_offset (void)
+ {
+ if (unlikely (fs->cfa_rule != cfa_offset))
+ fs->cfa_rule = cfa_invalid;
+ }
+
+#define register_rule(regno, r_rule, r_value) do { \
+ if (unlikely (! enough_registers (regno))) \
+ goto out; \
+ fs->regs[regno].rule = reg_##r_rule; \
+ fs->regs[regno].value = (r_value); \
+ } while (0)
+
+ while (program < end)
+ {
+ uint8_t opcode = *program++;
+ Dwarf_Word regno;
+ Dwarf_Word offset;
+ Dwarf_Word sf_offset;
+ Dwarf_Word operand = opcode & CFI_PRIMARY_MAX;
+ switch (opcode)
+ {
+ /* These cases move LOC, i.e. "create a new table row". */
+
+ case DW_CFA_advance_loc1:
+ operand = *program++;
+ case DW_CFA_advance_loc + 0 ... DW_CFA_advance_loc + CFI_PRIMARY_MAX:
+ advance_loc:
+ loc += operand * cie->code_alignment_factor;
+ break;
+
+ case DW_CFA_advance_loc2:
+ operand = read_2ubyte_unaligned_inc (cache, program);
+ goto advance_loc;
+ case DW_CFA_advance_loc4:
+ operand = read_4ubyte_unaligned_inc (cache, program);
+ goto advance_loc;
+ case DW_CFA_MIPS_advance_loc8:
+ operand = read_8ubyte_unaligned_inc (cache, program);
+ goto advance_loc;
+
+ case DW_CFA_set_loc:
+ if (likely (!read_encoded_value (cache, cie->fde_encoding,
+ &program, &loc)))
+ break;
+ result = INTUSE(dwarf_errno) ();
+ goto out;
+
+ /* Now all following cases affect this row, but do not touch LOC.
+ These cases end with 'continue'. We only get out of the
+ switch block for the row-copying (LOC-moving) cases above. */
+
+ case DW_CFA_def_cfa:
+ get_uleb128 (operand, program);
+ get_uleb128 (offset, program);
+ def_cfa:
+ fs->cfa_rule = cfa_offset;
+ fs->cfa_val_reg = operand;
+ fs->cfa_val_offset = offset;
+ /* Prime the rest of the Dwarf_Op so dwarf_frame_cfa can use it. */
+ fs->cfa_data.offset.atom = DW_OP_bregx;
+ fs->cfa_data.offset.offset = 0;
+ continue;
+
+ case DW_CFA_def_cfa_register:
+ get_uleb128 (regno, program);
+ require_cfa_offset ();
+ fs->cfa_val_reg = regno;
+ continue;
+
+ case DW_CFA_def_cfa_sf:
+ get_uleb128 (operand, program);
+ get_sleb128 (sf_offset, program);
+ offset = sf_offset * cie->data_alignment_factor;
+ goto def_cfa;
+
+ case DW_CFA_def_cfa_offset:
+ get_uleb128 (offset, program);
+ def_cfa_offset:
+ require_cfa_offset ();
+ fs->cfa_val_offset = offset;
+ continue;
+
+ case DW_CFA_def_cfa_offset_sf:
+ get_sleb128 (sf_offset, program);
+ offset = sf_offset * cie->data_alignment_factor;
+ goto def_cfa_offset;
+
+ case DW_CFA_def_cfa_expression:
+ /* DW_FORM_block is a ULEB128 length followed by that many bytes. */
+ get_uleb128 (operand, program);
+ cfi_assert (operand <= (Dwarf_Word) (end - program));
+ fs->cfa_rule = cfa_expr;
+ fs->cfa_data.expr.data = (unsigned char *) program;
+ fs->cfa_data.expr.length = operand;
+ program += operand;
+ continue;
+
+ case DW_CFA_undefined:
+ get_uleb128 (regno, program);
+ register_rule (regno, undefined, 0);
+ continue;
+
+ case DW_CFA_same_value:
+ get_uleb128 (regno, program);
+ register_rule (regno, same_value, 0);
+ continue;
+
+ case DW_CFA_offset_extended:
+ get_uleb128 (operand, program);
+ case DW_CFA_offset + 0 ... DW_CFA_offset + CFI_PRIMARY_MAX:
+ get_uleb128 (offset, program);
+ offset *= cie->data_alignment_factor;
+ offset_extended:
+ register_rule (operand, offset, offset);
+ continue;
+
+ case DW_CFA_offset_extended_sf:
+ get_uleb128 (operand, program);
+ get_sleb128 (sf_offset, program);
+ offset_extended_sf:
+ offset = sf_offset * cie->data_alignment_factor;
+ goto offset_extended;
+
+ case DW_CFA_GNU_negative_offset_extended:
+ /* GNU extension obsoleted by DW_CFA_offset_extended_sf. */
+ get_uleb128 (operand, program);
+ get_uleb128 (offset, program);
+ sf_offset = -offset;
+ goto offset_extended_sf;
+
+ case DW_CFA_val_offset:
+ get_uleb128 (operand, program);
+ get_uleb128 (offset, program);
+ offset *= cie->data_alignment_factor;
+ val_offset:
+ register_rule (operand, val_offset, offset);
+ continue;
+
+ case DW_CFA_val_offset_sf:
+ get_uleb128 (operand, program);
+ get_sleb128 (sf_offset, program);
+ offset = sf_offset * cie->data_alignment_factor;
+ goto val_offset;
+
+ case DW_CFA_register:
+ get_uleb128 (regno, program);
+ get_uleb128 (operand, program);
+ register_rule (regno, register, operand);
+ continue;
+
+ case DW_CFA_expression:
+ 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. */
+ get_uleb128 (operand, program);
+ cfi_assert (operand <= (Dwarf_Word) (end - program));
+ program += operand;
+ register_rule (regno, expression, offset);
+ continue;
+
+ case DW_CFA_val_expression:
+ 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;
+ get_uleb128 (operand, program);
+ cfi_assert (operand <= (Dwarf_Word) (end - program));
+ program += operand;
+ register_rule (regno, val_expression, offset);
+ continue;
+
+ case DW_CFA_restore_extended:
+ get_uleb128 (operand, program);
+ case DW_CFA_restore + 0 ... DW_CFA_restore + CFI_PRIMARY_MAX:
+
+ if (unlikely (abi_cfi) && likely (opcode == DW_CFA_restore))
+ {
+ /* Special case hack to give backend abi_cfi a shorthand. */
+ cache->default_same_value = true;
+ continue;
+ }
+
+ /* This can't be used in the CIE's own initial instructions. */
+ cfi_assert (cie->initial_state != NULL);
+
+ /* Restore the CIE's initial rule for this register. */
+ if (unlikely (! enough_registers (operand)))
+ goto out;
+ if (cie->initial_state->nregs > operand)
+ fs->regs[operand] = cie->initial_state->regs[operand];
+ else
+ fs->regs[operand].rule = reg_unspecified;
+ continue;
+
+ case DW_CFA_remember_state:
+ {
+ /* Duplicate the state and chain the copy on. */
+ Dwarf_Frame *copy = duplicate_frame_state (fs, fs);
+ if (unlikely (copy == NULL))
+ {
+ result = DWARF_E_NOMEM;
+ goto out;
+ }
+ fs = copy;
+ continue;
+ }
+
+ case DW_CFA_restore_state:
+ {
+ /* Pop the current state off and use the old one instead. */
+ Dwarf_Frame *prev = fs->prev;
+ cfi_assert (prev != NULL);
+ free (fs);
+ fs = prev;
+ continue;
+ }
+
+ case DW_CFA_nop:
+ continue;
+
+ case DW_CFA_GNU_window_save:
+ /* This is magic shorthand used only by SPARC. It's equivalent
+ to a bunch of DW_CFA_register and DW_CFA_offset operations. */
+ if (unlikely (! enough_registers (31)))
+ goto out;
+ for (regno = 8; regno < 16; ++regno)
+ {
+ /* Find each %oN in %iN. */
+ fs->regs[regno].rule = reg_register;
+ fs->regs[regno].value = regno + 16;
+ }
+ unsigned int address_size = (cache->e_ident[EI_CLASS] == ELFCLASS32
+ ? 4 : 8);
+ for (; regno < 32; ++regno)
+ {
+ /* Find %l0..%l7 and %i0..%i7 in a block at the CFA. */
+ fs->regs[regno].rule = reg_offset;
+ fs->regs[regno].value = (regno - 16) * address_size;
+ }
+ continue;
+
+ case DW_CFA_GNU_args_size:
+ /* XXX is this useful for anything? */
+ get_uleb128 (operand, program);
+ continue;
+
+ default:
+ cfi_assert (false);
+ continue;
+ }
+
+ /* We get here only for the cases that have just moved LOC. */
+ if (find_pc >= loc)
+ /* This advance has not yet reached FIND_PC. */
+ fs->start = loc;
+ else
+ {
+ /* We have just advanced past the address we're looking for.
+ The state currently described is what we want to see. */
+ fs->end = loc;
+ break;
+ }
+ }
+
+ /* "The end of the instruction stream can be thought of as a
+ DW_CFA_set_loc (initial_location + address_range) instruction."
+ (DWARF 3.0 Section 6.4.3)
+
+ When we fall off the end of the program without an advance_loc/set_loc
+ that put us past FIND_PC, the final state left by the FDE program
+ applies to this address (the caller ensured it was inside the FDE).
+ This address (FDE->end) is already in FS->end as set by the caller. */
+
+#undef register_rule
+#undef cfi_assert
+
+ out:
+
+ /* Pop any remembered states left on the stack. */
+ while (fs->prev != NULL)
+ {
+ Dwarf_Frame *prev = fs->prev;
+ fs->prev = prev->prev;
+ free (prev);
+ }
+
+ if (likely (result == DWARF_E_NOERROR))
+ *state = fs;
+ else
+ free (fs);
+
+ return result;
+}
+
+static int
+cie_cache_initial_state (Dwarf_CFI *cache, struct dwarf_cie *cie)
+{
+ int result = DWARF_E_NOERROR;
+
+ if (likely (cie->initial_state != NULL))
+ return result;
+
+ /* This CIE has not been used before. Play out its initial
+ instructions and cache the initial state that results.
+ First we'll let the backend fill in the default initial
+ state for this machine's ABI. */
+
+ Dwarf_CIE abi_info = { DW_CIE_ID_64, NULL, NULL, 1, 1, -1, "", NULL, 0, 0 };
+
+ /* Make sure we have a backend handle cached. */
+ if (unlikely (cache->ebl == NULL))
+ {
+ cache->ebl = ebl_openbackend (cache->data->s->elf);
+ if (unlikely (cache->ebl == NULL))
+ cache->ebl = (void *) -1l;
+ }
+
+ /* Fetch the ABI's default CFI program. */
+ if (likely (cache->ebl != (void *) -1l)
+ && unlikely (ebl_abi_cfi (cache->ebl, &abi_info) < 0))
+ return DWARF_E_UNKNOWN_ERROR;
+
+ Dwarf_Frame *cie_fs = calloc (1, sizeof (Dwarf_Frame));
+ if (unlikely (cie_fs == NULL))
+ return DWARF_E_NOMEM;
+
+ /* If the default state of any register is not "undefined"
+ (i.e. call-clobbered), then the backend supplies instructions
+ for the standard initial state. */
+ if (abi_info.initial_instructions_end > abi_info.initial_instructions)
+ {
+ /* Dummy CIE for backend's instructions. */
+ struct dwarf_cie abi_cie =
+ {
+ .code_alignment_factor = abi_info.code_alignment_factor,
+ .data_alignment_factor = abi_info.data_alignment_factor,
+ };
+ result = execute_cfi (cache, &abi_cie, &cie_fs,
+ abi_info.initial_instructions,
+ abi_info.initial_instructions_end, true,
+ 0, (Dwarf_Addr) -1l);
+ }
+
+ /* Now run the CIE's initial instructions. */
+ if (cie->initial_instructions_end > cie->initial_instructions
+ && likely (result == DWARF_E_NOERROR))
+ result = execute_cfi (cache, cie, &cie_fs,
+ cie->initial_instructions,
+ cie->initial_instructions_end, false,
+ 0, (Dwarf_Addr) -1l);
+
+ if (likely (result == DWARF_E_NOERROR))
+ {
+ /* Now we have the initial state of things that all
+ FDEs using this CIE will start from. */
+ cie_fs->cache = cache;
+ cie->initial_state = cie_fs;
+ }
+
+ return result;
+}
+
+int
+internal_function
+__libdw_frame_at_address (Dwarf_CFI *cache, struct dwarf_fde *fde,
+ Dwarf_Addr address, Dwarf_Frame **frame)
+{
+ int result = cie_cache_initial_state (cache, fde->cie);
+ if (likely (result == DWARF_E_NOERROR))
+ {
+ Dwarf_Frame *fs = duplicate_frame_state (fde->cie->initial_state, NULL);
+ if (unlikely (fs == NULL))
+ return DWARF_E_NOMEM;
+
+ fs->fde = fde;
+ fs->start = fde->start;
+ fs->end = fde->end;
+
+ result = execute_cfi (cache, fde->cie, &fs,
+ fde->instructions, fde->instructions_end, false,
+ fde->start, address);
+ if (likely (result == DWARF_E_NOERROR))
+ *frame = fs;
+ }
+ return result;
+}
diff --git a/libdw/cfi.h b/libdw/cfi.h
new file mode 100644
index 00000000..e04e76dd
--- /dev/null
+++ b/libdw/cfi.h
@@ -0,0 +1,253 @@
+/* Internal definitions for libdw CFI interpreter.
+ Copyright (C) 2009-2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifndef _UNWINDP_H
+#define _UNWINDP_H 1
+
+#include "libdwP.h"
+#include "libelfP.h"
+struct ebl;
+
+#define dwarf_cfi_cie_p(entry) ((entry)->cie.CIE_id == DW_CIE_ID_64)
+
+/* Cached CIE representation. */
+struct dwarf_cie
+{
+ Dwarf_Off offset; /* Our position, as seen in FDEs' CIE_pointer. */
+
+ Dwarf_Word code_alignment_factor;
+ Dwarf_Sword data_alignment_factor;
+ Dwarf_Word return_address_register;
+
+ size_t fde_augmentation_data_size;
+
+ // play out to initial state
+ const uint8_t *initial_instructions;
+ const uint8_t *initial_instructions_end;
+
+ const Dwarf_Frame *initial_state;
+
+ uint8_t fde_encoding; /* DW_EH_PE_* for addresses in FDEs. */
+ uint8_t lsda_encoding; /* DW_EH_PE_* for LSDA in FDE augmentation. */
+
+ bool sized_augmentation_data; /* Saw 'z': FDEs have self-sized data. */
+ bool signal_frame; /* Saw 'S': FDE is for a signal frame. */
+};
+
+/* Cached FDE representation. */
+struct dwarf_fde
+{
+ struct dwarf_cie *cie;
+
+ /* This FDE describes PC values in [start, end). */
+ Dwarf_Addr start;
+ Dwarf_Addr end;
+
+ const uint8_t *instructions;
+ const uint8_t *instructions_end;
+};
+
+/* This holds everything we cache about the CFI from each ELF file's
+ .debug_frame or .eh_frame section. */
+struct Dwarf_CFI_s
+{
+ /* Dwarf handle we came from. If null, this is .eh_frame data. */
+ Dwarf *dbg;
+#define CFI_IS_EH(cfi) ((cfi)->dbg == NULL)
+
+ /* Data of the .debug_frame or .eh_frame section. */
+ Elf_Data_Scn *data;
+ const unsigned char *e_ident; /* For EI_DATA and EI_CLASS. */
+
+ Dwarf_Addr frame_vaddr; /* DW_EH_PE_pcrel, address of frame section. */
+ Dwarf_Addr textrel; /* DW_EH_PE_textrel base address. */
+ Dwarf_Addr datarel; /* DW_EH_PE_datarel base address. */
+
+ /* Location of next unread entry in the section. */
+ Dwarf_Off next_offset;
+
+ /* Search tree for the CIEs, indexed by CIE_pointer (section offset). */
+ void *cie_tree;
+
+ /* Search tree for the FDEs, indexed by PC address. */
+ void *fde_tree;
+
+ /* Search tree for parsed DWARF expressions, indexed by raw pointer. */
+ void *expr_tree;
+
+ /* Backend hook. */
+ struct ebl *ebl;
+
+ /* Binary search table in .eh_frame_hdr section. */
+ const uint8_t *search_table;
+ Dwarf_Addr search_table_vaddr;
+ size_t search_table_entries;
+ uint8_t search_table_encoding;
+
+ /* True if the file has a byte order different from the host. */
+ bool other_byte_order;
+
+ /* Default rule for registers not previously mentioned
+ is same_value, not undefined. */
+ bool default_same_value;
+};
+
+
+enum dwarf_frame_rule
+ {
+ reg_unspecified, /* Uninitialized state. */
+ reg_undefined, /* DW_CFA_undefined */
+ reg_same_value, /* DW_CFA_same_value */
+ reg_offset, /* DW_CFA_offset_extended et al */
+ reg_val_offset, /* DW_CFA_val_offset et al */
+ reg_register, /* DW_CFA_register */
+ reg_expression, /* DW_CFA_expression */
+ reg_val_expression, /* DW_CFA_val_expression */
+ };
+
+/* This describes what we know about an individual register. */
+struct dwarf_frame_register
+{
+ enum dwarf_frame_rule rule:3;
+
+ /* The meaning of the value bits depends on the rule:
+
+ Rule Value
+ ---- -----
+ undefined unused
+ same_value unused
+ offset(N) N (register saved at CFA + value)
+ val_offset(N) N (register = CFA + value)
+ register(R) R (register = register #value)
+ expression(E) section offset of DW_FORM_block containing E
+ (register saved at address E computes)
+ val_expression(E) section offset of DW_FORM_block containing E
+ (register = value E computes)
+ */
+ 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. */
+struct Dwarf_Frame_s
+{
+ /* This frame description covers PC values in [start, end). */
+ Dwarf_Addr start;
+ Dwarf_Addr end;
+
+ Dwarf_CFI *cache;
+
+ /* Previous state saved by DW_CFA_remember_state, or .cie->initial_state,
+ or NULL in an initial_state pseudo-frame. */
+ Dwarf_Frame *prev;
+
+ /* The FDE that generated this frame state. This points to its CIE,
+ which has the return_address_register and signal_frame flag. */
+ struct dwarf_fde *fde;
+
+ /* The CFA is unknown, is R+N, or is computed by a DWARF expression.
+ A bogon in the CFI can indicate an invalid/incalculable rule.
+ We store that as cfa_invalid rather than barfing when processing it,
+ so callers can ignore the bogon unless they really need that CFA. */
+ enum { cfa_undefined, cfa_offset, cfa_expr, cfa_invalid } cfa_rule;
+ union
+ {
+ Dwarf_Op offset;
+ Dwarf_Block expr;
+ } cfa_data;
+ /* We store an offset rule as a DW_OP_bregx operation. */
+#define cfa_val_reg cfa_data.offset.number
+#define cfa_val_offset cfa_data.offset.number2
+
+ size_t nregs;
+ struct dwarf_frame_register regs[];
+};
+
+
+/* Clean up the data structure and all it points to. */
+extern void __libdw_destroy_frame_cache (Dwarf_CFI *cache)
+ __nonnull_attribute__ (1) internal_function;
+
+/* Enter a CIE encountered while reading through for FDEs. */
+extern void __libdw_intern_cie (Dwarf_CFI *cache, Dwarf_Off offset,
+ const Dwarf_CIE *info)
+ __nonnull_attribute__ (1, 3) internal_function;
+
+/* Look up a CIE_pointer for random access. */
+extern struct dwarf_cie *__libdw_find_cie (Dwarf_CFI *cache, Dwarf_Off offset)
+ __nonnull_attribute__ (1) internal_function;
+
+
+/* Look for an FDE covering the given PC address. */
+extern struct dwarf_fde *__libdw_find_fde (Dwarf_CFI *cache,
+ Dwarf_Addr address)
+ __nonnull_attribute__ (1) internal_function;
+
+/* Process the FDE that contains the given PC address,
+ to yield the frame state when stopped there.
+ The return value is a DWARF_E_* error code. */
+extern int __libdw_frame_at_address (Dwarf_CFI *cache, struct dwarf_fde *fde,
+ Dwarf_Addr address, Dwarf_Frame **frame)
+ __nonnull_attribute__ (1, 2, 4) internal_function;
+
+
+/* Dummy struct for memory-access.h macros. */
+#define BYTE_ORDER_DUMMY(var, e_ident) \
+ const struct { bool other_byte_order; } var = \
+ { ((BYTE_ORDER == LITTLE_ENDIAN && e_ident[EI_DATA] == ELFDATA2MSB) \
+ || (BYTE_ORDER == BIG_ENDIAN && e_ident[EI_DATA] == ELFDATA2LSB)) }
+
+
+INTDECL (dwarf_next_cfi)
+INTDECL (dwarf_getcfi)
+INTDECL (dwarf_getcfi_elf)
+INTDECL (dwarf_cfi_end)
+INTDECL (dwarf_cfi_addrframe)
+
+#endif /* unwindP.h */
diff --git a/libdw/cie.c b/libdw/cie.c
new file mode 100644
index 00000000..08752a6d
--- /dev/null
+++ b/libdw/cie.c
@@ -0,0 +1,193 @@
+/* CIE reading.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "cfi.h"
+#include "encoded-value.h"
+#include <search.h>
+#include <stdlib.h>
+
+
+static int
+compare_cie (const void *a, const void *b)
+{
+ const struct dwarf_cie *cie1 = a;
+ const struct dwarf_cie *cie2 = b;
+ if (cie1->offset < cie2->offset)
+ return -1;
+ if (cie1->offset > cie2->offset)
+ return 1;
+ return 0;
+}
+
+/* There is no CIE at OFFSET in the tree. Add it. */
+static struct dwarf_cie *
+intern_new_cie (Dwarf_CFI *cache, Dwarf_Off offset, const Dwarf_CIE *info)
+{
+ struct dwarf_cie *cie = malloc (sizeof (struct dwarf_cie));
+ if (cie == NULL)
+ {
+ __libdw_seterrno (DWARF_E_NOMEM);
+ return NULL;
+ }
+
+ cie->offset = offset;
+ cie->code_alignment_factor = info->code_alignment_factor;
+ cie->data_alignment_factor = info->data_alignment_factor;
+ cie->return_address_register = info->return_address_register;
+
+ cie->fde_augmentation_data_size = 0;
+ cie->sized_augmentation_data = false;
+ cie->signal_frame = false;
+
+ cie->fde_encoding = DW_EH_PE_absptr;
+ cie->lsda_encoding = DW_EH_PE_omit;
+
+ /* Grok the augmentation string and its data. */
+ const uint8_t *data = info->augmentation_data;
+ for (const char *ap = info->augmentation; *ap != '\0'; ++ap)
+ {
+ uint8_t encoding;
+ switch (*ap)
+ {
+ case 'z':
+ cie->sized_augmentation_data = true;
+ continue;
+
+ case 'S':
+ cie->signal_frame = true;
+ continue;
+
+ case 'L': /* LSDA pointer encoding byte. */
+ cie->lsda_encoding = *data++;
+ if (!cie->sized_augmentation_data)
+ cie->fde_augmentation_data_size
+ += encoded_value_size (&cache->data->d, cache->e_ident,
+ cie->lsda_encoding, NULL);
+ continue;
+
+ case 'R': /* FDE address encoding byte. */
+ cie->fde_encoding = *data++;
+ continue;
+
+ case 'P': /* Skip personality routine. */
+ encoding = *data++;
+ data += encoded_value_size (&cache->data->d, cache->e_ident,
+ encoding, data);
+ continue;
+
+ default:
+ /* Unknown augmentation string. If we have 'z' we can ignore it,
+ otherwise we must bail out. */
+ if (cie->sized_augmentation_data)
+ continue;
+ }
+ /* We only get here when we need to bail out. */
+ break;
+ }
+
+ /* Save the initial instructions to be played out into initial state. */
+ cie->initial_instructions = info->initial_instructions;
+ cie->initial_instructions_end = info->initial_instructions_end;
+ cie->initial_state = NULL;
+
+ /* Add the new entry to the search tree. */
+ if (tsearch (cie, &cache->cie_tree, &compare_cie) == NULL)
+ {
+ free (cie);
+ __libdw_seterrno (DWARF_E_NOMEM);
+ return NULL;
+ }
+
+ return cie;
+}
+
+/* Look up a CIE_pointer for random access. */
+struct dwarf_cie *
+internal_function
+__libdw_find_cie (Dwarf_CFI *cache, Dwarf_Off offset)
+{
+ const struct dwarf_cie cie_key = { .offset = offset };
+ struct dwarf_cie **found = tfind (&cie_key, &cache->cie_tree, &compare_cie);
+ if (found != NULL)
+ return *found;
+
+ /* We have not read this CIE yet. Go find it. */
+ Dwarf_Off next_offset = offset;
+ Dwarf_CFI_Entry entry;
+ int result = INTUSE(dwarf_next_cfi) (cache->e_ident,
+ &cache->data->d, CFI_IS_EH (cache),
+ offset, &next_offset, &entry);
+ if (result != 0 || entry.cie.CIE_id != DW_CIE_ID_64)
+ {
+ __libdw_seterrno (DWARF_E_INVALID_DWARF);
+ return NULL;
+ }
+
+ /* If this happened to be what we would have read next, notice it. */
+ if (cache->next_offset == offset)
+ cache->next_offset = next_offset;
+
+ return intern_new_cie (cache, offset, &entry.cie);
+}
+
+/* Enter a CIE encountered while reading through for FDEs. */
+void
+internal_function
+__libdw_intern_cie (Dwarf_CFI *cache, Dwarf_Off offset, const Dwarf_CIE *info)
+{
+ const struct dwarf_cie cie_key = { .offset = offset };
+ struct dwarf_cie **found = tfind (&cie_key, &cache->cie_tree, &compare_cie);
+ if (found == NULL)
+ /* We have not read this CIE yet. Enter it. */
+ (void) intern_new_cie (cache, offset, info);
+}
diff --git a/libdw/dwarf.h b/libdw/dwarf.h
index 4b763ffa..aefc1a79 100644
--- a/libdw/dwarf.h
+++ b/libdw/dwarf.h
@@ -1,5 +1,5 @@
/* This file defines standard DWARF types, structures, and macros.
- Copyright (C) 2000, 2002, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2000-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -111,6 +111,8 @@ enum
DW_TAG_mutable_type = 0x3e,
DW_TAG_condition = 0x3f,
DW_TAG_shared_type = 0x40,
+ DW_TAG_type_unit = 0x41,
+ DW_TAG_rvalue_reference_type = 0x42,
DW_TAG_lo_user = 0x4080,
DW_TAG_MIPS_loop = 0x4081,
DW_TAG_format_label = 0x4101,
@@ -220,8 +222,13 @@ enum
DW_AT_elemental = 0x66,
DW_AT_pure = 0x67,
DW_AT_recursive = 0x68,
+ DW_AT_signature = 0x69,
+ DW_AT_main_subprogram = 0x6a,
+ DW_AT_data_bit_offset = 0x6b,
+ DW_AT_const_expr = 0x6c,
DW_AT_lo_user = 0x2000,
+
DW_AT_MIPS_fde = 0x2001,
DW_AT_MIPS_loop_begin = 0x2002,
DW_AT_MIPS_tail_loop_begin = 0x2003,
@@ -239,12 +246,25 @@ enum
DW_AT_MIPS_allocatable_dopetype = 0x200f,
DW_AT_MIPS_assumed_shape_dopetype = 0x2010,
DW_AT_MIPS_assumed_size = 0x2011,
+
+ /* GNU extensions. */
DW_AT_sf_names = 0x2101,
DW_AT_src_info = 0x2102,
DW_AT_mac_info = 0x2103,
DW_AT_src_coords = 0x2104,
DW_AT_body_begin = 0x2105,
DW_AT_body_end = 0x2106,
+ DW_AT_GNU_vector = 0x2107,
+ DW_AT_GNU_guarded_by = 0x2108,
+ DW_AT_GNU_pt_guarded_by = 0x2109,
+ DW_AT_GNU_guarded = 0x210a,
+ DW_AT_GNU_pt_guarded = 0x210b,
+ DW_AT_GNU_locks_excluded = 0x210c,
+ DW_AT_GNU_exclusive_locks_required = 0x210d,
+ DW_AT_GNU_shared_locks_required = 0x210e,
+ DW_AT_GNU_odr_signature = 0x210f,
+ DW_AT_GNU_template_name = 0x2110,
+
DW_AT_hi_user = 0x3fff
};
@@ -272,7 +292,11 @@ enum
DW_FORM_ref4 = 0x13,
DW_FORM_ref8 = 0x14,
DW_FORM_ref_udata = 0x15,
- DW_FORM_indirect = 0x16
+ DW_FORM_indirect = 0x16,
+ DW_FORM_sec_offset = 0x17,
+ DW_FORM_exprloc = 0x18,
+ DW_FORM_flag_present = 0x19,
+ DW_FORM_ref_sig8 = 0x20
};
@@ -431,6 +455,13 @@ enum
DW_OP_form_tls_address = 0x9b,/* TLS offset to address in current thread */
DW_OP_call_frame_cfa = 0x9c,/* CFA as determined by CFI. */
DW_OP_bit_piece = 0x9d, /* ULEB128 size and ULEB128 offset in bits. */
+ DW_OP_implicit_value = 0x9e, /* DW_FORM_block follows opcode. */
+ DW_OP_stack_value = 0x9f, /* No operands, special like DW_OP_piece. */
+
+ /* GNU extensions. */
+ DW_OP_GNU_push_tls_address = 0xe0,
+ DW_OP_GNU_uninit = 0xf0,
+ DW_OP_GNU_encoded_addr = 0xf1,
DW_OP_lo_user = 0xe0, /* Implementation-defined range start. */
DW_OP_hi_user = 0xff /* Implementation-defined range end. */
@@ -515,25 +546,25 @@ enum
/* DWARF language encodings. */
enum
{
- DW_LANG_C89 = 0x0001,
- DW_LANG_C = 0x0002,
- DW_LANG_Ada83 = 0x0003,
- DW_LANG_C_plus_plus = 0x0004,
- DW_LANG_Cobol74 = 0x0005,
- DW_LANG_Cobol85 = 0x0006,
- DW_LANG_Fortran77 = 0x0007,
- DW_LANG_Fortran90 = 0x0008,
- DW_LANG_Pascal83 = 0x0009,
- DW_LANG_Modula2 = 0x000a,
- DW_LANG_Java = 0x000b,
- DW_LANG_C99 = 0x000c,
- DW_LANG_Ada95 = 0x000d,
- DW_LANG_Fortran95 = 0x000e,
- DW_LANG_PL1 = 0x000f,
- DW_LANG_Objc = 0x0010,
- DW_LANG_ObjC_plus_plus = 0x0011,
- DW_LANG_UPC = 0x0012,
- DW_LANG_D = 0x0013,
+ DW_LANG_C89 = 0x0001, /* ISO C:1989 */
+ DW_LANG_C = 0x0002, /* C */
+ DW_LANG_Ada83 = 0x0003, /* ISO Ada:1983 */
+ DW_LANG_C_plus_plus = 0x0004, /* ISO C++:1998 */
+ DW_LANG_Cobol74 = 0x0005, /* ISO Cobol:1974 */
+ DW_LANG_Cobol85 = 0x0006, /* ISO Cobol:1985 */
+ DW_LANG_Fortran77 = 0x0007, /* ISO FORTRAN 77 */
+ DW_LANG_Fortran90 = 0x0008, /* ISO Fortran 90 */
+ DW_LANG_Pascal83 = 0x0009, /* ISO Pascal:1983 */
+ DW_LANG_Modula2 = 0x000a, /* ISO Modula-2:1996 */
+ DW_LANG_Java = 0x000b, /* Java */
+ DW_LANG_C99 = 0x000c, /* ISO C:1999 */
+ DW_LANG_Ada95 = 0x000d, /* ISO Ada:1995 */
+ DW_LANG_Fortran95 = 0x000e, /* ISO Fortran 95 */
+ DW_LANG_PL1 = 0x000f, /* ISO PL/1:1976 */
+ DW_LANG_Objc = 0x0010, /* Objective-C */
+ DW_LANG_ObjC_plus_plus = 0x0011, /* Objective-C++ */
+ DW_LANG_UPC = 0x0012, /* Unified Parallel C */
+ DW_LANG_D = 0x0013, /* D */
DW_LANG_lo_user = 0x8000,
DW_LANG_Mips_Assembler = 0x8001,
@@ -665,11 +696,62 @@ enum
DW_CFA_MIPS_advance_loc8 = 0x1d,
DW_CFA_GNU_window_save = 0x2d,
DW_CFA_GNU_args_size = 0x2e,
+ DW_CFA_GNU_negative_offset_extended = 0x2f,
DW_CFA_high_user = 0x3f
};
+/* ID indicating CIE as opposed to FDE in .debug_frame. */
+enum
+ {
+ DW_CIE_ID_32 = 0xffffffffU, /* In 32-bit format CIE header. */
+ DW_CIE_ID_64 = 0xffffffffffffffffULL /* In 64-bit format CIE header. */
+ };
+
+
+/* Information for GNU unwind information. */
+enum
+ {
+ DW_EH_PE_absptr = 0x00,
+ DW_EH_PE_omit = 0xff,
+
+ /* FDE data encoding. */
+ DW_EH_PE_uleb128 = 0x01,
+ DW_EH_PE_udata2 = 0x02,
+ DW_EH_PE_udata4 = 0x03,
+ DW_EH_PE_udata8 = 0x04,
+ DW_EH_PE_sleb128 = 0x09,
+ DW_EH_PE_sdata2 = 0x0a,
+ DW_EH_PE_sdata4 = 0x0b,
+ DW_EH_PE_sdata8 = 0x0c,
+ DW_EH_PE_signed = 0x08,
+
+ /* FDE flags. */
+ DW_EH_PE_pcrel = 0x10,
+ DW_EH_PE_textrel = 0x20,
+ DW_EH_PE_datarel = 0x30,
+ DW_EH_PE_funcrel = 0x40,
+ DW_EH_PE_aligned = 0x50,
+
+ DW_EH_PE_indirect = 0x80
+ };
+
/* DWARF XXX. */
#define DW_ADDR_none 0
+/* Section 7.2.2 of the DWARF3 specification defines a range of escape
+ codes that can appear in the length field of certain DWARF structures.
+
+ These defines enumerate the minium and maximum values of this range.
+ Currently only the maximum value is used (to indicate that 64-bit
+ values are going to be used in the dwarf data that accompanies the
+ structure). The other values are reserved.
+
+ Note: There is a typo in DWARF3 spec (published Dec 20, 2005). In
+ sections 7.4, 7.5.1, 7.19, 7.20 the minimum escape code is referred to
+ as 0xffffff00 whereas in fact it should be 0xfffffff0. */
+#define DWARF3_LENGTH_MIN_ESCAPE_CODE 0xfffffff0u
+#define DWARF3_LENGTH_MAX_ESCAPE_CODE 0xffffffffu
+#define DWARF3_LENGTH_64_BIT DWARF3_LENGTH_MAX_ESCAPE_CODE
+
#endif /* dwarf.h */
diff --git a/libdw/dwarf_aggregate_size.c b/libdw/dwarf_aggregate_size.c
new file mode 100644
index 00000000..e7420141
--- /dev/null
+++ b/libdw/dwarf_aggregate_size.c
@@ -0,0 +1,243 @@
+/* Compute size of an aggregate type from DWARF.
+ Copyright (C) 2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <dwarf.h>
+#include "libdwP.h"
+
+
+static Dwarf_Die *
+get_type (Dwarf_Die *die, Dwarf_Attribute *attr_mem, Dwarf_Die *type_mem)
+{
+ return INTUSE(dwarf_formref_die)
+ (INTUSE(dwarf_attr_integrate) (die, DW_AT_type, attr_mem), type_mem);
+}
+
+static int
+array_size (Dwarf_Die *die, Dwarf_Word *size,
+ Dwarf_Attribute *attr_mem, Dwarf_Die *type_mem)
+{
+ Dwarf_Word eltsize;
+ if (INTUSE(dwarf_aggregate_size) (get_type (die, attr_mem, type_mem),
+ &eltsize) != 0)
+ return -1;
+
+ /* An array can have DW_TAG_subrange_type or DW_TAG_enumeration_type
+ children instead that give the size of each dimension. */
+
+ Dwarf_Die child;
+ if (INTUSE(dwarf_child) (die, &child) != 0)
+ return -1;
+
+ bool any = false;
+ Dwarf_Word total = 0;
+ do
+ {
+ Dwarf_Word count;
+ switch (INTUSE(dwarf_tag) (&child))
+ {
+ case DW_TAG_subrange_type:
+ /* This has either DW_AT_count or DW_AT_upper_bound. */
+ if (INTUSE(dwarf_attr_integrate) (&child, DW_AT_count,
+ attr_mem) != NULL)
+ {
+ if (INTUSE(dwarf_formudata) (attr_mem, &count) != 0)
+ return -1;
+ }
+ else
+ {
+ Dwarf_Sword upper;
+ Dwarf_Sword lower;
+ if (INTUSE(dwarf_formsdata) (INTUSE(dwarf_attr_integrate)
+ (&child, DW_AT_upper_bound,
+ attr_mem), &upper) != 0)
+ return -1;
+
+ /* Having DW_AT_lower_bound is optional. */
+ if (INTUSE(dwarf_attr_integrate) (&child, DW_AT_lower_bound,
+ attr_mem) != NULL)
+ {
+ if (INTUSE(dwarf_formsdata) (attr_mem, &lower) != 0)
+ return -1;
+ }
+ else
+ {
+ /* Determine default lower bound from language,
+ as per "4.12 Subrange Type Entries". */
+ Dwarf_Die cu = CUDIE (die->cu);
+ switch (INTUSE(dwarf_srclang) (&cu))
+ {
+ case DW_LANG_C:
+ case DW_LANG_C89:
+ case DW_LANG_C99:
+ case DW_LANG_C_plus_plus:
+ case DW_LANG_Objc:
+ case DW_LANG_ObjC_plus_plus:
+ case DW_LANG_Java:
+ case DW_LANG_D:
+ case DW_LANG_UPC:
+ lower = 0;
+ break;
+
+ case DW_LANG_Ada83:
+ case DW_LANG_Ada95:
+ case DW_LANG_Cobol74:
+ case DW_LANG_Cobol85:
+ case DW_LANG_Fortran77:
+ case DW_LANG_Fortran90:
+ case DW_LANG_Fortran95:
+ case DW_LANG_Pascal83:
+ case DW_LANG_Modula2:
+ case DW_LANG_PL1:
+ lower = 1;
+ break;
+
+ default:
+ return -1;
+ }
+ }
+ if (unlikely (lower > upper))
+ return -1;
+ count = upper - lower + 1;
+ }
+ break;
+
+ case DW_TAG_enumeration_type:
+ /* We have to find the DW_TAG_enumerator child with the
+ highest value to know the array's element count. */
+ count = 0;
+ Dwarf_Die enum_child;
+ int has_children = INTUSE(dwarf_child) (die, &enum_child);
+ if (has_children < 0)
+ return -1;
+ if (has_children > 0)
+ do
+ if (INTUSE(dwarf_tag) (&enum_child) == DW_TAG_enumerator)
+ {
+ Dwarf_Word value;
+ if (INTUSE(dwarf_formudata) (INTUSE(dwarf_attr_integrate)
+ (&enum_child, DW_AT_const_value,
+ attr_mem), &value) != 0)
+ return -1;
+ if (value >= count)
+ count = value + 1;
+ }
+ while (INTUSE(dwarf_siblingof) (&enum_child, &enum_child) > 0);
+ break;
+
+ default:
+ continue;
+ }
+
+ /* This is a subrange_type or enumeration_type and we've set COUNT.
+ Now determine the stride for this array dimension. */
+ Dwarf_Word stride = eltsize;
+ if (INTUSE(dwarf_attr_integrate) (&child, DW_AT_byte_stride,
+ attr_mem) != NULL)
+ {
+ if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0)
+ return -1;
+ }
+ else if (INTUSE(dwarf_attr_integrate) (&child, DW_AT_bit_stride,
+ attr_mem) != NULL)
+ {
+ if (INTUSE(dwarf_formudata) (attr_mem, &stride) != 0)
+ return -1;
+ if (stride % 8) /* XXX maybe compute in bits? */
+ return -1;
+ stride /= 8;
+ }
+
+ any = true;
+ total += stride * count;
+ }
+ while (INTUSE(dwarf_siblingof) (&child, &child) == 0);
+
+ if (!any)
+ return -1;
+
+ *size = total;
+ return 0;
+}
+
+static int
+aggregate_size (Dwarf_Die *die, Dwarf_Word *size, Dwarf_Die *type_mem)
+{
+ Dwarf_Attribute attr_mem;
+
+ if (INTUSE(dwarf_attr_integrate) (die, DW_AT_byte_size, &attr_mem) != NULL)
+ return INTUSE(dwarf_formudata) (&attr_mem, size);
+
+ switch (INTUSE(dwarf_tag) (die))
+ {
+ case DW_TAG_typedef:
+ case DW_TAG_subrange_type:
+ return aggregate_size (get_type (die, &attr_mem, type_mem),
+ size, type_mem); /* Tail call. */
+
+ case DW_TAG_array_type:
+ return array_size (die, size, &attr_mem, type_mem);
+ }
+
+ /* Most types must give their size directly. */
+ return -1;
+}
+
+int
+dwarf_aggregate_size (die, size)
+ Dwarf_Die *die;
+ Dwarf_Word *size;
+{
+ Dwarf_Die type_mem;
+ return aggregate_size (die, size, &type_mem);
+}
+INTDEF (dwarf_aggregate_size)
diff --git a/libdw/dwarf_arrayorder.c b/libdw/dwarf_arrayorder.c
index 6d5a42d7..4929fb3c 100644
--- a/libdw/dwarf_arrayorder.c
+++ b/libdw/dwarf_arrayorder.c
@@ -1,5 +1,5 @@
/* Return array order attribute of DIE.
- Copyright (C) 2003, 2005 Red Hat, Inc.
+ Copyright (C) 2003, 2005, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2003.
@@ -63,7 +63,9 @@ dwarf_arrayorder (die)
Dwarf_Attribute attr_mem;
Dwarf_Word value;
- return INTUSE(dwarf_formudata) (INTUSE(dwarf_attr) (die, DW_AT_ordering,
- &attr_mem),
+ return INTUSE(dwarf_formudata) (INTUSE(dwarf_attr_integrate)
+ (die, DW_AT_ordering, &attr_mem),
&value) == 0 ? (int) value : -1;
}
+OLD_VERSION (dwarf_arrayorder, ELFUTILS_0.122)
+NEW_VERSION (dwarf_arrayorder, ELFUTILS_0.143)
diff --git a/libdw/dwarf_begin_elf.c b/libdw/dwarf_begin_elf.c
index aaac3999..391a8b85 100644
--- a/libdw/dwarf_begin_elf.c
+++ b/libdw/dwarf_begin_elf.c
@@ -1,5 +1,5 @@
/* Create descriptor from ELF descriptor for processing file.
- Copyright (C) 2002, 2003, 2004, 2005, 2007 Red Hat, Inc.
+ Copyright (C) 2002, 2003, 2004, 2005, 2007, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -70,7 +70,6 @@ static const char dwarf_scnnames[IDX_last][17] =
[IDX_debug_aranges] = ".debug_aranges",
[IDX_debug_line] = ".debug_line",
[IDX_debug_frame] = ".debug_frame",
- [IDX_eh_frame] = ".eh_frame",
[IDX_debug_loc] = ".debug_loc",
[IDX_debug_pubnames] = ".debug_pubnames",
[IDX_debug_str] = ".debug_str",
diff --git a/libdw/dwarf_bitoffset.c b/libdw/dwarf_bitoffset.c
index 235b7ee6..3ab14683 100644
--- a/libdw/dwarf_bitoffset.c
+++ b/libdw/dwarf_bitoffset.c
@@ -1,5 +1,5 @@
/* Return bit offset attribute of DIE.
- Copyright (C) 2003, 2005 Red Hat, Inc.
+ Copyright (C) 2003, 2005, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2003.
@@ -63,7 +63,9 @@ dwarf_bitoffset (die)
Dwarf_Attribute attr_mem;
Dwarf_Word value;
- return INTUSE(dwarf_formudata) (INTUSE(dwarf_attr) (die, DW_AT_bit_offset,
- &attr_mem),
+ return INTUSE(dwarf_formudata) (INTUSE(dwarf_attr_integrate)
+ (die, DW_AT_bit_offset, &attr_mem),
&value) == 0 ? (int) value : -1;
}
+OLD_VERSION (dwarf_bitoffset, ELFUTILS_0.122)
+NEW_VERSION (dwarf_bitoffset, ELFUTILS_0.143)
diff --git a/libdw/dwarf_bitsize.c b/libdw/dwarf_bitsize.c
index 57d7fba0..67d97dc1 100644
--- a/libdw/dwarf_bitsize.c
+++ b/libdw/dwarf_bitsize.c
@@ -1,5 +1,5 @@
/* Return bit size attribute of DIE.
- Copyright (C) 2003, 2005 Red Hat, Inc.
+ Copyright (C) 2003, 2005, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2003.
@@ -63,7 +63,9 @@ dwarf_bitsize (die)
Dwarf_Attribute attr_mem;
Dwarf_Word value;
- return INTUSE(dwarf_formudata) (INTUSE(dwarf_attr) (die, DW_AT_bit_size,
- &attr_mem),
+ return INTUSE(dwarf_formudata) (INTUSE(dwarf_attr_integrate)
+ (die, DW_AT_bit_size, &attr_mem),
&value) == 0 ? (int) value : -1;
}
+OLD_VERSION (dwarf_bitsize, ELFUTILS_0.122)
+NEW_VERSION (dwarf_bitsize, ELFUTILS_0.143)
diff --git a/libdw/dwarf_bytesize.c b/libdw/dwarf_bytesize.c
index 635a3c16..2f2e1985 100644
--- a/libdw/dwarf_bytesize.c
+++ b/libdw/dwarf_bytesize.c
@@ -1,5 +1,5 @@
/* Return byte size attribute of DIE.
- Copyright (C) 2003, 2005 Red Hat, Inc.
+ Copyright (C) 2003, 2005, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2003.
@@ -63,7 +63,9 @@ dwarf_bytesize (die)
Dwarf_Attribute attr_mem;
Dwarf_Word value;
- return INTUSE(dwarf_formudata) (INTUSE(dwarf_attr) (die, DW_AT_byte_size,
- &attr_mem),
+ return INTUSE(dwarf_formudata) (INTUSE(dwarf_attr_integrate)
+ (die, DW_AT_byte_size, &attr_mem),
&value) == 0 ? (int) value : -1;
}
+OLD_VERSION (dwarf_bytesize, ELFUTILS_0.122)
+NEW_VERSION (dwarf_bytesize, ELFUTILS_0.143)
diff --git a/libdw/dwarf_cfi_addrframe.c b/libdw/dwarf_cfi_addrframe.c
new file mode 100644
index 00000000..79d0e125
--- /dev/null
+++ b/libdw/dwarf_cfi_addrframe.c
@@ -0,0 +1,78 @@
+/* Compute frame state at PC.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "cfi.h"
+
+int
+dwarf_cfi_addrframe (cache, address, frame)
+ Dwarf_CFI *cache;
+ Dwarf_Addr address;
+ Dwarf_Frame **frame;
+{
+ /* Maybe there was a previous error. */
+ if (cache == NULL)
+ return -1;
+
+ struct dwarf_fde *fde = __libdw_find_fde (cache, address);
+ if (fde == NULL)
+ return -1;
+
+ int error = __libdw_frame_at_address (cache, fde, address, frame);
+ if (error != DWARF_E_NOERROR)
+ {
+ __libdw_seterrno (error);
+ return -1;
+ }
+ return 0;
+}
+INTDEF (dwarf_cfi_addrframe)
diff --git a/libdw/dwarf_cfi_end.c b/libdw/dwarf_cfi_end.c
new file mode 100644
index 00000000..5591e2a9
--- /dev/null
+++ b/libdw/dwarf_cfi_end.c
@@ -0,0 +1,70 @@
+/* Clean up Dwarf_CFI structure.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libdwP.h"
+#include "cfi.h"
+#include <stdlib.h>
+
+int
+dwarf_cfi_end (cache)
+ Dwarf_CFI *cache;
+{
+ if (cache != NULL)
+ {
+ __libdw_destroy_frame_cache (cache);
+ free (cache);
+ }
+
+ return 0;
+}
+INTDEF (dwarf_cfi_end)
diff --git a/libdw/dwarf_child.c b/libdw/dwarf_child.c
index b22b010e..0080cf9d 100644
--- a/libdw/dwarf_child.c
+++ b/libdw/dwarf_child.c
@@ -1,5 +1,5 @@
-/* Return vhild of current DIE.
- Copyright (C) 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
+/* Return child of current DIE.
+ Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2003.
@@ -77,10 +77,11 @@ __libdw_find_attr (Dwarf_Die *die, unsigned int search_name,
if (abbrevp == NULL)
{
abbrevp = __libdw_findabbrev (die->cu, abbrev_code);
- die->abbrev = abbrevp ?: (Dwarf_Abbrev *) -1l;
+ die->abbrev = abbrevp ?: DWARF_END_ABBREV;
}
- if (unlikely (die->abbrev == (Dwarf_Abbrev *) -1l))
+ if (unlikely (die->abbrev == DWARF_END_ABBREV))
{
+ invalid_dwarf:
__libdw_seterrno (DWARF_E_INVALID_DWARF);
return NULL;
}
@@ -95,10 +96,7 @@ __libdw_find_attr (Dwarf_Die *die, unsigned int search_name,
{
/* Are we still in bounds? This test needs to be refined. */
if (unlikely (attrp + 1 >= endp))
- {
- __libdw_seterrno (DWARF_E_INVALID_DWARF);
- return NULL;
- }
+ goto invalid_dwarf;
/* Get attribute name and form.
@@ -163,10 +161,10 @@ dwarf_child (die, result)
void *addr = NULL;
/* If we already know there are no children do not search. */
- if (die->abbrev != (Dwarf_Abbrev *) -1
+ if (die->abbrev != DWARF_END_ABBREV
&& (die->abbrev == NULL || die->abbrev->has_children))
addr = __libdw_find_attr (die, INVALID, NULL, NULL);
- if (die->abbrev == (Dwarf_Abbrev *) -1l)
+ if (unlikely (die->abbrev == (Dwarf_Abbrev *) -1l))
return -1;
/* Make sure the DIE really has children. */
diff --git a/libdw/dwarf_decl_column.c b/libdw/dwarf_decl_column.c
index 5e0f3e0c..11ba5d74 100644
--- a/libdw/dwarf_decl_column.c
+++ b/libdw/dwarf_decl_column.c
@@ -1,5 +1,5 @@
/* Get column number of beginning of given declaration.
- Copyright (C) 2005 Red Hat, Inc.
+ Copyright (C) 2005-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2005.
@@ -61,3 +61,5 @@ dwarf_decl_column (Dwarf_Die *decl, int *colp)
{
return __libdw_attr_intval (decl, colp, DW_AT_decl_column);
}
+OLD_VERSION (dwarf_decl_column, ELFUTILS_0.122)
+NEW_VERSION (dwarf_decl_column, ELFUTILS_0.143)
diff --git a/libdw/dwarf_decl_file.c b/libdw/dwarf_decl_file.c
index b1d62df2..c81e35b8 100644
--- a/libdw/dwarf_decl_file.c
+++ b/libdw/dwarf_decl_file.c
@@ -1,5 +1,5 @@
/* Return file name containing definition of the given function.
- Copyright (C) 2005 Red Hat, Inc.
+ Copyright (C) 2005, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2005.
@@ -63,8 +63,9 @@ dwarf_decl_file (Dwarf_Die *die)
Dwarf_Attribute attr_mem;
Dwarf_Sword idx = 0;
- if (INTUSE(dwarf_formsdata) (INTUSE(dwarf_attr) (die, DW_AT_decl_file,
- &attr_mem), &idx) != 0)
+ if (INTUSE(dwarf_formsdata) (INTUSE(dwarf_attr_integrate)
+ (die, DW_AT_decl_file, &attr_mem),
+ &idx) != 0)
return NULL;
/* Zero means no source file information available. */
@@ -105,3 +106,5 @@ dwarf_decl_file (Dwarf_Die *die)
return cu->files->info[idx].name;
}
+OLD_VERSION (dwarf_decl_file, ELFUTILS_0.122)
+NEW_VERSION (dwarf_decl_file, ELFUTILS_0.143)
diff --git a/libdw/dwarf_decl_line.c b/libdw/dwarf_decl_line.c
index b4e3c42e..ab64e510 100644
--- a/libdw/dwarf_decl_line.c
+++ b/libdw/dwarf_decl_line.c
@@ -1,5 +1,5 @@
/* Get line number of beginning of given function.
- Copyright (C) 2005 Red Hat, Inc.
+ Copyright (C) 2005, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2005.
@@ -63,6 +63,8 @@ dwarf_decl_line (Dwarf_Die *func, int *linep)
{
return __libdw_attr_intval (func, linep, DW_AT_decl_line);
}
+OLD_VERSION (dwarf_decl_line, ELFUTILS_0.122)
+NEW_VERSION (dwarf_decl_line, ELFUTILS_0.143)
int internal_function
@@ -71,8 +73,9 @@ __libdw_attr_intval (Dwarf_Die *die, int *linep, int attval)
Dwarf_Attribute attr_mem;
Dwarf_Sword line;
- int res = INTUSE(dwarf_formsdata) (INTUSE(dwarf_attr) (die, attval,
- &attr_mem), &line);
+ int res = INTUSE(dwarf_formsdata) (INTUSE(dwarf_attr_integrate)
+ (die, attval, &attr_mem),
+ &line);
if (res == 0)
{
assert (line >= 0 && line <= INT_MAX);
diff --git a/libdw/dwarf_diecu.c b/libdw/dwarf_diecu.c
index 0724ee06..a62b8222 100644
--- a/libdw/dwarf_diecu.c
+++ b/libdw/dwarf_diecu.c
@@ -1,5 +1,5 @@
/* Return CU DIE containing given DIE.
- Copyright (C) 2005 Red Hat, Inc.
+ Copyright (C) 2005, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -70,7 +70,8 @@ dwarf_diecu (die, result, address_sizep, offset_sizep)
memset (result, '\0', sizeof (Dwarf_Die));
result->addr = ((char *) die->cu->dbg->sectiondata[IDX_debug_info]->d_buf
- + die->cu->start + 3 * die->cu->offset_size - 4 + 3);
+ + DIE_OFFSET_FROM_CU_OFFSET (die->cu->start,
+ die->cu->offset_size));
result->cu = die->cu;
if (address_sizep != NULL)
diff --git a/libdw/dwarf_end.c b/libdw/dwarf_end.c
index 60c9716e..fda37fc1 100644
--- a/libdw/dwarf_end.c
+++ b/libdw/dwarf_end.c
@@ -1,5 +1,5 @@
/* Release debugging handling context.
- Copyright (C) 2002, 2003, 2004, 2005 Red Hat, Inc.
+ Copyright (C) 2002, 2003, 2004, 2005, 2006, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -56,7 +56,7 @@
#include <stdlib.h>
#include "libdwP.h"
-
+#include "cfi.h"
static void
@@ -82,6 +82,10 @@ dwarf_end (dwarf)
{
if (dwarf != NULL)
{
+ if (dwarf->cfi != NULL)
+ /* Clean up the CFI cache. */
+ __libdw_destroy_frame_cache (dwarf->cfi);
+
/* The search tree for the CUs. NB: the CU data itself is
allocated separately, but the abbreviation hash tables need
to be handled. */
diff --git a/libdw/dwarf_entry_breakpoints.c b/libdw/dwarf_entry_breakpoints.c
index e568bc99..1e5c1b81 100644
--- a/libdw/dwarf_entry_breakpoints.c
+++ b/libdw/dwarf_entry_breakpoints.c
@@ -1,5 +1,5 @@
/* Find entry breakpoint locations for a function.
- Copyright (C) 2005 Red Hat, Inc.
+ Copyright (C) 2005-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -87,18 +87,13 @@ dwarf_entry_breakpoints (die, bkpts)
}
/* Fetch the CU's line records to look for this DIE's addresses. */
- Dwarf_Die cudie =
- {
- .cu = die->cu,
- .addr = ((char *) die->cu->dbg->sectiondata[IDX_debug_info]->d_buf
- + die->cu->start + 3 * die->cu->offset_size - 4 + 3),
- };
+ Dwarf_Die cudie = CUDIE (die->cu);
Dwarf_Lines *lines;
size_t nlines;
if (INTUSE(dwarf_getsrclines) (&cudie, &lines, &nlines) < 0)
{
int error = INTUSE (dwarf_errno) ();
- if (error == DWARF_E_NO_DEBUG_LINE)
+ if (error == 0) /* CU has no DW_AT_stmt_list. */
return entrypc_bkpt ();
__libdw_seterrno (error);
return -1;
diff --git a/libdw/dwarf_error.c b/libdw/dwarf_error.c
index fe916641..0d95b8d2 100644
--- a/libdw/dwarf_error.c
+++ b/libdw/dwarf_error.c
@@ -1,5 +1,5 @@
/* Retrieve ELF descriptor used for DWARF access.
- Copyright (C) 2002, 2003, 2004, 2005 Red Hat, Inc.
+ Copyright (C) 2002, 2003, 2004, 2005, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -58,46 +58,14 @@
#include "libdwP.h"
-#ifdef USE_TLS
/* The error number. */
static __thread int global_error;
-#else
-/* This is the key for the thread specific memory. */
-static tls_key_t key;
-
-/* The error number. Used in non-threaded programs. */
-static int global_error;
-static bool threaded;
-/* We need to initialize the thread-specific data. */
-once_define (static, once);
-
-/* The initialization and destruction functions. */
-static void init (void);
-static void free_key_mem (void *mem);
-#endif /* TLS */
int
dwarf_errno (void)
{
- int result;
-
-#ifndef USE_TLS
- /* If we have not yet initialized the buffer do it now. */
- once_execute (once, init);
-
- if (threaded)
- {
- /* We do not allocate memory for the data. It is only a word.
- We can store it in place of the pointer. */
- result = (intptr_t) getspecific (key);
-
- setspecific (key, (void *) (intptr_t) DWARF_E_NOERROR);
- return result;
- }
-#endif /* TLS */
-
- result = global_error;
+ int result = global_error;
global_error = DWARF_E_NOERROR;
return result;
}
@@ -143,6 +111,7 @@ static const char *errmsgs[] =
[DWARF_E_NO_FLAG] = N_("no flag value"),
[DWARF_E_INVALID_OFFSET] = N_("invalid offset"),
[DWARF_E_NO_DEBUG_RANGES] = N_(".debug_ranges section missing"),
+ [DWARF_E_INVALID_CFI] = N_("invalid CFI section"),
};
#define nerrmsgs (sizeof (errmsgs) / sizeof (errmsgs[0]))
@@ -151,16 +120,6 @@ void
__libdw_seterrno (value)
int value;
{
-#ifndef USE_TLS
- /* If we have not yet initialized the buffer do it now. */
- once_execute (once, init);
-
- if (threaded)
- /* We do not allocate memory for the data. It is only a word.
- We can store it in place of the pointer. */
- setspecific (key, (void *) (intptr_t) value);
-#endif /* TLS */
-
global_error = (value >= 0 && value < (int) nerrmsgs
? value : DWARF_E_UNKNOWN_ERROR);
}
@@ -170,19 +129,7 @@ const char *
dwarf_errmsg (error)
int error;
{
- int last_error;
-
-#ifndef USE_TLS
- /* If we have not yet initialized the buffer do it now. */
- once_execute (once, init);
-
- if ((error == 0 || error == -1) && threaded)
- /* We do not allocate memory for the data. It is only a word.
- We can store it in place of the pointer. */
- last_error = (intptr_t) getspecific (key);
- else
-#endif /* TLS */
- last_error = global_error;
+ int last_error = global_error;
if (error == 0)
return last_error != 0 ? _(errmsgs[last_error]) : NULL;
@@ -192,26 +139,3 @@ dwarf_errmsg (error)
return _(errmsgs[error == -1 ? last_error : error]);
}
INTDEF(dwarf_errmsg)
-
-
-#ifndef USE_TLS
-/* Free the thread specific data, this is done if a thread terminates. */
-static void
-free_key_mem (void *mem __attribute__ ((unused)))
-{
- setspecific (key, NULL);
-}
-
-
-/* Initialize the key for the global variable. */
-static void
-init (void)
-{
- // XXX Screw you, gcc4, the unused function attribute does not work.
- __asm ("" :: "r" (free_key_mem));
-
- if (key_create (&key, free_key_mem) == 0)
- /* Creating the key succeeded. */
- threaded = true;
-}
-#endif /* TLS */
diff --git a/libdw/dwarf_formaddr.c b/libdw/dwarf_formaddr.c
index dcb58d43..9938be7e 100644
--- a/libdw/dwarf_formaddr.c
+++ b/libdw/dwarf_formaddr.c
@@ -70,10 +70,10 @@ dwarf_formaddr (attr, return_addr)
return -1;
}
- if (attr->cu->address_size == 8)
- *return_addr = read_8ubyte_unaligned (attr->cu->dbg, attr->valp);
- else
- *return_addr = read_4ubyte_unaligned (attr->cu->dbg, attr->valp);
+ if (__libdw_read_address (attr->cu->dbg,
+ IDX_debug_info, attr->valp,
+ attr->cu->address_size, return_addr))
+ return -1;
return 0;
}
diff --git a/libdw/dwarf_formflag.c b/libdw/dwarf_formflag.c
index 4e57c3af..fb60c8e6 100644
--- a/libdw/dwarf_formflag.c
+++ b/libdw/dwarf_formflag.c
@@ -1,5 +1,5 @@
/* Return flag represented by attribute.
- Copyright (C) 2004 Red Hat, Inc.
+ Copyright (C) 2004-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2004.
@@ -64,6 +64,12 @@ dwarf_formflag (attr, return_bool)
if (attr == NULL)
return -1;
+ if (attr->form == DW_FORM_flag_present)
+ {
+ *return_bool = true;
+ return 0;
+ }
+
if (unlikely (attr->form != DW_FORM_flag))
{
__libdw_seterrno (DWARF_E_NO_FLAG);
diff --git a/libdw/dwarf_formref.c b/libdw/dwarf_formref.c
index 7c4fb71a..b8463b70 100644
--- a/libdw/dwarf_formref.c
+++ b/libdw/dwarf_formref.c
@@ -1,5 +1,5 @@
/* Return reference offset represented by attribute.
- Copyright (C) 2003, 2005, 2007 Red Hat, Inc.
+ Copyright (C) 2003, 2005, 2007, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2003.
@@ -62,6 +62,12 @@ __libdw_formref (attr, return_offset)
{
const unsigned char *datap;
+ if (attr->valp == NULL)
+ {
+ __libdw_seterrno (DWARF_E_INVALID_REFERENCE);
+ return -1;
+ }
+
switch (attr->form)
{
case DW_FORM_ref1:
diff --git a/libdw/dwarf_formref_die.c b/libdw/dwarf_formref_die.c
index 90a4b2d3..a004a0fd 100644
--- a/libdw/dwarf_formref_die.c
+++ b/libdw/dwarf_formref_die.c
@@ -72,10 +72,9 @@ dwarf_formref_die (attr, die_mem)
? attr->cu->address_size
: attr->cu->offset_size);
- if (ref_size == 8)
- offset = read_8ubyte_unaligned (attr->cu->dbg, attr->valp);
- else
- offset = read_4ubyte_unaligned (attr->cu->dbg, attr->valp);
+ if (__libdw_read_offset (attr->cu->dbg, IDX_debug_info, attr->valp,
+ ref_size, &offset, IDX_debug_info, 0))
+ return NULL;
}
else
{
diff --git a/libdw/dwarf_formstring.c b/libdw/dwarf_formstring.c
index 790831ea..f95d31b8 100644
--- a/libdw/dwarf_formstring.c
+++ b/libdw/dwarf_formstring.c
@@ -74,20 +74,14 @@ dwarf_formstring (attrp)
if (unlikely (attrp->form != DW_FORM_strp)
|| dbg->sectiondata[IDX_debug_str] == NULL)
{
- invalid_error:
__libdw_seterrno (DWARF_E_NO_STRING);
return NULL;
}
uint64_t off;
- // XXX We need better boundary checks.
- if (attrp->cu->offset_size == 8)
- off = read_8ubyte_unaligned (dbg, attrp->valp);
- else
- off = read_4ubyte_unaligned (dbg, attrp->valp);
-
- if (off >= dbg->sectiondata[IDX_debug_str]->d_size)
- goto invalid_error;
+ if (__libdw_read_offset (dbg, IDX_debug_info, attrp->valp,
+ attrp->cu->offset_size, &off, IDX_debug_str, 1))
+ return NULL;
return (const char *) dbg->sectiondata[IDX_debug_str]->d_buf + off;
}
diff --git a/libdw/dwarf_formudata.c b/libdw/dwarf_formudata.c
index b5c40bb5..d9d0a1cd 100644
--- a/libdw/dwarf_formudata.c
+++ b/libdw/dwarf_formudata.c
@@ -1,5 +1,5 @@
/* Return unsigned constant represented by attribute.
- Copyright (C) 2003, 2005 Red Hat, Inc.
+ Copyright (C) 2003-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2003.
@@ -55,6 +55,61 @@
#include <dwarf.h>
#include "libdwP.h"
+internal_function unsigned char *
+__libdw_formptr (Dwarf_Attribute *attr, int sec_index,
+ int err_nodata, unsigned char **endpp,
+ Dwarf_Off *offsetp)
+{
+ if (attr == NULL)
+ return NULL;
+
+ const Elf_Data *d = attr->cu->dbg->sectiondata[sec_index];
+ if (unlikely (d == NULL))
+ {
+ __libdw_seterrno (err_nodata);
+ return NULL;
+ }
+
+ Dwarf_Word offset;
+ if (attr->form == DW_FORM_sec_offset)
+ {
+ if (__libdw_read_offset (attr->cu->dbg, IDX_debug_info, attr->valp,
+ attr->cu->offset_size, &offset, sec_index, 0))
+ return NULL;
+ }
+ else if (attr->cu->version > 3)
+ goto invalid;
+
+ switch (attr->form)
+ {
+ case DW_FORM_data4:
+ case DW_FORM_data8:
+ if (__libdw_read_offset (attr->cu->dbg, IDX_debug_info, attr->valp,
+ attr->form == DW_FORM_data4 ? 4 : 8,
+ &offset, sec_index, 0))
+ return NULL;
+ break;
+
+ default:
+ if (INTUSE(dwarf_formudata) (attr, &offset))
+ return NULL;
+ };
+
+ unsigned char *readp = d->d_buf + offset;
+ unsigned char *endp = d->d_buf + d->d_size;
+ if (unlikely (readp >= endp))
+ {
+ invalid:
+ __libdw_seterrno (DWARF_E_INVALID_DWARF);
+ return NULL;
+ }
+
+ if (endpp != NULL)
+ *endpp = endp;
+ if (offsetp != NULL)
+ *offsetp = offset;
+ return readp;
+}
int
dwarf_formudata (attr, return_uval)
@@ -77,11 +132,11 @@ dwarf_formudata (attr, return_uval)
break;
case DW_FORM_data4:
- *return_uval = read_4ubyte_unaligned (attr->cu->dbg, attr->valp);
- break;
-
case DW_FORM_data8:
- *return_uval = read_8ubyte_unaligned (attr->cu->dbg, attr->valp);
+ if (__libdw_read_address (attr->cu->dbg, IDX_debug_info, attr->valp,
+ attr->form == DW_FORM_data4 ? 4 : 8,
+ return_uval))
+ return -1;
break;
case DW_FORM_sdata:
diff --git a/libdw/dwarf_frame_cfa.c b/libdw/dwarf_frame_cfa.c
new file mode 100644
index 00000000..2f3268a8
--- /dev/null
+++ b/libdw/dwarf_frame_cfa.c
@@ -0,0 +1,101 @@
+/* Get CFA expression for frame.
+ Copyright (C) 2009-2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "cfi.h"
+#include <dwarf.h>
+#include <stdlib.h>
+
+int
+dwarf_frame_cfa (fs, ops, nops)
+ Dwarf_Frame *fs;
+ Dwarf_Op **ops;
+ size_t *nops;
+{
+ /* Maybe there was a previous error. */
+ if (fs == NULL)
+ return -1;
+
+ int result = 0;
+ switch (fs->cfa_rule)
+ {
+ case cfa_undefined:
+ *ops = NULL;
+ *nops = 0;
+ break;
+
+ case cfa_offset:
+ /* The Dwarf_Op was already fully initialized by execute_cfi. */
+ *ops = &fs->cfa_data.offset;
+ *nops = 1;
+ break;
+
+ case cfa_expr:
+ /* Parse the expression into internal form. */
+ result = __libdw_intern_expression
+ (NULL, fs->cache->other_byte_order,
+ fs->cache->e_ident[EI_CLASS] == ELFCLASS32 ? 4 : 8, 4,
+ &fs->cache->expr_tree, &fs->cfa_data.expr, false, false,
+ ops, nops, IDX_debug_frame);
+ break;
+
+ case cfa_invalid:
+ __libdw_seterrno (DWARF_E_INVALID_CFI);
+ result = -1;
+ break;
+
+ default:
+ abort ();
+ }
+
+ return result;
+}
diff --git a/libdw/dwarf_frame_info.c b/libdw/dwarf_frame_info.c
new file mode 100644
index 00000000..4bdd8068
--- /dev/null
+++ b/libdw/dwarf_frame_info.c
@@ -0,0 +1,74 @@
+/* Get return address register for frame.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "cfi.h"
+
+int
+dwarf_frame_info (fs, start, end, signalp)
+ Dwarf_Frame *fs;
+ Dwarf_Addr *start;
+ Dwarf_Addr *end;
+ bool *signalp;
+{
+ /* Maybe there was a previous error. */
+ if (fs == NULL)
+ return -1;
+
+ if (start != NULL)
+ *start = fs->start;
+ if (end != NULL)
+ *end = fs->end;
+ if (signalp != NULL)
+ *signalp = fs->fde->cie->signal_frame;
+ return fs->fde->cie->return_address_register;
+}
diff --git a/libdw/dwarf_frame_register.c b/libdw/dwarf_frame_register.c
new file mode 100644
index 00000000..ae0db020
--- /dev/null
+++ b/libdw/dwarf_frame_register.c
@@ -0,0 +1,142 @@
+/* Get register location expression for frame.
+ Copyright (C) 2009-2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "cfi.h"
+#include <dwarf.h>
+
+int
+dwarf_frame_register (fs, regno, ops_mem, ops, nops)
+ Dwarf_Frame *fs;
+ int regno;
+ Dwarf_Op ops_mem[3];
+ Dwarf_Op **ops;
+ size_t *nops;
+{
+ /* Maybe there was a previous error. */
+ if (fs == NULL)
+ return -1;
+
+ if (unlikely (regno < 0))
+ {
+ __libdw_seterrno (DWARF_E_INVALID_ACCESS);
+ return -1;
+ }
+
+ *ops = ops_mem;
+ *nops = 0;
+
+ if (unlikely ((size_t) regno >= fs->nregs))
+ goto default_rule;
+
+ const struct dwarf_frame_register *reg = &fs->regs[regno];
+
+ switch (reg->rule)
+ {
+ case reg_unspecified:
+ default_rule:
+ /* Use the default rule for registers not yet mentioned in CFI. */
+ if (fs->cache->default_same_value)
+ goto same_value;
+ /*FALLTHROUGH*/
+ case reg_undefined:
+ /* The value is known to be unavailable. */
+ break;
+
+ case reg_same_value:
+ same_value:
+ /* The location is not known here, but the caller might know it. */
+ *ops = NULL;
+ break;
+
+ case reg_offset:
+ case reg_val_offset:
+ ops_mem[(*nops)++] = (Dwarf_Op) { .atom = DW_OP_call_frame_cfa };
+ if (reg->value != 0)
+ ops_mem[(*nops)++] = (Dwarf_Op) { .atom = DW_OP_plus_uconst,
+ .number = reg->value };
+ if (reg->rule == reg_val_offset)
+ /* A value, not a location. */
+ ops_mem[(*nops)++] = (Dwarf_Op) { .atom = DW_OP_stack_value };
+ *ops = ops_mem;
+ break;
+
+ case reg_register:
+ ops_mem[(*nops)++] = (Dwarf_Op) { .atom = DW_OP_regx,
+ .number = reg->value };
+ break;
+
+ case reg_val_expression:
+ case reg_expression:
+ {
+ unsigned int address_size = (fs->cache->e_ident[EI_CLASS] == ELFCLASS32
+ ? 4 : 8);
+
+ Dwarf_Block block;
+ const uint8_t *p = fs->cache->data->d.d_buf + reg->value;
+ get_uleb128 (block.length, p);
+ block.data = (void *) p;
+
+ /* Parse the expression into internal form. */
+ if (__libdw_intern_expression (NULL,
+ fs->cache->other_byte_order,
+ address_size, 4,
+ &fs->cache->expr_tree, &block,
+ true, reg->rule == reg_val_expression,
+ ops, nops, IDX_debug_frame) < 0)
+ return -1;
+ break;
+ }
+ }
+
+ return 0;
+}
diff --git a/libdw/dwarf_getaranges.c b/libdw/dwarf_getaranges.c
index d2294ea3..72334f5f 100644
--- a/libdw/dwarf_getaranges.c
+++ b/libdw/dwarf_getaranges.c
@@ -1,5 +1,5 @@
/* Return list address ranges.
- Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006 Red Hat, Inc.
+ Copyright (C) 2000-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2000.
@@ -55,7 +55,7 @@
#include <stdlib.h>
#include <assert.h>
#include "libdwP.h"
-
+#include <dwarf.h>
struct arangelist
{
@@ -104,13 +104,13 @@ dwarf_getaranges (dbg, aranges, naranges)
struct arangelist *arangelist = NULL;
unsigned int narangelist = 0;
- const char *readp
- = (const char *) dbg->sectiondata[IDX_debug_aranges]->d_buf;
- const char *readendp = readp + dbg->sectiondata[IDX_debug_aranges]->d_size;
+ const unsigned char *readp = dbg->sectiondata[IDX_debug_aranges]->d_buf;
+ const unsigned char *readendp
+ = readp + dbg->sectiondata[IDX_debug_aranges]->d_size;
while (readp < readendp)
{
- const char *hdrstart = readp;
+ const unsigned char *hdrstart = readp;
/* Each entry starts with a header:
@@ -131,11 +131,14 @@ dwarf_getaranges (dbg, aranges, naranges)
a segment descriptor on the target system. */
Dwarf_Word length = read_4ubyte_unaligned_inc (dbg, readp);
unsigned int length_bytes = 4;
- if (length == 0xffffffff)
+ if (length == DWARF3_LENGTH_64_BIT)
{
length = read_8ubyte_unaligned_inc (dbg, readp);
length_bytes = 8;
}
+ else if (unlikely (length >= DWARF3_LENGTH_MIN_ESCAPE_CODE
+ && length <= DWARF3_LENGTH_MAX_ESCAPE_CODE))
+ goto invalid;
unsigned int version = read_2ubyte_unaligned_inc (dbg, readp);
if (version != 2)
@@ -146,14 +149,10 @@ dwarf_getaranges (dbg, aranges, naranges)
}
Dwarf_Word offset;
- if (length_bytes == 4)
- offset = read_4ubyte_unaligned_inc (dbg, readp);
- else
- offset = read_8ubyte_unaligned_inc (dbg, readp);
-
- /* Sanity-check the offset. */
- if (offset + 4 > dbg->sectiondata[IDX_debug_info]->d_size)
- goto invalid;
+ if (__libdw_read_offset_inc (dbg,
+ IDX_debug_aranges, &readp,
+ length_bytes, &offset, IDX_debug_info, 4))
+ return -1;
unsigned int address_size = *readp++;
if (address_size != 4 && address_size != 8)
@@ -172,16 +171,14 @@ dwarf_getaranges (dbg, aranges, naranges)
Dwarf_Word range_address;
Dwarf_Word range_length;
+ if (__libdw_read_address_inc (dbg, IDX_debug_aranges, &readp,
+ address_size, &range_address))
+ return -1;
+
if (address_size == 4)
- {
- range_address = read_4ubyte_unaligned_inc (dbg, readp);
- range_length = 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);
- }
+ range_length = read_8ubyte_unaligned_inc (dbg, readp);
/* Two zero values mark the end. */
if (range_address == 0 && range_length == 0)
@@ -197,11 +194,12 @@ dwarf_getaranges (dbg, aranges, naranges)
const char *cu_header = (dbg->sectiondata[IDX_debug_info]->d_buf
+ offset);
unsigned int offset_size;
- if (read_4ubyte_unaligned_noncvt (cu_header) == 0xffffffff)
+ if (read_4ubyte_unaligned_noncvt (cu_header) == DWARF3_LENGTH_64_BIT)
offset_size = 8;
else
offset_size = 4;
- new_arange->arange.offset = offset + 3 * offset_size - 4 + 3;
+ new_arange->arange.offset = DIE_OFFSET_FROM_CU_OFFSET (offset,
+ offset_size);
/* Sanity-check the data. */
if (new_arange->arange.offset
diff --git a/libdw/dwarf_getattrs.c b/libdw/dwarf_getattrs.c
index ebf0869c..051dc25f 100644
--- a/libdw/dwarf_getattrs.c
+++ b/libdw/dwarf_getattrs.c
@@ -1,5 +1,5 @@
/* Get attributes of the DIE.
- Copyright (C) 2004, 2005 Red Hat, Inc.
+ Copyright (C) 2004, 2005, 2008, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2004.
@@ -62,6 +62,9 @@ dwarf_getattrs (Dwarf_Die *die, int (*callback) (Dwarf_Attribute *, void *),
if (die == NULL)
return -1l;
+ if (unlikely (offset == 1))
+ return 1;
+
const unsigned char *die_addr = die->addr;
/* Get the abbreviation code. */
@@ -72,14 +75,16 @@ dwarf_getattrs (Dwarf_Die *die, int (*callback) (Dwarf_Attribute *, void *),
/* Find the abbreviation. */
die->abbrev = __libdw_findabbrev (die->cu, u128);
- if (die->abbrev == (Dwarf_Abbrev *) -1l)
+ if (unlikely (die->abbrev == DWARF_END_ABBREV))
{
+ invalid_dwarf:
__libdw_seterrno (DWARF_E_INVALID_DWARF);
return -1l;
}
/* This is where the attributes start. */
- const unsigned char *attrp = die->abbrev->attrp + offset;
+ const unsigned char *attrp = die->abbrev->attrp;
+ const unsigned char *const offset_attrp = die->abbrev->attrp + offset;
/* Go over the list of attributes. */
Dwarf *dbg = die->cu->dbg;
@@ -89,28 +94,39 @@ dwarf_getattrs (Dwarf_Die *die, int (*callback) (Dwarf_Attribute *, void *),
if (unlikely (attrp
>= ((unsigned char *) dbg->sectiondata[IDX_debug_abbrev]->d_buf
+ dbg->sectiondata[IDX_debug_abbrev]->d_size)))
- {
- __libdw_seterrno (DWARF_E_INVALID_DWARF);
- return -1;
- }
+ goto invalid_dwarf;
/* Get attribute name and form. */
Dwarf_Attribute attr;
+ const unsigned char *remembered_attrp = attrp;
+
// XXX Fix bound checks
get_uleb128 (attr.code, attrp);
get_uleb128 (attr.form, attrp);
/* We can stop if we found the attribute with value zero. */
if (attr.code == 0 && attr.form == 0)
- return 0;
-
- /* Fill in the rest. */
- attr.valp = (unsigned char *) die_addr;
- attr.cu = die->cu;
-
- /* Now call the callback function. */
- if (callback (&attr, arg) != DWARF_CB_OK)
- return attrp - die->abbrev->attrp;
+ /* Do not return 0 here - there would be no way to
+ distinguish this value from the attribute at offset 0.
+ Instead we return +1 which would never be a valid
+ offset of an attribute. */
+ return 1l;
+
+ /* If we are not to OFFSET_ATTRP yet, we just have to skip
+ the values of the intervening attributes. */
+ if (remembered_attrp >= offset_attrp)
+ {
+ /* Fill in the rest. */
+ attr.valp = (unsigned char *) die_addr;
+ attr.cu = die->cu;
+
+ /* Now call the callback function. */
+ if (callback (&attr, arg) != DWARF_CB_OK)
+ /* Return the offset of the start of the attribute, so that
+ dwarf_getattrs() can be restarted from this point if the
+ caller so desires. */
+ return remembered_attrp - die->abbrev->attrp;
+ }
/* Skip over the rest of this attribute (if there is any). */
if (attr.form != 0)
diff --git a/libdw/dwarf_getcfi.c b/libdw/dwarf_getcfi.c
new file mode 100644
index 00000000..c935631e
--- /dev/null
+++ b/libdw/dwarf_getcfi.c
@@ -0,0 +1,94 @@
+/* Get CFI from DWARF file.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libdwP.h"
+#include "cfi.h"
+#include <dwarf.h>
+
+Dwarf_CFI *
+dwarf_getcfi (dbg)
+ Dwarf *dbg;
+{
+ if (dbg == NULL)
+ return NULL;
+
+ if (dbg->cfi == NULL && dbg->sectiondata[IDX_debug_frame] != NULL)
+ {
+ Dwarf_CFI *cfi = libdw_typed_alloc (dbg, Dwarf_CFI);
+
+ cfi->dbg = dbg;
+ cfi->data = (Elf_Data_Scn *) dbg->sectiondata[IDX_debug_frame];
+
+ cfi->search_table = NULL;
+ cfi->search_table_vaddr = 0;
+ cfi->search_table_entries = 0;
+ cfi->search_table_encoding = DW_EH_PE_omit;
+
+ cfi->frame_vaddr = 0;
+ cfi->textrel = 0;
+ cfi->datarel = 0;
+
+ cfi->e_ident = (unsigned char *) elf_getident (dbg->elf, NULL);
+ cfi->other_byte_order = dbg->other_byte_order;
+
+ cfi->next_offset = 0;
+ cfi->cie_tree = cfi->fde_tree = cfi->expr_tree = NULL;
+
+ cfi->ebl = NULL;
+
+ dbg->cfi = cfi;
+ }
+
+ return dbg->cfi;
+}
+INTDEF (dwarf_getcfi)
diff --git a/libdw/dwarf_getcfi_elf.c b/libdw/dwarf_getcfi_elf.c
new file mode 100644
index 00000000..64a2a885
--- /dev/null
+++ b/libdw/dwarf_getcfi_elf.c
@@ -0,0 +1,336 @@
+/* Get CFI from ELF file's exception-handling info.
+ Copyright (C) 2009-2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "libdwP.h"
+#include "cfi.h"
+#include "encoded-value.h"
+#include <dwarf.h>
+
+
+static Dwarf_CFI *
+allocate_cfi (Elf *elf, GElf_Addr vaddr)
+{
+ Dwarf_CFI *cfi = calloc (1, sizeof *cfi);
+ if (cfi == NULL)
+ {
+ __libdw_seterrno (DWARF_E_NOMEM);
+ return NULL;
+ }
+
+ cfi->e_ident = (unsigned char *) elf_getident (elf, NULL);
+ if (cfi->e_ident == NULL)
+ {
+ free (cfi);
+ __libdw_seterrno (DWARF_E_GETEHDR_ERROR);
+ return NULL;
+ }
+
+ if ((BYTE_ORDER == LITTLE_ENDIAN && cfi->e_ident[EI_DATA] == ELFDATA2MSB)
+ || (BYTE_ORDER == BIG_ENDIAN && cfi->e_ident[EI_DATA] == ELFDATA2LSB))
+ cfi->other_byte_order = true;
+
+ cfi->frame_vaddr = vaddr;
+ cfi->textrel = 0; /* XXX ? */
+ cfi->datarel = 0; /* XXX ? */
+
+ return cfi;
+}
+
+static const uint8_t *
+parse_eh_frame_hdr (const uint8_t *hdr, size_t hdr_size, GElf_Addr hdr_vaddr,
+ const GElf_Ehdr *ehdr, GElf_Addr *eh_frame_vaddr,
+ size_t *table_entries, uint8_t *table_encoding)
+{
+ const uint8_t *h = hdr;
+
+ if (*h++ != 1) /* version */
+ return (void *) -1l;
+
+ uint8_t eh_frame_ptr_encoding = *h++;
+ uint8_t fde_count_encoding = *h++;
+ uint8_t fde_table_encoding = *h++;
+
+ if (eh_frame_ptr_encoding == DW_EH_PE_omit)
+ return (void *) -1l;
+
+ /* Dummy used by read_encoded_value. */
+ Elf_Data_Scn dummy_cfi_hdr_data =
+ {
+ .d = { .d_buf = (void *) hdr, .d_size = hdr_size }
+ };
+ Dwarf_CFI dummy_cfi =
+ {
+ .e_ident = ehdr->e_ident,
+ .datarel = hdr_vaddr,
+ .frame_vaddr = hdr_vaddr,
+ .data = &dummy_cfi_hdr_data,
+ };
+
+ if (unlikely (read_encoded_value (&dummy_cfi, eh_frame_ptr_encoding, &h,
+ eh_frame_vaddr)))
+ return (void *) -1l;
+
+ if (fde_count_encoding != DW_EH_PE_omit)
+ {
+ Dwarf_Word fde_count;
+ if (unlikely (read_encoded_value (&dummy_cfi, fde_count_encoding, &h,
+ &fde_count)))
+ return (void *) -1l;
+ if (fde_count != 0 && (size_t) fde_count == fde_count
+ && fde_table_encoding != DW_EH_PE_omit
+ && (fde_table_encoding &~ DW_EH_PE_signed) != DW_EH_PE_uleb128)
+ {
+ *table_entries = fde_count;
+ *table_encoding = fde_table_encoding;
+ return h;
+ }
+ }
+
+ return NULL;
+}
+
+static Dwarf_CFI *
+getcfi_gnu_eh_frame (Elf *elf, const GElf_Ehdr *ehdr, const GElf_Phdr *phdr)
+{
+ if (unlikely (phdr->p_filesz < 4))
+ goto invalid;
+
+ Elf_Data *data = elf_getdata_rawchunk (elf, phdr->p_offset, phdr->p_filesz,
+ ELF_T_BYTE);
+ if (data == NULL)
+ {
+ invalid_hdr:
+ invalid:
+ /* XXX might be read error or corrupt phdr */
+ __libdw_seterrno (DWARF_E_INVALID_CFI);
+ return NULL;
+ }
+
+ Dwarf_Addr eh_frame_ptr;
+ size_t search_table_entries;
+ uint8_t search_table_encoding;
+ const uint8_t *search_table = parse_eh_frame_hdr (data->d_buf, phdr->p_filesz,
+ phdr->p_vaddr, ehdr,
+ &eh_frame_ptr,
+ &search_table_entries,
+ &search_table_encoding);
+ if (search_table == (void *) -1l)
+ goto invalid_hdr;
+
+ Dwarf_Off eh_frame_offset = eh_frame_ptr - phdr->p_vaddr + phdr->p_offset;
+ Dwarf_Word eh_frame_size = 0;
+
+ /* XXX we have no way without section headers to know the size
+ of the .eh_frame data. Calculate the largest it might possibly be.
+ This won't be wasteful if the file is already mmap'd, but if it isn't
+ it might be quite excessive. */
+ size_t filesize;
+ if (elf_rawfile (elf, &filesize) != NULL)
+ eh_frame_size = filesize - eh_frame_offset;
+
+ data = elf_getdata_rawchunk (elf, eh_frame_offset, eh_frame_size, ELF_T_BYTE);
+ if (data == NULL)
+ {
+ __libdw_seterrno (DWARF_E_INVALID_ELF); /* XXX might be read error */
+ return NULL;
+ }
+ Dwarf_CFI *cfi = allocate_cfi (elf, eh_frame_ptr);
+ if (cfi != NULL)
+ {
+ cfi->data = (Elf_Data_Scn *) data;
+
+ if (search_table != NULL)
+ {
+ cfi->search_table = search_table;
+ cfi->search_table_vaddr = phdr->p_vaddr;
+ cfi->search_table_encoding = search_table_encoding;
+ cfi->search_table_entries = search_table_entries;
+ }
+ }
+ return cfi;
+}
+
+/* Search the phdrs for PT_GNU_EH_FRAME. */
+static Dwarf_CFI *
+getcfi_phdr (Elf *elf, const GElf_Ehdr *ehdr)
+{
+ size_t phnum;
+ if (unlikely (elf_getphdrnum (elf, &phnum) != 0))
+ return NULL;
+
+ 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 NULL;
+ if (phdr->p_type == PT_GNU_EH_FRAME)
+ return getcfi_gnu_eh_frame (elf, ehdr, phdr);
+ }
+
+ __libdw_seterrno (DWARF_E_NO_DWARF);
+ return NULL;
+}
+
+static Dwarf_CFI *
+getcfi_scn_eh_frame (Elf *elf, const GElf_Ehdr *ehdr,
+ Elf_Scn *scn, GElf_Shdr *shdr,
+ Elf_Scn *hdr_scn, GElf_Addr hdr_vaddr)
+{
+ Elf_Data *data = elf_rawdata (scn, NULL);
+ if (data == NULL)
+ {
+ __libdw_seterrno (DWARF_E_INVALID_ELF);
+ return NULL;
+ }
+ Dwarf_CFI *cfi = allocate_cfi (elf, shdr->sh_addr);
+ if (cfi != NULL)
+ {
+ cfi->data = (Elf_Data_Scn *) data;
+ if (hdr_scn != NULL)
+ {
+ Elf_Data *hdr_data = elf_rawdata (hdr_scn, NULL);
+ if (hdr_data != NULL)
+ {
+ GElf_Addr eh_frame_vaddr;
+ cfi->search_table_vaddr = hdr_vaddr;
+ cfi->search_table
+ = parse_eh_frame_hdr (hdr_data->d_buf, hdr_data->d_size,
+ hdr_vaddr, ehdr, &eh_frame_vaddr,
+ &cfi->search_table_entries,
+ &cfi->search_table_encoding);
+ if (cfi->search_table == (void *) -1l)
+ {
+ free (cfi);
+ /* XXX might be read error or corrupt phdr */
+ __libdw_seterrno (DWARF_E_INVALID_CFI);
+ return NULL;
+ }
+
+ /* Sanity check. */
+ if (unlikely (eh_frame_vaddr != shdr->sh_addr))
+ cfi->search_table = NULL;
+ }
+ }
+ }
+ return cfi;
+}
+
+/* Search for the sections named ".eh_frame" and ".eh_frame_hdr". */
+static Dwarf_CFI *
+getcfi_shdr (Elf *elf, const GElf_Ehdr *ehdr)
+{
+ size_t shstrndx;
+ if (elf_getshdrstrndx (elf, &shstrndx) != 0)
+ {
+ __libdw_seterrno (DWARF_E_GETEHDR_ERROR);
+ return NULL;
+ }
+
+ if (shstrndx != 0)
+ {
+ Elf_Scn *hdr_scn = NULL;
+ GElf_Addr hdr_vaddr = 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)
+ continue;
+ const char *name = elf_strptr (elf, shstrndx, shdr->sh_name);
+ if (name == NULL)
+ continue;
+ if (!strcmp (name, ".eh_frame_hdr"))
+ {
+ hdr_scn = scn;
+ hdr_vaddr = shdr->sh_addr;
+ }
+ else if (!strcmp (name, ".eh_frame"))
+ return getcfi_scn_eh_frame (elf, ehdr, scn, shdr,
+ hdr_scn, hdr_vaddr);
+ }
+ }
+
+ return (void *) -1l;
+}
+
+Dwarf_CFI *
+dwarf_getcfi_elf (elf)
+ Elf *elf;
+{
+ if (elf_kind (elf) != ELF_K_ELF)
+ {
+ __libdw_seterrno (DWARF_E_NOELF);
+ return NULL;
+ }
+
+ GElf_Ehdr ehdr_mem;
+ GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem);
+ if (unlikely (ehdr == NULL))
+ {
+ __libdw_seterrno (DWARF_E_INVALID_ELF);
+ return NULL;
+ }
+
+ Dwarf_CFI *result = getcfi_shdr (elf, ehdr);
+ if (result == (void *) -1l)
+ result = getcfi_phdr (elf, ehdr);
+
+ return result;
+}
+INTDEF (dwarf_getcfi_elf)
diff --git a/libdw/dwarf_getlocation.c b/libdw/dwarf_getlocation.c
index f680aa96..ede8c3c9 100644
--- a/libdw/dwarf_getlocation.c
+++ b/libdw/dwarf_getlocation.c
@@ -1,5 +1,5 @@
/* Return location expression list.
- Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006 Red Hat, Inc.
+ Copyright (C) 2000-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2000.
@@ -55,6 +55,7 @@
#include <dwarf.h>
#include <search.h>
#include <stdlib.h>
+#include <assert.h>
#include <libdwP.h>
@@ -111,27 +112,142 @@ loc_compare (const void *p1, const void *p2)
return 0;
}
+/* 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)
+{
+ struct loc_block_s *block = libdw_alloc (dbg, struct loc_block_s,
+ sizeof (struct loc_block_s), 1);
+ block->addr = op;
+ block->data = data + op->number2;
+ block->length = op->number;
+ (void) tsearch (block, cache, loc_compare);
+}
+
+int
+dwarf_getlocation_implicit_value (attr, op, return_block)
+ Dwarf_Attribute *attr;
+ const Dwarf_Op *op;
+ Dwarf_Block *return_block;
+{
+ if (attr == NULL)
+ return -1;
+
+ struct loc_block_s fake = { .addr = (void *) op };
+ struct loc_block_s **found = tfind (&fake, &attr->cu->locs, loc_compare);
+ if (unlikely (found == NULL))
+ {
+ __libdw_seterrno (DWARF_E_NO_BLOCK);
+ return -1;
+ }
+
+ return_block->length = (*found)->length;
+ return_block->data = (*found)->data;
+ return 0;
+}
+
+/* DW_AT_data_member_location can be a constant as well as a loclistptr.
+ Only data[48] indicate a loclistptr. */
static int
-getlocation (struct Dwarf_CU *cu, const Dwarf_Block *block,
- Dwarf_Op **llbuf, size_t *listlen)
+check_constant_offset (Dwarf_Attribute *attr,
+ Dwarf_Op **llbuf, size_t *listlen)
{
- Dwarf *dbg = cu->dbg;
+ if (attr->code != DW_AT_data_member_location)
+ return 1;
+
+ switch (attr->form)
+ {
+ /* Punt for any non-constant form. */
+ default:
+ return 1;
+
+ case DW_FORM_data1:
+ case DW_FORM_data2:
+ case DW_FORM_sdata:
+ case DW_FORM_udata:
+ break;
+
+ case DW_FORM_data4:
+ case DW_FORM_data8:
+ /* These are loclistptr, not constants.
+ XXX check cu->version > 3???
+ */
+ return 1;
+ }
+
+ /* Check whether we already cached this location. */
+ struct loc_s fake = { .addr = attr->valp };
+ struct loc_s **found = tfind (&fake, &attr->cu->locs, loc_compare);
+
+ if (found == NULL)
+ {
+ Dwarf_Word offset;
+ if (INTUSE(dwarf_formudata) (attr, &offset) != 0)
+ return -1;
+
+ Dwarf_Op *result = libdw_alloc (attr->cu->dbg,
+ Dwarf_Op, sizeof (Dwarf_Op), 1);
+ result->atom = DW_OP_plus_uconst;
+ result->number = offset;
+ result->number2 = 0;
+ result->offset = 0;
+
+ /* Insert a record in the search tree so we can find it again later. */
+ struct loc_s *newp = libdw_alloc (attr->cu->dbg,
+ struct loc_s, sizeof (struct loc_s),
+ 1);
+ newp->addr = attr->valp;
+ newp->loc = result;
+ newp->nloc = 1;
+
+ found = tsearch (newp, &attr->cu->locs, loc_compare);
+ }
+
+ assert ((*found)->nloc == 1);
+
+ if (llbuf != NULL)
+ {
+ *llbuf = (*found)->loc;
+ *listlen = 1;
+ }
+
+ return 0;
+}
+
+int
+internal_function
+__libdw_intern_expression (Dwarf *dbg, bool other_byte_order,
+ unsigned int address_size, unsigned int ref_size,
+ void **cache, const Dwarf_Block *block,
+ bool cfap, bool valuep,
+ Dwarf_Op **llbuf, size_t *listlen, int sec_index)
+{
/* Check whether we already looked at this list. */
struct loc_s fake = { .addr = block->data };
- struct loc_s **found = tfind (&fake, &cu->locs, loc_compare);
+ struct loc_s **found = tfind (&fake, cache, loc_compare);
if (found != NULL)
{
/* We already saw it. */
*llbuf = (*found)->loc;
*listlen = (*found)->nloc;
+ if (valuep)
+ {
+ assert (*listlen > 1);
+ assert ((*llbuf)[*listlen - 1].atom == DW_OP_stack_value);
+ }
+
return 0;
}
const unsigned char *data = block->data;
const unsigned char *const end_data = data + block->length;
+ const struct { bool other_byte_order; } bo = { other_byte_order };
+
struct loclist *loclist = NULL;
unsigned int n = 0;
/* Decode the opcodes. It is possible in some situations to have a
@@ -151,24 +267,16 @@ getlocation (struct Dwarf_CU *cu, const Dwarf_Block *block,
{
case DW_OP_addr:
/* Address, depends on address size of CU. */
- if (cu->address_size == 4)
- {
- if (unlikely (data + 4 > end_data))
- {
- invalid:
- __libdw_seterrno (DWARF_E_INVALID_DWARF);
- return -1;
- }
-
- newloc->number = read_4ubyte_unaligned_inc (dbg, data);
- }
- else
- {
- if (unlikely (data + 8 > end_data))
- goto invalid;
+ if (__libdw_read_address_inc (dbg, sec_index, &data,
+ address_size, &newloc->number))
+ return -1;
+ break;
- newloc->number = read_8ubyte_unaligned_inc (dbg, data);
- }
+ case DW_OP_call_ref:
+ /* DW_FORM_ref_addr, depends on offset size of CU. */
+ if (__libdw_read_offset_inc (dbg, sec_index, &data, ref_size,
+ &newloc->number, IDX_debug_info, 0))
+ return -1;
break;
case DW_OP_deref:
@@ -202,7 +310,10 @@ getlocation (struct Dwarf_CU *cu, const Dwarf_Block *block,
case DW_OP_reg0 ... DW_OP_reg31:
case DW_OP_nop:
case DW_OP_push_object_address:
- case DW_OP_call_ref:
+ case DW_OP_call_frame_cfa:
+ case DW_OP_form_tls_address:
+ case DW_OP_GNU_push_tls_address:
+ case DW_OP_stack_value:
/* No operand. */
break;
@@ -211,7 +322,11 @@ getlocation (struct Dwarf_CU *cu, const Dwarf_Block *block,
case DW_OP_deref_size:
case DW_OP_xderef_size:
if (unlikely (data >= end_data))
- goto invalid;
+ {
+ invalid:
+ __libdw_seterrno (DWARF_E_INVALID_DWARF);
+ return -1;
+ }
newloc->number = *data++;
break;
@@ -228,7 +343,7 @@ getlocation (struct Dwarf_CU *cu, const Dwarf_Block *block,
if (unlikely (data + 2 > end_data))
goto invalid;
- newloc->number = read_2ubyte_unaligned_inc (dbg, data);
+ newloc->number = read_2ubyte_unaligned_inc (&bo, data);
break;
case DW_OP_const2s:
@@ -238,14 +353,14 @@ getlocation (struct Dwarf_CU *cu, const Dwarf_Block *block,
if (unlikely (data + 2 > end_data))
goto invalid;
- newloc->number = read_2sbyte_unaligned_inc (dbg, data);
+ newloc->number = read_2sbyte_unaligned_inc (&bo, data);
break;
case DW_OP_const4u:
if (unlikely (data + 4 > end_data))
goto invalid;
- newloc->number = read_4ubyte_unaligned_inc (dbg, data);
+ newloc->number = read_4ubyte_unaligned_inc (&bo, data);
break;
case DW_OP_const4s:
@@ -253,21 +368,21 @@ getlocation (struct Dwarf_CU *cu, const Dwarf_Block *block,
if (unlikely (data + 4 > end_data))
goto invalid;
- newloc->number = read_4sbyte_unaligned_inc (dbg, data);
+ newloc->number = read_4sbyte_unaligned_inc (&bo, data);
break;
case DW_OP_const8u:
if (unlikely (data + 8 > end_data))
goto invalid;
- newloc->number = read_8ubyte_unaligned_inc (dbg, data);
+ newloc->number = read_8ubyte_unaligned_inc (&bo, data);
break;
case DW_OP_const8s:
if (unlikely (data + 8 > end_data))
goto invalid;
- newloc->number = read_8sbyte_unaligned_inc (dbg, data);
+ newloc->number = read_8sbyte_unaligned_inc (&bo, data);
break;
case DW_OP_constu:
@@ -291,6 +406,25 @@ getlocation (struct Dwarf_CU *cu, const Dwarf_Block *block,
get_sleb128 (newloc->number2, data);
break;
+ case DW_OP_bit_piece:
+ /* XXX Check size. */
+ get_uleb128 (newloc->number, data);
+ get_uleb128 (newloc->number2, data);
+ break;
+
+ case DW_OP_implicit_value:
+ /* This cannot be used in a CFI expression. */
+ if (unlikely (dbg == NULL))
+ goto invalid;
+
+ /* 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;
+
default:
goto invalid;
}
@@ -304,46 +438,113 @@ getlocation (struct Dwarf_CU *cu, const Dwarf_Block *block,
goto invalid;
}
+ if (valuep)
+ {
+ struct loclist *newloc;
+ newloc = (struct loclist *) alloca (sizeof (struct loclist));
+ newloc->atom = DW_OP_stack_value;
+ newloc->number = 0;
+ newloc->number2 = 0;
+ newloc->offset = data - block->data;
+ newloc->next = loclist;
+ loclist = newloc;
+ ++n;
+ }
+
+ if (cfap)
+ ++n;
+
/* Allocate the array. */
- Dwarf_Op *result = libdw_alloc (dbg, Dwarf_Op, sizeof (Dwarf_Op), n);
+ Dwarf_Op *result;
+ if (dbg != NULL)
+ result = libdw_alloc (dbg, Dwarf_Op, sizeof (Dwarf_Op), n);
+ else
+ {
+ result = malloc (sizeof *result * n);
+ if (result == NULL)
+ {
+ nomem:
+ __libdw_seterrno (DWARF_E_NOMEM);
+ return -1;
+ }
+ }
/* Store the result. */
*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. */
+ /* We populate the array from the back since the list is backwards. */
--n;
result[n].atom = loclist->atom;
result[n].number = loclist->number;
result[n].number2 = loclist->number2;
result[n].offset = loclist->offset;
+ if (result[n].atom == DW_OP_implicit_value)
+ store_implicit_value (dbg, cache, &result[n], block->data);
+
loclist = loclist->next;
}
while (n > 0);
- /* Insert a record in the search tree so that we can find it again
- later. */
- struct loc_s *newp = libdw_alloc (dbg, struct loc_s, sizeof (struct loc_s),
- 1);
+ /* Insert a record in the search tree so that we can find it again later. */
+ struct loc_s *newp;
+ if (dbg != NULL)
+ newp = libdw_alloc (dbg, struct loc_s, sizeof (struct loc_s), 1);
+ else
+ {
+ newp = malloc (sizeof *newp);
+ if (newp == NULL)
+ {
+ free (result);
+ goto nomem;
+ }
+ }
+
newp->addr = block->data;
newp->loc = result;
newp->nloc = *listlen;
- (void) tsearch (newp, &cu->locs, loc_compare);
+ (void) tsearch (newp, cache, loc_compare);
/* We did it. */
return 0;
}
+static int
+getlocation (struct Dwarf_CU *cu, const Dwarf_Block *block,
+ Dwarf_Op **llbuf, size_t *listlen, int sec_index)
+{
+ return __libdw_intern_expression (cu->dbg, cu->dbg->other_byte_order,
+ cu->address_size, (cu->version == 2
+ ? cu->address_size
+ : cu->offset_size),
+ &cu->locs, block,
+ false, false,
+ llbuf, listlen, sec_index);
+}
+
int
dwarf_getlocation (attr, llbuf, listlen)
Dwarf_Attribute *attr;
Dwarf_Op **llbuf;
size_t *listlen;
{
+ int result = check_constant_offset (attr, llbuf, listlen);
+ if (result != 1)
+ return result;
+
if (! attr_ok (attr))
return -1;
@@ -352,7 +553,7 @@ dwarf_getlocation (attr, llbuf, listlen)
if (INTUSE(dwarf_formblock) (attr, &block) != 0)
return -1;
- return getlocation (attr->cu, &block, llbuf, listlen);
+ return getlocation (attr->cu, &block, llbuf, listlen, IDX_debug_info);
}
int
@@ -376,7 +577,8 @@ dwarf_getlocation_addr (attr, address, llbufs, listlens, maxlocs)
if (maxlocs == 0)
return 0;
if (llbufs != NULL &&
- getlocation (attr->cu, &block, &llbufs[0], &listlens[0]) != 0)
+ getlocation (attr->cu, &block, &llbufs[0], &listlens[0],
+ IDX_debug_info) != 0)
return -1;
return listlens[0] == 0 ? 0 : 1;
}
@@ -388,25 +590,21 @@ dwarf_getlocation_addr (attr, address, llbufs, listlens, maxlocs)
return -1;
}
- /* Must have the form data4 or data8 which act as an offset. */
- Dwarf_Word offset;
- if (unlikely (INTUSE(dwarf_formudata) (attr, &offset) != 0))
- return -1;
+ int result = check_constant_offset (attr, &llbufs[0], &listlens[0]);
+ if (result != 1)
+ return result ?: 1;
- const Elf_Data *d = attr->cu->dbg->sectiondata[IDX_debug_loc];
- if (unlikely (d == NULL))
- {
- __libdw_seterrno (DWARF_E_NO_LOCLIST);
- return -1;
- }
+ unsigned char *endp;
+ unsigned char *readp = __libdw_formptr (attr, IDX_debug_loc,
+ DWARF_E_NO_LOCLIST, &endp, NULL);
+ if (readp == NULL)
+ return -1;
Dwarf_Addr base = (Dwarf_Addr) -1;
- unsigned char *readp = d->d_buf + offset;
size_t got = 0;
while (got < maxlocs)
{
- if ((unsigned char *) d->d_buf + d->d_size - readp
- < attr->cu->address_size * 2)
+ if (endp - readp < attr->cu->address_size * 2)
{
invalid:
__libdw_seterrno (DWARF_E_INVALID_DWARF);
@@ -415,42 +613,25 @@ dwarf_getlocation_addr (attr, address, llbufs, listlens, maxlocs)
Dwarf_Addr begin;
Dwarf_Addr end;
- if (attr->cu->address_size == 8)
- {
- begin = read_8ubyte_unaligned_inc (attr->cu->dbg, readp);
- end = read_8ubyte_unaligned_inc (attr->cu->dbg, readp);
-
- if (begin == (Elf64_Addr) -1l) /* Base address entry. */
- {
- base = end;
- if (unlikely (base == (Dwarf_Addr) -1))
- goto invalid;
- continue;
- }
- }
- else
- {
- begin = read_4ubyte_unaligned_inc (attr->cu->dbg, readp);
- end = read_4ubyte_unaligned_inc (attr->cu->dbg, readp);
-
- if (begin == (Elf32_Addr) -1) /* Base address entry. */
- {
- base = end;
- continue;
- }
- }
- if (begin == 0 && end == 0) /* End of list entry. */
+ 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 ((unsigned char *) d->d_buf + d->d_size - readp < 2)
+ 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 ((unsigned char *) d->d_buf + d->d_size - readp
- < (ptrdiff_t) block.length)
+ if (endp - readp < (ptrdiff_t) block.length)
goto invalid;
readp += block.length;
@@ -486,7 +667,8 @@ dwarf_getlocation_addr (attr, address, llbufs, listlens, maxlocs)
/* This one matches the address. */
if (llbufs != NULL
&& unlikely (getlocation (attr->cu, &block,
- &llbufs[got], &listlens[got]) != 0))
+ &llbufs[got], &listlens[got],
+ IDX_debug_loc) != 0))
return -1;
++got;
}
diff --git a/libdw/dwarf_getmacros.c b/libdw/dwarf_getmacros.c
index 743ade3b..b9ec34b9 100644
--- a/libdw/dwarf_getmacros.c
+++ b/libdw/dwarf_getmacros.c
@@ -1,5 +1,5 @@
/* Get macro information.
- Copyright (C) 2002, 2003, 2004, 2005 Red Hat, Inc.
+ Copyright (C) 2002-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -65,27 +65,39 @@ dwarf_getmacros (die, callback, arg, offset)
void *arg;
ptrdiff_t offset;
{
- /* Get the appropriate attribute. */
- Dwarf_Attribute attr;
- if (INTUSE(dwarf_attr) (die, DW_AT_macro_info, &attr) == NULL)
+ if (die == NULL)
return -1;
- /* Offset into the .debug_macinfo section. */
- Dwarf_Word macoff;
- if (INTUSE(dwarf_formudata) (&attr, &macoff) != 0)
- return -1;
+ Elf_Data *d = die->cu->dbg->sectiondata[IDX_debug_macinfo];
+ if (unlikely (d == NULL) || unlikely (d->d_buf == NULL))
+ {
+ __libdw_seterrno (DWARF_E_NO_ENTRY);
+ return -1;
+ }
- const unsigned char *readp
- = die->cu->dbg->sectiondata[IDX_debug_macinfo]->d_buf + offset;
- const unsigned char *readendp
- = readp + die->cu->dbg->sectiondata[IDX_debug_macinfo]->d_size;
+ if (offset == 0)
+ {
+ /* Get the appropriate attribute. */
+ Dwarf_Attribute attr;
+ if (INTUSE(dwarf_attr) (die, DW_AT_macro_info, &attr) == NULL)
+ return -1;
- if (readp == readendp)
- return 0;
+ /* Offset into the .debug_macinfo section. */
+ Dwarf_Word macoff;
+ if (INTUSE(dwarf_formudata) (&attr, &macoff) != 0)
+ return -1;
- if (*readp != DW_MACINFO_start_file)
+ offset = macoff;
+ }
+ if (unlikely (offset > (ptrdiff_t) d->d_size))
goto invalid;
+ const unsigned char *readp = d->d_buf + offset;
+ const unsigned char *readendp = d->d_buf + d->d_size;
+
+ if (readp == readendp)
+ return 0;
+
while (readp < readendp)
{
unsigned int opcode = *readp++;
@@ -142,9 +154,7 @@ dwarf_getmacros (die, callback, arg, offset)
mac.param2.s = str;
if (callback (&mac, arg) != DWARF_CB_OK)
- return (readp
- - ((unsigned char *) die->cu->dbg->sectiondata[IDX_debug_macinfo]->d_buf
- + offset));
+ return readp - (const unsigned char *) d->d_buf;
}
/* If we come here the termination of the data for the CU is not
diff --git a/libdw/dwarf_getpubnames.c b/libdw/dwarf_getpubnames.c
index 6d07a3b7..5560a758 100644
--- a/libdw/dwarf_getpubnames.c
+++ b/libdw/dwarf_getpubnames.c
@@ -1,5 +1,5 @@
/* Get public symbol information.
- Copyright (C) 2002, 2003, 2004, 2005 Red Hat, Inc.
+ Copyright (C) 2002, 2003, 2004, 2005, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -58,6 +58,7 @@
#include <sys/param.h>
#include <libdwP.h>
+#include <dwarf.h>
static int
@@ -93,11 +94,17 @@ get_offsets (Dwarf *dbg)
/* Read the set header. */
int len_bytes = 4;
Dwarf_Off len = read_4ubyte_unaligned_inc (dbg, readp);
- if (len == 0xffffffff)
+ if (len == DWARF3_LENGTH_64_BIT)
{
len = read_8ubyte_unaligned_inc (dbg, readp);
len_bytes = 8;
}
+ else if (unlikely (len >= DWARF3_LENGTH_MIN_ESCAPE_CODE
+ && len <= DWARF3_LENGTH_MAX_ESCAPE_CODE))
+ {
+ __libdw_seterrno (DWARF_E_INVALID_DWARF);
+ goto err_return;
+ }
/* Now we know the offset of the first offset/name pair. */
mem[cnt].set_start = readp + 2 + 2 * len_bytes - startp;
@@ -109,27 +116,23 @@ get_offsets (Dwarf *dbg)
/* Read the version. It better be two for now. */
uint16_t version = read_2ubyte_unaligned (dbg, readp);
- if (version != 2)
+ if (unlikely (version != 2))
{
__libdw_seterrno (DWARF_E_INVALID_VERSION);
goto err_return;
}
/* Get the CU offset. */
- if (len_bytes == 4)
- mem[cnt].cu_offset = read_4ubyte_unaligned (dbg, readp + 2);
- else
- mem[cnt].cu_offset = read_8ubyte_unaligned (dbg, readp + 2);
+ if (__libdw_read_offset (dbg, IDX_debug_pubnames, readp + 2, len_bytes,
+ &mem[cnt].cu_offset, IDX_debug_info, 3))
+ /* Error has been already set in reader. */
+ goto err_return;
/* Determine the size of the CU header. */
- assert (dbg->sectiondata[IDX_debug_info] != NULL);
- assert (dbg->sectiondata[IDX_debug_info]->d_buf != NULL);
- assert (mem[cnt].cu_offset + 3
- < dbg->sectiondata[IDX_debug_info]->d_size);
unsigned char *infop
= ((unsigned char *) dbg->sectiondata[IDX_debug_info]->d_buf
+ mem[cnt].cu_offset);
- if (read_4ubyte_unaligned_noncvt (infop) == 0xffffffff)
+ if (read_4ubyte_unaligned_noncvt (infop) == DWARF3_LENGTH_64_BIT)
mem[cnt].cu_header_size = 23;
else
mem[cnt].cu_header_size = 11;
@@ -163,7 +166,7 @@ dwarf_getpubnames (dbg, callback, arg, offset)
if (dbg == NULL)
return -1l;
- if (offset < 0)
+ if (unlikely (offset < 0))
{
__libdw_seterrno (DWARF_E_INVALID_OFFSET);
return -1l;
@@ -177,7 +180,7 @@ dwarf_getpubnames (dbg, callback, arg, offset)
return 0;
/* If necessary read the set information. */
- if (dbg->pubnames_nsets == 0 && get_offsets (dbg) != 0)
+ if (dbg->pubnames_nsets == 0 && unlikely (get_offsets (dbg) != 0))
return -1l;
/* Find the place where to start. */
diff --git a/libdw/dwarf_getscopevar.c b/libdw/dwarf_getscopevar.c
index 4e5b429e..6ce214f5 100644
--- a/libdw/dwarf_getscopevar.c
+++ b/libdw/dwarf_getscopevar.c
@@ -1,5 +1,5 @@
/* Find a named variable or parameter within given scopes.
- Copyright (C) 2005 Red Hat, Inc.
+ Copyright (C) 2005-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -129,9 +129,7 @@ dwarf_getscopevar (Dwarf_Die *scopes, int nscopes,
}
/* Only get here for a variable or parameter. Check the name. */
- Dwarf_Attribute attr_mem;
- const char *diename = INTUSE(dwarf_formstring)
- (INTUSE(dwarf_attr_integrate) (result, DW_AT_name, &attr_mem));
+ const char *diename = INTUSE(dwarf_diename) (result);
if (diename != NULL && !strcmp (name, diename))
{
/* We have a matching name. */
diff --git a/libdw/dwarf_getsrc_file.c b/libdw/dwarf_getsrc_file.c
index 91abbaeb..bc612f6c 100644
--- a/libdw/dwarf_getsrc_file.c
+++ b/libdw/dwarf_getsrc_file.c
@@ -1,5 +1,5 @@
/* Find line information for given file/line/column triple.
- Copyright (C) 2005 Red Hat, Inc.
+ Copyright (C) 2005-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2005.
@@ -74,11 +74,11 @@ dwarf_getsrc_file (Dwarf *dbg, const char *fname, int lineno, int column,
size_t cur_match = 0;
Dwarf_Line **match = *nsrcs == 0 ? NULL : *srcsp;
- Dwarf_Off off = 0;
size_t cuhl;
Dwarf_Off noff;
-
- while (INTUSE(dwarf_nextcu) (dbg, off, &noff, &cuhl, NULL, NULL, NULL) == 0)
+ for (Dwarf_Off off = 0;
+ INTUSE(dwarf_nextcu) (dbg, off, &noff, &cuhl, NULL, NULL, NULL) == 0;
+ off = noff)
{
Dwarf_Die cudie_mem;
Dwarf_Die *cudie = INTUSE(dwarf_offdie) (dbg, off + cuhl, &cudie_mem);
@@ -89,7 +89,14 @@ dwarf_getsrc_file (Dwarf *dbg, const char *fname, int lineno, int column,
Dwarf_Lines *lines;
size_t nlines;
if (INTUSE(dwarf_getsrclines) (cudie, &lines, &nlines) != 0)
- return -1;
+ {
+ /* Ignore a CU that just has no DW_AT_stmt_list at all. */
+ int error = INTUSE(dwarf_errno) ();
+ if (error == 0)
+ continue;
+ __libdw_seterrno (error);
+ return -1;
+ }
/* Search through all the line number records for a matching
file and line/column number. If any of the numbers is zero,
@@ -175,8 +182,6 @@ dwarf_getsrc_file (Dwarf *dbg, const char *fname, int lineno, int column,
already, there is no need to go on to the next CU. */
if (cur_match == max_match)
break;
-
- off = noff;
}
if (cur_match > 0)
diff --git a/libdw/dwarf_getsrclines.c b/libdw/dwarf_getsrclines.c
index 666cca22..43fad99a 100644
--- a/libdw/dwarf_getsrclines.c
+++ b/libdw/dwarf_getsrclines.c
@@ -1,5 +1,5 @@
/* Return line number information of CU.
- Copyright (C) 2004, 2005, 2007 Red Hat, Inc.
+ Copyright (C) 2004-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2004.
@@ -135,20 +135,13 @@ dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines, size_t *nlines)
/* Get the offset into the .debug_line section. NB: this call
also checks whether the previous dwarf_attr call failed. */
- Dwarf_Word offset;
- if (INTUSE(dwarf_formudata) (stmt_list, &offset) != 0)
+ const unsigned char *lineendp;
+ const unsigned char *linep
+ = __libdw_formptr (stmt_list, IDX_debug_line, DWARF_E_NO_DEBUG_LINE,
+ (unsigned char **) &lineendp, NULL);
+ if (linep == NULL)
goto out;
- Dwarf *dbg = cu->dbg;
- if (dbg->sectiondata[IDX_debug_line] == NULL)
- {
- __libdw_seterrno (DWARF_E_NO_DEBUG_LINE);
- goto out;
- }
- const uint8_t *linep = dbg->sectiondata[IDX_debug_line]->d_buf + offset;
- const uint8_t *lineendp = (dbg->sectiondata[IDX_debug_line]->d_buf
- + dbg->sectiondata[IDX_debug_line]->d_size);
-
/* Get the compilation directory. */
Dwarf_Attribute compdir_attr_mem;
Dwarf_Attribute *compdir_attr = INTUSE(dwarf_attr) (cudie,
@@ -162,9 +155,11 @@ dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines, size_t *nlines)
__libdw_seterrno (DWARF_E_INVALID_DEBUG_LINE);
goto out;
}
+
+ Dwarf *dbg = cu->dbg;
Dwarf_Word unit_length = read_4ubyte_unaligned_inc (dbg, linep);
unsigned int length = 4;
- if (unlikely (unit_length == 0xffffffff))
+ if (unlikely (unit_length == DWARF3_LENGTH_64_BIT))
{
if (unlikely (linep + 8 > lineendp))
goto invalid_data;
@@ -180,7 +175,7 @@ dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines, size_t *nlines)
/* The next element of the header is the version identifier. */
uint_fast16_t version = read_2ubyte_unaligned_inc (dbg, linep);
- if (unlikely (version != DWARF_VERSION))
+ if (unlikely (version > DWARF_VERSION))
{
__libdw_seterrno (DWARF_E_VERSION);
goto out;
@@ -429,10 +424,9 @@ dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines, size_t *nlines)
/* The value is an address. The size is defined as
apporiate for the target machine. We use the
address size field from the CU header. */
- if (cu->address_size == 4)
- address = read_4ubyte_unaligned_inc (dbg, linep);
- else
- address = read_8ubyte_unaligned_inc (dbg, linep);
+ if (__libdw_read_address_inc (dbg, IDX_debug_line, &linep,
+ cu->address_size, &address))
+ goto out;
break;
case DW_LNE_define_file:
@@ -634,8 +628,8 @@ dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines, size_t *nlines)
dirs[i] = dirarray[i]->dir;
dirs[ndirlist] = NULL;
- /* Remember the debugging descriptor. */
- files->dbg = dbg;
+ /* Remember the referring CU. */
+ files->cu = cu;
/* Make the file data structure available through the CU. */
cu->files = files;
diff --git a/libdw/dwarf_hasattr_integrate.c b/libdw/dwarf_hasattr_integrate.c
index 12b48631..806742d6 100644
--- a/libdw/dwarf_hasattr_integrate.c
+++ b/libdw/dwarf_hasattr_integrate.c
@@ -68,6 +68,8 @@ dwarf_hasattr_integrate (Dwarf_Die *die, unsigned int search_name)
Dwarf_Attribute *attr = INTUSE(dwarf_attr) (die, DW_AT_abstract_origin,
&attr_mem);
if (attr == NULL)
+ attr = INTUSE(dwarf_attr) (die, DW_AT_specification, &attr_mem);
+ if (attr == NULL)
break;
die = INTUSE(dwarf_formref_die) (attr, &die_mem);
diff --git a/libdw/dwarf_haschildren.c b/libdw/dwarf_haschildren.c
index 7b21f690..d9a47ad2 100644
--- a/libdw/dwarf_haschildren.c
+++ b/libdw/dwarf_haschildren.c
@@ -1,5 +1,5 @@
/* Return string associated with given attribute.
- Copyright (C) 2003, 2005 Red Hat, Inc.
+ Copyright (C) 2003, 2005, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2003.
@@ -62,7 +62,7 @@ dwarf_haschildren (die)
{
/* Find the abbreviation entry. */
Dwarf_Abbrev *abbrevp = die->abbrev;
- if (abbrevp != (Dwarf_Abbrev *) -1l)
+ if (abbrevp != DWARF_END_ABBREV)
{
const unsigned char *readp = (unsigned char *) die->addr;
@@ -72,12 +72,12 @@ dwarf_haschildren (die)
get_uleb128 (abbrev_code, readp);
abbrevp = __libdw_findabbrev (die->cu, abbrev_code);
- die->abbrev = abbrevp ?: (Dwarf_Abbrev *) -1l;
+ die->abbrev = abbrevp ?: DWARF_END_ABBREV;
}
- if (unlikely (die->abbrev == (Dwarf_Abbrev *) -1l))
+ if (unlikely (die->abbrev == DWARF_END_ABBREV))
{
__libdw_seterrno (DWARF_E_INVALID_DWARF);
- return 0;
+ return -1;
}
return die->abbrev->has_children;
diff --git a/libdw/dwarf_next_cfi.c b/libdw/dwarf_next_cfi.c
new file mode 100644
index 00000000..d5d4cfdb
--- /dev/null
+++ b/libdw/dwarf_next_cfi.c
@@ -0,0 +1,234 @@
+/* Advance to next CFI entry.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "cfi.h"
+#include "encoded-value.h"
+
+#include <string.h>
+
+
+int
+dwarf_next_cfi (e_ident, data, eh_frame_p, off, next_off, entry)
+ const unsigned char e_ident[];
+ Elf_Data *data;
+ bool eh_frame_p;
+ Dwarf_Off off;
+ Dwarf_Off *next_off;
+ Dwarf_CFI_Entry *entry;
+{
+ /* Dummy struct for memory-access.h macros. */
+ BYTE_ORDER_DUMMY (dw, e_ident);
+
+ /* If we reached the end before don't do anything. */
+ if (off == (Dwarf_Off) -1l
+ /* Make sure there is enough space in the .debug_frame section
+ for at least the initial word. We cannot test the rest since
+ we don't know yet whether this is a 64-bit object or not. */
+ || unlikely (off + 4 >= data->d_size))
+ {
+ *next_off = (Dwarf_Off) -1l;
+ return 1;
+ }
+
+ /* This points into the .debug_frame section at the start of the entry. */
+ const uint8_t *bytes = data->d_buf + off;
+ const uint8_t *limit = data->d_buf + data->d_size;
+
+ /* The format of a CFI entry is described in DWARF3 6.4.1:
+ */
+
+ uint64_t length = read_4ubyte_unaligned_inc (&dw, bytes);
+ size_t offset_size = 4;
+ if (length == DWARF3_LENGTH_64_BIT)
+ {
+ /* This is the 64-bit DWARF format. */
+ offset_size = 8;
+ if (unlikely (limit - bytes < 8))
+ {
+ invalid:
+ __libdw_seterrno (DWARF_E_INVALID_DWARF);
+ return -1;
+ }
+ length = read_8ubyte_unaligned_inc (&dw, bytes);
+ }
+ if (unlikely ((uint64_t) (limit - bytes) < length)
+ || unlikely (length < offset_size + 1))
+ goto invalid;
+
+ /* Now we know how large the entry is. Note the trick in the
+ computation. If the offset_size is 4 the '- 4' term undoes the
+ '2 *'. If offset_size is 8 this term computes the size of the
+ escape value plus the 8 byte offset. */
+ *next_off = off + (2 * offset_size - 4) + length;
+
+ limit = bytes + length;
+
+ const uint8_t *const cie_pointer_start = bytes;
+ if (offset_size == 8)
+ entry->cie.CIE_id = read_8ubyte_unaligned_inc (&dw, bytes);
+ else
+ {
+ entry->cie.CIE_id = read_4ubyte_unaligned_inc (&dw, bytes);
+ /* Canonicalize the 32-bit CIE_ID value to 64 bits. */
+ if (!eh_frame_p && entry->cie.CIE_id == DW_CIE_ID_32)
+ entry->cie.CIE_id = DW_CIE_ID_64;
+ }
+ if (eh_frame_p)
+ {
+ /* Canonicalize the .eh_frame CIE pointer to .debug_frame format. */
+ if (entry->cie.CIE_id == 0)
+ entry->cie.CIE_id = DW_CIE_ID_64;
+ else
+ {
+ /* In .eh_frame format, a CIE pointer is the distance from where
+ it appears back to the beginning of the CIE. */
+ ptrdiff_t pos = cie_pointer_start - (const uint8_t *) data->d_buf;
+ if (unlikely (entry->cie.CIE_id > (Dwarf_Off) pos)
+ || unlikely (pos <= (ptrdiff_t) offset_size))
+ goto invalid;
+ entry->cie.CIE_id = pos - entry->cie.CIE_id;
+ }
+ }
+
+ if (entry->cie.CIE_id == DW_CIE_ID_64)
+ {
+ /* Read the version stamp. Always an 8-bit value. */
+ uint8_t version = *bytes++;
+
+ if (version != 1 && version != 3)
+ goto invalid;
+
+ entry->cie.augmentation = (const char *) bytes;
+
+ bytes = memchr (bytes, '\0', limit - bytes);
+ if (bytes == NULL)
+ goto invalid;
+ ++bytes;
+
+ const char *ap = entry->cie.augmentation;
+
+ /* g++ v2 "eh" has pointer immediately following augmentation string,
+ so it must be handled first. */
+ if (unlikely (ap[0] == 'e' && ap[1] == 'h'))
+ {
+ /* The address size for CFI is implicit in the ELF class. */
+ unsigned int address_size = e_ident[EI_CLASS] == ELFCLASS32 ? 4 : 8;
+
+ ap += 2;
+ bytes += address_size;
+ }
+
+ get_uleb128 (entry->cie.code_alignment_factor, bytes);
+ get_sleb128 (entry->cie.data_alignment_factor, bytes);
+
+ if (version == 3) /* DWARF 3 */
+ get_uleb128 (entry->cie.return_address_register, bytes);
+ else /* DWARF 2 */
+ entry->cie.return_address_register = *bytes++;
+
+ /* If we have sized augmentation data,
+ we don't need to grok it all. */
+ entry->cie.fde_augmentation_data_size = 0;
+ bool sized_augmentation = *ap == 'z';
+ if (sized_augmentation)
+ {
+ get_uleb128 (entry->cie.augmentation_data_size, bytes);
+ if ((Dwarf_Word) (limit - bytes) < entry->cie.augmentation_data_size)
+ goto invalid;
+ entry->cie.augmentation_data = bytes;
+ bytes += entry->cie.augmentation_data_size;
+ }
+ else
+ {
+ entry->cie.augmentation_data = bytes;
+
+ for (; *ap != '\0'; ++ap)
+ {
+ uint8_t encoding;
+ switch (*ap)
+ {
+ case 'L': /* Skip LSDA pointer encoding byte. */
+ case 'R': /* Skip FDE address encoding byte. */
+ encoding = *bytes++;
+ entry->cie.fde_augmentation_data_size
+ += encoded_value_size (data, e_ident, encoding, NULL);
+ continue;
+ case 'P': /* Skip encoded personality routine pointer. */
+ encoding = *bytes++;
+ bytes += encoded_value_size (data, e_ident, encoding, bytes);
+ continue;
+ case 'S': /* Skip signal-frame flag. */
+ continue;
+ default:
+ /* Unknown augmentation string. initial_instructions might
+ actually start with some augmentation data. */
+ break;
+ }
+ break;
+ }
+ entry->cie.augmentation_data_size
+ = bytes - entry->cie.augmentation_data;
+ }
+
+ entry->cie.initial_instructions = bytes;
+ entry->cie.initial_instructions_end = limit;
+ }
+ else
+ {
+ entry->fde.start = bytes;
+ entry->fde.end = limit;
+ }
+
+ return 0;
+}
+INTDEF (dwarf_next_cfi)
diff --git a/libdw/dwarf_nextcu.c b/libdw/dwarf_nextcu.c
index 30743022..e436e115 100644
--- a/libdw/dwarf_nextcu.c
+++ b/libdw/dwarf_nextcu.c
@@ -1,5 +1,5 @@
/* Advance to next CU header.
- Copyright (C) 2002, 2003, 2004, 2005 Red Hat, Inc.
+ Copyright (C) 2002-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -53,6 +53,7 @@
#endif
#include <libdwP.h>
+#include <dwarf.h>
int
@@ -83,7 +84,8 @@ dwarf_nextcu (dwarf, off, next_off, header_sizep, abbrev_offsetp,
/* This points into the .debug_info section to the beginning of the
CU entry. */
- char *bytes = (char *) dwarf->sectiondata[IDX_debug_info]->d_buf + off;
+ const unsigned char *data = dwarf->sectiondata[IDX_debug_info]->d_buf;
+ const unsigned char *bytes = data + off;
/* The format of the CU header is described in dwarf2p1 7.5.1:
@@ -91,9 +93,9 @@ dwarf_nextcu (dwarf, off, next_off, header_sizep, abbrev_offsetp,
of the .debug_info contribution for that compilation unit, not
including the length field itself. In the 32-bit DWARF format,
this is a 4-byte unsigned integer (which must be less than
- 0xffffff00); in the 64-bit DWARF format, this consists of the
+ 0xfffffff0); in the 64-bit DWARF format, this consists of the
4-byte value 0xffffffff followed by an 8-byte unsigned integer
- that gives the actual length (see Section 7.4).
+ that gives the actual length (see Section 7.2.2).
2. A 2-byte unsigned integer representing the version of the
DWARF information for that compilation unit. For DWARF Version
@@ -112,22 +114,27 @@ dwarf_nextcu (dwarf, off, next_off, header_sizep, abbrev_offsetp,
offset portion of an address. */
uint64_t length = read_4ubyte_unaligned_inc (dwarf, bytes);
size_t offset_size = 4;
- if (length == 0xffffffffu)
+ /* Lengths of 0xfffffff0 - 0xffffffff are escape codes. Oxffffffff is
+ used to indicate that 64-bit dwarf information is being used, the
+ other values are currently reserved. */
+ if (length == DWARF3_LENGTH_64_BIT)
offset_size = 8;
+ else if (unlikely (length >= DWARF3_LENGTH_MIN_ESCAPE_CODE
+ && length <= DWARF3_LENGTH_MAX_ESCAPE_CODE))
+ {
+ __libdw_seterrno (DWARF_E_INVALID_DWARF);
+ return -1;
+ }
- /* Now we know how large the header is. Note the trick in the
- computation. If the offset_size is 4 the '- 4' term undoes the
- '2 *'. If offset_size is 8 this term computes the size of the
- escape value plus the 8 byte offset. */
- if (unlikely (off + 2 * offset_size - 4 + sizeof (uint16_t)
- + offset_size + sizeof (uint8_t)
+ /* Now we know how large the header is. */
+ if (unlikely (DIE_OFFSET_FROM_CU_OFFSET (off, offset_size)
>= dwarf->sectiondata[IDX_debug_info]->d_size))
{
*next_off = -1;
return 1;
}
- if (length == 0xffffffffu)
+ if (length == DWARF3_LENGTH_64_BIT)
/* This is a 64-bit DWARF format. */
length = read_8ubyte_unaligned_inc (dwarf, bytes);
@@ -138,10 +145,10 @@ dwarf_nextcu (dwarf, off, next_off, header_sizep, abbrev_offsetp,
/* Get offset in .debug_abbrev. Note that the size of the entry
depends on whether this is a 32-bit or 64-bit DWARF definition. */
uint64_t abbrev_offset;
- if (offset_size == 4)
- abbrev_offset = read_4ubyte_unaligned_inc (dwarf, bytes);
- else
- abbrev_offset = read_8ubyte_unaligned_inc (dwarf, bytes);
+ if (__libdw_read_offset_inc (dwarf, IDX_debug_info, &bytes, offset_size,
+ &abbrev_offset, IDX_debug_abbrev, 0))
+ return -1;
+
if (abbrev_offsetp != NULL)
*abbrev_offsetp = abbrev_offset;
@@ -156,11 +163,10 @@ dwarf_nextcu (dwarf, off, next_off, header_sizep, abbrev_offsetp,
/* Store the header length. */
if (header_sizep != NULL)
- *header_sizep = (bytes
- - ((char *) dwarf->sectiondata[IDX_debug_info]->d_buf
- + off));
+ *header_sizep = bytes - (data + off);
- /* See above for an explanation of the trick in this formula. */
+ /* See definition of DIE_OFFSET_FROM_CU_OFFSET macro
+ for an explanation of the trick in this expression. */
*next_off = off + 2 * offset_size - 4 + length;
return 0;
diff --git a/libdw/dwarf_ranges.c b/libdw/dwarf_ranges.c
index 89da0af4..50fb6ba2 100644
--- a/libdw/dwarf_ranges.c
+++ b/libdw/dwarf_ranges.c
@@ -1,5 +1,5 @@
/* Enumerate the PC ranges covered by a DIE.
- Copyright (C) 2005, 2007 Red Hat, Inc.
+ Copyright (C) 2005, 2007, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -55,6 +55,52 @@
#include <dwarf.h>
#include <assert.h>
+/* Read up begin/end pair and increment read pointer.
+ - If it's normal range record, set up `*beginp' and `*endp' and return 0.
+ - If it's base address selection record, set up `*basep' and return 1.
+ - If it's end of rangelist, don't set anything and return 2
+ - If an error occurs, don't set anything and return -1. */
+internal_function int
+__libdw_read_begin_end_pair_inc (Dwarf *dbg, int sec_index,
+ unsigned char **addrp, int width,
+ Dwarf_Addr *beginp, Dwarf_Addr *endp,
+ Dwarf_Addr *basep)
+{
+ Dwarf_Addr escape = (width == 8 ? (Elf64_Addr) -1
+ : (Elf64_Addr) (Elf32_Addr) -1);
+ Dwarf_Addr begin;
+ Dwarf_Addr end;
+
+ unsigned char *addr = *addrp;
+ bool begin_relocated = READ_AND_RELOCATE (__libdw_relocate_address, begin);
+ bool end_relocated = READ_AND_RELOCATE (__libdw_relocate_address, end);
+ *addrp = addr;
+
+ /* Unrelocated escape for begin means base address selection. */
+ if (begin == escape && !begin_relocated)
+ {
+ if (unlikely (end == escape))
+ {
+ __libdw_seterrno (DWARF_E_INVALID_DWARF);
+ return -1;
+ }
+
+ if (basep != NULL)
+ *basep = end;
+ return 1;
+ }
+
+ /* Unrelocated pair of zeroes means end of range list. */
+ if (begin == 0 && end == 0 && !begin_relocated && !end_relocated)
+ return 2;
+
+ /* Don't check for begin_relocated == end_relocated. Serve the data
+ to the client even though it may be buggy. */
+ *beginp = begin;
+ *endp = end;
+
+ return 0;
+}
ptrdiff_t
dwarf_ranges (Dwarf_Die *die, ptrdiff_t offset, Dwarf_Addr *basep,
@@ -78,23 +124,27 @@ dwarf_ranges (Dwarf_Die *die, ptrdiff_t offset, Dwarf_Addr *basep,
/* We have to look for a noncontiguous range. */
const Elf_Data *d = die->cu->dbg->sectiondata[IDX_debug_ranges];
- if (d == NULL)
+ if (d == NULL && offset != 0)
{
__libdw_seterrno (DWARF_E_NO_DEBUG_RANGES);
return -1;
}
+ unsigned char *readp;
+ unsigned char *readendp;
if (offset == 0)
{
Dwarf_Attribute attr_mem;
Dwarf_Attribute *attr = INTUSE(dwarf_attr) (die, DW_AT_ranges,
&attr_mem);
if (attr == NULL)
- return -1;
+ /* No PC attributes in this DIE at all, so an empty range list. */
+ return 0;
- /* Must have the form data4 or data8 which act as an offset. */
Dwarf_Word start_offset;
- if (INTUSE(dwarf_formudata) (attr, &start_offset) != 0)
+ if ((readp = __libdw_formptr (attr, IDX_debug_ranges,
+ DWARF_E_NO_DEBUG_RANGES,
+ &readendp, &start_offset)) == NULL)
return -1;
offset = start_offset;
@@ -122,45 +172,37 @@ dwarf_ranges (Dwarf_Die *die, ptrdiff_t offset, Dwarf_Addr *basep,
return -1;
}
}
- else if (offset < 0 || (size_t) offset >= d->d_size)
+ else
{
- __libdw_seterrno (DWARF_E_INVALID_OFFSET);
- return -1l;
- }
+ if (__libdw_offset_in_section (die->cu->dbg,
+ IDX_debug_ranges, offset, 1))
+ return -1l;
- unsigned char *readp = d->d_buf + offset;
+ readp = d->d_buf + offset;
+ readendp = d->d_buf + d->d_size;
+ }
next:
- if ((unsigned char *) d->d_buf + d->d_size - readp
- < die->cu->address_size * 2)
+ if (readendp - readp < die->cu->address_size * 2)
goto invalid;
Dwarf_Addr begin;
Dwarf_Addr end;
- if (die->cu->address_size == 8)
- {
- begin = read_8ubyte_unaligned_inc (die->cu->dbg, readp);
- end = read_8ubyte_unaligned_inc (die->cu->dbg, readp);
- if (begin == (uint64_t) -1l) /* Base address entry. */
- {
- *basep = end;
- goto next;
- }
- }
- else
+
+ switch (__libdw_read_begin_end_pair_inc (die->cu->dbg, IDX_debug_ranges,
+ &readp, die->cu->address_size,
+ &begin, &end, basep))
{
- begin = read_4ubyte_unaligned_inc (die->cu->dbg, readp);
- end = read_4ubyte_unaligned_inc (die->cu->dbg, readp);
- if (begin == (uint32_t) -1) /* Base address entry. */
- {
- *basep = end;
- goto next;
- }
+ case 0:
+ break;
+ case 1:
+ goto next;
+ case 2:
+ return 0;
+ default:
+ return -1l;
}
- if (begin == 0 && end == 0) /* End of list entry. */
- return 0;
-
/* We have an address range entry. */
*startp = *basep + begin;
*endp = *basep + end;
diff --git a/libdw/dwarf_siblingof.c b/libdw/dwarf_siblingof.c
index a6cca394..0d427175 100644
--- a/libdw/dwarf_siblingof.c
+++ b/libdw/dwarf_siblingof.c
@@ -1,5 +1,5 @@
/* Return sibling of given DIE.
- Copyright (C) 2003, 2004, 2005, 2007 Red Hat, Inc.
+ Copyright (C) 2003, 2004, 2005, 2007, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2003.
@@ -66,6 +66,12 @@ dwarf_siblingof (die, result)
if (die == NULL)
return -1;
+ if (result == NULL)
+ return -1;
+
+ if (result != die)
+ result->addr = NULL;
+
unsigned int level = 0;
/* Copy of the current DIE. */
@@ -92,7 +98,7 @@ dwarf_siblingof (die, result)
{
Dwarf_Off offset;
sibattr.valp = addr;
- if (__libdw_formref (&sibattr, &offset) != 0)
+ if (unlikely (__libdw_formref (&sibattr, &offset) != 0))
/* Something went wrong. */
return -1;
@@ -102,7 +108,7 @@ dwarf_siblingof (die, result)
+ sibattr.cu->start + offset);
}
else if (unlikely (addr == NULL)
- || unlikely (this_die.abbrev == (Dwarf_Abbrev *) -1l))
+ || unlikely (this_die.abbrev == DWARF_END_ABBREV))
return -1;
else if (this_die.abbrev->has_children)
/* This abbreviation has children. */
@@ -120,8 +126,12 @@ dwarf_siblingof (die, result)
break;
if (level-- == 0)
- /* No more sibling at all. */
- return 1;
+ {
+ if (result != die)
+ result->addr = addr;
+ /* No more sibling at all. */
+ return 1;
+ }
++addr;
}
diff --git a/libdw/dwarf_srclang.c b/libdw/dwarf_srclang.c
index 2efa0954..305ffcd0 100644
--- a/libdw/dwarf_srclang.c
+++ b/libdw/dwarf_srclang.c
@@ -1,5 +1,5 @@
/* Return source language attribute of DIE.
- Copyright (C) 2003, 2005 Red Hat, Inc.
+ Copyright (C) 2003-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2003.
@@ -63,7 +63,10 @@ dwarf_srclang (die)
Dwarf_Attribute attr_mem;
Dwarf_Word value;
- return INTUSE(dwarf_formudata) (INTUSE(dwarf_attr) (die, DW_AT_language,
- &attr_mem),
+ return INTUSE(dwarf_formudata) (INTUSE(dwarf_attr_integrate)
+ (die, DW_AT_language, &attr_mem),
&value) == 0 ? (int) value : -1;
}
+INTDEF (dwarf_srclang)
+OLD_VERSION (dwarf_srclang, ELFUTILS_0.122)
+NEW_VERSION (dwarf_srclang, ELFUTILS_0.143)
diff --git a/libdw/dwarf_tag.c b/libdw/dwarf_tag.c
index 05222821..15183d2d 100644
--- a/libdw/dwarf_tag.c
+++ b/libdw/dwarf_tag.c
@@ -1,5 +1,5 @@
/* Return tag of given DIE.
- Copyright (C) 2003, 2004, 2005, 2006 Red Hat, Inc.
+ Copyright (C) 2003, 2004, 2005, 2006, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2003.
@@ -76,8 +76,7 @@ __libdw_findabbrev (struct Dwarf_CU *cu, unsigned int code)
{
/* Make sure we do not try to search for it again. */
cu->last_abbrev_offset = (size_t) -1l;
- abb = (void *) -1l;
- break;
+ return DWARF_END_ABBREV;
}
cu->last_abbrev_offset += length;
@@ -107,7 +106,7 @@ dwarf_tag (die)
die->abbrev = __libdw_findabbrev (die->cu, u128);
}
- if (die->abbrev == (Dwarf_Abbrev *) -1l)
+ if (unlikely (die->abbrev == DWARF_END_ABBREV))
{
__libdw_seterrno (DWARF_E_INVALID_DWARF);
return DW_TAG_invalid;
diff --git a/libdw/encoded-value.h b/libdw/encoded-value.h
new file mode 100644
index 00000000..3f9b2440
--- /dev/null
+++ b/libdw/encoded-value.h
@@ -0,0 +1,202 @@
+/* DW_EH_PE_* support for libdw unwinder.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifndef _ENCODED_VALUE_H
+#define _ENCODED_VALUE_H 1
+
+#include <dwarf.h>
+#include <stdlib.h>
+#include "libdwP.h"
+
+
+static size_t __attribute__ ((unused))
+encoded_value_size (const Elf_Data *data, const unsigned char e_ident[],
+ uint8_t encoding, const uint8_t *p)
+{
+ if (encoding == DW_EH_PE_omit)
+ return 0;
+
+ switch (encoding & 0x07)
+ {
+ case DW_EH_PE_udata2:
+ return 2;
+ case DW_EH_PE_udata4:
+ return 4;
+ case DW_EH_PE_udata8:
+ return 8;
+
+ case DW_EH_PE_absptr:
+ return e_ident[EI_CLASS] == ELFCLASS32 ? 4 : 8;
+
+ case DW_EH_PE_uleb128:
+ if (p != NULL)
+ {
+ const uint8_t *end = p;
+ while (end < (uint8_t *) data->d_buf + data->d_size)
+ if (*end++ & 0x80u)
+ return end - p;
+ }
+
+ default:
+ abort ();
+ return 0;
+ }
+}
+
+static inline int __attribute__ ((unused))
+__libdw_cfi_read_address_inc (const Dwarf_CFI *cache,
+ const unsigned char **addrp,
+ int width, Dwarf_Addr *ret)
+{
+ width = width ?: cache->e_ident[EI_CLASS] == ELFCLASS32 ? 4 : 8;
+
+ if (cache->dbg != NULL)
+ return __libdw_read_address_inc (cache->dbg, IDX_debug_frame,
+ addrp, width, ret);
+
+ /* Only .debug_frame might have relocation to consider.
+ Read plain values from .eh_frame data. */
+
+ if (width == 4)
+ *ret = read_4ubyte_unaligned_inc (cache, *addrp);
+ else
+ *ret = read_8ubyte_unaligned_inc (cache, *addrp);
+ return 0;
+}
+
+static bool __attribute__ ((unused))
+read_encoded_value (const Dwarf_CFI *cache, uint8_t encoding, const uint8_t **p,
+ Dwarf_Addr *result)
+{
+ *result = 0;
+ switch (encoding & 0x70)
+ {
+ case DW_EH_PE_absptr:
+ break;
+ case DW_EH_PE_pcrel:
+ *result = (cache->frame_vaddr
+ + (*p - (const uint8_t *) cache->data->d.d_buf));
+ break;
+ case DW_EH_PE_textrel:
+ // ia64: segrel
+ *result = cache->textrel;
+ break;
+ case DW_EH_PE_datarel:
+ // i386: GOTOFF
+ // ia64: gprel
+ *result = cache->datarel;
+ break;
+ case DW_EH_PE_funcrel: /* XXX */
+ break;
+ case DW_EH_PE_aligned:
+ {
+ const size_t address_size
+ = cache->e_ident[EI_CLASS] == ELFCLASS32 ? 4 : 8;
+ size_t align = ((cache->frame_vaddr
+ + (*p - (const uint8_t *) cache->data->d.d_buf))
+ & (address_size - 1));
+ if (align != 0)
+ *p += address_size - align;
+ break;
+ }
+
+ default:
+ abort ();
+ }
+
+ Dwarf_Addr value;
+ switch (encoding & 0x0f)
+ {
+ case DW_EH_PE_udata2:
+ value = read_2ubyte_unaligned_inc (cache, *p);
+ break;
+
+ case DW_EH_PE_sdata2:
+ value = read_2sbyte_unaligned_inc (cache, *p);
+ break;
+
+ case DW_EH_PE_udata4:
+ if (__libdw_cfi_read_address_inc (cache, p, 4, &value))
+ return false;
+ break;
+
+ case DW_EH_PE_sdata4:
+ if (__libdw_cfi_read_address_inc (cache, p, 4, &value))
+ return false;
+ value = (Dwarf_Sword) (Elf32_Sword) value; /* Sign-extend. */
+ break;
+
+ case DW_EH_PE_udata8:
+ case DW_EH_PE_sdata8:
+ if (__libdw_cfi_read_address_inc (cache, p, 8, &value))
+ return false;
+ break;
+
+ case DW_EH_PE_absptr:
+ if (__libdw_cfi_read_address_inc (cache, p, 0, &value))
+ return false;
+ break;
+
+ case DW_EH_PE_uleb128:
+ get_uleb128 (value, *p);
+ break;
+
+ case DW_EH_PE_sleb128:
+ get_sleb128 (value, *p);
+ break;
+
+ default:
+ abort ();
+ }
+
+ *result += value;
+ return false;
+}
+
+#endif /* encoded-value.h */
diff --git a/libdw/fde.c b/libdw/fde.c
new file mode 100644
index 00000000..c826114c
--- /dev/null
+++ b/libdw/fde.c
@@ -0,0 +1,306 @@
+/* FDE reading.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "cfi.h"
+#include <search.h>
+#include <stdlib.h>
+
+#include "encoded-value.h"
+
+static int
+compare_fde (const void *a, const void *b)
+{
+ const struct dwarf_fde *fde1 = a;
+ const struct dwarf_fde *fde2 = b;
+
+ /* Find out which of the two arguments is the search value.
+ It has end offset 0. */
+ if (fde1->end == 0)
+ {
+ if (fde1->start < fde2->start)
+ return -1;
+ if (fde1->start >= fde2->end)
+ return 1;
+ }
+ else
+ {
+ if (fde2->start < fde1->start)
+ return 1;
+ if (fde2->start >= fde1->end)
+ return -1;
+ }
+
+ return 0;
+}
+
+static struct dwarf_fde *
+intern_fde (Dwarf_CFI *cache, const Dwarf_FDE *entry)
+{
+ /* Look up the new entry's CIE. */
+ struct dwarf_cie *cie = __libdw_find_cie (cache, entry->CIE_pointer);
+ if (cie == NULL)
+ return (void *) -1l;
+
+ struct dwarf_fde *fde = malloc (sizeof (struct dwarf_fde));
+ if (fde == NULL)
+ {
+ __libdw_seterrno (DWARF_E_NOMEM);
+ return NULL;
+ }
+
+ fde->instructions = entry->start;
+ fde->instructions_end = entry->end;
+ if (unlikely (read_encoded_value (cache, cie->fde_encoding,
+ &fde->instructions, &fde->start))
+ || unlikely (read_encoded_value (cache, cie->fde_encoding & 0x0f,
+ &fde->instructions, &fde->end)))
+ return NULL;
+ fde->end += fde->start;
+
+ fde->cie = cie;
+
+ if (cie->sized_augmentation_data)
+ {
+ /* The CIE augmentation says the FDE has a DW_FORM_block
+ before its actual instruction stream. */
+ Dwarf_Word len;
+ get_uleb128 (len, fde->instructions);
+ if ((Dwarf_Word) (fde->instructions_end - fde->instructions) < len)
+ {
+ free (fde);
+ __libdw_seterrno (DWARF_E_INVALID_DWARF);
+ return NULL;
+ }
+ fde->instructions += len;
+ }
+ else
+ /* We had to understand all of the CIE augmentation string.
+ We've recorded the number of data bytes in FDEs. */
+ fde->instructions += cie->fde_augmentation_data_size;
+
+ /* Add the new entry to the search tree. */
+ if (tsearch (fde, &cache->fde_tree, &compare_fde) == NULL)
+ {
+ free (fde);
+ __libdw_seterrno (DWARF_E_NOMEM);
+ return NULL;
+ }
+
+ return fde;
+}
+
+static struct dwarf_fde *
+fde_by_offset (Dwarf_CFI *cache, Dwarf_Addr address, Dwarf_Off offset)
+{
+ Dwarf_CFI_Entry entry;
+ Dwarf_Off next_offset;
+ int result = INTUSE(dwarf_next_cfi) (cache->e_ident,
+ &cache->data->d, CFI_IS_EH (cache),
+ offset, &next_offset, &entry);
+ if (result != 0)
+ {
+ if (result > 0)
+ invalid:
+ __libdw_seterrno (DWARF_E_INVALID_DWARF);
+ return NULL;
+ }
+
+ if (unlikely (dwarf_cfi_cie_p (&entry)))
+ goto invalid;
+
+ /* We have a new FDE to consider. */
+ struct dwarf_fde *fde = intern_fde (cache, &entry.fde);
+ if (fde == (void *) -1l || fde == NULL)
+ return NULL;
+
+ /* If this happened to be what we would have read next, notice it. */
+ if (cache->next_offset == offset)
+ cache->next_offset = next_offset;
+
+ /* Sanity check the address range. */
+ if (address < fde->start || address >= fde->end)
+ goto invalid;
+
+ return fde;
+}
+
+/* Use a binary search table in .eh_frame_hdr format, yield an FDE offset. */
+static Dwarf_Off
+binary_search_fde (Dwarf_CFI *cache, Dwarf_Addr address)
+{
+ const size_t size = 2 * encoded_value_size (&cache->data->d, cache->e_ident,
+ cache->search_table_encoding,
+ NULL);
+
+ /* Dummy used by read_encoded_value. */
+ Dwarf_CFI dummy_cfi =
+ {
+ .e_ident = cache->e_ident,
+ .datarel = cache->search_table_vaddr,
+ .frame_vaddr = cache->search_table_vaddr,
+ };
+
+ size_t l = 0, u = cache->search_table_entries;
+ while (l < u)
+ {
+ size_t idx = (l + u) / 2;
+
+ const uint8_t *p = &cache->search_table[idx * size];
+ Dwarf_Addr start;
+ if (unlikely (read_encoded_value (&dummy_cfi,
+ cache->search_table_encoding, &p,
+ &start)))
+ break;
+ if (address < start)
+ u = idx;
+ else
+ {
+ Dwarf_Addr fde;
+ if (unlikely (read_encoded_value (&dummy_cfi,
+ cache->search_table_encoding, &p,
+ &fde)))
+ break;
+ if (address >= start)
+ {
+ 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;
+ }
+ }
+ }
+
+ return (Dwarf_Off) -1l;
+}
+
+struct dwarf_fde *
+internal_function
+__libdw_find_fde (Dwarf_CFI *cache, Dwarf_Addr address)
+{
+ /* Look for a cached FDE covering this address. */
+
+ const struct dwarf_fde fde_key = { .start = address, .end = 0 };
+ struct dwarf_fde **found = tfind (&fde_key, &cache->fde_tree, &compare_fde);
+ if (found != NULL)
+ return *found;
+
+ /* Use .eh_frame_hdr binary search table if possible. */
+ if (cache->search_table != NULL)
+ {
+ Dwarf_Off offset = binary_search_fde (cache, address);
+ if (offset == (Dwarf_Off) -1l)
+ goto no_match;
+ return fde_by_offset (cache, address, offset);
+ }
+
+ /* It's not there. Read more CFI entries until we find it. */
+ while (1)
+ {
+ Dwarf_Off last_offset = cache->next_offset;
+ Dwarf_CFI_Entry entry;
+ int result = INTUSE(dwarf_next_cfi) (cache->e_ident,
+ &cache->data->d, CFI_IS_EH (cache),
+ last_offset, &cache->next_offset,
+ &entry);
+ if (result > 0)
+ break;
+ if (result < 0)
+ {
+ if (cache->next_offset == last_offset)
+ /* We couldn't progress past the bogus FDE. */
+ break;
+ /* Skip the loser and look at the next entry. */
+ continue;
+ }
+
+ if (dwarf_cfi_cie_p (&entry))
+ {
+ /* This is a CIE, not an FDE. We eagerly intern these
+ because the next FDE will usually refer to this CIE. */
+ __libdw_intern_cie (cache, last_offset, &entry.cie);
+ continue;
+ }
+
+ /* We have a new FDE to consider. */
+ struct dwarf_fde *fde = intern_fde (cache, &entry.fde);
+
+ if (fde == (void *) -1l) /* Bad FDE, but we can keep looking. */
+ continue;
+
+ if (fde == NULL) /* Bad data. */
+ return NULL;
+
+ /* Is this the one we're looking for? */
+ if (fde->start <= address && fde->end > address)
+ return fde;
+ }
+
+ no_match:
+ /* We found no FDE covering this address. */
+ __libdw_seterrno (DWARF_E_NO_MATCH);
+ return NULL;
+}
diff --git a/libdw/frame-cache.c b/libdw/frame-cache.c
new file mode 100644
index 00000000..f4876638
--- /dev/null
+++ b/libdw/frame-cache.c
@@ -0,0 +1,87 @@
+/* Frame cache handling.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "cfi.h"
+#include <search.h>
+#include <stdlib.h>
+
+
+static void
+free_cie (void *arg)
+{
+ struct dwarf_cie *cie = arg;
+
+ free ((Dwarf_Frame *) cie->initial_state);
+ free (cie);
+}
+
+#define free_fde free
+
+static void
+free_expr (void *arg)
+{
+ struct loc_s *loc = arg;
+
+ free (loc->loc);
+ free (loc);
+}
+
+void
+internal_function
+__libdw_destroy_frame_cache (Dwarf_CFI *cache)
+{
+ /* Most of the data is in our two search trees. */
+ tdestroy (cache->fde_tree, free_fde);
+ tdestroy (cache->cie_tree, free_cie);
+ tdestroy (cache->expr_tree, free_expr);
+}
diff --git a/libdw/libdw.h b/libdw/libdw.h
index 6242d04f..94320c7b 100644
--- a/libdw/libdw.h
+++ b/libdw/libdw.h
@@ -1,5 +1,5 @@
/* Interfaces for libdw.
- Copyright (C) 2002, 2004, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2002-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -190,6 +190,70 @@ typedef struct
} Dwarf_Op;
+/* This describes one Common Information Entry read from a CFI section.
+ Pointers here point into the DATA->d_buf block passed to dwarf_next_cfi. */
+typedef struct
+{
+ Dwarf_Off CIE_id; /* Always DW_CIE_ID_64 in Dwarf_CIE structures. */
+
+ /* Instruction stream describing initial state used by FDEs. If
+ we did not understand the whole augmentation string and it did
+ not use 'z', then there might be more augmentation data here
+ (and in FDEs) before the actual instructions. */
+ const uint8_t *initial_instructions;
+ const uint8_t *initial_instructions_end;
+
+ Dwarf_Word code_alignment_factor;
+ Dwarf_Sword data_alignment_factor;
+ Dwarf_Word return_address_register;
+
+ const char *augmentation; /* Augmentation string. */
+
+ /* Augmentation data, might be NULL. The size is correct only if
+ we understood the augmentation string sufficiently. */
+ const uint8_t *augmentation_data;
+ size_t augmentation_data_size;
+ size_t fde_augmentation_data_size;
+} Dwarf_CIE;
+
+/* This describes one Frame Description Entry read from a CFI section.
+ Pointers here point into the DATA->d_buf block passed to dwarf_next_cfi. */
+typedef struct
+{
+ /* Section offset of CIE this FDE refers to. This will never be
+ DW_CIE_ID_64 in an FDE. If this value is DW_CIE_ID_64, this is
+ actually a Dwarf_CIE structure. */
+ Dwarf_Off CIE_pointer;
+
+ /* We can't really decode anything further without looking up the CIE
+ and checking its augmentation string. Here follows the encoded
+ initial_location and address_range, then any augmentation data,
+ then the instruction stream. This FDE describes PC locations in
+ the byte range [initial_location, initial_location+address_range).
+ When the CIE augmentation string uses 'z', the augmentation data is
+ a DW_FORM_block (self-sized). Otherwise, when we understand the
+ augmentation string completely, fde_augmentation_data_size gives
+ the number of bytes of augmentation data before the instructions. */
+ const uint8_t *start;
+ const uint8_t *end;
+} Dwarf_FDE;
+
+/* Each entry in a CFI section is either a CIE described by Dwarf_CIE or
+ an FDE described by Dward_FDE. Check CIE_id to see which you have. */
+typedef union
+{
+ Dwarf_Off CIE_id; /* Always DW_CIE_ID_64 in Dwarf_CIE structures. */
+ Dwarf_CIE cie;
+ Dwarf_FDE fde;
+} Dwarf_CFI_Entry;
+
+/* Opaque type representing a frame state described by CFI. */
+typedef struct Dwarf_Frame_s Dwarf_Frame;
+
+/* Opaque type representing a CFI section found in a DWARF or ELF file. */
+typedef struct Dwarf_CFI_s Dwarf_CFI;
+
+
/* Handle for debug sessions. */
typedef struct Dwarf Dwarf;
@@ -229,6 +293,47 @@ extern int dwarf_nextcu (Dwarf *dwarf, Dwarf_Off off, Dwarf_Off *next_off,
__nonnull_attribute__ (3);
+/* Decode one DWARF CFI entry (CIE or FDE) from the raw section data.
+ The E_IDENT from the originating ELF file indicates the address
+ size and byte order used in the CFI section contained in DATA;
+ EH_FRAME_P should be true for .eh_frame format and false for
+ .debug_frame format. OFFSET is the byte position in the section
+ to start at; on return *NEXT_OFFSET is filled in with the byte
+ position immediately after this entry.
+
+ On success, returns 0 and fills in *ENTRY; use dwarf_cfi_cie_p to
+ see whether ENTRY->cie or ENTRY->fde is valid.
+
+ On errors, returns -1. Some format errors will permit safely
+ skipping to the next CFI entry though the current one is unusable.
+ In that case, *NEXT_OFF will be updated before a -1 return.
+
+ If there are no more CFI entries left in the section,
+ returns 1 and sets *NEXT_OFFSET to (Dwarf_Off) -1. */
+extern int dwarf_next_cfi (const unsigned char e_ident[],
+ Elf_Data *data, bool eh_frame_p,
+ Dwarf_Off offset, Dwarf_Off *next_offset,
+ Dwarf_CFI_Entry *entry)
+ __nonnull_attribute__ (1, 2, 5, 6);
+
+/* Use the CFI in the DWARF .debug_frame section.
+ Returns NULL if there is no such section (not an error).
+ The pointer returned can be used until dwarf_end is called on DWARF,
+ and must not be passed to dwarf_cfi_end.
+ Calling this more than once returns the same pointer. */
+extern Dwarf_CFI *dwarf_getcfi (Dwarf *dwarf);
+
+/* Use the CFI in the ELF file's exception-handling data.
+ Returns NULL if there is no such data.
+ The pointer returned can be used until elf_end is called on ELF,
+ and must be passed to dwarf_cfi_end before then.
+ Calling this more than once allocates independent data structures. */
+extern Dwarf_CFI *dwarf_getcfi_elf (Elf *elf);
+
+/* Release resources allocated by dwarf_getcfi_elf. */
+extern int dwarf_cfi_end (Dwarf_CFI *cache);
+
+
/* Return DIE at given offset. */
extern Dwarf_Die *dwarf_offdie (Dwarf *dbg, Dwarf_Off offset,
Dwarf_Die *result) __nonnull_attribute__ (3);
@@ -252,14 +357,24 @@ extern Dwarf_Die *dwarf_addrdie (Dwarf *dbg, Dwarf_Addr addr,
extern int dwarf_child (Dwarf_Die *die, Dwarf_Die *result)
__nonnull_attribute__ (2);
-/* Return sibling of given DIE. */
+/* Locates the first sibling of DIE and places it in RESULT.
+ Returns 0 if a sibling was found, -1 if something went wrong.
+ Returns 1 if no sibling could be found and, if RESULT is not
+ the same as DIE, it sets RESULT->addr to the address of the
+ (non-sibling) DIE that follows this one, or NULL if this DIE
+ was the last one in the compilation unit. */
extern int dwarf_siblingof (Dwarf_Die *die, Dwarf_Die *result)
__nonnull_attribute__ (2);
/* Check whether the DIE has children. */
extern int dwarf_haschildren (Dwarf_Die *die) __nonnull_attribute__ (1);
-/* Get attributes of the DIE. */
+/* Walks the attributes of DIE, starting at the one OFFSET bytes in,
+ calling the CALLBACK function for each one. Stops if the callback
+ function ever returns a value other than DWARF_CB_OK and returns the
+ offset of the offending attribute. If the end of the attributes
+ is reached 1 is returned. If something goes wrong -1 is returned and
+ the dwarf error number is set. */
extern ptrdiff_t dwarf_getattrs (Dwarf_Die *die,
int (*callback) (Dwarf_Attribute *, void *),
void *arg, ptrdiff_t offset)
@@ -508,6 +623,20 @@ extern int dwarf_getlocation_addr (Dwarf_Attribute *attr, Dwarf_Addr address,
Dwarf_Op **exprs, size_t *exprlens,
size_t nlocs);
+/* 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. */
+extern int dwarf_getlocation_implicit_value (Dwarf_Attribute *attr,
+ const Dwarf_Op *op,
+ Dwarf_Block *return_block)
+ __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.
+ For DW_TAG_array_type it can apply much more complex rules. */
+extern int dwarf_aggregate_size (Dwarf_Die *die, Dwarf_Word *size);
+
/* Return scope DIEs containing PC address.
Sets *SCOPES to a malloc'd array of Dwarf_Die structures,
@@ -616,6 +745,59 @@ extern int dwarf_macro_param2 (Dwarf_Macro *macro, Dwarf_Word *paramp,
const char **strp);
+/* Compute what's known about a call frame when the PC is at ADDRESS.
+ Returns 0 for success or -1 for errors.
+ On success, *FRAME is a malloc'd pointer. */
+extern int dwarf_cfi_addrframe (Dwarf_CFI *cache,
+ Dwarf_Addr address, Dwarf_Frame **frame)
+ __nonnull_attribute__ (3);
+
+/* Return the DWARF register number used in FRAME to denote
+ the return address in FRAME's caller frame. The remaining
+ arguments can be non-null to fill in more information.
+
+ Fill [*START, *END) with the PC range to which FRAME's information applies.
+ Fill in *SIGNALP to indicate whether this is a signal-handling frame.
+ If true, this is the implicit call frame that calls a signal handler.
+ This frame's "caller" is actually the interrupted state, not a call;
+ its return address is an exact PC, not a PC after a call instruction. */
+extern int dwarf_frame_info (Dwarf_Frame *frame,
+ Dwarf_Addr *start, Dwarf_Addr *end, bool *signalp);
+
+/* Return a DWARF expression that yields the Canonical Frame Address at
+ this frame state. Returns -1 for errors, or zero for success, with
+ *NOPS set to the number of operations stored at *OPS. That pointer
+ can be used only as long as FRAME is alive and unchanged. *NOPS is
+ zero if the CFA cannot be determined here. Note that if nonempty,
+ *OPS is a DWARF expression, not a location description--append
+ DW_OP_stack_value to a get a location description for the CFA. */
+extern int dwarf_frame_cfa (Dwarf_Frame *frame, Dwarf_Op **ops, size_t *nops)
+ __nonnull_attribute__ (2);
+
+/* Deliver a DWARF location description that yields the location or
+ value of DWARF register number REGNO in the state described by FRAME.
+
+ Returns -1 for errors or zero for success, setting *NOPS to the
+ number of operations in the array stored at *OPS. Note the last
+ operation is DW_OP_stack_value if there is no mutable location but
+ only a computable value.
+
+ *NOPS zero with *OPS set to OPS_MEM means CFI says the caller's
+ REGNO is "undefined", i.e. it's call-clobbered and cannot be recovered.
+
+ *NOPS zero with *OPS set to a null pointer means CFI says the
+ caller's REGNO is "same_value", i.e. this frame did not change it;
+ ask the caller frame where to find it.
+
+ For common simple expressions *OPS is OPS_MEM. For arbitrary DWARF
+ expressions in the CFI, *OPS is an internal pointer that can be used as
+ long as the Dwarf_CFI used to create FRAME remains alive. */
+extern int dwarf_frame_register (Dwarf_Frame *frame, int regno,
+ Dwarf_Op ops_mem[3],
+ Dwarf_Op **ops, size_t *nops)
+ __nonnull_attribute__ (3, 4, 5);
+
+
/* Return error code of last failing function call. This value is kept
separately for each thread. */
extern int dwarf_errno (void);
diff --git a/libdw/libdw.map b/libdw/libdw.map
index f0edbf35..c0e3a79f 100644
--- a/libdw/libdw.map
+++ b/libdw/libdw.map
@@ -177,7 +177,68 @@ ELFUTILS_0.130 {
*;
} ELFUTILS_0.127;
-ELFUTILS_0.131 {
+ELFUTILS_0.136 {
+ global:
+ dwfl_addrsegment;
+ dwfl_report_segment;
+
+ local:
+ *;
+} ELFUTILS_0.130;
+
+ELFUTILS_0.138 {
+ global:
+ # Replaced ELFUTILS_0.130 version, which has bug-compatibility wrapper.
+ dwfl_module_build_id;
+
+ local:
+ *;
+} ELFUTILS_0.136;
+
+ELFUTILS_0.142 {
+ global:
+ dwarf_next_cfi;
+ dwarf_getcfi;
+ dwarf_getcfi_elf;
+ dwarf_cfi_addrframe;
+ dwarf_cfi_end;
+ dwarf_frame_cfa;
+ dwarf_frame_register;
+ dwarf_frame_info;
+
+ dwfl_module_dwarf_cfi;
+ dwfl_module_eh_cfi;
+} ELFUTILS_0.138;
+
+ELFUTILS_0.143 {
+ global:
+ dwarf_getlocation_implicit_value;
+
+ # Replaced ELFUTILS_0.122 versions. Both versions point to the
+ # same implementation, but users of the new symbol version can
+ # presume that they use dwarf_attr_integrate properly.
+ dwarf_arrayorder;
+ dwarf_bitoffset;
+ dwarf_bitsize;
+ dwarf_bytesize;
+ dwarf_decl_column;
+ dwarf_decl_file;
+ dwarf_decl_line;
+ dwarf_srclang;
+
+} ELFUTILS_0.142;
+
+ELFUTILS_0.144 {
+ global:
+ dwarf_aggregate_size;
+} ELFUTILS_0.143;
+
+ELFUTILS_0.146 {
+ global:
+ dwfl_core_file_report;
+} ELFUTILS_0.144;
+
+ELFUTILS_XXX {
global:
dwfl_register_map;
dwfl_register_map_begin;
@@ -188,7 +249,4 @@ ELFUTILS_0.131 {
dwfl_core_file_find_elf;
dwfl_core_file_register_map;
dwfl_core_file_read_note;
-
- local:
- *;
-} ELFUTILS_0.130;
+} ELFUTILS_0.144;
diff --git a/libdw/libdwP.h b/libdw/libdwP.h
index 78fd5ce7..b3402d86 100644
--- a/libdw/libdwP.h
+++ b/libdw/libdwP.h
@@ -1,5 +1,5 @@
/* Internal definitions for libdwarf.
- Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2002-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -62,7 +62,7 @@
/* Version of the DWARF specification we support. */
-#define DWARF_VERSION 2
+#define DWARF_VERSION 3
/* Version of the CIE format. */
#define CIE_VERSION 1
@@ -76,6 +76,16 @@ struct loc_s
size_t nloc;
};
+/* Known DW_OP_implicit_value blocks already decoded.
+ This overlaps struct loc_s exactly, but only the
+ first member really has to match. */
+struct loc_block_s
+{
+ void *addr;
+ unsigned char *data;
+ size_t length;
+};
+
/* Valid indeces for the section data. */
enum
{
@@ -84,7 +94,6 @@ enum
IDX_debug_aranges,
IDX_debug_line,
IDX_debug_frame,
- IDX_eh_frame,
IDX_debug_loc,
IDX_debug_pubnames,
IDX_debug_str,
@@ -136,6 +145,7 @@ enum
DWARF_E_NO_FLAG,
DWARF_E_INVALID_OFFSET,
DWARF_E_NO_DEBUG_RANGES,
+ DWARF_E_INVALID_CFI,
};
@@ -172,6 +182,9 @@ struct Dwarf
/* Address ranges. */
Dwarf_Aranges *aranges;
+ /* Cached info from the CFI section. */
+ struct Dwarf_CFI_s *cfi;
+
/* Internal memory handling. This is basically a simplified
reimplementation of obstacks. Unfortunately the standard obstack
implementation is not usable in libraries. */
@@ -194,12 +207,12 @@ struct Dwarf
/* Abbreviation representation. */
struct Dwarf_Abbrev
{
+ Dwarf_Off offset;
+ unsigned char *attrp;
+ unsigned int attrcnt;
unsigned int code;
unsigned int tag;
- int has_children;
- unsigned int attrcnt;
- unsigned char *attrp;
- Dwarf_Off offset;
+ bool has_children;
};
#include "dwarf_abbrev_hash.h"
@@ -208,7 +221,7 @@ struct Dwarf_Abbrev
/* Files in line information records. */
struct Dwarf_Files_s
{
- Dwarf *dbg;
+ struct Dwarf_CU *cu;
unsigned int ndirs;
unsigned int nfiles;
struct Dwarf_Fileinfo_s
@@ -223,26 +236,27 @@ typedef struct Dwarf_Fileinfo_s Dwarf_Fileinfo;
/* Representation of a row in the line table. */
-struct Dwarf_Lines_s
- {
- size_t nlines;
- struct Dwarf_Line_s
- {
- Dwarf_Addr addr;
- unsigned int file;
- int line;
- unsigned short int column;
- unsigned int is_stmt:1;
- unsigned int basic_block:1;
- unsigned int end_sequence:1;
- unsigned int prologue_end:1;
- unsigned int epilogue_begin:1;
-
- Dwarf_Files *files;
- } info[0];
- };
+struct Dwarf_Line_s
+{
+ Dwarf_Files *files;
+ Dwarf_Addr addr;
+ unsigned int file;
+ int line;
+ unsigned short int column;
+ unsigned int is_stmt:1;
+ unsigned int basic_block:1;
+ unsigned int end_sequence:1;
+ unsigned int prologue_end:1;
+ unsigned int epilogue_begin:1;
+};
+
+struct Dwarf_Lines_s
+{
+ size_t nlines;
+ struct Dwarf_Line_s info[0];
+};
/* Representation of address ranges. */
struct Dwarf_Aranges_s
@@ -286,6 +300,19 @@ struct Dwarf_CU
void *locs;
};
+/* Compute the offset of a CU's first DIE from its offset. This
+ is either:
+ LEN VER OFFSET ADDR
+ 4-bytes + 2-bytes + 4-bytes + 1-byte for 32-bit dwarf
+ 12-bytes + 2-bytes + 8-bytes + 1-byte for 64-bit dwarf
+
+ Note the trick in the computation. If the offset_size is 4
+ the '- 4' term changes the '3 *' into a '2 *'. If the
+ offset_size is 8 it accounts for the 4-byte escape value
+ used at the start of the length. */
+#define DIE_OFFSET_FROM_CU_OFFSET(cu_offset, offset_size) \
+ ((cu_offset) + 3 * (offset_size) - 4 + 3)
+
#define CUDIE(fromcu) \
((Dwarf_Die) \
{ \
@@ -400,12 +427,176 @@ extern int __libdw_visit_scopes (unsigned int depth,
void *arg)
__nonnull_attribute__ (2, 3) internal_function;
+/* Parse a DWARF Dwarf_Block into an array of Dwarf_Op's,
+ and cache the result (via tsearch). */
+extern int __libdw_intern_expression (Dwarf *dbg,
+ bool other_byte_order,
+ unsigned int address_size,
+ unsigned int ref_size,
+ void **cache, const Dwarf_Block *block,
+ bool cfap, bool valuep,
+ Dwarf_Op **llbuf, size_t *listlen,
+ int sec_index)
+ __nonnull_attribute__ (5, 6, 9, 10) internal_function;
+
+
/* Return error code of last failing function call. This value is kept
separately for each thread. */
extern int __dwarf_errno_internal (void);
+/* Reader hooks. */
+
+/* Relocation hooks return -1 on error (in that case the error code
+ must already have been set), 0 if there is no relocation and 1 if a
+ relocation was present.*/
+
+static inline int
+__libdw_relocate_address (Dwarf *dbg __attribute__ ((unused)),
+ int sec_index __attribute__ ((unused)),
+ const void *addr __attribute__ ((unused)),
+ int width __attribute__ ((unused)),
+ Dwarf_Addr *val __attribute__ ((unused)))
+{
+ return 0;
+}
+
+static inline int
+__libdw_relocate_offset (Dwarf *dbg __attribute__ ((unused)),
+ int sec_index __attribute__ ((unused)),
+ const void *addr __attribute__ ((unused)),
+ int width __attribute__ ((unused)),
+ Dwarf_Off *val __attribute__ ((unused)))
+{
+ return 0;
+}
+
+static inline Elf_Data *
+__libdw_checked_get_data (Dwarf *dbg, int sec_index)
+{
+ Elf_Data *data = dbg->sectiondata[sec_index];
+ if (unlikely (data == NULL)
+ || unlikely (data->d_buf == NULL))
+ {
+ __libdw_seterrno (DWARF_E_INVALID_DWARF);
+ return NULL;
+ }
+ return data;
+}
+
+static inline int
+__libdw_offset_in_section (Dwarf *dbg, int sec_index,
+ Dwarf_Off offset, size_t size)
+{
+ Elf_Data *data = __libdw_checked_get_data (dbg, sec_index);
+ if (data == NULL)
+ return -1;
+ if (unlikely (offset > data->d_size)
+ || unlikely (data->d_size - offset < size))
+ {
+ __libdw_seterrno (DWARF_E_INVALID_OFFSET);
+ return -1;
+ }
+
+ return 0;
+}
+
+static inline bool
+__libdw_in_section (Dwarf *dbg, int sec_index,
+ const void *addr, size_t size)
+{
+ Elf_Data *data = __libdw_checked_get_data (dbg, sec_index);
+ if (data == NULL)
+ return false;
+ if (unlikely (addr < data->d_buf)
+ || unlikely (data->d_size - (addr - data->d_buf) < size))
+ {
+ __libdw_seterrno (DWARF_E_INVALID_OFFSET);
+ return false;
+ }
+
+ return true;
+}
+
+#define READ_AND_RELOCATE(RELOC_HOOK, VAL) \
+ ({ \
+ if (!__libdw_in_section (dbg, sec_index, addr, width)) \
+ return -1; \
+ \
+ const unsigned char *orig_addr = addr; \
+ if (width == 4) \
+ VAL = read_4ubyte_unaligned_inc (dbg, addr); \
+ else \
+ VAL = read_8ubyte_unaligned_inc (dbg, addr); \
+ \
+ int status = RELOC_HOOK (dbg, sec_index, orig_addr, width, &VAL); \
+ if (status < 0) \
+ return status; \
+ status > 0; \
+ })
+
+static inline int
+__libdw_read_address_inc (Dwarf *dbg,
+ int sec_index, const unsigned char **addrp,
+ int width, Dwarf_Addr *ret)
+{
+ const unsigned char *addr = *addrp;
+ READ_AND_RELOCATE (__libdw_relocate_address, (*ret));
+ *addrp = addr;
+ return 0;
+}
+
+static inline int
+__libdw_read_address (Dwarf *dbg,
+ int sec_index, const unsigned char *addr,
+ int width, Dwarf_Addr *ret)
+{
+ READ_AND_RELOCATE (__libdw_relocate_address, (*ret));
+ return 0;
+}
+
+static inline int
+__libdw_read_offset_inc (Dwarf *dbg,
+ int sec_index, const unsigned char **addrp,
+ int width, Dwarf_Off *ret, int sec_ret,
+ size_t size)
+{
+ const unsigned char *addr = *addrp;
+ READ_AND_RELOCATE (__libdw_relocate_offset, (*ret));
+ *addrp = addr;
+ return __libdw_offset_in_section (dbg, sec_ret, *ret, size);
+}
+
+static inline int
+__libdw_read_offset (Dwarf *dbg,
+ int sec_index, const unsigned char *addr,
+ int width, Dwarf_Off *ret, int sec_ret,
+ size_t size)
+{
+ READ_AND_RELOCATE (__libdw_relocate_offset, (*ret));
+ return __libdw_offset_in_section (dbg, sec_ret, *ret, size);
+}
+
+/* Read up begin/end pair and increment read pointer.
+ - If it's normal range record, set up *BEGINP and *ENDP and return 0.
+ - If it's base address selection record, set up *BASEP and return 1.
+ - If it's end of rangelist, don't set anything and return 2
+ - If an error occurs, don't set anything and return <0. */
+int __libdw_read_begin_end_pair_inc (Dwarf *dbg, int sec_index,
+ unsigned char **addr, int width,
+ Dwarf_Addr *beginp, Dwarf_Addr *endp,
+ Dwarf_Addr *basep)
+ internal_function;
+
+unsigned char * __libdw_formptr (Dwarf_Attribute *attr, int sec_index,
+ int err_nodata, unsigned char **endpp,
+ Dwarf_Off *offsetp)
+ internal_function;
+
+
+
/* Aliases to avoid PLTs. */
+INTDECL (dwarf_aggregate_size)
INTDECL (dwarf_attr)
INTDECL (dwarf_attr_integrate)
INTDECL (dwarf_begin_elf)
@@ -435,6 +626,7 @@ INTDECL (dwarf_nextcu)
INTDECL (dwarf_offdie)
INTDECL (dwarf_ranges)
INTDECL (dwarf_siblingof)
+INTDECL (dwarf_srclang)
INTDECL (dwarf_tag)
#endif /* libdwP.h */
diff --git a/libdw/libdw_form.c b/libdw/libdw_form.c
index ad78f4b4..219dd793 100644
--- a/libdw/libdw_form.c
+++ b/libdw/libdw_form.c
@@ -1,5 +1,5 @@
/* Helper functions for form handling.
- Copyright (C) 2003, 2004, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2003-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2003.
@@ -78,6 +78,7 @@ __libdw_form_val_len (Dwarf *dbg, struct Dwarf_CU *cu, unsigned int form,
break;
case DW_FORM_strp:
+ case DW_FORM_sec_offset:
result = cu->offset_size;
break;
@@ -94,11 +95,16 @@ __libdw_form_val_len (Dwarf *dbg, struct Dwarf_CU *cu, unsigned int form,
break;
case DW_FORM_block:
+ case DW_FORM_exprloc:
saved = valp;
get_uleb128 (u128, valp);
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:
@@ -117,6 +123,7 @@ __libdw_form_val_len (Dwarf *dbg, struct Dwarf_CU *cu, unsigned int form,
case DW_FORM_data8:
case DW_FORM_ref8:
+ case DW_FORM_ref_sig8:
result = 8;
break;
diff --git a/libdw/memory-access.h b/libdw/memory-access.h
index 52b41b5b..13f79ec2 100644
--- a/libdw/memory-access.h
+++ b/libdw/memory-access.h
@@ -1,5 +1,5 @@
/* Unaligned memory access functionality.
- Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc.
+ Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -186,19 +186,32 @@ union unaligned
int64_t s8;
} __attribute__ ((packed));
+# define read_2ubyte_unaligned(Dbg, Addr) \
+ read_2ubyte_unaligned_1 ((Dbg)->other_byte_order, (Addr))
+# define read_2sbyte_unaligned(Dbg, Addr) \
+ read_2sbyte_unaligned_1 ((Dbg)->other_byte_order, (Addr))
+# define read_4ubyte_unaligned(Dbg, Addr) \
+ read_4ubyte_unaligned_1 ((Dbg)->other_byte_order, (Addr))
+# define read_4sbyte_unaligned(Dbg, Addr) \
+ read_4sbyte_unaligned_1 ((Dbg)->other_byte_order, (Addr))
+# define read_8ubyte_unaligned(Dbg, Addr) \
+ read_8ubyte_unaligned_1 ((Dbg)->other_byte_order, (Addr))
+# define read_8sbyte_unaligned(Dbg, Addr) \
+ read_8sbyte_unaligned_1 ((Dbg)->other_byte_order, (Addr))
+
static inline uint16_t
-read_2ubyte_unaligned (Dwarf *dbg, const void *p)
+read_2ubyte_unaligned_1 (bool other_byte_order, const void *p)
{
const union unaligned *up = p;
- if (dbg->other_byte_order)
+ if (unlikely (other_byte_order))
return bswap_16 (up->u2);
return up->u2;
}
static inline int16_t
-read_2sbyte_unaligned (Dwarf *dbg, const void *p)
+read_2sbyte_unaligned_1 (bool other_byte_order, const void *p)
{
const union unaligned *up = p;
- if (dbg->other_byte_order)
+ if (unlikely (other_byte_order))
return (int16_t) bswap_16 (up->u2);
return up->s2;
}
@@ -210,35 +223,35 @@ read_4ubyte_unaligned_noncvt (const void *p)
return up->u4;
}
static inline uint32_t
-read_4ubyte_unaligned (Dwarf *dbg, const void *p)
+read_4ubyte_unaligned_1 (bool other_byte_order, const void *p)
{
const union unaligned *up = p;
- if (dbg->other_byte_order)
+ if (unlikely (other_byte_order))
return bswap_32 (up->u4);
return up->u4;
}
static inline int32_t
-read_4sbyte_unaligned (Dwarf *dbg, const void *p)
+read_4sbyte_unaligned_1 (bool other_byte_order, const void *p)
{
const union unaligned *up = p;
- if (dbg->other_byte_order)
+ if (unlikely (other_byte_order))
return (int32_t) bswap_32 (up->u4);
return up->s4;
}
static inline uint64_t
-read_8ubyte_unaligned (Dwarf *dbg, const void *p)
+read_8ubyte_unaligned_1 (bool other_byte_order, const void *p)
{
const union unaligned *up = p;
- if (dbg->other_byte_order)
+ if (unlikely (other_byte_order))
return bswap_64 (up->u8);
return up->u8;
}
static inline int64_t
-read_8sbyte_unaligned (Dwarf *dbg, const void *p)
+read_8sbyte_unaligned_1 (bool other_byte_order, const void *p)
{
const union unaligned *up = p;
- if (dbg->other_byte_order)
+ if (unlikely (other_byte_order))
return (int64_t) bswap_64 (up->u8);
return up->s8;
}
@@ -246,6 +259,17 @@ read_8sbyte_unaligned (Dwarf *dbg, const void *p)
#endif /* allow unaligned */
+#define read_ubyte_unaligned(Nbytes, Dbg, Addr) \
+ ((Nbytes) == 2 ? read_2ubyte_unaligned (Dbg, Addr) \
+ : (Nbytes) == 4 ? read_4ubyte_unaligned (Dbg, Addr) \
+ : read_8ubyte_unaligned (Dbg, Addr))
+
+#define read_sbyte_unaligned(Nbytes, Dbg, Addr) \
+ ((Nbytes) == 2 ? read_2sbyte_unaligned (Dbg, Addr) \
+ : (Nbytes) == 4 ? read_4sbyte_unaligned (Dbg, Addr) \
+ : read_8sbyte_unaligned (Dbg, Addr))
+
+
#define read_2ubyte_unaligned_inc(Dbg, Addr) \
({ uint16_t t_ = read_2ubyte_unaligned (Dbg, Addr); \
Addr = (__typeof (Addr)) (((uintptr_t) (Addr)) + 2); \
@@ -273,4 +297,15 @@ read_8sbyte_unaligned (Dwarf *dbg, const void *p)
Addr = (__typeof (Addr)) (((uintptr_t) (Addr)) + 8); \
t_; })
+
+#define read_ubyte_unaligned_inc(Nbytes, Dbg, Addr) \
+ ((Nbytes) == 2 ? read_2ubyte_unaligned_inc (Dbg, Addr) \
+ : (Nbytes) == 4 ? read_4ubyte_unaligned_inc (Dbg, Addr) \
+ : read_8ubyte_unaligned_inc (Dbg, Addr))
+
+#define read_sbyte_unaligned_inc(Nbytes, Dbg, Addr) \
+ ((Nbytes) == 2 ? read_2sbyte_unaligned_inc (Dbg, Addr) \
+ : (Nbytes) == 4 ? read_4sbyte_unaligned_inc (Dbg, Addr) \
+ : read_8sbyte_unaligned_inc (Dbg, Addr))
+
#endif /* memory-access.h */
diff --git a/libdwarf/ChangeLog b/libdwarf/ChangeLog
index c46ffcb6..4c63735e 100644
--- a/libdwarf/ChangeLog
+++ b/libdwarf/ChangeLog
@@ -1,3 +1,7 @@
+2008-01-17 Nick Clifton <nickc@redhat.com>
+
+ * libdwarf.h: Fix typo in comment.
+
2003-08-11 Ulrich Drepper <drepper@redhat.com>
* Moved to CVS archive.
diff --git a/libdwarf/libdwarf.h b/libdwarf/libdwarf.h
index 284b8a38..2a2b9e3e 100644
--- a/libdwarf/libdwarf.h
+++ b/libdwarf/libdwarf.h
@@ -134,7 +134,7 @@ extern int dwarf_init (int fd, Dwarf_Unsigned access,
Dwarf_Handler errhand, Dwarf_Ptr errarg,
Dwarf_Debug *dbg, Dwarf_Error *errdesc);
-/* Similar to `dwarf_init' but instead of a file descriptor of ELF
+/* Similar to `dwarf_init' but instead of a file descriptor an ELF
descriptor is passed. */
extern int dwarf_elf_init (Elf *elf, Dwarf_Unsigned access,
Dwarf_Handler errhand, Dwarf_Ptr errarg,
diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog
index 285c7db5..0dd77f4b 100644
--- a/libdwfl/ChangeLog
+++ b/libdwfl/ChangeLog
@@ -1,3 +1,518 @@
+2010-05-20 Roland McGrath <roland@redhat.com>
+
+ * linux-proc-maps.c (find_sysinfo_ehdr): Renamed to ...
+ (grovel_auxv): ... this. Take DWFL argument.
+ (dwfl_linux_proc_report): Update caller.
+
+ * dwfl_module_getdwarf.c (open_elf): Calculate alignment for bias
+ based on dwfl->segment_align or manifest alignment of MOD->low_addr.
+
+2010-05-19 Roland McGrath <roland@redhat.com>
+
+ * linux-kernel-modules.c (intuit_kernel_bounds): Rewritten.
+
+2010-05-06 Roland McGrath <roland@redhat.com>
+
+ * segment.c (insert): Clear inserted elements of DWFL->lookup_module.
+
+ * libdwflP.h (DWFL_ERRORS): Add WRONG_ID_ELF.
+ * dwfl_build_id_find_elf.c: Set MOD->main.valid when there is a build
+ ID but we didn't find a file.
+ * dwfl_module_getdwarf.c (__libdwfl_getelf): When that's set, check
+ and refuse any fallback file-by-name if it lacks the matching ID.
+
+ * dwfl_error.c (dwfl_errno): Add INTDEF.
+ * libdwflP.h: Add INTDECL.
+
+ * dwfl_module_getdwarf.c (open_elf): Do elf_end and clear FILE->elf in
+ failure cases.
+
+2010-05-04 Roland McGrath <roland@redhat.com>
+
+ * dwfl_segment_report_module.c: Use "[pie]" rather than "[dso]" for an
+ ET_DYN that has a DT_DEBUG.
+
+ * dwfl_segment_report_module.c: Fix jump-start of NDX-finding loop.
+
+ * segment.c (insert): Fix moving of values following insertion.
+ (reify_segments): Fix up MOD->segment backpointer indices after
+ later insertions in the main loop invalidate them.
+
+ * link_map.c (dwfl_link_map_report): Detect bias of embedded phdrs and
+ apply it to PT_DYNAMIC p_vaddr so we handle a PIE correctly.
+
+ * core-file.c (dwfl_core_file_report): Return any nonzero count of
+ modules reported, even if link_map grovelling failed and only sniffing
+ found anything.
+
+2010-04-26 Roland McGrath <roland@redhat.com>
+
+ * relocate.c (relocate_section): Treat R_*_NONE reloc as no reloc.
+ Works around probably-wrong ld -r behavior for case of a DWARF address
+ constant that refers to a discarded SHF_ALLOC section.
+
+2010-04-14 Roland McGrath <roland@redhat.com>
+
+ * link_map.c (report_r_debug): Limit iterations on the l_next chain to
+ an upper bound on sane possible number of elements.
+
+2010-03-11 Roland McGrath <roland@redhat.com>
+
+ * link_map.c (auxv_format_probe): Fix scanning loop, so we really scan
+ the second half for 32-bit matches.
+
+2010-03-10 Roland McGrath <roland@redhat.com>
+
+ * core-file.c (dwfl_core_file_report): Punt EHDR argument.
+ * argp-std.c (parse_opt): Update caller.
+ * libdwfl.h: Declare dwfl_core_file_report.
+ * libdwflP.h: Don't.
+
+2010-02-17 Roland McGrath <roland@redhat.com>
+
+ * dwfl_segment_report_module.c (addr_segndx): Take new flag argument.
+ If set, find the first index not below ADDR.
+ (dwfl_segment_report_module): Update callers.
+ Pass true when calculating return value.
+
+2010-02-15 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am: Use config/eu.am for common stuff.
+
+ * find-debuginfo.c (find_debuginfo_in_path): Fix uninitialized
+ variable in failure path.
+
+2010-02-02 Mark Wielaard <mjw@redhat.com>
+
+ * dwfl_module_dwarf_cfi.c (dwfl_module_dwarf_cfi): Always set bias.
+ * dwfl_module_eh_cfi.c (dwfl_module_eh_cfi): Likewise
+
+2010-01-07 Roland McGrath <roland@redhat.com>
+
+ * core-file.c (dwfl_core_file_report): Use elf_getphdrnum.
+ * dwfl_module_build_id.c (__libdwfl_find_build_id): Likewise.
+ * dwfl_module_getdwarf.c (open_elf, find_dynsym): Likewise.
+ * dwfl_report_elf.c (__libdwfl_report_elf): Likewise.
+
+2010-01-06 Roland McGrath <roland@redhat.com>
+
+ * relocate.c (relocate_getsym): For SHN_COMMON, zero st_value.
+ (relocate_section): Let unresolved SHN_COMMON symbol stay 0.
+
+2009-11-16 Roland McGrath <roland@redhat.com>
+
+ * relocate.c (relocate_section): Skip SHT_NOBITS or empty target scn.
+
+2009-11-12 Petr Machata <pmachata@redhat.com>
+
+ * core-file.c (dwfl_elf_phdr_memory_callback): Only load ahead if
+ the chunk is both offset-contiguous and vaddr-contiguous.
+
+2009-11-05 Roland McGrath <roland@redhat.com>
+
+ * link_map.c (report_r_debug): Skip entries with l_ld==0.
+ Use dwfl_addrmodule for l_ld lookup, don't bail on lookup failure.
+
+2009-09-04 Roland McGrath <roland@redhat.com>
+
+ * image-header.c (__libdw_image_header): Fix tranposed comparison.
+
+2009-08-27 Roland McGrath <roland@redhat.com>
+
+ * image-header.c: New file.
+ * Makefile.am (libdwfl_a_SOURCES): Add it.
+ * libdwflP.h: Declare __libdw_image_header.
+ * open.c (decompress): Don't consume ELF on failure.
+ (what_kind): New function, broken out of ...
+ (__libdw_open_file): ... here. Call it.
+ If it fails, try __libdw_image_header and then try what_kind again.
+
+ * gzip.c (unzip): Reuse *WHOLE as first INPUT_BUFFER,
+ leave it behind for next decompressor.
+ * open.c (decompress): Free BUFFER on failure.
+
+2009-08-26 Roland McGrath <roland@redhat.com>
+
+ * gzip.c (find_zImage_payload): New function, broken out of ...
+ (mapped_zImage): ... here. Call it.
+ (find_zImage_payload) [LZMA]: Match LZMA-compressed kernels with
+ stupid method of just trying the decoder.
+
+ * open.c [USE_LZMA]: Try __libdw_unlzma.
+ * libdwflP.h: Declare it.
+ (DWFL_ERRORS): Add DWFL_E_LZMA.
+ * gzip.c [LZMA]: Implement liblzma version for XZ file format.
+ * lzma.c: New file.
+ * Makefile.am [LZMA] (libdwfl_a_SOURCES): Add it.
+
+ * gzip.c (mapped_zImage): Limit scan to 32kb.
+ Make this unconditional, support bzip2 kernel images too.
+ (unzip): Use direct inflate method for non-mmap case too.
+ Only zlib uses the stream method.
+
+2009-08-09 Roland McGrath <roland@redhat.com>
+
+ * dwfl_module_build_id.c: Use new macros for versioned definitions.
+
+2009-07-08 Roland McGrath <roland@redhat.com>
+
+ * dwfl_module_dwarf_cfi.c: New file.
+ * dwfl_module_eh_cfi.c: New file.
+ * Makefile.am (libdwfl_a_SOURCES): Add them.
+ * libdwflP.h (struct Dwfl_Module): New members `dwarf_cfi', `eh_cfi.
+ Add INTDECL for dwfl_module_eh_cfi, dwfl_module_dwarf_cfi.
+
+2009-07-08 Roland McGrath <roland@redhat.com>
+
+ * libdwflP.h (struct Dwfl_Module): Reorder members to pack better.
+
+2009-06-18 Mark Wielaard <mjw@redhat.com>
+
+ * dwfl_report_elf.c (__libdwfl_report_elf): Return NULL on overlap.
+
+2009-06-13 Ulrich Drepper <drepper@redhat.com>
+
+ * derelocate.c: Don't use deprecated libelf functions.
+ * dwfl_module_getdwarf.c: Likewise.
+ * relocate.c: Likewise.
+
+2009-04-23 Ulrich Drepper <drepper@redhat.com>
+
+ * dwfl_module_build_id.c: Define versioned symbols only if SHARED is
+ defined. Otherwise just define the latest version.
+
+2009-04-22 Roland McGrath <roland@redhat.com>
+
+ * relocate.c (resolve_symbol): Apply correct bias to st_value found in
+ a non-ET_REL module.
+
+ * dwfl_module_build_id.c (__libdwfl_find_build_id): Fix last change to
+ adjust properly for non-ET_REL.
+
+2009-04-21 Roland McGrath <roland@redhat.com>
+
+ * dwfl_module_getsym.c: Apply non-ET_REL bias only if SHF_ALLOC.
+
+ * relocate.c (__libdwfl_relocate_value): Assert that MOD is ET_REL.
+ * derelocate.c (cache_sections): Call __libdwfl_relocate_value only
+ for ET_REL.
+ * dwfl_module_build_id.c (__libdwfl_find_build_id): Likewise.
+
+2009-04-20 Roland McGrath <roland@redhat.com>
+
+ * dwfl_module_getdwarf.c (__libdwfl_getelf): Add internal_function.
+
+2009-04-19 Roland McGrath <roland@redhat.com>
+
+ * dwfl_module_getdwarf.c (find_file): Renamed to ...
+ (__libdwfl_getelf): ... this. Make it global.
+ (find_symtab, find_dw): Update callers.
+ (dwfl_module_getelf): Functions moved ...
+ * dwfl_module_getelf.c: ... here, new file.
+ * Makefile.am (libdwfl_a_SOURCES): Add it.
+ * libdwflP.h: Declare __libdwfl_getelf.
+
+2009-04-14 Roland McGrath <roland@redhat.com>
+
+ * dwfl_segment_report_module.c: Handle DT_STRTAB value being either
+ absolute (already adjusted in place) or needing load bias adjustment.
+
+ * core-file.c (dwfl_elf_phdr_memory_callback): Fix return value for
+ gelf_getphdr failure. Fix file size limit checks.
+
+ * dwfl_segment_report_module.c: Fix underflow in DYNSTRSZ check.
+
+2009-04-08 Roland McGrath <roland@redhat.com>
+
+ * dwfl_module_getsym.c: Don't adjust for bias again after
+ __libdwfl_relocate_value.
+
+ * relocate.c (__libdwfl_relocate_value): Don't adjust a value from
+ a non-SHF_ALLOC section.
+ (relocate_getsym): Test st_shndx for SHN_* values, not *SHNDX.
+ * dwfl_module_getsym.c (dwfl_module_getsym): Likewise.
+
+2009-03-09 Roland McGrath <roland@redhat.com>
+
+ * dwfl_module_build_id.c (__libdwfl_find_build_id): Move SHSTRNDX
+ variable to outer scope, so we cache it for the loop.
+
+ * relocate.c (__libdwfl_relocate_value): Add MOD->main.bias to sh_addr.
+
+2009-02-12 Roland McGrath <roland@redhat.com>
+
+ * dwfl_module_build_id.c (__libdwfl_find_build_id): Use
+ __libdwfl_relocate_value to find correct sh_addr value.
+
+2009-02-10 Roland McGrath <roland@redhat.com>
+
+ * dwfl_report_elf.c (__libdwfl_report_elf): Take new arg SANITY.
+ If false, don't fail for NO_PHDR.
+ (dwfl_report_elf): Update caller.
+ * libdwflP.h: Update decl.
+ * offline.c (process_elf): Call it with false, so we don't refuse
+ dubiously-formed objects here.
+
+ * link_map.c (consider_executable): Don't assert dwfl_addrsegment
+ finds our module. We shouldn't crash when we confuse some guesses.
+
+2009-02-10 Ulrich Drepper <drepper@redhat.com>
+
+ * open.c (decompress): Avoid crash with empty input file.
+
+2009-01-27 Roland McGrath <roland@redhat.com>
+
+ * dwfl_report_elf.c (__libdwfl_report_elf): Ignore trailing PT_LOAD
+ with zero vaddr and memsz.
+
+2009-01-22 Roland McGrath <roland@redhat.com>
+
+ * open.c (decompress): Move BUFFER, SIZE decls outside #if.
+
+ * dwfl_segment_report_module.c (addr_segndx): Remove bogus adjustments
+ after address-matching loop.
+
+ * segment.c (lookup): Fix fencepost in checking for HINT match.
+
+2009-01-14 Roland McGrath <roland@redhat.com>
+
+ * gzip.c [!BZLIB] (mapped_zImage): New function.
+ (unzip) [!BZLIB]: Grok Linux kernel zImage format.
+
+2009-01-10 Ulrich Drepper <drepper@redhat.com>
+
+ * dwfl_error.c: Always use __thread. Remove all !USE_TLS code.
+
+2009-01-08 Roland McGrath <roland@redhat.com>
+
+ * linux-kernel-modules.c (dwfl_linux_kernel_report_offline):
+ Skip subdirectory named "source".
+ (dwfl_linux_kernel_find_elf): Likewise.
+
+2009-01-06 Roland McGrath <roland@redhat.com>
+
+ * linux-kernel-modules.c (check_suffix): New function.
+ Match ".ko", ".ko.gz", and ".ko.bz2" suffixes.
+ (dwfl_linux_kernel_report_offline): Use it.
+ (dwfl_linux_kernel_find_elf): Likewise.
+
+2009-01-05 Roland McGrath <roland@redhat.com>
+
+ * argp-std.c (parse_opt): Use __libdw_open_file for core file.
+ * dwfl_build_id_find_debuginfo.c: Use it to open the file.
+ * dwfl_build_id_find_elf.c: Likewise.
+ * dwfl_module_getdwarf.c (open_elf): Likewise.
+ * dwfl_report_elf.c: Likewise.
+ * find-debuginfo.c (validate): Likewise.
+ * offline.c (__libdwfl_report_offline): Likewise.
+
+ * libdwflP.h: Declare __libdw_open_file.
+ * open.c: New file.
+ * Makefile.am (libdwfl_a_SOURCES): Add it.
+
+ * gzip.c: New file.
+ * Makefile.am [ZLIB] (libdwfl_a_SOURCES): Add it.
+ * bzip2.c: New file.
+ * Makefile.am [BZLIB] (libdwfl_a_SOURCES): Add it.
+ * libdwflP.h: Declare __libdw_gunzip, __libdw_bunzip2.
+
+2008-12-16 Roland McGrath <roland@redhat.com>
+
+ * dwfl_module_build_id.c (dwfl_module_build_id): Define with alias and
+ symver magic to bind to ELFUTILS_0.138.
+ (_BUG_COMPAT_dwfl_module_build_id): New function, bug compatible
+ wrapper for ELFUTILS_0.130 version set.
+
+2008-12-18 Roland McGrath <roland@redhat.com>
+
+ * derelocate.c (dwfl_module_relocate_address): Fix last fix: ET_DYN
+ addresses are taken as relative to MOD->low_addr.
+
+2008-12-15 Roland McGrath <roland@redhat.com>
+
+ * derelocate.c (dwfl_module_relocate_address): Apply main.bias, not
+ debug.bias.
+
+2008-12-11 Roland McGrath <roland@redhat.com>
+
+ * offline.c (process_archive): Don't call elf_end and close if
+ returning NULL. Check first elf_begin call and set error code
+ specially for empty archive.
+ Fixes RHBZ#465878.
+
+2008-12-02 Roland McGrath <roland@redhat.com>
+
+ * dwfl_getmodules.c (dwfl_getmodules): Typo fix in last change.
+
+2008-11-26 Roland McGrath <roland@redhat.com>
+
+ * dwfl_getmodules.c (dwfl_getmodules): Encode iteration style in
+ return value, and interpret encoded OFFSET argument.
+
+2008-10-07 Roland McGrath <roland@redhat.com>
+
+ * dwfl_module_build_id.c (check_notes): Fix typo in vaddr calculation.
+
+2008-09-29 Roland McGrath <roland@redhat.com>
+
+ * segment.c (insert): Must realloc DWFL->lookup_module here too.
+ (dwfl_report_segment): Clear DWFL->lookup_module before insert calls.
+
+2008-08-28 Roland McGrath <roland@redhat.com>
+
+ * segment.c (reify_segments): Fix last change.
+
+2008-08-27 Roland McGrath <roland@redhat.com>
+
+ * linux-proc-maps.c (read_proc_memory): Return 0 for EINVAL or EPERM
+ failure from pread64.
+
+2008-08-26 Roland McGrath <roland@redhat.com>
+
+ * segment.c (reify_segments): Insert a trailing segment for a module
+ end that is above the highest current segment.
+
+2008-08-25 Roland McGrath <roland@redhat.com>
+
+ * dwfl_module_getdwarf.c (open_elf): Extract elf_errno () for
+ coded return value, not plain DWFL_E_LIBELF. Return DWFL_E_BADELF
+ if FILE->elf is not ELF_K_ELF.
+
+ * dwfl_segment_report_module.c: Add a cast.
+
+2008-08-21 Denys Vlasenko <dvlasenk@redhat.com>
+
+ * dwfl_module_addrsym.c (dwfl_module_addrsym): Improve logic
+ which decides which symbol is "closest" to a given address.
+
+2008-08-15 Roland McGrath <roland@redhat.com>
+
+ * argp-std.c (offline_callbacks): Use dwfl_build_id_find_elf.
+ (options, parse_opt): Handle --core.
+
+ * core-file.c: New file.
+ * Makefile.am (libdwfl_a_SOURCES): Add it.
+ * libdwflP.h (dwfl_core_file_report): Declare it.
+
+ * link_map.c: New file.
+ * Makefile.am (libdwfl_a_SOURCES): Add it.
+ * libdwflP.h (dwfl_link_map_report): Declare it.
+
+ * libdwflP.h (MIN, MAX): New macros.
+ (Dwfl_Memory_Callback): New typedef.
+ (Dwfl_Module_Callback): New typedef.
+ (dwfl_segment_report_module): Declare it.
+ * dwfl_segment_report_module.c: New file.
+ * Makefile.am (libdwfl_a_SOURCES): Add it.
+
+ * derelocate.c (dwfl_module_address_section): Add INTDEF.
+ * libdwflP.h: Add INTDECL.
+
+ * segment.c: New file.
+ * Makefile.am (libdwfl_a_SOURCES): Add it.
+ * libdwfl.h: Declare dwfl_addrsegment, dwfl_report_segment.
+ * libdwflP.h (struct Dwfl): New members lookup_elts, lookup_alloc,
+ lookup_addr, lookup_module, lookup_segndx, replace removed members
+ modules, nmodules.
+ (struct Dwfl_Module): New member segment.
+ * dwfl_end.c (dwfl_end): Free the new ones. Iterate via modulelist
+ to each free module.
+ * dwfl_module.c (dwfl_report_begin_add): Do nothing.
+ (dwfl_report_begin): Don't call it. Truncate the segment table instead.
+ (dwfl_report_module): Don't touch DWFL->nmodules.
+ (dwfl_report_end): Don't touch DWFL->modules and DWFL->nmodules.
+ (compare_modules): Function removed.
+ * dwfl_getmodules.c: Rewritten.
+ Add INTDEF.
+ * libdwflP.h: Add INTDECLs.
+ * dwfl_getdwarf.c: Rewritten to call dwfl_getmodules.
+ * dwfl_addrmodule.c: Rewritten to just call dwfl_addrsegment.
+
+2008-08-03 Roland McGrath <roland@redhat.com>
+
+ * linux-kernel-modules.c: Include <fts.h> before <config.h>.
+
+2008-07-17 Roland McGrath <roland@redhat.com>
+
+ * dwfl_build_id_find_elf.c (__libdwfl_open_by_build_id): Set errno to
+ zero if the failure was only ENOENT.
+
+2008-06-03 Roland McGrath <roland@redhat.com>
+
+ * dwfl_module_addrsym.c (dwfl_module_addrsym): Exclude undefined
+ symbols.
+
+2008-05-22 Petr Machata <pmachata@redhat.com>
+
+ * dwfl_module_getdwarf.c (open_elf): Bias of ET_EXEC files is always 0.
+
+2008-05-06 Roland McGrath <roland@frob.com>
+
+ * linux-kernel-modules.c (dwfl_linux_kernel_report_offline): Use
+ FTS_LOGICAL here too.
+ (dwfl_linux_kernel_find_elf): Likewise.
+
+2008-04-29 Roland McGrath <roland@redhat.com>
+
+ * find-debuginfo.c (dwfl_standard_find_debuginfo): Try path search
+ based on canonicalize_file_name if it differs from the supplied name.
+
+ * linux-kernel-modules.c (check_module_notes): Use FTS_LOGICAL so
+ we accept symlinks.
+
+2008-04-27 Roland McGrath <roland@redhat.com>
+
+ * linux-kernel-modules.c (report_kernel): Fix crash when
+ dwfl_report_elf fails.
+
+2008-04-05 Roland McGrath <roland@redhat.com>
+
+ * linux-proc-maps.c (proc_maps_report): Don't leak LAST_FILE.
+
+ * dwfl_module_getdwarf.c (find_file): Always free build_id_bits.
+ Clear it after freeing.
+ * dwfl_module_report_build_id.c (dwfl_module_report_build_id): Likewise.
+
+2008-03-26 Roland McGrath <roland@redhat.com>
+
+ * dwfl_module_getdwarf.c (load_symtab): Don't return success for
+ SHT_DYNSYM, just set *SYMSCN like the comment says.
+
+ * dwfl_end.c (dwfl_end): Iterate on modulelist chain, not modules array.
+
+ * argp-std.c (parse_opt): On failure, call dwfl_end before argp_failure.
+
+2008-03-19 Roland McGrath <roland@redhat.com>
+
+ * dwfl_module_getsrc.c: Adjust address for module bias before search.
+
+2008-03-01 Roland McGrath <roland@redhat.com>
+
+ * libdwflP.h (__libdwfl_seterrno): Remove parameter name from
+ prototype to avoid older compiler's complaint about reuse of the name.
+ (__libdwfl_canon_error): Likewise.
+
+2008-02-19 Roland McGrath <roland@redhat.com>
+
+ * relocate.c (relocate_section): Check for an unhandled relocation
+ type before resolving a reloc's symbol. Lift DWFL_E_BADRELTYPE ->
+ DWFL_E_UNKNOWN_MACHINE check out of loops.
+
+ * dwfl_module_getdwarf.c (load_dw): Skip relocation if
+ DEBUGFILE->relocated is already set.
+
+2008-01-26 Roland McGrath <roland@redhat.com>
+
+ * dwfl_module_getdwarf.c (open_elf): Open FILE->name if it's non-null.
+
+ * dwfl_build_id_find_elf.c (__libdwfl_open_by_build_id): Don't clear
+ incoming *FILE_NAME at the start.
+
+2008-01-08 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am (euinclude): Variable removed.
+ (pkginclude_HEADERS): Set this instead of euinclude_HEADERS.
+
2007-08-04 Roland McGrath <roland@redhat.com>
* core-file.c (dwfl_core_file_report): Use dwfl_module_report_build_id.
@@ -439,7 +954,7 @@
2006-09-05 Roland McGrath <roland@redhat.com>
* derelocate.c (cache_sections): Use alloca instead of variable-sized
- auto array, in function already alloca.
+ auto array, in function already using alloca.
2006-08-14 Roland McGrath <roland@redhat.com>
diff --git a/libdwfl/Makefile.am b/libdwfl/Makefile.am
index 6645315f..fa5395f5 100644
--- a/libdwfl/Makefile.am
+++ b/libdwfl/Makefile.am
@@ -2,7 +2,7 @@
##
## Process this file with automake to create Makefile.in
##
-## Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+## Copyright (C) 2005-2010 Red Hat, Inc.
## This file is part of Red Hat elfutils.
##
## Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -26,34 +26,24 @@
## Network licensing program, please visit www.openinventionnetwork.com
## <http://www.openinventionnetwork.com>.
##
-DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H
-if MUDFLAP
-AM_CFLAGS = -fmudflap
-else
-AM_CFLAGS =
-endif
-AM_CFLAGS += -Wall -Werror -Wshadow -Wunused -Wformat=2 -Wextra -std=gnu99
-INCLUDES = -I. -I$(srcdir) -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
- -I$(srcdir)/../libdw -I.. -I$(srcdir)/../lib
+include $(top_srcdir)/config/eu.am
+INCLUDES += -I$(srcdir) -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
+ -I$(srcdir)/../libdw
VERSION = 1
-COMPILE.os = $(filter-out -fprofile-arcs, $(filter-out -ftest-coverage, \
- $(COMPILE)))
-
noinst_LIBRARIES = libdwfl.a
if !MUDFLAP
noinst_LIBRARIES += libdwfl_pic.a
endif
-euincludedir = ${includedir}/elfutils
-euinclude_HEADERS = libdwfl.h
+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 \
dwfl_module_build_id.c dwfl_module_report_build_id.c \
- derelocate.c offline.c \
- dwfl_module_info.c dwfl_getmodules.c \
- dwfl_module_getdwarf.c dwfl_getdwarf.c \
+ derelocate.c offline.c segment.c \
+ dwfl_module_info.c dwfl_getmodules.c dwfl_getdwarf.c \
+ dwfl_module_getdwarf.c dwfl_module_getelf.c \
dwfl_validate_address.c \
argp-std.c find-debuginfo.c \
dwfl_build_id_find_elf.c \
@@ -71,18 +61,29 @@ libdwfl_a_SOURCES = dwfl_begin.c dwfl_end.c dwfl_error.c dwfl_version.c \
dwfl_module_getsrc_file.c \
libdwfl_crc32.c libdwfl_crc32_file.c \
elf-from-memory.c \
+ dwfl_module_dwarf_cfi.c dwfl_module_eh_cfi.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 \
register-map.c core-file-register-map.c
+if ZLIB
+libdwfl_a_SOURCES += gzip.c
+endif
+if BZLIB
+libdwfl_a_SOURCES += bzip2.c
+endif
+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
-libmudflap = -lmudflap
else
libdwfl = $(libdw)
libdw = ../libdw/libdw.so
@@ -91,20 +92,11 @@ 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)
-
-%.os: %.c %.o
- if $(COMPILE.os) -c -o $@ -fpic -DPIC -DSHARED -MT $@ -MD -MP \
- -MF "$(DEPDIR)/$*.Tpo" `test -f '$<' || echo '$(srcdir)/'`$<; \
- then cat "$(DEPDIR)/$*.Tpo" >> "$(DEPDIR)/$*.Po"; \
- rm -f "$(DEPDIR)/$*.Tpo"; \
- else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
- fi
endif
noinst_HEADERS = libdwflP.h
-CLEANFILES = $(am_libdwfl_pic_a_OBJECTS)
+CLEANFILES += $(am_libdwfl_pic_a_OBJECTS)
diff --git a/libdwfl/argp-std.c b/libdwfl/argp-std.c
index a30b3d38..e598c6ef 100644
--- a/libdwfl/argp-std.c
+++ b/libdwfl/argp-std.c
@@ -1,5 +1,5 @@
/* Standard argp argument parsers for tools using libdwfl.
- Copyright (C) 2005, 2007 Red Hat, Inc.
+ Copyright (C) 2005-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -91,7 +91,7 @@ static const Dwfl_Callbacks offline_callbacks =
.section_address = INTUSE(dwfl_offline_section_address),
/* We use this table for core files too. */
- .find_elf = INTUSE(dwfl_core_file_find_elf),
+ .find_elf = INTUSE(dwfl_build_id_find_elf),
};
static const Dwfl_Callbacks proc_callbacks =
@@ -116,13 +116,13 @@ parse_opt (int key, char *arg, struct argp_state *state)
{
inline void failure (Dwfl *dwfl, int errnum, const char *msg)
{
+ if (dwfl != NULL)
+ dwfl_end (dwfl);
if (errnum == -1)
argp_failure (state, EXIT_FAILURE, 0, "%s: %s",
msg, INTUSE(dwfl_errmsg) (-1));
else
argp_failure (state, EXIT_FAILURE, errnum, "%s", msg);
- if (dwfl != NULL)
- dwfl_end (dwfl);
}
inline error_t fail (Dwfl *dwfl, int errnum, const char *msg)
{
@@ -208,22 +208,21 @@ parse_opt (int key, char *arg, struct argp_state *state)
if (dwfl == NULL)
state->hook = dwfl = INTUSE(dwfl_begin) (&offline_callbacks);
/* Permit -e and --core together. */
- else if (dwfl->callbacks != &offline_callbacks
- || dwfl->cb_data != NULL)
+ else if (dwfl->callbacks != &offline_callbacks)
goto toomany;
int fd = open64 (arg, O_RDONLY);
if (fd < 0)
goto nofile;
- Elf *core = elf_begin (fd, ELF_C_READ_MMAP_PRIVATE, NULL);
- if (core == NULL)
+ Elf *core;
+ Dwfl_Error error = __libdw_open_file (&fd, &core, true, false);
+ if (error != DWFL_E_NOERROR)
{
- close (fd);
argp_failure (state, EXIT_FAILURE, 0,
_("cannot read ELF core file: %s"),
- elf_errmsg (-1));
- return EIO;
+ INTUSE(dwfl_errmsg) (error));
+ return error == DWFL_E_ERRNO ? errno : EIO;
}
int result = INTUSE(dwfl_core_file_report) (dwfl, core);
diff --git a/libdwfl/bzip2.c b/libdwfl/bzip2.c
new file mode 100644
index 00000000..8ad4ee5a
--- /dev/null
+++ b/libdwfl/bzip2.c
@@ -0,0 +1,4 @@
+/* bzlib is almost just like zlib. */
+
+#define BZLIB
+#include "gzip.c"
diff --git a/libdwfl/core-file.c b/libdwfl/core-file.c
index 99f133ec..1b556dde 100644
--- a/libdwfl/core-file.c
+++ b/libdwfl/core-file.c
@@ -1,5 +1,5 @@
-/* Examine a core file to guess the modules used in the crashed process.
- Copyright (C) 2007 Red Hat, Inc.
+/* Core file handling.
+ Copyright (C) 2008-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -48,844 +48,437 @@
<http://www.openinventionnetwork.com>. */
#include <config.h>
+#include "../libelf/libelfP.h" /* For NOTE_ALIGN. */
+#undef _
#include "libdwflP.h"
-
#include <gelf.h>
-#include <inttypes.h>
-#include <alloca.h>
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
+#include <sys/param.h>
+#include <unistd.h>
+#include <endian.h>
+#include <byteswap.h>
+#include "system.h"
-/* Determine whether a module already reported in this reporting phase
- overlaps START..END. If REORDER, move it to the end of the list
- as dwfl_report_module on an existing module would do. */
-static Dwfl_Module *
-module_overlapping (Dwfl *dwfl, GElf_Addr start, GElf_Addr end, bool reorder)
+/* This is a prototype of what a new libelf interface might be.
+ This implementation is pessimal for non-mmap cases and should
+ be replaced by more diddling inside libelf internals. */
+static Elf *
+elf_begin_rand (Elf *parent, loff_t offset, loff_t size, loff_t *next)
{
- Dwfl_Module **tailp = &dwfl->modulelist, **prevp = tailp;
- for (Dwfl_Module *mod = *prevp; mod != NULL; mod = *(prevp = &mod->next))
- if (! mod->gc)
- {
- if ((start >= mod->low_addr && start < mod->high_addr)
- || (end >= mod->low_addr && end < mod->high_addr)
- || (mod->low_addr >= start && mod->low_addr < end))
- {
- if (reorder)
- {
- *prevp = mod->next;
- mod->next = *tailp;
- *tailp = mod;
- }
- return mod;
- }
+ if (parent == NULL)
+ return NULL;
+
+ /* On failure return, we update *NEXT to point back at OFFSET. */
+ inline Elf *fail (int error)
+ {
+ if (next != NULL)
+ *next = offset;
+ //__libelf_seterrno (error);
+ __libdwfl_seterrno (DWFL_E (LIBELF, error));
+ return NULL;
+ }
+
+ loff_t min = (parent->kind == ELF_K_ELF ?
+ (parent->class == ELFCLASS32
+ ? sizeof (Elf32_Ehdr) : sizeof (Elf64_Ehdr))
+ : parent->kind == ELF_K_AR ? SARMAG
+ : 0);
+
+ if (unlikely (offset < min)
+ || unlikely (offset >= (loff_t) parent->maximum_size))
+ return fail (ELF_E_RANGE);
+
+ /* For an archive, fetch just the size field
+ from the archive header to override SIZE. */
+ if (parent->kind == ELF_K_AR)
+ {
+ struct ar_hdr h = { .ar_size = "" };
+
+ if (unlikely (parent->maximum_size - offset < sizeof h))
+ return fail (ELF_E_RANGE);
+
+ if (parent->map_address != NULL)
+ memcpy (h.ar_size, parent->map_address + parent->start_offset + offset,
+ sizeof h.ar_size);
+ else if (unlikely (pread_retry (parent->fildes,
+ h.ar_size, sizeof (h.ar_size),
+ parent->start_offset + offset
+ + offsetof (struct ar_hdr, ar_size))
+ != sizeof (h.ar_size)))
+ return fail (ELF_E_READ_ERROR);
+
+ offset += sizeof h;
+
+ char *endp;
+ size = strtoll (h.ar_size, &endp, 10);
+ if (unlikely (endp == h.ar_size)
+ || unlikely ((loff_t) parent->maximum_size - offset < size))
+ return fail (ELF_E_INVALID_ARCHIVE);
+ }
- tailp = &mod->next;
- }
+ if (unlikely ((loff_t) parent->maximum_size - offset < size))
+ return fail (ELF_E_RANGE);
- return NULL;
-}
+ /* Even if we fail at this point, update *NEXT to point past the file. */
+ if (next != NULL)
+ *next = offset + size;
+ if (unlikely (offset == 0)
+ && unlikely (size == (loff_t) parent->maximum_size))
+ return elf_clone (parent, parent->cmd);
-/* Collected ideas about each module, stored in Dwfl_Module.cb_data. */
-struct core_module_info
-{
- GElf_Off offset; /* Start position in the core file. */
- GElf_Word whole_size; /* Zero or size of whole image at offset. */
- GElf_Addr l_name_vaddr; /* l_name file name from dynamic linker. */
-};
+ /* Note the image is guaranteed live only as long as PARENT
+ lives. Using elf_memory is quite suboptimal if the whole
+ file is not mmap'd. We really should have something like
+ a generalization of the archive support. */
+ Elf_Data *data = elf_getdata_rawchunk (parent, offset, size, ELF_T_BYTE);
+ if (data == NULL)
+ return NULL;
+ assert ((loff_t) data->d_size == size);
+ return elf_memory (data->d_buf, size);
+}
-static GElf_Off
-offset_from_addr (Elf *elf, GElf_Addr addr, GElf_Off *limit)
+int
+dwfl_report_core_segments (Dwfl *dwfl, Elf *elf, size_t phnum, GElf_Phdr *notes)
{
- // XXX optimize with binary search of cached merged regions
-
- GElf_Ehdr ehdr_mem;
- GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem);
- if (ehdr == NULL)
- return 0;
-
- GElf_Addr end = 0;
- GElf_Off offset = 0;
- for (uint_fast16_t i = 0; i < ehdr->e_phnum; ++i)
- {
- GElf_Phdr phdr_mem;
- GElf_Phdr *phdr = gelf_getphdr (elf, i, &phdr_mem);
- if (phdr == NULL)
- break;
- if (phdr->p_type != PT_LOAD || phdr->p_vaddr + phdr->p_memsz <= addr)
- continue;
- if (offset == 0)
- offset = addr - phdr->p_vaddr + phdr->p_offset;
- else if ((phdr->p_vaddr & -phdr->p_align) > end)
- break;
- end = phdr->p_vaddr + phdr->p_filesz;
- }
+ if (unlikely (dwfl == NULL))
+ return -1;
- *limit = end - addr + offset;
- return offset;
-}
+ int result = 0;
-/* Do gelf_rawchunk to get a '\0'-terminated string at
- the given offset in the core file. Ignore an empty string. */
-static char *
-string_from_offset (Elf *core, GElf_Off string_offset, GElf_Off limit)
-{
- GElf_Off offset = string_offset;
+ if (notes != NULL)
+ notes->p_type = PT_NULL;
-#define STRING_BUF_SIZE 64
- while (offset < limit)
+ for (size_t ndx = 0; result >= 0 && ndx < phnum; ++ndx)
{
- const size_t sample_size = MIN (limit - offset, STRING_BUF_SIZE);
- char *sample = gelf_rawchunk (core, offset, sample_size);
- if (sample == NULL)
- break;
- char *end = memchr (sample, '\0', sample_size);
- if (end == NULL)
- {
- gelf_freechunk (core, sample);
- offset += sample_size;
- }
- else if (offset == string_offset)
+ GElf_Phdr phdr_mem;
+ GElf_Phdr *phdr = gelf_getphdr (elf, ndx, &phdr_mem);
+ if (unlikely (phdr == NULL))
{
- if (end != sample)
- return sample;
- /* It's the empty string. */
- gelf_freechunk (core, sample);
- return NULL;
+ __libdwfl_seterrno (DWFL_E_LIBELF);
+ return -1;
}
- else
+ switch (phdr->p_type)
{
- gelf_freechunk (core, sample);
- return gelf_rawchunk (core, string_offset,
- (offset - string_offset) + (end - sample));
+ case PT_LOAD:
+ result = dwfl_report_segment (dwfl, ndx, phdr, 0, NULL);
+ break;
+
+ case PT_NOTE:
+ if (notes != NULL)
+ {
+ *notes = *phdr;
+ notes = NULL;
+ }
+ break;
}
}
- return NULL;
-}
-
-// XXX l_name can be in elided text (.interp), needs module-integrated read here
-/* Do gelf_rawchunk to get a '\0'-terminated string at
- the given address in the core file memory image. */
-static char *
-string_from_memory (Elf *core, GElf_Addr addr)
-{
- GElf_Off limit;
- GElf_Off offset = offset_from_addr (core, addr, &limit);
- return offset == 0 ? NULL : string_from_offset (core, offset, limit);
-}
-
-/* Do gelf_getdata_rawchunk given an address in the core file memory image. */
-static Elf_Data *
-getdata_core (Elf *core, GElf_Addr addr, GElf_Word size, Elf_Type type)
-{
- GElf_Off limit;
- GElf_Off offset = offset_from_addr (core, addr, &limit);
- return (limit - offset < size ? NULL
- : gelf_getdata_rawchunk (core, offset, size, type));
-}
-
-/* Fetch one address word from the core file memory image. */
-static GElf_Addr
-addr_from_memory (Elf *core, GElf_Addr addr)
-{
- const size_t addrsize = gelf_fsize (core, ELF_T_ADDR, 1, EV_CURRENT);
- Elf_Data *data = getdata_core (core, addr, addrsize, ELF_T_ADDR);
- if (data == NULL)
- return 0;
- return (addrsize == 4
- ? *(const Elf32_Addr *) data->d_buf
- : *(const Elf64_Addr *) data->d_buf);
+ return result;
}
-/* Process a struct link_map extracted from the core file.
- Report a module if it describes one we can figure out. */
-static int
-report_link_map (int result, Elf *core, Dwfl *dwfl,
- GElf_Addr l_addr, GElf_Addr l_name, GElf_Addr l_ld)
+/* Never read more than this much without mmap. */
+#define MAX_EAGER_COST 8192
+
+static bool
+core_file_read_eagerly (Dwfl_Module *mod,
+ void **userdata __attribute__ ((unused)),
+ const char *name __attribute__ ((unused)),
+ Dwarf_Addr start __attribute__ ((unused)),
+ void **buffer, size_t *buffer_available,
+ GElf_Off cost, GElf_Off worthwhile,
+ GElf_Off whole,
+ GElf_Off contiguous __attribute__ ((unused)),
+ void *arg, Elf **elfp)
{
- /* The l_ld address is a runtime address inside the module,
- so we can use that alone to see if we already know this module.
- This moves the one found to the end of the order as a side effect. */
- Dwfl_Module *mod = module_overlapping (dwfl, l_ld, l_ld + 1, true);
+ Elf *core = arg;
- if (mod == NULL)
+ if (whole <= *buffer_available)
{
- /* We have to find the file's phdrs to compute along with l_addr
- what its runtime address boundaries are. */
+ /* All there ever was, we already have on hand. */
- char *file_name = string_from_memory (core, l_name);
- if (file_name != NULL)
+ if (core->map_address == NULL)
{
- mod = INTUSE(dwfl_report_elf) (dwfl, basename (file_name),
- file_name, -1, l_addr);
- if (mod != NULL)
- result = 1;
- gelf_freechunk (core, file_name);
+ /* We already malloc'd the buffer. */
+ *elfp = elf_memory (*buffer, whole);
+ if (unlikely (*elfp == NULL))
+ return false;
+
+ (*elfp)->flags |= ELF_F_MALLOCED;
+ *buffer = NULL;
+ *buffer_available = 0;
+ return true;
}
- return result;
+ /* We can use the image inside the core file directly. */
+ *elfp = elf_begin_rand (core, *buffer - core->map_address, whole, NULL);
+ *buffer = NULL;
+ *buffer_available = 0;
+ return *elfp != NULL;
}
- if (mod->cb_data != NULL)
- {
- /* This is a module we recognized before from the core contents. */
- struct core_module_info *info = mod->cb_data;
- info->l_name_vaddr = l_name;
- if (mod->name[0] == '[')
- {
- /* We gave it a boring synthetic name.
- Use the basename of its l_name string instead. */
- char *chunk = string_from_memory (core, info->l_name_vaddr);
- if (chunk != NULL)
- {
- char *newname = strdup (basename (chunk));
- if (newname != NULL)
- {
- free (mod->name);
- mod->name = newname;
- }
- gelf_freechunk (core, chunk);
- }
- }
- }
-
- return result;
-}
-
-/* Call report_link_map for each struct link_map in the linked list at r_map
- in the struct r_debug at R_DEBUG_VADDR. */
-static int
-report_r_debug (int result, Elf *core, Dwfl *dwfl, GElf_Addr r_debug_vaddr)
-{
- const size_t addrsize = gelf_fsize (core, ELF_T_ADDR, 1, EV_CURRENT);
+ /* We don't have the whole file.
+ Figure out if this is better than nothing. */
- /* Skip r_version, to aligned r_map field. */
- GElf_Addr next = addr_from_memory (core, r_debug_vaddr + addrsize);
+ if (worthwhile == 0)
+ /* Caller doesn't think so. */
+ return false;
- while (result >= 0 && next != 0)
- {
- Elf_Data *data = getdata_core (core, next, addrsize * 4, ELF_T_ADDR);
- if (unlikely (data == NULL))
- result = -1;
- else
- {
- GElf_Addr addr;
- GElf_Addr name;
- GElf_Addr ld;
+ /*
+ XXX would like to fall back to partial file via memory
+ when build id find_elf fails
+ also, link_map name may give file name from disk better than partial here
+ requires find_elf hook re-doing the magic to fall back if no file found
+ */
- if (addrsize == 4)
- {
- const Elf32_Addr *map = data->d_buf;
- addr = map[0];
- name = map[1];
- ld = map[2];
- next = map[3];
- }
- else
- {
- const Elf64_Addr *map = data->d_buf;
- addr = map[0];
- name = map[1];
- ld = map[2];
- next = map[3];
- }
+ if (mod->build_id_len > 0)
+ /* There is a build ID that could help us find the whole file,
+ which might be more useful than what we have.
+ We'll just rely on that. */
+ return false;
- result = report_link_map (result, core, dwfl, addr, name, ld);
- }
- }
+ if (core->map_address != NULL)
+ /* It's cheap to get, so get it. */
+ return true;
- return result;
+ /* Only use it if there isn't too much to be read. */
+ return cost <= MAX_EAGER_COST;
}
-/* Find the vaddr of the DT_DEBUG's d_ptr. This is the memory address
- where &r_debug was written at runtime. */
-static GElf_Addr
-find_dt_debug (Elf *elf, GElf_Addr bias)
+bool
+dwfl_elf_phdr_memory_callback (Dwfl *dwfl, int ndx,
+ void **buffer, size_t *buffer_available,
+ GElf_Addr vaddr,
+ size_t minread,
+ void *arg)
{
- GElf_Ehdr ehdr_mem;
- GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem);
- if (ehdr == NULL)
- return 0;
+ Elf *elf = arg;
- for (uint_fast16_t i = 0; i < ehdr->e_phnum; ++i)
+ if (ndx == -1)
{
- GElf_Phdr phdr_mem;
- GElf_Phdr *phdr = gelf_getphdr (elf, i, &phdr_mem);
- if (phdr == NULL)
- break;
- if (phdr->p_type == PT_DYNAMIC)
- {
- Elf_Data *data = gelf_getdata_rawchunk (elf, phdr->p_offset,
- phdr->p_filesz, ELF_T_DYN);
- if (data == NULL)
- continue;
- const size_t entsize = gelf_fsize (elf, ELF_T_DYN, 1, EV_CURRENT);
- const size_t n = data->d_size / entsize;
- for (size_t j = 0; j < n; ++j)
- {
- GElf_Dyn dyn_mem;
- GElf_Dyn *dyn = gelf_getdyn (data, j, &dyn_mem);
- if (dyn != NULL && dyn->d_tag == DT_DEBUG)
- return phdr->p_vaddr + bias + entsize * j + entsize / 2;
- }
- }
+ /* Called for cleanup. */
+ if (elf->map_address == NULL)
+ free (*buffer);
+ *buffer = NULL;
+ *buffer_available = 0;
+ return false;
}
- return 0;
-}
+ const GElf_Off align = dwfl->segment_align ?: 1;
+ GElf_Phdr phdr;
+ do
+ if (unlikely (gelf_getphdr (elf, ndx++, &phdr) == NULL))
+ return false;
+ while (phdr.p_type != PT_LOAD
+ || ((phdr.p_vaddr + phdr.p_memsz + align - 1) & -align) <= vaddr);
-int
-dwfl_core_file_report (Dwfl *dwfl, Elf *core)
-{
- if (dwfl == NULL)
- return -1;
+ GElf_Off start = vaddr - phdr.p_vaddr + phdr.p_offset;
+ GElf_Off end;
+ GElf_Addr end_vaddr;
- int result = 0;
- const size_t ehdr_size = gelf_fsize (core, ELF_T_EHDR, 1, EV_CURRENT);
+ inline void update_end ()
+ {
+ end = (phdr.p_offset + phdr.p_filesz + align - 1) & -align;
+ end_vaddr = (phdr.p_vaddr + phdr.p_memsz + align - 1) & -align;
+ }
- /* Record when we find a GNU build-ID note. */
- GElf_Off build_id_offset;
- GElf_Word build_id_size;
- GElf_Addr build_id_vaddr;
- inline void handle_build_id (GElf_Off offset, GElf_Word size, GElf_Addr vaddr)
- {
- build_id_offset = offset;
- build_id_size = size;
- build_id_vaddr = vaddr;
- }
+ update_end ();
- /* We've found a PT_NOTE segment inside an ELF image. Investigate. */
- inline void handle_note (GElf_Off offset, GElf_Xword filesz, GElf_Addr vaddr)
- {
- Elf_Data *data = gelf_getdata_rawchunk (core, offset, filesz, ELF_T_NHDR);
- if (data == NULL)
- return;
- size_t pos = 0;
- GElf_Nhdr nhdr;
- size_t name_offset;
- size_t desc_offset;
- while (pos < data->d_size
- && (pos = gelf_getnote (data, pos,
- &nhdr, &name_offset, &desc_offset)) > 0)
- if (nhdr.n_type == NT_GNU_BUILD_ID
- && nhdr.n_namesz == sizeof "GNU"
- && !memcmp (data->d_buf + name_offset, "GNU", sizeof "GNU"))
- handle_build_id (offset + desc_offset, nhdr.n_descsz,
- vaddr + desc_offset);
- }
+ /* Use following contiguous segments to get towards SIZE. */
+ inline bool more (size_t size)
+ {
+ while (end <= start || end - start < size)
+ {
+ if (phdr.p_filesz < phdr.p_memsz)
+ /* This segment is truncated, so no following one helps us. */
+ return false;
- /* We've found the PT_DYNAMIC segment inside an ELF image.
- Return the absolute vaddr of the SONAME string if we find one. */
- inline GElf_Addr handle_dyn (GElf_Off offset, GElf_Word filesz,
- GElf_Addr loadbase, GElf_Addr *strtab_end,
- GElf_Addr *r_debug)
- {
- GElf_Xword soname = 0;
- GElf_Addr strtab = 0;
- GElf_Xword strsz = 0;
-
- Elf_Data *data = gelf_getdata_rawchunk (core, offset, filesz, ELF_T_DYN);
- if (data == NULL)
- return 0;
- size_t n = data->d_size / gelf_fsize (core, ELF_T_DYN, 1, EV_CURRENT);
- for (size_t i = 0;
- i < n && (soname == 0 || strtab == 0 || strsz == 0);
- ++i)
- {
- GElf_Dyn dyn_mem;
- GElf_Dyn *dyn = gelf_getdyn (data, i, &dyn_mem);
- if (dyn != NULL)
- switch (dyn->d_tag)
- {
- case DT_STRTAB:
- strtab = dyn->d_un.d_ptr;
- continue;
+ if (unlikely (gelf_getphdr (elf, ndx++, &phdr) == NULL))
+ return false;
- case DT_STRSZ:
- strsz = dyn->d_un.d_val;
- continue;
+ if (phdr.p_type == PT_LOAD)
+ {
+ if (phdr.p_offset > end
+ || phdr.p_vaddr > end_vaddr)
+ /* It's discontiguous! */
+ return false;
- case DT_SONAME:
- soname = dyn->d_un.d_val;
- continue;
+ update_end ();
+ }
+ }
+ return true;
+ }
- case DT_DEBUG:
- if (*r_debug == 0)
- *r_debug = dyn->d_un.d_ptr;
- continue;
+ /* We need at least this much. */
+ if (! more (minread))
+ return false;
- default:
- continue;
+ /* See how much more we can get of what the caller wants. */
+ (void) more (*buffer_available);
- case DT_NULL:
- break;
- }
- break;
- }
+ /* If it's already on hand anyway, use as much as there is. */
+ if (elf->map_address != NULL)
+ (void) more (elf->maximum_size - start);
- if (strtab != 0)
- {
- *strtab_end = loadbase + strtab + strsz;
- if (soname != 0)
- return loadbase + strtab + soname;
- }
- return 0;
- }
+ /* Make sure we don't look past the end of the actual file,
+ even if the headers tell us to. */
+ if (unlikely (end > elf->maximum_size))
+ end = elf->maximum_size;
- /* We think this PT_LOAD segment starts with an ELF header. Investigate. */
- inline GElf_Half consider_segment (GElf_Phdr *phdr, char *header,
- GElf_Addr *vaddr_end,
- GElf_Off *file_size_available,
- GElf_Off *file_size_total,
- GElf_Addr *loadbase,
- GElf_Addr *dyn_vaddr,
- GElf_Word *dyn_filesz)
+ /* If the file is too small, there is nothing at all to get. */
+ if (unlikely (start >= end))
+ return false;
+
+ if (elf->map_address != NULL)
{
- union
- {
- Elf32_Ehdr e32;
- Elf64_Ehdr e64;
- } ehdr;
+ void *contents = elf->map_address + elf->start_offset + start;
+ size_t size = end - start;
- Elf_Data xlatefrom =
- {
- .d_type = ELF_T_EHDR,
- .d_buf = header,
- .d_version = EV_CURRENT,
- };
- Elf_Data xlateto =
+ if (minread == 0) /* String mode. */
{
- .d_type = ELF_T_EHDR,
- .d_buf = &ehdr,
- .d_size = sizeof ehdr,
- .d_version = EV_CURRENT,
- };
- GElf_Half e_type = ET_NONE;
- GElf_Off phoff = 0;
- GElf_Off shdrs_end = 0;
- GElf_Half phnum = 0;
- GElf_Half phentsize = 0;
- switch (header[EI_CLASS])
- {
- case ELFCLASS32:
- xlatefrom.d_size = sizeof (Elf32_Ehdr);
- if (elf32_xlatetom (&xlateto, &xlatefrom, header[EI_DATA]) != NULL)
- {
- e_type = ehdr.e32.e_type;
- phoff = ehdr.e32.e_phoff;
- phnum = ehdr.e32.e_phnum;
- phentsize = ehdr.e32.e_phentsize;
- shdrs_end = ehdr.e32.e_shoff;
- shdrs_end += ehdr.e32.e_shnum * ehdr.e32.e_shentsize;
- }
- break;
-
- case ELFCLASS64:
- xlatefrom.d_size = sizeof (Elf64_Ehdr);
- if (elf64_xlatetom (&xlateto, &xlatefrom, header[EI_DATA]) != NULL)
- {
- e_type = ehdr.e64.e_type;
- phoff = ehdr.e64.e_phoff;
- phnum = ehdr.e64.e_phnum;
- phentsize = ehdr.e64.e_phentsize;
- shdrs_end = ehdr.e64.e_shoff;
- shdrs_end += ehdr.e64.e_shnum * ehdr.e64.e_shentsize;
- }
- break;
+ const void *eos = memchr (contents, '\0', size);
+ if (unlikely (eos == NULL) || unlikely (eos == contents))
+ return false;
+ size = eos + 1 - contents;
}
- /* We're done with the original header we read in. */
- gelf_freechunk (core, header);
-
- /* We see if we actually have phdrs to look at. */
- if ((e_type != ET_EXEC && e_type != ET_DYN)
- || phnum == 0 || phoff < ehdr_size
- || phdr->p_filesz < phoff + phnum * phentsize
- || phentsize != gelf_fsize (core, ELF_T_PHDR, 1, EV_CURRENT))
- return ET_NONE;
-
- /* Fetch the raw program headers to translate and examine. */
- char *rawphdrs = gelf_rawchunk (core, phdr->p_offset + phoff,
- phnum * phentsize);
- if (rawphdrs == NULL)
+ if (*buffer == NULL)
{
- __libdwfl_seterrno (DWFL_E_LIBELF);
- result = -1;
- return ET_NONE;
+ *buffer = contents;
+ *buffer_available = size;
}
- xlatefrom.d_buf = rawphdrs;
- xlatefrom.d_size = phnum * phentsize;
- xlatefrom.d_type = ELF_T_PHDR;
- union
- {
- Elf32_Phdr p32[phnum];
- Elf64_Phdr p64[phnum];
- } phdrs;
- xlateto.d_buf = &phdrs;
- xlateto.d_size = sizeof phdrs;
- bool phdrs_ok = false;
- switch (ehdr.e32.e_ident[EI_CLASS])
+ else
{
- case ELFCLASS32:
- phdrs_ok = elf32_xlatetom (&xlateto, &xlatefrom,
- ehdr.e32.e_ident[EI_DATA]) != NULL;
- break;
-
- case ELFCLASS64:
- phdrs_ok = elf64_xlatetom (&xlateto, &xlatefrom,
- ehdr.e64.e_ident[EI_DATA]) != NULL;
- break;
+ *buffer_available = MIN (size, *buffer_available);
+ memcpy (*buffer, contents, *buffer_available);
}
- gelf_freechunk (core, rawphdrs);
-
- if (!phdrs_ok)
- return ET_NONE;
-
- /* The p_align of a core file PT_LOAD segment gives the ELF page size
- of the process that dumped the core. This is what controlled the
- interpretation of p_offset and p_vaddr values in PT_LOAD headers
- of objects it loaded. */
- const GElf_Xword pagesz = phdr->p_align;
-
- /* Consider each phdr of the embedded image. */
- *loadbase = phdr->p_vaddr;
- bool found_base = false;
- GElf_Addr vaddr_limit = 0;
- GElf_Off file_should_end = 0;
- GElf_Off file_end = 0;
- GElf_Off file_end_aligned = 0;
- inline void handle_segment (GElf_Word type,
- GElf_Addr vaddr, GElf_Off offset,
- GElf_Xword filesz, GElf_Xword memsz)
+ }
+ else
+ {
+ void *into = *buffer;
+ if (*buffer == NULL)
{
- switch (type)
+ *buffer_available = MIN (minread ?: 512,
+ MAX (4096, MIN (end - start,
+ *buffer_available)));
+ into = malloc (*buffer_available);
+ if (unlikely (into == NULL))
{
- case PT_LOAD:
- /* For load segments, keep track of the bounds of the image. */
- file_should_end = offset + filesz;
- if (!found_base && (offset & -pagesz) == 0)
- {
- *loadbase = phdr->p_vaddr - (vaddr & -pagesz);
- found_base = true;
- }
- vaddr_limit = (*loadbase + vaddr + memsz + pagesz - 1) & -pagesz;
-
- /* If this segment starts contiguous with the previous one,
- it extends the verbatim file image we have to use. */
- if (file_end_aligned == 0
- || (offset & -pagesz) <= file_end_aligned)
- {
- file_end = offset + filesz;
- file_end_aligned = (offset + filesz + pagesz - 1) & -pagesz;
- }
- break;
-
- case PT_NOTE:
- /* For note segments, inspect the contents if they are within
- this segment of the core file. */
- if (offset < phdr->p_filesz && phdr->p_filesz - offset >= filesz)
- handle_note (vaddr - phdr->p_vaddr + phdr->p_offset, filesz,
- vaddr);
- break;
-
- case PT_DYNAMIC:
- /* Save the address of the dynamic section. */
- *dyn_vaddr = *loadbase + vaddr;
- *dyn_filesz = filesz;
- break;
+ __libdwfl_seterrno (DWFL_E_NOMEM);
+ return false;
}
}
- switch (ehdr.e32.e_ident[EI_CLASS])
+ ssize_t nread = pread_retry (elf->fildes, into, *buffer_available, start);
+ if (nread < (ssize_t) minread)
{
- case ELFCLASS32:
- for (uint_fast16_t i = 0; i < phnum && result >= 0; ++i)
- handle_segment (phdrs.p32[i].p_type,
- phdrs.p32[i].p_vaddr, phdrs.p32[i].p_offset,
- phdrs.p32[i].p_filesz, phdrs.p32[i].p_memsz);
- break;
-
- case ELFCLASS64:
- for (uint_fast16_t i = 0; i < phnum && result >= 0; ++i)
- handle_segment (phdrs.p64[i].p_type,
- phdrs.p64[i].p_vaddr, phdrs.p64[i].p_offset,
- phdrs.p64[i].p_filesz, phdrs.p64[i].p_memsz);
- break;
-
- default:
- abort ();
- break;
+ if (into != *buffer)
+ free (into);
+ if (nread < 0)
+ __libdwfl_seterrno (DWFL_E_ERRNO);
+ return false;
}
- /* 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. */
- if (file_end < shdrs_end && shdrs_end <= file_end_aligned)
- file_end = shdrs_end;
-
- /* If there were section headers in the file, we'd like to have them. */
- if (shdrs_end != 0 && shdrs_end <= file_end
- && shdrs_end > file_should_end)
- file_should_end = shdrs_end;
-
- *file_size_available = file_end;
- *file_size_total = file_should_end;
- *vaddr_end = vaddr_limit;
- return e_type;
- }
-
- GElf_Ehdr ehdr_mem;
- GElf_Ehdr *ehdr = gelf_getehdr (core, &ehdr_mem);
- if (ehdr == NULL)
- {
- elf_error:
- __libdwfl_seterrno (DWFL_E_LIBELF);
- return -1;
- }
-
- size_t earlier_modules = dwfl->nmodules;
- GElf_Addr r_debug_vaddr = 0;
- for (uint_fast16_t i = 0; i < ehdr->e_phnum; ++i)
- {
- GElf_Phdr phdr_mem;
- GElf_Phdr *phdr = gelf_getphdr (core, i, &phdr_mem);
- if (phdr == NULL)
- goto elf_error;
-
- /* Consider read-only segments where we have enough to look at. */
- if (phdr->p_type == PT_LOAD
- && (phdr->p_flags & (PF_R|PF_W)) == PF_R
- && phdr->p_filesz > ehdr_size)
+ if (minread == 0) /* String mode. */
{
- /* Look at the ELF ident bytes to see if this might be an ELF file
- image in the format of the core file. */
- char *header = gelf_rawchunk (core, phdr->p_offset, ehdr_size);
- if (header == NULL)
- goto elf_error;
- if (memcmp (header, ehdr->e_ident, EI_VERSION))
- {
- /* Doesn't look like the right header. */
- gelf_freechunk (core, header);
- continue;
- }
-
- /* Consider this segment. Bail if we get an unexpected error. */
- build_id_offset = 0;
- build_id_size = 0;
- build_id_vaddr = 0;
- GElf_Addr dyn_vaddr = 0;
- GElf_Word dyn_filesz = 0;
- GElf_Addr vaddr_end;
- GElf_Off available_size;
- GElf_Off whole_size;
- GElf_Addr loadbase;
- GElf_Half type = consider_segment (phdr, header,
- &vaddr_end,
- &available_size, &whole_size,
- &loadbase,
- &dyn_vaddr, &dyn_filesz);
- if (result < 0)
- break;
-
- if (type == ET_NONE) /* Nothing there. */
- continue;
-
- /* Check if this segment contains the dynamic section. */
- GElf_Addr soname_vaddr = 0;
- GElf_Addr dynstr_end = 0;
- inline void check_dyn (void)
- {
- if (soname_vaddr == 0 && dyn_vaddr != 0
- && dyn_vaddr >= phdr->p_vaddr
- && dyn_vaddr - phdr->p_vaddr + dyn_filesz <= phdr->p_filesz)
- soname_vaddr = handle_dyn (dyn_vaddr - phdr->p_vaddr
- + phdr->p_offset,
- dyn_filesz, loadbase, &dynstr_end,
- &r_debug_vaddr);
- }
-
- check_dyn ();
-
- /* Skip some following segments if the object we found
- has phdrs that say they are part of its segments. */
- const uint_fast16_t considering = i;
- GElf_Addr vaddr_start = phdr->p_vaddr & -phdr->p_align;
- GElf_Off file_start = phdr->p_offset & -phdr->p_align;
- GElf_Off file_end = (phdr->p_offset + phdr->p_filesz
- + phdr->p_align - 1) & -phdr->p_align;
- while ((phdr->p_type != PT_LOAD
- || vaddr_end > phdr->p_vaddr + phdr->p_memsz)
- && ++i < ehdr->e_phnum)
- {
- phdr = gelf_getphdr (core, i, &phdr_mem);
- if (phdr == NULL)
- goto elf_error;
-
- if (phdr->p_type != PT_LOAD)
- continue;
-
- check_dyn ();
-
- /* If we had all of the previous segment, we have this
- segment as part of the contiguous file image. */
- GElf_Off segment_start = phdr->p_offset & -phdr->p_align;
- GElf_Off segment_end = (phdr->p_offset + phdr->p_filesz
- + phdr->p_align - 1) & -phdr->p_align;
- if (file_end == segment_start)
- file_end = segment_end;
- }
- if (i == ehdr->e_phnum)
- {
- /* Somehing is amiss. Punt this supposed object we found. */
- i = considering;
- continue;
- }
-
- /* We have as much of the file as the dumped segments contain. */
- available_size = MIN (file_end - file_start, available_size);
-
- /* We found an object that goes from VADDR_START to VADDR_END. */
- result = 1;
-
- /* A dumped partial ELF file is only useful to us if it
- contained a dynamic segment and a string table. */
- if (available_size < whole_size
- && (dynstr_end == 0
- || available_size < dynstr_end - vaddr_start + file_start))
- available_size = 0;
-
- char *soname = NULL;
- if (dynstr_end == 0)
- dynstr_end = vaddr_end;
- if (soname_vaddr >= vaddr_start && soname_vaddr < dynstr_end)
- {
- GElf_Off soname_offset = soname_vaddr - vaddr_start + file_start;
- GElf_Off limit = dynstr_end - vaddr_start + file_start;
- if (limit > file_end)
- limit = file_end;
- soname = string_from_offset (core, soname_offset, limit);
- }
-
- // XXX maybe record or verify build_id against explicit exe?
- if (module_overlapping (dwfl, vaddr_start, vaddr_end, false) == NULL)
+ const void *eos = memchr (into, '\0', nread);
+ if (unlikely (eos == NULL) || unlikely (eos == into))
{
- /* Record what we've learned, for find_elf to use. */
- struct core_module_info *mod_data = malloc (sizeof *mod_data);
- if (mod_data == NULL)
- result = -1;
- else
- {
- mod_data->offset = file_start;
- mod_data->whole_size = available_size;
- mod_data->l_name_vaddr = 0;
-
- Dwfl_Module *mod = INTUSE(dwfl_report_module)
- (dwfl,
- soname ?: type == ET_EXEC ? "[exe]"
- : available_size == 0 ? "[dso]" : "[dumped-dso]",
- vaddr_start, vaddr_end);
-
- if (mod == NULL)
- {
- free (mod_data);
- result = -1;
- }
- else
- {
- /* We already eliminated duplicates. */
- assert (mod->cb_data == NULL);
- mod->cb_data = mod_data;
- }
-
- if (build_id_size != 0)
- {
- void *build_id = gelf_rawchunk (core, build_id_offset,
- build_id_size);
- if (build_id != NULL)
- INTUSE(dwfl_module_report_build_id) (mod, build_id,
- build_id_size,
- build_id_vaddr);
- gelf_freechunk (core, build_id);
- }
- }
+ if (*buffer == NULL)
+ free (into);
+ return false;
}
-
- if (soname != NULL)
- gelf_freechunk (core, soname);
-
- if (result < 0)
- break;
+ nread = eos + 1 - into;
}
- }
-
- if (result >= 0 && r_debug_vaddr == 0 && earlier_modules > 0)
- /* Try to find an existing executable module with a DT_DEBUG. */
- for (Dwfl_Module *mod = dwfl->modulelist;
- earlier_modules-- > 0 && r_debug_vaddr == 0;
- mod = mod->next)
- if (mod->main.elf != NULL)
- {
- GElf_Addr dt_debug = find_dt_debug (mod->main.elf, mod->main.bias);
- if (dt_debug != 0)
- r_debug_vaddr = addr_from_memory (core, dt_debug);
- }
-
- if (result >= 0 && r_debug_vaddr != 0)
- /* Now we can try to find the dynamic linker's library list. */
- result = report_r_debug (result, core, dwfl, r_debug_vaddr);
- if (result >= 0)
- dwfl->cb_data = core;
+ if (*buffer == NULL)
+ *buffer = into;
+ *buffer_available = nread;
+ }
- return result;
+ return true;
}
-INTDEF (dwfl_core_file_report)
-
-
-/* Dwfl_Callbacks.find_elf */
int
-dwfl_core_file_find_elf (Dwfl_Module *mod,
- void **userdata __attribute__ ((unused)),
- const char *module_name __attribute__ ((unused)),
- Dwarf_Addr base __attribute__ ((unused)),
- char **file_name, Elf **elfp)
+dwfl_core_file_report (Dwfl *dwfl, Elf *elf)
{
- Elf *core = mod->dwfl->cb_data;
- struct core_module_info *info = mod->cb_data;
-
- int fd = -1;
- *file_name = NULL;
+ size_t phnum;
+ if (unlikely (elf_getphdrnum (elf, &phnum) != 0))
+ {
+ __libdwfl_seterrno (DWFL_E_LIBELF);
+ return -1;
+ }
- /* If we have the whole image in the core file, just use it directly. */
- if (info != NULL && info->whole_size != 0)
- *elfp = gelf_begin_embedded (ELF_C_READ_MMAP_PRIVATE, core,
- info->offset, info->whole_size);
+ /* 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;
- /* If we found a build ID, try to follow that. */
- if (*elfp == NULL && mod->build_id_len > 0)
+ /* Now sniff segment contents for modules. */
+ int sniffed = 0;
+ ndx = 0;
+ do
{
- fd = INTUSE(dwfl_build_id_find_elf) (mod, NULL, NULL, 0,
- file_name, elfp);
- if (fd >= 0)
- return fd;
+ 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. */
- /* If we found the dynamic linker's idea of the file name, report that. */
- if (info != NULL && info->l_name_vaddr != 0)
+ const void *auxv = NULL;
+ size_t auxv_size = 0;
+ if (likely (notes_phdr.p_type == PT_NOTE))
{
- char *chunk = string_from_memory (core, info->l_name_vaddr);
- if (chunk != NULL)
+ /* PT_NOTE -> NT_AUXV -> AT_PHDR -> PT_DYNAMIC -> DT_DEBUG */
+
+ Elf_Data *notes = elf_getdata_rawchunk (elf,
+ notes_phdr.p_offset,
+ notes_phdr.p_filesz,
+ ELF_T_NHDR);
+ if (likely (notes != NULL))
{
- *file_name = strdup (chunk);
- gelf_freechunk (core, chunk);
+ size_t pos = 0;
+ GElf_Nhdr nhdr;
+ size_t name_pos;
+ size_t desc_pos;
+ while ((pos = gelf_getnote (notes, pos, &nhdr,
+ &name_pos, &desc_pos)) > 0)
+ if (nhdr.n_type == NT_AUXV
+ && nhdr.n_namesz == sizeof "CORE"
+ && !memcmp (notes->d_buf + name_pos, "CORE", sizeof "CORE"))
+ {
+ auxv = notes->d_buf + desc_pos;
+ auxv_size = nhdr.n_descsz;
+ break;
+ }
}
}
- return fd;
+ /* 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);
+
+ /* 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;
}
-INTDEF (dwfl_core_file_find_elf)
+INTDEF (dwfl_core_file_report)
diff --git a/libdwfl/derelocate.c b/libdwfl/derelocate.c
index 0877276d..56ba25af 100644
--- a/libdwfl/derelocate.c
+++ b/libdwfl/derelocate.c
@@ -1,5 +1,5 @@
/* Recover relocatibility for addresses computed from debug information.
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -94,7 +94,7 @@ cache_sections (Dwfl_Module *mod)
size_t nrefs = 0;
size_t shstrndx;
- if (unlikely (elf_getshstrndx (mod->main.elf, &shstrndx) < 0))
+ if (unlikely (elf_getshdrstrndx (mod->main.elf, &shstrndx) < 0))
{
elf_error:
__libdwfl_seterrno (DWFL_E_LIBELF);
@@ -110,7 +110,8 @@ cache_sections (Dwfl_Module *mod)
if (shdr == NULL)
goto elf_error;
- if ((shdr->sh_flags & SHF_ALLOC) && shdr->sh_addr == 0)
+ if ((shdr->sh_flags & SHF_ALLOC) && shdr->sh_addr == 0
+ && mod->e_type == ET_REL)
{
/* This section might not yet have been looked at. */
if (__libdwfl_relocate_value (mod, mod->main.elf, &shstrndx,
@@ -238,6 +239,7 @@ dwfl_module_relocations (Dwfl_Module *mod)
return 1;
case ET_EXEC:
+ assert (mod->main.bias == 0);
assert (mod->debug.bias == 0);
break;
}
@@ -353,16 +355,26 @@ find_section (Dwfl_Module *mod, Dwarf_Addr *addr)
int
dwfl_module_relocate_address (Dwfl_Module *mod, Dwarf_Addr *addr)
{
- if (check_module (mod))
+ if (unlikely (check_module (mod)))
return -1;
- if (mod->e_type != ET_REL)
+ switch (mod->e_type)
{
- *addr -= mod->debug.bias;
- return 0;
+ case ET_REL:
+ return find_section (mod, addr);
+
+ case ET_DYN:
+ /* All relative to first and only relocation base: module start. */
+ *addr -= mod->low_addr;
+ break;
+
+ default:
+ /* Already absolute, dwfl_module_relocations returned zero. We
+ shouldn't really have been called, but it's a harmless no-op. */
+ break;
}
- return find_section (mod, addr);
+ return 0;
}
INTDEF (dwfl_module_relocate_address)
@@ -397,3 +409,4 @@ dwfl_module_address_section (Dwfl_Module *mod, Dwarf_Addr *address,
*bias = mod->main.bias;
return mod->reloc_info->refs[idx].scn;
}
+INTDEF (dwfl_module_address_section)
diff --git a/libdwfl/dwfl_addrmodule.c b/libdwfl/dwfl_addrmodule.c
index 54d9a3d9..64559436 100644
--- a/libdwfl/dwfl_addrmodule.c
+++ b/libdwfl/dwfl_addrmodule.c
@@ -1,5 +1,5 @@
/* Find module containing address.
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005, 2006, 2007, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -52,32 +52,8 @@
Dwfl_Module *
dwfl_addrmodule (Dwfl *dwfl, Dwarf_Addr address)
{
- if (dwfl == NULL || dwfl->modules == NULL)
- return NULL;
-
- Dwfl_Module *boundary = NULL;
-
- /* Do binary search on the array indexed by module load address. */
- size_t l = 0, u = dwfl->nmodules;
- while (l < u)
- {
- size_t idx = (l + u) / 2;
- Dwfl_Module *m = dwfl->modules[idx];
- if (address < m->low_addr)
- u = idx;
- else if (address >= m->high_addr)
- {
- l = idx + 1;
- if (address == m->high_addr)
- /* If the high bound of this module is not the low bound of
- another, then consider the boundary address to be inside
- this module. */
- boundary = m;
- }
- else
- return m;
- }
-
- return boundary;
+ Dwfl_Module *mod;
+ (void) INTUSE(dwfl_addrsegment) (dwfl, address, &mod);
+ return mod;
}
INTDEF (dwfl_addrmodule)
diff --git a/libdwfl/dwfl_build_id_find_debuginfo.c b/libdwfl/dwfl_build_id_find_debuginfo.c
index 97def072..e51b65b1 100644
--- a/libdwfl/dwfl_build_id_find_debuginfo.c
+++ b/libdwfl/dwfl_build_id_find_debuginfo.c
@@ -1,5 +1,5 @@
/* Find the debuginfo file for a module from its build ID.
- Copyright (C) 2007 Red Hat, Inc.
+ Copyright (C) 2007, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -71,10 +71,16 @@ dwfl_build_id_find_debuginfo (Dwfl_Module *mod,
/* 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. */
- mod->debug.elf = elf_begin (fd, ELF_C_READ_MMAP_PRIVATE, NULL);
- if (likely (__libdwfl_find_build_id (mod, false, mod->debug.elf) == 2))
- /* Also backdoor the gratuitous flag. */
- mod->debug.valid = true;
+ Dwfl_Error error = __libdw_open_file (&fd, &mod->debug.elf, true, false);
+ if (error != DWFL_E_NOERROR)
+ __libdwfl_seterrno (error);
+ else if (likely (__libdwfl_find_build_id (mod, false,
+ mod->debug.elf) == 2))
+ {
+ /* Also backdoor the gratuitous flag. */
+ mod->debug.valid = true;
+ return fd;
+ }
else
{
/* A mismatch! */
@@ -82,10 +88,10 @@ dwfl_build_id_find_debuginfo (Dwfl_Module *mod,
mod->debug.elf = NULL;
close (fd);
fd = -1;
- free (*debuginfo_file_name);
- *debuginfo_file_name = NULL;
- errno = 0;
}
+ free (*debuginfo_file_name);
+ *debuginfo_file_name = NULL;
+ errno = 0;
}
return fd;
}
diff --git a/libdwfl/dwfl_build_id_find_elf.c b/libdwfl/dwfl_build_id_find_elf.c
index c6215012..e27c8e12 100644
--- a/libdwfl/dwfl_build_id_find_elf.c
+++ b/libdwfl/dwfl_build_id_find_elf.c
@@ -1,5 +1,5 @@
/* Find an ELF file for a module from its build ID.
- Copyright (C) 2007 Red Hat, Inc.
+ Copyright (C) 2007-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -57,7 +57,8 @@ int
internal_function
__libdwfl_open_by_build_id (Dwfl_Module *mod, bool debug, char **file_name)
{
- *file_name = NULL;
+ /* 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;
@@ -118,6 +119,13 @@ __libdwfl_open_by_build_id (Dwfl_Module *mod, bool debug, char **file_name)
free (name);
}
+ /* If we simply found nothing, clear errno. If we had some other error
+ with the file, report that. Possibly this should treat other errors
+ like ENOENT too. But ignoring all errors could mask some that should
+ be reported. */
+ if (fd < 0 && errno == ENOENT)
+ errno = 0;
+
return fd;
}
@@ -132,10 +140,15 @@ dwfl_build_id_find_elf (Dwfl_Module *mod,
int fd = __libdwfl_open_by_build_id (mod, false, file_name);
if (fd >= 0)
{
- *elfp = elf_begin (fd, ELF_C_READ_MMAP_PRIVATE, NULL);
- if (__libdwfl_find_build_id (mod, false, *elfp) == 2)
- /* This is a backdoor signal to short-circuit the ID refresh. */
- mod->main.valid = true;
+ Dwfl_Error error = __libdw_open_file (&fd, elfp, true, false);
+ if (error != DWFL_E_NOERROR)
+ __libdwfl_seterrno (error);
+ else if (__libdwfl_find_build_id (mod, false, *elfp) == 2)
+ {
+ /* This is a backdoor signal to short-circuit the ID refresh. */
+ mod->main.valid = true;
+ return fd;
+ }
else
{
/* This file does not contain the ID it should! */
@@ -143,10 +156,16 @@ dwfl_build_id_find_elf (Dwfl_Module *mod,
*elfp = NULL;
close (fd);
fd = -1;
- free (*file_name);
- *file_name = NULL;
}
+ free (*file_name);
+ *file_name = NULL;
}
+ else if (errno == 0 && mod->build_id_len > 0)
+ /* Setting this with no file yet loaded is a marker that
+ the build ID is authoritative even if we also know a
+ putative *FILE_NAME. */
+ mod->main.valid = true;
+
return fd;
}
INTDEF (dwfl_build_id_find_elf)
diff --git a/libdwfl/dwfl_end.c b/libdwfl/dwfl_end.c
index e339b147..429abb13 100644
--- a/libdwfl/dwfl_end.c
+++ b/libdwfl/dwfl_end.c
@@ -1,5 +1,5 @@
/* Finish a session using libdwfl.
- Copyright (C) 2005 Red Hat, Inc.
+ Copyright (C) 2005, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -52,12 +52,20 @@
void
dwfl_end (Dwfl *dwfl)
{
- if (dwfl != NULL)
+ if (dwfl == NULL)
+ return;
+
+ free (dwfl->lookup_addr);
+ free (dwfl->lookup_module);
+ free (dwfl->lookup_segndx);
+
+ Dwfl_Module *next = dwfl->modulelist;
+ while (next != NULL)
{
- for (size_t i = 0; i < dwfl->nmodules; ++i)
- if (dwfl->modules[i] != NULL)
- __libdwfl_module_free (dwfl->modules[i]);
- free (dwfl->modules);
- free (dwfl);
+ Dwfl_Module *dead = next;
+ next = dead->next;
+ __libdwfl_module_free (dead);
}
+
+ free (dwfl);
}
diff --git a/libdwfl/dwfl_error.c b/libdwfl/dwfl_error.c
index 414fbaf4..9144a378 100644
--- a/libdwfl/dwfl_error.c
+++ b/libdwfl/dwfl_error.c
@@ -1,5 +1,5 @@
/* Error handling in libdwfl.
- Copyright (C) 2005, 2006 Red Hat, Inc.
+ Copyright (C) 2005-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -61,49 +61,18 @@
#include "libdwflP.h"
-#ifdef USE_TLS
/* The error number. */
static __thread int global_error;
-#else
-/* This is the key for the thread specific memory. */
-static tls_key_t key;
-
-/* The error number. Used in non-threaded programs. */
-static int global_error;
-static bool threaded;
-/* We need to initialize the thread-specific data. */
-once_define (static, once);
-
-/* The initialization and destruction functions. */
-static void init (void);
-static void free_key_mem (void *mem);
-#endif /* TLS */
int
dwfl_errno (void)
{
- int result;
-
-#ifndef USE_TLS
- /* If we have not yet initialized the buffer do it now. */
- once_execute (once, init);
-
- if (threaded)
- {
- /* We do not allocate memory for the data. It is only a word.
- We can store it in place of the pointer. */
- result = (intptr_t) getspecific (key);
-
- setspecific (key, (void *) (intptr_t) DWFL_E_NOERROR);
- return result;
- }
-#endif /* TLS */
-
- result = global_error;
+ int result = global_error;
global_error = DWFL_E_NOERROR;
return result;
}
+INTDEF (dwfl_errno)
static const struct msgtable
@@ -172,19 +141,7 @@ void
internal_function
__libdwfl_seterrno (Dwfl_Error error)
{
- int value = canonicalize (error);
-
-#ifndef USE_TLS
- /* If we have not yet initialized the buffer do it now. */
- once_execute (once, init);
-
- if (threaded)
- /* We do not allocate memory for the data. It is only a word.
- We can store it in place of the pointer. */
- setspecific (key, (void *) (intptr_t) value);
-#endif /* TLS */
-
- global_error = value;
+ global_error = canonicalize (error);
}
@@ -194,19 +151,7 @@ dwfl_errmsg (error)
{
if (error == 0 || error == -1)
{
- int last_error;
-
-#ifndef USE_TLS
- /* If we have not yet initialized the buffer do it now. */
- once_execute (once, init);
-
- if (threaded)
- /* We do not allocate memory for the data. It is only a word.
- We can store it in place of the pointer. */
- last_error = (intptr_t) getspecific (key);
- else
-#endif /* TLS */
- last_error = global_error;
+ int last_error = global_error;
if (error == 0 && last_error == 0)
return NULL;
@@ -233,26 +178,3 @@ dwfl_errmsg (error)
? error : DWFL_E_UNKNOWN_ERROR]]);
}
INTDEF (dwfl_errmsg)
-
-
-#ifndef USE_TLS
-/* Free the thread specific data, this is done if a thread terminates. */
-static void
-free_key_mem (void *mem __attribute__ ((unused)))
-{
- setspecific (key, NULL);
-}
-
-
-/* Initialize the key for the global variable. */
-static void
-init (void)
-{
- // XXX Screw you, gcc4, the unused function attribute does not work.
- __asm ("" :: "r" (free_key_mem));
-
- if (key_create (&key, free_key_mem) == 0)
- /* Creating the key succeeded. */
- threaded = true;
-}
-#endif /* TLS */
diff --git a/libdwfl/dwfl_getdwarf.c b/libdwfl/dwfl_getdwarf.c
index e1c1aa76..0a0656f7 100644
--- a/libdwfl/dwfl_getdwarf.c
+++ b/libdwfl/dwfl_getdwarf.c
@@ -1,5 +1,5 @@
/* Iterate through modules to fetch Dwarf information.
- Copyright (C) 2005 Red Hat, Inc.
+ Copyright (C) 2005, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -49,6 +49,24 @@
#include "libdwflP.h"
+struct module_callback_info
+{
+ int (*callback) (Dwfl_Module *, void **,
+ const char *, Dwarf_Addr,
+ Dwarf *, Dwarf_Addr, void *);
+ void *arg;
+};
+
+static int
+module_callback (Dwfl_Module *mod, void **userdata,
+ const char *name, Dwarf_Addr start, void *arg)
+{
+ const struct module_callback_info *info = arg;
+ Dwarf_Addr bias = 0;
+ Dwarf *dw = INTUSE(dwfl_module_getdwarf) (mod, &bias);
+ return (*info->callback) (mod, userdata, name, start, dw, bias, info->arg);
+}
+
ptrdiff_t
dwfl_getdwarf (Dwfl *dwfl,
int (*callback) (Dwfl_Module *, void **,
@@ -57,20 +75,6 @@ dwfl_getdwarf (Dwfl *dwfl,
void *arg,
ptrdiff_t offset)
{
- if (dwfl == NULL)
- return -1;
-
- if ((size_t) offset > dwfl->nmodules)
- return -1;
-
- while ((size_t) offset < dwfl->nmodules)
- {
- Dwfl_Module *mod = dwfl->modules[offset++];
- Dwarf_Addr bias = 0;
- Dwarf *dw = INTUSE(dwfl_module_getdwarf) (mod, &bias);
- if ((*callback) (MODCB_ARGS (mod), dw, bias, arg) != DWARF_CB_OK)
- return offset;
- }
-
- return 0;
+ struct module_callback_info info = { callback, arg };
+ return INTUSE(dwfl_getmodules) (dwfl, &module_callback, &info, offset);
}
diff --git a/libdwfl/dwfl_getmodules.c b/libdwfl/dwfl_getmodules.c
index 45e550a5..7c6ab971 100644
--- a/libdwfl/dwfl_getmodules.c
+++ b/libdwfl/dwfl_getmodules.c
@@ -1,5 +1,5 @@
/* Iterate through modules.
- Copyright (C) 2005 Red Hat, Inc.
+ Copyright (C) 2005, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -59,15 +59,55 @@ dwfl_getmodules (Dwfl *dwfl,
if (dwfl == NULL)
return -1;
- if ((size_t) offset > dwfl->nmodules)
- return -1;
+ /* We iterate through the linked list when it's all we have.
+ But continuing from an offset is slow that way. So when
+ DWFL->lookup_module is populated, we can instead keep our
+ place by jumping directly into the array. Since the actions
+ of a callback could cause it to get populated, we must
+ choose the style of place-holder when we return an offset,
+ and we encode the choice in the low bits of that value. */
+
+ Dwfl_Module *m = dwfl->modulelist;
- while ((size_t) offset < dwfl->nmodules)
+ if ((offset & 3) == 1)
{
- Dwfl_Module *mod = dwfl->modules[offset++];
- if ((*callback) (MODCB_ARGS (mod), arg) != DWARF_CB_OK)
- return offset;
+ offset >>= 2;
+ for (ptrdiff_t pos = 0; pos < offset; ++pos)
+ if (m == NULL)
+ return -1;
+ else
+ m = m->next;
}
+ else if (((offset & 3) == 2) && likely (dwfl->lookup_module != NULL))
+ {
+ offset >>= 2;
+ if ((size_t) offset - 1 == dwfl->lookup_elts)
+ return 0;
+
+ if (unlikely ((size_t) offset - 1 > dwfl->lookup_elts))
+ return -1;
+
+ m = dwfl->lookup_module[offset - 1];
+ if (unlikely (m == NULL))
+ return -1;
+ }
+ else if (offset != 0)
+ {
+ __libdwfl_seterrno (DWFL_E_BADSTROFF);
+ return -1;
+ }
+
+ while (m != NULL)
+ {
+ int ok = (*callback) (MODCB_ARGS (m), arg);
+ ++offset;
+ m = m->next;
+ if (ok != DWARF_CB_OK)
+ return ((dwfl->lookup_module == NULL) ? ((offset << 2) | 1)
+ : (((m == NULL ? (ptrdiff_t) dwfl->lookup_elts + 1
+ : m->segment + 1) << 2) | 2));
+ }
return 0;
}
+INTDEF (dwfl_getmodules)
diff --git a/libdwfl/dwfl_module.c b/libdwfl/dwfl_module.c
index f6b6353a..de2fa5a9 100644
--- a/libdwfl/dwfl_module.c
+++ b/libdwfl/dwfl_module.c
@@ -1,5 +1,5 @@
/* Maintenance of module list in libdwfl.
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005, 2006, 2007, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -115,19 +115,18 @@ __libdwfl_module_free (Dwfl_Module *mod)
}
void
-dwfl_report_begin_add (Dwfl *dwfl)
+dwfl_report_begin_add (Dwfl *dwfl __attribute__ ((unused)))
{
- if (dwfl->modules != NULL)
- free (dwfl->modules);
- dwfl->modules = NULL;
- dwfl->nmodules = 0;
+ /* The lookup table will be cleared on demand, there is nothing we need
+ to do here. */
}
INTDEF (dwfl_report_begin_add)
void
dwfl_report_begin (Dwfl *dwfl)
{
- INTUSE(dwfl_report_begin_add) (dwfl);
+ /* Clear the segment lookup table. */
+ dwfl->lookup_elts = 0;
for (Dwfl_Module *m = dwfl->modulelist; m != NULL; m = m->next)
m->gc = true;
@@ -144,6 +143,21 @@ dwfl_report_module (Dwfl *dwfl, const char *name,
GElf_Addr start, GElf_Addr end)
{
Dwfl_Module **tailp = &dwfl->modulelist, **prevp = tailp;
+
+ inline Dwfl_Module *use (Dwfl_Module *mod)
+ {
+ mod->next = *tailp;
+ *tailp = mod;
+
+ if (unlikely (dwfl->lookup_module != NULL))
+ {
+ free (dwfl->lookup_module);
+ dwfl->lookup_module = NULL;
+ }
+
+ return mod;
+ }
+
for (Dwfl_Module *m = *prevp; m != NULL; m = *(prevp = &m->next))
{
if (m->low_addr == start && m->high_addr == end
@@ -151,13 +165,9 @@ dwfl_report_module (Dwfl *dwfl, const char *name,
{
/* This module is still here. Move it to the place in the list
after the last module already reported. */
-
*prevp = m->next;
- m->next = *tailp;
m->gc = false;
- *tailp = m;
- ++dwfl->nmodules;
- return m;
+ return use (m);
}
if (! m->gc)
@@ -181,35 +191,11 @@ dwfl_report_module (Dwfl *dwfl, const char *name,
mod->high_addr = end;
mod->dwfl = dwfl;
- mod->next = *tailp;
- *tailp = mod;
- ++dwfl->nmodules;
-
- return mod;
+ return use (mod);
}
INTDEF (dwfl_report_module)
-static int
-compare_modules (const void *a, const void *b)
-{
- Dwfl_Module *const *p1 = a, *const *p2 = b;
- const Dwfl_Module *m1 = *p1, *m2 = *p2;
- if (m1 == NULL)
- return -1;
- if (m2 == NULL)
- return 1;
-
- /* No signed difference calculation is correct here, since the
- terms are unsigned and could be more than INT64_MAX apart. */
- if (m1->low_addr < m2->low_addr)
- return -1;
- if (m1->low_addr > m2->low_addr)
- return 1;
- return 0;
-}
-
-
/* Finish reporting the current set of modules to the library.
If REMOVED is not null, it's called for each module that
existed before but was not included in the current report.
@@ -222,8 +208,6 @@ dwfl_report_end (Dwfl *dwfl,
void *arg),
void *arg)
{
- assert (dwfl->modules == NULL);
-
Dwfl_Module **tailp = &dwfl->modulelist;
while (*tailp != NULL)
{
@@ -243,21 +227,6 @@ dwfl_report_end (Dwfl *dwfl,
tailp = &m->next;
}
- dwfl->modules = malloc (dwfl->nmodules * sizeof dwfl->modules[0]);
- if (dwfl->modules == NULL && dwfl->nmodules != 0)
- return -1;
-
- size_t i = 0;
- for (Dwfl_Module *m = dwfl->modulelist; m != NULL; m = m->next)
- {
- assert (! m->gc);
- dwfl->modules[i++] = m;
- }
- assert (i == dwfl->nmodules);
-
- qsort (dwfl->modules, dwfl->nmodules, sizeof dwfl->modules[0],
- &compare_modules);
-
return 0;
}
INTDEF (dwfl_report_end)
diff --git a/libdwfl/dwfl_module_addrsym.c b/libdwfl/dwfl_module_addrsym.c
index f16de116..72280d11 100644
--- a/libdwfl/dwfl_module_addrsym.c
+++ b/libdwfl/dwfl_module_addrsym.c
@@ -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, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -49,6 +49,9 @@
#include "libdwflP.h"
+/* Returns the name of the symbol "closest" to ADDR.
+ 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)
@@ -65,15 +68,6 @@ dwfl_module_addrsym (Dwfl_Module *mod, GElf_Addr addr,
if (shndx >= SHN_LORESERVE)
return sym->st_value == addr;
- /* Ignore section and other special symbols. */
- switch (GELF_ST_TYPE (sym->st_info))
- {
- case STT_SECTION:
- case STT_FILE:
- case STT_TLS:
- return false;
- }
-
/* Figure out what section ADDR lies in. */
if (addr_shndx == SHN_UNDEF)
{
@@ -108,7 +102,7 @@ dwfl_module_addrsym (Dwfl_Module *mod, GElf_Addr addr,
GElf_Word sizeless_shndx = SHN_UNDEF;
/* Keep track of the lowest address a relevant sizeless symbol could have. */
- GElf_Addr min_label = addr;
+ GElf_Addr min_label = 0;
/* Look through the symbol table for a matching symbol. */
for (int i = 1; i < syments; ++i)
@@ -116,23 +110,23 @@ dwfl_module_addrsym (Dwfl_Module *mod, GElf_Addr addr,
GElf_Sym sym;
GElf_Word shndx;
const char *name = INTUSE(dwfl_module_getsym) (mod, i, &sym, &shndx);
- if (name != NULL
+ if (name != NULL && name[0] != '\0'
+ && sym.st_shndx != SHN_UNDEF
&& sym.st_value <= addr
- && (sym.st_size == 0 || addr - sym.st_value < sym.st_size))
+ && 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 inside its bounds. */
- if (sym.st_value + sym.st_size > addr)
+ /* 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;
- /* This symbol is a better candidate than the current one
- if it's a named symbol, not a section or file symbol,
- and is closer to ADDR or is global when it was local. */
- if (name[0] != '\0'
- && GELF_ST_TYPE (sym.st_info) != STT_SECTION
- && GELF_ST_TYPE (sym.st_info) != STT_FILE)
+ if (sym.st_size == 0 || addr - sym.st_value < sym.st_size)
{
+ /* 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)
@@ -156,10 +150,13 @@ dwfl_module_addrsym (Dwfl_Module *mod, GElf_Addr addr,
}
}
/* When the beginning of its range is no closer,
- the end of its range might be. */
+ 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)
+ && 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;
diff --git a/libdwfl/dwfl_module_build_id.c b/libdwfl/dwfl_module_build_id.c
index 903b79c5..9dc7f678 100644
--- a/libdwfl/dwfl_module_build_id.c
+++ b/libdwfl/dwfl_module_build_id.c
@@ -1,5 +1,5 @@
/* Return build ID information for a module.
- Copyright (C) 2007 Red Hat, Inc.
+ Copyright (C) 2007-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -88,7 +88,8 @@ check_notes (Dwfl_Module *mod, bool set, Elf_Data *data, GElf_Addr data_vaddr)
"GNU", sizeof "GNU"))
return found_build_id (mod, set,
data->d_buf + desc_pos, nhdr.n_descsz,
- data_vaddr == NO_VADDR ? 0 : data_vaddr + pos);
+ data_vaddr == NO_VADDR ? 0
+ : data_vaddr + desc_pos);
return 0;
}
@@ -96,6 +97,7 @@ int
internal_function
__libdwfl_find_build_id (Dwfl_Module *mod, bool set, Elf *elf)
{
+ size_t shstrndx = SHN_UNDEF;
int result = 0;
Elf_Scn *scn = elf_nextscn (elf, NULL);
@@ -105,12 +107,14 @@ __libdwfl_find_build_id (Dwfl_Module *mod, bool set, Elf *elf)
/* No sections, have to look for phdrs. */
GElf_Ehdr ehdr_mem;
GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem);
- if (unlikely (ehdr == NULL))
+ size_t phnum;
+ if (unlikely (ehdr == NULL)
+ || unlikely (elf_getphdrnum (elf, &phnum) != 0))
{
__libdwfl_seterrno (DWFL_E_LIBELF);
return -1;
}
- for (uint_fast16_t i = 0; result == 0 && i < ehdr_mem.e_phnum; ++i)
+ for (size_t i = 0; result == 0 && i < phnum; ++i)
{
GElf_Phdr phdr_mem;
GElf_Phdr *phdr = gelf_getphdr (elf, i, &phdr_mem);
@@ -129,9 +133,18 @@ __libdwfl_find_build_id (Dwfl_Module *mod, bool set, Elf *elf)
GElf_Shdr shdr_mem;
GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
if (likely (shdr != NULL) && shdr->sh_type == SHT_NOTE)
- result = check_notes (mod, set, elf_getdata (scn, NULL),
- (shdr->sh_flags & SHF_ALLOC)
- ? shdr->sh_addr + mod->main.bias : NO_VADDR);
+ {
+ /* 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 = shdr->sh_addr + mod->main.bias;
+ 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);
@@ -164,3 +177,19 @@ dwfl_module_build_id (Dwfl_Module *mod,
return mod->build_id_len;
}
INTDEF (dwfl_module_build_id)
+NEW_VERSION (dwfl_module_build_id, ELFUTILS_0.138)
+
+#ifdef SHARED
+COMPAT_VERSION (dwfl_module_build_id, ELFUTILS_0.130, vaddr_at_end)
+
+int
+_compat_vaddr_at_end_dwfl_module_build_id (Dwfl_Module *mod,
+ const unsigned char **bits,
+ GElf_Addr *vaddr)
+{
+ int result = INTUSE(dwfl_module_build_id) (mod, bits, vaddr);
+ if (result > 0)
+ *vaddr += (result + 3) & -4;
+ return result;
+}
+#endif
diff --git a/libdwfl/dwfl_module_dwarf_cfi.c b/libdwfl/dwfl_module_dwarf_cfi.c
new file mode 100644
index 00000000..e851a1f4
--- /dev/null
+++ b/libdwfl/dwfl_module_dwarf_cfi.c
@@ -0,0 +1,92 @@
+/* Find DWARF CFI for a module in libdwfl.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#include "libdwflP.h"
+#include "../libdw/cfi.h"
+
+Dwarf_CFI *
+internal_function
+__libdwfl_set_cfi (Dwfl_Module *mod, Dwarf_CFI **slot, Dwarf_CFI *cfi)
+{
+ if (cfi != NULL && cfi->ebl == NULL)
+ {
+ Dwfl_Error error = __libdwfl_module_getebl (mod);
+ if (error == DWFL_E_NOERROR)
+ cfi->ebl = mod->ebl;
+ else
+ {
+ if (slot == &mod->eh_cfi)
+ INTUSE(dwarf_cfi_end) (cfi);
+ __libdwfl_seterrno (error);
+ return NULL;
+ }
+ }
+
+ return *slot = cfi;
+}
+
+Dwarf_CFI *
+dwfl_module_dwarf_cfi (mod, bias)
+ Dwfl_Module *mod;
+ Dwarf_Addr *bias;
+{
+ if (mod == NULL)
+ return NULL;
+
+ if (mod->dwarf_cfi != NULL)
+ {
+ *bias = mod->debug.bias;
+ return mod->dwarf_cfi;
+ }
+
+ return __libdwfl_set_cfi (mod, &mod->dwarf_cfi,
+ INTUSE(dwarf_getcfi)
+ (INTUSE(dwfl_module_getdwarf) (mod, bias)));
+}
+INTDEF (dwfl_module_dwarf_cfi)
diff --git a/libdwfl/dwfl_module_eh_cfi.c b/libdwfl/dwfl_module_eh_cfi.c
new file mode 100644
index 00000000..36a495f1
--- /dev/null
+++ b/libdwfl/dwfl_module_eh_cfi.c
@@ -0,0 +1,78 @@
+/* Find EH CFI for a module in libdwfl.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#include "libdwflP.h"
+#include "../libdw/cfi.h"
+
+Dwarf_CFI *
+dwfl_module_eh_cfi (mod, bias)
+ Dwfl_Module *mod;
+ Dwarf_Addr *bias;
+{
+ if (mod == NULL)
+ return NULL;
+
+ if (mod->eh_cfi != NULL)
+ {
+ *bias = mod->main.bias;
+ return mod->eh_cfi;
+ }
+
+ __libdwfl_getelf (mod);
+ if (mod->elferr != DWFL_E_NOERROR)
+ {
+ __libdwfl_seterrno (mod->elferr);
+ return NULL;
+ }
+
+ *bias = mod->main.bias;
+ return __libdwfl_set_cfi (mod, &mod->eh_cfi,
+ INTUSE(dwarf_getcfi_elf) (mod->main.elf));
+}
+INTDEF (dwfl_module_eh_cfi)
diff --git a/libdwfl/dwfl_module_getdwarf.c b/libdwfl/dwfl_module_getdwarf.c
index 775df731..41ed0730 100644
--- a/libdwfl/dwfl_module_getdwarf.c
+++ b/libdwfl/dwfl_module_getdwarf.c
@@ -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-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -61,33 +61,69 @@ open_elf (Dwfl_Module *mod, struct dwfl_file *file)
{
if (file->elf == NULL)
{
+ /* 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 (file->fd < 0)
return CBFAIL;
- file->elf = elf_begin (file->fd, ELF_C_READ_MMAP_PRIVATE, NULL);
+ Dwfl_Error error = __libdw_open_file (&file->fd, &file->elf, true, false);
+ if (error != DWFL_E_NOERROR)
+ return error;
+ }
+ else if (unlikely (elf_kind (file->elf) != ELF_K_ELF))
+ {
+ elf_end (file->elf);
+ file->elf = NULL;
+ close (file->fd);
+ file->fd = -1;
+ return DWFL_E_BADELF;
}
GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (file->elf, &ehdr_mem);
if (ehdr == NULL)
{
elf_error:
+ elf_end (file->elf);
+ file->elf = NULL;
close (file->fd);
file->fd = -1;
- return DWFL_E_LIBELF;
+ return DWFL_E (LIBELF, elf_errno ());
}
+ /* The addresses in an ET_EXEC file are absolute. The lowest p_vaddr of
+ the main file can differ from that of the debug file due to prelink.
+ But that doesn't not change addresses that symbols, debuginfo, or
+ sh_addr of any program sections refer to. */
file->bias = 0;
- for (uint_fast16_t i = 0; i < ehdr->e_phnum; ++i)
+ if (mod->e_type != ET_EXEC)
{
- GElf_Phdr ph_mem;
- GElf_Phdr *ph = gelf_getphdr (file->elf, i, &ph_mem);
- if (ph == NULL)
+ size_t phnum;
+ if (unlikely (elf_getphdrnum (file->elf, &phnum) != 0))
goto elf_error;
- if (ph->p_type == PT_LOAD)
+
+ for (size_t i = 0; i < phnum; ++i)
{
- file->bias = ((mod->low_addr & -ph->p_align)
- - (ph->p_vaddr & -ph->p_align));
- break;
+ GElf_Phdr ph_mem;
+ GElf_Phdr *ph = gelf_getphdr (file->elf, i, &ph_mem);
+ if (ph == NULL)
+ goto elf_error;
+ if (ph->p_type == PT_LOAD)
+ {
+ GElf_Addr align = mod->dwfl->segment_align;
+ if (align <= 1)
+ {
+ if ((mod->low_addr & (ph->p_align - 1)) == 0)
+ align = ph->p_align;
+ else
+ align = ((GElf_Addr) 1 << ffsll (mod->low_addr)) >> 1;
+ }
+
+ file->bias = ((mod->low_addr & -align) - (ph->p_vaddr & -align));
+ break;
+ }
}
}
@@ -102,8 +138,9 @@ open_elf (Dwfl_Module *mod, struct dwfl_file *file)
/* 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. */
-static void
-find_file (Dwfl_Module *mod)
+void
+internal_function
+__libdwfl_getelf (Dwfl_Module *mod)
{
if (mod->main.elf != NULL /* Already done. */
|| mod->elferr != DWFL_E_NOERROR) /* Cached failure. */
@@ -112,16 +149,55 @@ find_file (Dwfl_Module *mod)
mod->main.fd = (*mod->dwfl->callbacks->find_elf) (MODCB_ARGS (mod),
&mod->main.name,
&mod->main.elf);
+ const bool fallback = mod->main.elf == NULL && mod->main.fd < 0;
mod->elferr = open_elf (mod, &mod->main);
+ if (mod->elferr != DWFL_E_NOERROR)
+ return;
- if (mod->elferr == DWFL_E_NOERROR && !mod->main.valid)
+ if (!mod->main.valid)
{
/* Clear any explicitly reported build ID, just in case it was wrong.
We'll fetch it from the file when asked. */
- if (mod->build_id_len > 0)
- free (mod->build_id_bits);
+ free (mod->build_id_bits);
+ mod->build_id_bits = NULL;
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;
+ }
+ }
}
/* Search an ELF file for a ".gnu_debuglink" section. */
@@ -129,7 +205,7 @@ static const char *
find_debuglink (Elf *elf, GElf_Word *crc)
{
size_t shstrndx;
- if (elf_getshstrndx (elf, &shstrndx) < 0)
+ if (elf_getshdrstrndx (elf, &shstrndx) < 0)
return NULL;
Elf_Scn *scn = NULL;
@@ -213,6 +289,7 @@ load_symtab (struct dwfl_file *file, struct dwfl_file **symfile,
Elf_Scn **symscn, Elf_Scn **xndxscn,
size_t *syments, GElf_Word *strshndx)
{
+ bool symtab = false;
Elf_Scn *scn = NULL;
while ((scn = elf_nextscn (file->elf, scn)) != NULL)
{
@@ -221,6 +298,7 @@ load_symtab (struct dwfl_file *file, struct dwfl_file **symfile,
switch (shdr->sh_type)
{
case SHT_SYMTAB:
+ symtab = true;
*symscn = scn;
*symfile = file;
*strshndx = shdr->sh_link;
@@ -230,6 +308,8 @@ load_symtab (struct dwfl_file *file, struct dwfl_file **symfile,
break;
case SHT_DYNSYM:
+ if (symtab)
+ break;
/* Use this if need be, but keep looking for SHT_SYMTAB. */
*symscn = scn;
*symfile = file;
@@ -239,7 +319,7 @@ load_symtab (struct dwfl_file *file, struct dwfl_file **symfile,
case SHT_SYMTAB_SHNDX:
*xndxscn = scn;
- if (*symscn != NULL)
+ if (symtab)
return DWFL_E_NOERROR;
break;
@@ -248,7 +328,7 @@ load_symtab (struct dwfl_file *file, struct dwfl_file **symfile,
}
}
- if (*symscn != NULL)
+ if (symtab)
/* We found one, though no SHT_SYMTAB_SHNDX to go with it. */
return DWFL_E_NOERROR;
@@ -262,11 +342,11 @@ load_symtab (struct dwfl_file *file, struct dwfl_file **symfile,
/* Translate addresses into file offsets.
OFFS[*] start out zero and remain zero if unresolved. */
static void
-find_offsets (Elf *elf, const GElf_Ehdr *ehdr, size_t n,
+find_offsets (Elf *elf, size_t phnum, size_t n,
GElf_Addr addrs[n], GElf_Off offs[n])
{
size_t unsolved = n;
- for (uint_fast16_t i = 0; i < ehdr->e_phnum; ++i)
+ for (size_t i = 0; i < phnum; ++i)
{
GElf_Phdr phdr_mem;
GElf_Phdr *phdr = gelf_getphdr (elf, i, &phdr_mem);
@@ -290,7 +370,11 @@ find_dynsym (Dwfl_Module *mod)
GElf_Ehdr ehdr_mem;
GElf_Ehdr *ehdr = gelf_getehdr (mod->main.elf, &ehdr_mem);
- for (uint_fast16_t i = 0; i < ehdr->e_phnum; ++i)
+ size_t phnum;
+ if (unlikely (elf_getphdrnum (mod->main.elf, &phnum) != 0))
+ return;
+
+ for (size_t i = 0; i < phnum; ++i)
{
GElf_Phdr phdr_mem;
GElf_Phdr *phdr = gelf_getphdr (mod->main.elf, i, &phdr_mem);
@@ -357,7 +441,7 @@ find_dynsym (Dwfl_Module *mod)
/* Translate pointers into file offsets. */
GElf_Off offs[i_max] = { 0, };
- find_offsets (mod->main.elf, ehdr, i_max, addrs, offs);
+ find_offsets (mod->main.elf, phnum, i_max, addrs, offs);
/* Figure out the size of the symbol table. */
if (offs[i_hash] != 0)
@@ -474,7 +558,7 @@ find_symtab (Dwfl_Module *mod)
|| mod->symerr != DWFL_E_NOERROR) /* Cached previous failure. */
return;
- find_file (mod);
+ __libdwfl_getelf (mod);
mod->symerr = mod->elferr;
if (mod->symerr != DWFL_E_NOERROR)
return;
@@ -570,7 +654,7 @@ __libdwfl_module_getebl (Dwfl_Module *mod)
{
if (mod->ebl == NULL)
{
- find_file (mod);
+ __libdwfl_getelf (mod);
if (mod->elferr != DWFL_E_NOERROR)
return mod->elferr;
@@ -585,7 +669,7 @@ __libdwfl_module_getebl (Dwfl_Module *mod)
static Dwfl_Error
load_dw (Dwfl_Module *mod, struct dwfl_file *debugfile)
{
- if (mod->e_type == ET_REL)
+ if (mod->e_type == ET_REL && !debugfile->relocated)
{
const Dwfl_Callbacks *const cb = mod->dwfl->callbacks;
@@ -638,7 +722,7 @@ find_dw (Dwfl_Module *mod)
|| mod->dwerr != DWFL_E_NOERROR) /* Cached previous failure. */
return;
- find_file (mod);
+ __libdwfl_getelf (mod);
mod->dwerr = mod->elferr;
if (mod->dwerr != DWFL_E_NOERROR)
return;
@@ -679,46 +763,6 @@ find_dw (Dwfl_Module *mod)
mod->dwerr = __libdwfl_canon_error (mod->dwerr);
}
-
-Elf *
-dwfl_module_getelf (Dwfl_Module *mod, GElf_Addr *loadbase)
-{
- if (mod == NULL)
- return NULL;
-
- find_file (mod);
- if (mod->elferr == DWFL_E_NOERROR)
- {
- if (mod->e_type == ET_REL && ! mod->main.relocated)
- {
- /* Before letting them get at the Elf handle,
- apply all the relocations we know how to. */
-
- mod->main.relocated = true;
- if (likely (__libdwfl_module_getebl (mod) == DWFL_E_NOERROR))
- {
- (void) __libdwfl_relocate (mod, mod->main.elf, false);
-
- if (mod->debug.elf == mod->main.elf)
- mod->debug.relocated = true;
- else if (mod->debug.elf != NULL && ! mod->debug.relocated)
- {
- mod->debug.relocated = true;
- (void) __libdwfl_relocate (mod, mod->debug.elf, false);
- }
- }
- }
-
- *loadbase = mod->main.bias;
- return mod->main.elf;
- }
-
- __libdwfl_seterrno (mod->elferr);
- return NULL;
-}
-INTDEF (dwfl_module_getelf)
-
-
Dwarf *
dwfl_module_getdwarf (Dwfl_Module *mod, Dwarf_Addr *bias)
{
diff --git a/libdwfl/dwfl_module_getelf.c b/libdwfl/dwfl_module_getelf.c
new file mode 100644
index 00000000..6414a9d3
--- /dev/null
+++ b/libdwfl/dwfl_module_getelf.c
@@ -0,0 +1,88 @@
+/* Find debugging and symbol information for a module in libdwfl.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#include "libdwflP.h"
+
+Elf *
+dwfl_module_getelf (Dwfl_Module *mod, GElf_Addr *loadbase)
+{
+ if (mod == NULL)
+ return NULL;
+
+ __libdwfl_getelf (mod);
+ if (mod->elferr == DWFL_E_NOERROR)
+ {
+ if (mod->e_type == ET_REL && ! mod->main.relocated)
+ {
+ /* Before letting them get at the Elf handle,
+ apply all the relocations we know how to. */
+
+ mod->main.relocated = true;
+ if (likely (__libdwfl_module_getebl (mod) == DWFL_E_NOERROR))
+ {
+ (void) __libdwfl_relocate (mod, mod->main.elf, false);
+
+ if (mod->debug.elf == mod->main.elf)
+ mod->debug.relocated = true;
+ else if (mod->debug.elf != NULL && ! mod->debug.relocated)
+ {
+ mod->debug.relocated = true;
+ (void) __libdwfl_relocate (mod, mod->debug.elf, false);
+ }
+ }
+ }
+
+ *loadbase = mod->main.bias;
+ return mod->main.elf;
+ }
+
+ __libdwfl_seterrno (mod->elferr);
+ return NULL;
+}
+INTDEF (dwfl_module_getelf)
diff --git a/libdwfl/dwfl_module_getsrc.c b/libdwfl/dwfl_module_getsrc.c
index 84c7eaaf..be03055e 100644
--- a/libdwfl/dwfl_module_getsrc.c
+++ b/libdwfl/dwfl_module_getsrc.c
@@ -1,5 +1,5 @@
/* Find source location for PC address in module.
- Copyright (C) 2005 Red Hat, Inc.
+ Copyright (C) 2005, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -63,6 +63,9 @@ dwfl_module_getsrc (Dwfl_Module *mod, Dwarf_Addr addr)
error = __libdwfl_cu_getsrclines (cu);
if (likely (error == DWFL_E_NOERROR))
{
+ /* Now we look at the module-relative address. */
+ addr -= bias;
+
/* The lines are sorted by address, so we can use binary search. */
size_t l = 0, u = cu->die.cu->lines->nlines;
while (l < u)
diff --git a/libdwfl/dwfl_module_getsym.c b/libdwfl/dwfl_module_getsym.c
index 5f289ccb..f78e6ec0 100644
--- a/libdwfl/dwfl_module_getsym.c
+++ b/libdwfl/dwfl_module_getsym.c
@@ -1,5 +1,5 @@
/* Find debugging and symbol information for a module in libdwfl.
- Copyright (C) 2006,2007 Red Hat, Inc.
+ Copyright (C) 2006,2007,2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -74,12 +74,25 @@ dwfl_module_getsym (Dwfl_Module *mod, int ndx,
if (sym->st_shndx != SHN_XINDEX)
shndx = sym->st_shndx;
+ /* Figure out whether this symbol points into an SHF_ALLOC section. */
+ bool alloc = true;
+ if ((shndxp != NULL || mod->e_type != ET_REL)
+ && (sym->st_shndx == SHN_XINDEX
+ || (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);
+ alloc = unlikely (shdr == NULL) || (shdr->sh_flags & SHF_ALLOC);
+ }
+
if (shndxp != NULL)
- *shndxp = shndx;
+ /* Yield -1 in case of a non-SHF_ALLOC section. */
+ *shndxp = alloc ? shndx : (GElf_Word) -1;
- switch (shndx)
+ switch (sym->st_shndx)
{
- case SHN_ABS:
+ case SHN_ABS: /* XXX sometimes should use bias?? */
case SHN_UNDEF:
case SHN_COMMON:
break;
@@ -99,8 +112,9 @@ dwfl_module_getsym (Dwfl_Module *mod, int ndx,
return NULL;
}
}
- /* Apply the bias to the symbol value. */
- sym->st_value += mod->symfile->bias;
+ else if (alloc)
+ /* Apply the bias to the symbol value. */
+ sym->st_value += mod->symfile->bias;
break;
}
diff --git a/libdwfl/dwfl_module_report_build_id.c b/libdwfl/dwfl_module_report_build_id.c
index 4886931b..9a1b14f7 100644
--- a/libdwfl/dwfl_module_report_build_id.c
+++ b/libdwfl/dwfl_module_report_build_id.c
@@ -1,5 +1,5 @@
/* Report build ID information for a module.
- Copyright (C) 2007 Red Hat, Inc.
+ Copyright (C) 2007, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -90,8 +90,7 @@ dwfl_module_report_build_id (Dwfl_Module *mod,
memcpy (copy, bits, len);
}
- if (mod->build_id_len > 0)
- free (mod->build_id_bits);
+ free (mod->build_id_bits);
mod->build_id_bits = copy;
mod->build_id_len = len;
diff --git a/libdwfl/dwfl_report_elf.c b/libdwfl/dwfl_report_elf.c
index 0e5d09bc..062a647f 100644
--- a/libdwfl/dwfl_report_elf.c
+++ b/libdwfl/dwfl_report_elf.c
@@ -1,5 +1,5 @@
/* Report a module to libdwfl based on ELF program headers.
- Copyright (C) 2005, 2007 Red Hat, Inc.
+ Copyright (C) 2005-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -62,7 +62,7 @@
Dwfl_Module *
internal_function
__libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
- int fd, Elf *elf, GElf_Addr base)
+ int fd, Elf *elf, GElf_Addr base, bool sanity)
{
GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (elf, &ehdr_mem);
if (ehdr == NULL)
@@ -187,8 +187,11 @@ __libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
base = 0;
case ET_DYN:
- default:
- for (uint_fast16_t i = 0; i < ehdr->e_phnum; ++i)
+ default:;
+ size_t phnum;
+ if (unlikely (elf_getphdrnum (elf, &phnum) != 0))
+ goto elf_error;
+ for (size_t i = 0; i < phnum; ++i)
{
GElf_Phdr phdr_mem, *ph = gelf_getphdr (elf, i, &phdr_mem);
if (unlikely (ph == NULL))
@@ -203,19 +206,20 @@ __libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
}
bias = base;
- for (uint_fast16_t i = ehdr->e_phnum; i-- > 0;)
+ for (size_t i = phnum; i-- > 0;)
{
GElf_Phdr phdr_mem, *ph = gelf_getphdr (elf, i, &phdr_mem);
if (unlikely (ph == NULL))
goto elf_error;
- if (ph->p_type == PT_LOAD)
+ if (ph->p_type == PT_LOAD
+ && ph->p_vaddr + ph->p_memsz > 0)
{
end = base + (ph->p_vaddr + ph->p_memsz);
break;
}
}
- if (end == 0)
+ if (end == 0 && sanity)
{
__libdwfl_seterrno (DWFL_E_NO_PHDR);
return NULL;
@@ -234,11 +238,10 @@ __libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
else if ((fd >= 0 && m->main.fd != fd)
|| strcmp (m->main.name, file_name))
{
- elf_end (elf);
overlap:
m->gc = true;
__libdwfl_seterrno (DWFL_E_OVERLAP);
- m = NULL;
+ return NULL;
}
/* Preinstall the open ELF handle for the module. */
@@ -274,9 +277,16 @@ dwfl_report_elf (Dwfl *dwfl, const char *name,
}
}
- Elf *elf = elf_begin (fd, ELF_C_READ_MMAP_PRIVATE, NULL);
+ Elf *elf;
+ Dwfl_Error error = __libdw_open_file (&fd, &elf, closefd, false);
+ if (error != DWFL_E_NOERROR)
+ {
+ __libdwfl_seterrno (error);
+ return NULL;
+ }
+
Dwfl_Module *mod = __libdwfl_report_elf (dwfl, name, file_name,
- fd, elf, base);
+ fd, elf, base, true);
if (mod == NULL)
{
elf_end (elf);
diff --git a/libdwfl/dwfl_segment_report_module.c b/libdwfl/dwfl_segment_report_module.c
new file mode 100644
index 00000000..3f77cfc7
--- /dev/null
+++ b/libdwfl/dwfl_segment_report_module.c
@@ -0,0 +1,669 @@
+/* Sniff out modules from ELF headers visible in memory segments.
+ Copyright (C) 2008-2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#include <config.h>
+#include "../libelf/libelfP.h" /* For NOTE_ALIGN. */
+#undef _
+#include "libdwflP.h"
+
+#include <elf.h>
+#include <gelf.h>
+#include <inttypes.h>
+#include <sys/param.h>
+#include <alloca.h>
+#include <endian.h>
+
+
+/* A good size for the initial read from memory, if it's not too costly.
+ This more than covers the phdrs and note segment in the average 64-bit
+ binary. */
+
+#define INITIAL_READ 1024
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+# define MY_ELFDATA ELFDATA2LSB
+#else
+# define MY_ELFDATA ELFDATA2MSB
+#endif
+
+
+/* Return user segment index closest to ADDR but not above it.
+ If NEXT, return the closest to ADDR but not below it. */
+static int
+addr_segndx (Dwfl *dwfl, size_t segment, GElf_Addr addr, bool next)
+{
+ int ndx = -1;
+ do
+ {
+ if (dwfl->lookup_segndx[segment] >= 0)
+ ndx = dwfl->lookup_segndx[segment];
+ if (++segment >= dwfl->lookup_elts - 1)
+ return next ? ndx + 1 : ndx;
+ }
+ while (dwfl->lookup_addr[segment] < addr);
+
+ if (next)
+ {
+ while (dwfl->lookup_segndx[segment] < 0)
+ if (++segment >= dwfl->lookup_elts - 1)
+ return ndx + 1;
+ ndx = dwfl->lookup_segndx[segment];
+ }
+
+ return ndx;
+}
+
+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)
+{
+ size_t segment = ndx;
+
+ if (segment >= dwfl->lookup_elts)
+ segment = dwfl->lookup_elts - 1;
+
+ while (segment > 0
+ && (dwfl->lookup_segndx[segment] > ndx
+ || dwfl->lookup_segndx[segment] == -1))
+ --segment;
+
+ while (dwfl->lookup_segndx[segment] < ndx)
+ if (++segment == dwfl->lookup_elts)
+ return 0;
+
+ GElf_Addr start = dwfl->lookup_addr[segment];
+
+ inline bool segment_read (int segndx,
+ void **buffer, size_t *buffer_available,
+ GElf_Addr addr, size_t minread)
+ {
+ return ! (*memory_callback) (dwfl, segndx, buffer, buffer_available,
+ addr, minread, memory_callback_arg);
+ }
+
+ inline void release_buffer (void **buffer, size_t *buffer_available)
+ {
+ if (*buffer != NULL)
+ (void) segment_read (-1, buffer, buffer_available, 0, 0);
+ }
+
+ /* First read in the file header and check its sanity. */
+
+ void *buffer = NULL;
+ size_t buffer_available = INITIAL_READ;
+
+ inline int finish (void)
+ {
+ release_buffer (&buffer, &buffer_available);
+ return ndx;
+ }
+
+ if (segment_read (ndx, &buffer, &buffer_available,
+ start, sizeof (Elf64_Ehdr))
+ || memcmp (buffer, ELFMAG, SELFMAG) != 0)
+ return finish ();
+
+ inline bool read_portion (void **data, size_t *data_size,
+ GElf_Addr vaddr, size_t filesz)
+ {
+ if (vaddr - start + filesz > buffer_available)
+ {
+ *data = NULL;
+ *data_size = filesz;
+ return segment_read (addr_segndx (dwfl, segment, vaddr, false),
+ data, data_size, vaddr, filesz);
+ }
+
+ /* We already have this whole note segment from our initial read. */
+ *data = vaddr - start + buffer;
+ *data_size = 0;
+ return false;
+ }
+
+ inline void finish_portion (void **data, size_t *data_size)
+ {
+ if (*data_size != 0)
+ release_buffer (data, data_size);
+ }
+
+ /* Extract the information we need from the file header. */
+ union
+ {
+ Elf32_Ehdr e32;
+ Elf64_Ehdr e64;
+ } ehdr;
+ GElf_Off phoff;
+ uint_fast16_t phnum;
+ uint_fast16_t phentsize;
+ GElf_Off shdrs_end;
+ Elf_Data xlatefrom =
+ {
+ .d_type = ELF_T_EHDR,
+ .d_buf = (void *) buffer,
+ .d_version = EV_CURRENT,
+ };
+ Elf_Data xlateto =
+ {
+ .d_type = ELF_T_EHDR,
+ .d_buf = &ehdr,
+ .d_size = sizeof ehdr,
+ .d_version = EV_CURRENT,
+ };
+ switch (((const unsigned char *) buffer)[EI_CLASS])
+ {
+ case ELFCLASS32:
+ xlatefrom.d_size = sizeof (Elf32_Ehdr);
+ if (elf32_xlatetom (&xlateto, &xlatefrom,
+ ((const unsigned char *) buffer)[EI_DATA]) == NULL)
+ return finish ();
+ phoff = ehdr.e32.e_phoff;
+ phnum = ehdr.e32.e_phnum;
+ phentsize = ehdr.e32.e_phentsize;
+ if (phentsize != sizeof (Elf32_Phdr))
+ return finish ();
+ shdrs_end = ehdr.e32.e_shoff + ehdr.e32.e_shnum * ehdr.e32.e_shentsize;
+ break;
+
+ case ELFCLASS64:
+ xlatefrom.d_size = sizeof (Elf64_Ehdr);
+ if (elf64_xlatetom (&xlateto, &xlatefrom,
+ ((const unsigned char *) buffer)[EI_DATA]) == NULL)
+ return finish ();
+ phoff = ehdr.e64.e_phoff;
+ phnum = ehdr.e64.e_phnum;
+ phentsize = ehdr.e64.e_phentsize;
+ if (phentsize != sizeof (Elf64_Phdr))
+ return finish ();
+ shdrs_end = ehdr.e64.e_shoff + ehdr.e64.e_shnum * ehdr.e64.e_shentsize;
+ break;
+
+ default:
+ return finish ();
+ }
+
+ /* The file header tells where to find the program headers.
+ These are what we need to find the boundaries of the module.
+ Without them, we don't have a module to report. */
+
+ if (phnum == 0)
+ return finish ();
+
+ xlatefrom.d_type = xlateto.d_type = ELF_T_PHDR;
+ xlatefrom.d_size = phnum * phentsize;
+
+ void *ph_buffer = NULL;
+ size_t ph_buffer_size = 0;
+ if (read_portion (&ph_buffer, &ph_buffer_size,
+ start + phoff, xlatefrom.d_size))
+ return finish ();
+
+ xlatefrom.d_buf = ph_buffer;
+
+ union
+ {
+ Elf32_Phdr p32[phnum];
+ Elf64_Phdr p64[phnum];
+ } phdrs;
+
+ xlateto.d_buf = &phdrs;
+ xlateto.d_size = sizeof phdrs;
+
+ /* Track the bounds of the file visible in memory. */
+ GElf_Off file_trimmed_end = 0; /* Proper p_vaddr + p_filesz end. */
+ GElf_Off file_end = 0; /* Rounded up to effective page size. */
+ GElf_Off contiguous = 0; /* Visible as contiguous file from START. */
+ GElf_Off total_filesz = 0; /* Total size of data to read. */
+
+ /* Collect the bias between START and the containing PT_LOAD's p_vaddr. */
+ GElf_Addr bias = 0;
+ bool found_bias = false;
+
+ /* Collect the unbiased bounds of the module here. */
+ GElf_Addr module_start = -1l;
+ GElf_Addr module_end = 0;
+
+ /* If we see PT_DYNAMIC, record it here. */
+ GElf_Addr dyn_vaddr = 0;
+ GElf_Xword dyn_filesz = 0;
+
+ /* Collect the build ID bits here. */
+ void *build_id = NULL;
+ size_t build_id_len = 0;
+ GElf_Addr build_id_vaddr = 0;
+
+ /* Consider a PT_NOTE we've found in the image. */
+ inline void consider_notes (GElf_Addr vaddr, GElf_Xword filesz)
+ {
+ /* If we have already seen a build ID, we don't care any more. */
+ if (build_id != NULL || filesz == 0)
+ return;
+
+ void *data;
+ size_t data_size;
+ if (read_portion (&data, &data_size, vaddr, filesz))
+ return;
+
+ assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr));
+
+ void *notes;
+ if (ehdr.e32.e_ident[EI_DATA] == MY_ELFDATA)
+ notes = data;
+ else
+ {
+ notes = malloc (filesz);
+ if (unlikely (notes == NULL))
+ return;
+ xlatefrom.d_type = xlateto.d_type = ELF_T_NHDR;
+ xlatefrom.d_buf = (void *) data;
+ xlatefrom.d_size = filesz;
+ xlateto.d_buf = notes;
+ xlateto.d_size = filesz;
+ if (elf32_xlatetom (&xlateto, &xlatefrom,
+ ehdr.e32.e_ident[EI_DATA]) == NULL)
+ goto done;
+ }
+
+ const GElf_Nhdr *nh = notes;
+ while ((const void *) nh < (const void *) notes + filesz)
+ {
+ const void *note_name = nh + 1;
+ const void *note_desc = note_name + NOTE_ALIGN (nh->n_namesz);
+ if (unlikely ((size_t) ((const void *) notes + filesz
+ - note_desc) < nh->n_descsz))
+ break;
+
+ if (nh->n_type == NT_GNU_BUILD_ID
+ && nh->n_descsz > 0
+ && nh->n_namesz == sizeof "GNU"
+ && !memcmp (note_name, "GNU", sizeof "GNU"))
+ {
+ build_id_vaddr = note_desc - (const void *) notes + vaddr;
+ build_id_len = nh->n_descsz;
+ build_id = malloc (nh->n_descsz);
+ if (likely (build_id != NULL))
+ memcpy (build_id, note_desc, build_id_len);
+ break;
+ }
+
+ nh = note_desc + NOTE_ALIGN (nh->n_descsz);
+ }
+
+ done:
+ if (notes != data)
+ free (notes);
+ finish_portion (&data, &data_size);
+ }
+
+ /* Consider each of the program headers we've read from the image. */
+ inline void consider_phdr (GElf_Word type,
+ GElf_Addr vaddr, GElf_Xword memsz,
+ GElf_Off offset, GElf_Xword filesz,
+ GElf_Xword align)
+ {
+ switch (type)
+ {
+ case PT_DYNAMIC:
+ dyn_vaddr = vaddr;
+ dyn_filesz = filesz;
+ break;
+
+ case PT_NOTE:
+ /* We calculate from the p_offset of the note segment,
+ because we don't yet know the bias for its p_vaddr. */
+ consider_notes (start + offset, filesz);
+ break;
+
+ case PT_LOAD:
+ align = dwfl->segment_align > 1 ? dwfl->segment_align : align ?: 1;
+
+ GElf_Addr vaddr_end = (vaddr + memsz + align - 1) & -align;
+ GElf_Addr filesz_vaddr = filesz < memsz ? vaddr + filesz : vaddr_end;
+ GElf_Off filesz_offset = filesz_vaddr - vaddr + offset;
+
+ if (file_trimmed_end < offset + filesz)
+ {
+ file_trimmed_end = offset + filesz;
+
+ /* 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. */
+ if (shdrs_end <= filesz_offset && shdrs_end > file_trimmed_end)
+ {
+ filesz += shdrs_end - file_trimmed_end;
+ file_trimmed_end = shdrs_end;
+ }
+ }
+
+ total_filesz += filesz;
+
+ if (file_end < filesz_offset)
+ {
+ file_end = filesz_offset;
+ if (filesz_vaddr - start == filesz_offset)
+ contiguous = file_end;
+ }
+
+ if (!found_bias && (offset & -align) == 0
+ && likely (filesz_offset >= phoff + phnum * phentsize))
+ {
+ bias = start - vaddr;
+ found_bias = true;
+ }
+
+ vaddr &= -align;
+ if (vaddr < module_start)
+ module_start = vaddr;
+
+ if (module_end < vaddr_end)
+ module_end = vaddr_end;
+ break;
+ }
+ }
+ if (ehdr.e32.e_ident[EI_CLASS] == ELFCLASS32)
+ {
+ if (elf32_xlatetom (&xlateto, &xlatefrom,
+ ehdr.e32.e_ident[EI_DATA]) == NULL)
+ found_bias = false; /* Trigger error check. */
+ else
+ for (uint_fast16_t i = 0; i < phnum; ++i)
+ consider_phdr (phdrs.p32[i].p_type,
+ phdrs.p32[i].p_vaddr, phdrs.p32[i].p_memsz,
+ phdrs.p32[i].p_offset, phdrs.p32[i].p_filesz,
+ phdrs.p32[i].p_align);
+ }
+ else
+ {
+ if (elf64_xlatetom (&xlateto, &xlatefrom,
+ ehdr.e32.e_ident[EI_DATA]) == NULL)
+ found_bias = false; /* Trigger error check. */
+ else
+ for (uint_fast16_t i = 0; i < phnum; ++i)
+ consider_phdr (phdrs.p64[i].p_type,
+ phdrs.p64[i].p_vaddr, phdrs.p64[i].p_memsz,
+ phdrs.p64[i].p_offset, phdrs.p64[i].p_filesz,
+ phdrs.p64[i].p_align);
+ }
+
+ finish_portion (&ph_buffer, &ph_buffer_size);
+
+ /* 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 ();
+
+ /* Now we know enough to report a module for sure: its bounds. */
+ module_start += bias;
+ module_end += bias;
+
+ dyn_vaddr += bias;
+
+ /* Our return value now says to skip the segments contained
+ within the module. */
+ ndx = addr_segndx (dwfl, segment, module_end, true);
+
+ /* Examine its .dynamic section to get more interesting details.
+ If it has DT_SONAME, we'll use that as the module name.
+ If it has a DT_DEBUG, then it's actually a PIE rather than a DSO.
+ We need its DT_STRTAB and DT_STRSZ to decipher DT_SONAME,
+ and they also tell us the essential portion of the file
+ for fetching symbols. */
+ GElf_Addr soname_stroff = 0;
+ GElf_Addr dynstr_vaddr = 0;
+ GElf_Xword dynstrsz = 0;
+ bool execlike = false;
+ inline bool consider_dyn (GElf_Sxword tag, GElf_Xword val)
+ {
+ switch (tag)
+ {
+ default:
+ return false;
+
+ case DT_DEBUG:
+ execlike = true;
+ break;
+
+ case DT_SONAME:
+ soname_stroff = val;
+ break;
+
+ case DT_STRTAB:
+ dynstr_vaddr = val;
+ break;
+
+ case DT_STRSZ:
+ dynstrsz = val;
+ break;
+ }
+
+ return soname_stroff != 0 && dynstr_vaddr != 0 && dynstrsz != 0;
+ }
+
+ const size_t dyn_entsize = (ehdr.e32.e_ident[EI_CLASS] == ELFCLASS32
+ ? sizeof (Elf32_Dyn) : sizeof (Elf64_Dyn));
+ void *dyn_data = NULL;
+ size_t dyn_data_size = 0;
+ if (dyn_filesz != 0 && dyn_filesz % dyn_entsize == 0
+ && ! read_portion (&dyn_data, &dyn_data_size, dyn_vaddr, dyn_filesz))
+ {
+ union
+ {
+ Elf32_Dyn d32[dyn_filesz / sizeof (Elf32_Dyn)];
+ Elf64_Dyn d64[dyn_filesz / sizeof (Elf64_Dyn)];
+ } dyn;
+
+ xlatefrom.d_type = xlateto.d_type = ELF_T_DYN;
+ xlatefrom.d_buf = (void *) dyn_data;
+ xlatefrom.d_size = dyn_filesz;
+ xlateto.d_buf = &dyn;
+ xlateto.d_size = sizeof dyn;
+
+ if (ehdr.e32.e_ident[EI_CLASS] == ELFCLASS32)
+ {
+ if (elf32_xlatetom (&xlateto, &xlatefrom,
+ ehdr.e32.e_ident[EI_DATA]) != NULL)
+ for (size_t i = 0; i < dyn_filesz / sizeof dyn.d32[0]; ++i)
+ if (consider_dyn (dyn.d32[i].d_tag, dyn.d32[i].d_un.d_val))
+ break;
+ }
+ else
+ {
+ if (elf64_xlatetom (&xlateto, &xlatefrom,
+ ehdr.e32.e_ident[EI_DATA]) != NULL)
+ for (size_t i = 0; i < dyn_filesz / sizeof dyn.d64[0]; ++i)
+ if (consider_dyn (dyn.d64[i].d_tag, dyn.d64[i].d_un.d_val))
+ break;
+ }
+ }
+ finish_portion (&dyn_data, &dyn_data_size);
+
+ /* We'll use the name passed in or a stupid default if not DT_SONAME. */
+ if (name == NULL)
+ name = ehdr.e32.e_type == ET_EXEC ? "[exe]" : execlike ? "[pie]" : "[dso]";
+
+ void *soname = NULL;
+ size_t soname_size = 0;
+ if (dynstrsz != 0 && dynstr_vaddr != 0)
+ {
+ /* We know the bounds of the .dynstr section.
+
+ The DYNSTR_VADDR pointer comes from the .dynamic section
+ (DT_STRTAB, detected above). Ordinarily the dynamic linker
+ will have adjusted this pointer in place so it's now an
+ absolute address. But sometimes .dynamic is read-only (in
+ vDSOs and odd architectures), and sometimes the adjustment
+ just hasn't happened yet in the memory image we looked at.
+ So treat DYNSTR_VADDR as an absolute address if it falls
+ within the module bounds, or try applying the phdr bias
+ when that adjusts it to fall within the module bounds. */
+
+ if ((dynstr_vaddr < module_start || dynstr_vaddr >= module_end)
+ && dynstr_vaddr + bias >= module_start
+ && dynstr_vaddr + bias < module_end)
+ dynstr_vaddr += bias;
+
+ if (unlikely (dynstr_vaddr + dynstrsz > module_end))
+ dynstrsz = 0;
+
+ /* Try to get the DT_SONAME string. */
+ if (soname_stroff != 0 && soname_stroff + 1 < dynstrsz
+ && ! read_portion (&soname, &soname_size,
+ dynstr_vaddr + soname_stroff, 0))
+ name = soname;
+ }
+
+ /* Now that we have chosen the module's name and bounds, report it.
+ If we found a build ID, report that too. */
+
+ Dwfl_Module *mod = INTUSE(dwfl_report_module) (dwfl, name,
+ module_start, module_end);
+ if (likely (mod != NULL) && build_id != NULL
+ && unlikely (INTUSE(dwfl_module_report_build_id) (mod,
+ build_id,
+ build_id_len,
+ build_id_vaddr)))
+ {
+ mod->gc = true;
+ mod = NULL;
+ }
+
+ /* At this point we do not need BUILD_ID or NAME any more.
+ They have been copied. */
+ free (build_id);
+ finish_portion (&soname, &soname_size);
+
+ if (unlikely (mod == NULL))
+ {
+ ndx = -1;
+ return finish ();
+ }
+
+ /* We have reported the module. Now let the caller decide whether we
+ should read the whole thing in right now. */
+
+ const GElf_Off cost = (contiguous < file_trimmed_end ? total_filesz
+ : buffer_available >= contiguous ? 0
+ : contiguous - buffer_available);
+ const GElf_Off worthwhile = ((dynstr_vaddr == 0 || dynstrsz == 0) ? 0
+ : dynstr_vaddr + dynstrsz - start);
+ const GElf_Off whole = MAX (file_trimmed_end, shdrs_end);
+
+ Elf *elf = NULL;
+ if ((*read_eagerly) (MODCB_ARGS (mod), &buffer, &buffer_available,
+ cost, worthwhile, whole, contiguous,
+ read_eagerly_arg, &elf)
+ && elf == NULL)
+ {
+ /* The caller wants to read the whole file in right now, but hasn't
+ done it for us. Fill in a local image of the virtual file. */
+
+ void *contents = calloc (1, file_trimmed_end);
+ if (unlikely (contents == NULL))
+ return finish ();
+
+ inline void final_read (size_t offset, GElf_Addr vaddr, size_t size)
+ {
+ void *into = contents + offset;
+ size_t read_size = size;
+ (void) segment_read (addr_segndx (dwfl, segment, vaddr, false),
+ &into, &read_size, vaddr, size);
+ }
+
+ if (contiguous < file_trimmed_end)
+ {
+ /* We can't use the memory image verbatim as the file image.
+ So we'll be reading into a local image of the virtual file. */
+
+ inline void read_phdr (GElf_Word type, GElf_Addr vaddr,
+ GElf_Off offset, GElf_Xword filesz)
+ {
+ if (type == PT_LOAD)
+ final_read (offset, vaddr + bias, filesz);
+ }
+
+ if (ehdr.e32.e_ident[EI_CLASS] == ELFCLASS32)
+ for (uint_fast16_t i = 0; i < phnum; ++i)
+ read_phdr (phdrs.p32[i].p_type, phdrs.p32[i].p_vaddr,
+ phdrs.p32[i].p_offset, phdrs.p32[i].p_filesz);
+ else
+ for (uint_fast16_t i = 0; i < phnum; ++i)
+ read_phdr (phdrs.p64[i].p_type, phdrs.p64[i].p_vaddr,
+ phdrs.p64[i].p_offset, phdrs.p64[i].p_filesz);
+ }
+ else
+ {
+ /* The whole file sits contiguous in memory,
+ but the caller didn't want to just do it. */
+
+ const size_t have = MIN (buffer_available, file_trimmed_end);
+ memcpy (contents, buffer, have);
+
+ if (have < file_trimmed_end)
+ final_read (have, start + have, file_trimmed_end - have);
+ }
+
+ elf = elf_memory (contents, file_trimmed_end);
+ if (unlikely (elf == NULL))
+ free (contents);
+ else
+ elf->flags |= ELF_F_MALLOCED;
+ }
+
+ if (elf != NULL)
+ {
+ /* Install the file in the module. */
+ mod->main.elf = elf;
+ mod->main.bias = bias;
+ }
+
+ return finish ();
+}
diff --git a/libdwfl/find-debuginfo.c b/libdwfl/find-debuginfo.c
index f1ff3a4b..8fdaeb39 100644
--- a/libdwfl/find-debuginfo.c
+++ b/libdwfl/find-debuginfo.c
@@ -1,5 +1,5 @@
/* Standard find_debuginfo callback for libdwfl.
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -99,16 +99,22 @@ validate (Dwfl_Module *mod, int fd, bool check, GElf_Word debuglink_crc)
/* 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. */
- mod->debug.elf = elf_begin (fd, ELF_C_READ_MMAP_PRIVATE, NULL);
- if (likely (__libdwfl_find_build_id (mod, false, mod->debug.elf) == 2))
- /* Also backdoor the gratuitous flag. */
- mod->debug.valid = true;
+
+ mod->debug.valid = false;
+ Dwfl_Error error = __libdw_open_file (&fd, &mod->debug.elf, false, false);
+ if (error != DWFL_E_NOERROR)
+ __libdwfl_seterrno (error);
+ else if (likely (__libdwfl_find_build_id (mod, false,
+ mod->debug.elf) == 2))
+ /* Also backdoor the gratuitous flag. */
+ mod->debug.valid = true;
else
{
/* A mismatch! */
elf_end (mod->debug.elf);
mod->debug.elf = NULL;
- mod->debug.valid = false;
+ close (fd);
+ fd = -1;
}
return mod->debug.valid;
@@ -192,7 +198,7 @@ find_debuginfo_in_path (Dwfl_Module *mod, const char *file_name,
break;
}
- char *fname;
+ char *fname = NULL;
int fd = try_open (dir, subdir, debuglink_file, &fname);
if (fd < 0)
switch (errno)
@@ -242,7 +248,23 @@ dwfl_standard_find_debuginfo (Dwfl_Module *mod,
}
/* Failing that, search the path by name. */
- return find_debuginfo_in_path (mod, file_name, debuglink_file, debuglink_crc,
- debuginfo_file_name);
+ int fd = find_debuginfo_in_path (mod, file_name,
+ debuglink_file, debuglink_crc,
+ debuginfo_file_name);
+
+ if (fd < 0 && errno == 0)
+ {
+ /* If FILE_NAME is a symlink, the debug file might be associated
+ with the symlink target name instead. */
+
+ char *canon = canonicalize_file_name (file_name);
+ if (canon != NULL && strcmp (file_name, canon))
+ fd = find_debuginfo_in_path (mod, canon,
+ debuglink_file, debuglink_crc,
+ debuginfo_file_name);
+ free (canon);
+ }
+
+ return fd;
}
INTDEF (dwfl_standard_find_debuginfo)
diff --git a/libdwfl/gzip.c b/libdwfl/gzip.c
new file mode 100644
index 00000000..5604d490
--- /dev/null
+++ b/libdwfl/gzip.c
@@ -0,0 +1,316 @@
+/* Decompression support for libdwfl: zlib (gzip) and/or bzlib (bzip2).
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#include "libdwflP.h"
+#include "system.h"
+
+#include <unistd.h>
+
+#ifdef LZMA
+# define USE_INFLATE 1
+# include <lzma.h>
+# define unzip __libdw_unlzma
+# define DWFL_E_ZLIB DWFL_E_LZMA
+# define MAGIC "\xFD" "7zXZ\0" /* XZ file format. */
+# define MAGIC2 "\x5d\0" /* Raw LZMA format. */
+# define Z(what) LZMA_##what
+# define LZMA_ERRNO LZMA_PROG_ERROR
+# define z_stream lzma_stream
+# define inflateInit(z) lzma_auto_decoder (z, 1 << 30, 0)
+# define do_inflate(z) lzma_code (z, LZMA_RUN)
+# define inflateEnd(z) lzma_end (z)
+#elif defined BZLIB
+# define USE_INFLATE 1
+# include <bzlib.h>
+# define unzip __libdw_bunzip2
+# define DWFL_E_ZLIB DWFL_E_BZLIB
+# define MAGIC "BZh"
+# define Z(what) BZ_##what
+# define BZ_ERRNO BZ_IO_ERROR
+# define z_stream bz_stream
+# define inflateInit(z) BZ2_bzDecompressInit (z, 0, 0)
+# define do_inflate(z) BZ2_bzDecompress (z)
+# define inflateEnd(z) BZ2_bzDecompressEnd (z)
+#else
+# define USE_INFLATE 0
+# define crc32 loser_crc32
+# include <zlib.h>
+# define unzip __libdw_gunzip
+# define MAGIC "\037\213"
+# define Z(what) Z_##what
+#endif
+
+#define READ_SIZE (1 << 20)
+
+/* If this is not a compressed image, return DWFL_E_BADELF.
+ If we uncompressed it into *WHOLE, *WHOLE_SIZE, return DWFL_E_NOERROR.
+ Otherwise return an error for bad compressed data or I/O failure.
+ If we return an error after reading the first part of the file,
+ leave that portion malloc'd in *WHOLE, *WHOLE_SIZE. If *WHOLE
+ is not null on entry, we'll use it in lieu of repeating a read. */
+
+Dwfl_Error internal_function
+unzip (int fd, off64_t start_offset,
+ void *mapped, size_t mapped_size,
+ void **whole, size_t *whole_size)
+{
+ void *buffer = NULL;
+ size_t size = 0;
+ inline bool bigger_buffer (size_t start)
+ {
+ size_t more = size ? size * 2 : start;
+ char *b = realloc (buffer, more);
+ while (unlikely (b == NULL) && more >= size + 1024)
+ b = realloc (buffer, more -= 1024);
+ if (unlikely (b == NULL))
+ return false;
+ buffer = b;
+ size = more;
+ return true;
+ }
+ inline void smaller_buffer (size_t end)
+ {
+ buffer = realloc (buffer, end) ?: end == 0 ? NULL : buffer;
+ size = end;
+ }
+
+ void *input_buffer = NULL;
+ off_t input_pos = 0;
+
+ inline Dwfl_Error fail (Dwfl_Error failure)
+ {
+ if (input_pos == (off_t) mapped_size)
+ *whole = input_buffer;
+ else
+ {
+ free (input_buffer);
+ *whole = NULL;
+ }
+ free (buffer);
+ return failure;
+ }
+
+ inline Dwfl_Error zlib_fail (int result)
+ {
+ switch (result)
+ {
+ case Z (MEM_ERROR):
+ return fail (DWFL_E_NOMEM);
+ case Z (ERRNO):
+ return fail (DWFL_E_ERRNO);
+ default:
+ return fail (DWFL_E_ZLIB);
+ }
+ }
+
+ if (mapped == NULL)
+ {
+ if (*whole == NULL)
+ {
+ input_buffer = malloc (READ_SIZE);
+ if (unlikely (input_buffer == NULL))
+ return DWFL_E_NOMEM;
+
+ ssize_t n = pread_retry (fd, input_buffer, READ_SIZE, start_offset);
+ if (unlikely (n < 0))
+ return zlib_fail (Z (ERRNO));
+
+ input_pos = n;
+ mapped = input_buffer;
+ mapped_size = n;
+ }
+ else
+ {
+ input_buffer = *whole;
+ input_pos = mapped_size = *whole_size;
+ }
+ }
+
+#define NOMAGIC(magic) \
+ (mapped_size <= sizeof magic || memcmp (mapped, magic, sizeof magic - 1))
+
+ /* First, look at the header. */
+ if (NOMAGIC (MAGIC)
+#ifdef MAGIC2
+ && NOMAGIC (MAGIC2)
+#endif
+ )
+ /* Not a compressed file. */
+ return DWFL_E_BADELF;
+
+#if USE_INFLATE
+
+ /* This style actually only works with bzlib and liblzma.
+ The stupid zlib interface has nothing to grok the
+ gzip file headers except the slow gzFile interface. */
+
+ z_stream z = { .next_in = mapped, .avail_in = mapped_size };
+ int result = inflateInit (&z);
+ if (result != Z (OK))
+ {
+ inflateEnd (&z);
+ return zlib_fail (result);
+ }
+
+ do
+ {
+ if (z.avail_in == 0 && input_buffer != NULL)
+ {
+ ssize_t n = pread_retry (fd, input_buffer, READ_SIZE,
+ start_offset + input_pos);
+ if (unlikely (n < 0))
+ {
+ inflateEnd (&z);
+ return zlib_fail (Z (ERRNO));
+ }
+ z.next_in = input_buffer;
+ z.avail_in = n;
+ input_pos += n;
+ }
+ if (z.avail_out == 0)
+ {
+ ptrdiff_t pos = (void *) z.next_out - buffer;
+ if (!bigger_buffer (z.avail_in))
+ {
+ result = Z (MEM_ERROR);
+ break;
+ }
+ z.next_out = buffer + pos;
+ z.avail_out = size - pos;
+ }
+ }
+ while ((result = do_inflate (&z)) == Z (OK));
+
+#ifdef BZLIB
+ uint64_t total_out = (((uint64_t) z.total_out_hi32 << 32)
+ | z.total_out_lo32);
+ smaller_buffer (total_out);
+#else
+ smaller_buffer (z.total_out);
+#endif
+
+ inflateEnd (&z);
+
+ if (result != Z (STREAM_END))
+ return zlib_fail (result);
+
+#else /* gzip only. */
+
+ /* Let the decompression library read the file directly. */
+
+ gzFile zf;
+ Dwfl_Error open_stream (void)
+ {
+ int d = dup (fd);
+ if (unlikely (d < 0))
+ return DWFL_E_BADELF;
+ if (start_offset != 0)
+ {
+ off64_t off = lseek (d, start_offset, SEEK_SET);
+ if (off != start_offset)
+ {
+ close (d);
+ return DWFL_E_BADELF;
+ }
+ }
+ zf = gzdopen (d, "r");
+ if (unlikely (zf == NULL))
+ {
+ close (d);
+ return zlib_fail (Z (MEM_ERROR));
+ }
+
+ /* From here on, zlib will close D. */
+
+ return DWFL_E_NOERROR;
+ }
+
+ Dwfl_Error result = open_stream ();
+
+ if (result == DWFL_E_NOERROR && gzdirect (zf))
+ {
+ gzclose (zf);
+ return fail (DWFL_E_BADELF);
+ }
+
+ if (result != DWFL_E_NOERROR)
+ return fail (result);
+
+ ptrdiff_t pos = 0;
+ while (1)
+ {
+ if (!bigger_buffer (1024))
+ {
+ gzclose (zf);
+ return zlib_fail (Z (MEM_ERROR));
+ }
+ int n = gzread (zf, buffer + pos, size - pos);
+ if (n < 0)
+ {
+ int code;
+ gzerror (zf, &code);
+ gzclose (zf);
+ return zlib_fail (code);
+ }
+ if (n == 0)
+ break;
+ pos += n;
+ }
+
+ gzclose (zf);
+ smaller_buffer (pos);
+#endif
+
+ free (input_buffer);
+
+ *whole = buffer;
+ *whole_size = size;
+
+ return DWFL_E_NOERROR;
+}
diff --git a/libdwfl/image-header.c b/libdwfl/image-header.c
new file mode 100644
index 00000000..6341fc8c
--- /dev/null
+++ b/libdwfl/image-header.c
@@ -0,0 +1,124 @@
+/* Linux kernel image support for libdwfl.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#include "libdwflP.h"
+#include "system.h"
+
+#include <unistd.h>
+#include <endian.h>
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+# define LE16(x) (x)
+# define LE32(x) (x)
+#else
+# define LE16(x) bswap_16 (x)
+# define LE32(x) bswap_32 (x)
+#endif
+
+/* See Documentation/x86/boot.txt in Linux kernel sources
+ for an explanation of these format details. */
+
+#define MAGIC1 0xaa55
+#define MAGIC2 0x53726448 /* "HdrS" little-endian */
+#define MIN_VERSION 0x0208
+
+#define H_START (H_SETUP_SECTS & -4)
+#define H_SETUP_SECTS 0x1f1
+#define H_MAGIC1 0x1fe
+#define H_MAGIC2 0x202
+#define H_VERSION 0x206
+#define H_PAYLOAD_OFFSET 0x248
+#define H_PAYLOAD_LENGTH 0x24c
+#define H_END 0x250
+#define H_READ_SIZE (H_END - H_START)
+
+Dwfl_Error
+internal_function
+__libdw_image_header (int fd, off64_t *start_offset,
+ void *mapped, size_t mapped_size)
+{
+ if (likely (mapped_size > H_END))
+ {
+ const void *header = mapped;
+ char header_buffer[H_READ_SIZE];
+ if (header == NULL)
+ {
+ ssize_t n = pread_retry (fd, header_buffer, H_READ_SIZE,
+ *start_offset + H_START);
+ if (n < 0)
+ return DWFL_E_ERRNO;
+ if (n < H_READ_SIZE)
+ return DWFL_E_BADELF;
+
+ header = header_buffer - H_START;
+ }
+
+ if (*(uint16_t *) (header + H_MAGIC1) == LE16 (MAGIC1)
+ && *(uint32_t *) (header + H_MAGIC2) == LE32 (MAGIC2)
+ && LE16 (*(uint16_t *) (header + H_VERSION)) >= MIN_VERSION)
+ {
+ /* The magic numbers match and the version field is sufficient.
+ Extract the payload bounds. */
+
+ uint32_t offset = LE32 (*(uint32_t *) (header + H_PAYLOAD_OFFSET));
+ uint32_t length = LE32 (*(uint32_t *) (header + H_PAYLOAD_LENGTH));
+
+ offset += ((*(uint8_t *) (header + H_SETUP_SECTS) ?: 4) + 1) * 512;
+
+ if (offset > H_END && offset < mapped_size
+ && mapped_size - offset >= length)
+ {
+ /* It looks kosher. Use it! */
+ *start_offset += offset;
+ return DWFL_E_NOERROR;
+ }
+ }
+ }
+ return DWFL_E_BADELF;
+}
diff --git a/libdwfl/libdwfl.h b/libdwfl/libdwfl.h
index cd1d9712..bd28f064 100644
--- a/libdwfl/libdwfl.h
+++ b/libdwfl/libdwfl.h
@@ -1,5 +1,5 @@
/* Interfaces for libdwfl.
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -119,10 +119,42 @@ extern int dwfl_errno (void);
extern const char *dwfl_errmsg (int err);
-/* Start reporting the current set of modules to the library. No calls but
- dwfl_report_* can be made on DWFL until dwfl_report_end is called. */
+/* Start reporting the current set of segments and modules to the library.
+ All existing segments are wiped. Existing modules are marked to be
+ deleted, and will not be found via dwfl_addrmodule et al if they are not
+ re-reported before dwfl_report_end is called. */
extern void dwfl_report_begin (Dwfl *dwfl);
+/* Report that segment NDX begins at PHDR->p_vaddr + BIAS.
+ If NDX is < 0, the value succeeding the last call's NDX
+ is used instead (zero on the first call).
+
+ If nonzero, the smallest PHDR->p_align value seen sets the
+ effective page size for the address space DWFL describes.
+ This is the granularity at which reported module boundary
+ addresses will be considered to fall in or out of a segment.
+
+ Returns -1 for errors, or NDX (or its assigned replacement) on success.
+
+ When NDX is the value succeeding the last call's NDX (or is implicitly
+ so as above), IDENT is nonnull and matches the value in the last call,
+ and the PHDR and BIAS values reflect a segment that would be contiguous,
+ in both memory and file, with the last segment reported, then this
+ segment may be coalesced internally with preceding segments. When given
+ an address inside this segment, dwfl_addrsegment may return the NDX of a
+ preceding contiguous segment. To prevent coalesced segments, always
+ pass a null pointer for IDENT.
+
+ The values passed are not stored (except to track coalescence).
+ The only information that can be extracted from DWFL later is the
+ mapping of an address to a segment index that starts at or below
+ it. Reporting segments at all is optional. Its only benefit to
+ the caller is to offer this quick lookup via dwfl_addrsegment,
+ or use other segment-based calls. */
+extern int dwfl_report_segment (Dwfl *dwfl, int ndx,
+ const GElf_Phdr *phdr, GElf_Addr bias,
+ const void *ident);
+
/* Report that a module called NAME spans addresses [START, END).
Returns the module handle, either existing or newly allocated,
or returns a null pointer for an allocation error. */
@@ -196,6 +228,13 @@ extern ptrdiff_t dwfl_getmodules (Dwfl *dwfl,
/* Find the module containing the given address. */
extern Dwfl_Module *dwfl_addrmodule (Dwfl *dwfl, Dwarf_Addr address);
+/* Find the segment, if any, and module, if any, containing ADDRESS.
+ Returns a segment index returned by dwfl_report_segment, or -1
+ if no segment matches the address. Regardless of the return value,
+ *MOD is always set to the module containing ADDRESS, or to null. */
+extern int dwfl_addrsegment (Dwfl *dwfl, Dwarf_Addr address, Dwfl_Module **mod);
+
+
/* Report the known build ID bits associated with a module.
If VADDR is nonzero, it gives the absolute address where those
@@ -323,6 +362,15 @@ extern int dwfl_linux_kernel_report_offline (Dwfl *dwfl, const char *release,
int (*predicate) (const char *,
const char *));
+/* Examine an ET_CORE file and report modules based on its contents.
+ 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);
/* Call dwfl_report_module for each file mapped into the address space of PID.
Returns zero on success, -1 if dwfl_report_module failed,
@@ -402,10 +450,11 @@ extern int dwfl_module_getsymtab (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. If SHNDXP is
- non-null, it's set with the section index (whether from st_shndx or
- extended index table). */
+ 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. */
extern const char *dwfl_module_getsym (Dwfl_Module *mod, int ndx,
GElf_Sym *sym, GElf_Word *shndxp)
__nonnull_attribute__ (3);
@@ -606,6 +655,18 @@ extern int dwfl_core_file_read_note (Dwfl *dwfl, Dwfl_Register_Map *map,
GElf_Nhdr *next, GElf_Off *desc_offset)
__nonnull_attribute__ (6, 7, 8, 9, 10, 11, 12, 13);
+/* Find the CFI for this module. Returns NULL if there is no CFI.
+ On success, fills in *BIAS with the difference between addresses
+ within the loaded module and those in the CFI referring to it.
+ The pointer returned can be used until the module is cleaned up.
+ Calling these more than once returns the same pointers.
+
+ dwfl_module_dwarf_cfi gets the '.debug_frame' information found with the
+ rest of the DWARF information. dwfl_module_eh_cfi gets the '.eh_frame'
+ information found linked into the text. A module might have either or
+ both. */
+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);
#ifdef __cplusplus
diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h
index 54a3d727..6aa8e051 100644
--- a/libdwfl/libdwflP.h
+++ b/libdwfl/libdwflP.h
@@ -1,5 +1,5 @@
/* Internal definitions for libdwfl.
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -74,6 +74,9 @@
DWFL_ERROR (LIBELF, N_("See elf_errno")) \
DWFL_ERROR (LIBDW, N_("See dwarf_errno")) \
DWFL_ERROR (LIBEBL, N_("See ebl_errno (XXX missing)")) \
+ DWFL_ERROR (ZLIB, N_("gzip decompression failed")) \
+ DWFL_ERROR (BZLIB, N_("bzip2 decompression failed")) \
+ DWFL_ERROR (LZMA, N_("LZMA decompression failed")) \
DWFL_ERROR (UNKNOWN_MACHINE, N_("no support library found for machine")) \
DWFL_ERROR (NOREL, N_("Callbacks missing for ET_REL file")) \
DWFL_ERROR (BADRELTYPE, N_("Unsupported relocation type")) \
@@ -90,7 +93,8 @@
DWFL_ERROR (TRUNCATED, N_("image truncated")) \
DWFL_ERROR (ALREADY_ELF, N_("ELF file opened")) \
DWFL_ERROR (BADELF, N_("not a valid ELF file")) \
- DWFL_ERROR (WEIRD_TYPE, N_("cannot handle DWARF type description"))
+ DWFL_ERROR (WEIRD_TYPE, N_("cannot handle DWARF type description")) \
+ DWFL_ERROR (WRONG_ID_ELF, N_("ELF file does not match build ID"))
#define DWFL_ERROR(name, text) DWFL_E_##name,
typedef enum { DWFL_ERRORS DWFL_E_NUM } Dwfl_Error;
@@ -99,8 +103,8 @@ typedef enum { DWFL_ERRORS DWFL_E_NUM } Dwfl_Error;
#define OTHER_ERROR(name) ((unsigned int) DWFL_E_##name << 16)
#define DWFL_E(name, errno) (OTHER_ERROR (name) | (errno))
-extern int __libdwfl_canon_error (Dwfl_Error error) internal_function;
-extern void __libdwfl_seterrno (Dwfl_Error error) internal_function;
+extern int __libdwfl_canon_error (Dwfl_Error) internal_function;
+extern void __libdwfl_seterrno (Dwfl_Error) internal_function;
struct Dwfl
{
@@ -111,10 +115,22 @@ struct Dwfl
Dwfl_Module *modulelist; /* List in order used by full traversals. */
- Dwfl_Module **modules;
- size_t nmodules;
-
GElf_Addr offline_next_address;
+
+ GElf_Addr segment_align; /* Smallest granularity of segments. */
+
+ /* Binary search table in three parallel malloc'd arrays. */
+ size_t lookup_elts; /* Elements in use. */
+ size_t lookup_alloc; /* Elements allococated. */
+ GElf_Addr *lookup_addr; /* Start address of segment. */
+ Dwfl_Module **lookup_module; /* Module associated with segment, or null. */
+ int *lookup_segndx; /* User segment index, or -1. */
+
+ /* Cache from last dwfl_report_segment call. */
+ const void *lookup_tail_ident;
+ GElf_Off lookup_tail_vaddr;
+ GElf_Off lookup_tail_offset;
+ int lookup_tail_ndx;
};
#define OFFLINE_REDZONE 0x10000
@@ -141,10 +157,6 @@ struct Dwfl_Module
char *name; /* Iterator name for this module. */
GElf_Addr low_addr, high_addr;
- void *build_id_bits; /* malloc'd copy of build ID bits. */
- GElf_Addr build_id_vaddr; /* Address where they reside, 0 if unknown. */
- int build_id_len; /* -1 for prior failure, 0 if unset. */
-
struct dwfl_file main, debug;
Ebl *ebl;
GElf_Half e_type; /* GElf_Ehdr.e_type cache. */
@@ -157,21 +169,31 @@ struct Dwfl_Module
size_t syments; /* sh_size / sh_entsize of that section. */
Elf_Data *symstrdata; /* Data for its string table. */
Elf_Data *symxndxdata; /* Data in the extended section index table. */
- Dwfl_Error symerr; /* Previous failure to load symbols. */
Dwarf *dw; /* libdw handle for its debugging info. */
- Dwfl_Error dwerr; /* Previous failure to load info. */
+
+ Dwfl_Error symerr; /* Previous failure to load symbols. */
+ Dwfl_Error dwerr; /* Previous failure to load DWARF. */
/* Known CU's in this module. */
struct dwfl_cu *first_cu, **cu;
- unsigned int ncu;
void *lazy_cu_root; /* Table indexed by Dwarf_Off of CU. */
- unsigned int lazycu; /* Possible users, deleted when none left. */
struct dwfl_arange *aranges; /* Mapping of addresses in module to CUs. */
+
+ void *build_id_bits; /* malloc'd copy of build ID bits. */
+ GElf_Addr build_id_vaddr; /* Address where they reside, 0 if unknown. */
+ int build_id_len; /* -1 for prior failure, 0 if unset. */
+
+ unsigned int ncu;
+ unsigned int lazycu; /* Possible users, deleted when none left. */
unsigned int naranges;
+ Dwarf_CFI *dwarf_cfi; /* Cached DWARF CFI for this module. */
+ Dwarf_CFI *eh_cfi; /* Cached EH CFI for this module. */
+
+ int segment; /* Index of first segment table entry. */
bool gc; /* Mark/sweep flag. */
};
@@ -250,6 +272,8 @@ struct map_register
extern void __libdwfl_module_free (Dwfl_Module *mod) internal_function;
+/* Find the main ELF file, update MOD->elferr and/or MOD->main.elf. */
+extern void __libdwfl_getelf (Dwfl_Module *mod) internal_function;
/* Process relocations in debugging sections in an ET_REL file.
FILE must be opened with ELF_C_READ_MMAP_PRIVATE or ELF_C_READ,
@@ -281,6 +305,11 @@ extern Dwfl_Error __libdwfl_relocate_value (Dwfl_Module *mod, Elf *elf,
/* Ensure that MOD->ebl is set up. */
extern Dwfl_Error __libdwfl_module_getebl (Dwfl_Module *mod) internal_function;
+/* Install a new Dwarf_CFI in *SLOT (MOD->eh_cfi or MOD->dwarf_cfi). */
+extern Dwarf_CFI *__libdwfl_set_cfi (Dwfl_Module *mod, Dwarf_CFI **slot,
+ Dwarf_CFI *cfi)
+ internal_function;
+
/* Iterate through all the CU's in the module. Start by passing a null
LASTCU, and then pass the last *CU returned. Success return with null
*CU no more CUs. */
@@ -315,7 +344,7 @@ extern int __libdwfl_crc32_file (int fd, uint32_t *resp) attribute_hidden;
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)
+ Elf *elf, GElf_Addr base, bool sanity)
internal_function;
/* Meat of dwfl_report_offline. */
@@ -326,14 +355,89 @@ extern Dwfl_Module *__libdwfl_report_offline (Dwfl *dwfl, const char *name,
const char *))
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,
+ void **whole, size_t *whole_size)
+ internal_function;
+extern Dwfl_Error __libdw_bunzip2 (int fd, off64_t start_offset,
+ void *mapped, size_t mapped_size,
+ void **whole, size_t *whole_size)
+ internal_function;
+extern Dwfl_Error __libdw_unlzma (int fd, off64_t start_offset,
+ void *mapped, size_t mapped_size,
+ void **whole, size_t *whole_size)
+ internal_function;
+
+/* Skip the image header before a file image: updates *START_OFFSET. */
+extern Dwfl_Error __libdw_image_header (int fd, off64_t *start_offset,
+ void *mapped, size_t mapped_size)
+ internal_function;
+
+/* Open Elf handle on *FDP. This handles decompression and checks
+ elf_kind. Succeed only for ELF_K_ELF, or also ELF_K_AR if ARCHIVE_OK.
+ Returns DWFL_E_NOERROR and sets *ELFP on success, resets *FDP to -1 if
+ it's no longer used. Resets *FDP on failure too iff CLOSE_ON_FAIL. */
+extern Dwfl_Error __libdw_open_file (int *fdp, Elf **elfp,
+ bool close_on_fail, bool archive_ok)
+ internal_function;
+
+/* These are working nicely for --core, but are not ready to be
+ exported interfaces quite yet. */
+
+/* Type of callback function ...
+ */
+typedef bool Dwfl_Memory_Callback (Dwfl *dwfl, int segndx,
+ void **buffer, size_t *buffer_available,
+ GElf_Addr vaddr, size_t minread, void *arg);
+
+/* Type of callback function ...
+ */
+typedef bool Dwfl_Module_Callback (Dwfl_Module *mod, void **userdata,
+ const char *name, Dwarf_Addr base,
+ void **buffer, size_t *buffer_available,
+ GElf_Off cost, GElf_Off worthwhile,
+ GElf_Off whole, GElf_Off contiguous,
+ void *arg, Elf **elfp);
+
+/* ...
+ */
+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);
+
+/* 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,
+ this just modifies that module's name and suggested file name. If
+ no such module exists, this calls dwfl_report_elf on the l_name string.
+
+ If AUXV is not null, it points to AUXV_SIZE bytes of auxiliary vector
+ data as contained in an NT_AUXV note or read from a /proc/pid/auxv
+ file. When this is available, it guides the search. If AUXV is null
+ or the memory it points to is not accessible, then this search can
+ only find where to begin if the correct executable file was
+ previously reported and preloaded as with dwfl_report_elf.
+
+ 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);
+
/* Avoid PLT entries. */
INTDECL (dwfl_begin)
INTDECL (dwfl_errmsg)
+INTDECL (dwfl_errno)
INTDECL (dwfl_addrmodule)
+INTDECL (dwfl_addrsegment)
INTDECL (dwfl_addrdwarf)
INTDECL (dwfl_addrdie)
+INTDECL (dwfl_core_file_report)
+INTDECL (dwfl_getmodules)
INTDECL (dwfl_module_addrdie)
+INTDECL (dwfl_module_address_section)
INTDECL (dwfl_module_addrsym)
INTDECL (dwfl_module_build_id)
INTDECL (dwfl_module_getdwarf)
@@ -346,11 +450,13 @@ INTDECL (dwfl_report_elf)
INTDECL (dwfl_report_begin)
INTDECL (dwfl_report_begin_add)
INTDECL (dwfl_report_module)
+INTDECL (dwfl_report_segment)
INTDECL (dwfl_report_offline)
INTDECL (dwfl_report_end)
INTDECL (dwfl_build_id_find_elf)
INTDECL (dwfl_build_id_find_debuginfo)
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_report)
@@ -361,8 +467,8 @@ INTDECL (dwfl_linux_kernel_report_modules)
INTDECL (dwfl_linux_kernel_report_offline)
INTDECL (dwfl_offline_section_address)
INTDECL (dwfl_module_relocate_address)
-INTDECL (dwfl_core_file_report)
-INTDECL (dwfl_core_file_find_elf)
+INTDECL (dwfl_module_dwarf_cfi)
+INTDECL (dwfl_module_eh_cfi)
/* Leading arguments standard to callbacks passed a Dwfl_Module. */
#define MODCB_ARGS(mod) (mod), &(mod)->userdata, (mod)->name, (mod)->low_addr
diff --git a/libdwfl/link_map.c b/libdwfl/link_map.c
new file mode 100644
index 00000000..403b2df6
--- /dev/null
+++ b/libdwfl/link_map.c
@@ -0,0 +1,890 @@
+/* Report modules by examining dynamic linker data structures.
+ Copyright (C) 2008-2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#include <config.h>
+#include "libdwflP.h"
+
+#include <byteswap.h>
+#include <endian.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_TYPE AT_PHENT
+#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. */
+static bool
+auxv_format_probe (const void *auxv, size_t size,
+ uint_fast8_t *elfclass, uint_fast8_t *elfdata)
+{
+ const union
+ {
+ char buf[size];
+ Elf32_auxv_t a32[size / sizeof (Elf32_auxv_t)];
+ Elf64_auxv_t a64[size / sizeof (Elf64_auxv_t)];
+ } *u = auxv;
+
+ 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))
+ {
+ *elfdata = ELFDATA2MSB;
+ return true;
+ }
+
+ if (u->a64[i].a_type == LE64 (PROBE_TYPE)
+ && u->a64[i].a_un.a_val == LE64 (PROBE_VAL64))
+ {
+ *elfdata = ELFDATA2LSB;
+ return true;
+ }
+
+ return false;
+ }
+
+ inline bool check32 (size_t i)
+ {
+ if (u->a32[i].a_type == BE32 (PROBE_TYPE)
+ && u->a32[i].a_un.a_val == BE32 (PROBE_VAL32))
+ {
+ *elfdata = ELFDATA2MSB;
+ return true;
+ }
+
+ if (u->a32[i].a_type == LE32 (PROBE_TYPE)
+ && u->a32[i].a_un.a_val == LE32 (PROBE_VAL32))
+ {
+ *elfdata = ELFDATA2LSB;
+ return true;
+ }
+
+ return false;
+ }
+
+ for (size_t i = 0; i < size / sizeof (Elf64_auxv_t); ++i)
+ {
+ if (check64 (i))
+ {
+ *elfclass = ELFCLASS64;
+ return true;
+ }
+
+ if (check32 (i * 2) || check32 (i * 2 + 1))
+ {
+ *elfclass = ELFCLASS32;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/* This is a Dwfl_Memory_Callback that wraps another memory callback.
+ If the underlying callback cannot fill the data, then this will
+ fall back to fetching data from module files. */
+
+struct integrated_memory_callback
+{
+ Dwfl_Memory_Callback *memory_callback;
+ void *memory_callback_arg;
+ void *buffer;
+};
+
+static bool
+integrated_memory_callback (Dwfl *dwfl, int ndx,
+ void **buffer, size_t *buffer_available,
+ GElf_Addr vaddr,
+ size_t minread,
+ void *arg)
+{
+ struct integrated_memory_callback *info = arg;
+
+ if (ndx == -1)
+ {
+ /* Called for cleanup. */
+ if (info->buffer != NULL)
+ {
+ /* The last probe buffer came from the underlying callback.
+ Let it do its cleanup. */
+ assert (*buffer == info->buffer); /* XXX */
+ *buffer = info->buffer;
+ info->buffer = NULL;
+ return (*info->memory_callback) (dwfl, ndx, buffer, buffer_available,
+ vaddr, minread,
+ info->memory_callback_arg);
+ }
+ *buffer = NULL;
+ *buffer_available = 0;
+ return false;
+ }
+
+ if (*buffer != NULL)
+ /* For a final-read request, we only use the underlying callback. */
+ return (*info->memory_callback) (dwfl, ndx, buffer, buffer_available,
+ vaddr, minread, info->memory_callback_arg);
+
+ /* Let the underlying callback try to fill this request. */
+ if ((*info->memory_callback) (dwfl, ndx, &info->buffer, buffer_available,
+ vaddr, minread, info->memory_callback_arg))
+ {
+ *buffer = info->buffer;
+ return true;
+ }
+
+ /* Now look for module text covering this address. */
+
+ Dwfl_Module *mod;
+ (void) INTUSE(dwfl_addrsegment) (dwfl, vaddr, &mod);
+ if (mod == NULL)
+ return false;
+
+ Dwarf_Addr bias;
+ Elf_Scn *scn = INTUSE(dwfl_module_address_section) (mod, &vaddr, &bias);
+ if (unlikely (scn == NULL))
+ {
+#if 0 // XXX would have to handle ndx=-1 cleanup calls passed down.
+ /* If we have no sections we can try to fill it from the module file
+ based on its phdr mappings. */
+ if (likely (mod->e_type != ET_REL) && mod->main.elf != NULL)
+ return INTUSE(dwfl_elf_phdr_memory_callback)
+ (dwfl, 0, buffer, buffer_available,
+ vaddr - mod->main.bias, minread, mod->main.elf);
+#endif
+ return false;
+ }
+
+ Elf_Data *data = elf_rawdata (scn, NULL);
+ if (unlikely (data == NULL))
+ // XXX throw error?
+ return false;
+
+ if (unlikely (data->d_size < vaddr))
+ return false;
+
+ /* Provide as much data as we have. */
+ void *contents = data->d_buf + vaddr;
+ size_t avail = data->d_size - vaddr;
+ if (unlikely (avail < minread))
+ return false;
+
+ /* If probing for a string, make sure it's terminated. */
+ if (minread == 0 && unlikely (memchr (contents, '\0', avail) == NULL))
+ return false;
+
+ /* We have it! */
+ *buffer = contents;
+ *buffer_available = avail;
+ return true;
+}
+
+static size_t
+addrsize (uint_fast8_t elfclass)
+{
+ return elfclass * 4;
+}
+
+/* Report a module for each struct link_map in the linked list at r_map
+ in the struct r_debug at R_DEBUG_VADDR.
+
+ 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
+ no such module exists, this calls dwfl_report_elf on the l_name string.
+
+ Returns the number of modules found, or -1 for errors. */
+
+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)
+{
+ /* Skip r_version, to aligned r_map field. */
+ GElf_Addr read_vaddr = r_debug_vaddr + addrsize (elfclass);
+
+ void *buffer = NULL;
+ size_t buffer_available = 0;
+ inline int release_buffer (int result)
+ {
+ if (buffer != NULL)
+ (void) (*memory_callback) (dwfl, -1, &buffer, &buffer_available, 0, 0,
+ memory_callback_arg);
+ return result;
+ }
+
+ GElf_Addr addrs[4];
+ inline bool read_addrs (GElf_Addr vaddr, size_t n)
+ {
+ size_t nb = n * addrsize (elfclass); /* Address words -> bytes to read. */
+
+ /* Read a new buffer if the old one doesn't cover these words. */
+ if (buffer == NULL
+ || vaddr < read_vaddr
+ || vaddr - read_vaddr + nb > buffer_available)
+ {
+ release_buffer (0);
+
+ read_vaddr = vaddr;
+ int segndx = INTUSE(dwfl_addrsegment) (dwfl, vaddr, NULL);
+ if (unlikely (segndx < 0)
+ || unlikely (! (*memory_callback) (dwfl, segndx,
+ &buffer, &buffer_available,
+ vaddr, nb, memory_callback_arg)))
+ return true;
+ }
+
+ const union
+ {
+ Elf32_Addr a32[n];
+ Elf64_Addr a64[n];
+ } *in = vaddr - read_vaddr + buffer;
+
+ if (elfclass == ELFCLASS32)
+ {
+ if (elfdata == ELFDATA2MSB)
+ for (size_t i = 0; i < n; ++i)
+ addrs[i] = BE32 (in->a32[i]);
+ else
+ for (size_t i = 0; i < n; ++i)
+ addrs[i] = LE32 (in->a32[i]);
+ }
+ else
+ {
+ if (elfdata == ELFDATA2MSB)
+ for (size_t i = 0; i < n; ++i)
+ addrs[i] = BE64 (in->a64[i]);
+ else
+ for (size_t i = 0; i < n; ++i)
+ addrs[i] = LE64 (in->a64[i]);
+ }
+
+ return false;
+ }
+
+ if (unlikely (read_addrs (read_vaddr, 1)))
+ return release_buffer (-1);
+
+ GElf_Addr next = addrs[0];
+
+ Dwfl_Module **lastmodp = &dwfl->modulelist;
+ int result = 0;
+
+ /* There can't be more elements in the link_map list than there are
+ segments. DWFL->lookup_elts is probably twice that number, so it
+ is certainly above the upper bound. If we iterate too many times,
+ there must be a loop in the pointers due to link_map clobberation. */
+ size_t iterations = 0;
+ while (next != 0 && ++iterations < dwfl->lookup_elts)
+ {
+ if (read_addrs (next, 4))
+ return release_buffer (-1);
+
+ GElf_Addr l_addr = addrs[0];
+ GElf_Addr l_name = addrs[1];
+ GElf_Addr l_ld = addrs[2];
+ next = addrs[3];
+
+ /* If a clobbered or truncated memory image has no useful pointer,
+ just skip this element. */
+ if (l_ld == 0)
+ continue;
+
+ /* Fetch the string at the l_name address. */
+ const char *name = NULL;
+ if (buffer != NULL
+ && read_vaddr <= l_name
+ && l_name + 1 - read_vaddr < buffer_available
+ && memchr (l_name - read_vaddr + buffer, '\0',
+ buffer_available - (l_name - read_vaddr)) != NULL)
+ name = l_name - read_vaddr + buffer;
+ else
+ {
+ release_buffer (0);
+ read_vaddr = l_name;
+ int segndx = INTUSE(dwfl_addrsegment) (dwfl, l_name, NULL);
+ if (likely (segndx >= 0)
+ && (*memory_callback) (dwfl, segndx,
+ &buffer, &buffer_available,
+ l_name, 0, memory_callback_arg))
+ name = buffer;
+ }
+
+ 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)
+ {
+ /* We have a module. We can give it a better name from l_name. */
+ if (name != NULL && mod->name[0] == '[')
+ {
+ char *newname = strdup (basename (name));
+ if (newname != NULL)
+ {
+ free (mod->name);
+ mod->name = newname;
+ }
+ }
+
+ 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.elf == 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)
+ {
+ ++result;
+
+ /* 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;
+ }
+ }
+
+ return release_buffer (result);
+}
+
+static GElf_Addr
+consider_executable (Dwfl_Module *mod, GElf_Addr at_phdr, GElf_Addr at_entry,
+ uint_fast8_t *elfclass, uint_fast8_t *elfdata,
+ Dwfl_Memory_Callback *memory_callback,
+ void *memory_callback_arg)
+{
+ GElf_Ehdr ehdr;
+ if (unlikely (gelf_getehdr (mod->main.elf, &ehdr) == NULL))
+ return 0;
+
+ if (at_entry != 0)
+ {
+ /* If we have an AT_ENTRY value, reject this executable if
+ its entry point address could not have supplied that. */
+
+ if (ehdr.e_entry == 0)
+ return 0;
+
+ if (mod->e_type == ET_EXEC)
+ {
+ if (ehdr.e_entry != at_entry)
+ return 0;
+ }
+ else
+ {
+ /* It could be a PIE. */
+ }
+ }
+
+ // XXX this could be saved in the file cache: phdr vaddr, DT_DEBUG d_val vaddr
+ /* Find the vaddr of the DT_DEBUG's d_ptr. This is the memory
+ address where &r_debug was written at runtime. */
+ GElf_Xword align = mod->dwfl->segment_align;
+ GElf_Addr d_val_vaddr = 0;
+ for (uint_fast16_t i = 0; i < ehdr.e_phnum; ++i)
+ {
+ GElf_Phdr phdr_mem;
+ GElf_Phdr *phdr = gelf_getphdr (mod->main.elf, i, &phdr_mem);
+ if (phdr == NULL)
+ break;
+
+ if (phdr->p_align > 1 && (align == 0 || phdr->p_align < align))
+ align = phdr->p_align;
+
+ if (at_phdr != 0
+ && phdr->p_type == PT_LOAD
+ && (phdr->p_offset & -align) == (ehdr.e_phoff & -align))
+ {
+ /* This is the segment that would map the phdrs.
+ If we have an AT_PHDR value, reject this executable
+ if its phdr mapping could not have supplied that. */
+ if (mod->e_type == ET_EXEC)
+ {
+ if (ehdr.e_phoff - phdr->p_offset + phdr->p_vaddr != at_phdr)
+ return 0;
+ }
+ else
+ {
+ /* It could be a PIE. If the AT_PHDR value and our
+ phdr address don't match modulo ALIGN, then this
+ could not have been the right PIE. */
+ if (((ehdr.e_phoff - phdr->p_offset + phdr->p_vaddr) & -align)
+ != (at_phdr & -align))
+ return 0;
+
+ /* Calculate the bias applied to the PIE's p_vaddr values. */
+ GElf_Addr bias = (at_phdr - (ehdr.e_phoff - phdr->p_offset
+ + phdr->p_vaddr));
+
+ /* Final sanity check: if we have an AT_ENTRY value,
+ reject this PIE unless its biased e_entry matches. */
+ if (at_entry != 0 && at_entry != ehdr.e_entry + bias)
+ return 0;
+
+ /* If we're changing the module's address range,
+ we've just invalidated the module lookup table. */
+ if (bias != mod->main.bias)
+ {
+ mod->low_addr -= mod->main.bias;
+ mod->high_addr -= mod->main.bias;
+ mod->main.bias = bias;
+ mod->low_addr += bias;
+ mod->high_addr += bias;
+
+ free (mod->dwfl->lookup_module);
+ mod->dwfl->lookup_module = NULL;
+ }
+ }
+ }
+
+ if (phdr->p_type == PT_DYNAMIC)
+ {
+ Elf_Data *data = elf_getdata_rawchunk (mod->main.elf, phdr->p_offset,
+ phdr->p_filesz, ELF_T_DYN);
+ if (data == NULL)
+ continue;
+ const size_t entsize = gelf_fsize (mod->main.elf,
+ ELF_T_DYN, 1, EV_CURRENT);
+ const size_t n = data->d_size / entsize;
+ for (size_t j = 0; j < n; ++j)
+ {
+ GElf_Dyn dyn_mem;
+ GElf_Dyn *dyn = gelf_getdyn (data, j, &dyn_mem);
+ if (dyn != NULL && dyn->d_tag == DT_DEBUG)
+ {
+ d_val_vaddr = phdr->p_vaddr + entsize * j + entsize / 2;
+ break;
+ }
+ }
+ }
+ }
+
+ if (d_val_vaddr != 0)
+ {
+ /* Now we have the final address from which to read &r_debug. */
+ d_val_vaddr += mod->main.bias;
+
+ void *buffer = NULL;
+ size_t buffer_available = addrsize (ehdr.e_ident[EI_CLASS]);
+
+ int segndx = INTUSE(dwfl_addrsegment) (mod->dwfl, d_val_vaddr, NULL);
+
+ if ((*memory_callback) (mod->dwfl, segndx,
+ &buffer, &buffer_available,
+ d_val_vaddr, buffer_available,
+ memory_callback_arg))
+ {
+ const union
+ {
+ Elf32_Addr a32;
+ Elf64_Addr a64;
+ } *u = buffer;
+
+ GElf_Addr vaddr;
+ if (ehdr.e_ident[EI_CLASS] == ELFCLASS32)
+ vaddr = (ehdr.e_ident[EI_DATA] == ELFDATA2MSB
+ ? BE32 (u->a32) : LE32 (u->a32));
+ else
+ vaddr = (ehdr.e_ident[EI_DATA] == ELFDATA2MSB
+ ? BE64 (u->a64) : LE64 (u->a64));
+
+ (*memory_callback) (mod->dwfl, -1, &buffer, &buffer_available, 0, 0,
+ memory_callback_arg);
+
+ if (*elfclass == ELFCLASSNONE)
+ *elfclass = ehdr.e_ident[EI_CLASS];
+ else if (*elfclass != ehdr.e_ident[EI_CLASS])
+ return 0;
+
+ if (*elfdata == ELFDATANONE)
+ *elfdata = ehdr.e_ident[EI_DATA];
+ else if (*elfdata != ehdr.e_ident[EI_DATA])
+ return 0;
+
+ return vaddr;
+ }
+ }
+
+ return 0;
+}
+
+/* Try to find an existing executable module with a DT_DEBUG. */
+static GElf_Addr
+find_executable (Dwfl *dwfl, GElf_Addr at_phdr, GElf_Addr at_entry,
+ uint_fast8_t *elfclass, uint_fast8_t *elfdata,
+ Dwfl_Memory_Callback *memory_callback,
+ void *memory_callback_arg)
+{
+ for (Dwfl_Module *mod = dwfl->modulelist; mod != NULL; mod = mod->next)
+ if (mod->main.elf != NULL)
+ {
+ GElf_Addr r_debug_vaddr = consider_executable (mod, at_phdr, at_entry,
+ elfclass, elfdata,
+ memory_callback,
+ memory_callback_arg);
+ if (r_debug_vaddr != 0)
+ return r_debug_vaddr;
+ }
+
+ return 0;
+}
+
+
+int
+dwfl_link_map_report (Dwfl *dwfl, const void *auxv, size_t auxv_size,
+ Dwfl_Memory_Callback *memory_callback,
+ void *memory_callback_arg)
+{
+ GElf_Addr r_debug_vaddr = 0;
+
+ uint_fast8_t elfclass = ELFCLASSNONE;
+ uint_fast8_t elfdata = ELFDATANONE;
+ if (likely (auxv != NULL)
+ && likely (auxv_format_probe (auxv, auxv_size, &elfclass, &elfdata)))
+ {
+ GElf_Addr entry = 0;
+ GElf_Addr phdr = 0;
+ 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; \
+ } \
+ } \
+ } \
+ while (0)
+
+ if (elfclass == ELFCLASS32)
+ {
+ if (elfdata == ELFDATA2MSB)
+ AUXV_SCAN (32, BE);
+ else
+ AUXV_SCAN (32, LE);
+ }
+ else
+ {
+ if (elfdata == ELFDATA2MSB)
+ AUXV_SCAN (64, BE);
+ else
+ AUXV_SCAN (64, LE);
+ }
+
+ /* If we found the phdr dimensions, search phdrs for PT_DYNAMIC. */
+ GElf_Addr dyn_vaddr = 0;
+ GElf_Xword dyn_filesz = 0;
+ GElf_Addr dyn_bias = (GElf_Addr) -1;
+
+ inline bool consider_phdr (GElf_Word type,
+ GElf_Addr vaddr, GElf_Xword filesz)
+ {
+ switch (type)
+ {
+ case PT_PHDR:
+ if (dyn_bias == (GElf_Addr) -1
+ /* Do a sanity check on the putative address. */
+ && ((vaddr & (dwfl->segment_align - 1))
+ == (phdr & (dwfl->segment_align - 1))))
+ {
+ dyn_bias = phdr - vaddr;
+ return dyn_vaddr != 0;
+ }
+ break;
+
+ case PT_DYNAMIC:
+ dyn_vaddr = vaddr;
+ dyn_filesz = filesz;
+ return dyn_bias != (GElf_Addr) -1;
+ }
+
+ return false;
+ }
+
+ if (phdr != 0 && phnum != 0)
+ {
+ Dwfl_Module *phdr_mod;
+ int phdr_segndx = INTUSE(dwfl_addrsegment) (dwfl, phdr, &phdr_mod);
+ Elf_Data in =
+ {
+ .d_type = ELF_T_PHDR,
+ .d_version = EV_CURRENT,
+ .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))
+ {
+ union
+ {
+ Elf32_Phdr p32;
+ Elf64_Phdr p64;
+ char data[phnum * phent];
+ } buf;
+ Elf_Data out =
+ {
+ .d_type = ELF_T_PHDR,
+ .d_version = EV_CURRENT,
+ .d_size = phnum * phent,
+ .d_buf = &buf
+ };
+ in.d_size = out.d_size;
+ if (likely ((elfclass == ELFCLASS32
+ ? elf32_xlatetom : elf64_xlatetom)
+ (&out, &in, elfdata) != NULL))
+ {
+ /* We are looking for PT_DYNAMIC. */
+ const union
+ {
+ Elf32_Phdr p32[phnum];
+ Elf64_Phdr p64[phnum];
+ } *u = (void *) &buf;
+ if (elfclass == ELFCLASS32)
+ {
+ for (size_t i = 0; i < phnum; ++i)
+ if (consider_phdr (u->p32[i].p_type,
+ u->p32[i].p_vaddr,
+ u->p32[i].p_filesz))
+ break;
+ }
+ else
+ {
+ for (size_t i = 0; i < phnum; ++i)
+ if (consider_phdr (u->p64[i].p_type,
+ u->p64[i].p_vaddr,
+ u->p64[i].p_filesz))
+ break;
+ }
+ }
+
+ (*memory_callback) (dwfl, -1, &in.d_buf, &in.d_size, 0, 0,
+ memory_callback_arg);
+ }
+ else
+ /* We could not read the executable's phdrs from the
+ memory image. If we have a presupplied executable,
+ we can still use the AT_PHDR and AT_ENTRY values to
+ verify it, and to adjust its bias if it's a PIE.
+
+ If there was an ET_EXEC module presupplied that contains
+ the AT_PHDR address, then we only consider that one.
+ We'll either accept it if its phdr location and e_entry
+ make sense or reject it if they don't. If there is no
+ presupplied ET_EXEC, then look for a presupplied module,
+ which might be a PIE (ET_DYN) that needs its bias adjusted. */
+ r_debug_vaddr = ((phdr_mod == NULL
+ || phdr_mod->main.elf == NULL
+ || phdr_mod->e_type != ET_EXEC)
+ ? find_executable (dwfl, phdr, entry,
+ &elfclass, &elfdata,
+ memory_callback,
+ memory_callback_arg)
+ : consider_executable (phdr_mod, phdr, entry,
+ &elfclass, &elfdata,
+ memory_callback,
+ memory_callback_arg));
+ }
+
+ /* If we found PT_DYNAMIC, search it for DT_DEBUG. */
+ if (dyn_filesz != 0)
+ {
+ if (dyn_bias != (GElf_Addr) -1)
+ dyn_vaddr += dyn_bias;
+
+ Elf_Data in =
+ {
+ .d_type = ELF_T_DYN,
+ .d_version = EV_CURRENT,
+ .d_size = dyn_filesz,
+ .d_buf = NULL
+ };
+ int dyn_segndx = dwfl_addrsegment (dwfl, dyn_vaddr, NULL);
+ if ((*memory_callback) (dwfl, dyn_segndx, &in.d_buf, &in.d_size,
+ dyn_vaddr, dyn_filesz, memory_callback_arg))
+ {
+ union
+ {
+ Elf32_Dyn d32;
+ Elf64_Dyn d64;
+ char data[dyn_filesz];
+ } buf;
+ Elf_Data out =
+ {
+ .d_type = ELF_T_DYN,
+ .d_version = EV_CURRENT,
+ .d_size = dyn_filesz,
+ .d_buf = &buf
+ };
+ in.d_size = out.d_size;
+ if (likely ((elfclass == ELFCLASS32
+ ? elf32_xlatetom : elf64_xlatetom)
+ (&out, &in, elfdata) != NULL))
+ {
+ /* We are looking for DT_DEBUG. */
+ const union
+ {
+ Elf32_Dyn d32[dyn_filesz / sizeof (Elf32_Dyn)];
+ Elf64_Dyn d64[dyn_filesz / sizeof (Elf64_Dyn)];
+ } *u = (void *) &buf;
+ if (elfclass == ELFCLASS32)
+ {
+ size_t n = dyn_filesz / sizeof (Elf32_Dyn);
+ for (size_t i = 0; i < n; ++i)
+ if (u->d32[i].d_tag == DT_DEBUG)
+ {
+ r_debug_vaddr = u->d32[i].d_un.d_val;
+ break;
+ }
+ }
+ else
+ {
+ size_t n = dyn_filesz / sizeof (Elf64_Dyn);
+ for (size_t i = 0; i < n; ++i)
+ if (u->d64[i].d_tag == DT_DEBUG)
+ {
+ r_debug_vaddr = u->d64[i].d_un.d_val;
+ break;
+ }
+ }
+ }
+
+ (*memory_callback) (dwfl, -1, &in.d_buf, &in.d_size, 0, 0,
+ memory_callback_arg);
+ }
+ }
+ }
+ else
+ /* We have to look for a presupplied executable file to determine
+ the vaddr of its dynamic section and DT_DEBUG therein. */
+ r_debug_vaddr = find_executable (dwfl, 0, 0, &elfclass, &elfdata,
+ memory_callback, memory_callback_arg);
+
+ if (r_debug_vaddr == 0)
+ return 0;
+
+ /* For following pointers from struct link_map, we will use an
+ integrated memory access callback that can consult module text
+ elided from the core file. This is necessary when the l_name
+ pointer for the dynamic linker's own entry is a pointer into the
+ executable's .interp section. */
+ struct integrated_memory_callback mcb =
+ {
+ .memory_callback = memory_callback,
+ .memory_callback_arg = memory_callback_arg
+ };
+
+ /* Now we can follow the dynamic linker's library list. */
+ return report_r_debug (elfclass, elfdata, dwfl, r_debug_vaddr,
+ &integrated_memory_callback, &mcb);
+}
+INTDEF (dwfl_link_map_report)
diff --git a/libdwfl/linux-kernel-modules.c b/libdwfl/linux-kernel-modules.c
index b113806e..c30ff1a3 100644
--- a/libdwfl/linux-kernel-modules.c
+++ b/libdwfl/linux-kernel-modules.c
@@ -1,5 +1,5 @@
/* Standard libdwfl callbacks for debugging the running Linux kernel.
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -47,8 +47,12 @@
Network licensing program, please visit www.openinventionnetwork.com
<http://www.openinventionnetwork.com>. */
+/* We include this before config.h because it can't handle _FILE_OFFSET_BITS.
+ Everything we need here is fine if its declarations just come first. */
+
+#include <fts.h>
+
#include <config.h>
-#undef _FILE_OFFSET_BITS /* Doesn't jibe with fts. */
#include "libdwflP.h"
#include <inttypes.h>
@@ -60,7 +64,6 @@
#include <sys/utsname.h>
#include <fcntl.h>
#include <unistd.h>
-#include <fts.h>
#define KERNEL_MODNAME "kernel"
@@ -192,9 +195,9 @@ report_kernel (Dwfl *dwfl, const char **release,
fname, fd, 0);
if (mod == NULL)
result = -1;
-
- /* The kernel is ET_EXEC, but always treat it as relocatable. */
- mod->e_type = ET_DYN;
+ else
+ /* The kernel is ET_EXEC, but always treat it as relocatable. */
+ mod->e_type = ET_DYN;
}
if (!report || result < 0)
@@ -251,6 +254,29 @@ report_kernel_archive (Dwfl *dwfl, const char **release,
return result;
}
+static size_t
+check_suffix (const FTSENT *f, size_t namelen)
+{
+#define TRY(sfx) \
+ if ((namelen ? f->fts_namelen == namelen + sizeof sfx - 1 \
+ : f->fts_namelen >= sizeof sfx) \
+ && !memcmp (f->fts_name + f->fts_namelen - (sizeof sfx - 1), \
+ sfx, sizeof sfx)) \
+ return sizeof sfx - 1
+
+ TRY (".ko");
+#if USE_ZLIB
+ TRY (".ko.gz");
+#endif
+#if USE_BZLIB
+ TRY (".ko.bz2");
+#endif
+
+ return 0;
+
+#undef TRY
+}
+
/* Report a kernel and all its modules found on disk, for offline use.
If RELEASE starts with '/', it names a directory to look in;
if not, it names a directory to find under /lib/modules/;
@@ -281,7 +307,7 @@ dwfl_linux_kernel_report_offline (Dwfl *dwfl, const char *release,
return errno;
}
- FTS *fts = fts_open (modulesdir, FTS_NOSTAT, NULL);
+ FTS *fts = fts_open (modulesdir, FTS_NOSTAT | FTS_LOGICAL, NULL);
if (modulesdir[0] == (char *) release)
modulesdir[0] = NULL;
if (fts == NULL)
@@ -293,13 +319,23 @@ dwfl_linux_kernel_report_offline (Dwfl *dwfl, const char *release,
FTSENT *f;
while ((f = fts_read (fts)) != NULL)
{
+ /* Skip a "source" subtree, which tends to be large.
+ This insane hard-coding of names is what depmod does too. */
+ if (f->fts_namelen == sizeof "source" - 1
+ && !strcmp (f->fts_name, "source"))
+ {
+ fts_set (fts, f, FTS_SKIP);
+ continue;
+ }
+
switch (f->fts_info)
{
case FTS_F:
- case FTS_NSOK:
+ case FTS_SL:
+ case FTS_NSOK:;
/* See if this file name matches "*.ko". */
- if (f->fts_namelen > 3
- && !memcmp (f->fts_name + f->fts_namelen - 3, ".ko", 4))
+ const size_t suffix = check_suffix (f, 0);
+ if (suffix)
{
/* We have a .ko file to report. Following the algorithm
by which the kernel makefiles set KBUILD_MODNAME, we
@@ -309,13 +345,13 @@ dwfl_linux_kernel_report_offline (Dwfl *dwfl, const char *release,
names. To handle that, we would have to look at the
__this_module.name contents in the module's text. */
- char name[f->fts_namelen - 3 + 1];
+ char name[f->fts_namelen - suffix + 1];
for (size_t i = 0; i < f->fts_namelen - 3U; ++i)
if (f->fts_name[i] == '-' || f->fts_name[i] == ',')
name[i] = '_';
else
name[i] = f->fts_name[i];
- name[f->fts_namelen - 3] = '\0';
+ name[f->fts_namelen - suffix] = '\0';
if (predicate != NULL)
{
@@ -330,8 +366,7 @@ dwfl_linux_kernel_report_offline (Dwfl *dwfl, const char *release,
continue;
}
- if (dwfl_report_offline (dwfl, name,
- f->fts_path, -1) == NULL)
+ if (dwfl_report_offline (dwfl, name, f->fts_path, -1) == NULL)
{
result = -1;
break;
@@ -345,6 +380,7 @@ dwfl_linux_kernel_report_offline (Dwfl *dwfl, const char *release,
result = f->fts_errno;
break;
+ case FTS_SLNONE:
default:
continue;
}
@@ -375,41 +411,40 @@ intuit_kernel_bounds (Dwarf_Addr *start, Dwarf_Addr *end, Dwarf_Addr *notes)
char *line = NULL;
size_t linesz = 0;
- size_t n = getline (&line, &linesz, f);
- Dwarf_Addr first;
+ size_t n;
char *p = NULL;
- int result = 0;
- if (n > 0 && (first = strtoull (line, &p, 16)) > 0 && p > line)
- {
- Dwarf_Addr last = 0;
- while ((n = getline (&line, &linesz, f)) > 1 && line[n - 2] != ']')
- {
- p = NULL;
- last = strtoull (line, &p, 16);
- if (p == NULL || p == line || last == 0)
- {
- result = -1;
- break;
- }
+ const char *type;
- if (*notes == 0)
- {
- const char *sym = (strsep (&p, " \t\n")
- ? strsep (&p, " \t\n") : NULL);
- if (sym != NULL && !strcmp (sym, "__start_notes"))
- *notes = last;
- }
- }
- if ((n == 0 && feof_unlocked (f)) || (n > 1 && line[n - 2] == ']'))
- {
- Dwarf_Addr round_kernel = sysconf (_SC_PAGE_SIZE);
- first &= -(Dwarf_Addr) round_kernel;
- last += round_kernel - 1;
- last &= -(Dwarf_Addr) round_kernel;
- *start = first;
- *end = last;
- result = 0;
- }
+ inline bool read_address (Dwarf_Addr *addr)
+ {
+ if ((n = getline (&line, &linesz, f)) < 1 || line[n - 2] == ']')
+ return false;
+ *addr = strtoull (line, &p, 16);
+ p += strspn (p, " \t");
+ type = strsep (&p, " \t\n");
+ if (type == NULL)
+ return false;
+ return p != NULL && p != line;
+ }
+
+ int result;
+ do
+ result = read_address (start) ? 0 : -1;
+ while (result == 0 && strchr ("TtRr", *type) == NULL);
+
+ if (result == 0)
+ {
+ *end = *start;
+ while (read_address (end))
+ if (*notes == 0 && !strcmp (p, "__start_notes\n"))
+ *notes = *end;
+
+ Dwarf_Addr round_kernel = sysconf (_SC_PAGE_SIZE);
+ *start &= -(Dwarf_Addr) round_kernel;
+ *end += round_kernel - 1;
+ *end &= -(Dwarf_Addr) round_kernel;
+ if (*start >= *end || *end - *start < round_kernel)
+ result = -1;
}
free (line);
@@ -494,7 +529,7 @@ check_module_notes (Dwfl_Module *mod)
if (asprintf (&dirs[0], MODNOTESFMT, mod->name) < 0)
return ENOMEM;
- FTS *fts = fts_open (dirs, FTS_NOSTAT, NULL);
+ FTS *fts = fts_open (dirs, FTS_NOSTAT | FTS_LOGICAL, NULL);
if (fts == NULL)
{
free (dirs[0]);
@@ -508,6 +543,7 @@ check_module_notes (Dwfl_Module *mod)
switch (f->fts_info)
{
case FTS_F:
+ case FTS_SL:
case FTS_NSOK:
result = check_notes (mod, f->fts_accpath, 0, f->fts_name);
if (result > 0) /* Nothing found. */
@@ -523,6 +559,7 @@ check_module_notes (Dwfl_Module *mod)
break;
case FTS_NS:
+ case FTS_SLNONE:
default:
continue;
}
@@ -607,7 +644,7 @@ dwfl_linux_kernel_find_elf (Dwfl_Module *mod,
if (asprintf (&modulesdir[0], MODULEDIRFMT, release) < 0)
return -1;
- FTS *fts = fts_open (modulesdir, FTS_NOSTAT, NULL);
+ FTS *fts = fts_open (modulesdir, FTS_NOSTAT | FTS_LOGICAL, NULL);
if (fts == NULL)
{
free (modulesdir[0]);
@@ -653,14 +690,23 @@ dwfl_linux_kernel_find_elf (Dwfl_Module *mod,
int error = ENOENT;
while ((f = fts_read (fts)) != NULL)
{
+ /* Skip a "source" subtree, which tends to be large.
+ This insane hard-coding of names is what depmod does too. */
+ if (f->fts_namelen == sizeof "source" - 1
+ && !strcmp (f->fts_name, "source"))
+ {
+ fts_set (fts, f, FTS_SKIP);
+ continue;
+ }
+
error = ENOENT;
switch (f->fts_info)
{
case FTS_F:
+ case FTS_SL:
case FTS_NSOK:
/* See if this file name is "MODULE_NAME.ko". */
- if (f->fts_namelen == namelen + 3
- && !memcmp (f->fts_name + namelen, ".ko", 4)
+ if (check_suffix (f, namelen)
&& (!memcmp (f->fts_name, module_name, namelen)
|| !memcmp (f->fts_name, alternate_name, namelen)))
{
@@ -685,6 +731,7 @@ dwfl_linux_kernel_find_elf (Dwfl_Module *mod,
error = f->fts_errno;
break;
+ case FTS_SLNONE:
default:
break;
}
diff --git a/libdwfl/linux-proc-maps.c b/libdwfl/linux-proc-maps.c
index 60e9b58d..697e22a1 100644
--- a/libdwfl/linux-proc-maps.c
+++ b/libdwfl/linux-proc-maps.c
@@ -1,5 +1,5 @@
/* Standard libdwfl callbacks for debugging a live Linux process.
- Copyright (C) 2005, 2007 Red Hat, Inc.
+ Copyright (C) 2005-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -71,7 +71,7 @@
/* Search /proc/PID/auxv for the AT_SYSINFO_EHDR tag. */
static int
-find_sysinfo_ehdr (pid_t pid, GElf_Addr *sysinfo_ehdr)
+grovel_auxv (pid_t pid, Dwfl *dwfl, GElf_Addr *sysinfo_ehdr)
{
char *fname;
if (asprintf (&fname, PROCAUXVFMT, pid) < 0)
@@ -147,11 +147,17 @@ find_sysinfo_ehdr (pid_t pid, GElf_Addr *sysinfo_ehdr)
{
GElf_auxv_t auxv_mem;
GElf_auxv_t *auxv = gelf_getauxv (data, i, &auxv_mem);
- if (auxv != NULL && auxv->a_type == AT_SYSINFO_EHDR)
+ if (unlikely (auxv == NULL))
+ break;
+ if (auxv->a_type == AT_SYSINFO_EHDR)
{
*sysinfo_ehdr = auxv->a_un.a_val;
- break;
+ if (dwfl->segment_align > 1)
+ break;
}
+ else if (auxv->a_type == AT_PAGESZ
+ && dwfl->segment_align <= 1)
+ dwfl->segment_align = auxv->a_un.a_val;
}
//gelf_freedata (data);
@@ -179,12 +185,12 @@ proc_maps_report (Dwfl *dwfl, FILE *f, GElf_Addr sysinfo_ehdr, pid_t pid)
{
if (last_file != NULL)
{
- if (INTUSE(dwfl_report_module) (dwfl, last_file, low, high) == NULL)
- {
- free (last_file);
- return true;
- }
+ Dwfl_Module *mod = INTUSE(dwfl_report_module) (dwfl, last_file,
+ low, high);
+ free (last_file);
last_file = NULL;
+ if (unlikely (mod == NULL))
+ return true;
}
return false;
}
@@ -279,7 +285,7 @@ dwfl_linux_proc_report (Dwfl *dwfl, pid_t pid)
/* We'll notice the AT_SYSINFO_EHDR address specially when we hit it. */
GElf_Addr sysinfo_ehdr = 0;
- int result = find_sysinfo_ehdr (pid, &sysinfo_ehdr);
+ int result = grovel_auxv (pid, dwfl, &sysinfo_ehdr);
if (result != 0)
return result;
@@ -308,6 +314,9 @@ read_proc_memory (void *arg, void *data, GElf_Addr address,
{
const int fd = *(const int *) arg;
ssize_t nread = pread64 (fd, data, maxread, (off64_t) address);
+ /* Some kernels don't actually let us do this read, ignore those errors. */
+ if (nread < 0 && (errno == EINVAL || errno == EPERM))
+ return 0;
if (nread > 0 && (size_t) nread < minread)
nread = 0;
return nread;
diff --git a/libdwfl/lzma.c b/libdwfl/lzma.c
new file mode 100644
index 00000000..3edfdc22
--- /dev/null
+++ b/libdwfl/lzma.c
@@ -0,0 +1,4 @@
+/* liblzma is pretty close to zlib and bzlib. */
+
+#define LZMA
+#include "gzip.c"
diff --git a/libdwfl/offline.c b/libdwfl/offline.c
index ff7b793a..34aa9f84 100644
--- a/libdwfl/offline.c
+++ b/libdwfl/offline.c
@@ -1,5 +1,5 @@
/* Recover relocatibility for addresses computed from debug information.
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005, 2006, 2007, 2008, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -148,7 +148,7 @@ 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);
+ dwfl->offline_next_address, false);
if (mod != NULL)
{
/* If this is an ET_EXEC file with fixed addresses, the address range
@@ -259,16 +259,23 @@ process_archive (Dwfl *dwfl, const char *name, const char *file_name, int fd,
{
Dwfl_Module *mod = NULL;
+ Elf *member = elf_begin (fd, ELF_C_READ_MMAP_PRIVATE, archive);
+ if (unlikely (member == NULL)) /* Empty archive. */
+ {
+ __libdwfl_seterrno (DWFL_E_BADELF);
+ return NULL;
+ }
+
while (process_archive_member (dwfl, name, file_name, predicate,
- fd, elf_begin (fd, ELF_C_READ_MMAP_PRIVATE,
- archive), &mod) != ELF_C_NULL)
- ;
+ fd, member, &mod) != ELF_C_NULL)
+ member = elf_begin (fd, ELF_C_READ_MMAP_PRIVATE, archive);
/* We can drop the archive Elf handle even if we're still using members
in live modules. When the last module's elf_end on a member returns
zero, that module will close FD. If no modules survived the predicate,
we are all done with the file right here. */
- if (elf_end (archive) == 0)
+ if (mod != NULL /* If no modules, caller will clean up. */
+ && elf_end (archive) == 0)
close (fd);
return mod;
@@ -281,7 +288,13 @@ __libdwfl_report_offline (Dwfl *dwfl, const char *name,
int (*predicate) (const char *module,
const char *file))
{
- Elf *elf = elf_begin (fd, ELF_C_READ_MMAP_PRIVATE, NULL);
+ Elf *elf;
+ Dwfl_Error error = __libdw_open_file (&fd, &elf, closefd, true);
+ if (error != DWFL_E_NOERROR)
+ {
+ __libdwfl_seterrno (error);
+ return NULL;
+ }
Dwfl_Module *mod = process_file (dwfl, name, file_name, fd, elf, predicate);
if (mod == NULL)
{
diff --git a/libdwfl/open.c b/libdwfl/open.c
new file mode 100644
index 00000000..397af358
--- /dev/null
+++ b/libdwfl/open.c
@@ -0,0 +1,203 @@
+/* Decompression support for libdwfl: zlib (gzip) and/or bzlib (bzip2).
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#include "../libelf/libelfP.h"
+#undef _
+#include "libdwflP.h"
+
+#include <unistd.h>
+
+#if !USE_ZLIB
+# define __libdw_gunzip(...) false
+#endif
+
+#if !USE_BZLIB
+# define __libdw_bunzip2(...) false
+#endif
+
+#if !USE_LZMA
+# define __libdw_unlzma(...) false
+#endif
+
+/* Consumes and replaces *ELF only on success. */
+static Dwfl_Error
+decompress (int fd __attribute__ ((unused)), Elf **elf)
+{
+ Dwfl_Error error = DWFL_E_BADELF;
+ void *buffer = NULL;
+ size_t size = 0;
+
+#if USE_ZLIB || USE_BZLIB || USE_LZMA
+ const off64_t offset = (*elf)->start_offset;
+ void *const mapped = ((*elf)->map_address == NULL ? NULL
+ : (*elf)->map_address + offset);
+ const size_t mapped_size = (*elf)->maximum_size;
+ if (mapped_size == 0)
+ return error;
+
+ error = __libdw_gunzip (fd, offset, mapped, mapped_size, &buffer, &size);
+ if (error == DWFL_E_BADELF)
+ error = __libdw_bunzip2 (fd, offset, mapped, mapped_size, &buffer, &size);
+ if (error == DWFL_E_BADELF)
+ error = __libdw_unlzma (fd, offset, mapped, mapped_size, &buffer, &size);
+#endif
+
+ if (error == DWFL_E_NOERROR)
+ {
+ if (unlikely (size == 0))
+ {
+ error = DWFL_E_BADELF;
+ free (buffer);
+ }
+ else
+ {
+ Elf *memelf = elf_memory (buffer, size);
+ if (memelf == NULL)
+ {
+ error = DWFL_E_LIBELF;
+ free (buffer);
+ }
+ else
+ {
+ memelf->flags |= ELF_F_MALLOCED;
+ elf_end (*elf);
+ *elf = memelf;
+ }
+ }
+ }
+ else
+ free (buffer);
+
+ return error;
+}
+
+static Dwfl_Error
+what_kind (int fd, Elf **elfp, Elf_Kind *kind, bool *close_fd)
+{
+ Dwfl_Error error = DWFL_E_NOERROR;
+ *kind = elf_kind (*elfp);
+ if (unlikely (*kind == ELF_K_NONE))
+ {
+ if (unlikely (*elfp == NULL))
+ error = DWFL_E_LIBELF;
+ else
+ {
+ error = decompress (fd, elfp);
+ if (error == DWFL_E_NOERROR)
+ {
+ *close_fd = true;
+ *kind = elf_kind (*elfp);
+ }
+ }
+ }
+ return error;
+}
+
+Dwfl_Error internal_function
+__libdw_open_file (int *fdp, Elf **elfp, bool close_on_fail, bool archive_ok)
+{
+ bool close_fd = false;
+
+ Elf *elf = elf_begin (*fdp, ELF_C_READ_MMAP_PRIVATE, NULL);
+
+ Elf_Kind kind;
+ Dwfl_Error error = what_kind (*fdp, &elf, &kind, &close_fd);
+ if (error == DWFL_E_BADELF)
+ {
+ /* It's not an ELF file or a compressed file.
+ See if it's an image with a header preceding the real file. */
+
+ off64_t offset = elf->start_offset;
+ error = __libdw_image_header (*fdp, &offset,
+ (elf->map_address == NULL ? NULL
+ : elf->map_address + offset),
+ elf->maximum_size);
+ if (error == DWFL_E_NOERROR)
+ {
+ /* Pure evil. libelf needs some better interfaces. */
+ elf->kind = ELF_K_AR;
+ elf->state.ar.elf_ar_hdr.ar_name = "libdwfl is faking you out";
+ elf->state.ar.elf_ar_hdr.ar_size = elf->maximum_size - offset;
+ elf->state.ar.offset = offset - sizeof (struct ar_hdr);
+ Elf *subelf = elf_begin (-1, ELF_C_READ_MMAP_PRIVATE, elf);
+ elf->kind = ELF_K_NONE;
+ if (unlikely (subelf == NULL))
+ error = DWFL_E_LIBELF;
+ else
+ {
+ subelf->parent = NULL;
+ subelf->flags |= elf->flags & (ELF_F_MMAPPED | ELF_F_MALLOCED);
+ elf->flags &= ~(ELF_F_MMAPPED | ELF_F_MALLOCED);
+ elf_end (elf);
+ elf = subelf;
+ error = what_kind (*fdp, &elf, &kind, &close_fd);
+ }
+ }
+ }
+
+ if (error == DWFL_E_NOERROR
+ && kind != ELF_K_ELF
+ && !(archive_ok && kind == ELF_K_AR))
+ error = DWFL_E_BADELF;
+
+ if (error != DWFL_E_NOERROR)
+ {
+ elf_end (elf);
+ elf = NULL;
+ }
+
+ if (error == DWFL_E_NOERROR ? close_fd : close_on_fail)
+ {
+ close (*fdp);
+ *fdp = -1;
+ }
+
+ *elfp = elf;
+ return error;
+}
diff --git a/libdwfl/relocate.c b/libdwfl/relocate.c
index 6265f1bf..0075c7f9 100644
--- a/libdwfl/relocate.c
+++ b/libdwfl/relocate.c
@@ -1,5 +1,5 @@
/* Relocate debug information.
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -59,6 +59,8 @@ 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)
@@ -70,7 +72,7 @@ __libdwfl_relocate_value (Dwfl_Module *mod, Elf *elf, size_t *shstrndx,
address and update the section header. */
if (*shstrndx == SHN_UNDEF
- && unlikely (elf_getshstrndx (elf, shstrndx) < 0))
+ && unlikely (elf_getshdrstrndx (elf, shstrndx) < 0))
return DWFL_E_LIBELF;
const char *name = elf_strptr (elf, *shstrndx, refshdr->sh_name);
@@ -95,8 +97,10 @@ __libdwfl_relocate_value (Dwfl_Module *mod, Elf *elf, size_t *shstrndx,
return DWFL_E_LIBELF;
}
- /* Apply the adjustment. */
- *value += refshdr->sh_addr;
+ if (refshdr->sh_flags & SHF_ALLOC)
+ /* Apply the adjustment. */
+ *value += refshdr->sh_addr + mod->main.bias;
+
return DWFL_E_NOERROR;
}
@@ -183,11 +187,14 @@ relocate_getsym (Dwfl_Module *mod,
if (sym->st_shndx != SHN_XINDEX)
*shndx = sym->st_shndx;
- switch (*shndx)
+ switch (sym->st_shndx)
{
case SHN_ABS:
case SHN_UNDEF:
+ return DWFL_E_NOERROR;
+
case SHN_COMMON:
+ sym->st_value = 0; /* Value is size, not helpful. */
return DWFL_E_NOERROR;
}
@@ -263,9 +270,15 @@ resolve_symbol (Dwfl_Module *referer, struct reloc_symtab_cache *symtab,
continue;
/* We found it! */
- if (shndx == SHN_ABS)
+ if (shndx == SHN_ABS) /* XXX maybe should apply bias? */
return DWFL_E_NOERROR;
+ if (m->e_type != ET_REL)
+ {
+ sym->st_value += m->symfile->bias;
+ return DWFL_E_NOERROR;
+ }
+
/* 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;
@@ -292,6 +305,10 @@ relocate_section (Dwfl_Module *mod, Elf *relocated, const GElf_Ehdr *ehdr,
if (tname == NULL)
return DWFL_E_LIBELF;
+ if (unlikely (tshdr->sh_type == SHT_NOBITS) || unlikely (tshdr->sh_size == 0))
+ /* No contents to relocate. */
+ return DWFL_E_NOERROR;
+
if (debugscn && ! ebl_debugscn_p (mod->ebl, tname))
/* This relocation section is not for a debugging section.
Nothing to do here. */
@@ -306,6 +323,21 @@ relocate_section (Dwfl_Module *mod, Elf *relocated, const GElf_Ehdr *ehdr,
Dwfl_Error relocate (GElf_Addr offset, const GElf_Sxword *addend,
int rtype, int symndx)
{
+ /* First see if this is a reloc we can handle.
+ If we are skipping it, don't bother resolving the symbol. */
+
+ if (unlikely (rtype == 0))
+ /* In some odd situations, the linker can leave R_*_NONE relocs
+ behind. This is probably bogus ld -r behavior, but the only
+ cases it's known to appear in are harmless: DWARF data
+ referring to addresses in a section that has been discarded.
+ So we just pretend it's OK without further relocation. */
+ return DWFL_E_NOERROR;
+
+ Elf_Type type = ebl_reloc_simple_type (mod->ebl, rtype);
+ if (unlikely (type == ELF_T_NUM))
+ return DWFL_E_BADRELTYPE;
+
/* First, resolve the symbol to an absolute value. */
GElf_Addr value;
@@ -330,7 +362,8 @@ relocate_section (Dwfl_Module *mod, Elf *relocated, const GElf_Ehdr *ehdr,
{
/* Maybe we can figure it out anyway. */
error = resolve_symbol (mod, reloc_symtab, &sym, shndx);
- if (error != DWFL_E_NOERROR)
+ if (error != DWFL_E_NOERROR
+ && !(error == DWFL_E_RELUNDEF && shndx == SHN_COMMON))
return error;
}
@@ -342,7 +375,6 @@ relocate_section (Dwfl_Module *mod, Elf *relocated, const GElf_Ehdr *ehdr,
DO_TYPE (WORD, Word); DO_TYPE (SWORD, Sword); \
DO_TYPE (XWORD, Xword); DO_TYPE (SXWORD, Sxword)
size_t size;
- Elf_Type type = ebl_reloc_simple_type (mod->ebl, rtype);
switch (type)
{
#define DO_TYPE(NAME, Name) \
@@ -352,10 +384,6 @@ relocate_section (Dwfl_Module *mod, Elf *relocated, const GElf_Ehdr *ehdr,
TYPES;
#undef DO_TYPE
default:
- /* This might be because ebl_openbackend failed to find
- any libebl_CPU.so library. Diagnose that clearly. */
- if (ebl_get_elfmachine (mod->ebl) == EM_NONE)
- return DWFL_E_UNKNOWN_MACHINE;
return DWFL_E_BADRELTYPE;
}
@@ -437,6 +465,19 @@ relocate_section (Dwfl_Module *mod, Elf *relocated, const GElf_Ehdr *ehdr,
return DWFL_E_LIBELF;
Dwfl_Error result = DWFL_E_NOERROR;
+ bool first_badreltype = true;
+ inline void check_badreltype (void)
+ {
+ if (first_badreltype)
+ {
+ first_badreltype = false;
+ if (ebl_get_elfmachine (mod->ebl) == EM_NONE)
+ /* This might be because ebl_openbackend failed to find
+ any libebl_CPU.so library. Diagnose that clearly. */
+ result = DWFL_E_UNKNOWN_MACHINE;
+ }
+ }
+
size_t nrels = shdr->sh_size / shdr->sh_entsize;
size_t complete = 0;
if (shdr->sh_type == SHT_REL)
@@ -448,6 +489,7 @@ relocate_section (Dwfl_Module *mod, Elf *relocated, const GElf_Ehdr *ehdr,
result = relocate (r->r_offset, NULL,
GELF_R_TYPE (r->r_info),
GELF_R_SYM (r->r_info));
+ check_badreltype ();
if (partial)
switch (result)
{
@@ -476,6 +518,7 @@ relocate_section (Dwfl_Module *mod, Elf *relocated, const GElf_Ehdr *ehdr,
result = relocate (r->r_offset, &r->r_addend,
GELF_R_TYPE (r->r_info),
GELF_R_SYM (r->r_info));
+ check_badreltype ();
if (partial)
switch (result)
{
@@ -556,7 +599,7 @@ __libdwfl_relocate (Dwfl_Module *mod, Elf *debugfile, bool debug)
return DWFL_E_LIBELF;
size_t d_shstrndx;
- if (elf_getshstrndx (debugfile, &d_shstrndx) < 0)
+ if (elf_getshdrstrndx (debugfile, &d_shstrndx) < 0)
return DWFL_E_LIBELF;
RELOC_SYMTAB_CACHE (reloc_symtab);
@@ -600,7 +643,7 @@ __libdwfl_relocate_section (Dwfl_Module *mod, Elf *relocated,
RELOC_SYMTAB_CACHE (reloc_symtab);
size_t shstrndx;
- if (elf_getshstrndx (relocated, &shstrndx) < 0)
+ if (elf_getshdrstrndx (relocated, &shstrndx) < 0)
return DWFL_E_LIBELF;
return (__libdwfl_module_getebl (mod)
diff --git a/libdwfl/segment.c b/libdwfl/segment.c
new file mode 100644
index 00000000..9d78c87f
--- /dev/null
+++ b/libdwfl/segment.c
@@ -0,0 +1,350 @@
+/* Manage address space lookup table for libdwfl.
+ Copyright (C) 2008, 2009, 2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#include "libdwflP.h"
+
+static GElf_Addr
+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)
+{
+ if (dwfl->segment_align > 1)
+ end = (end + dwfl->segment_align - 1) & -dwfl->segment_align;
+ return end;
+}
+
+static bool
+insert (Dwfl *dwfl, size_t i, GElf_Addr start, GElf_Addr end, int segndx)
+{
+ bool need_start = (i == 0 || dwfl->lookup_addr[i - 1] != start);
+ bool need_end = (i >= dwfl->lookup_elts || dwfl->lookup_addr[i + 1] != end);
+ size_t need = need_start + need_end;
+ if (need == 0)
+ return false;
+
+ if (dwfl->lookup_alloc - dwfl->lookup_elts < need)
+ {
+ size_t n = dwfl->lookup_alloc == 0 ? 16 : dwfl->lookup_alloc * 2;
+ GElf_Addr *naddr = realloc (dwfl->lookup_addr, sizeof naddr[0] * n);
+ if (unlikely (naddr == NULL))
+ return true;
+ int *nsegndx = realloc (dwfl->lookup_segndx, sizeof nsegndx[0] * n);
+ if (unlikely (nsegndx == NULL))
+ {
+ if (naddr != dwfl->lookup_addr)
+ free (naddr);
+ return true;
+ }
+ dwfl->lookup_alloc = n;
+ dwfl->lookup_addr = naddr;
+ dwfl->lookup_segndx = nsegndx;
+
+ if (dwfl->lookup_module != NULL)
+ {
+ /* Make sure this array is big enough too. */
+ Dwfl_Module **old = dwfl->lookup_module;
+ dwfl->lookup_module = realloc (dwfl->lookup_module,
+ sizeof dwfl->lookup_module[0] * n);
+ if (unlikely (dwfl->lookup_module == NULL))
+ {
+ free (old);
+ return true;
+ }
+ }
+ }
+
+ if (unlikely (i < dwfl->lookup_elts))
+ {
+ const size_t move = dwfl->lookup_elts - i;
+ memmove (&dwfl->lookup_addr[i + need], &dwfl->lookup_addr[i],
+ move * sizeof dwfl->lookup_addr[0]);
+ memmove (&dwfl->lookup_segndx[i + need], &dwfl->lookup_segndx[i],
+ move * sizeof dwfl->lookup_segndx[0]);
+ if (dwfl->lookup_module != NULL)
+ memmove (&dwfl->lookup_module[i + need], &dwfl->lookup_module[i],
+ move * sizeof dwfl->lookup_module[0]);
+ }
+
+ if (need_start)
+ {
+ dwfl->lookup_addr[i] = start;
+ dwfl->lookup_segndx[i] = segndx;
+ if (dwfl->lookup_module != NULL)
+ dwfl->lookup_module[i] = NULL;
+ ++i;
+ }
+ else
+ dwfl->lookup_segndx[i - 1] = segndx;
+
+ if (need_end)
+ {
+ dwfl->lookup_addr[i] = end;
+ dwfl->lookup_segndx[i] = -1;
+ if (dwfl->lookup_module != NULL)
+ dwfl->lookup_module[i] = NULL;
+ }
+
+ dwfl->lookup_elts += need;
+
+ return false;
+}
+
+static int
+lookup (Dwfl *dwfl, GElf_Addr address, int hint)
+{
+ if (hint >= 0
+ && address >= dwfl->lookup_addr[hint]
+ && ((size_t) hint + 1 == dwfl->lookup_elts
+ || address < dwfl->lookup_addr[hint + 1]))
+ return hint;
+
+ /* Do binary search on the array indexed by module load address. */
+ size_t l = 0, u = dwfl->lookup_elts;
+ while (l < u)
+ {
+ size_t idx = (l + u) / 2;
+ if (address < dwfl->lookup_addr[idx])
+ u = idx;
+ else
+ {
+ l = idx + 1;
+ if (l == dwfl->lookup_elts || address < dwfl->lookup_addr[l])
+ return idx;
+ }
+ }
+
+ return -1;
+}
+
+static bool
+reify_segments (Dwfl *dwfl)
+{
+ int hint = -1;
+ int highest = -1;
+ bool fixup = false;
+ 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);
+ bool resized = false;
+
+ int idx = lookup (dwfl, start, hint);
+ if (unlikely (idx < 0))
+ {
+ /* Module starts below any segment. Insert a low one. */
+ if (unlikely (insert (dwfl, 0, start, end, -1)))
+ return true;
+ idx = 0;
+ resized = true;
+ }
+ else if (dwfl->lookup_addr[idx] > start)
+ {
+ /* The module starts in the middle of this segment. Split it. */
+ if (unlikely (insert (dwfl, idx + 1, start, end,
+ dwfl->lookup_segndx[idx])))
+ return true;
+ ++idx;
+ resized = true;
+ }
+ else if (dwfl->lookup_addr[idx] < start)
+ {
+ /* The module starts past the end of this segment.
+ Add a new one. */
+ if (unlikely (insert (dwfl, idx + 1, start, end, -1)))
+ return true;
+ ++idx;
+ resized = true;
+ }
+
+ if ((size_t) idx + 1 < dwfl->lookup_elts
+ && end < dwfl->lookup_addr[idx + 1])
+ {
+ /* The module ends in the middle of this segment. Split it. */
+ if (unlikely (insert (dwfl, idx + 1,
+ end, dwfl->lookup_addr[idx + 1], -1)))
+ return true;
+ resized = true;
+ }
+
+ if (dwfl->lookup_module == NULL)
+ {
+ dwfl->lookup_module = calloc (dwfl->lookup_alloc,
+ sizeof dwfl->lookup_module[0]);
+ if (unlikely (dwfl->lookup_module == NULL))
+ return true;
+ }
+
+ /* Cache a backpointer in the module. */
+ mod->segment = idx;
+
+ /* Put MOD in the table for each segment that's inside it. */
+ do
+ dwfl->lookup_module[idx++] = mod;
+ while ((size_t) idx < dwfl->lookup_elts
+ && dwfl->lookup_addr[idx] < end);
+ assert (dwfl->lookup_module[mod->segment] == mod);
+
+ if (resized && idx - 1 >= highest)
+ /* Expanding the lookup tables invalidated backpointers
+ we've already stored. Reset those ones. */
+ fixup = true;
+
+ highest = idx - 1;
+ hint = (size_t) idx < dwfl->lookup_elts ? idx : -1;
+ }
+
+ if (fixup)
+ /* Reset backpointer indices invalidated by table insertions. */
+ for (size_t idx = 0; idx < dwfl->lookup_elts; ++idx)
+ if (dwfl->lookup_module[idx] != NULL)
+ dwfl->lookup_module[idx]->segment = idx;
+
+ return false;
+}
+
+int
+dwfl_addrsegment (Dwfl *dwfl, Dwarf_Addr address, Dwfl_Module **mod)
+{
+ if (unlikely (dwfl == NULL))
+ return -1;
+
+ if (unlikely (dwfl->lookup_module == NULL)
+ && mod != NULL
+ && unlikely (reify_segments (dwfl)))
+ {
+ __libdwfl_seterrno (DWFL_E_NOMEM);
+ return -1;
+ }
+
+ int idx = lookup (dwfl, address, -1);
+ if (likely (mod != NULL))
+ {
+ if (unlikely (idx < 0) || unlikely (dwfl->lookup_module == NULL))
+ *mod = NULL;
+ else
+ {
+ *mod = dwfl->lookup_module[idx];
+
+ /* If this segment does not have a module, but the address is
+ the upper boundary of the previous segment's module, use that. */
+ if (*mod == NULL && idx > 0 && dwfl->lookup_addr[idx] == address)
+ {
+ *mod = dwfl->lookup_module[idx - 1];
+ if (*mod != NULL && (*mod)->high_addr != address)
+ *mod = NULL;
+ }
+ }
+ }
+
+ if (likely (idx >= 0))
+ /* Translate internal segment table index to user segment index. */
+ idx = dwfl->lookup_segndx[idx];
+
+ return idx;
+}
+INTDEF (dwfl_addrsegment)
+
+int
+dwfl_report_segment (Dwfl *dwfl, int ndx, const GElf_Phdr *phdr, GElf_Addr bias,
+ const void *ident)
+{
+ if (dwfl == NULL)
+ return -1;
+
+ if (ndx < 0)
+ ndx = dwfl->lookup_tail_ndx;
+
+ if (phdr->p_align > 1 && (dwfl->segment_align <= 1 ||
+ phdr->p_align < dwfl->segment_align))
+ dwfl->segment_align = phdr->p_align;
+
+ if (unlikely (dwfl->lookup_module != NULL))
+ {
+ free (dwfl->lookup_module);
+ 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);
+
+ /* Coalesce into the last one if contiguous and matching. */
+ if (ndx != dwfl->lookup_tail_ndx
+ || ident == NULL
+ || ident != dwfl->lookup_tail_ident
+ || start != dwfl->lookup_tail_vaddr
+ || phdr->p_offset != dwfl->lookup_tail_offset)
+ {
+ /* Normally just appending keeps us sorted. */
+
+ size_t i = dwfl->lookup_elts;
+ while (i > 0 && unlikely (start < dwfl->lookup_addr[i - 1]))
+ --i;
+
+ if (unlikely (insert (dwfl, i, start, end, ndx)))
+ {
+ __libdwfl_seterrno (DWFL_E_NOMEM);
+ return -1;
+ }
+ }
+
+ dwfl->lookup_tail_ident = ident;
+ dwfl->lookup_tail_vaddr = end;
+ dwfl->lookup_tail_offset = end - bias - phdr->p_vaddr + phdr->p_offset;
+ dwfl->lookup_tail_ndx = ndx + 1;
+
+ return ndx;
+}
+INTDEF (dwfl_report_segment)
diff --git a/libebl/ChangeLog b/libebl/ChangeLog
index 86c91781..ed9361c1 100644
--- a/libebl/ChangeLog
+++ b/libebl/ChangeLog
@@ -1,3 +1,122 @@
+2010-02-15 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am: Use config/eu.am for common stuff.
+
+2010-01-04 Roland McGrath <roland@redhat.com>
+
+ * eblcorenote.c (ebl_core_note): Take GElf_Nhdr * and name data
+ pointer instead of only n_type and n_descsz.
+ * libebl.h: Update declaration.
+ * ebl-hooks.h: Update core_note hook signature.
+ * eblopenbackend.c (default_core_note): Likewise.
+
+2009-10-14 Roland McGrath <roland@redhat.com>
+
+ * eblobjnote.c (ebl_object_note): Clean up NT_GNU_GOLD_VERSION printing.
+
+2009-10-05 Roland McGrath <roland@redhat.com>
+
+ * eblopenbackend.c (default_debugscn_p): Match .debug_pubtypes and
+ .debug_types too.
+
+2009-09-02 Petr Machata <pmachata@redhat.com>
+
+ * libebl/eblstrtab.c (morememory): Allocate memory in multiples of
+ pagesize.
+
+2009-08-06 Petr Machata <pmachata@redhat.com>
+
+ * libebl/eblstrtab.c (ebl_strtabfinalize): Only call copystrings
+ if we have any strings to copy.
+
+2009-07-26 Mark Wielaard <mjw@redhat.com>
+
+ * eblobjnote.c (ebl_object_note): Handle NT_GNU_GOLD_VERSION.
+
+ * eblobjnotetypename.c (ebl_object_note_type_name): Recognize
+ NT_GNU_GOLD_VERSION.
+
+2009-07-08 Roland McGrath <roland@redhat.com>
+
+ * ebl-hooks.h: Add abi_cfi hook.
+ * eblopenbackend.c (default_abi_cfi): New function.
+ (fill_defaults): Add initializer.
+ * eblabicfi.c: New file.
+ * Makefile.am (gen_SOURCES): Add it.
+ * libebl.h: Declare ebl_abi_cfi.
+
+2009-07-08 Ulrich Drepper <drepper@redhat.com>
+
+ * eblsymbolbindingname.c (ebl_symbol_binding_name): Handle
+ STB_GNU_UNIQUE.
+
+ * eblsymboltypename.c (ebl_symbol_type_name): Only handle STT_GNU_IFUNC
+ if the binary is marked as being for Linux.
+
+2009-04-01 Roland McGrath <roland@redhat.com>
+
+ * eblsymboltypename.c (ebl_symbol_type_name): Add STT_GNU_IFUNC.
+
+ * eblauxvinfo.c (AUXV_TYPES): Add RANDOM and BASE_PLATFORM.
+
+2009-02-01 Ulrich Drepper <drepper@redhat.com>
+
+ * eblreloctypename.c (ebl_reloc_type_name): Return "<INVALID RELOC>"
+ instead of "???" for invalid relocations.
+
+2008-08-01 Roland McGrath <roland@redhat.com>
+
+ * eblcorenotetypename.c: Handle NT_386_IOPERM.
+
+2008-07-28 Roland McGrath <roland@redhat.com>
+
+ * eblauxvinfo.c (AUXV_TYPES): Add EXECFN.
+
+ * eblauxvinfo.c (ebl_auxv_info): Handle missing elements of standard
+ table.
+
+2008-07-04 Roland McGrath <roland@redhat.com>
+
+ * libebl.h: Declare ebl_syscall_abi.
+ * ebl_syscall_abi.c: New file.
+ * Makefile.am (gen_SOURCES): Add it.
+ * ebl-hooks.h: New hook syscall_abi.
+ * eblopenbackend.c (default_syscall_abi): New function.
+ (fill_defaults): Use it.
+
+2008-03-31 Roland McGrath <roland@redhat.com>
+
+ * ebldynamictagname.c (ebl_dynamic_tag_name): Use hex for unknown tag.
+
+ * ebl-hooks.h: Add check_special_section hook.
+ * eblopenbackend.c (fill_defaults): Set new hook to ...
+ (default_check_special_section): ... this, new function.
+ * ebl_check_special_section.c: New file.
+ * Makefile.am (gen_SOURCES): Add it.
+ * libebl.h: Declare it.
+
+2008-02-20 Roland McGrath <roland@redhat.com>
+
+ * libebl.h: Declare ebl_check_object_attribute.
+ * eblcheckobjattr.c: New file.
+ * Makefile.am (gen_SOURCES): Add it.
+ * ebl-hooks.h: Add check_object_attribute hook.
+ * eblopenbackend.c (default_check_object_attribute): New function.
+ (fill_defaults): Initialize pointer to it.
+
+2008-02-19 Roland McGrath <roland@redhat.com>
+
+ * eblsectiontypename.c (ebl_section_type_name):
+ Handle SHT_GNU_ATTRIBUTES.
+
+2008-02-08 Roland McGrath <roland@redhat.com>
+
+ * eblcorenotetypename.c (ebl_core_note_type_name): Handle NT_PPC_SPE.
+
+2008-01-30 Roland McGrath <roland@redhat.com>
+
+ * eblcorenotetypename.c (ebl_core_note_type_name): Handle NT_386_TLS.
+
2007-10-18 Roland McGrath <roland@redhat.com>
* eblcorenotetypename.c (ebl_core_note_type_name): Handle NT_PPC_VMX.
diff --git a/libebl/Makefile.am b/libebl/Makefile.am
index 993800ca..d157195e 100644
--- a/libebl/Makefile.am
+++ b/libebl/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to create Makefile.in
##
-## Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
+## Copyright (C) 2000-2010 Red Hat, Inc.
## This file is part of Red Hat elfutils.
##
## Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -24,19 +24,10 @@
## Network licensing program, please visit www.openinventionnetwork.com
## <http://www.openinventionnetwork.com>.
##
-DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H -DOBJDIR=\"$(shell pwd)\"
-if MUDFLAP
-AM_CFLAGS = -fmudflap
-else
-AM_CFLAGS =
-endif
-AM_CFLAGS += -fpic -Wall -Wshadow -Werror -Wunused -Wextra -Wformat=2 \
- -std=gnu99
-
-INCLUDES = -I$(srcdir) -I$(top_srcdir)/libelf -I$(top_srcdir)/libdw \
- -I$(top_srcdir)/lib -I..
+include $(top_srcdir)/config/eu.am
+AM_CFLAGS += -fpic
+INCLUDES += -I$(srcdir)/../libelf -I$(srcdir)/../libdw -I$(srcdir)/../libasm
VERSION = 1
-PACKAGE_VERSION = @PACKAGE_VERSION@
LIBEBL_SUBDIR = @LIBEBL_SUBDIR@
lib_LIBRARIES = libebl.a
@@ -58,19 +49,11 @@ gen_SOURCES = eblopenbackend.c eblclosebackend.c eblstrtab.c \
eblelfclass.c eblelfdata.c eblelfmachine.c \
ebl_check_special_symbol.c eblbsspltp.c eblretval.c \
eblreginfo.c eblnonerelocp.c eblrelativerelocp.c \
- eblsysvhashentrysize.c eblauxvinfo.c
+ eblsysvhashentrysize.c eblauxvinfo.c eblcheckobjattr.c \
+ ebl_check_special_section.c ebl_syscall_abi.c eblabicfi.c
libebl_a_SOURCES = $(gen_SOURCES)
-
-%.os: %.c %.o
- if $(COMPILE) -c -o $@ -fpic -DPIC -DSHARED -MT $@ -MD -MP \
- -MF "$(DEPDIR)/$*.Tpo" `test -f '$<' || echo '$(srcdir)/'`$<; \
- then cat "$(DEPDIR)/$*.Tpo" >> "$(DEPDIR)/$*.Po"; \
- rm -f "$(DEPDIR)/$*.Tpo"; \
- else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
- fi
-
noinst_HEADERS = libeblP.h ebl-hooks.h
-CLEANFILES = $(am_libebl_pic_a_OBJECTS) *.gcno *.gcda
+CLEANFILES += $(am_libebl_pic_a_OBJECTS)
diff --git a/libebl/ebl-hooks.h b/libebl/ebl-hooks.h
index d466a1f3..59e73c54 100644
--- a/libebl/ebl-hooks.h
+++ b/libebl/ebl-hooks.h
@@ -1,5 +1,5 @@
/* Backend hook signatures internal interface for libebl.
- Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2000-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -83,6 +83,12 @@ bool EBLHOOK(machine_flag_check) (GElf_Word);
/* Check whether SHF_MASKPROC flag bits are valid. */
bool EBLHOOK(machine_section_flag_check) (GElf_Xword);
+/* Check whether the section with the given index, header, and name
+ is a special machine section that is valid despite a combination
+ of flags or other details that are not generically valid. */
+bool EBLHOOK(check_special_section) (Ebl *, int,
+ const GElf_Shdr *, const char *);
+
/* Return symbolic representation of symbol type. */
const char *EBLHOOK(symbol_type_name) (int, char *, size_t);
@@ -108,13 +114,17 @@ const char *EBLHOOK(core_note_type_name) (uint32_t, char *, size_t);
const char *EBLHOOK(object_note_type_name) (uint32_t, char *, size_t);
/* Describe core note format. */
-int EBLHOOK(core_note) (GElf_Word, GElf_Word, GElf_Word *, size_t *,
- const Ebl_Register_Location **,
+int EBLHOOK(core_note) (const GElf_Nhdr *, const char *,
+ GElf_Word *, size_t *, const Ebl_Register_Location **,
size_t *, const Ebl_Core_Item **);
/* Handle object file note. */
bool EBLHOOK(object_note) (const char *, uint32_t, uint32_t, const char *);
+/* Check object attribute. */
+bool EBLHOOK(check_object_attribute) (Ebl *, const char *, int, uint64_t,
+ const char **, const char **);
+
/* Describe auxv element type. */
int EBLHOOK(auxv_info) (GElf_Xword, const char **, const char **);
@@ -148,6 +158,17 @@ ssize_t EBLHOOK(register_info) (Ebl *ebl,
const char **prefix, const char **setname,
int *bits, int *type);
+/* Return system call ABI registers. */
+int EBLHOOK(syscall_abi) (Ebl *ebl, int *sp, int *pc,
+ int *callno, int args[6]);
+
+/* Disassembler function. */
+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. */
+int EBLHOOK(abi_cfi) (Ebl *ebl, Dwarf_CIE *abi_info);
/* Destructor for ELF backend handle. */
void EBLHOOK(destr) (struct ebl *);
diff --git a/libebl/ebl_check_special_section.c b/libebl/ebl_check_special_section.c
new file mode 100644
index 00000000..d1f3c6e3
--- /dev/null
+++ b/libebl/ebl_check_special_section.c
@@ -0,0 +1,65 @@
+/* Check for a special section allowed to violate generic constraints.
+ Copyright (C) 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+bool
+ebl_check_special_section (ebl, ndx, shdr, sname)
+ Ebl *ebl;
+ int ndx;
+ const GElf_Shdr *shdr;
+ const char *sname;
+{
+ return ebl != NULL && ebl->check_special_section (ebl, ndx, shdr, sname);
+}
diff --git a/libebl/ebl_syscall_abi.c b/libebl/ebl_syscall_abi.c
new file mode 100644
index 00000000..2d9a26b6
--- /dev/null
+++ b/libebl/ebl_syscall_abi.c
@@ -0,0 +1,66 @@
+/* Return system call ABI mapped to DWARF register numbers.
+ Copyright (C) 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+int
+ebl_syscall_abi (ebl, sp, pc, callno, args)
+ Ebl *ebl;
+ int *sp;
+ int *pc;
+ int *callno;
+ int args[6];
+{
+ return ebl != NULL ? ebl->syscall_abi (ebl, sp, pc, callno, args) : -1;
+}
diff --git a/libebl/eblabicfi.c b/libebl/eblabicfi.c
new file mode 100644
index 00000000..221e83fc
--- /dev/null
+++ b/libebl/eblabicfi.c
@@ -0,0 +1,63 @@
+/* Return ABI-specific DWARF CFI details.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <libeblP.h>
+
+
+int
+ebl_abi_cfi (ebl, abi_info)
+ Ebl *ebl;
+ Dwarf_CIE *abi_info;
+{
+ return ebl == NULL ? -1 : ebl->abi_cfi (ebl, abi_info);
+}
diff --git a/libebl/eblauxvinfo.c b/libebl/eblauxvinfo.c
index 54583f9f..6e02403f 100644
--- a/libebl/eblauxvinfo.c
+++ b/libebl/eblauxvinfo.c
@@ -1,5 +1,5 @@
/* Describe known auxv types.
- Copyright (C) 2007 Red Hat, Inc.
+ Copyright (C) 2007, 2008, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -63,6 +63,7 @@
TYPE (NULL, "") \
TYPE (IGNORE, "") \
TYPE (EXECFD, "d") \
+ TYPE (EXECFN, "s") \
TYPE (PHDR, "p") \
TYPE (PHENT, "u") \
TYPE (PHNUM, "u") \
@@ -77,6 +78,7 @@
TYPE (EGID, "u") \
TYPE (CLKTCK, "u") \
TYPE (PLATFORM, "s") \
+ TYPE (BASE_PLATFORM, "s") \
TYPE (HWCAP, "x") \
TYPE (FPUCW, "x") \
TYPE (DCACHEBSIZE, "d") \
@@ -89,7 +91,8 @@
TYPE (L1I_CACHESHAPE, "d") \
TYPE (L1D_CACHESHAPE, "d") \
TYPE (L2_CACHESHAPE, "d") \
- TYPE (L3_CACHESHAPE, "d")
+ TYPE (L3_CACHESHAPE, "d") \
+ TYPE (RANDOM, "p")
static const struct
{
@@ -110,7 +113,7 @@ ebl_auxv_info (ebl, a_type, name, format)
const char **format;
{
int result = ebl->auxv_info (a_type, name, format);
- if (result == 0 && a_type < nauxv_types)
+ if (result == 0 && a_type < nauxv_types && auxv_types[a_type].name != NULL)
{
/* The machine specific function did not know this type. */
*name = auxv_types[a_type].name;
diff --git a/libebl/eblcheckobjattr.c b/libebl/eblcheckobjattr.c
new file mode 100644
index 00000000..fe75de74
--- /dev/null
+++ b/libebl/eblcheckobjattr.c
@@ -0,0 +1,81 @@
+/* Check object attributes.
+ Copyright (C) 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+#include <libeblP.h>
+
+
+bool
+ebl_check_object_attribute (ebl, vendor, tag, value, tag_name, value_name)
+ Ebl *ebl;
+ const char *vendor;
+ int tag;
+ uint64_t value;
+ const char **tag_name;
+ const char **value_name;
+{
+ if (ebl->check_object_attribute (ebl, vendor, tag, value,
+ tag_name, value_name))
+ return true;
+
+ if (strcmp (vendor, "gnu"))
+ return false;
+
+ if (tag == 32)
+ {
+ *tag_name = "compatibility";
+ return true;
+ }
+
+ return false;
+}
diff --git a/libebl/eblcorenote.c b/libebl/eblcorenote.c
index 553d5ba9..7549ca61 100644
--- a/libebl/eblcorenote.c
+++ b/libebl/eblcorenote.c
@@ -1,5 +1,5 @@
/* Describe known core note formats.
- Copyright (C) 2007 Red Hat, Inc.
+ Copyright (C) 2007, 2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -61,19 +61,19 @@
int
-ebl_core_note (ebl, n_type, descsz,
+ebl_core_note (ebl, nhdr, name,
regs_offset, nregloc, reglocs, nitems, items)
Ebl *ebl;
- GElf_Word n_type;
- GElf_Word descsz;
+ const GElf_Nhdr *nhdr;
+ const char *name;
GElf_Word *regs_offset;
size_t *nregloc;
const Ebl_Register_Location **reglocs;
size_t *nitems;
const Ebl_Core_Item **items;
{
- int result = ebl->core_note (n_type, descsz, regs_offset, nregloc, reglocs,
- nitems, items);
+ int result = ebl->core_note (nhdr, name,
+ regs_offset, nregloc, reglocs, nitems, items);
if (result == 0)
{
/* The machine specific function did not know this type. */
@@ -81,7 +81,7 @@ ebl_core_note (ebl, n_type, descsz,
*regs_offset = 0;
*nregloc = 0;
*reglocs = NULL;
- switch (n_type)
+ switch (nhdr->n_type)
{
#define ITEMS(type, table) \
case type: \
diff --git a/libebl/eblcorenotetypename.c b/libebl/eblcorenotetypename.c
index 44b02376..9376cf57 100644
--- a/libebl/eblcorenotetypename.c
+++ b/libebl/eblcorenotetypename.c
@@ -1,5 +1,5 @@
/* Return note type name.
- Copyright (C) 2002, 2007 Red Hat, Inc.
+ Copyright (C) 2002, 2007, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -56,7 +56,6 @@
#include <stdio.h>
#include <libeblP.h>
-
const char *
ebl_core_note_type_name (ebl, type, buf, len)
Ebl *ebl;
@@ -99,6 +98,9 @@ ebl_core_note_type_name (ebl, type, buf, len)
#define KNOWNSTYPE(name) case NT_##name: res = #name; break
KNOWNSTYPE (PRXFPREG);
KNOWNSTYPE (PPC_VMX);
+ KNOWNSTYPE (PPC_SPE);
+ KNOWNSTYPE (386_TLS);
+ KNOWNSTYPE (386_IOPERM);
#undef KNOWNSTYPE
default:
diff --git a/libebl/ebldynamictagname.c b/libebl/ebldynamictagname.c
index d9aa7df0..e0972ede 100644
--- a/libebl/ebldynamictagname.c
+++ b/libebl/ebldynamictagname.c
@@ -1,5 +1,5 @@
/* Return dynamic tag name.
- Copyright (C) 2001, 2002, 2006 Red Hat, Inc.
+ Copyright (C) 2001, 2002, 2006, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -123,7 +123,7 @@ ebl_dynamic_tag_name (ebl, tag, buf, len)
res = "FILTER";
else
{
- snprintf (buf, len, gettext ("<unknown>: %" PRId64), tag);
+ snprintf (buf, len, gettext ("<unknown>: %#" PRIx64), tag);
res = buf;
diff --git a/libebl/eblobjnote.c b/libebl/eblobjnote.c
index 836ac8dc..b56c6cbc 100644
--- a/libebl/eblobjnote.c
+++ b/libebl/eblobjnote.c
@@ -1,5 +1,5 @@
/* Print contents of object file note.
- Copyright (C) 2002, 2007 Red Hat, Inc.
+ Copyright (C) 2002, 2007, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -81,6 +81,13 @@ ebl_object_note (ebl, name, type, descsz, desc)
}
break;
+ case NT_GNU_GOLD_VERSION:
+ if (strcmp (name, "GNU") == 0 && descsz > 0)
+ /* A non-null terminated version string. */
+ printf (gettext (" Linker version: %.*s\n"),
+ (int) descsz, desc);
+ break;
+
case NT_GNU_ABI_TAG:
if (strcmp (name, "GNU") == 0 && descsz >= 8 && descsz % 4 == 0)
{
diff --git a/libebl/eblobjnotetypename.c b/libebl/eblobjnotetypename.c
index ff9330f9..8e99dbb4 100644
--- a/libebl/eblobjnotetypename.c
+++ b/libebl/eblobjnotetypename.c
@@ -1,5 +1,5 @@
/* Return note type name.
- Copyright (C) 2002, 2007 Red Hat, Inc.
+ Copyright (C) 2002, 2007, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -74,6 +74,7 @@ ebl_object_note_type_name (ebl, type, buf, len)
KNOWNSTYPE (VERSION),
KNOWNSTYPE (GNU_HWCAP),
KNOWNSTYPE (GNU_BUILD_ID),
+ KNOWNSTYPE (GNU_GOLD_VERSION),
};
/* Handle standard names. */
diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c
index 63e64a10..edd8c4a7 100644
--- a/libebl/eblopenbackend.c
+++ b/libebl/eblopenbackend.c
@@ -1,5 +1,5 @@
/* Generate ELF backend handle.
- Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2000-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -186,7 +186,7 @@ static const char *default_core_note_type_name (uint32_t, char *buf,
size_t len);
static const char *default_object_note_type_name (uint32_t, char *buf,
size_t len);
-static int default_core_note (GElf_Word n_type, GElf_Word descsz,
+static int default_core_note (const GElf_Nhdr *nhdr, const char *name,
GElf_Word *regs_offset, size_t *nregloc,
const Ebl_Register_Location **reglocs,
size_t *nitems, const Ebl_Core_Item **);
@@ -202,6 +202,8 @@ static bool default_check_special_symbol (Elf *elf, GElf_Ehdr *ehdr,
const GElf_Sym *sym,
const char *name,
const GElf_Shdr *destshdr);
+static bool default_check_special_section (Ebl *, int,
+ const GElf_Shdr *, const char *);
static bool default_bss_plt_p (Elf *elf, GElf_Ehdr *ehdr);
static int default_return_value_location (Dwarf_Die *functypedie,
const Dwarf_Op **locops);
@@ -210,6 +212,13 @@ static ssize_t default_register_info (Ebl *ebl,
const char **prefix,
const char **setname,
int *bits, int *type);
+static int default_syscall_abi (Ebl *ebl, int *sp, int *pc,
+ int *callno, int args[6]);
+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 int default_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info);
static void
@@ -227,6 +236,7 @@ fill_defaults (Ebl *result)
result->machine_flag_name = default_machine_flag_name;
result->machine_flag_check = default_machine_flag_check;
result->machine_section_flag_check = default_machine_section_flag_check;
+ result->check_special_section = default_check_special_section;
result->symbol_type_name = default_symbol_type_name;
result->symbol_binding_name = default_symbol_binding_name;
result->dynamic_tag_name = default_dynamic_tag_name;
@@ -246,6 +256,10 @@ fill_defaults (Ebl *result)
result->bss_plt_p = default_bss_plt_p;
result->return_value_location = default_return_value_location;
result->register_info = default_register_info;
+ result->syscall_abi = default_syscall_abi;
+ result->check_object_attribute = default_check_object_attribute;
+ result->disasm = NULL;
+ result->abi_cfi = default_abi_cfi;
result->destr = default_destr;
result->sysvhash_entrysize = sizeof (Elf32_Word);
}
@@ -515,6 +529,15 @@ default_machine_section_flag_check (GElf_Xword flags)
return flags == 0;
}
+static bool
+default_check_special_section (Ebl *ebl __attribute__ ((unused)),
+ int ndx __attribute__ ((unused)),
+ const GElf_Shdr *shdr __attribute__ ((unused)),
+ const char *sname __attribute__ ((unused)))
+{
+ return false;
+}
+
static const char *
default_symbol_type_name (int ignore __attribute__ ((unused)),
char *buf __attribute__ ((unused)),
@@ -581,8 +604,8 @@ default_auxv_info (GElf_Xword a_type __attribute__ ((unused)),
}
static int
-default_core_note (GElf_Word n_type __attribute__ ((unused)),
- GElf_Word descsz __attribute__ ((unused)),
+default_core_note (const GElf_Nhdr *nhdr __attribute__ ((unused)),
+ const char *name __attribute__ ((unused)),
GElf_Word *ro __attribute__ ((unused)),
size_t *nregloc __attribute__ ((unused)),
const Ebl_Register_Location **reglocs
@@ -636,6 +659,9 @@ default_debugscn_p (const char *name)
".debug_macinfo",
/* DWARF 3 */
".debug_ranges",
+ ".debug_pubtypes",
+ /* DWARF 4 */
+ ".debug_types",
/* SGI/MIPS DWARF 2 extensions */
".debug_weaknames",
".debug_funcnames",
@@ -699,3 +725,36 @@ default_register_info (Ebl *ebl __attribute__ ((unused)),
*type = DW_ATE_void;
return snprintf (name, namelen, "reg%d", regno);
}
+
+static int
+default_syscall_abi (Ebl *ebl __attribute__ ((unused)),
+ int *sp, int *pc, int *callno, int args[6])
+{
+ *sp = *pc = *callno = -1;
+ args[0] = -1;
+ args[1] = -1;
+ args[2] = -1;
+ args[3] = -1;
+ args[4] = -1;
+ args[5] = -1;
+ return -1;
+}
+
+static bool
+default_check_object_attribute (Ebl *ebl __attribute__ ((unused)),
+ const char *vendor __attribute__ ((unused)),
+ int tag __attribute__ ((unused)),
+ uint64_t value __attribute__ ((unused)),
+ const char **tag_name, const char **value_name)
+{
+ *tag_name = NULL;
+ *value_name = NULL;
+ return false;
+}
+
+static int
+default_abi_cfi (Ebl *ebl __attribute__ ((unused)),
+ Dwarf_CIE *abi_info __attribute__ ((unused)))
+{
+ return 0;
+}
diff --git a/libebl/eblreloctypename.c b/libebl/eblreloctypename.c
index c715b064..3f2c7d9c 100644
--- a/libebl/eblreloctypename.c
+++ b/libebl/eblreloctypename.c
@@ -1,5 +1,5 @@
/* Return relocation type name.
- Copyright (C) 2001, 2002 Red Hat, Inc.
+ Copyright (C) 2001, 2002, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -68,7 +68,7 @@ ebl_reloc_type_name (ebl, reloc, buf, len)
res = ebl != NULL ? ebl->reloc_type_name (reloc, buf, len) : NULL;
if (res == NULL)
/* There are no generic relocation type names. */
- res = "???";
+ res = "<INVALID RELOC>";
return res;
}
diff --git a/libebl/eblsectiontypename.c b/libebl/eblsectiontypename.c
index b62c37b3..a37e5f6d 100644
--- a/libebl/eblsectiontypename.c
+++ b/libebl/eblsectiontypename.c
@@ -1,5 +1,5 @@
/* Return section type name.
- Copyright (C) 2001, 2002, 2006 Red Hat, Inc.
+ Copyright (C) 2001, 2002, 2006, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -110,31 +110,38 @@ ebl_section_type_name (ebl, section, buf, len)
res = sunwtypes[section - SHT_LOSUNW];
}
else
- {
- /* A few GNU additions. */
- if (section == SHT_CHECKSUM)
+ /* A few GNU additions. */
+ switch (section)
+ {
+ case SHT_CHECKSUM:
res = "CHECKSUM";
- else if (section == SHT_GNU_LIBLIST)
+ break;
+ case SHT_GNU_LIBLIST:
res = "GNU_LIBLIST";
- else if (section == SHT_GNU_HASH)
+ break;
+ case SHT_GNU_HASH:
res = "GNU_HASH";
- /* Handle OS-specific section names. */
- else
- {
- if (section >= SHT_LOOS && section <= SHT_HIOS)
- snprintf (buf, len, "SHT_LOOS+%x", section - SHT_LOOS);
- /* Handle processor-specific section names. */
- else if (section >= SHT_LOPROC && section <= SHT_HIPROC)
- snprintf (buf, len, "SHT_LOPROC+%x", section - SHT_LOPROC);
- else if ((unsigned int) section >= SHT_LOUSER
- && (unsigned int) section <= SHT_HIUSER)
- snprintf (buf, len, "SHT_LOUSER+%x", section - SHT_LOUSER);
- else
- snprintf (buf, len, "%s: %d", gettext ("<unknown>"), section);
+ break;
+ case SHT_GNU_ATTRIBUTES:
+ res = "GNU_ATTRIBUTES";
+ break;
- res = buf;
- }
- }
+ default:
+ /* Handle OS-specific section names. */
+ if (section >= SHT_LOOS && section <= SHT_HIOS)
+ snprintf (buf, len, "SHT_LOOS+%x", section - SHT_LOOS);
+ /* Handle processor-specific section names. */
+ else if (section >= SHT_LOPROC && section <= SHT_HIPROC)
+ snprintf (buf, len, "SHT_LOPROC+%x", section - SHT_LOPROC);
+ else if ((unsigned int) section >= SHT_LOUSER
+ && (unsigned int) section <= SHT_HIUSER)
+ snprintf (buf, len, "SHT_LOUSER+%x", section - SHT_LOUSER);
+ else
+ snprintf (buf, len, "%s: %d", gettext ("<unknown>"), section);
+
+ res = buf;
+ break;
+ }
}
return res;
diff --git a/libebl/eblstrtab.c b/libebl/eblstrtab.c
index d6ce94ae..4222cfd5 100644
--- a/libebl/eblstrtab.c
+++ b/libebl/eblstrtab.c
@@ -101,9 +101,11 @@ struct Ebl_Strtab
};
-/* Cache for the pagesize. We correct this value a bit so that `malloc'
- is not allocating more than a page. */
+/* Cache for the pagesize. */
static size_t ps;
+/* We correct this value a bit so that `malloc' is not allocating more
+ than a page. */
+#define MALLOC_OVERHEAD (2 * sizeof (void *))
struct Ebl_Strtab *
@@ -111,8 +113,8 @@ ebl_strtabinit (bool nullstr)
{
if (ps == 0)
{
- ps = sysconf (_SC_PAGESIZE) - 2 * sizeof (void *);
- assert (sizeof (struct memoryblock) < ps);
+ ps = sysconf (_SC_PAGESIZE);
+ assert (sizeof (struct memoryblock) < ps - MALLOC_OVERHEAD);
}
struct Ebl_Strtab *ret
@@ -135,8 +137,11 @@ ebl_strtabinit (bool nullstr)
static int
morememory (struct Ebl_Strtab *st, size_t len)
{
- if (len < ps)
- len = ps;
+ size_t overhead = offsetof (struct memoryblock, memory);
+ len += overhead + MALLOC_OVERHEAD;
+
+ /* Allocate nearest multiple of pagesize >= len. */
+ len = ((len / ps) + (len % ps != 0)) * ps - MALLOC_OVERHEAD;
struct memoryblock *newmem = (struct memoryblock *) malloc (len);
if (newmem == NULL)
@@ -145,7 +150,7 @@ morememory (struct Ebl_Strtab *st, size_t len)
newmem->next = st->memory;
st->memory = newmem;
st->backp = newmem->memory;
- st->left = len - offsetof (struct memoryblock, memory);
+ st->left = len - overhead;
return 0;
}
@@ -352,7 +357,8 @@ ebl_strtabfinalize (struct Ebl_Strtab *st, Elf_Data *data)
the offset members of the elfstrent records. */
char *endp = (char *) data->d_buf + nulllen;
size_t copylen = nulllen;
- copystrings (st->root, &endp, &copylen);
+ if (st->root)
+ copystrings (st->root, &endp, &copylen);
assert (copylen == st->total + nulllen);
}
diff --git a/libebl/eblsymbolbindingname.c b/libebl/eblsymbolbindingname.c
index c4412c9e..334a9c3e 100644
--- a/libebl/eblsymbolbindingname.c
+++ b/libebl/eblsymbolbindingname.c
@@ -1,5 +1,5 @@
/* Return symbol binding name.
- Copyright (C) 2001, 2002 Red Hat, Inc.
+ Copyright (C) 2001, 2002, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -78,8 +78,14 @@ ebl_symbol_binding_name (ebl, binding, buf, len)
res = stb_names[binding];
else
{
+ char *ident;
+
if (binding >= STB_LOPROC && binding <= STB_HIPROC)
snprintf (buf, len, "LOPROC+%d", binding - STB_LOPROC);
+ else if (binding == STB_GNU_UNIQUE
+ && (ident = elf_getident (ebl->elf, NULL)) != NULL
+ && ident[EI_OSABI] == ELFOSABI_LINUX)
+ return "GNU_UNIQUE";
else if (binding >= STB_LOOS && binding <= STB_HIOS)
snprintf (buf, len, "LOOS+%d", binding - STB_LOOS);
else
diff --git a/libebl/eblsymboltypename.c b/libebl/eblsymboltypename.c
index c7cb2cba..f2ac6222 100644
--- a/libebl/eblsymboltypename.c
+++ b/libebl/eblsymboltypename.c
@@ -1,5 +1,5 @@
/* Return symbol type name.
- Copyright (C) 2001, 2002 Red Hat, Inc.
+ Copyright (C) 2001, 2002, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -84,8 +84,14 @@ ebl_symbol_type_name (ebl, symbol, buf, len)
res = stt_names[symbol];
else
{
+ char *ident;
+
if (symbol >= STT_LOPROC && symbol <= STT_HIPROC)
snprintf (buf, len, "LOPROC+%d", symbol - STT_LOPROC);
+ else if (symbol == STT_GNU_IFUNC
+ && (ident = elf_getident (ebl->elf, NULL)) != NULL
+ && ident[EI_OSABI] == ELFOSABI_LINUX)
+ return "GNU_IFUNC";
else if (symbol >= STT_LOOS && symbol <= STT_HIOS)
snprintf (buf, len, "LOOS+%d", symbol - STT_LOOS);
else
diff --git a/libebl/libebl.h b/libebl/libebl.h
index 7e29168d..c94ad78f 100644
--- a/libebl/libebl.h
+++ b/libebl/libebl.h
@@ -1,5 +1,5 @@
/* Interface for libebl.
- Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2000-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -141,6 +141,12 @@ extern bool ebl_machine_flag_check (Ebl *ebl, GElf_Word flags);
/* Check whether SHF_MASKPROC flags are valid. */
extern bool ebl_machine_section_flag_check (Ebl *ebl, GElf_Xword flags);
+/* Check whether the section with the given index, header, and name
+ is a special machine section that is valid despite a combination
+ of flags or other details that are not generically valid. */
+extern bool ebl_check_special_section (Ebl *ebl, int ndx,
+ const GElf_Shdr *shdr, const char *name);
+
/* Return symbol type name. */
extern const char *ebl_symbol_type_name (Ebl *ebl, int symbol,
char *buf, size_t len);
@@ -182,6 +188,15 @@ extern const char *ebl_object_note_type_name (Ebl *ebl, uint32_t type,
extern void ebl_object_note (Ebl *ebl, const char *name, uint32_t type,
uint32_t descsz, const char *desc);
+/* Check whether an attribute in a .gnu_attributes section is recognized.
+ Fills in *TAG_NAME with the name for this tag.
+ If VALUE is a known value for that tag, also fills in *VALUE_NAME. */
+extern bool ebl_check_object_attribute (Ebl *ebl, const char *vendor,
+ int tag, uint64_t value,
+ const char **tag_name,
+ const char **value_name);
+
+
/* Check section name for being that of a debug informatino section. */
extern bool ebl_debugscn_p (Ebl *ebl, const char *name);
@@ -233,6 +248,45 @@ extern ssize_t ebl_register_info (Ebl *ebl,
const char **prefix, const char **setname,
int *bits, int *type);
+/* Fill in the DWARF register numbers for the registers used in system calls.
+ The SP and PC are what kernel reports call the user stack pointer and PC.
+ The CALLNO and ARGS are the system call number and incoming arguments.
+ Each of these is filled with the DWARF register number corresponding,
+ or -1 if there is none. Returns zero when the information is available. */
+extern int ebl_syscall_abi (Ebl *ebl, int *sp, int *pc,
+ int *callno, int args[6]);
+
+/* Supply the ABI-specified state of DWARF CFI before CIE initial programs.
+
+ The DWARF 3.0 spec says that the default initial states of all registers
+ are "undefined", unless otherwise specified by the machine/compiler ABI.
+
+ This default is wrong for every machine with the CFI generated by GCC.
+ The EH unwinder does not really distinguish "same_value" and "undefined",
+ since it doesn't matter for unwinding (in either case there is no change
+ to make for that register). GCC generates CFI that says nothing at all
+ about registers it hasn't spilled somewhere. For our unwinder to give
+ the true story, the backend must supply an initial state that uses
+ "same_value" rules for all the callee-saves registers.
+
+ This can fill in the initial_instructions, initial_instructions_end
+ members of *ABI_INFO to point at a CFI instruction stream to process
+ before each CIE's initial instructions. It should set the
+ data_alignment_factor member if it affects the initial instructions.
+
+ As a shorthand for some common cases, for this instruction stream
+ we overload some CFI instructions that cannot be used in a CIE:
+
+ DW_CFA_restore -- Change default rule for all unmentioned
+ registers from undefined to same_value.
+
+ This function can also fill in ABI_INFO->return_address_register with the
+ 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. */
+extern int ebl_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info)
+ __nonnull_attribute__ (2);
/* ELF string table handling. */
struct Ebl_Strtab;
@@ -325,13 +379,13 @@ typedef struct
bool thread_identifier;
} Ebl_Core_Item;
-/* Describe the format of a core file note with type field matching N_TYPE
- and descriptor size matching DESCSZ. */
-extern int ebl_core_note (Ebl *ebl, GElf_Word n_type, GElf_Word descsz,
+/* Describe the format of a core file note with the given header and NAME.
+ NAME is not guaranteed terminated, it's NHDR->n_namesz raw bytes. */
+extern int ebl_core_note (Ebl *ebl, const GElf_Nhdr *nhdr, const char *name,
GElf_Word *regs_offset, size_t *nregloc,
const Ebl_Register_Location **reglocs,
size_t *nitems, const Ebl_Core_Item **items)
- __nonnull_attribute__ (1, 4, 5, 6, 7, 8);
+ __nonnull_attribute__ (1, 2, 3, 4, 5, 6, 7, 8);
/* Describe the auxv type number. */
extern int ebl_auxv_info (Ebl *ebl, GElf_Xword a_type,
diff --git a/libebl/libeblP.h b/libebl/libeblP.h
index 7bb4c376..32a43728 100644
--- a/libebl/libeblP.h
+++ b/libebl/libeblP.h
@@ -1,5 +1,5 @@
/* Internal definitions for interface for libebl.
- Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006 Red Hat, Inc.
+ Copyright (C) 2000-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -51,6 +51,7 @@
#define _LIBEBLP_H 1
#include <gelf.h>
+#include <libasm.h>
#include <libebl.h>
#include <libintl.h>
@@ -93,4 +94,10 @@ typedef const char *(*ebl_bhinit_t) (Elf *, GElf_Half, Ebl *, size_t);
#undef _
#define _(Str) dgettext ("elfutils", Str)
+
+/* LEB128 constant helper macros. */
+#define ULEB128_7(x) (BUILD_BUG_ON_ZERO ((x) >= (1U << 7)) + (x))
+
+#define BUILD_BUG_ON_ZERO(x) (sizeof (char [(x) ? -1 : 1]) - 1)
+
#endif /* libeblP.h */
diff --git a/libelf/ChangeLog b/libelf/ChangeLog
index 364eb82c..07dc8073 100644
--- a/libelf/ChangeLog
+++ b/libelf/ChangeLog
@@ -1,3 +1,343 @@
+2010-04-14 Roland McGrath <roland@redhat.com>
+
+ * elf32_getphdr.c: Check for e_phoff/size outside the file bounds.
+ * elf_begin.c (file_read_elf): Don't set .phdr here.
+
+2010-04-13 Roland McGrath <roland@redhat.com>
+
+ * elf.h: Update from glibc.
+
+2010-04-06 Roland McGrath <roland@redhat.com>
+
+ * elf_error.c (ELF_E_FD_MISMATCH_IDX): Avoid nonobvious abbreviation
+ in error message.
+
+2010-04-01 Petr Machata <pmachata@redhat.com>
+
+ * elf_getdata.c (__elf_getdata_rdlock): Initialize data.s for data
+ that do not need a conversion.
+
+2010-03-11 Roland McGrath <roland@redhat.com>
+
+ * elf.h: Update from glibc.
+
+2010-03-04 Ulrich Drepper <drepper@redhat.com>
+
+ * elf.h: Update from glibc.
+
+2010-02-17 Roland McGrath <roland@redhat.com>
+
+ * elf_begin.c (file_read_elf): Leave section rawdata_base and
+ data_base pointers null when [sh_offset,sh_size) points outside
+ the mapped file.
+
+2010-02-15 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am: Use config/eu.am for common stuff.
+
+2010-01-07 Roland McGrath <roland@redhat.com>
+
+ * elf32_getphdr.c: Use __elf_getphdrnum_rdlock.
+ * gelf_getphdr.c: Likewise.
+ * gelf_update_phdr.c: Likewise.
+ * elf32_updatefile.c (__elf32_updatemmap, __elf32_updatefile): Likewise.
+ * elf32_updatenull.c (__elf32_updatenull_wrlock): Likewise.
+ * elf32_newphdr.c: Clear section 0's sh_info when resetting e_phnum.
+ If COUNT is too large, use store PN_XNUM instead and set sh_info.
+ * elf_begin.c (file_read_elf): Always allocate space we can use later
+ for section 0 if doing RDWR.
+
+ * elf_getphdrnum.c: New file.
+ * Makefile.am (libelf_a_SOURCES): Add it.
+ * libelf.h: Declare elf_getphdrnum.
+ * libelfP.h: Declare __elf_getphdrnum_rdlock.
+ * libelf.map (ELFUTILS_1.6): New set, add elf_getphdrnum.
+
+ * elf.h: Update from glibc.
+
+2009-10-23 Lubomir Rintel <lkundrak@v3.sk>
+
+ * elf32_updatefile.c (fill_mmap): When starting past shdr_end, start
+ filling from section start, not shdr_end.
+
+2009-11-10 Roland McGrath <roland@redhat.com>
+
+ * elf_readall.c (__libelf_readall): Fetch file size if not yet known.
+
+2009-11-06 Mark Wielaard <mjw@redhat.com>
+
+ * elf_next.c (elf_next): Mark the archive header as unusable when
+ there is no next ar element.
+
+2009-08-12 Mark Wielaard <mjw@redhat.com>
+
+ * Makefile.am (libelf.so): Use -Wl,-z,defs not -defs.
+
+2009-07-26 Ulrich Drepper <drepper@redhat.com>
+
+ * elf.h: Update from glibc.
+
+2009-07-21 Ulrich Drepper <drepper@redhat.com>
+
+ * elf32_updatefile.c (__elfXX_updatemmap): Fix handling of gaps between
+ sections. Patch by Lubomir Rintel <lkundrak@v3.sk>.
+
+2009-07-08 Roland McGrath <roland@redhat.com>
+
+ * libelfP.h (struct Elf): Remove unused ar.has_index field.
+ Reorder various members for optimal packing.
+
+2009-07-08 Ulrich Drepper <drepper@redhat.com>
+
+ * elf.h: Update from glibc.
+
+2009-06-13 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am (libelf_a_SOURCES): Replace elf_getshnum.c and
+ elf_getshstrndx.c with elf_getshdrnum.c and elf_getshdrstrndx.c.
+ * elf_getshnum.c: Renamed to...
+ * elf_getshdrnum.c: ...this. Rename function and add old name as
+ alias. Likewise for internal functions with derived names.
+ * elf_getshstrndx.c: Renamed to...
+ * elf_getshdrstrndx.c: ...this. Rename function and add old name as
+ alias. Likewise for internal functions with derived names.
+ * libelf.h: Add prototypes for new names. Make old names as
+ deprecated.
+ * libelfP.h: Rename internal function prototypes.
+ * libelf.map: Export for names.
+ * elf32_checksum.c: Don't use deprecated functions.
+ * elf32_getshdr.c: Likewise.
+
+2009-06-01 Ulrich Drepper <drepper@redhat.com>
+
+ * elf.h: Update from glibc.
+
+2009-04-14 Roland McGrath <roland@redhat.com>
+
+ * elf.h: Update from glibc.
+
+2009-04-01 Roland McGrath <roland@redhat.com>
+
+ * elf.h: Update from glibc.
+
+2009-02-10 Ulrich Drepper <drepper@redhat.com>
+
+ * elf32_updatefile.c (updatefile): For the zeroth section we still
+ have to copy the section header.
+
+2009-02-01 Ulrich Drepper <drepper@redhat.com>
+
+ * elf_strptr.c: Add comment re possible problem.
+
+2009-01-26 Ulrich Drepper <drepper@redhat.com>
+
+ * elf32_updatenull.c (updatenull_wrlock): Fix comment of
+ ELF_F_LAYOUT behaviour re section header table.
+
+2009-01-22 Ulrich Drepper <drepper@redhat.com>
+
+ * elf32_updatefile.c (__elfXX_updatemmap): Fill the gap between
+ sections even if only the section at the start of the gap has been
+ changed.
+ (__elfXX_updatefile): Likewise.
+
+2009-01-21 Ulrich Drepper <drepper@redhat.com>
+
+ * elf32_updatefile.c (__elfXX_updatemmap): Skip most of the loop to
+ handle sections for NOBITS sections.
+ (elfXX_updatefile): Likewise.
+
+ * elf32_updatefile.c (__elfXX_updatemmap): When skipping non-NOBITS
+ sections we haven't loaded, update last_position based on scn_start,
+ not based on old value. Don't run the loop for the dummy section 0.
+ (elfXX_updatefile): Don't run the loop for the dummy section 0.
+
+2009-01-10 Ulrich Drepper <drepper@redhat.com>
+
+ * libelfP.h (_): We only have one translation domain, elfutils.
+
+ * Makefile.am: Use USE_LOCKS instead of USE_TLS.
+ * elf_error.c: Always use __thread. Remove all !USE_TLS code.
+
+2009-01-04 Roland McGrath <roland@redhat.com>
+
+ * note_xlate.h (elf_cvt_note): Don't examine a size too small to
+ container a note header.
+
+2008-12-11 Roland McGrath <roland@redhat.com>
+
+ * elf32_updatefile.c (__elfw2(LIBELFBITS,updatemmap)): Handle
+ placement offset going backwards, for out-of-order or overlapping
+ (bogus) sh_offset layouts. It's a dumb use, but should not crash.
+ (__elfw2(LIBELFBITS,updatefile)): Likewise.
+ Fixes RHBZ#476136.
+
+ * libelf.h (Elf_Data): Whitespace fix.
+
+2008-12-10 Roland McGrath <roland@redhat.com>
+
+ * elf_getarhdr.c (elf_getarhdr): Fix missing rename in last change.
+
+2008-10-22 Petr Machata <pmachata@redhat.com>
+
+ * elf_rawfile.c (elf_rawfile): Lock around elf-> references.
+
+2008-10-21 Petr Machata <pmachata@redhat.com>
+
+ * libelfP.h: Rename getehdr_rdlock to getehdr_wrlock.
+ * elf32_getehdr.c (getehdr_rdlock): Move the code to new function
+ getehdr_impl and make it a wrapper. Rename to getehdr_wrlock.
+ (getehdr_impl): Guard elf->class init with wrlock.
+ (getehdr): Also make it a wrapper of getehdr_impl.
+ * elf32_updatenull.c (updatenull_wrlock): Call getehdr_wrlock.
+
+2008-10-20 Petr Machata <pmachata@redhat.com>
+
+ * elf_getdata_rawchunk.c (elf_getdata_rawchunk): Lock around the
+ code that reads mutable elf state. Relock to write lock to chain
+ the new chunk on the elf rawchunks list.
+
+2008-10-20 Petr Machata <pmachata@redhat.com>
+
+ * elf32_checksum.c (checksum): Place a lock around the code that
+ processes data. Make it wrlock if the code needs to xlate the
+ data before processing.
+
+2008-10-16 Petr Machata <pmachata@redhat.com>
+
+ * elf_begin.c
+ (__libelf_next_arhdr): Rename to __libelf_next_arhdr_wrlock.
+ (dup_elf): Adjust the call.
+ (elf_begin): New local function lock_dup_elf. Relocks the elf if
+ necessary before calling dup. Call this instead of dup_elf.
+ * elf_getarhdr.c
+ (elf_getarhdr): Lock before calling __libelf_next_arhdr_wrlock.
+ * elf_next.c (elf_next): Likewise.
+ * elf_rand.c (elf_rand): Likewise.
+
+2008-10-14 Petr Machata <pmachata@redhat.com>
+
+ * elf_getdata.c (__elf_getdata_rdlock): Lock before converting.
+
+2008-11-26 Roland McGrath <roland@redhat.com>
+
+ * elf.h: Update from glibc.
+
+2008-10-06 Roland McGrath <roland@redhat.com>
+
+ * elf_getarhdr.c (elf_getarhdr): Return NULL when passed NULL.
+
+2008-08-27 Roland McGrath <roland@redhat.com>
+
+ * elf_begin.c (get_shnum): Avoid misaligned reads for matching endian.
+
+ * libelfP.h [!ALLOW_UNALIGNED] (__libelf_type_align): Fix CLASS index.
+
+2008-08-25 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am (libelf_so_LDLIBS): New variable.
+ (libelf.so): Use it in the link.
+
+2008-08-21 Petr Machata <pmachata@redhat.com>
+
+ * elf_getdata.c, libelfP.h
+ (__elf_getdata_internal): Rename to __elf_getdata_rdlock.
+ (__libelf_set_rawdata_wrlock): New function.
+ (__libelf_set_rawdata): Make it a wrapper that calls *_wrlock.
+ * elf32_updatenull.c, libelfP.h
+ (__elfNN_updatenull): Rename to __elfNN_updatenull_wrlock.
+
+2008-08-21 Petr Machata <pmachata@redhat.com>
+
+ * elf32_getphdr.c, libelfP.h
+ (__elfNN_getphdr_internal): Drop. Move __elfNN_getphdr_internal
+ code to __elfNN_getphdr_wrlock.
+ (__elfNN_getphdr_rdlock, __elfNN_getphdr_wrlock): New functions.
+ (__elfNN_getphdr_rdlock, __elfNN_getphdr_wrlock): Make these
+ wrappers of getphdr_impl.
+
+2008-08-21 Petr Machata <pmachata@redhat.com>
+
+ * elf32_getehdr.c, libelfP.h
+ (__elfNN_getehdr_internal): Rename to __elfNN_getehdr_rdlock.
+ * gelf_getehdr, libelfP.h:
+ (__gelf_getehdr_internal): Rename to __gelf_getehdr_rdlock.
+
+2008-08-21 Petr Machata <pmachata@redhat.com>
+
+ * elf32_getshdr.c
+ (__elfNN_getshdr_internal): Drop.
+ (load_shdr_wrlock, scn_valid): New functions, contain bits of
+ behaviour from __elfNN_getshdr_internal.
+ (__elfNN_getshdr_rdlock, __elfNN_getshdr_wrlock): Replacements for
+ dropped _internal functions above.
+ * elf_getshnum.c
+ (__elf_getshnum_internal): Rename to __elf_getshnum_rdlock.
+
+2008-08-04 Petr Machata <pmachata@redhat.com>
+
+ * libelfP.h (RWLOCK_RDLOCK, RWLOCK_WRLOCK, RWLOCK_UNLOCK): New macros.
+
+2008-07-28 Roland McGrath <roland@redhat.com>
+
+ * elf.h: Update from glibc.
+
+2008-03-31 Roland McGrath <roland@redhat.com>
+
+ * elf32_offscn.c: Make sure shdrs have been read in.
+
+2008-02-19 Roland McGrath <roland@redhat.com>
+
+ * elf.h: Update from glibc.
+
+2008-02-08 Roland McGrath <roland@redhat.com>
+
+ * elf.h: Update from glibc.
+
+2008-01-31 Ulrich Drepper <drepper@redhat.com>
+
+ * elf_strptr.c (elf_strptr): Don't fail if the ELF file is currently
+ under construction and no raw data can be read from disk.
+
+2008-01-30 Roland McGrath <roland@redhat.com>
+
+ * elf.h: Update from glibc.
+
+2008-01-26 Roland McGrath <roland@redhat.com>
+
+ * elf_begin.c (__libelf_next_arhdr): Rewrite conversions using a macro.
+ Fixes various pastos in wrong type in sizeof, wrong string parsed.
+
+2008-01-20 Roland McGrath <roland@redhat.com>
+
+ * elf_getaroff.c: Calculate from start_offset, instead of using
+ parent's state.ar.offset field.
+
+2008-01-08 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am (euinclude): Variable removed.
+ (pkginclude_HEADERS): Set this instead of euinclude_HEADERS.
+
+2008-01-03 Roland McGrath <roland@redhat.com>
+
+ * common.h: Add __attribute__ ((unused)) to static functions.
+
+2007-12-20 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am (libelf_a_SOURCES): Add elf_scnshndx.
+ * libelfP.h (struct Elf_Scn): Add shndx_index field.
+ Declare __elf_scnshndx_internal.
+ * elf32_getshdr.c: Record location of extended section header.
+ * elf_begin.c (file_read_elf): Likewise.
+ * elf_scnshndx.c: New file.
+ * libelf.h: Declare elf_scnshndx.
+ * libelf.map: Add elf_scnshndx to version ELFUTILS_1.4.
+
+2007-11-12 Roland McGrath <roland@redhat.com>
+
+ * libelf.h: Replace off64_t with loff_t throughout.
+ Only that type name is unconditionally defined by <sys/types.h>
+
2007-03-12 Roland McGrath <roland@redhat.com>
* gelf_begin_embedded.c: New file.
diff --git a/libelf/Makefile.am b/libelf/Makefile.am
index acd063e6..9c7e7762 100644
--- a/libelf/Makefile.am
+++ b/libelf/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to create Makefile.in
##
-## Copyright (C) 1996-2006, 2007 Red Hat, Inc.
+## Copyright (C) 1996-2010 Red Hat, Inc.
## This file is part of Red Hat elfutils.
##
## Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -24,24 +24,12 @@
## Network licensing program, please visit www.openinventionnetwork.com
## <http://www.openinventionnetwork.com>.
##
-DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H
-if MUDFLAP
-AM_CFLAGS = -fmudflap
-else
-AM_CFLAGS =
-endif
+include $(top_srcdir)/config/eu.am
if BUILD_STATIC
AM_CFLAGS += -fpic
endif
-AM_CFLAGS += -Wall -Wshadow -Werror -Wunused -Wextra -Wformat=2 -std=gnu99 \
- $($(*F)_CFLAGS)
-INCLUDES = -I$(srcdir) -I$(top_srcdir)/lib -I..
GCC_INCLUDE = -I$(shell $(CC) -print-file-name=include)
VERSION = 1
-PACKAGE_VERSION = @PACKAGE_VERSION@
-
-COMPILE.os = $(filter-out -fprofile-arcs, $(filter-out -ftest-coverage, \
- $(COMPILE)))
lib_LIBRARIES = libelf.a
if !MUDFLAP
@@ -50,8 +38,7 @@ noinst_PROGRAMS = $(noinst_LIBRARIES:_pic.a=.so)
endif
include_HEADERS = libelf.h gelf.h nlist.h
-euincludedir = $(includedir)/elfutils
-euinclude_HEADERS = elf-knowledge.h
+pkginclude_HEADERS = elf-knowledge.h
libelf_a_SOURCES = elf_version.c elf_hash.c elf_error.c elf_fill.c \
elf_begin.c elf_next.c elf_rand.c elf_end.c elf_kind.c \
@@ -92,37 +79,35 @@ libelf_a_SOURCES = elf_version.c elf_hash.c elf_error.c elf_fill.c \
gelf_update_versym.c gelf_update_verneed.c \
gelf_update_vernaux.c gelf_update_verdef.c \
gelf_update_verdaux.c \
- elf_getshnum.c elf_getshstrndx.c \
+ elf_getphdrnum.c elf_getshdrnum.c elf_getshdrstrndx.c \
gelf_checksum.c elf32_checksum.c elf64_checksum.c \
gelf_getdata_memory.c gelf_getdata_rawchunk.c \
libelf_crc32.c libelf_next_prime.c \
elf_clone.c \
+ gelf_begin_embedded.c \
gelf_getlib.c gelf_update_lib.c \
elf32_offscn.c elf64_offscn.c gelf_offscn.c \
elf_getaroff.c \
elf_gnu_hash.c \
- gelf_begin_embedded.c
+ elf_scnshndx.c
if !MUDFLAP
libelf_pic_a_SOURCES =
am_libelf_pic_a_OBJECTS = $(libelf_a_SOURCES:.c=.os)
+libelf_so_LDLIBS =
+if USE_LOCKS
+libelf_so_LDLIBS += -lpthread
+endif
+
libelf_so_SOURCES =
libelf.so: 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
+ -Wl,--soname,$@.$(VERSION),-z,defs,-z,relro $(libelf_so_LDLIBS)
if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
ln -fs $@ $@.$(VERSION)
-%.os: %.c %.o
- if $(COMPILE.os) -c -o $@ -fpic -DPIC -DSHARED -MT $@ -MD -MP \
- -MF "$(DEPDIR)/$*.Tpo" `test -f '$<' || echo '$(srcdir)/'`$<; \
- then cat "$(DEPDIR)/$*.Tpo" >> "$(DEPDIR)/$*.Po"; \
- rm -f "$(DEPDIR)/$*.Tpo"; \
- else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
- fi
-
install: install-am libelf.so
$(mkinstalldirs) $(DESTDIR)$(libdir)
$(INSTALL_PROGRAM) libelf.so $(DESTDIR)$(libdir)/libelf-$(PACKAGE_VERSION).so
@@ -139,4 +124,4 @@ 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
EXTRA_DIST = libelf.map
-CLEANFILES = $(am_libelf_pic_a_OBJECTS) *.gcno *.gcda libelf.so.$(VERSION)
+CLEANFILES += $(am_libelf_pic_a_OBJECTS) libelf.so.$(VERSION)
diff --git a/libelf/common.h b/libelf/common.h
index af1fce54..f40c0079 100644
--- a/libelf/common.h
+++ b/libelf/common.h
@@ -1,5 +1,5 @@
/* Common definitions for handling files in memory or only on disk.
- Copyright (C) 1998, 1999, 2000, 2002, 2005, 2007 Red Hat, Inc.
+ Copyright (C) 1998, 1999, 2000, 2002, 2005, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 1998.
@@ -57,8 +57,10 @@
#include <stdlib.h>
#include <string.h>
+#include "libelfP.h"
static inline Elf_Kind
+__attribute__ ((unused))
determine_kind (void *buf, size_t len)
{
/* First test for an archive. */
@@ -86,6 +88,7 @@ determine_kind (void *buf, size_t len)
/* Allocate an Elf descriptor and fill in the generic information. */
static inline Elf *
+__attribute__ ((unused))
allocate_elf (int fildes, void *map_address, off_t offset, size_t maxsize,
Elf_Cmd cmd, Elf *parent, Elf_Kind kind, size_t extra)
{
@@ -112,6 +115,7 @@ allocate_elf (int fildes, void *map_address, off_t offset, size_t maxsize,
/* Acquire lock for the descriptor and all children. */
static void
+__attribute__ ((unused))
libelf_acquire_all (Elf *elf)
{
rwlock_wrlock (elf->lock);
@@ -128,6 +132,7 @@ libelf_acquire_all (Elf *elf)
/* Release own lock and those of the children. */
static void
+__attribute__ ((unused))
libelf_release_all (Elf *elf)
{
Elf *child = elf->children;
diff --git a/libelf/elf.h b/libelf/elf.h
index acd3d3e1..a9558a3d 100644
--- a/libelf/elf.h
+++ b/libelf/elf.h
@@ -1,5 +1,6 @@
/* This file defines standard ELF types, structures, and macros.
- Copyright (C) 1995-2003,2004,2005,2006,2007 Free Software Foundation, Inc.
+ Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010
+ 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
@@ -149,6 +150,7 @@ typedef struct
#define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX. */
#define ELFOSABI_MODESTO 11 /* Novell Modesto. */
#define ELFOSABI_OPENBSD 12 /* OpenBSD. */
+#define ELFOSABI_ARM_AEABI 64 /* ARM EABI */
#define ELFOSABI_ARM 97 /* ARM */
#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */
@@ -330,6 +332,7 @@ typedef struct
#define SHT_SYMTAB_SHNDX 18 /* Extended section indeces */
#define SHT_NUM 19 /* Number of defined types. */
#define SHT_LOOS 0x60000000 /* Start OS-specific. */
+#define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes. */
#define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table. */
#define SHT_GNU_LIBLIST 0x6ffffff7 /* Prelink library list */
#define SHT_CHECKSUM 0x6ffffff8 /* Checksum for DSO content. */
@@ -442,6 +445,7 @@ typedef struct
#define STB_WEAK 2 /* Weak symbol */
#define STB_NUM 3 /* Number of defined types. */
#define STB_LOOS 10 /* Start of OS-specific */
+#define STB_GNU_UNIQUE 10 /* Unique symbol. */
#define STB_HIOS 12 /* End of OS-specific */
#define STB_LOPROC 13 /* Start of processor-specific */
#define STB_HIPROC 15 /* End of processor-specific */
@@ -457,6 +461,7 @@ typedef struct
#define STT_TLS 6 /* Symbol is thread-local data object*/
#define STT_NUM 7 /* Number of defined types. */
#define STT_LOOS 10 /* Start of OS-specific */
+#define STT_GNU_IFUNC 10 /* Symbol is indirect code object */
#define STT_HIOS 12 /* End of OS-specific */
#define STT_LOPROC 13 /* Start of processor-specific */
#define STT_HIPROC 15 /* End of processor-specific */
@@ -554,6 +559,12 @@ typedef struct
Elf64_Xword p_align; /* Segment alignment */
} Elf64_Phdr;
+/* Special value for e_phnum. This indicates that the real number of
+ program headers is too large to fit into e_phnum. Instead the real
+ value is in the field sh_info of section 0. */
+
+#define PN_XNUM 0xffff
+
/* Legal values for p_type (segment type). */
#define PT_NULL 0 /* Program header table entry unused */
@@ -605,6 +616,11 @@ typedef struct
#define NT_PRFPXREG 20 /* Contains copy of fprxregset struct */
#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 */
+#define NT_PPC_VSX 0x102 /* PowerPC VSX registers */
+#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 */
/* Legal values for the note segment descriptor types for object files. */
@@ -966,6 +982,12 @@ typedef struct
#define AT_SECURE 23 /* Boolean, was exec setuid-like? */
+#define AT_BASE_PLATFORM 24 /* String identifying real platforms.*/
+
+#define AT_RANDOM 25 /* Address of 16 random bytes. */
+
+#define AT_EXECFN 31 /* Filename of executable. */
+
/* Pointer to the global system page used for system calls and other
nice things. */
#define AT_SYSINFO 32
@@ -1040,6 +1062,9 @@ typedef struct
The descriptor consists of any nonzero number of bytes. */
#define NT_GNU_BUILD_ID 3
+/* Version note generated by GNU gold containing a version string. */
+#define NT_GNU_GOLD_VERSION 4
+
/* Move records. */
typedef struct
@@ -1100,8 +1125,29 @@ typedef struct
#define R_68K_GLOB_DAT 20 /* Create GOT entry */
#define R_68K_JMP_SLOT 21 /* Create PLT entry */
#define R_68K_RELATIVE 22 /* Adjust by program base */
+#define R_68K_TLS_GD32 25 /* 32 bit GOT offset for GD */
+#define R_68K_TLS_GD16 26 /* 16 bit GOT offset for GD */
+#define R_68K_TLS_GD8 27 /* 8 bit GOT offset for GD */
+#define R_68K_TLS_LDM32 28 /* 32 bit GOT offset for LDM */
+#define R_68K_TLS_LDM16 29 /* 16 bit GOT offset for LDM */
+#define R_68K_TLS_LDM8 30 /* 8 bit GOT offset for LDM */
+#define R_68K_TLS_LDO32 31 /* 32 bit module-relative offset */
+#define R_68K_TLS_LDO16 32 /* 16 bit module-relative offset */
+#define R_68K_TLS_LDO8 33 /* 8 bit module-relative offset */
+#define R_68K_TLS_IE32 34 /* 32 bit GOT offset for IE */
+#define R_68K_TLS_IE16 35 /* 16 bit GOT offset for IE */
+#define R_68K_TLS_IE8 36 /* 8 bit GOT offset for IE */
+#define R_68K_TLS_LE32 37 /* 32 bit offset relative to
+ static TLS block */
+#define R_68K_TLS_LE16 38 /* 16 bit offset relative to
+ static TLS block */
+#define R_68K_TLS_LE8 39 /* 8 bit offset relative to
+ static TLS block */
+#define R_68K_TLS_DTPMOD32 40 /* 32 bit module number */
+#define R_68K_TLS_DTPREL32 41 /* 32 bit module-relative offset */
+#define R_68K_TLS_TPREL32 42 /* 32 bit TP-relative offset */
/* Keep this the last entry. */
-#define R_68K_NUM 23
+#define R_68K_NUM 43
/* Intel 80386 specific definitions. */
@@ -1155,8 +1201,18 @@ 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_TLS_GOTDESC 39 /* GOT offset for TLS descriptor. */
+#define R_386_TLS_DESC_CALL 40 /* Marker of call through TLS
+ descriptor for
+ relaxation. */
+#define R_386_TLS_DESC 41 /* TLS descriptor containing
+ pointer to code and to
+ argument, returning the TLS
+ offset for the symbol. */
+#define R_386_IRELATIVE 42 /* Adjust indirectly by program base */
/* Keep this the last entry. */
-#define R_386_NUM 38
+#define R_386_NUM 43
/* SUN SPARC specific definitions. */
@@ -1224,6 +1280,7 @@ typedef struct
#define R_SPARC_PC_LM22 39 /* Low miggle 22 bits of ... */
#define R_SPARC_WDISP16 40 /* PC relative 16 bit shifted */
#define R_SPARC_WDISP19 41 /* PC relative 19 bit shifted */
+#define R_SPARC_GLOB_JMP 42 /* was part of v9 ABI but was removed */
#define R_SPARC_7 43 /* Direct 7 bit */
#define R_SPARC_5 44 /* Direct 5 bit */
#define R_SPARC_6 45 /* Direct 6 bit */
@@ -1261,8 +1318,21 @@ typedef struct
#define R_SPARC_TLS_DTPOFF64 77
#define R_SPARC_TLS_TPOFF32 78
#define R_SPARC_TLS_TPOFF64 79
+#define R_SPARC_GOTDATA_HIX22 80
+#define R_SPARC_GOTDATA_LOX10 81
+#define R_SPARC_GOTDATA_OP_HIX22 82
+#define R_SPARC_GOTDATA_OP_LOX10 83
+#define R_SPARC_GOTDATA_OP 84
+#define R_SPARC_H34 85
+#define R_SPARC_SIZE32 86
+#define R_SPARC_SIZE64 87
+#define R_SPARC_JMP_IREL 248
+#define R_SPARC_IRELATIVE 249
+#define R_SPARC_GNU_VTINHERIT 250
+#define R_SPARC_GNU_VTENTRY 251
+#define R_SPARC_REV32 252
/* Keep this the last entry. */
-#define R_SPARC_NUM 80
+#define R_SPARC_NUM 253
/* For Sparc64, legal values for d_tag of Elf64_Dyn. */
@@ -1278,6 +1348,7 @@ typedef struct
#define HWCAP_SPARC_V9 16 /* The CPU is v9, so v8plus is ok. */
#define HWCAP_SPARC_ULTRA3 32
#define HWCAP_SPARC_BLKINIT 64 /* Sun4v with block-init/load-twin. */
+#define HWCAP_SPARC_N2 128
/* MIPS R3000 specific definitions. */
@@ -1381,6 +1452,7 @@ typedef struct
#define STO_MIPS_INTERNAL 0x1
#define STO_MIPS_HIDDEN 0x2
#define STO_MIPS_PROTECTED 0x3
+#define STO_MIPS_PLT 0x8
#define STO_MIPS_SC_ALIGN_UNUSED 0xff
/* MIPS specific values for `st_info'. */
@@ -1527,8 +1599,10 @@ typedef struct
#define R_MIPS_TLS_TPREL_HI16 49 /* TP-relative offset, high 16 bits */
#define R_MIPS_TLS_TPREL_LO16 50 /* TP-relative offset, low 16 bits */
#define R_MIPS_GLOB_DAT 51
+#define R_MIPS_COPY 126
+#define R_MIPS_JUMP_SLOT 127
/* Keep this the last entry. */
-#define R_MIPS_NUM 52
+#define R_MIPS_NUM 128
/* Legal values for p_type field of Elf32_Phdr. */
@@ -1594,7 +1668,13 @@ typedef struct
#define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */
#define DT_MIPS_GP_VALUE 0x70000030 /* GP value for aux GOTs. */
#define DT_MIPS_AUX_DYNAMIC 0x70000031 /* Address of aux .dynamic. */
-#define DT_MIPS_NUM 0x32
+/* The address of .got.plt in an executable using the new non-PIC ABI. */
+#define DT_MIPS_PLTGOT 0x70000032
+/* The base of the PLT in an executable using the new non-PIC ABI if that
+ PLT is writable. For a non-writable PLT, this is omitted or has a zero
+ value. */
+#define DT_MIPS_RWPLT 0x70000034
+#define DT_MIPS_NUM 0x35
/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry. */
@@ -1992,9 +2072,6 @@ typedef Elf32_Addr Elf32_Conflict;
#define R_PPC_GOT_DTPREL16_HI 93 /* half16* (sym+add)@got@dtprel@h */
#define R_PPC_GOT_DTPREL16_HA 94 /* half16* (sym+add)@got@dtprel@ha */
-/* Keep this the last entry. */
-#define R_PPC_NUM 95
-
/* The remaining relocs are from the Embedded ELF ABI, and are not
in the SVR4 ELF ABI. */
#define R_PPC_EMB_NADDR32 101
@@ -2022,11 +2099,14 @@ typedef Elf32_Addr Elf32_Conflict;
#define R_PPC_DIAB_RELSDA_HI 184 /* like EMB_RELSDA, but high 16 bit */
#define R_PPC_DIAB_RELSDA_HA 185 /* like EMB_RELSDA, adjusted high 16 */
+/* GNU extension to support local ifunc. */
+#define R_PPC_IRELATIVE 248
+
/* GNU relocs used in PIC code sequences. */
-#define R_PPC_REL16 249 /* word32 (sym-.) */
-#define R_PPC_REL16_LO 250 /* half16 (sym-.)@l */
-#define R_PPC_REL16_HI 251 /* half16 (sym-.)@h */
-#define R_PPC_REL16_HA 252 /* half16 (sym-.)@ha */
+#define R_PPC_REL16 249 /* half16 (sym+add-.) */
+#define R_PPC_REL16_LO 250 /* half16 (sym+add-.)@l */
+#define R_PPC_REL16_HI 251 /* half16 (sym+add-.)@h */
+#define R_PPC_REL16_HA 252 /* half16 (sym+add-.)@ha */
/* This is a phony reloc to handle any old fashioned TOC16 references
that may still be in object files. */
@@ -2148,8 +2228,13 @@ typedef Elf32_Addr Elf32_Conflict;
#define R_PPC64_DTPREL16_HIGHEST 105 /* half16 (sym+add)@dtprel@highest */
#define R_PPC64_DTPREL16_HIGHESTA 106 /* half16 (sym+add)@dtprel@highesta */
-/* Keep this the last entry. */
-#define R_PPC64_NUM 107
+/* GNU extension to support local ifunc. */
+#define R_PPC64_JMP_IREL 247
+#define R_PPC64_IRELATIVE 248
+#define R_PPC64_REL16 249 /* half16 (sym+add-.) */
+#define R_PPC64_REL16_LO 250 /* half16 (sym+add-.)@l */
+#define R_PPC64_REL16_HI 251 /* half16 (sym+add-.)@h */
+#define R_PPC64_REL16_HA 252 /* half16 (sym+add-.)@ha */
/* PowerPC64 specific values for the Dyn d_tag field. */
#define DT_PPC64_GLINK (DT_LOPROC + 0)
@@ -2161,42 +2246,62 @@ typedef Elf32_Addr Elf32_Conflict;
/* ARM specific declarations */
/* Processor specific flags for the ELF header e_flags field. */
-#define EF_ARM_RELEXEC 0x01
-#define EF_ARM_HASENTRY 0x02
-#define EF_ARM_INTERWORK 0x04
-#define EF_ARM_APCS_26 0x08
-#define EF_ARM_APCS_FLOAT 0x10
-#define EF_ARM_PIC 0x20
-#define EF_ARM_ALIGN8 0x40 /* 8-bit structure alignment is in use */
-#define EF_ARM_NEW_ABI 0x80
-#define EF_ARM_OLD_ABI 0x100
+#define EF_ARM_RELEXEC 0x01
+#define EF_ARM_HASENTRY 0x02
+#define EF_ARM_INTERWORK 0x04
+#define EF_ARM_APCS_26 0x08
+#define EF_ARM_APCS_FLOAT 0x10
+#define EF_ARM_PIC 0x20
+#define EF_ARM_ALIGN8 0x40 /* 8-bit structure alignment is in use */
+#define EF_ARM_NEW_ABI 0x80
+#define EF_ARM_OLD_ABI 0x100
+#define EF_ARM_SOFT_FLOAT 0x200
+#define EF_ARM_VFP_FLOAT 0x400
+#define EF_ARM_MAVERICK_FLOAT 0x800
+
/* Other constants defined in the ARM ELF spec. version B-01. */
/* NB. These conflict with values defined above. */
#define EF_ARM_SYMSARESORTED 0x04
-#define EF_ARM_DYNSYMSUSESEGIDX 0x08
+#define EF_ARM_DYNSYMSUSESEGIDX 0x08
#define EF_ARM_MAPSYMSFIRST 0x10
#define EF_ARM_EABIMASK 0XFF000000
-#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK)
-#define EF_ARM_EABI_UNKNOWN 0x00000000
-#define EF_ARM_EABI_VER1 0x01000000
-#define EF_ARM_EABI_VER2 0x02000000
+/* Constants defined in AAELF. */
+#define EF_ARM_BE8 0x00800000
+#define EF_ARM_LE8 0x00400000
-/* Additional symbol types for Thumb */
-#define STT_ARM_TFUNC 0xd
+#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK)
+#define EF_ARM_EABI_UNKNOWN 0x00000000
+#define EF_ARM_EABI_VER1 0x01000000
+#define EF_ARM_EABI_VER2 0x02000000
+#define EF_ARM_EABI_VER3 0x03000000
+#define EF_ARM_EABI_VER4 0x04000000
+#define EF_ARM_EABI_VER5 0x05000000
+
+/* Additional symbol types for Thumb. */
+#define STT_ARM_TFUNC STT_LOPROC /* A Thumb function. */
+#define STT_ARM_16BIT STT_HIPROC /* A Thumb label. */
/* ARM-specific values for sh_flags */
-#define SHF_ARM_ENTRYSECT 0x10000000 /* Section contains an entry point */
-#define SHF_ARM_COMDEF 0x80000000 /* Section may be multiply defined
- in the input to a link step */
+#define SHF_ARM_ENTRYSECT 0x10000000 /* Section contains an entry point */
+#define SHF_ARM_COMDEF 0x80000000 /* Section may be multiply defined
+ in the input to a link step. */
/* ARM-specific program header flags */
-#define PF_ARM_SB 0x10000000 /* Segment contains the location
- addressed by the static base */
+#define PF_ARM_SB 0x10000000 /* Segment contains the location
+ addressed by the static base. */
+#define PF_ARM_PI 0x20000000 /* Position-independent segment. */
+#define PF_ARM_ABS 0x40000000 /* Absolute segment. */
/* Processor specific values for the Phdr p_type field. */
-#define PT_ARM_EXIDX 0x70000001 /* .ARM.exidx segment */
+#define PT_ARM_EXIDX (PT_LOPROC + 1) /* ARM unwind segment. */
+
+/* Processor specific values for the Shdr sh_type field. */
+#define SHT_ARM_EXIDX (SHT_LOPROC + 1) /* ARM unwind section. */
+#define SHT_ARM_PREEMPTMAP (SHT_LOPROC + 2) /* Preemption details. */
+#define SHT_ARM_ATTRIBUTES (SHT_LOPROC + 3) /* ARM attributes section. */
+
/* ARM relocs. */
@@ -2372,6 +2477,30 @@ typedef Elf32_Addr Elf32_Conflict;
/* SH specific declarations */
+/* Processor specific flags for the ELF header e_flags field. */
+#define EF_SH_MACH_MASK 0x1f
+#define EF_SH_UNKNOWN 0x0
+#define EF_SH1 0x1
+#define EF_SH2 0x2
+#define EF_SH3 0x3
+#define EF_SH_DSP 0x4
+#define EF_SH3_DSP 0x5
+#define EF_SH4AL_DSP 0x6
+#define EF_SH3E 0x8
+#define EF_SH4 0x9
+#define EF_SH2E 0xb
+#define EF_SH4A 0xc
+#define EF_SH2A 0xd
+#define EF_SH4_NOFPU 0x10
+#define EF_SH4A_NOFPU 0x11
+#define EF_SH4_NOMMU_NOFPU 0x12
+#define EF_SH2A_NOFPU 0x13
+#define EF_SH3_NOMMU 0x14
+#define EF_SH2A_SH4_NOFPU 0x15
+#define EF_SH2A_SH3_NOFPU 0x16
+#define EF_SH2A_SH4 0x17
+#define EF_SH2A_SH3E 0x18
+
/* SH relocs. */
#define R_SH_NONE 0
#define R_SH_DIR32 1
@@ -2413,6 +2542,12 @@ typedef Elf32_Addr Elf32_Conflict;
/* Keep this the last entry. */
#define R_SH_NUM 256
+/* S/390 specific definitions. */
+
+/* Valid values for the e_flags field. */
+
+#define EF_S390_HIGH_GPRS 0x00000001 /* High GPRs kernel facility needed. */
+
/* Additional s390 relocs */
#define R_390_NONE 0 /* No reloc. */
@@ -2552,8 +2687,26 @@ typedef Elf32_Addr Elf32_Conflict;
#define R_X86_64_GOTTPOFF 22 /* 32 bit signed PC relative offset
to GOT entry for IE symbol */
#define R_X86_64_TPOFF32 23 /* Offset in initial TLS block */
-
-#define R_X86_64_NUM 24
+#define R_X86_64_PC64 24 /* PC relative 64 bit */
+#define R_X86_64_GOTOFF64 25 /* 64 bit offset to GOT */
+#define R_X86_64_GOTPC32 26 /* 32 bit signed pc relative
+ offset to GOT */
+#define R_X86_64_GOT64 27 /* 64-bit GOT entry offset */
+#define R_X86_64_GOTPCREL64 28 /* 64-bit PC relative offset
+ to GOT entry */
+#define R_X86_64_GOTPC64 29 /* 64-bit PC relative offset to GOT */
+#define R_X86_64_GOTPLT64 30 /* like GOT64, says PLT entry needed */
+#define R_X86_64_PLTOFF64 31 /* 64-bit GOT relative offset
+ to PLT entry */
+#define R_X86_64_SIZE32 32 /* Size of symbol plus 32-bit addend */
+#define R_X86_64_SIZE64 33 /* Size of symbol plus 64-bit addend */
+#define R_X86_64_GOTPC32_TLSDESC 34 /* GOT offset for TLS descriptor. */
+#define R_X86_64_TLSDESC_CALL 35 /* Marker for call through TLS
+ descriptor. */
+#define R_X86_64_TLSDESC 36 /* TLS descriptor. */
+#define R_X86_64_IRELATIVE 37 /* Adjust indirectly by program base */
+
+#define R_X86_64_NUM 38
/* AM33 relocations. */
diff --git a/libelf/elf32_checksum.c b/libelf/elf32_checksum.c
index 0e4ab9f7..ad040b80 100644
--- a/libelf/elf32_checksum.c
+++ b/libelf/elf32_checksum.c
@@ -1,5 +1,5 @@
/* Compute simple checksum from permanent parts of the ELF file.
- Copyright (C) 2002, 2003, 2004, 2005 Red Hat, Inc.
+ Copyright (C) 2002, 2003, 2004, 2005, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -90,7 +90,7 @@ elfw2(LIBELFBITS,checksum) (elf)
return -1l;
/* Find the section header string table. */
- if (INTUSE(elf_getshstrndx) (elf, &shstrndx) < 0)
+ if (INTUSE(elf_getshdrstrndx) (elf, &shstrndx) < 0)
{
/* This can only happen if the ELF handle is not for real. */
__libelf_seterrno (ELF_E_INVALID_HANDLE);
@@ -105,6 +105,14 @@ elfw2(LIBELFBITS,checksum) (elf)
|| (ident[EI_DATA] == ELFDATA2MSB
&& __BYTE_ORDER == __BIG_ENDIAN));
+ /* If we don't have native byte order, we will likely need to
+ convert the data with xlate functions. We do it upfront instead
+ of relocking mid-iteration. */
+ if (!likely (same_byte_order))
+ rwlock_wrlock (elf->lock);
+ else
+ rwlock_rdlock (elf->lock);
+
/* Iterate over all sections to find those which are not strippable. */
scn = NULL;
while ((scn = INTUSE(elf_nextscn) (elf, scn)) != NULL)
@@ -118,7 +126,8 @@ elfw2(LIBELFBITS,checksum) (elf)
if (shdr == NULL)
{
__libelf_seterrno (ELF_E_INVALID_SECTION_HEADER);
- return -1l;
+ result = -1l;
+ goto out;
}
if (SECTION_STRIP_P (shdr,
@@ -162,17 +171,25 @@ elfw2(LIBELFBITS,checksum) (elf)
/* Convert the data to file byte order. */
if (INTUSE(elfw2(LIBELFBITS,xlatetof)) (data, data, ident[EI_DATA])
== NULL)
- return -1l;
+ {
+ result = -1l;
+ goto out;
+ }
result = process_block (result, data);
/* And convert it back. */
if (INTUSE(elfw2(LIBELFBITS,xlatetom)) (data, data, ident[EI_DATA])
== NULL)
- return -1l;
+ {
+ result = -1l;
+ goto out;
+ }
}
}
+ out:
+ rwlock_unlock (elf->lock);
return result;
}
INTDEF(elfw2(LIBELFBITS,checksum))
diff --git a/libelf/elf32_getehdr.c b/libelf/elf32_getehdr.c
index bdb2cc41..8009133b 100644
--- a/libelf/elf32_getehdr.c
+++ b/libelf/elf32_getehdr.c
@@ -62,12 +62,11 @@
#endif
-ElfW2(LIBELFBITS,Ehdr) *
-elfw2(LIBELFBITS,getehdr) (elf)
+static ElfW2(LIBELFBITS,Ehdr) *
+getehdr_impl (elf, wrlock)
Elf *elf;
+ int wrlock;
{
- ElfW2(LIBELFBITS,Ehdr) *result;
-
if (elf == NULL)
return NULL;
@@ -77,22 +76,45 @@ elfw2(LIBELFBITS,getehdr) (elf)
return NULL;
}
- rwlock_rdlock (elf->lock);
-
+ again:
if (elf->class == 0)
- elf->class = ELFW(ELFCLASS,LIBELFBITS);
+ {
+ if (!wrlock)
+ {
+ rwlock_unlock (elf->lock);
+ rwlock_wrlock (elf->lock);
+ wrlock = 1;
+ goto again;
+ }
+ elf->class = ELFW(ELFCLASS,LIBELFBITS);
+ }
else if (unlikely (elf->class != ELFW(ELFCLASS,LIBELFBITS)))
{
__libelf_seterrno (ELF_E_INVALID_CLASS);
- result = NULL;
- goto out;
+ return NULL;
}
- result = elf->state.ELFW(elf,LIBELFBITS).ehdr;
+ return elf->state.ELFW(elf,LIBELFBITS).ehdr;
+}
+
+ElfW2(LIBELFBITS,Ehdr) *
+__elfw2(LIBELFBITS,getehdr_wrlock) (elf)
+ Elf *elf;
+{
+ return getehdr_impl (elf, 1);
+}
+
+ElfW2(LIBELFBITS,Ehdr) *
+elfw2(LIBELFBITS,getehdr) (elf)
+ Elf *elf;
+{
+ ElfW2(LIBELFBITS,Ehdr) *result;
+ if (elf == NULL)
+ return NULL;
- out:
+ rwlock_rdlock (elf->lock);
+ result = getehdr_impl (elf, 0);
rwlock_unlock (elf->lock);
return result;
}
-INTDEF(elfw2(LIBELFBITS,getehdr))
diff --git a/libelf/elf32_getphdr.c b/libelf/elf32_getphdr.c
index 69087245..80f54fd7 100644
--- a/libelf/elf32_getphdr.c
+++ b/libelf/elf32_getphdr.c
@@ -1,5 +1,5 @@
/* Get ELF program header table.
- Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006 Red Hat, Inc.
+ Copyright (C) 1998-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 1998.
@@ -53,6 +53,7 @@
#endif
#include <errno.h>
+#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
@@ -65,22 +66,12 @@
# define LIBELFBITS 32
#endif
-
ElfW2(LIBELFBITS,Phdr) *
-elfw2(LIBELFBITS,getphdr) (elf)
+__elfw2(LIBELFBITS,getphdr_wrlock) (elf)
Elf *elf;
{
ElfW2(LIBELFBITS,Phdr) *result;
- if (elf == NULL)
- return NULL;
-
- if (unlikely (elf->kind != ELF_K_ELF))
- {
- __libelf_seterrno (ELF_E_INVALID_HANDLE);
- return NULL;
- }
-
/* If the program header entry has already been filled in the code
below must already have been run. So the class is set, too. No
need to waste any more time here. */
@@ -88,8 +79,6 @@ elfw2(LIBELFBITS,getphdr) (elf)
if (likely (result != NULL))
return result;
- rwlock_wrlock (elf->lock);
-
if (elf->class == 0)
elf->class = ELFW(ELFCLASS,LIBELFBITS);
else if (elf->class != ELFW(ELFCLASS,LIBELFBITS))
@@ -105,7 +94,9 @@ elfw2(LIBELFBITS,getphdr) (elf)
ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
/* If no program header exists return NULL. */
- size_t phnum = ehdr->e_phnum;
+ size_t phnum;
+ if (__elf_getphdrnum_rdlock (elf, &phnum) != 0)
+ goto out;
if (phnum == 0)
{
__libelf_seterrno (ELF_E_NO_PHDR);
@@ -114,6 +105,13 @@ elfw2(LIBELFBITS,getphdr) (elf)
size_t size = phnum * sizeof (ElfW2(LIBELFBITS,Phdr));
+ if (ehdr->e_phoff > elf->maximum_size
+ || elf->maximum_size - ehdr->e_phoff < size)
+ {
+ __libelf_seterrno (ELF_E_INVALID_DATA);
+ goto out;
+ }
+
if (elf->map_address != NULL)
{
/* All the data is already mapped. Use it. */
@@ -234,6 +232,33 @@ elfw2(LIBELFBITS,getphdr) (elf)
}
out:
+ return result;
+}
+
+ElfW2(LIBELFBITS,Phdr) *
+elfw2(LIBELFBITS,getphdr) (elf)
+ Elf *elf;
+{
+ ElfW2(LIBELFBITS,Phdr) *result;
+
+ if (elf == NULL)
+ return NULL;
+
+ if (unlikely (elf->kind != ELF_K_ELF))
+ {
+ __libelf_seterrno (ELF_E_INVALID_HANDLE);
+ return NULL;
+ }
+
+ /* If the program header entry has already been filled in the code
+ * in getphdr_wrlock must already have been run. So the class is
+ * set, too. No need to waste any more time here. */
+ result = elf->state.ELFW(elf,LIBELFBITS).phdr;
+ if (likely (result != NULL))
+ return result;
+
+ rwlock_wrlock (elf->lock);
+ result = __elfw2(LIBELFBITS,getphdr_wrlock) (elf);
rwlock_unlock (elf->lock);
return result;
diff --git a/libelf/elf32_getshdr.c b/libelf/elf32_getshdr.c
index cafb1d4f..8d650d9f 100644
--- a/libelf/elf32_getshdr.c
+++ b/libelf/elf32_getshdr.c
@@ -1,5 +1,5 @@
/* Return section header.
- Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005, 2007 Red Hat, Inc.
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005, 2007, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 1998.
@@ -54,6 +54,7 @@
#include <assert.h>
#include <errno.h>
+#include <stdbool.h>
#include <unistd.h>
#include <system.h>
@@ -65,165 +66,229 @@
#endif
-ElfW2(LIBELFBITS,Shdr) *
-elfw2(LIBELFBITS,getshdr) (scn)
- Elf_Scn *scn;
+static ElfW2(LIBELFBITS,Shdr) *
+load_shdr_wrlock (Elf_Scn *scn)
{
ElfW2(LIBELFBITS,Shdr) *result;
- if (scn == NULL)
- return NULL;
+ /* Read the section header table. */
+ Elf *elf = scn->elf;
+ ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
- if (unlikely (scn->elf->state.elf.ehdr == NULL))
- {
- __libelf_seterrno (ELF_E_WRONG_ORDER_EHDR);
- return NULL;
- }
+ /* Try again, maybe the data is there now. */
+ result = scn->shdr.ELFW(e,LIBELFBITS);
+ if (result != NULL)
+ goto out;
- if (unlikely (scn->elf->class != ELFW(ELFCLASS,LIBELFBITS)))
+ size_t shnum;
+ if (__elf_getshdrnum_rdlock (elf, &shnum) != 0)
+ goto out;
+ size_t size = shnum * sizeof (ElfW2(LIBELFBITS,Shdr));
+
+ /* Allocate memory for the section headers. We know the number
+ of entries from the ELF header. */
+ ElfW2(LIBELFBITS,Shdr) *shdr = elf->state.ELFW(elf,LIBELFBITS).shdr =
+ (ElfW2(LIBELFBITS,Shdr) *) malloc (size);
+ if (elf->state.ELFW(elf,LIBELFBITS).shdr == NULL)
{
- __libelf_seterrno (ELF_E_INVALID_CLASS);
- return NULL;
+ __libelf_seterrno (ELF_E_NOMEM);
+ goto out;
}
+ elf->state.ELFW(elf,LIBELFBITS).shdr_malloced = 1;
- result = scn->shdr.ELFW(e,LIBELFBITS);
- if (result == NULL)
+ if (elf->map_address != NULL)
{
- /* Read the section header table. */
- Elf *elf = scn->elf;
- ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
+ ElfW2(LIBELFBITS,Shdr) *notcvt;
- rwlock_wrlock (elf->lock);
+ /* All the data is already mapped. If we could use it
+ directly this would already have happened. */
+ void *file_shdr = ((char *) elf->map_address
+ + elf->start_offset + ehdr->e_shoff);
- /* Try again, maybe the data is there now. */
- result = scn->shdr.ELFW(e,LIBELFBITS);
- if (result != NULL)
- goto out;
-
- size_t shnum;
- if (INTUSE (elf_getshnum) (elf, &shnum) != 0)
- goto out;
- size_t size = shnum * sizeof (ElfW2(LIBELFBITS,Shdr));
-
- /* Allocate memory for the section headers. We know the number
- of entries from the ELF header. */
- ElfW2(LIBELFBITS,Shdr) *shdr = elf->state.ELFW(elf,LIBELFBITS).shdr =
- (ElfW2(LIBELFBITS,Shdr) *) malloc (size);
- if (elf->state.ELFW(elf,LIBELFBITS).shdr == NULL)
+ assert (ehdr->e_ident[EI_DATA] != MY_ELFDATA
+ || (! ALLOW_UNALIGNED
+ && ((uintptr_t) file_shdr
+ & (__alignof__ (ElfW2(LIBELFBITS,Shdr)) - 1)) != 0));
+
+ /* Now copy the data and at the same time convert the byte order. */
+ if (ehdr->e_ident[EI_DATA] == MY_ELFDATA)
{
- __libelf_seterrno (ELF_E_NOMEM);
- goto out;
+ assert (! ALLOW_UNALIGNED);
+ memcpy (shdr, file_shdr, size);
}
- elf->state.ELFW(elf,LIBELFBITS).shdr_malloced = 1;
-
- if (elf->map_address != NULL)
+ else
{
- ElfW2(LIBELFBITS,Shdr) *notcvt;
-
- /* All the data is already mapped. If we could use it
- directly this would already have happened. */
- void *file_shdr = ((char *) elf->map_address
- + elf->start_offset + ehdr->e_shoff);
-
- assert (ehdr->e_ident[EI_DATA] != MY_ELFDATA
- || (! ALLOW_UNALIGNED
- && ((uintptr_t) file_shdr
- & (__alignof__ (ElfW2(LIBELFBITS,Shdr)) - 1)) != 0));
-
- /* Now copy the data and at the same time convert the byte order. */
- if (ehdr->e_ident[EI_DATA] == MY_ELFDATA)
- {
- assert (! ALLOW_UNALIGNED);
- memcpy (shdr, file_shdr, size);
- }
+ if (ALLOW_UNALIGNED
+ || ((uintptr_t) file_shdr
+ & (__alignof__ (ElfW2(LIBELFBITS,Shdr)) - 1)) == 0)
+ notcvt = (ElfW2(LIBELFBITS,Shdr) *)
+ ((char *) elf->map_address
+ + elf->start_offset + ehdr->e_shoff);
else
{
- if (ALLOW_UNALIGNED
- || ((uintptr_t) file_shdr
- & (__alignof__ (ElfW2(LIBELFBITS,Shdr)) - 1)) == 0)
- notcvt = (ElfW2(LIBELFBITS,Shdr) *)
- ((char *) elf->map_address
- + elf->start_offset + ehdr->e_shoff);
- else
- {
- notcvt = (ElfW2(LIBELFBITS,Shdr) *) alloca (size);
- memcpy (notcvt, ((char *) elf->map_address
- + elf->start_offset + ehdr->e_shoff),
- size);
- }
-
- for (size_t cnt = 0; cnt < shnum; ++cnt)
- {
- CONVERT_TO (shdr[cnt].sh_name, notcvt[cnt].sh_name);
- CONVERT_TO (shdr[cnt].sh_type, notcvt[cnt].sh_type);
- CONVERT_TO (shdr[cnt].sh_flags, notcvt[cnt].sh_flags);
- CONVERT_TO (shdr[cnt].sh_addr, notcvt[cnt].sh_addr);
- CONVERT_TO (shdr[cnt].sh_offset, notcvt[cnt].sh_offset);
- CONVERT_TO (shdr[cnt].sh_size, notcvt[cnt].sh_size);
- CONVERT_TO (shdr[cnt].sh_link, notcvt[cnt].sh_link);
- CONVERT_TO (shdr[cnt].sh_info, notcvt[cnt].sh_info);
- CONVERT_TO (shdr[cnt].sh_addralign,
- notcvt[cnt].sh_addralign);
- CONVERT_TO (shdr[cnt].sh_entsize, notcvt[cnt].sh_entsize);
- }
+ notcvt = (ElfW2(LIBELFBITS,Shdr) *) alloca (size);
+ memcpy (notcvt, ((char *) elf->map_address
+ + elf->start_offset + ehdr->e_shoff),
+ size);
}
- }
- else if (likely (elf->fildes != -1))
- {
- /* Read the header. */
- ssize_t n = pread_retry (elf->fildes,
- elf->state.ELFW(elf,LIBELFBITS).shdr, size,
- elf->start_offset + ehdr->e_shoff);
- if (unlikely ((size_t) n != size))
+
+ for (size_t cnt = 0; cnt < shnum; ++cnt)
{
- /* Severe problems. We cannot read the data. */
- __libelf_seterrno (ELF_E_READ_ERROR);
- goto free_and_out;
- }
+ CONVERT_TO (shdr[cnt].sh_name, notcvt[cnt].sh_name);
+ CONVERT_TO (shdr[cnt].sh_type, notcvt[cnt].sh_type);
+ CONVERT_TO (shdr[cnt].sh_flags, notcvt[cnt].sh_flags);
+ CONVERT_TO (shdr[cnt].sh_addr, notcvt[cnt].sh_addr);
+ CONVERT_TO (shdr[cnt].sh_offset, notcvt[cnt].sh_offset);
+ CONVERT_TO (shdr[cnt].sh_size, notcvt[cnt].sh_size);
+ CONVERT_TO (shdr[cnt].sh_link, notcvt[cnt].sh_link);
+ CONVERT_TO (shdr[cnt].sh_info, notcvt[cnt].sh_info);
+ CONVERT_TO (shdr[cnt].sh_addralign,
+ notcvt[cnt].sh_addralign);
+ CONVERT_TO (shdr[cnt].sh_entsize, notcvt[cnt].sh_entsize);
+
+ /* If this is a section with an extended index add a
+ reference in the section which uses the extended
+ index. */
+ if (shdr[cnt].sh_type == SHT_SYMTAB_SHNDX
+ && shdr[cnt].sh_link < shnum)
+ elf->state.ELFW(elf,LIBELFBITS).scns.data[shdr[cnt].sh_link].shndx_index
+ = cnt;
- /* If the byte order of the file is not the same as the one
- of the host convert the data now. */
- if (ehdr->e_ident[EI_DATA] != MY_ELFDATA)
- for (size_t cnt = 0; cnt < shnum; ++cnt)
- {
- CONVERT (shdr[cnt].sh_name);
- CONVERT (shdr[cnt].sh_type);
- CONVERT (shdr[cnt].sh_flags);
- CONVERT (shdr[cnt].sh_addr);
- CONVERT (shdr[cnt].sh_offset);
- CONVERT (shdr[cnt].sh_size);
- CONVERT (shdr[cnt].sh_link);
- CONVERT (shdr[cnt].sh_info);
- CONVERT (shdr[cnt].sh_addralign);
- CONVERT (shdr[cnt].sh_entsize);
- }
+ /* Set the own shndx_index field in case it has not yet
+ been set. */
+ if (elf->state.ELFW(elf,LIBELFBITS).scns.data[cnt].shndx_index == 0)
+ elf->state.ELFW(elf,LIBELFBITS).scns.data[cnt].shndx_index
+ = -1;
+ }
}
- else
+ }
+ else if (likely (elf->fildes != -1))
+ {
+ /* Read the header. */
+ ssize_t n = pread_retry (elf->fildes,
+ elf->state.ELFW(elf,LIBELFBITS).shdr, size,
+ elf->start_offset + ehdr->e_shoff);
+ if (unlikely ((size_t) n != size))
{
- /* The file descriptor was already enabled and not all data was
- read. Undo the allocation. */
- __libelf_seterrno (ELF_E_FD_DISABLED);
+ /* Severe problems. We cannot read the data. */
+ __libelf_seterrno (ELF_E_READ_ERROR);
+ goto free_and_out;
+ }
+
+ /* If the byte order of the file is not the same as the one
+ of the host convert the data now. */
+ if (ehdr->e_ident[EI_DATA] != MY_ELFDATA)
+ for (size_t cnt = 0; cnt < shnum; ++cnt)
+ {
+ CONVERT (shdr[cnt].sh_name);
+ CONVERT (shdr[cnt].sh_type);
+ CONVERT (shdr[cnt].sh_flags);
+ CONVERT (shdr[cnt].sh_addr);
+ CONVERT (shdr[cnt].sh_offset);
+ CONVERT (shdr[cnt].sh_size);
+ CONVERT (shdr[cnt].sh_link);
+ CONVERT (shdr[cnt].sh_info);
+ CONVERT (shdr[cnt].sh_addralign);
+ CONVERT (shdr[cnt].sh_entsize);
+ }
+ }
+ else
+ {
+ /* The file descriptor was already enabled and not all data was
+ read. Undo the allocation. */
+ __libelf_seterrno (ELF_E_FD_DISABLED);
- free_and_out:
- free (shdr);
- elf->state.ELFW(elf,LIBELFBITS).shdr = NULL;
- elf->state.ELFW(elf,LIBELFBITS).shdr_malloced = 0;
+ free_and_out:
+ free (shdr);
+ elf->state.ELFW(elf,LIBELFBITS).shdr = NULL;
+ elf->state.ELFW(elf,LIBELFBITS).shdr_malloced = 0;
- goto out;
- }
+ goto out;
+ }
- /* Set the pointers in the `scn's. */
- for (size_t cnt = 0; cnt < shnum; ++cnt)
- elf->state.ELFW(elf,LIBELFBITS).scns.data[cnt].shdr.ELFW(e,LIBELFBITS)
- = &elf->state.ELFW(elf,LIBELFBITS).shdr[cnt];
+ /* Set the pointers in the `scn's. */
+ for (size_t cnt = 0; cnt < shnum; ++cnt)
+ elf->state.ELFW(elf,LIBELFBITS).scns.data[cnt].shdr.ELFW(e,LIBELFBITS)
+ = &elf->state.ELFW(elf,LIBELFBITS).shdr[cnt];
- result = scn->shdr.ELFW(e,LIBELFBITS);
- assert (result != NULL);
+ result = scn->shdr.ELFW(e,LIBELFBITS);
+ assert (result != NULL);
+
+out:
+ return result;
+}
+
+static bool
+scn_valid (Elf_Scn *scn)
+{
+ if (scn == NULL)
+ return false;
- out:
- rwlock_unlock (elf->lock);
+ if (unlikely (scn->elf->state.elf.ehdr == NULL))
+ {
+ __libelf_seterrno (ELF_E_WRONG_ORDER_EHDR);
+ return false;
+ }
+
+ if (unlikely (scn->elf->class != ELFW(ELFCLASS,LIBELFBITS)))
+ {
+ __libelf_seterrno (ELF_E_INVALID_CLASS);
+ return false;
+ }
+
+ return true;
+}
+
+ElfW2(LIBELFBITS,Shdr) *
+__elfw2(LIBELFBITS,getshdr_rdlock) (scn)
+ Elf_Scn *scn;
+{
+ ElfW2(LIBELFBITS,Shdr) *result;
+
+ if (!scn_valid (scn))
+ return NULL;
+
+ result = scn->shdr.ELFW(e,LIBELFBITS);
+ if (result == NULL)
+ {
+ rwlock_unlock (scn->elf->lock);
+ rwlock_wrlock (scn->elf->lock);
+ result = scn->shdr.ELFW(e,LIBELFBITS);
+ if (result == NULL)
+ result = load_shdr_wrlock (scn);
}
return result;
}
-INTDEF(elfw2(LIBELFBITS,getshdr))
+
+ElfW2(LIBELFBITS,Shdr) *
+__elfw2(LIBELFBITS,getshdr_wrlock) (scn)
+ Elf_Scn *scn;
+{
+ ElfW2(LIBELFBITS,Shdr) *result;
+
+ if (!scn_valid (scn))
+ return NULL;
+
+ result = scn->shdr.ELFW(e,LIBELFBITS);
+ if (result == NULL)
+ result = load_shdr_wrlock (scn);
+
+ return result;
+}
+
+ElfW2(LIBELFBITS,Shdr) *
+elfw2(LIBELFBITS,getshdr) (scn)
+ Elf_Scn *scn;
+{
+ ElfW2(LIBELFBITS,Shdr) *result;
+
+ if (!scn_valid (scn))
+ return NULL;
+
+ rwlock_rdlock (scn->elf->lock);
+ result = __elfw2(LIBELFBITS,getshdr_rdlock) (scn);
+ rwlock_unlock (scn->elf->lock);
+
+ return result;
+}
diff --git a/libelf/elf32_newphdr.c b/libelf/elf32_newphdr.c
index d1b16088..03ff100a 100644
--- a/libelf/elf32_newphdr.c
+++ b/libelf/elf32_newphdr.c
@@ -1,5 +1,5 @@
/* Create new ELF program header table.
- Copyright (C) 1999, 2000, 2002 Red Hat, Inc.
+ Copyright (C) 1999-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 1998.
@@ -79,6 +79,12 @@ elfw2(LIBELFBITS,newphdr) (elf, count)
return NULL;
}
+ if (unlikely ((ElfW2(LIBELFBITS,Word)) count != count))
+ {
+ __libelf_seterrno (ELF_E_INVALID_OPERAND);
+ return NULL;
+ }
+
rwlock_wrlock (elf->lock);
if (elf->class == 0)
@@ -110,6 +116,10 @@ elfw2(LIBELFBITS,newphdr) (elf, count)
elf->state.ELFW(elf,LIBELFBITS).phdr = NULL;
/* Set the `e_phnum' member to the new value. */
elf->state.ELFW(elf,LIBELFBITS).ehdr->e_phnum = 0;
+ /* Also clear any old PN_XNUM extended value. */
+ if (elf->state.ELFW(elf,LIBELFBITS).scns.cnt > 0)
+ elf->state.ELFW(elf,LIBELFBITS).scns.data[0]
+ .shdr.ELFW(e,LIBELFBITS)->sh_info = 0;
/* Also set the size. */
elf->state.ELFW(elf,LIBELFBITS).ehdr->e_phentsize =
sizeof (ElfW2(LIBELFBITS,Phdr));
@@ -122,6 +132,7 @@ elfw2(LIBELFBITS,newphdr) (elf, count)
result = NULL;
}
else if (elf->state.ELFW(elf,LIBELFBITS).ehdr->e_phnum != count
+ || count == PN_XNUM
|| elf->state.ELFW(elf,LIBELFBITS).phdr == NULL)
{
/* Allocate a new program header with the appropriate number of
@@ -135,10 +146,24 @@ elfw2(LIBELFBITS,newphdr) (elf, count)
{
/* Now set the result. */
elf->state.ELFW(elf,LIBELFBITS).phdr = result;
+ if (count >= PN_XNUM)
+ {
+ /* We have to write COUNT into the zeroth section's sh_info. */
+ Elf_Scn *scn0 = &elf->state.ELFW(elf,LIBELFBITS).scns.data[0];
+ if (elf->state.ELFW(elf,LIBELFBITS).scns.cnt == 0)
+ {
+ assert (elf->state.ELFW(elf,LIBELFBITS).scns.max > 0);
+ elf->state.ELFW(elf,LIBELFBITS).scns.cnt = 1;
+ }
+ scn0->shdr.ELFW(e,LIBELFBITS)->sh_info = count;
+ scn0->shdr_flags |= ELF_F_DIRTY;
+ elf->state.ELFW(elf,LIBELFBITS).ehdr->e_phnum = PN_XNUM;
+ }
+ else
+ /* Set the `e_phnum' member to the new value. */
+ elf->state.ELFW(elf,LIBELFBITS).ehdr->e_phnum = count;
/* Clear the whole memory. */
memset (result, '\0', count * sizeof (ElfW2(LIBELFBITS,Phdr)));
- /* Set the `e_phnum' member to the new value. */
- elf->state.ELFW(elf,LIBELFBITS).ehdr->e_phnum = count;
/* Also set the size. */
elf->state.ELFW(elf,LIBELFBITS).ehdr->e_phentsize =
elf_typesize (LIBELFBITS, ELF_T_PHDR, 1);
@@ -161,6 +186,7 @@ elfw2(LIBELFBITS,newphdr) (elf, count)
elf->state.ELFW(elf,LIBELFBITS).phdr_flags |= ELF_F_DIRTY;
result = elf->state.ELFW(elf,LIBELFBITS).phdr;
+ memset (result, '\0', count * sizeof (ElfW2(LIBELFBITS,Phdr)));
}
out:
diff --git a/libelf/elf32_offscn.c b/libelf/elf32_offscn.c
index cdfdfad7..86eff8b1 100644
--- a/libelf/elf32_offscn.c
+++ b/libelf/elf32_offscn.c
@@ -1,5 +1,5 @@
/* Get section at specific index.
- Copyright (C) 2005 Red Hat, Inc.
+ Copyright (C) 2005, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2005.
@@ -77,12 +77,20 @@ elfw2(LIBELFBITS,offscn) (elf, offset)
return NULL;
}
+ Elf_ScnList *runp = &elf->state.ELFW(elf,LIBELFBITS).scns;
+
+ /* If we have not looked at section headers before,
+ we might need to read them in first. */
+ if (runp->cnt > 0
+ && unlikely (runp->data[0].shdr.ELFW(e,LIBELFBITS) == NULL)
+ && unlikely (elfw2(LIBELFBITS,getshdr) (&runp->data[0]) == NULL))
+ return NULL;
+
rwlock_rdlock (elf->lock);
Elf_Scn *result = NULL;
/* Find the section in the list. */
- Elf_ScnList *runp = &elf->state.ELFW(elf,LIBELFBITS).scns;
while (1)
{
for (unsigned int i = 0; i < runp->cnt; ++i)
diff --git a/libelf/elf32_updatefile.c b/libelf/elf32_updatefile.c
index e94de831..898cf1ab 100644
--- a/libelf/elf32_updatefile.c
+++ b/libelf/elf32_updatefile.c
@@ -1,5 +1,5 @@
/* Write changed data structures.
- Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2000-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2000.
@@ -126,11 +126,10 @@ int
internal_function
__elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
{
- ElfW2(LIBELFBITS,Ehdr) *ehdr;
- char *last_position;
+ bool previous_scn_changed = false;
/* We need the ELF header several times. */
- ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
+ ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
/* Write out the ELF header. */
if ((elf->state.ELFW(elf,LIBELFBITS).ehdr_flags | elf->flags) & ELF_F_DIRTY)
@@ -160,8 +159,16 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
sizeof (ElfW2(LIBELFBITS,Ehdr)));
elf->state.ELFW(elf,LIBELFBITS).ehdr_flags &= ~ELF_F_DIRTY;
+
+ /* We start writing sections after the ELF header only if there is
+ no program header. */
+ previous_scn_changed = elf->state.ELFW(elf,LIBELFBITS).phdr == NULL;
}
+ size_t phnum;
+ if (unlikely (__elf_getphdrnum_rdlock (elf, &phnum) != 0))
+ return -1;
+
/* Write out the program header table. */
if (elf->state.ELFW(elf,LIBELFBITS).phdr != NULL
&& ((elf->state.ELFW(elf,LIBELFBITS).phdr_flags | elf->flags)
@@ -192,22 +199,26 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
/* Do the real work. */
(*fctp) (elf->map_address + elf->start_offset + ehdr->e_phoff,
elf->state.ELFW(elf,LIBELFBITS).phdr,
- sizeof (ElfW2(LIBELFBITS,Phdr)) * ehdr->e_phnum, 1);
+ sizeof (ElfW2(LIBELFBITS,Phdr)) * phnum, 1);
}
else
memcpy (elf->map_address + elf->start_offset + ehdr->e_phoff,
elf->state.ELFW(elf,LIBELFBITS).phdr,
- sizeof (ElfW2(LIBELFBITS,Phdr)) * ehdr->e_phnum);
+ sizeof (ElfW2(LIBELFBITS,Phdr)) * phnum);
elf->state.ELFW(elf,LIBELFBITS).phdr_flags &= ~ELF_F_DIRTY;
+
+ /* We modified the program header. Maybe this created a gap so
+ we have to write fill bytes, if necessary. */
+ previous_scn_changed = true;
}
/* From now on we have to keep track of the last position to eventually
fill the gaps with the prescribed fill byte. */
- last_position = ((char *) elf->map_address + elf->start_offset
- + MAX (elf_typesize (LIBELFBITS, ELF_T_EHDR, 1),
- ehdr->e_phoff)
- + elf_typesize (LIBELFBITS, ELF_T_PHDR, ehdr->e_phnum));
+ char *last_position = ((char *) elf->map_address + elf->start_offset
+ + MAX (elf_typesize (LIBELFBITS, ELF_T_EHDR, 1),
+ ehdr->e_phoff)
+ + elf_typesize (LIBELFBITS, ELF_T_PHDR, phnum));
/* Write all the sections. Well, only those which are modified. */
if (shnum > 0)
@@ -283,45 +294,70 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
for (size_t cnt = 0; cnt < shnum; ++cnt)
{
Elf_Scn *scn = scns[cnt];
+ if (scn->index == 0)
+ {
+ /* The dummy section header entry. It should not be
+ possible to mark this "section" as dirty. */
+ assert ((scn->flags & ELF_F_DIRTY) == 0);
+ continue;
+ }
ElfW2(LIBELFBITS,Shdr) *shdr = scn->shdr.ELFW(e,LIBELFBITS);
+ if (shdr->sh_type == SHT_NOBITS)
+ goto next;
char *scn_start = ((char *) elf->map_address
+ elf->start_offset + shdr->sh_offset);
Elf_Data_List *dl = &scn->data_list;
+ bool scn_changed = false;
- if (shdr->sh_type != SHT_NOBITS && scn->data_list_rear != NULL)
- do
+ void fill_mmap (size_t offset)
+ {
+ size_t written = 0;
+
+ if (last_position < shdr_start)
{
- if ((scn->flags | dl->flags | elf->flags) & ELF_F_DIRTY)
- {
- if (scn_start + dl->data.d.d_off != last_position)
- {
- if (scn_start + dl->data.d.d_off > last_position)
- {
- /* This code assumes that the data blocks for
- a section are ordered by offset. */
- size_t written = 0;
+ written = MIN (scn_start + offset - last_position,
+ shdr_start - last_position);
- if (last_position < shdr_start)
- {
- written = MIN (scn_start + dl->data.d.d_off
- - last_position,
- shdr_start - last_position);
+ memset (last_position, __libelf_fill_byte, written);
+ }
- memset (last_position, __libelf_fill_byte,
- written);
- }
+ if (last_position + written != scn_start + offset
+ && shdr_end < scn_start + offset)
+ {
+ char *fill_start = MAX (shdr_end, scn_start);
+ memset (fill_start, __libelf_fill_byte,
+ scn_start + offset - fill_start);
+ }
+ }
- if (last_position + written
- != scn_start + dl->data.d.d_off
- && shdr_end < scn_start + dl->data.d.d_off)
- memset (shdr_end, __libelf_fill_byte,
- scn_start + dl->data.d.d_off - shdr_end);
+ if (scn->data_list_rear != NULL)
+ do
+ {
+ assert (dl->data.d.d_off >= 0);
+ assert ((GElf_Off) dl->data.d.d_off <= shdr->sh_size);
+ assert (dl->data.d.d_size <= (shdr->sh_size
+ - (GElf_Off) dl->data.d.d_off));
+
+ /* If there is a gap, fill it. */
+ if (scn_start + dl->data.d.d_off > last_position
+ && (dl->data.d.d_off == 0
+ || ((scn->flags | dl->flags | elf->flags)
+ & ELF_F_DIRTY) != 0))
+ {
+ fill_mmap (dl->data.d.d_off);
+ last_position = scn_start + dl->data.d.d_off;
+ }
- last_position = scn_start + dl->data.d.d_off;
- }
- }
+ if ((scn->flags | dl->flags | elf->flags) & ELF_F_DIRTY)
+ {
+ /* Let it go backward if the sections use a bogus
+ layout with overlaps. We'll overwrite the stupid
+ user's section data with the latest one, rather than
+ crashing. */
+
+ last_position = scn_start + dl->data.d.d_off;
if (unlikely (change_bo))
{
@@ -343,19 +379,34 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
last_position = mempcpy (last_position,
dl->data.d.d_buf,
dl->data.d.d_size);
+
+ scn_changed = true;
}
else
last_position += dl->data.d.d_size;
+ assert (scn_start + dl->data.d.d_off + dl->data.d.d_size
+ == last_position);
+
dl->flags &= ~ELF_F_DIRTY;
dl = dl->next;
}
while (dl != NULL);
- else if (shdr->sh_type != SHT_NOBITS && scn->index != 0)
- /* We have to trust the existing section header information. */
- last_position += shdr->sh_size;
+ else
+ {
+ /* If the previous section (or the ELF/program
+ header) changed we might have to fill the gap. */
+ if (scn_start > last_position && previous_scn_changed)
+ fill_mmap (0);
+
+ /* We have to trust the existing section header information. */
+ last_position = scn_start + shdr->sh_size;
+ }
+
+ previous_scn_changed = scn_changed;
+ next:
scn->flags &= ~ELF_F_DIRTY;
}
@@ -460,6 +511,7 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
{
char fillbuf[FILLBUFSIZE];
size_t filled = 0;
+ bool previous_scn_changed = false;
/* We need the ELF header several times. */
ElfW2(LIBELFBITS,Ehdr) *ehdr = elf->state.ELFW(elf,LIBELFBITS).ehdr;
@@ -503,6 +555,10 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
}
elf->state.ELFW(elf,LIBELFBITS).ehdr_flags &= ~ELF_F_DIRTY;
+
+ /* We start writing sections after the ELF header only if there is
+ no program header. */
+ previous_scn_changed = elf->state.ELFW(elf,LIBELFBITS).phdr == NULL;
}
/* If the type sizes should be different at some time we have to
@@ -510,6 +566,10 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
assert (sizeof (ElfW2(LIBELFBITS,Phdr))
== elf_typesize (LIBELFBITS, ELF_T_PHDR, 1));
+ size_t phnum;
+ if (unlikely (__elf_getphdrnum_rdlock (elf, &phnum) != 0))
+ return -1;
+
/* Write out the program header table. */
if (elf->state.ELFW(elf,LIBELFBITS).phdr != NULL
&& ((elf->state.ELFW(elf,LIBELFBITS).phdr_flags | elf->flags)
@@ -539,7 +599,7 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
/* Allocate sufficient memory. */
tmp_phdr = (ElfW2(LIBELFBITS,Phdr) *)
- malloc (sizeof (ElfW2(LIBELFBITS,Phdr)) * ehdr->e_phnum);
+ malloc (sizeof (ElfW2(LIBELFBITS,Phdr)) * phnum);
if (tmp_phdr == NULL)
{
__libelf_seterrno (ELF_E_NOMEM);
@@ -548,14 +608,14 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
/* Write the converted ELF header in a temporary buffer. */
(*fctp) (tmp_phdr, elf->state.ELFW(elf,LIBELFBITS).phdr,
- sizeof (ElfW2(LIBELFBITS,Phdr)) * ehdr->e_phnum, 1);
+ sizeof (ElfW2(LIBELFBITS,Phdr)) * phnum, 1);
/* This is the buffer we want to write. */
out_phdr = tmp_phdr;
}
/* Write out the ELF header. */
- size_t phdr_size = sizeof (ElfW2(LIBELFBITS,Phdr)) * ehdr->e_phnum;
+ size_t phdr_size = sizeof (ElfW2(LIBELFBITS,Phdr)) * phnum;
if (unlikely ((size_t) pwrite_retry (elf->fildes, out_phdr,
phdr_size, ehdr->e_phoff)
!= phdr_size))
@@ -568,6 +628,10 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
free (tmp_phdr);
elf->state.ELFW(elf,LIBELFBITS).phdr_flags &= ~ELF_F_DIRTY;
+
+ /* We modified the program header. Maybe this created a gap so
+ we have to write fill bytes, if necessary. */
+ previous_scn_changed = true;
}
/* From now on we have to keep track of the last position to eventually
@@ -576,8 +640,7 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
if (elf->state.ELFW(elf,LIBELFBITS).phdr == NULL)
last_offset = elf_typesize (LIBELFBITS, ELF_T_EHDR, 1);
else
- last_offset = (ehdr->e_phoff
- + sizeof (ElfW2(LIBELFBITS,Phdr)) * ehdr->e_phnum);
+ last_offset = (ehdr->e_phoff + sizeof (ElfW2(LIBELFBITS,Phdr)) * phnum);
/* Write all the sections. Well, only those which are modified. */
if (shnum > 0)
@@ -606,33 +669,49 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
for (size_t cnt = 0; cnt < shnum; ++cnt)
{
Elf_Scn *scn = scns[cnt];
+ if (scn->index == 0)
+ {
+ /* The dummy section header entry. It should not be
+ possible to mark this "section" as dirty. */
+ assert ((scn->flags & ELF_F_DIRTY) == 0);
+ goto next;
+ }
ElfW2(LIBELFBITS,Shdr) *shdr = scn->shdr.ELFW(e,LIBELFBITS);
+ if (shdr->sh_type == SHT_NOBITS)
+ goto next;
off_t scn_start = elf->start_offset + shdr->sh_offset;
Elf_Data_List *dl = &scn->data_list;
+ bool scn_changed = false;
- if (shdr->sh_type != SHT_NOBITS && scn->data_list_rear != NULL
- && scn->index != 0)
+ if (scn->data_list_rear != NULL)
do
{
+ /* If there is a gap, fill it. */
+ if (scn_start + dl->data.d.d_off > last_offset
+ && ((previous_scn_changed && dl->data.d.d_off == 0)
+ || ((scn->flags | dl->flags | elf->flags)
+ & ELF_F_DIRTY) != 0))
+ {
+ if (unlikely (fill (elf->fildes, last_offset,
+ (scn_start + dl->data.d.d_off)
+ - last_offset, fillbuf,
+ &filled) != 0))
+ return 1;
+ }
+
if ((scn->flags | dl->flags | elf->flags) & ELF_F_DIRTY)
{
char tmpbuf[MAX_TMPBUF];
void *buf = dl->data.d.d_buf;
- if (scn_start + dl->data.d.d_off != last_offset)
- {
- assert (last_offset < scn_start + dl->data.d.d_off);
-
- if (unlikely (fill (elf->fildes, last_offset,
- (scn_start + dl->data.d.d_off)
- - last_offset, fillbuf,
- &filled) != 0))
- return 1;
+ /* Let it go backward if the sections use a bogus
+ layout with overlaps. We'll overwrite the stupid
+ user's section data with the latest one, rather than
+ crashing. */
- last_offset = scn_start + dl->data.d.d_off;
- }
+ last_offset = scn_start + dl->data.d.d_off;
if (unlikely (change_bo))
{
@@ -673,6 +752,8 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
if (buf != dl->data.d.d_buf && buf != tmpbuf)
free (buf);
+
+ scn_changed = true;
}
last_offset += dl->data.d.d_size;
@@ -682,9 +763,23 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
dl = dl->next;
}
while (dl != NULL);
- else if (shdr->sh_type != SHT_NOBITS && scn->index != 0)
- last_offset = scn_start + shdr->sh_size;
+ else
+ {
+ /* If the previous section (or the ELF/program
+ header) changed we might have to fill the gap. */
+ if (scn_start > last_offset && previous_scn_changed)
+ {
+ if (unlikely (fill (elf->fildes, last_offset,
+ scn_start - last_offset, fillbuf,
+ &filled) != 0))
+ return 1;
+ }
+
+ last_offset = scn_start + shdr->sh_size;
+ }
+ previous_scn_changed = scn_changed;
+ next:
/* Collect the section header table information. */
if (unlikely (change_bo))
(*shdr_fctp) (&shdr_data[scn->index],
diff --git a/libelf/elf32_updatenull.c b/libelf/elf32_updatenull.c
index b3299fe4..ca9a8708 100644
--- a/libelf/elf32_updatenull.c
+++ b/libelf/elf32_updatenull.c
@@ -1,5 +1,5 @@
/* Update data structures for changes.
- Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc.
+ Copyright (C) 2000-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2000.
@@ -133,12 +133,14 @@ ELFW(default_ehdr,LIBELFBITS) (Elf *elf, ElfW2(LIBELFBITS,Ehdr) *ehdr,
off_t
internal_function
-__elfw2(LIBELFBITS,updatenull) (Elf *elf, int *change_bop, size_t shnum)
+__elfw2(LIBELFBITS,updatenull_wrlock) (Elf *elf, int *change_bop, size_t shnum)
{
- ElfW2(LIBELFBITS,Ehdr) *ehdr = INTUSE(elfw2(LIBELFBITS,getehdr)) (elf);
+ ElfW2(LIBELFBITS,Ehdr) *ehdr;
int changed = 0;
int ehdr_flags = 0;
+ ehdr = __elfw2(LIBELFBITS,getehdr_wrlock) (elf);
+
/* Set the default values. */
if (ELFW(default_ehdr,LIBELFBITS) (elf, ehdr, shnum, change_bop) != 0)
return -1;
@@ -150,7 +152,7 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf, int *change_bop, size_t shnum)
if (elf->state.ELFW(elf,LIBELFBITS).phdr == NULL
&& (ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN
|| ehdr->e_type == ET_CORE))
- (void) INTUSE(elfw2(LIBELFBITS,getphdr)) (elf);
+ (void) __elfw2(LIBELFBITS,getphdr_wrlock) (elf);
if (elf->state.ELFW(elf,LIBELFBITS).phdr != NULL)
{
/* Only executables, shared objects, and core files have a program
@@ -162,13 +164,17 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf, int *change_bop, size_t shnum)
return -1;
}
+ size_t phnum;
+ if (unlikely (__elf_getphdrnum_rdlock (elf, &phnum) != 0))
+ return -1;
+
if (elf->flags & ELF_F_LAYOUT)
{
/* The user is supposed to fill out e_phoff. Use it and
e_phnum to determine the maximum extend. */
size = MAX ((size_t) size,
ehdr->e_phoff
- + elf_typesize (LIBELFBITS, ELF_T_PHDR, ehdr->e_phnum));
+ + elf_typesize (LIBELFBITS, ELF_T_PHDR, phnum));
}
else
{
@@ -177,7 +183,7 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf, int *change_bop, size_t shnum)
ehdr_flags);
/* We need no alignment here. */
- size += elf_typesize (LIBELFBITS, ELF_T_PHDR, ehdr->e_phnum);
+ size += elf_typesize (LIBELFBITS, ELF_T_PHDR, phnum);
}
}
@@ -204,7 +210,7 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf, int *change_bop, size_t shnum)
/* Load the section headers if necessary. This loads the
headers for all sections. */
if (list->data[1].shdr.ELFW(e,LIBELFBITS) == NULL)
- (void) INTUSE(elfw2(LIBELFBITS,getshdr)) (&list->data[1]);
+ (void) __elfw2(LIBELFBITS,getshdr_wrlock) (&list->data[1]);
do
{
@@ -265,7 +271,8 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf, int *change_bop, size_t shnum)
update_if_changed (shdr->sh_entsize, sh_entsize,
scn->shdr_flags);
- if (scn->data_read == 0 && __libelf_set_rawdata (scn) != 0)
+ if (scn->data_read == 0
+ && __libelf_set_rawdata_wrlock (scn) != 0)
/* Something went wrong. The error value is already set. */
return -1;
@@ -364,7 +371,7 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf, int *change_bop, size_t shnum)
{
/* The position of the section in the file
changed. Create the section data list. */
- if (INTUSE(elf_getdata) (scn, NULL) == NULL)
+ if (__elf_getdata_rdlock (scn, NULL) == NULL)
return -1;
}
@@ -398,8 +405,9 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf, int *change_bop, size_t shnum)
/* Store section information. */
if (elf->flags & ELF_F_LAYOUT)
{
- /* The user is supposed to fill out e_phoff. Use it and
- e_phnum to determine the maximum extend. */
+ /* The user is supposed to fill out e_shoff. Use it and
+ e_shnum (or sh_size of the dummy, first section header)
+ to determine the maximum extend. */
size = MAX ((GElf_Word) size,
(ehdr->e_shoff
+ (elf_typesize (LIBELFBITS, ELF_T_SHDR, shnum))));
diff --git a/libelf/elf_begin.c b/libelf/elf_begin.c
index b6e7e743..80507e5d 100644
--- a/libelf/elf_begin.c
+++ b/libelf/elf_begin.c
@@ -1,5 +1,5 @@
/* Create descriptor for processing file.
- Copyright (C) 1998-2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 1998-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 1998.
@@ -111,7 +111,11 @@ get_shnum (void *map_address, unsigned char *e_ident, int fildes, off_t offset,
bool is32 = e_ident[EI_CLASS] == ELFCLASS32;
/* Make the ELF header available. */
- if (e_ident[EI_DATA] == MY_ELFDATA)
+ if (e_ident[EI_DATA] == MY_ELFDATA
+ && (ALLOW_UNALIGNED
+ || (((size_t) e_ident
+ & ((is32 ? __alignof__ (Elf32_Ehdr) : __alignof__ (Elf64_Ehdr))
+ - 1)) == 0)))
ehdr.p = e_ident;
else
{
@@ -130,8 +134,11 @@ get_shnum (void *map_address, unsigned char *e_ident, int fildes, off_t offset,
else
memcpy (&ehdr_mem, e_ident, sizeof (Elf32_Ehdr));
- CONVERT (ehdr_mem.e32.e_shnum);
- CONVERT (ehdr_mem.e32.e_shoff);
+ if (e_ident[EI_DATA] != MY_ELFDATA)
+ {
+ CONVERT (ehdr_mem.e32.e_shnum);
+ CONVERT (ehdr_mem.e32.e_shoff);
+ }
}
else
{
@@ -143,8 +150,11 @@ get_shnum (void *map_address, unsigned char *e_ident, int fildes, off_t offset,
else
memcpy (&ehdr_mem, e_ident, sizeof (Elf64_Ehdr));
- CONVERT (ehdr_mem.e64.e_shnum);
- CONVERT (ehdr_mem.e64.e_shoff);
+ if (e_ident[EI_DATA] != MY_ELFDATA)
+ {
+ CONVERT (ehdr_mem.e64.e_shnum);
+ CONVERT (ehdr_mem.e64.e_shoff);
+ }
}
}
@@ -275,13 +285,22 @@ file_read_elf (int fildes, void *map_address, unsigned char *e_ident,
/* Could not determine the number of sections. */
return NULL;
- /* We can now allocate the memory. */
+ /* 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)
+ ? 1 : 0);
Elf *elf = allocate_elf (fildes, map_address, offset, maxsize, cmd, parent,
- ELF_K_ELF, scncnt * sizeof (Elf_Scn));
+ ELF_K_ELF, scnmax * sizeof (Elf_Scn));
if (elf == NULL)
/* Not enough memory. */
return NULL;
+ assert ((unsigned int) scncnt == scncnt);
+ assert (offsetof (struct Elf, state.elf32.scns)
+ == offsetof (struct Elf, state.elf64.scns));
+ elf->state.elf32.scns.cnt = scncnt;
+ elf->state.elf32.scns.max = scnmax;
+
/* Some more or less arbitrary value. */
elf->state.elf.scnincr = 10;
@@ -294,9 +313,6 @@ file_read_elf (int fildes, void *map_address, unsigned char *e_ident,
not sufficient for the architecture. */
Elf32_Ehdr *ehdr = (Elf32_Ehdr *) ((char *) map_address + offset);
- assert ((unsigned int) scncnt == scncnt);
- elf->state.elf32.scns.cnt = elf->state.elf32.scns.max = scncnt;
-
/* This is a 32-bit binary. */
if (map_address != NULL && e_ident[EI_DATA] == MY_ELFDATA
&& (ALLOW_UNALIGNED
@@ -310,11 +326,9 @@ file_read_elf (int fildes, void *map_address, unsigned char *e_ident,
elf->state.elf32.ehdr = ehdr;
elf->state.elf32.shdr
= (Elf32_Shdr *) ((char *) ehdr + ehdr->e_shoff);
- if (ehdr->e_phnum > 0)
- /* Assign a value only if there really is a program
- header. Otherwise the value remains NULL. */
- elf->state.elf32.phdr
- = (Elf32_Phdr *) ((char *) ehdr + ehdr->e_phoff);
+
+ /* Don't precache the phdr pointer here.
+ elf32_getphdr will validate it against the size when asked. */
for (size_t cnt = 0; cnt < scncnt; ++cnt)
{
@@ -322,11 +336,27 @@ file_read_elf (int fildes, void *map_address, unsigned char *e_ident,
elf->state.elf32.scns.data[cnt].elf = elf;
elf->state.elf32.scns.data[cnt].shdr.e32 =
&elf->state.elf32.shdr[cnt];
- elf->state.elf32.scns.data[cnt].rawdata_base =
- elf->state.elf32.scns.data[cnt].data_base =
- ((char *) map_address + offset
- + elf->state.elf32.shdr[cnt].sh_offset);
+ if (likely (elf->state.elf32.shdr[cnt].sh_offset < maxsize)
+ && likely (maxsize - elf->state.elf32.shdr[cnt].sh_offset
+ <= elf->state.elf32.shdr[cnt].sh_size))
+ elf->state.elf32.scns.data[cnt].rawdata_base =
+ elf->state.elf32.scns.data[cnt].data_base =
+ ((char *) map_address + offset
+ + elf->state.elf32.shdr[cnt].sh_offset);
elf->state.elf32.scns.data[cnt].list = &elf->state.elf32.scns;
+
+ /* If this is a section with an extended index add a
+ reference in the section which uses the extended
+ index. */
+ if (elf->state.elf32.shdr[cnt].sh_type == SHT_SYMTAB_SHNDX
+ && elf->state.elf32.shdr[cnt].sh_link < scncnt)
+ elf->state.elf32.scns.data[elf->state.elf32.shdr[cnt].sh_link].shndx_index
+ = cnt;
+
+ /* Set the own shndx_index field in case it has not yet
+ been set. */
+ if (elf->state.elf32.scns.data[cnt].shndx_index == 0)
+ elf->state.elf32.scns.data[cnt].shndx_index = -1;
}
}
else
@@ -369,9 +399,6 @@ file_read_elf (int fildes, void *map_address, unsigned char *e_ident,
not sufficient for the architecture. */
Elf64_Ehdr *ehdr = (Elf64_Ehdr *) ((char *) map_address + offset);
- assert ((unsigned int) scncnt == scncnt);
- elf->state.elf64.scns.cnt = elf->state.elf64.scns.max = scncnt;
-
/* This is a 64-bit binary. */
if (map_address != NULL && e_ident[EI_DATA] == MY_ELFDATA
&& (ALLOW_UNALIGNED
@@ -385,11 +412,9 @@ file_read_elf (int fildes, void *map_address, unsigned char *e_ident,
elf->state.elf64.ehdr = ehdr;
elf->state.elf64.shdr
= (Elf64_Shdr *) ((char *) ehdr + ehdr->e_shoff);
- if (ehdr->e_phnum > 0)
- /* Assign a value only if there really is a program
- header. Otherwise the value remains NULL. */
- elf->state.elf64.phdr
- = (Elf64_Phdr *) ((char *) ehdr + ehdr->e_phoff);
+
+ /* Don't precache the phdr pointer here.
+ elf64_getphdr will validate it against the size when asked. */
for (size_t cnt = 0; cnt < scncnt; ++cnt)
{
@@ -397,11 +422,27 @@ file_read_elf (int fildes, void *map_address, unsigned char *e_ident,
elf->state.elf64.scns.data[cnt].elf = elf;
elf->state.elf64.scns.data[cnt].shdr.e64 =
&elf->state.elf64.shdr[cnt];
- elf->state.elf64.scns.data[cnt].rawdata_base =
- elf->state.elf64.scns.data[cnt].data_base =
- ((char *) map_address + offset
- + elf->state.elf64.shdr[cnt].sh_offset);
+ if (likely (elf->state.elf64.shdr[cnt].sh_offset < maxsize)
+ && likely (maxsize - elf->state.elf64.shdr[cnt].sh_offset
+ <= elf->state.elf64.shdr[cnt].sh_size))
+ elf->state.elf64.scns.data[cnt].rawdata_base =
+ elf->state.elf64.scns.data[cnt].data_base =
+ ((char *) map_address + offset
+ + elf->state.elf64.shdr[cnt].sh_offset);
elf->state.elf64.scns.data[cnt].list = &elf->state.elf64.scns;
+
+ /* If this is a section with an extended index add a
+ reference in the section which uses the extended
+ index. */
+ if (elf->state.elf64.shdr[cnt].sh_type == SHT_SYMTAB_SHNDX
+ && elf->state.elf64.shdr[cnt].sh_link < scncnt)
+ elf->state.elf64.scns.data[elf->state.elf64.shdr[cnt].sh_link].shndx_index
+ = cnt;
+
+ /* Set the own shndx_index field in case it has not yet
+ been set. */
+ if (elf->state.elf64.scns.data[cnt].shndx_index == 0)
+ elf->state.elf64.scns.data[cnt].shndx_index = -1;
}
}
else
@@ -714,7 +755,7 @@ read_long_names (Elf *elf)
/* Read the next archive header. */
int
internal_function
-__libelf_next_arhdr (elf)
+__libelf_next_arhdr_wrlock (elf)
Elf *elf;
{
struct ar_hdr *ar_hdr;
@@ -824,112 +865,45 @@ __libelf_next_arhdr (elf)
elf_ar_hdr->ar_name = elf->state.ar.ar_name;
}
+ if (unlikely (ar_hdr->ar_size[0] == ' '))
+ /* Something is really wrong. We cannot live without a size for
+ the member since it will not be possible to find the next
+ archive member. */
+ {
+ __libelf_seterrno (ELF_E_INVALID_ARCHIVE);
+ return -1;
+ }
+
/* Since there are no specialized functions to convert ASCII to
time_t, uid_t, gid_t, mode_t, and off_t we use either atol or
atoll depending on the size of the types. We are also prepared
for the case where the whole field in the `struct ar_hdr' is
filled in which case we cannot simply use atol/l but instead have
to create a temporary copy. */
- if (ar_hdr->ar_date[sizeof (ar_hdr->ar_date) - 1] == ' ')
- {
- if (ar_hdr->ar_date[0] == ' ')
- elf_ar_hdr->ar_date = 0;
- else
- elf_ar_hdr->ar_date = (sizeof (time_t) <= sizeof (long int)
- ? (time_t) atol (ar_hdr->ar_date)
- : (time_t) atoll (ar_hdr->ar_date));
- }
- else
- {
- char buf[sizeof (ar_hdr->ar_date) + 1];
- *((char *) __mempcpy (buf, ar_hdr->ar_date, sizeof (ar_hdr->ar_date)))
- = '\0';
- elf_ar_hdr->ar_date = (sizeof (time_t) <= sizeof (long int)
- ? (time_t) atol (ar_hdr->ar_date)
- : (time_t) atoll (ar_hdr->ar_date));
- }
- if (ar_hdr->ar_uid[sizeof (ar_hdr->ar_uid) - 1] == ' ')
- {
- if (ar_hdr->ar_uid[0] == ' ')
- elf_ar_hdr->ar_uid = 0;
- else
- elf_ar_hdr->ar_uid = (sizeof (uid_t) <= sizeof (long int)
- ? (uid_t) atol (ar_hdr->ar_uid)
- : (uid_t) atoll (ar_hdr->ar_uid));
- }
- else
- {
- char buf[sizeof (ar_hdr->ar_uid) + 1];
- *((char *) __mempcpy (buf, ar_hdr->ar_uid, sizeof (ar_hdr->ar_uid)))
- = '\0';
- elf_ar_hdr->ar_uid = (sizeof (uid_t) <= sizeof (long int)
- ? (uid_t) atol (ar_hdr->ar_uid)
- : (uid_t) atoll (ar_hdr->ar_uid));
- }
-
- if (ar_hdr->ar_gid[sizeof (ar_hdr->ar_gid) - 1] == ' ')
- {
- if (ar_hdr->ar_gid[0] == ' ')
- elf_ar_hdr->ar_gid = 0;
- else
- elf_ar_hdr->ar_gid = (sizeof (gid_t) <= sizeof (long int)
- ? (gid_t) atol (ar_hdr->ar_gid)
- : (gid_t) atoll (ar_hdr->ar_gid));
- }
- else
- {
- char buf[sizeof (ar_hdr->ar_gid) + 1];
- *((char *) __mempcpy (buf, ar_hdr->ar_gid, sizeof (ar_hdr->ar_gid)))
- = '\0';
- elf_ar_hdr->ar_gid = (sizeof (gid_t) <= sizeof (long int)
- ? (gid_t) atol (ar_hdr->ar_gid)
- : (gid_t) atoll (ar_hdr->ar_gid));
- }
-
- if (ar_hdr->ar_mode[sizeof (ar_hdr->ar_mode) - 1] == ' ')
- {
- if (ar_hdr->ar_mode[0] == ' ')
- elf_ar_hdr->ar_mode = 0;
- else
- elf_ar_hdr->ar_mode = (sizeof (mode_t) <= sizeof (long int)
- ? (mode_t) strtol (ar_hdr->ar_mode, NULL, 8)
- : (mode_t) strtoll (ar_hdr->ar_mode, NULL, 8));
- }
- else
- {
- char buf[sizeof (ar_hdr->ar_mode) + 1];
- *((char *) __mempcpy (buf, ar_hdr->ar_mode, sizeof (ar_hdr->ar_mode)))
- = '\0';
- elf_ar_hdr->ar_mode = (sizeof (mode_t) <= sizeof (long int)
- ? (mode_t) strtol (ar_hdr->ar_mode, NULL, 8)
- : (mode_t) strtoll (ar_hdr->ar_mode, NULL, 8));
- }
-
- if (ar_hdr->ar_size[sizeof (ar_hdr->ar_size) - 1] == ' ')
- {
- if (unlikely (ar_hdr->ar_size[0] == ' '))
- /* Something is really wrong. We cannot live without a size for
- the member since it will not be possible to find the next
- archive member. */
- {
- __libelf_seterrno (ELF_E_INVALID_ARCHIVE);
- return -1;
- }
- else
- elf_ar_hdr->ar_size = (sizeof (time_t) == sizeof (long int)
- ? (off_t) atol (ar_hdr->ar_size)
- : (off_t) atoll (ar_hdr->ar_size));
- }
- else
- {
- char buf[sizeof (ar_hdr->ar_size) + 1];
- *((char *) __mempcpy (buf, ar_hdr->ar_size, sizeof (ar_hdr->ar_size)))
- = '\0';
- elf_ar_hdr->ar_size = (sizeof (time_t) == sizeof (long int)
- ? (off_t) atol (ar_hdr->ar_size)
- : (off_t) atoll (ar_hdr->ar_size));
- }
+#define INT_FIELD(FIELD) \
+ do \
+ { \
+ char buf[sizeof (ar_hdr->FIELD) + 1]; \
+ const char *string = ar_hdr->FIELD; \
+ if (ar_hdr->FIELD[sizeof (ar_hdr->FIELD) - 1] != ' ') \
+ { \
+ *((char *) __mempcpy (buf, ar_hdr->FIELD, sizeof (ar_hdr->FIELD))) \
+ = '\0'; \
+ string = buf; \
+ } \
+ if (sizeof (elf_ar_hdr->FIELD) <= sizeof (long int)) \
+ elf_ar_hdr->FIELD = (__typeof (elf_ar_hdr->FIELD)) atol (string); \
+ else \
+ elf_ar_hdr->FIELD = (__typeof (elf_ar_hdr->FIELD)) atoll (string); \
+ } \
+ while (0)
+
+ INT_FIELD (ar_date);
+ INT_FIELD (ar_uid);
+ INT_FIELD (ar_gid);
+ INT_FIELD (ar_mode);
+ INT_FIELD (ar_size);
return 0;
}
@@ -984,7 +958,7 @@ __libelf_dup_elf (int fildes, Elf_Cmd cmd, Elf *ref,
pointing to. First read the header of the next member if this
has not happened already. */
if (ref->state.ar.elf_ar_hdr.ar_name == NULL
- && __libelf_next_arhdr (ref) != 0)
+ && __libelf_next_arhdr_wrlock (ref) != 0)
/* Something went wrong. Maybe there is no member left. */
return NULL;
@@ -1061,6 +1035,19 @@ elf_begin (fildes, cmd, ref)
return NULL;
}
+ Elf *lock_dup_elf ()
+ {
+ /* We need wrlock to dup an archive. */
+ if (ref->kind == ELF_K_AR)
+ {
+ rwlock_unlock (ref->lock);
+ rwlock_wrlock (ref->lock);
+ }
+
+ /* Duplicate the descriptor. */
+ return dup_elf (fildes, cmd, ref);
+ }
+
switch (cmd)
{
case ELF_C_NULL:
@@ -1081,8 +1068,7 @@ elf_begin (fildes, cmd, ref)
case ELF_C_READ:
case ELF_C_READ_MMAP:
if (ref != NULL)
- /* Duplicate the descriptor. */
- retval = __libelf_dup_elf (fildes, cmd, ref, 0, 0);
+ retval = lock_dup_elf ();
else
/* Create descriptor for existing file. */
retval = read_file (fildes, 0, ~((size_t) 0), cmd, NULL);
@@ -1103,8 +1089,7 @@ elf_begin (fildes, cmd, ref)
retval = NULL;
}
else
- /* Duplicate this descriptor. */
- retval = __libelf_dup_elf (fildes, cmd, ref, 0, 0);
+ retval = lock_dup_elf ();
}
else
/* Create descriptor for existing file. */
diff --git a/libelf/elf_error.c b/libelf/elf_error.c
index 5e00372a..7f7504e3 100644
--- a/libelf/elf_error.c
+++ b/libelf/elf_error.c
@@ -1,5 +1,5 @@
/* Error handling in libelf.
- Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc.
+ Copyright (C) 1998-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 1998.
@@ -61,46 +61,14 @@
#include "libelfP.h"
-#ifdef USE_TLS
/* The error number. */
static __thread int global_error;
-#else
-/* This is the key for the thread specific memory. */
-static tls_key_t key;
-
-/* The error number. Used in non-threaded programs. */
-static int global_error;
-static bool threaded;
-/* We need to initialize the thread-specific data. */
-once_define (static, once);
-
-/* The initialization and destruction functions. */
-static void init (void);
-static void free_key_mem (void *mem);
-#endif /* TLS */
int
elf_errno (void)
{
- int result;
-
-#ifndef USE_TLS
- /* If we have not yet initialized the buffer do it now. */
- once_execute (once, init);
-
- if (threaded)
- {
- /* We do not allocate memory for the data. It is only a word.
- We can store it in place of the pointer. */
- result = (intptr_t) getspecific (key);
-
- setspecific (key, (void *) (intptr_t) ELF_E_NOERROR);
- return result;
- }
-#endif /* TLS */
-
- result = global_error;
+ int result = global_error;
global_error = ELF_E_NOERROR;
return result;
}
@@ -217,10 +185,10 @@ static const char msgstr[] =
"\0"
#define ELF_E_FD_MISMATCH_IDX \
(ELF_E_FD_DISABLED_IDX + sizeof "file descriptor disabled")
- N_("archive/member fildes mismatch")
+ N_("archive/member file descriptor mismatch")
"\0"
#define ELF_E_OFFSET_RANGE_IDX \
- (ELF_E_FD_MISMATCH_IDX + sizeof "archive/member fildes mismatch")
+ (ELF_E_FD_MISMATCH_IDX + sizeof "archive/member file descriptor mismatch")
N_("offset out of range")
"\0"
#define ELF_E_NOT_NUL_SECTION_IDX \
@@ -339,16 +307,6 @@ void
__libelf_seterrno (value)
int value;
{
-#ifndef USE_TLS
- /* If we have not yet initialized the buffer do it now. */
- once_execute (once, init);
-
- if (threaded)
- /* We do not allocate memory for the data. It is only a word.
- We can store it in place of the pointer. */
- setspecific (key, (void *) (intptr_t) value);
-#endif /* TLS */
-
global_error = value >= 0 && value < nmsgidx ? value : ELF_E_UNKNOWN_ERROR;
}
@@ -357,19 +315,7 @@ const char *
elf_errmsg (error)
int error;
{
- int last_error;
-
-#ifndef USE_TLS
- /* If we have not yet initialized the buffer do it now. */
- once_execute (once, init);
-
- if ((error == 0 || error == -1) && threaded)
- /* We do not allocate memory for the data. It is only a word.
- We can store it in place of the pointer. */
- last_error = (intptr_t) getspecific (key);
- else
-#endif /* TLS */
- last_error = global_error;
+ int last_error = global_error;
if (error == 0)
{
@@ -382,26 +328,3 @@ elf_errmsg (error)
assert (msgidx[error == -1 ? last_error : error] < sizeof (msgstr));
return _(msgstr + msgidx[error == -1 ? last_error : error]);
}
-
-
-#ifndef USE_TLS
-/* Free the thread specific data, this is done if a thread terminates. */
-static void
-free_key_mem (void *mem __attribute__ ((unused)))
-{
- setspecific (key, NULL);
-}
-
-
-/* Initialize the key for the global variable. */
-static void
-init (void)
-{
- // XXX Screw you, gcc4, the unused function attribute does not work.
- __asm ("" :: "r" (free_key_mem));
-
- if (key_create (&key, free_key_mem) == 0)
- /* Creating the key succeeded. */
- threaded = true;
-}
-#endif /* TLS */
diff --git a/libelf/elf_getarhdr.c b/libelf/elf_getarhdr.c
index deeb56db..61e4e0a2 100644
--- a/libelf/elf_getarhdr.c
+++ b/libelf/elf_getarhdr.c
@@ -1,5 +1,5 @@
/* Read header of next archive member.
- Copyright (C) 1998, 1999, 2000, 2002 Red Hat, Inc.
+ Copyright (C) 1998, 1999, 2000, 2002, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 1998.
@@ -63,6 +63,9 @@ Elf_Arhdr *
elf_getarhdr (elf)
Elf *elf;
{
+ if (elf == NULL)
+ return NULL;
+
Elf *parent = elf->parent;
/* Calling this function is not ok for any file type but archives. */
@@ -74,10 +77,16 @@ elf_getarhdr (elf)
/* Make sure we have read the archive header. */
if (parent->state.ar.elf_ar_hdr.ar_name == NULL
- && __libelf_next_arhdr (parent) != 0)
- /* Something went wrong. Maybe there is no member left. */
- return NULL;
+ && __libelf_next_arhdr_wrlock (parent) != 0)
+ {
+ rwlock_wrlock (parent->lock);
+ int st = __libelf_next_arhdr_wrlock (parent);
+ rwlock_unlock (parent->lock);
+ if (st != 0)
+ /* Something went wrong. Maybe there is no member left. */
+ return NULL;
+ }
/* We can be sure the parent is an archive. */
assert (parent->kind == ELF_K_AR);
diff --git a/libelf/elf_getaroff.c b/libelf/elf_getaroff.c
index f8b426e7..8dea0614 100644
--- a/libelf/elf_getaroff.c
+++ b/libelf/elf_getaroff.c
@@ -1,5 +1,5 @@
/* Return offset in archive for current file ELF.
- Copyright (C) 2005 Red Hat, Inc.
+ Copyright (C) 2005, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2005.
@@ -71,5 +71,5 @@ elf_getaroff (elf)
Elf *parent = elf->parent;
assert (parent->kind == ELF_K_AR);
- return parent->state.ar.offset;
+ return elf->start_offset - sizeof (struct ar_hdr) - parent->start_offset;
}
diff --git a/libelf/elf_getdata.c b/libelf/elf_getdata.c
index ae5b41df..5a718f82 100644
--- a/libelf/elf_getdata.c
+++ b/libelf/elf_getdata.c
@@ -189,7 +189,7 @@ convert_data (Elf_Scn *scn, int version __attribute__ ((unused)), int eclass,
/* Store the information for the raw data in the `rawdata' element. */
int
internal_function
-__libelf_set_rawdata (Elf_Scn *scn)
+__libelf_set_rawdata_wrlock (Elf_Scn *scn)
{
size_t offset;
size_t size;
@@ -199,7 +199,8 @@ __libelf_set_rawdata (Elf_Scn *scn)
if (elf->class == ELFCLASS32)
{
- Elf32_Shdr *shdr = scn->shdr.e32 ?: INTUSE(elf32_getshdr) (scn);
+ Elf32_Shdr *shdr
+ = scn->shdr.e32 ?: __elf32_getshdr_wrlock (scn);
if (shdr == NULL)
/* Something went terribly wrong. */
@@ -212,7 +213,8 @@ __libelf_set_rawdata (Elf_Scn *scn)
}
else
{
- Elf64_Shdr *shdr = scn->shdr.e64 ?: INTUSE(elf64_getshdr) (scn);
+ Elf64_Shdr *shdr
+ = scn->shdr.e64 ?: __elf64_getshdr_wrlock (scn);
if (shdr == NULL)
/* Something went terribly wrong. */
@@ -234,8 +236,8 @@ __libelf_set_rawdata (Elf_Scn *scn)
if (type == SHT_HASH)
{
GElf_Ehdr ehdr_mem;
-
- entsize = SH_ENTSIZE_HASH (INTUSE(gelf_getehdr) (elf, &ehdr_mem));
+ GElf_Ehdr *ehdr = __gelf_getehdr_rdlock (elf, &ehdr_mem);
+ entsize = SH_ENTSIZE_HASH (ehdr);
}
else
{
@@ -311,10 +313,9 @@ __libelf_set_rawdata (Elf_Scn *scn)
if (type == SHT_HASH && elf->class == ELFCLASS64)
{
GElf_Ehdr ehdr_mem;
-
+ GElf_Ehdr *ehdr = __gelf_getehdr_rdlock (elf, &ehdr_mem);
scn->rawdata.d.d_type
- = (SH_ENTSIZE_HASH (INTUSE(gelf_getehdr) (elf, &ehdr_mem)) == 4
- ? ELF_T_WORD : ELF_T_XWORD);
+ = (SH_ENTSIZE_HASH (ehdr) == 4 ? ELF_T_WORD : ELF_T_XWORD);
}
else
scn->rawdata.d.d_type = shtype_map[LIBELF_EV_IDX][TYPEIDX (type)];
@@ -339,14 +340,31 @@ __libelf_set_rawdata (Elf_Scn *scn)
return 0;
}
+int
+internal_function
+__libelf_set_rawdata (Elf_Scn *scn)
+{
+ int result;
+
+ if (scn == NULL)
+ return 1;
+
+ rwlock_wrlock (scn->elf->lock);
+ result = __libelf_set_rawdata_wrlock (scn);
+ rwlock_unlock (scn->elf->lock);
+
+ return result;
+}
Elf_Data *
-elf_getdata (scn, data)
+internal_function
+__elf_getdata_rdlock (scn, data)
Elf_Scn *scn;
Elf_Data *data;
{
Elf_Data *result = NULL;
Elf *elf;
+ int locked = 0;
if (scn == NULL)
return NULL;
@@ -360,8 +378,6 @@ elf_getdata (scn, data)
/* We will need this multiple times later on. */
elf = scn->elf;
- rwlock_rdlock (elf->lock);
-
/* If `data' is not NULL this means we are not addressing the initial
data in the file. But this also means this data is already read
(since otherwise it is not possible to have a valid `data' pointer)
@@ -416,11 +432,12 @@ elf_getdata (scn, data)
modified, therefore start the tests again. */
rwlock_unlock (elf->lock);
rwlock_wrlock (elf->lock);
+ locked = 1;
/* Read the data from the file. There is always a file (or
memory region) associated with this descriptor since
otherwise the `data_read' flag would be set. */
- if (scn->data_read == 0 && __libelf_set_rawdata (scn) != 0)
+ if (scn->data_read == 0 && __libelf_set_rawdata_wrlock (scn) != 0)
/* Something went wrong. The error value is already set. */
goto out;
}
@@ -431,29 +448,58 @@ elf_getdata (scn, data)
if (scn->data_list_rear == NULL)
{
if (scn->rawdata.d.d_buf != NULL && scn->rawdata.d.d_size > 0)
- /* Convert according to the version and the type. */
- convert_data (scn, __libelf_version, elf->class,
- (elf->class == ELFCLASS32
- || (offsetof (struct Elf, state.elf32.ehdr)
- == offsetof (struct Elf, state.elf64.ehdr))
- ? elf->state.elf32.ehdr->e_ident[EI_DATA]
- : elf->state.elf64.ehdr->e_ident[EI_DATA]),
- scn->rawdata.d.d_size, scn->rawdata.d.d_type);
+ {
+ if (!locked)
+ {
+ rwlock_unlock (elf->lock);
+ rwlock_wrlock (elf->lock);
+ if (scn->data_list_rear != NULL)
+ goto pass;
+ }
+
+ /* Convert according to the version and the type. */
+ convert_data (scn, __libelf_version, elf->class,
+ (elf->class == ELFCLASS32
+ || (offsetof (struct Elf, state.elf32.ehdr)
+ == offsetof (struct Elf, state.elf64.ehdr))
+ ? elf->state.elf32.ehdr->e_ident[EI_DATA]
+ : elf->state.elf64.ehdr->e_ident[EI_DATA]),
+ scn->rawdata.d.d_size, scn->rawdata.d.d_type);
+ }
else
- /* This is an empty or NOBITS section. There is no buffer but
- the size information etc is important. */
- scn->data_list.data.d = scn->rawdata.d;
+ {
+ /* This is an empty or NOBITS section. There is no buffer but
+ the size information etc is important. */
+ scn->data_list.data.d = scn->rawdata.d;
+ scn->data_list.data.s = scn;
+ }
scn->data_list_rear = &scn->data_list;
}
/* If no data is present we cannot return any. */
if (scn->data_list_rear != NULL)
+ pass:
/* Return the first data element in the list. */
result = &scn->data_list.data.d;
out:
- rwlock_unlock (elf->lock);
+ return result;
+}
+
+Elf_Data *
+elf_getdata (scn, data)
+ Elf_Scn *scn;
+ Elf_Data *data;
+{
+ Elf_Data *result;
+
+ if (scn == NULL)
+ return NULL;
+
+ rwlock_rdlock (scn->elf->lock);
+ result = __elf_getdata_rdlock (scn, data);
+ rwlock_unlock (scn->elf->lock);
return result;
}
diff --git a/libelf/elf_getdata_rawchunk.c b/libelf/elf_getdata_rawchunk.c
index bea0f3f6..5af0f7f3 100644
--- a/libelf/elf_getdata_rawchunk.c
+++ b/libelf/elf_getdata_rawchunk.c
@@ -95,6 +95,9 @@ elf_getdata_rawchunk (elf, offset, size, type)
/* Get the raw bytes from the file. */
void *rawchunk;
int flags = 0;
+ Elf_Data *result = NULL;
+
+ rwlock_rdlock (elf->lock);
/* If the file is mmap'ed we can use it directly. */
if (elf->map_address != NULL)
@@ -107,7 +110,7 @@ elf_getdata_rawchunk (elf, offset, size, type)
{
nomem:
__libelf_seterrno (ELF_E_NOMEM);
- return NULL;
+ goto out;
}
/* Read the file content. */
@@ -118,7 +121,7 @@ elf_getdata_rawchunk (elf, offset, size, type)
/* Something went wrong. */
free (rawchunk);
__libelf_seterrno (ELF_E_READ_ERROR);
- return NULL;
+ goto out;
}
flags = ELF_F_MALLOCED;
@@ -181,8 +184,14 @@ elf_getdata_rawchunk (elf, offset, size, type)
chunk->data.d.d_align = align;
chunk->data.d.d_version = __libelf_version;
+ rwlock_unlock (elf->lock);
+ rwlock_wrlock (elf->lock);
+
chunk->next = elf->state.elf.rawchunks;
elf->state.elf.rawchunks = chunk;
+ result = &chunk->data.d;
- return &chunk->data.d;
+ out:
+ rwlock_unlock (elf->lock);
+ return result;
}
diff --git a/libelf/elf_getphdrnum.c b/libelf/elf_getphdrnum.c
new file mode 100644
index 00000000..edf073ec
--- /dev/null
+++ b/libelf/elf_getphdrnum.c
@@ -0,0 +1,116 @@
+/* Return number of program headers in the ELF file.
+ Copyright (C) 2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+#include <gelf.h>
+#include <stddef.h>
+
+#include "libelfP.h"
+
+
+int
+__elf_getphdrnum_rdlock (elf, dst)
+ Elf *elf;
+ size_t *dst;
+{
+ if (unlikely (elf->state.elf64.ehdr == NULL))
+ {
+ /* Maybe no ELF header was created yet. */
+ __libelf_seterrno (ELF_E_WRONG_ORDER_EHDR);
+ return -1;
+ }
+
+ *dst = (elf->class == ELFCLASS32
+ ? elf->state.elf32.ehdr->e_phnum
+ : elf->state.elf64.ehdr->e_phnum);
+
+ if (*dst == PN_XNUM)
+ {
+ const Elf_ScnList *const scns = (elf->class == ELFCLASS32
+ ? &elf->state.elf32.scns
+ : &elf->state.elf64.scns);
+
+ /* If there are no section headers, perhaps this is really just 65536
+ written without PN_XNUM support. Either that or it's bad data. */
+
+ if (likely (scns->cnt > 0))
+ *dst = (elf->class == ELFCLASS32
+ ? scns->data[0].shdr.e32->sh_info
+ : scns->data[0].shdr.e64->sh_info);
+ }
+
+ return 0;
+}
+
+int
+elf_getphdrnum (elf, dst)
+ Elf *elf;
+ size_t *dst;
+{
+ int result;
+
+ if (elf == NULL)
+ return -1;
+
+ if (unlikely (elf->kind != ELF_K_ELF))
+ {
+ __libelf_seterrno (ELF_E_INVALID_HANDLE);
+ return -1;
+ }
+
+ rwlock_rdlock (elf->lock);
+ result = __elf_getphdrnum_rdlock (elf, dst);
+ rwlock_unlock (elf->lock);
+
+ return result;
+}
diff --git a/libelf/elf_getshnum.c b/libelf/elf_getshdrnum.c
index bf26a9b0..ed1149bb 100644
--- a/libelf/elf_getshnum.c
+++ b/libelf/elf_getshdrnum.c
@@ -1,5 +1,5 @@
/* Return number of sections in the ELF file.
- Copyright (C) 2002 Red Hat, Inc.
+ Copyright (C) 2002, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -60,7 +60,7 @@
int
-elf_getshnum (elf, dst)
+__elf_getshdrnum_rdlock (elf, dst)
Elf *elf;
size_t *dst;
{
@@ -76,8 +76,6 @@ elf_getshnum (elf, dst)
return -1;
}
- rwlock_rdlock (elf->lock);
-
idx = elf->state.elf.scns_last->cnt;
if (idx != 0
|| (elf->state.elf.scns_last
@@ -90,8 +88,24 @@ elf_getshnum (elf, dst)
else
*dst = 0;
+ return result;
+}
+
+int
+elf_getshdrnum (elf, dst)
+ Elf *elf;
+ size_t *dst;
+{
+ int result;
+
+ if (elf == NULL)
+ return -1;
+
+ rwlock_rdlock (elf->lock);
+ result = __elf_getshdrnum_rdlock (elf, dst);
rwlock_unlock (elf->lock);
return result;
}
-INTDEF(elf_getshnum)
+/* Alias for the deprecated name. */
+strong_alias (elf_getshdrnum, elf_getshnum)
diff --git a/libelf/elf_getshstrndx.c b/libelf/elf_getshdrstrndx.c
index 52516a8e..5e89b343 100644
--- a/libelf/elf_getshstrndx.c
+++ b/libelf/elf_getshdrstrndx.c
@@ -1,5 +1,5 @@
/* Return section index of section header string table.
- Copyright (C) 2002, 2005 Red Hat, Inc.
+ Copyright (C) 2002, 2005, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -64,7 +64,7 @@
int
-elf_getshstrndx (elf, dst)
+elf_getshdrstrndx (elf, dst)
Elf *elf;
size_t *dst;
{
@@ -200,4 +200,6 @@ elf_getshstrndx (elf, dst)
return result;
}
-INTDEF(elf_getshstrndx)
+INTDEF(elf_getshdrstrndx)
+/* Alias for the deprecated name. */
+strong_alias (elf_getshdrstrndx, elf_getshstrndx)
diff --git a/libelf/elf_next.c b/libelf/elf_next.c
index ec80fadf..196c65a3 100644
--- a/libelf/elf_next.c
+++ b/libelf/elf_next.c
@@ -1,5 +1,5 @@
/* Advance in archive to next element.
- Copyright (C) 1998, 1999, 2000, 2002 Red Hat, Inc.
+ Copyright (C) 1998-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Contributed by Ulrich Drepper <drepper@redhat.com>, 1998.
@@ -64,6 +64,7 @@ elf_next (elf)
Elf *elf;
{
Elf *parent;
+ Elf_Cmd ret;
/* Be gratious, the specs demand it. */
if (elf == NULL || elf->parent == NULL)
@@ -73,14 +74,21 @@ elf_next (elf)
parent = elf->parent;
assert (parent->kind == ELF_K_AR);
+ rwlock_wrlock (parent->lock);
+
/* Now advance the offset. */
parent->state.ar.offset += (sizeof (struct ar_hdr)
+ ((parent->state.ar.elf_ar_hdr.ar_size + 1)
& ~1l));
/* Get the next archive header. */
- if (__libelf_next_arhdr (parent) != 0)
- return ELF_C_NULL;
+ ret = __libelf_next_arhdr_wrlock (parent) != 0 ? ELF_C_NULL : elf->cmd;
+
+ /* If necessary, mark the archive header as unusable. */
+ if (ret == ELF_C_NULL)
+ parent->state.ar.elf_ar_hdr.ar_name = NULL;
+
+ rwlock_unlock (parent->lock);
- return elf->cmd;
+ return ret;
}
diff --git a/libelf/elf_rand.c b/libelf/elf_rand.c
index 9ba631ff..a766d38f 100644
--- a/libelf/elf_rand.c
+++ b/libelf/elf_rand.c
@@ -67,16 +67,20 @@ elf_rand (elf, offset)
if (elf == NULL || elf->kind != ELF_K_AR)
return 0;
+ rwlock_wrlock (elf->lock);
+
/* Save the old offset and set the offset. */
elf->state.ar.offset = elf->start_offset + offset;
/* Get the next archive header. */
- if (__libelf_next_arhdr (elf) != 0)
+ if (__libelf_next_arhdr_wrlock (elf) != 0)
{
/* Mark the archive header as unusable. */
elf->state.ar.elf_ar_hdr.ar_name = NULL;
return 0;
}
+ rwlock_unlock (elf->lock);
+
return offset;
}
diff --git a/libelf/elf_rawfile.c b/libelf/elf_rawfile.c
index a1c6a1d2..a62a3549 100644
--- a/libelf/elf_rawfile.c
+++ b/libelf/elf_rawfile.c
@@ -63,6 +63,8 @@ elf_rawfile (elf, ptr)
Elf *elf;
size_t *ptr;
{
+ char *result;
+
if (elf == NULL)
{
/* No valid descriptor. */
@@ -77,8 +79,12 @@ elf_rawfile (elf, ptr)
if (elf->map_address == NULL && __libelf_readall (elf) == NULL)
goto error_out;
+ rwlock_rdlock (elf->lock);
if (ptr != NULL)
*ptr = elf->maximum_size;
- return (char *) elf->map_address + elf->start_offset;
+ result = (char *) elf->map_address + elf->start_offset;
+ rwlock_unlock (elf->lock);
+
+ return result;
}
diff --git a/libelf/elf_readall.c b/libelf/elf_readall.c
index 47d0da1e..c4d31281 100644
--- a/libelf/elf_readall.c
+++ b/libelf/elf_readall.c
@@ -1,5 +1,5 @@
/* Read all of the file associated with the descriptor.
- Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005, 2007 Red Hat, Inc.
+ Copyright (C) 1998-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Contributed by Ulrich Drepper <drepper@redhat.com>, 1998.
@@ -54,6 +54,7 @@
#include <errno.h>
#include <unistd.h>
+#include <sys/stat.h>
#include <system.h>
#include "libelfP.h"
@@ -99,12 +100,30 @@ __libelf_readall (elf)
/* If the file is not mmap'ed and not previously loaded, do it now. */
if (elf->map_address == NULL)
{
- char *mem;
+ char *mem = NULL;
/* If this is an archive and we have derived descriptors get the
locks for all of them. */
libelf_acquire_all (elf);
+ if (elf->maximum_size == ~((size_t) 0))
+ {
+ /* We don't yet know how large the file is. Determine that now. */
+ struct stat st;
+
+ if (fstat (elf->fildes, &st) < 0)
+ goto read_error;
+
+ if (sizeof (size_t) >= sizeof (st.st_size)
+ || st.st_size <= ~((size_t) 0))
+ elf->maximum_size = (size_t) st.st_size;
+ else
+ {
+ errno = EOVERFLOW;
+ goto read_error;
+ }
+ }
+
/* Allocate all the memory we need. */
mem = (char *) malloc (elf->maximum_size);
if (mem != NULL)
@@ -116,6 +135,7 @@ __libelf_readall (elf)
!= elf->maximum_size))
{
/* Something went wrong. */
+ read_error:
__libelf_seterrno (ELF_E_READ_ERROR);
free (mem);
}
diff --git a/libelf/elf_scnshndx.c b/libelf/elf_scnshndx.c
new file mode 100644
index 00000000..987d23e4
--- /dev/null
+++ b/libelf/elf_scnshndx.c
@@ -0,0 +1,71 @@
+/* Get the section index of the extended section index table.
+ Copyright (C) 2007 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2007.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ In addition, as a special exception, Red Hat, Inc. gives You the
+ additional right to link the code of Red Hat elfutils with code licensed
+ under any Open Source Initiative certified open source license
+ (http://www.opensource.org/licenses/index.php) which requires the
+ distribution of source code with any binary distribution and to
+ distribute linked combinations of the two. Non-GPL Code permitted under
+ this exception must only link to the code of Red Hat elfutils through
+ those well defined interfaces identified in the file named EXCEPTION
+ found in the source code files (the "Approved Interfaces"). The files
+ of Non-GPL Code may instantiate templates or use macros or inline
+ functions from the Approved Interfaces without causing the resulting
+ work to be covered by the GNU General Public License. Only Red Hat,
+ Inc. may make changes or additions to the list of Approved Interfaces.
+ Red Hat's grant of this exception is conditioned upon your not adding
+ any new exceptions. If you wish to add a new Approved Interface or
+ exception, please contact Red Hat. You must obey the GNU General Public
+ License in all respects for all of the Red Hat elfutils code and other
+ code used in conjunction with Red Hat elfutils except the Non-GPL Code
+ covered by this exception. If you modify this file, you may extend this
+ exception to your version of the file, but you are not obligated to do
+ so. If you do not wish to provide this exception without modification,
+ you must delete this exception statement from your version and license
+ this file solely under the GPL without exception.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libelfP.h"
+
+
+int
+elf_scnshndx (Elf_Scn *scn)
+{
+ if (unlikely (scn->shndx_index == 0))
+ {
+ /* We do not have the value yet. We get it as a side effect of
+ getting a section header. */
+ GElf_Shdr shdr_mem;
+ (void) INTUSE(gelf_getshdr) (scn, &shdr_mem);
+ }
+
+ return scn->shndx_index;
+}
+INTDEF(elf_scnshndx)
diff --git a/libelf/elf_strptr.c b/libelf/elf_strptr.c
index 28042211..7b837b09 100644
--- a/libelf/elf_strptr.c
+++ b/libelf/elf_strptr.c
@@ -1,5 +1,5 @@
/* Return string pointer from string section.
- Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004 Red Hat, Inc.
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2008, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Contributed by Ulrich Drepper <drepper@redhat.com>, 1998.
@@ -140,12 +140,39 @@ elf_strptr (elf, idx, offset)
}
}
- if (strscn->rawdata_base == NULL
- /* Read the section data. */
- && __libelf_set_rawdata (strscn) != 0)
- goto out;
+ if (strscn->rawdata_base == NULL && ! strscn->data_read)
+ {
+ rwlock_unlock (elf->lock);
+ rwlock_wrlock (elf->lock);
+ if (strscn->rawdata_base == NULL && ! strscn->data_read
+ /* Read the section data. */
+ && __libelf_set_rawdata_wrlock (strscn) != 0)
+ goto out;
+ }
+
+ if (likely (strscn->rawdata_base != NULL))
+ // XXX Is this correct if a file is read and then new data is added
+ // XXX to the string section? Likely needs to check offset against
+ // XXX size of rawdata_base buffer and then iterate over rest of the
+ // XXX list.
+ result = &strscn->rawdata_base[offset];
+ else
+ {
+ /* This is a file which is currently created. Use the list of
+ data blocks. */
+ struct Elf_Data_List *dl = &strscn->data_list;
+ while (dl != NULL)
+ {
+ if (offset >= (size_t) dl->data.d.d_off
+ && offset < dl->data.d.d_off + dl->data.d.d_size)
+ {
+ result = (char *) dl->data.d.d_buf + (offset - dl->data.d.d_off);
+ break;
+ }
- result = &strscn->rawdata_base[offset];
+ dl = dl->next;
+ }
+ }
out:
rwlock_unlock (elf->lock);
diff --git a/libelf/elf_update.c b/libelf/elf_update.c
index 24e813fb..5daece40 100644
--- a/libelf/elf_update.c
+++ b/libelf/elf_update.c
@@ -193,8 +193,8 @@ elf_update (elf, cmd)
will come right after the ELF header. The count the size of all
sections and finally place the section table. */
size = (elf->class == ELFCLASS32
- ? __elf32_updatenull (elf, &change_bo, shnum)
- : __elf64_updatenull (elf, &change_bo, shnum));
+ ? __elf32_updatenull_wrlock (elf, &change_bo, shnum)
+ : __elf64_updatenull_wrlock (elf, &change_bo, shnum));
if (likely (size != -1)
/* See whether we actually have to write out the data. */
&& (cmd == ELF_C_WRITE || cmd == ELF_C_WRITE_MMAP))
diff --git a/libelf/gelf_getehdr.c b/libelf/gelf_getehdr.c
index f56d65a9..34b5db3e 100644
--- a/libelf/gelf_getehdr.c
+++ b/libelf/gelf_getehdr.c
@@ -61,7 +61,7 @@
GElf_Ehdr *
-gelf_getehdr (elf, dest)
+__gelf_getehdr_rdlock (elf, dest)
Elf *elf;
GElf_Ehdr *dest;
{
@@ -76,8 +76,6 @@ gelf_getehdr (elf, dest)
return NULL;
}
- rwlock_rdlock (elf->lock);
-
/* The following is an optimization: the ehdr element is at the same
position in both the elf32 and elf64 structure. */
if (offsetof (struct Elf, state.elf32.ehdr)
@@ -114,8 +112,21 @@ gelf_getehdr (elf, dest)
else
result = memcpy (dest, elf->state.elf64.ehdr, sizeof (*dest));
+ return result;
+}
+
+GElf_Ehdr *
+gelf_getehdr (elf, dest)
+ Elf *elf;
+ GElf_Ehdr *dest;
+{
+ GElf_Ehdr *result;
+ if (elf == NULL)
+ return NULL;
+
+ rwlock_rdlock (elf->lock);
+ result = __gelf_getehdr_rdlock (elf, dest);
rwlock_unlock (elf->lock);
return result;
}
-INTDEF(gelf_getehdr)
diff --git a/libelf/gelf_getphdr.c b/libelf/gelf_getphdr.c
index da83ccf7..7b04b399 100644
--- a/libelf/gelf_getphdr.c
+++ b/libelf/gelf_getphdr.c
@@ -1,5 +1,5 @@
/* Return program header table entry.
- Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+ Copyright (C) 1998-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 1998.
@@ -54,6 +54,7 @@
#include <gelf.h>
#include <string.h>
+#include <stdbool.h>
#include "libelfP.h"
@@ -90,14 +91,20 @@ gelf_getphdr (elf, ndx, dst)
if (phdr == NULL)
{
+ rwlock_unlock (elf->lock);
phdr = INTUSE(elf32_getphdr) (elf);
if (phdr == NULL)
/* The error number is already set. */
- goto out;
+ return NULL;
+ rwlock_rdlock (elf->lock);
}
/* Test whether the index is ok. */
- if (ndx >= elf->state.elf32.ehdr->e_phnum)
+ size_t phnum;
+ if (ndx >= elf->state.elf32.ehdr->e_phnum
+ && (elf->state.elf32.ehdr->e_phnum != PN_XNUM
+ || __elf_getphdrnum_rdlock (elf, &phnum) != 0
+ || (size_t) ndx >= phnum))
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
@@ -126,14 +133,20 @@ gelf_getphdr (elf, ndx, dst)
if (phdr == NULL)
{
+ rwlock_unlock (elf->lock);
phdr = INTUSE(elf64_getphdr) (elf);
if (phdr == NULL)
/* The error number is already set. */
- goto out;
+ return NULL;
+ rwlock_rdlock (elf->lock);
}
/* Test whether the index is ok. */
- if (ndx >= elf->state.elf64.ehdr->e_phnum)
+ size_t phnum;
+ if (ndx >= elf->state.elf64.ehdr->e_phnum
+ && (elf->state.elf64.ehdr->e_phnum != PN_XNUM
+ || __elf_getphdrnum_rdlock (elf, &phnum) != 0
+ || (size_t) ndx >= phnum))
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
diff --git a/libelf/gelf_getshdr.c b/libelf/gelf_getshdr.c
index 7f01a8fc..8b46dfa8 100644
--- a/libelf/gelf_getshdr.c
+++ b/libelf/gelf_getshdr.c
@@ -79,7 +79,8 @@ gelf_getshdr (scn, dst)
if (scn->elf->class == ELFCLASS32)
{
/* Copy the elements one-by-one. */
- Elf32_Shdr *shdr = scn->shdr.e32 ?: INTUSE(elf32_getshdr) (scn);
+ Elf32_Shdr *shdr
+ = scn->shdr.e32 ?: __elf32_getshdr_rdlock (scn);
if (shdr == NULL)
{
@@ -104,7 +105,8 @@ gelf_getshdr (scn, dst)
}
else
{
- Elf64_Shdr *shdr = scn->shdr.e64 ?: INTUSE(elf64_getshdr) (scn);
+ Elf64_Shdr *shdr
+ = scn->shdr.e64 ?: __elf64_getshdr_rdlock (scn);
if (shdr == NULL)
{
diff --git a/libelf/gelf_update_phdr.c b/libelf/gelf_update_phdr.c
index 70bf0a5e..d6d5f5ae 100644
--- a/libelf/gelf_update_phdr.c
+++ b/libelf/gelf_update_phdr.c
@@ -1,5 +1,5 @@
/* Update program header program header table entry.
- Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+ Copyright (C) 2000-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2000.
@@ -94,14 +94,18 @@ gelf_update_phdr (Elf *elf, int ndx, GElf_Phdr *src)
if (phdr == NULL)
{
- phdr = INTUSE(elf32_getphdr) (elf);
+ phdr = __elf32_getphdr_wrlock (elf);
if (phdr == NULL)
/* The error number is already set. */
goto out;
}
/* Test whether the index is ok. */
- if (unlikely (ndx >= elf->state.elf32.ehdr->e_phnum))
+ size_t phnum;
+ if (ndx >= elf->state.elf32.ehdr->e_phnum
+ && (elf->state.elf32.ehdr->e_phnum != PN_XNUM
+ || __elf_getphdrnum_rdlock (elf, &phnum) != 0
+ || (size_t) ndx >= phnum))
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
@@ -127,14 +131,18 @@ gelf_update_phdr (Elf *elf, int ndx, GElf_Phdr *src)
if (phdr == NULL)
{
- phdr = INTUSE(elf64_getphdr) (elf);
+ phdr = __elf64_getphdr_wrlock (elf);
if (phdr == NULL)
/* The error number is already set. */
goto out;
}
/* Test whether the index is ok. */
- if (unlikely (ndx >= elf->state.elf64.ehdr->e_phnum))
+ size_t phnum;
+ if (ndx >= elf->state.elf64.ehdr->e_phnum
+ && (elf->state.elf64.ehdr->e_phnum != PN_XNUM
+ || __elf_getphdrnum_rdlock (elf, &phnum) != 0
+ || (size_t) ndx >= phnum))
{
__libelf_seterrno (ELF_E_INVALID_INDEX);
goto out;
diff --git a/libelf/gelf_update_shdr.c b/libelf/gelf_update_shdr.c
index 50ef454a..c57eab80 100644
--- a/libelf/gelf_update_shdr.c
+++ b/libelf/gelf_update_shdr.c
@@ -72,7 +72,8 @@ gelf_update_shdr (Elf_Scn *scn, GElf_Shdr *src)
if (elf->class == ELFCLASS32)
{
- Elf32_Shdr *shdr = scn->shdr.e32 ?: INTUSE(elf32_getshdr) (scn);
+ Elf32_Shdr *shdr
+ = scn->shdr.e32 ?: __elf32_getshdr_wrlock (scn);
if (shdr == NULL)
{
@@ -106,7 +107,8 @@ gelf_update_shdr (Elf_Scn *scn, GElf_Shdr *src)
}
else
{
- Elf64_Shdr *shdr = scn->shdr.e64 ?: INTUSE(elf64_getshdr) (scn);
+ Elf64_Shdr *shdr
+ = scn->shdr.e64 ?: __elf64_getshdr_wrlock (scn);
if (shdr == NULL)
{
diff --git a/libelf/libelf.h b/libelf/libelf.h
index 8f2f53b3..b0b3a8d7 100644
--- a/libelf/libelf.h
+++ b/libelf/libelf.h
@@ -1,5 +1,5 @@
/* Interface for libelf.
- Copyright (C) 1998, 1999, 2000, 2002, 2004, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 1998-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -95,7 +95,7 @@ typedef struct
Elf_Type d_type; /* Type of this piece of data. */
unsigned int d_version; /* ELF version. */
size_t d_size; /* Size in bytes. */
- off64_t d_off; /* Offset into section. */
+ loff_t d_off; /* Offset into section. */
size_t d_align; /* Alignment in section. */
} Elf_Data;
@@ -157,7 +157,7 @@ typedef struct
uid_t ar_uid; /* User ID. */
gid_t ar_gid; /* Group ID. */
mode_t ar_mode; /* File mode. */
- off64_t ar_size; /* File size. */
+ loff_t ar_size; /* File size. */
char *ar_rawname; /* Original name of archive member. */
} Elf_Arhdr;
@@ -198,13 +198,13 @@ extern Elf_Cmd elf_next (Elf *__elf);
extern int elf_end (Elf *__elf);
/* Update ELF descriptor and write file to disk. */
-extern off64_t elf_update (Elf *__elf, Elf_Cmd __cmd);
+extern loff_t elf_update (Elf *__elf, Elf_Cmd __cmd);
/* Determine what kind of file is associated with ELF. */
extern Elf_Kind elf_kind (Elf *__elf) __attribute__ ((__pure__));
/* Get the base offset for an object file. */
-extern off64_t elf_getbase (Elf *__elf);
+extern loff_t elf_getbase (Elf *__elf);
/* Retrieve file identification data. */
@@ -220,6 +220,12 @@ extern Elf32_Ehdr *elf32_newehdr (Elf *__elf);
/* Similar but this time the binary calls is ELFCLASS64. */
extern Elf64_Ehdr *elf64_newehdr (Elf *__elf);
+/* Get the number of program headers in the ELF file. If the file uses
+ more headers than can be represented in the e_phnum field of the ELF
+ header the information from the sh_info field in the zeroth section
+ header is used. */
+extern int elf_getphdrnum (Elf *__elf, size_t *__dst);
+
/* Retrieve class-dependent program header table. */
extern Elf32_Phdr *elf32_getphdr (Elf *__elf);
/* Similar but this time the binary calls is ELFCLASS64. */
@@ -248,18 +254,32 @@ extern Elf_Scn *elf_nextscn (Elf *__elf, Elf_Scn *__scn);
/* Create a new section and append it at the end of the table. */
extern Elf_Scn *elf_newscn (Elf *__elf);
+/* Get the section index of the extended section index table for the
+ given symbol table. */
+extern int elf_scnshndx (Elf_Scn *__scn);
+
/* Get the number of sections in the ELF file. If the file uses more
sections than can be represented in the e_shnum field of the ELF
header the information from the sh_size field in the zeroth section
header is used. */
-extern int elf_getshnum (Elf *__elf, size_t *__dst);
+extern int elf_getshdrnum (Elf *__elf, size_t *__dst);
+/* Sun messed up the implementation of 'elf_getshnum' in their implementation.
+ It was agreed to make the same functionality available under a different
+ name and obsolete the old name. */
+extern int elf_getshnum (Elf *__elf, size_t *__dst)
+ __attribute__ ((__deprecated__));
/* Get the section index of the section header string table in the ELF
file. If the index cannot be represented in the e_shnum field of
the ELF header the information from the sh_link field in the zeroth
section header is used. */
-extern int elf_getshstrndx (Elf *__elf, size_t *__dst);
+extern int elf_getshdrstrndx (Elf *__elf, size_t *__dst);
+/* Sun messed up the implementation of 'elf_getshnum' in their implementation.
+ It was agreed to make the same functionality available under a different
+ name and obsolete the old name. */
+extern int elf_getshstrndx (Elf *__elf, size_t *__dst)
+ __attribute__ ((__deprecated__));
/* Retrieve section header of ELFCLASS32 binary. */
@@ -302,7 +322,7 @@ extern Elf_Data *elf_newdata (Elf_Scn *__scn);
would be for TYPE. The resulting Elf_Data pointer is valid until
elf_end (ELF) is called. */
extern Elf_Data *elf_getdata_rawchunk (Elf *__elf,
- off64_t __offset, size_t __size,
+ loff_t __offset, size_t __size,
Elf_Type __type);
@@ -314,7 +334,7 @@ extern char *elf_strptr (Elf *__elf, size_t __index, size_t __offset);
extern Elf_Arhdr *elf_getarhdr (Elf *__elf);
/* Return offset in archive for current file ELF. */
-extern off64_t elf_getaroff (Elf *__elf);
+extern loff_t elf_getaroff (Elf *__elf);
/* Select archive element at OFFSET. */
extern size_t elf_rand (Elf *__elf, size_t __offset);
diff --git a/libelf/libelf.map b/libelf/libelf.map
index ec149b43..9ee91127 100644
--- a/libelf/libelf.map
+++ b/libelf/libelf.map
@@ -122,7 +122,25 @@ ELFUTILS_1.3 {
gelf_getauxv;
gelf_update_auxv;
gelf_getnote;
+} ELFUTILS_1.2;
+
+ELFUTILS_1.4 {
+ global:
+ elf_scnshndx;
+} ELFUTILS_1.3;
+
+ELFUTILS_1.5 {
+ global:
+ elf_getshdrnum; elf_getshdrstrndx;
+} ELFUTILS_1.4;
+
+ELFUTILS_1.6 {
+ global:
+ elf_getphdrnum;
+} ELFUTILS_1.5;
+
+ELFUTILS_XXX {
gelf_getdata_memory;
gelf_getdata_rawchunk;
gelf_begin_embedded;
-};
+} ELFUTILS_1.5;
diff --git a/libelf/libelfP.h b/libelf/libelfP.h
index 378d9c32..613a7d95 100644
--- a/libelf/libelfP.h
+++ b/libelf/libelfP.h
@@ -1,5 +1,5 @@
/* Internal interfaces for libelf.
- Copyright (C) 1998,1999,2000,2001,2002,2003,2005,2006,2007 Red Hat, Inc.
+ Copyright (C) 1998-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Contributed by Ulrich Drepper <drepper@redhat.com>, 1998.
@@ -51,12 +51,20 @@
#ifndef _LIBELFP_H
#define _LIBELFP_H 1
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
#include <ar.h>
#include <gelf.h>
+
+#include <errno.h>
#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
/* gettext helper macros. */
-#define _(Str) dgettext ("libelf", Str)
+#define _(Str) dgettext ("elfutils", Str)
/* Helper Macros to write 32 bit and 64 bit functions. */
@@ -224,6 +232,9 @@ struct Elf_Scn
int data_read; /* Nonzero if the section was created by the
user or if the data from the file/memory
is read. */
+ int shndx_index; /* Index of the extended section index
+ table for this symbol table (if this
+ section is a symbol table). */
size_t index; /* Index of this section. */
struct Elf *elf; /* The underlying ELF file. */
@@ -270,6 +281,14 @@ typedef struct Elf_Data_Chunk
/* The ELF descriptor. */
struct Elf
{
+ /* Address to which the file was mapped. NULL if not mapped. */
+ void *map_address;
+
+ /* When created for an archive member this points to the descriptor
+ for the archive. */
+ Elf *parent;
+ Elf *next; /* Used in list of archive descriptors. */
+
/* What kind of file is underneath (ELF file, archive...). */
Elf_Kind kind;
@@ -289,35 +308,24 @@ struct Elf
for an (yet) unknown size. */
size_t maximum_size;
- /* Address to which the file was mapped. NULL if not mapped. */
- void *map_address;
-
/* Describes the way the memory was allocated and if the dirty bit is
signalled it means that the whole file has to be rewritten since
the layout changed. */
int flags;
- /* When created for an archive member this points to the descriptor
- for the archive. */
- Elf *parent;
-
- /* Lock to handle multithreaded programs. */
- rwlock_define (,lock);
-
/* Reference counting for the descriptor. */
int ref_count;
struct Elf *next; /* Used in list of archive descriptors. */
struct Elf *children; /* List of all descriptors pointing to this one. */
+ /* Lock to handle multithreaded programs. */
+ rwlock_define (,lock);
+
union
{
struct
{
- int ehdr_flags; /* Flags (dirty) for ELF header. */
- int phdr_flags; /* Flags (dirty|malloc) for program header. */
- int shdr_malloced; /* Nonzero if shdr array was allocated. */
-
/* The next fields are only useful when testing for ==/!= NULL. */
void *ehdr;
void *shdr;
@@ -329,16 +337,15 @@ struct Elf
Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results. */
unsigned int scnincr; /* Number of sections allocate the last
time. */
+ int ehdr_flags; /* Flags (dirty) for ELF header. */
+ int phdr_flags; /* Flags (dirty|malloc) for program header. */
+ int shdr_malloced; /* Nonzero if shdr array was allocated. */
off64_t sizestr_offset; /* Offset of the size string in the parent
if this is an archive member. */
} elf;
struct
{
- int ehdr_flags; /* Flags (dirty) for ELF header. */
- int phdr_flags; /* Flags (dirty|malloc) for program header. */
- int shdr_malloced; /* Nonzero if shdr array was allocated. */
-
Elf32_Ehdr *ehdr; /* Pointer to the ELF header. This is
never malloced. */
Elf32_Shdr *shdr; /* Used when reading from a file. */
@@ -349,6 +356,9 @@ struct Elf
Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results. */
unsigned int scnincr; /* Number of sections allocate the last
time. */
+ int ehdr_flags; /* Flags (dirty) for ELF header. */
+ int phdr_flags; /* Flags (dirty|malloc) for program header. */
+ int shdr_malloced; /* Nonzero if shdr array was allocated. */
off64_t sizestr_offset; /* Offset of the size string in the parent
if this is an archive member. */
Elf32_Ehdr ehdr_mem; /* Memory used for ELF header when not
@@ -361,10 +371,6 @@ struct Elf
struct
{
- int ehdr_flags; /* Flags (dirty) for ELF header. */
- int phdr_flags; /* Flags (dirty|malloc) for program header. */
- int shdr_malloced; /* Nonzero if shdr array was allocated. */
-
Elf64_Ehdr *ehdr; /* Pointer to the ELF header. This is
never malloced. */
Elf64_Shdr *shdr; /* Used when reading from a file. */
@@ -375,6 +381,9 @@ struct Elf
Elf_Data_Chunk *rawchunks; /* List of elf_getdata_rawchunk results. */
unsigned int scnincr; /* Number of sections allocate the last
time. */
+ int ehdr_flags; /* Flags (dirty) for ELF header. */
+ int phdr_flags; /* Flags (dirty|malloc) for program header. */
+ int shdr_malloced; /* Nonzero if shdr array was allocated. */
off64_t sizestr_offset; /* Offset of the size string in the parent
if this is an archive member. */
Elf64_Ehdr ehdr_mem; /* Memory used for ELF header when not
@@ -386,8 +395,7 @@ struct Elf
struct
{
- int has_index; /* Set when file has index. 0 means
- undecided, > 0 means it has one. */
+ Elf *children; /* List of all descriptors for this archive. */
Elf_Arsym *ar_sym; /* Symbol table returned by elf_getarsym. */
size_t ar_sym_num; /* Number of entries in `ar_sym'. */
char *long_names; /* If no index is available but long names
@@ -407,7 +415,6 @@ struct Elf
/* There absolutely never must be anything following the union. */
};
-
/* Type of the conversion functions. These functions will convert the
byte order. */
typedef void (*xfct_t) (void *, const void *, size_t, int);
@@ -450,7 +457,7 @@ extern int __libelf_version_initialized attribute_hidden;
version, binary class, and type. */
extern const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] attribute_hidden;
# define __libelf_type_align(class, type) \
- (__libelf_type_aligns[LIBELF_EV_IDX][class][type] ?: 1)
+ (__libelf_type_aligns[LIBELF_EV_IDX][class - 1][type] ?: 1)
#else
# define __libelf_type_align(class, type) 1
#endif
@@ -481,7 +488,7 @@ extern Elf *__libelf_read_mmaped_file (int fildes, void *map_address,
extern void __libelf_seterrno (int value) internal_function;
/* Get the next archive header. */
-extern int __libelf_next_arhdr (Elf *elf) internal_function;
+extern int __libelf_next_arhdr_wrlock (Elf *elf) internal_function;
/* Read all of the file associated with the descriptor. */
extern char *__libelf_readall (Elf *elf) internal_function;
@@ -491,13 +498,14 @@ extern int __libelf_readsections (Elf *elf) internal_function;
/* Store the information for the raw data in the `rawdata_list' element. */
extern int __libelf_set_rawdata (Elf_Scn *scn) internal_function;
+extern int __libelf_set_rawdata_wrlock (Elf_Scn *scn) internal_function;
/* Helper functions for elf_update. */
-extern off_t __elf32_updatenull (Elf *elf, int *change_bop, size_t shnum)
- internal_function;
-extern off_t __elf64_updatenull (Elf *elf, int *change_bop, size_t shnum)
- internal_function;
+extern off_t __elf32_updatenull_wrlock (Elf *elf, int *change_bop,
+ size_t shnum) internal_function;
+extern off_t __elf64_updatenull_wrlock (Elf *elf, int *change_bop,
+ size_t shnum) internal_function;
extern int __elf32_updatemmap (Elf *elf, int change_bo, size_t shnum)
internal_function;
@@ -509,36 +517,46 @@ extern int __elf64_updatefile (Elf *elf, int change_bo, size_t shnum)
internal_function;
-/* Alias for exported functions to avoid PLT entries. */
-extern int __elf_end_internal (Elf *__elf);
+/* Alias for exported functions to avoid PLT entries, and
+ rdlock/wrlock variants of these functions. */
+extern int __elf_end_internal (Elf *__elf) attribute_hidden;
extern Elf *__elf_begin_internal (int __fildes, Elf_Cmd __cmd, Elf *__ref)
attribute_hidden;
-extern Elf32_Ehdr *__elf32_getehdr_internal (Elf *__elf) attribute_hidden;
-extern Elf64_Ehdr *__elf64_getehdr_internal (Elf *__elf) attribute_hidden;
+extern Elf32_Ehdr *__elf32_getehdr_wrlock (Elf *__elf) internal_function;
+extern Elf64_Ehdr *__elf64_getehdr_wrlock (Elf *__elf) internal_function;
extern Elf32_Ehdr *__elf32_newehdr_internal (Elf *__elf) attribute_hidden;
extern Elf64_Ehdr *__elf64_newehdr_internal (Elf *__elf) attribute_hidden;
extern Elf32_Phdr *__elf32_getphdr_internal (Elf *__elf) attribute_hidden;
extern Elf64_Phdr *__elf64_getphdr_internal (Elf *__elf) attribute_hidden;
+extern Elf32_Phdr *__elf32_getphdr_wrlock (Elf *__elf) attribute_hidden;
+extern Elf64_Phdr *__elf64_getphdr_wrlock (Elf *__elf) attribute_hidden;
extern Elf32_Phdr *__elf32_newphdr_internal (Elf *__elf, size_t __cnt)
attribute_hidden;
extern Elf64_Phdr *__elf64_newphdr_internal (Elf *__elf, size_t __cnt)
attribute_hidden;
extern Elf_Scn *__elf32_offscn_internal (Elf *__elf, Elf32_Off __offset)
- attribute_hidden;
+ attribute_hidden;
extern Elf_Scn *__elf64_offscn_internal (Elf *__elf, Elf64_Off __offset)
- attribute_hidden;
-extern int __elf_getshnum_internal (Elf *__elf, size_t *__dst)
attribute_hidden;
-extern int __elf_getshstrndx_internal (Elf *__elf, size_t *__dst)
+extern int __elf_getphdrnum_rdlock (Elf *__elf, size_t *__dst)
+ internal_function;
+extern int __elf_getshdrnum_rdlock (Elf *__elf, size_t *__dst)
+ internal_function;
+extern int __elf_getshdrstrndx_internal (Elf *__elf, size_t *__dst)
attribute_hidden;
-extern Elf32_Shdr *__elf32_getshdr_internal (Elf_Scn *__scn) attribute_hidden;
-extern Elf64_Shdr *__elf64_getshdr_internal (Elf_Scn *__scn) attribute_hidden;
+extern Elf32_Shdr *__elf32_getshdr_rdlock (Elf_Scn *__scn) internal_function;
+extern Elf64_Shdr *__elf64_getshdr_rdlock (Elf_Scn *__scn) internal_function;
+extern Elf32_Shdr *__elf32_getshdr_wrlock (Elf_Scn *__scn) internal_function;
+extern Elf64_Shdr *__elf64_getshdr_wrlock (Elf_Scn *__scn) internal_function;
extern Elf_Scn *__elf_getscn_internal (Elf *__elf, size_t __index)
attribute_hidden;
extern Elf_Scn *__elf_nextscn_internal (Elf *__elf, Elf_Scn *__scn)
attribute_hidden;
+extern int __elf_scnshndx_internal (Elf_Scn *__scn) attribute_hidden;
extern Elf_Data *__elf_getdata_internal (Elf_Scn *__scn, Elf_Data *__data)
attribute_hidden;
+extern Elf_Data *__elf_getdata_rdlock (Elf_Scn *__scn, Elf_Data *__data)
+ internal_function;
extern Elf_Data *__elf_rawdata_internal (Elf_Scn *__scn, Elf_Data *__data)
attribute_hidden;
extern char *__elf_strptr_internal (Elf *__elf, size_t __index,
@@ -567,7 +585,8 @@ extern long int __elf32_checksum_internal (Elf *__elf) attribute_hidden;
extern long int __elf64_checksum_internal (Elf *__elf) attribute_hidden;
-extern GElf_Ehdr *__gelf_getehdr_internal (Elf *__elf, GElf_Ehdr *__dest);
+extern GElf_Ehdr *__gelf_getehdr_rdlock (Elf *__elf, GElf_Ehdr *__dest)
+ internal_function;
extern size_t __gelf_fsize_internal (Elf *__elf, Elf_Type __type,
size_t __count, unsigned int __version)
attribute_hidden;
diff --git a/libelf/note_xlate.h b/libelf/note_xlate.h
index 6e8b78c6..a72fe868 100644
--- a/libelf/note_xlate.h
+++ b/libelf/note_xlate.h
@@ -1,5 +1,5 @@
/* Conversion functions for notes.
- Copyright (C) 2007 Red Hat, Inc.
+ Copyright (C) 2007, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -52,7 +52,7 @@ elf_cvt_note (void *dest, const void *src, size_t len, int encode)
{
assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr));
- while (len > 0)
+ while (len >= sizeof (Elf32_Nhdr))
{
(1 ? Elf32_cvt_Nhdr : Elf64_cvt_Nhdr) (dest, src, sizeof (Elf32_Nhdr),
encode);
diff --git a/m4/ChangeLog b/m4/ChangeLog
index e285a0e4..d4f2bc1b 100644
--- a/m4/ChangeLog
+++ b/m4/ChangeLog
@@ -1,3 +1,22 @@
+2010-04-14 Roland McGrath <roland@redhat.com>
+
+ * gettext.m4: Upgrade to gettext-0.17.
+ * iconv.m4: Upgrade to gettext-0.17.
+ * po.m4: Upgrade to gettext-0.17.
+
+2009-08-26 Roland McGrath <roland@redhat.com>
+
+ * zip.m4 (eu_ZIPLIB): Don't apply lib/LIB suffix to args.
+
+2009-02-01 Roland McGrath <roland@redhat.com>
+
+ * zip.m4: Fix --with/--without argument handling.
+
+2009-01-08 Roland McGrath <roland@redhat.com>
+
+ * zip.am: New file.
+ * Makefile.am (EXTRA_DIST): Add it.
+
2007-06-05 Ulrich Drepper <drepper@redhat.com>
* gettext.m4: Update from gettext 0.16.1.
diff --git a/m4/Makefile.am b/m4/Makefile.am
index dd955e68..156010c7 100644
--- a/m4/Makefile.am
+++ b/m4/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to produce Makefile.in -*-Makefile-*-
##
-## Copyright (C) 2000, 2001, 2002, 2004, 2005 Red Hat, Inc.
+## Copyright (C) 2000-2009 Red Hat, Inc.
## This file is part of Red Hat elfutils.
##
## Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -26,4 +26,4 @@
##
##m4-files-begin
-EXTRA_DIST = codeset.m4 gettext.m4 iconv.m4 lcmessage.m4 progtest.m4
+EXTRA_DIST = codeset.m4 gettext.m4 iconv.m4 lcmessage.m4 progtest.m4 zip.m4
diff --git a/m4/gettext.m4 b/m4/gettext.m4
index 91c345e9..c9ae1f7d 100644
--- a/m4/gettext.m4
+++ b/m4/gettext.m4
@@ -1,5 +1,5 @@
-# gettext.m4 serial 59 (gettext-0.16.1)
-dnl Copyright (C) 1995-2006 Free Software Foundation, Inc.
+# gettext.m4 serial 60 (gettext-0.17)
+dnl Copyright (C) 1995-2007 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.
@@ -362,44 +362,6 @@ return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_a
])
-dnl Checks for special options needed on MacOS X.
-dnl Defines INTL_MACOSX_LIBS.
-AC_DEFUN([gt_INTL_MACOSX],
-[
- dnl Check for API introduced in MacOS X 10.2.
- AC_CACHE_CHECK([for CFPreferencesCopyAppValue],
- gt_cv_func_CFPreferencesCopyAppValue,
- [gt_save_LIBS="$LIBS"
- LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
- AC_TRY_LINK([#include <CoreFoundation/CFPreferences.h>],
- [CFPreferencesCopyAppValue(NULL, NULL)],
- [gt_cv_func_CFPreferencesCopyAppValue=yes],
- [gt_cv_func_CFPreferencesCopyAppValue=no])
- LIBS="$gt_save_LIBS"])
- if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
- AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], 1,
- [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
- fi
- dnl Check for API introduced in MacOS X 10.3.
- AC_CACHE_CHECK([for CFLocaleCopyCurrent], gt_cv_func_CFLocaleCopyCurrent,
- [gt_save_LIBS="$LIBS"
- LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
- AC_TRY_LINK([#include <CoreFoundation/CFLocale.h>], [CFLocaleCopyCurrent();],
- [gt_cv_func_CFLocaleCopyCurrent=yes],
- [gt_cv_func_CFLocaleCopyCurrent=no])
- LIBS="$gt_save_LIBS"])
- if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
- AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], 1,
- [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
- fi
- INTL_MACOSX_LIBS=
- if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
- INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
- fi
- AC_SUBST([INTL_MACOSX_LIBS])
-])
-
-
dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized.
m4_define([gt_NEEDS_INIT],
[
diff --git a/m4/iconv.m4 b/m4/iconv.m4
index 654c4158..66bc76f4 100644
--- a/m4/iconv.m4
+++ b/m4/iconv.m4
@@ -1,5 +1,5 @@
-# iconv.m4 serial AM4 (gettext-0.11.3)
-dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+# iconv.m4 serial AM6 (gettext-0.17)
+dnl Copyright (C) 2000-2002, 2007 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.
@@ -21,6 +21,7 @@ AC_DEFUN([AM_ICONV_LINK],
[
dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
dnl those with the standalone portable GNU libiconv installed).
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
dnl accordingly.
@@ -33,7 +34,7 @@ AC_DEFUN([AM_ICONV_LINK],
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>
@@ -56,7 +57,85 @@ AC_DEFUN([AM_ICONV_LINK],
fi
])
if test "$am_cv_func_iconv" = yes; then
- AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
+ 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.
+ am_save_LIBS="$LIBS"
+ if test $am_cv_lib_iconv = yes; then
+ LIBS="$LIBS $LIBICONV"
+ fi
+ AC_TRY_RUN([
+#include <iconv.h>
+#include <string.h>
+int main ()
+{
+ /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+ returns. */
+ {
+ iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+ if (cd_utf8_to_88591 != (iconv_t)(-1))
+ {
+ static const char input[] = "\342\202\254"; /* EURO SIGN */
+ 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_utf8_to_88591,
+ (char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ return 1;
+ }
+ }
+#if 0 /* This bug could be worked around by the caller. */
+ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char buf[50];
+ const char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_88591_to_utf8,
+ (char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if ((int)res > 0)
+ return 1;
+ }
+ }
+#endif
+ /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+ provided. */
+ if (/* Try standardized names. */
+ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+ /* Try IRIX, OSF/1 names. */
+ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+ /* Try AIX names. */
+ && 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
+ aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+ *) am_cv_func_iconv_works="guessing yes" ;;
+ esac])
+ LIBS="$am_save_LIBS"
+ ])
+ case "$am_cv_func_iconv_works" in
+ *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+ *) am_func_iconv=yes ;;
+ esac
+ else
+ am_func_iconv=no am_cv_lib_iconv=no
+ fi
+ if test "$am_func_iconv" = yes; then
+ AC_DEFINE(HAVE_ICONV, 1,
+ [Define if you have the iconv() function and it works.])
fi
if test "$am_cv_lib_iconv" = yes; then
AC_MSG_CHECKING([how to link with libiconv])
diff --git a/m4/po.m4 b/m4/po.m4
index 00133ef3..0734762a 100644
--- a/m4/po.m4
+++ b/m4/po.m4
@@ -1,5 +1,5 @@
-# po.m4 serial 13 (gettext-0.15)
-dnl Copyright (C) 1995-2006 Free Software Foundation, Inc.
+# po.m4 serial 15 (gettext-0.17)
+dnl Copyright (C) 1995-2007 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.
@@ -27,6 +27,10 @@ AC_DEFUN([AM_PO_SUBDIRS],
AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake
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])
+
dnl Perform the following tests also if --disable-nls has been given,
dnl because they are needed for "make dist" to work.
@@ -84,6 +88,10 @@ changequote([,])dnl
test -n "$localedir" || localedir='${datadir}/locale'
AC_SUBST([localedir])
+ dnl Support for AM_XGETTEXT_OPTION.
+ test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+ AC_SUBST([XGETTEXT_EXTRA_OPTIONS])
+
AC_CONFIG_COMMANDS([po-directories], [[
for ac_file in $CONFIG_FILES; do
# Support "outfile[:infile[:infile...]]"
@@ -426,3 +434,16 @@ EOF
fi
mv "$ac_file.tmp" "$ac_file"
])
+
+dnl Initializes the accumulator used by AM_XGETTEXT_OPTION.
+AC_DEFUN([AM_XGETTEXT_OPTION_INIT],
+[
+ XGETTEXT_EXTRA_OPTIONS=
+])
+
+dnl Registers an option to be passed to xgettext in the po subdirectory.
+AC_DEFUN([AM_XGETTEXT_OPTION],
+[
+ AC_REQUIRE([AM_XGETTEXT_OPTION_INIT])
+ XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS $1"
+])
diff --git a/m4/zip.m4 b/m4/zip.m4
new file mode 100644
index 00000000..8e4d545c
--- /dev/null
+++ b/m4/zip.m4
@@ -0,0 +1,18 @@
+dnl -*- Autoconf -*- test for either zlib or bzlib.
+dnl Defines --with-$1 argument, $2 automake conditional,
+dnl and sets AC_DEFINE(USE_$2) and LIBS.
+
+AC_DEFUN([eu_ZIPLIB], [dnl
+AC_ARG_WITH([[$1]],
+AC_HELP_STRING([--with-[$1]], [support [$1] compression in libdwfl]),,
+ [with_[$1]=default])
+if test $with_[$1] != no; then
+ AC_SEARCH_LIBS([$4], [$3], [with_[$1]=yes],
+ [test $with_[$1] = default ||
+ AC_MSG_ERROR([missing -l[$3] for --with-[$1]])])
+fi
+AM_CONDITIONAL([$2], test $with_[$1] = yes)
+if test $with_[$1] = yes; then
+ AC_DEFINE(USE_[$2])
+fi
+AH_TEMPLATE(USE_[$2], [Support $5 decompression via -l$3.])])
diff --git a/po/ChangeLog b/po/ChangeLog
index bbb72fad..294a2eb0 100644
--- a/po/ChangeLog
+++ b/po/ChangeLog
@@ -1,3 +1,21 @@
+2010-04-21 Ulrich Drepper <drepper@redhat.com>
+
+ * LINGUAS: Remove fr.po, it.po, nl.po, ru.po, zh_CN. The files
+ contain no translations at all.
+
+2010-04-14 Roland McGrath <roland@redhat.com>
+
+ * POTFILES.in: Add libdwfl/libdwflP.h.
+
+ * LINGUAS: New file.
+ * Makefile.in.in: Upgrade to gettext-0.17.
+
+2009-01-23 Ulrich Drepper <drepper@redhat.com>
+
+ * Makevars (XGETTEXT_OPTIONS): Add --flag option for argp_error.
+
+ * POTFILES.in: Add more files with translatable strings.
+
2007-06-05 Ulrich Drepper <drepper@redhat.com>
* Makefile.in.in: Update from gettext 0.16.1.
diff --git a/po/LINGUAS b/po/LINGUAS
new file mode 100644
index 00000000..4adcc52a
--- /dev/null
+++ b/po/LINGUAS
@@ -0,0 +1,5 @@
+# List of translations, i.e. .po files supplied by translators.
+de es ja pl uk
+
+# These are automagically created, not real translations.
+en@quot en@boldquot
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
index 5022b8b1..fecf500f 100644
--- a/po/Makefile.in.in
+++ b/po/Makefile.in.in
@@ -1,5 +1,5 @@
# Makefile for PO directory in any package using GNU gettext.
-# Copyright (C) 1995-1997, 2000-2006 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+# Copyright (C) 1995-1997, 2000-2007 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,7 +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.16
+# Origin: gettext-0.17
+GETTEXT_MACRO_VERSION = 0.17
PACKAGE = @PACKAGE@
VERSION = @VERSION@
@@ -95,11 +96,18 @@ CATALOGS = @CATALOGS@
mv t-$@ $@
-all: all-@USE_NLS@
+all: check-macro-version 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@" \
+ || { 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; \
+ }
+
# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no
# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because
# we don't want to bother translators with empty POT files). We assume that
@@ -130,16 +138,34 @@ 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.
$(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 \
+ package_gnu='GNU '; \
+ else \
+ package_gnu=''; \
+ fi; \
if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \
msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \
else \
msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \
fi; \
- $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
- --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \
- --files-from=$(srcdir)/POTFILES.in \
- --copyright-holder='$(COPYRIGHT_HOLDER)' \
- --msgid-bugs-address="$$msgid_bugs_address"
+ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \
+ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+ --files-from=$(srcdir)/POTFILES.in \
+ --copyright-holder='$(COPYRIGHT_HOLDER)' \
+ --msgid-bugs-address="$$msgid_bugs_address" \
+ ;; \
+ *) \
+ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+ --files-from=$(srcdir)/POTFILES.in \
+ --copyright-holder='$(COPYRIGHT_HOLDER)' \
+ --package-name="$${package_gnu}@PACKAGE@" \
+ --package-version='@VERSION@' \
+ --msgid-bugs-address="$$msgid_bugs_address" \
+ ;; \
+ esac
test ! -f $(DOMAIN).po || { \
if test -f $(srcdir)/$(DOMAIN).pot; then \
sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
diff --git a/po/Makevars b/po/Makevars
index b8ea7022..8a8ebc60 100644
--- a/po/Makevars
+++ b/po/Makevars
@@ -9,7 +9,7 @@ top_builddir = ..
# These options get passed to xgettext.
XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ --flag=error:3:c-format \
- --flag=ERROR:1:c-format
+ --flag=ERROR:1:c-format --flag=argp_error:2:c-format
# This is the copyright holder that gets inserted into the header of the
# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding
diff --git a/po/POTFILES.in b/po/POTFILES.in
index e3a192be..2058928d 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,5 +1,5 @@
# List of files which containing translatable strings.
-# Copyright (C) 2000, 2005 Red Hat, Inc.
+# Copyright (C) 2000-2010 Red Hat, Inc.
# Files from the compatibility library
lib/xmalloc.c
@@ -7,21 +7,40 @@ lib/xmalloc.c
lib/xstrndup.c
# Library sources
-libelf/elf_error.c
libasm/asm_error.c
libdw/dwarf_error.c
+libdwfl/argp-std.c
+libdwfl/libdwflP.h
+libebl/eblbackendname.c
+libebl/eblcorenotetypename.c
+libebl/ebldynamictagname.c
+libebl/eblobjecttypename.c
+libebl/eblobjnote.c
+libebl/eblobjnotetypename.c
+libebl/eblosabiname.c
+libebl/eblsectionname.c
+libebl/eblsectiontypename.c
+libebl/eblsegmenttypename.c
+libebl/eblsymbolbindingname.c
+libebl/eblsymboltypename.c
+libelf/elf_error.c
# Program sources
-src/nm.c
-src/readelf.c
-src/size.c
-src/strip.c
+src/addr2line.c
+src/ar.c
+src/arlib.c
+src/elfcmp.c
+src/elflint.c
+src/findtextrel.c
+src/i386_ld.c
src/ld.c
src/ldgeneric.c
src/ldscript.y
-src/elflint.c
-src/addr2line.c
-src/findtextrel.c
-src/elfcmp.c
+src/nm.c
+src/objdump.c
src/ranlib.c
+src/readelf.c
+src/size.c
src/strings.c
+src/strip.c
+src/unstrip.c
diff --git a/po/de.po b/po/de.po
new file mode 100644
index 00000000..3796c448
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,5706 @@
+# German translation of elfutils.
+# Copyright (C) 2009 THE elfutils'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the elfutils package.
+# , fuzzy
+#
+#
+# Thomas Spura <tomspur@fedoraproject.org>, 2009.
+# Cornelius Neckenig <tbull@fedoraproject.org>, 2009.
+# Michael Münch <micm@fedoraproject.org>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: elfutils VERSION\n"
+"Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
+"POT-Creation-Date: 2010-05-03 14:14-0700\n"
+"PO-Revision-Date: 2009-06-29 15:15+0200\n"
+"Last-Translator: Michael Münch <micm@fedoraproject.org>\n"
+"Language-Team: German\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:51 lib/xmalloc.c:65 lib/xmalloc.c:79 src/readelf.c:2822
+#: src/readelf.c:3161 src/unstrip.c:2087 src/unstrip.c:2295
+#, c-format
+msgid "memory exhausted"
+msgstr "Kein Speicher mehr verfügbar"
+
+#: libasm/asm_error.c:62 libdw/dwarf_error.c:79 libdwfl/libdwflP.h:70
+#: libelf/elf_error.c:81
+msgid "no error"
+msgstr "kein Fehler"
+
+#: libasm/asm_error.c:63 libdw/dwarf_error.c:88 libdwfl/libdwflP.h:72
+#: libelf/elf_error.c:112
+msgid "out of memory"
+msgstr "nicht genügend Speicher"
+
+#: libasm/asm_error.c:64 src/ldgeneric.c:2687
+#, c-format
+msgid "cannot create output file"
+msgstr "Ausgangsdatei konnte nicht erstellt werden"
+
+#: libasm/asm_error.c:65
+msgid "invalid parameter"
+msgstr "ungültiger Parameter"
+
+#: libasm/asm_error.c:66
+msgid "cannot change mode of output file"
+msgstr "konnte Modus der Ausgabedatei nicht ändern"
+
+#: libasm/asm_error.c:67 src/ldgeneric.c:7001
+#, c-format
+msgid "cannot rename output file"
+msgstr "Ausgangsdatei konnte nicht umbenannt werden"
+
+#: libasm/asm_error.c:68
+msgid "duplicate symbol"
+msgstr "Symbol doppelt vorhanden"
+
+#: libasm/asm_error.c:69
+msgid "invalid section type for operation"
+msgstr "ungültiger Abschnittstyp für Operation"
+
+#: libasm/asm_error.c:70
+msgid "error during output of data"
+msgstr "Fehler bei Datenausgabe"
+
+#: libasm/asm_error.c:71
+msgid "no backend support available"
+msgstr "keine Backend-Unterstützung verfügbar"
+
+#: libasm/asm_error.c:81 libdw/dwarf_error.c:80 libdwfl/libdwflP.h:71
+#: libelf/elf_error.c:84
+msgid "unknown error"
+msgstr "unbekannter Fehler"
+
+#: libdw/dwarf_error.c:81
+msgid "invalid access"
+msgstr "Ungültiger Zugriff"
+
+#: libdw/dwarf_error.c:82
+msgid "no regular file"
+msgstr "Keine reguläre Date"
+
+#: libdw/dwarf_error.c:83
+msgid "I/O error"
+msgstr "I/O Fehler"
+
+#: libdw/dwarf_error.c:84
+msgid "invalid ELF file"
+msgstr "Ungültige ELF Datei"
+
+#: libdw/dwarf_error.c:85
+msgid "no DWARF information"
+msgstr "keine DWARF Information"
+
+#: libdw/dwarf_error.c:86
+msgid "no ELF file"
+msgstr "keine ELF Datei"
+
+#: libdw/dwarf_error.c:87
+msgid "cannot get ELF header"
+msgstr "ELF Kopf konnte nicht ausgelesen werden"
+
+#: libdw/dwarf_error.c:89
+msgid "not implemented"
+msgstr "Nicht implementiert"
+
+#: libdw/dwarf_error.c:90 libelf/elf_error.c:128 libelf/elf_error.c:176
+msgid "invalid command"
+msgstr "Ungültiger Befehl"
+
+#: libdw/dwarf_error.c:91
+msgid "invalid version"
+msgstr "Ungültige Version"
+
+#: libdw/dwarf_error.c:92
+msgid "invalid file"
+msgstr "Ungültige Datei"
+
+#: libdw/dwarf_error.c:93
+msgid "no entries found"
+msgstr "Keine Einträge gefunden"
+
+#: libdw/dwarf_error.c:94
+msgid "invalid DWARF"
+msgstr "DWARF ungültig"
+
+#: libdw/dwarf_error.c:95
+msgid "no string data"
+msgstr ""
+
+#: libdw/dwarf_error.c:96
+msgid "no address value"
+msgstr "Kein Adress-Wert"
+
+#: libdw/dwarf_error.c:97
+msgid "no constant value"
+msgstr "Kein Konstanten-Wert"
+
+#: libdw/dwarf_error.c:98
+msgid "no reference value"
+msgstr "Kein Referenz-Wert"
+
+#: libdw/dwarf_error.c:99
+msgid "invalid reference value"
+msgstr "Ungültiger Referenz-Wert"
+
+#: libdw/dwarf_error.c:100
+msgid ".debug_line section missing"
+msgstr ".debug_line Sektion fehlt"
+
+#: libdw/dwarf_error.c:101
+msgid "invalid .debug_line section"
+msgstr "ungültige .debug_line Sektion"
+
+#: libdw/dwarf_error.c:102
+msgid "debug information too big"
+msgstr "Debug Information zu groß"
+
+#: libdw/dwarf_error.c:103
+msgid "invalid DWARF version"
+msgstr "Ungültige DWARF Version"
+
+#: libdw/dwarf_error.c:104
+msgid "invalid directory index"
+msgstr "ungültiger Verzeichnisindex"
+
+#: libdw/dwarf_error.c:105 libdwfl/libdwflP.h:91
+msgid "address out of range"
+msgstr "Außerhalb des Adressbereiches"
+
+#: libdw/dwarf_error.c:106
+msgid "no location list value"
+msgstr ""
+
+#: libdw/dwarf_error.c:107
+msgid "no block data"
+msgstr ""
+
+#: libdw/dwarf_error.c:108
+msgid "invalid line index"
+msgstr "Ungültiger Zeilenindex"
+
+#: libdw/dwarf_error.c:109
+msgid "invalid address range index"
+msgstr "Ungültiger Adressbereichs Index"
+
+#: libdw/dwarf_error.c:110 libdwfl/libdwflP.h:92
+msgid "no matching address range"
+msgstr "Kein passender Adressbereich"
+
+#: libdw/dwarf_error.c:111
+msgid "no flag value"
+msgstr ""
+
+#: libdw/dwarf_error.c:112 libelf/elf_error.c:253
+msgid "invalid offset"
+msgstr "ungültiger Offset"
+
+#: libdw/dwarf_error.c:113
+msgid ".debug_ranges section missing"
+msgstr ""
+
+#: libdw/dwarf_error.c:114
+#, fuzzy
+msgid "invalid CFI section"
+msgstr "ungültiger Abschnitt"
+
+#: libdwfl/argp-std.c:67 src/unstrip.c:2237
+msgid "Input selection options:"
+msgstr "Eingabeauswahloptionen:"
+
+#: libdwfl/argp-std.c:68
+msgid "Find addresses in FILE"
+msgstr "Finde Adressen in FILE"
+
+#: libdwfl/argp-std.c:70
+msgid "Find addresses from signatures found in COREFILE"
+msgstr "Finde Adressen von Signatur aus COREFILE"
+
+#: libdwfl/argp-std.c:72
+msgid "Find addresses in files mapped into process PID"
+msgstr ""
+
+#: libdwfl/argp-std.c:74
+msgid ""
+"Find addresses in files mapped as read from FILE in Linux /proc/PID/maps "
+"format"
+msgstr ""
+
+#: libdwfl/argp-std.c:76
+msgid "Find addresses in the running kernel"
+msgstr "Finde Adressen im laufenden Kernel"
+
+#: libdwfl/argp-std.c:78
+msgid "Kernel with all modules"
+msgstr "Kernel mit allen Modulen"
+
+#: libdwfl/argp-std.c:80
+msgid "Search path for separate debuginfo files"
+msgstr "Dateisuchpfad für separate Debug-Informationen"
+
+#: libdwfl/argp-std.c:163
+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:223
+#, c-format
+msgid "cannot read ELF core file: %s"
+msgstr "Konnte ELF Kerndatei %s nicht lesen"
+
+#: libdwfl/argp-std.c:241
+msgid "No modules recognized in core file"
+msgstr "Keine Module in der Kerndatei gefunden"
+
+#: libdwfl/argp-std.c:253
+msgid "cannot load kernel symbols"
+msgstr "Konnte Kernel Symbole nicht laden"
+
+#: libdwfl/argp-std.c:257
+msgid "cannot find kernel modules"
+msgstr "Konnte Kernel Module nicht finden"
+
+#: libdwfl/argp-std.c:271
+msgid "cannot find kernel or modules"
+msgstr "Konnte Kernel oder Module nicht finden"
+
+#: libdwfl/libdwflP.h:73
+msgid "See errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:74
+msgid "See elf_errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:75
+msgid "See dwarf_errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:76
+msgid "See ebl_errno (XXX missing)"
+msgstr ""
+
+#: libdwfl/libdwflP.h:77
+msgid "gzip decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:78
+msgid "bzip2 decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:79
+msgid "LZMA decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:80
+msgid "no support library found for machine"
+msgstr ""
+
+#: libdwfl/libdwflP.h:81
+msgid "Callbacks missing for ET_REL file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:82
+msgid "Unsupported relocation type"
+msgstr ""
+
+#: libdwfl/libdwflP.h:83
+msgid "r_offset is bogus"
+msgstr ""
+
+#: libdwfl/libdwflP.h:84 libelf/elf_error.c:132 libelf/elf_error.c:192
+msgid "offset out of range"
+msgstr "Offset ausserhalb des Bereichs"
+
+#: libdwfl/libdwflP.h:85
+#, fuzzy
+msgid "relocation refers to undefined symbol"
+msgstr "Zeige Grösse der definierten Symbole"
+
+#: libdwfl/libdwflP.h:86
+msgid "Callback returned failure"
+msgstr ""
+
+#: libdwfl/libdwflP.h:87
+#, fuzzy
+msgid "No DWARF information found"
+msgstr "keine DWARF Information"
+
+#: libdwfl/libdwflP.h:88
+msgid "No symbol table found"
+msgstr ""
+
+#: libdwfl/libdwflP.h:89
+#, fuzzy
+msgid "No ELF program headers"
+msgstr "Programm-Köpfe anzeigen"
+
+#: libdwfl/libdwflP.h:90
+msgid "address range overlaps an existing module"
+msgstr ""
+
+#: libdwfl/libdwflP.h:93
+msgid "image truncated"
+msgstr ""
+
+#: libdwfl/libdwflP.h:94
+#, fuzzy
+msgid "ELF file opened"
+msgstr "keine ELF Datei"
+
+#: libdwfl/libdwflP.h:95
+#, fuzzy
+msgid "not a valid ELF file"
+msgstr "Ungültige ELF Datei"
+
+#: libdwfl/libdwflP.h:96
+#, fuzzy
+msgid "cannot handle DWARF type description"
+msgstr "konnte Elf-Deskriptor nicht erzeugen: %s"
+
+#: libebl/eblbackendname.c:63
+msgid "No backend"
+msgstr "Kein Backend"
+
+#: libebl/eblcorenotetypename.c:107 libebl/eblobjecttypename.c:78
+#: libebl/eblobjnotetypename.c:86 libebl/eblosabiname.c:98
+#: libebl/eblsectionname.c:110 libebl/eblsectiontypename.c:140
+#: libebl/eblsegmenttypename.c:104
+msgid "<unknown>"
+msgstr "<Unbekannt>"
+
+#: libebl/ebldynamictagname.c:126
+#, c-format
+msgid "<unknown>: %#<PRIx64>"
+msgstr "<Unbekannt>: %#<PRIx64>"
+
+#: libebl/eblobjnote.c:76
+#, c-format
+msgid " Build ID: "
+msgstr " Build ID: "
+
+#: libebl/eblobjnote.c:87
+#, c-format
+msgid " Linker version: %.*s\n"
+msgstr ""
+
+#: libebl/eblobjnote.c:136
+#, c-format
+msgid " OS: %s, ABI: "
+msgstr " OS: %s, ABI: "
+
+#: libebl/eblosabiname.c:95
+msgid "Stand alone"
+msgstr ""
+
+#: libebl/eblsymbolbindingname.c:92 libebl/eblsymboltypename.c:98
+#, c-format
+msgid "<unknown>: %d"
+msgstr "<unbekannt>: %d"
+
+#: libelf/elf_error.c:88
+msgid "unknown version"
+msgstr "unbekannte Version"
+
+#: libelf/elf_error.c:92
+msgid "unknown type"
+msgstr "unbekannter Typ"
+
+#: libelf/elf_error.c:96
+msgid "invalid `Elf' handle"
+msgstr "ungültiges `Elf'-Handle"
+
+#: libelf/elf_error.c:100
+msgid "invalid size of source operand"
+msgstr "ungültige Grösse des Quell-Operanden"
+
+#: libelf/elf_error.c:104
+msgid "invalid size of destination operand"
+msgstr "ungültige Grösse des Ziel-Operanden"
+
+#: libelf/elf_error.c:108 src/readelf.c:4779
+#, c-format
+msgid "invalid encoding"
+msgstr "ungültige Kodierung"
+
+#: libelf/elf_error.c:116
+msgid "invalid file descriptor"
+msgstr "ungültiger Datei-Deskriptor"
+
+#: libelf/elf_error.c:120
+msgid "invalid operation"
+msgstr "ungültige Operation"
+
+#: libelf/elf_error.c:124
+msgid "ELF version not set"
+msgstr "ELF-Version nicht gesetzt"
+
+#: libelf/elf_error.c:136
+msgid "invalid fmag field in archive header"
+msgstr "ungültiges fmag-Feld im Archivheader"
+
+#: libelf/elf_error.c:140
+msgid "invalid archive file"
+msgstr "Ungültige Archiv-Datei"
+
+#: libelf/elf_error.c:144
+msgid "descriptor is not for an archive"
+msgstr ""
+
+#: libelf/elf_error.c:148
+msgid "no index available"
+msgstr "kein Index verfügbar"
+
+#: libelf/elf_error.c:152
+msgid "cannot read data from file"
+msgstr "Daten aus der Datei konnten nicht gelesen werden"
+
+#: libelf/elf_error.c:156
+msgid "cannot write data to file"
+msgstr "Daten konnten nicht in die Datei geschrieben werden"
+
+#: libelf/elf_error.c:160
+msgid "invalid binary class"
+msgstr "ungültige Binärklasse"
+
+#: libelf/elf_error.c:164
+msgid "invalid section index"
+msgstr "ungültiger Abschnittsindex"
+
+#: libelf/elf_error.c:168
+msgid "invalid operand"
+msgstr "ungültiger Operand"
+
+#: libelf/elf_error.c:172
+msgid "invalid section"
+msgstr "ungültiger Abschnitt"
+
+#: libelf/elf_error.c:180
+msgid "executable header not created first"
+msgstr "ausführbarer Header wurde nicht zuerst erstellt"
+
+#: libelf/elf_error.c:184
+msgid "file descriptor disabled"
+msgstr "Datei-Deskriptor deaktiviert"
+
+#: libelf/elf_error.c:188
+#, fuzzy
+msgid "archive/member file descriptor mismatch"
+msgstr "Datei-Deskriptor deaktiviert"
+
+#: libelf/elf_error.c:196
+msgid "cannot manipulate null section"
+msgstr ""
+
+#: libelf/elf_error.c:200
+#, fuzzy
+msgid "data/scn mismatch"
+msgstr "data/scn Unterschied"
+
+#: libelf/elf_error.c:204
+msgid "invalid section header"
+msgstr "ungültiger Abschnitts-Header"
+
+#: libelf/elf_error.c:208 src/readelf.c:6242 src/readelf.c:6343
+#, c-format
+msgid "invalid data"
+msgstr "Ungültige Daten"
+
+#: libelf/elf_error.c:212
+msgid "unknown data encoding"
+msgstr "Unbekannte Datenkodierung"
+
+#: libelf/elf_error.c:216
+msgid "section `sh_size' too small for data"
+msgstr "Abschnitt `sh_size' zu klein für Daten"
+
+#: libelf/elf_error.c:220
+msgid "invalid section alignment"
+msgstr "ungültige Abschnittsausrichtung"
+
+#: libelf/elf_error.c:224
+msgid "invalid section entry size"
+msgstr ""
+
+#: libelf/elf_error.c:228
+msgid "update() for write on read-only file"
+msgstr ""
+
+#: libelf/elf_error.c:232
+msgid "no such file"
+msgstr "Datei nicht gefunden"
+
+#: libelf/elf_error.c:236
+msgid "only relocatable files can contain section groups"
+msgstr ""
+
+#: libelf/elf_error.c:241
+msgid ""
+"program header only allowed in executables, shared objects, and core files"
+msgstr ""
+
+#: libelf/elf_error.c:248
+msgid "file has no program header"
+msgstr "Datei hat keinen Programm-Kopf"
+
+#: src/addr2line.c:66
+msgid "Output selection options:"
+msgstr ""
+
+#: src/addr2line.c:67
+msgid "Show only base names of source files"
+msgstr ""
+
+#: src/addr2line.c:69
+msgid "Show absolute file names using compilation directory"
+msgstr ""
+
+#: src/addr2line.c:70
+msgid "Also show function names"
+msgstr ""
+
+#: src/addr2line.c:71
+msgid "Also show symbol or section names"
+msgstr ""
+
+#: src/addr2line.c:73
+msgid "Treat addresses as offsets relative to NAME section."
+msgstr ""
+
+#: src/addr2line.c:75 src/elfcmp.c:75 src/findtextrel.c:75 src/nm.c:103
+#: src/strings.c:83
+msgid "Miscellaneous:"
+msgstr "Verschiedenes:"
+
+#: src/addr2line.c:84
+msgid ""
+"Locate source files and line information for ADDRs (in a.out by default)."
+msgstr ""
+
+#: src/addr2line.c:88
+msgid "[ADDR...]"
+msgstr ""
+
+#: src/addr2line.c:185 src/ar.c:289 src/elfcmp.c:555 src/elflint.c:239
+#: src/findtextrel.c:170 src/ld.c:957 src/nm.c:253 src/objdump.c:181
+#: src/ranlib.c:136 src/readelf.c:449 src/size.c:219 src/strings.c:227
+#: src/strip.c:204 src/unstrip.c:234
+#, c-format
+msgid ""
+"Copyright (C) %s Red Hat, Inc.\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+"Copyright (C) %s Red Hat, Inc.\n"
+"Dies ist freie Software, siehe Quellcode für Kopierbedingungen. KEINE "
+"GARANTIE,\n"
+"auch nicht für Marktgängigkeit oder Eignung für einen Bestimmten Zweck.\n"
+
+#: src/addr2line.c:190 src/ar.c:294 src/elfcmp.c:560 src/elflint.c:244
+#: src/findtextrel.c:175 src/ld.c:962 src/nm.c:258 src/objdump.c:186
+#: src/ranlib.c:141 src/readelf.c:454 src/size.c:224 src/strings.c:232
+#: src/strip.c:209 src/unstrip.c:239
+#, c-format
+msgid "Written by %s.\n"
+msgstr "Geschrieben von %s.\n"
+
+#: src/addr2line.c:405
+#, fuzzy, c-format
+msgid "Section syntax requires exactly one module"
+msgstr "Abschnitt syntax benötigt genau ein Modul"
+
+#: src/addr2line.c:428
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside section '%s'"
+msgstr ""
+
+#: src/addr2line.c:461
+#, c-format
+msgid "cannot find symbol '%s'"
+msgstr "Konnte Symbol '%s' nicht finden"
+
+#: src/addr2line.c:466
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
+msgstr ""
+
+#: src/ar.c:76
+msgid "Commands:"
+msgstr "Befehle:"
+
+#: src/ar.c:77
+msgid "Delete files from archive."
+msgstr "Dateien aus dem Archiv löschen."
+
+#: src/ar.c:78
+msgid "Move files in archive."
+msgstr "Dateien zum Archiv hinzufügen."
+
+#: src/ar.c:79
+msgid "Print files in archive."
+msgstr "Packe Dateien in Archiv"
+
+#: src/ar.c:80
+msgid "Quick append files to archive."
+msgstr "Hänge Dateien an ein Archiv"
+
+#: src/ar.c:82
+msgid "Replace existing or insert new file into archive."
+msgstr "Ersetze existierende oder füge neue Datei in das Archiv ein."
+
+#: src/ar.c:83
+msgid "Display content of archive."
+msgstr "Zeige Archivinhalt an."
+
+#: src/ar.c:84
+msgid "Extract files from archive."
+msgstr "Entpacke Dateien aus dem Archiv"
+
+#: src/ar.c:86
+msgid "Command Modifiers:"
+msgstr ""
+
+#: src/ar.c:87
+msgid "Preserve original dates."
+msgstr "Erhalte ursprüngliche Daten."
+
+#: src/ar.c:88
+msgid "Use instance [COUNT] of name."
+msgstr ""
+
+#: src/ar.c:90
+msgid "Do not replace existing files with extracted files."
+msgstr "Ersetze existierende Dateien nicht mit entpackten Dateien"
+
+#: src/ar.c:91
+msgid "Allow filename to be truncated if necessary."
+msgstr "Erlaube angehängte Dateinamen, wenn nötig"
+
+#: src/ar.c:93
+msgid "Provide verbose output."
+msgstr "Zeige detaillierte Ausgabe."
+
+#: src/ar.c:94
+msgid "Force regeneration of symbol table."
+msgstr "Erzwinge Regenerierung der Symboltabelle."
+
+#: src/ar.c:95
+msgid "Insert file after [MEMBER]."
+msgstr "Füge Datei nach [MEMBER] ein."
+
+#: src/ar.c:96
+msgid "Insert file before [MEMBER]."
+msgstr "Füge Datei vor [MEMBER] ein."
+
+#: src/ar.c:97
+msgid "Same as -b."
+msgstr "Genau wie -b."
+
+#: src/ar.c:98
+msgid "Suppress message when library has to be created."
+msgstr "Unterdrücke Nachricht wenn Bibliothek erstellt werden muss."
+
+#: src/ar.c:100
+#, fuzzy
+msgid "Use full path for file matching."
+msgstr "Vollständigen Pfad für Dateiabgleich verwenden."
+
+#: src/ar.c:101
+msgid "Update only older files in archive."
+msgstr "Nur ältere Datein im Archiv aktualisieren"
+
+#: src/ar.c:107
+msgid "Create, modify, and extract from archives."
+msgstr "Erstelle, ändere, extrahiere von Archiven"
+
+#: src/ar.c:110
+msgid "[MEMBER] [COUNT] ARCHIVE [FILE...]"
+msgstr "[MEMBER] [COUNT] ARCHIVE [FILE...]"
+
+#: src/ar.c:192
+#, c-format
+msgid "'a', 'b', and 'i' are only allowed with the 'm' and 'r' options"
+msgstr "'a', 'b', und 'i' nur zusammen mit 'm' and 'r Optionen"
+
+#: src/ar.c:197
+#, c-format
+msgid "MEMBER parameter required for 'a', 'b', and 'i' modifiers"
+msgstr ""
+
+#: src/ar.c:213
+#, c-format
+msgid "'N' is only meaningful with the 'x' and 'd' options"
+msgstr "'N' ist nur mit den Optionen 'x' und 'd' von Bedeutung."
+
+#: src/ar.c:218
+#, c-format
+msgid "COUNT parameter required"
+msgstr "COUNT Parameter erforderlich"
+
+#: src/ar.c:230
+#, c-format
+msgid "invalid COUNT parameter %s"
+msgstr "Ungültiger COUNT Parameter %s"
+
+#: src/ar.c:237
+#, fuzzy, c-format
+msgid "'%c' is only meaningful with the 'x' option"
+msgstr "'%' ist nur mit der Option 'x' von Bedeutung"
+
+#: src/ar.c:243
+#, c-format
+msgid "archive name required"
+msgstr "Archivname erforderlich"
+
+#: src/ar.c:314
+#, c-format
+msgid "More than one operation specified"
+msgstr "Mehr als eine Operation angegeben"
+
+#: src/ar.c:404
+#, c-format
+msgid "cannot open archive '%s'"
+msgstr "Konnte Archiv '%s' nicht öffnen"
+
+#: src/ar.c:414
+#, c-format
+msgid "cannot open archive '%s': %s"
+msgstr "Konnte Archiv '%s': %s nicht öffnen"
+
+#: src/ar.c:418
+#, c-format
+msgid "%s: not an archive file"
+msgstr "%s: Keine Archiv-Datei"
+
+#: src/ar.c:422
+#, c-format
+msgid "cannot stat archive '%s'"
+msgstr ""
+
+#: src/ar.c:434
+#, c-format
+msgid "no entry %s in archive\n"
+msgstr "Kein Eintrag %s in Archiv\n"
+
+#: src/ar.c:487 src/ar.c:929 src/ar.c:1129
+#, c-format
+msgid "cannot create hash table"
+msgstr "Konnte Hash-Tabelle nicht erstellen"
+
+#: src/ar.c:494 src/ar.c:936 src/ar.c:1138
+#, c-format
+msgid "cannot insert into hash table"
+msgstr "Konnte nicht in Hash-Tabelle einfügen"
+
+#: src/ar.c:502 src/ranlib.c:176
+#, c-format
+msgid "cannot stat '%s'"
+msgstr ""
+
+#: src/ar.c:598
+#, c-format
+msgid "cannot read content of %s: %s"
+msgstr "Konnte Inhalt von %s: %s nicht lesen"
+
+#: src/ar.c:641
+#, c-format
+msgid "cannot open %.*s"
+msgstr "Konnte %.*s nicht öffnen"
+
+#: src/ar.c:663
+#, c-format
+msgid "failed to write %s"
+msgstr "Konnte %s nicht schreiben"
+
+#: src/ar.c:675
+#, c-format
+msgid "cannot change mode of %s"
+msgstr ""
+
+#: src/ar.c:691
+#, c-format
+msgid "cannot change modification time of %s"
+msgstr "Konnte Bearbeitungszeit von %s nicht ändern"
+
+#: src/ar.c:737
+#, c-format
+msgid "cannot rename temporary file to %.*s"
+msgstr "Konnte temporäre Datei nicht in %.*s umbenennen"
+
+#: src/ar.c:773 src/ar.c:1021 src/ar.c:1419 src/ranlib.c:250
+#, c-format
+msgid "cannot create new file"
+msgstr "neue Datei konnte nicht angelegt werden"
+
+#: src/ar.c:1220
+#, c-format
+msgid "position member %s not found"
+msgstr ""
+
+#: src/ar.c:1230
+#, c-format
+msgid "%s: no entry %s in archive!\n"
+msgstr "%s: Kein Eintrag %s in dem Archiv!\n"
+
+#: src/ar.c:1259 src/ldgeneric.c:519 src/objdump.c:257
+#, c-format
+msgid "cannot open %s"
+msgstr "Konnte %s nicht öffnen"
+
+#: src/ar.c:1264
+#, c-format
+msgid "cannot stat %s"
+msgstr ""
+
+#: src/ar.c:1270
+#, c-format
+msgid "%s is no regular file"
+msgstr "%s ist keine reguläre Datei"
+
+#: src/ar.c:1283
+#, c-format
+msgid "cannot get ELF descriptor for %s: %s\n"
+msgstr ""
+
+#: src/ar.c:1302
+#, c-format
+msgid "cannot read %s: %s"
+msgstr "Konnte %s: %s nicht lesen"
+
+#: src/arlib.c:215
+#, c-format
+msgid "the archive '%s' is too large"
+msgstr "Das Archiv '%s' ist zu groß"
+
+#: src/arlib.c:228
+#, c-format
+msgid "cannot read ELF header of %s(%s): %s"
+msgstr "\"Konnte ELF-Kopf von %s(%s): %s nicht lesen"
+
+#: src/elfcmp.c:69
+msgid "Control options:"
+msgstr ""
+
+#: src/elfcmp.c:70
+msgid ""
+"Control treatment of gaps in loadable segments [ignore|match] (default: "
+"ignore)"
+msgstr ""
+
+#: src/elfcmp.c:72
+msgid "Ignore permutation of buckets in SHT_HASH section"
+msgstr ""
+
+#: src/elfcmp.c:73
+msgid "Output nothing; yield exit status only"
+msgstr ""
+
+#: src/elfcmp.c:80
+msgid "Compare relevant parts of two ELF files for equality."
+msgstr ""
+
+#: src/elfcmp.c:84
+#, fuzzy
+msgid "FILE1 FILE2"
+msgstr "DATEI1 DATEI2"
+
+#: src/elfcmp.c:140
+msgid "Invalid number of parameters.\n"
+msgstr "Ungültige Anzahl von Parametern.\n"
+
+#: src/elfcmp.c:168 src/elfcmp.c:173
+#, c-format
+msgid "cannot get ELF header of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:190
+#, c-format
+msgid "%s %s diff: ELF header"
+msgstr ""
+
+#: src/elfcmp.c:198 src/elfcmp.c:201
+#, fuzzy, c-format
+msgid "cannot get section count of '%s': %s"
+msgstr "konnte Abschnittsdaten nicht holen: %s"
+
+#: src/elfcmp.c:206
+#, c-format
+msgid "%s %s diff: section count"
+msgstr ""
+
+#: src/elfcmp.c:214 src/elfcmp.c:217
+#, fuzzy, c-format
+msgid "cannot get program header count of '%s': %s"
+msgstr "konnte Programm-Kopf nicht erstellen: %s"
+
+#: src/elfcmp.c:222
+#, fuzzy, c-format
+msgid "%s %s diff: program header count"
+msgstr "Datei hat keinen Programm-Kopf"
+
+#: src/elfcmp.c:281
+#, c-format
+msgid "%s %s differ: section header"
+msgstr ""
+
+#: src/elfcmp.c:309 src/elfcmp.c:315
+#, c-format
+msgid "cannot get content of section %zu in '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:331 src/elfcmp.c:337
+#, c-format
+msgid "cannot get symbol in '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:358
+#, c-format
+msgid "%s %s differ: symbol table [%zu]"
+msgstr ""
+
+#: src/elfcmp.c:361
+#, c-format
+msgid "%s %s differ: symbol table [%zu,%zu]"
+msgstr ""
+
+#: src/elfcmp.c:409
+#, c-format
+msgid "%s %s differ: section [%zu] '%s' content"
+msgstr ""
+
+#: src/elfcmp.c:413
+#, c-format
+msgid "%s %s differ: section [%zu,%zu] '%s' content"
+msgstr ""
+
+#: src/elfcmp.c:429
+#, c-format
+msgid "%s %s differ: unequal amount of important sections"
+msgstr ""
+
+#: src/elfcmp.c:463 src/elfcmp.c:468
+#, c-format
+msgid "cannot load data of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:487 src/elfcmp.c:493
+#, c-format
+msgid "cannot get program header entry %d of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:499
+#, c-format
+msgid "%s %s differ: program header %d"
+msgstr ""
+
+#: src/elfcmp.c:524
+#, c-format
+msgid "%s %s differ: gap"
+msgstr ""
+
+#: src/elfcmp.c:583
+#, c-format
+msgid "Invalid value '%s' for --gaps parameter."
+msgstr ""
+
+#: src/elfcmp.c:607 src/findtextrel.c:229 src/ldgeneric.c:1767
+#: src/ldgeneric.c:4257 src/nm.c:363 src/ranlib.c:169 src/size.c:301
+#: src/strings.c:183 src/strip.c:433 src/strip.c:468 src/unstrip.c:1900
+#: src/unstrip.c:1929
+#, c-format
+msgid "cannot open '%s'"
+msgstr "'%s' kann nicht geöffnet werden"
+
+#: src/elfcmp.c:611 src/findtextrel.c:236 src/ranlib.c:186
+#, c-format
+msgid "cannot create ELF descriptor for '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:616
+#, c-format
+msgid "cannot create EBL descriptor for '%s'"
+msgstr ""
+
+#: src/elfcmp.c:634
+#, c-format
+msgid "cannot get section header of section %zu: %s"
+msgstr ""
+
+#: src/elfcmp.c:644
+#, c-format
+msgid "cannot get content of section %zu: %s"
+msgstr ""
+
+#: src/elfcmp.c:654 src/elfcmp.c:668
+#, c-format
+msgid "cannot get relocation: %s"
+msgstr ""
+
+#: src/elflint.c:72
+msgid "Be extremely strict, flag level 2 features."
+msgstr ""
+
+#: src/elflint.c:73
+msgid "Do not print anything if successful"
+msgstr "Gebe nichts aus, wenn erfolgreich"
+
+#: src/elflint.c:74
+msgid "Binary is a separate debuginfo file"
+msgstr ""
+
+#: src/elflint.c:76
+msgid ""
+"Binary has been created with GNU ld and is therefore known to be broken in "
+"certain ways"
+msgstr ""
+
+#: src/elflint.c:82
+msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
+msgstr ""
+
+#: src/elflint.c:86 src/readelf.c:118
+msgid "FILE..."
+msgstr "DATEI..."
+
+#: src/elflint.c:159 src/readelf.c:272
+#, c-format
+msgid "cannot open input file"
+msgstr "Kann Eingabedatei nicht öffnen"
+
+#: src/elflint.c:166
+#, c-format
+msgid "cannot generate Elf descriptor: %s\n"
+msgstr "kann Elf-Deskriptor nicht erzeugen: %s\n"
+
+#: src/elflint.c:185
+#, c-format
+msgid "error while closing Elf descriptor: %s\n"
+msgstr "Fehler beim Schliessen des Elf-Desktriptor: %s\n"
+
+#: src/elflint.c:189
+msgid "No errors"
+msgstr "Keine Fehler"
+
+#: src/elflint.c:223 src/readelf.c:425
+msgid "Missing file name.\n"
+msgstr "Dateiname fehlt.\n"
+
+#: src/elflint.c:302
+#, c-format
+msgid " error while freeing sub-ELF descriptor: %s\n"
+msgstr ""
+
+#: src/elflint.c:310
+#, 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:370
+#, c-format
+msgid "e_ident[%d] == %d is no known class\n"
+msgstr ""
+
+#: src/elflint.c:375
+#, c-format
+msgid "e_ident[%d] == %d is no known data encoding\n"
+msgstr ""
+
+#: src/elflint.c:379
+#, c-format
+msgid "unknown ELF header version number e_ident[%d] == %d\n"
+msgstr ""
+
+#: src/elflint.c:385
+#, c-format
+msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
+msgstr ""
+
+#: src/elflint.c:391
+#, c-format
+msgid "unsupport ABI version e_ident[%d] == %d\n"
+msgstr ""
+
+#: src/elflint.c:396
+#, c-format
+msgid "e_ident[%zu] is not zero\n"
+msgstr "e_ident[%zu] ist nicht null\n"
+
+#: src/elflint.c:401
+#, c-format
+msgid "unknown object file type %d\n"
+msgstr ""
+
+#: src/elflint.c:408
+#, c-format
+msgid "unknown machine type %d\n"
+msgstr ""
+
+#: src/elflint.c:412
+#, c-format
+msgid "unknown object file version\n"
+msgstr ""
+
+#: src/elflint.c:418
+#, c-format
+msgid "invalid program header offset\n"
+msgstr ""
+
+#: src/elflint.c:420
+#, c-format
+msgid "executables and DSOs cannot have zero program header offset\n"
+msgstr ""
+
+#: src/elflint.c:424
+#, c-format
+msgid "invalid number of program header entries\n"
+msgstr ""
+
+#: src/elflint.c:432
+#, c-format
+msgid "invalid section header table offset\n"
+msgstr ""
+
+#: src/elflint.c:435
+#, c-format
+msgid "section header table must be present\n"
+msgstr ""
+
+#: src/elflint.c:449
+#, c-format
+msgid "invalid number of section header table entries\n"
+msgstr ""
+
+#: src/elflint.c:466
+#, c-format
+msgid "invalid section header index\n"
+msgstr ""
+
+#: src/elflint.c:480
+#, fuzzy, c-format
+msgid "invalid number of program header table entries\n"
+msgstr "Ungültige Anzahl von Parametern.\n"
+
+#: src/elflint.c:489
+#, c-format
+msgid "invalid machine flags: %s\n"
+msgstr ""
+
+#: src/elflint.c:496 src/elflint.c:513
+#, c-format
+msgid "invalid ELF header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:499 src/elflint.c:516
+#, c-format
+msgid "invalid program header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:502 src/elflint.c:519
+#, c-format
+msgid "invalid program header position or size\n"
+msgstr ""
+
+#: src/elflint.c:505 src/elflint.c:522
+#, c-format
+msgid "invalid section header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:508 src/elflint.c:525
+#, c-format
+msgid "invalid section header position or size\n"
+msgstr ""
+
+#: src/elflint.c:569
+#, c-format
+msgid ""
+"section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
+"group\n"
+msgstr ""
+
+#: src/elflint.c:573
+#, c-format
+msgid ""
+"section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
+msgstr ""
+
+#: src/elflint.c:589 src/elflint.c:1432 src/elflint.c:1482 src/elflint.c:1591
+#: src/elflint.c:2185 src/elflint.c:2699 src/elflint.c:2860 src/elflint.c:2990
+#: src/elflint.c:3162 src/elflint.c:4062
+#, c-format
+msgid "section [%2d] '%s': cannot get section data\n"
+msgstr ""
+
+#: src/elflint.c:602 src/elflint.c:1598
+#, 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:625
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol table cannot have more than one extended index "
+"section\n"
+msgstr ""
+
+#: src/elflint.c:636
+#, c-format
+msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
+msgstr ""
+
+#: src/elflint.c:645
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
+msgstr ""
+
+#: src/elflint.c:650 src/elflint.c:653 src/elflint.c:656 src/elflint.c:659
+#: src/elflint.c:662 src/elflint.c:665
+#, c-format
+msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
+msgstr ""
+
+#: src/elflint.c:668
+#, c-format
+msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
+msgstr ""
+
+#: src/elflint.c:678
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:687
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
+msgstr ""
+
+#: src/elflint.c:700
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: too large section index but no extended "
+"section index section\n"
+msgstr ""
+
+#: src/elflint.c:706
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
+"st_shndx (%<PRIu32>)\n"
+msgstr ""
+
+#: src/elflint.c:718
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
+msgstr ""
+
+#: src/elflint.c:726
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown type\n"
+msgstr ""
+
+#: src/elflint.c:732
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
+msgstr ""
+
+#: src/elflint.c:737
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
+msgstr ""
+
+#: src/elflint.c:745
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
+msgstr ""
+
+#: src/elflint.c:749
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
+msgstr ""
+
+#: src/elflint.c:753
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
+msgstr ""
+
+#: src/elflint.c:785
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:791 src/elflint.c:816 src/elflint.c:859
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu does not fit completely in referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:800
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
+"SHF_TLS flag set\n"
+msgstr ""
+
+#: src/elflint.c:810 src/elflint.c:852
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:837
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
+msgstr ""
+
+#: src/elflint.c:845
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:872
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+
+#: src/elflint.c:879
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+
+#: src/elflint.c:886
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
+msgstr ""
+
+#: src/elflint.c:936
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section [%"
+"2d]\n"
+msgstr ""
+
+#: src/elflint.c:943
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:959
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
+"match %s section address %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:966
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
+"match %s section size %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:974
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
+"section\n"
+msgstr ""
+
+#: src/elflint.c:990
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
+"segment address %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:997
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
+"segment size %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:1010
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
+"default visibility\n"
+msgstr ""
+
+#: src/elflint.c:1014
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
+msgstr ""
+
+#: src/elflint.c:1059
+#, c-format
+msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
+msgstr ""
+
+#: src/elflint.c:1068 src/elflint.c:1120
+#, c-format
+msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
+msgstr ""
+
+#: src/elflint.c:1093 src/elflint.c:1145
+#, c-format
+msgid ""
+"section [%2d] '%s': relative relocations after index %d as specified by "
+"DT_RELCOUNT\n"
+msgstr ""
+
+#: src/elflint.c:1099 src/elflint.c:1151
+#, c-format
+msgid ""
+"section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
+"specified %d relative relocations\n"
+msgstr ""
+
+#: src/elflint.c:1111
+#, c-format
+msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
+msgstr ""
+
+#: src/elflint.c:1193
+#, c-format
+msgid "section [%2d] '%s': invalid destination section index\n"
+msgstr ""
+
+#: src/elflint.c:1206
+#, c-format
+msgid "section [%2d] '%s': invalid destination section type\n"
+msgstr ""
+
+#: src/elflint.c:1214
+#, c-format
+msgid "section [%2d] '%s': sh_info should be zero\n"
+msgstr ""
+
+#: src/elflint.c:1221
+#, c-format
+msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
+msgstr ""
+
+#: src/elflint.c:1228
+#, c-format
+msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
+msgstr ""
+
+#: src/elflint.c:1288
+#, c-format
+msgid "text relocation flag set but there is no read-only segment\n"
+msgstr ""
+
+#: src/elflint.c:1315
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid type\n"
+msgstr ""
+
+#: src/elflint.c:1323
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: relocation type invalid for the file "
+"type\n"
+msgstr ""
+
+#: src/elflint.c:1331
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
+msgstr ""
+
+#: src/elflint.c:1349
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
+"be used with %s\n"
+msgstr ""
+
+#: src/elflint.c:1366
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:1381
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: copy relocation against symbol of type %"
+"s\n"
+msgstr ""
+
+#: src/elflint.c:1402
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: read-only section modified but text "
+"relocation flag not set\n"
+msgstr ""
+
+#: src/elflint.c:1417
+#, c-format
+msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
+msgstr ""
+
+#: src/elflint.c:1456 src/elflint.c:1506
+#, c-format
+msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:1586
+#, c-format
+msgid "more than one dynamic section present\n"
+msgstr ""
+
+#: src/elflint.c:1604
+#, c-format
+msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
+msgstr ""
+
+#: src/elflint.c:1609 src/elflint.c:1901
+#, c-format
+msgid "section [%2d] '%s': sh_info not zero\n"
+msgstr ""
+
+#: src/elflint.c:1619
+#, c-format
+msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:1627
+#, c-format
+msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
+msgstr ""
+
+#: src/elflint.c:1634
+#, c-format
+msgid "section [%2d] '%s': entry %zu: unknown tag\n"
+msgstr ""
+
+#: src/elflint.c:1645
+#, c-format
+msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
+msgstr ""
+
+#: src/elflint.c:1655
+#, c-format
+msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
+msgstr ""
+
+#: src/elflint.c:1673
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
+msgstr ""
+
+#: src/elflint.c:1695
+#, 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:1738
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:1753
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must be valid offset in section [%"
+"2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:1773 src/elflint.c:1801
+#, c-format
+msgid "section [%2d] '%s': contains %s entry but not %s\n"
+msgstr ""
+
+#: src/elflint.c:1785
+#, c-format
+msgid "section [%2d] '%s': mandatory tag %s not present\n"
+msgstr ""
+
+#: src/elflint.c:1794
+#, c-format
+msgid "section [%2d] '%s': no hash section present\n"
+msgstr ""
+
+#: src/elflint.c:1809 src/elflint.c:1816
+#, c-format
+msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
+msgstr ""
+
+#: src/elflint.c:1826 src/elflint.c:1830
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
+msgstr ""
+
+#: src/elflint.c:1836
+#, c-format
+msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
+msgstr ""
+
+#: src/elflint.c:1847 src/elflint.c:1851 src/elflint.c:1855 src/elflint.c:1859
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
+msgstr ""
+
+#: src/elflint.c:1871
+#, c-format
+msgid ""
+"section [%2d] '%s': only relocatable files can have extended section index\n"
+msgstr ""
+
+#: src/elflint.c:1881
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index section not for symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1886
+#, c-format
+msgid "cannot get data for symbol section\n"
+msgstr ""
+
+#: src/elflint.c:1889
+#, c-format
+msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
+msgstr ""
+
+#: src/elflint.c:1896
+#, c-format
+msgid "section [%2d] '%s': extended index table too small for symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1911
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
+"same symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1922
+#, c-format
+msgid "symbol 0 should have zero extended section index\n"
+msgstr ""
+
+#: src/elflint.c:1934
+#, c-format
+msgid "cannot get data for symbol %zu\n"
+msgstr ""
+
+#: src/elflint.c:1939
+#, c-format
+msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
+msgstr ""
+
+#: src/elflint.c:1955 src/elflint.c:1996
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
+msgstr ""
+
+#: src/elflint.c:1967 src/elflint.c:2008
+#, c-format
+msgid "section [%2d] '%s': chain array too large\n"
+msgstr ""
+
+#: src/elflint.c:1976 src/elflint.c:2017
+#, c-format
+msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:1982
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2023
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2038
+#, c-format
+msgid "section [%2d] '%s': bitmask size not power of 2: %u\n"
+msgstr ""
+
+#: src/elflint.c:2049
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected at "
+"least%ld)\n"
+msgstr ""
+
+#: src/elflint.c:2057
+#, c-format
+msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
+msgstr ""
+
+#: src/elflint.c:2089
+#, c-format
+msgid ""
+"section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
+msgstr ""
+
+#: src/elflint.c:2110
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
+"undefined\n"
+msgstr ""
+
+#: src/elflint.c:2121
+#, c-format
+msgid ""
+"section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
+msgstr ""
+
+#: src/elflint.c:2152
+#, c-format
+msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2157
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2163
+#, c-format
+msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
+msgstr ""
+
+#: src/elflint.c:2176
+#, c-format
+msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
+msgstr ""
+
+#: src/elflint.c:2194
+#, c-format
+msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
+msgstr ""
+
+#: src/elflint.c:2202
+#, c-format
+msgid "section [%2d] '%s': hash table entry size incorrect\n"
+msgstr ""
+
+#: src/elflint.c:2207
+#, c-format
+msgid "section [%2d] '%s': not marked to be allocated\n"
+msgstr ""
+
+#: src/elflint.c:2212
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table has not even room for initial administrative "
+"entries\n"
+msgstr ""
+
+#: src/elflint.c:2260
+#, c-format
+msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
+msgstr ""
+
+#: src/elflint.c:2338 src/elflint.c:2342
+#, c-format
+msgid "section [%2zu] '%s': reference to symbol index 0\n"
+msgstr ""
+
+#: src/elflint.c:2349
+#, 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:2361
+#, 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:2377
+#, c-format
+msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
+msgstr ""
+
+#: src/elflint.c:2397
+#, c-format
+msgid ""
+"section [%2d] '%s': section groups only allowed in relocatable object files\n"
+msgstr ""
+
+#: src/elflint.c:2408
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol table: %s\n"
+msgstr ""
+
+#: src/elflint.c:2413
+#, c-format
+msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
+msgstr ""
+
+#: src/elflint.c:2419
+#, c-format
+msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
+msgstr ""
+
+#: src/elflint.c:2424
+#, c-format
+msgid "section [%2d] '%s': sh_flags not zero\n"
+msgstr ""
+
+#: src/elflint.c:2431
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol for signature\n"
+msgstr ""
+
+#: src/elflint.c:2436
+#, c-format
+msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
+msgstr ""
+
+#: src/elflint.c:2442
+#, c-format
+msgid "section [%2d] '%s': sh_flags not set correctly\n"
+msgstr ""
+
+#: src/elflint.c:2448
+#, c-format
+msgid "section [%2d] '%s': cannot get data: %s\n"
+msgstr ""
+
+#: src/elflint.c:2457
+#, c-format
+msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
+msgstr ""
+
+#: src/elflint.c:2462
+#, c-format
+msgid "section [%2d] '%s': section group without flags word\n"
+msgstr ""
+
+#: src/elflint.c:2468
+#, c-format
+msgid "section [%2d] '%s': section group without member\n"
+msgstr ""
+
+#: src/elflint.c:2472
+#, c-format
+msgid "section [%2d] '%s': section group with only one member\n"
+msgstr ""
+
+#: src/elflint.c:2483
+#, c-format
+msgid "section [%2d] '%s': unknown section group flags\n"
+msgstr ""
+
+#: src/elflint.c:2495
+#, c-format
+msgid "section [%2d] '%s': section index %Zu out of range\n"
+msgstr ""
+
+#: src/elflint.c:2504
+#, c-format
+msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:2511
+#, c-format
+msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:2517
+#, c-format
+msgid ""
+"section [%2d] '%s': element %Zu references section [%2d] '%s' without "
+"SHF_GROUP flag set\n"
+msgstr ""
+
+#: src/elflint.c:2524
+#, c-format
+msgid "section [%2d] '%s' is contained in more than one section group\n"
+msgstr ""
+
+#: src/elflint.c:2713
+#, 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:2724
+#, c-format
+msgid ""
+"section [%2d] '%s' has different number of entries than symbol table [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:2740
+#, c-format
+msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
+msgstr ""
+
+#: src/elflint.c:2756
+#, c-format
+msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
+msgstr ""
+
+#: src/elflint.c:2764
+#, c-format
+msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
+msgstr ""
+
+#: src/elflint.c:2778
+#, c-format
+msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
+msgstr ""
+
+#: src/elflint.c:2783
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %d: version index %d is for defined version\n"
+msgstr ""
+
+#: src/elflint.c:2793
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %d: version index %d is for requested version\n"
+msgstr ""
+
+#: src/elflint.c:2845
+#, c-format
+msgid "more than one version reference section present\n"
+msgstr ""
+
+#: src/elflint.c:2853 src/elflint.c:2982
+#, c-format
+msgid "section [%2d] '%s': sh_link does not link to string table\n"
+msgstr ""
+
+#: src/elflint.c:2876 src/elflint.c:3034
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong version %d\n"
+msgstr ""
+
+#: src/elflint.c:2882 src/elflint.c:3040
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:2890
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid file reference\n"
+msgstr ""
+
+#: src/elflint.c:2898
+#, c-format
+msgid "section [%2d] '%s': entry %d references unknown dependency\n"
+msgstr ""
+
+#: src/elflint.c:2910
+#, c-format
+msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
+msgstr ""
+
+#: src/elflint.c:2917
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
+"reference\n"
+msgstr ""
+
+#: src/elflint.c:2924
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: %"
+"#x, expected %#x\n"
+msgstr ""
+
+#: src/elflint.c:2934
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
+"name '%s'\n"
+msgstr ""
+
+#: src/elflint.c:2945
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
+msgstr ""
+
+#: src/elflint.c:2961 src/elflint.c:3119
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
+msgstr ""
+
+#: src/elflint.c:2974
+#, c-format
+msgid "more than one version definition section present\n"
+msgstr ""
+
+#: src/elflint.c:3019
+#, c-format
+msgid "section [%2d] '%s': more than one BASE definition\n"
+msgstr ""
+
+#: src/elflint.c:3023
+#, c-format
+msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
+msgstr ""
+
+#: src/elflint.c:3029
+#, c-format
+msgid "section [%2d] '%s': entry %d has unknown flag\n"
+msgstr ""
+
+#: src/elflint.c:3053
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid name reference\n"
+msgstr ""
+
+#: src/elflint.c:3060
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
+msgstr ""
+
+#: src/elflint.c:3069
+#, c-format
+msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
+msgstr ""
+
+#: src/elflint.c:3088
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:3103
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:3125
+#, c-format
+msgid "section [%2d] '%s': no BASE definition\n"
+msgstr ""
+
+#: src/elflint.c:3141
+#, c-format
+msgid "section [%2d] '%s': unknown parent version '%s'\n"
+msgstr ""
+
+#: src/elflint.c:3154
+#, c-format
+msgid "section [%2d] '%s': empty object attributes section\n"
+msgstr ""
+
+#: src/elflint.c:3175
+#, c-format
+msgid "section [%2d] '%s': unrecognized attribute format\n"
+msgstr ""
+
+#: src/elflint.c:3191
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: zero length field in attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3200
+#, c-format
+msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3212
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
+msgstr ""
+
+#: src/elflint.c:3229
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
+msgstr ""
+
+#: src/elflint.c:3238
+#, c-format
+msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3247
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
+msgstr ""
+
+#: src/elflint.c:3260
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
+msgstr ""
+
+#: src/elflint.c:3271
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
+msgstr ""
+
+#: src/elflint.c:3289
+#, c-format
+msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
+msgstr ""
+
+#: src/elflint.c:3300
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
+msgstr ""
+
+#: src/elflint.c:3313
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
+msgstr ""
+
+#: src/elflint.c:3317
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:3327
+#, c-format
+msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
+msgstr ""
+
+#: src/elflint.c:3333
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3422
+#, c-format
+msgid "cannot get section header of zeroth section\n"
+msgstr ""
+
+#: src/elflint.c:3426
+#, c-format
+msgid "zeroth section has nonzero name\n"
+msgstr ""
+
+#: src/elflint.c:3428
+#, c-format
+msgid "zeroth section has nonzero type\n"
+msgstr ""
+
+#: src/elflint.c:3430
+#, c-format
+msgid "zeroth section has nonzero flags\n"
+msgstr ""
+
+#: src/elflint.c:3432
+#, c-format
+msgid "zeroth section has nonzero address\n"
+msgstr ""
+
+#: src/elflint.c:3434
+#, c-format
+msgid "zeroth section has nonzero offset\n"
+msgstr ""
+
+#: src/elflint.c:3436
+#, c-format
+msgid "zeroth section has nonzero align value\n"
+msgstr ""
+
+#: src/elflint.c:3438
+#, c-format
+msgid "zeroth section has nonzero entry size value\n"
+msgstr ""
+
+#: src/elflint.c:3441
+#, c-format
+msgid ""
+"zeroth section has nonzero size value while ELF header has nonzero shnum "
+"value\n"
+msgstr ""
+
+#: src/elflint.c:3445
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in shstrndx\n"
+msgstr ""
+
+#: src/elflint.c:3449
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in phnum\n"
+msgstr ""
+
+#: src/elflint.c:3466
+#, c-format
+msgid "cannot get section header for section [%2zu] '%s': %s\n"
+msgstr ""
+
+#: src/elflint.c:3475
+#, c-format
+msgid "section [%2zu]: invalid name\n"
+msgstr ""
+
+#: src/elflint.c:3502
+#, c-format
+msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3518
+#, c-format
+msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3535
+#, c-format
+msgid ""
+"section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3553
+#, c-format
+msgid "section [%2zu] '%s' present in object file\n"
+msgstr ""
+
+#: src/elflint.c:3559 src/elflint.c:3591
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
+msgstr ""
+
+#: src/elflint.c:3564 src/elflint.c:3596
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
+"segments\n"
+msgstr ""
+
+#: src/elflint.c:3572
+#, c-format
+msgid ""
+"section [%2zu] '%s' is extension section index table in non-object file\n"
+msgstr ""
+
+#: src/elflint.c:3615
+#, c-format
+msgid "section [%2zu] '%s': size not multiple of entry size\n"
+msgstr ""
+
+#: src/elflint.c:3620
+#, c-format
+msgid "cannot get section header\n"
+msgstr ""
+
+#: src/elflint.c:3630
+#, c-format
+msgid "section [%2zu] '%s' has unsupported type %d\n"
+msgstr ""
+
+#: src/elflint.c:3644
+#, c-format
+msgid ""
+"section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:3651
+#, c-format
+msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:3659
+#, c-format
+msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
+msgstr ""
+
+#: src/elflint.c:3667
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in link value\n"
+msgstr ""
+
+#: src/elflint.c:3672
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in info value\n"
+msgstr ""
+
+#: src/elflint.c:3679
+#, c-format
+msgid "section [%2zu] '%s': strings flag set without merge flag\n"
+msgstr ""
+
+#: src/elflint.c:3684
+#, c-format
+msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
+msgstr ""
+
+#: src/elflint.c:3702
+#, c-format
+msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
+msgstr ""
+
+#: src/elflint.c:3711
+#, c-format
+msgid "section [%2zu] '%s' is both executable and writable\n"
+msgstr ""
+
+#: src/elflint.c:3738
+#, c-format
+msgid ""
+"section [%2zu] '%s' not fully contained in segment of program header entry %"
+"d\n"
+msgstr ""
+
+#: src/elflint.c:3746
+#, 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:3755
+#, 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:3766
+#, c-format
+msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
+msgstr ""
+
+#: src/elflint.c:3776
+#, c-format
+msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
+msgstr ""
+
+#: src/elflint.c:3786
+#, c-format
+msgid ""
+"section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:3792
+#, 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:3800
+#, c-format
+msgid ""
+"section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
+msgstr ""
+
+#: src/elflint.c:3851
+#, c-format
+msgid "more than one version symbol table present\n"
+msgstr ""
+
+#: src/elflint.c:3874
+#, c-format
+msgid "INTERP program header entry but no .interp section\n"
+msgstr ""
+
+#: src/elflint.c:3885
+#, c-format
+msgid ""
+"loadable segment [%u] is executable but contains no executable sections\n"
+msgstr ""
+
+#: src/elflint.c:3891
+#, c-format
+msgid "loadable segment [%u] is writable but contains no writable sections\n"
+msgstr ""
+
+#: src/elflint.c:3902
+#, c-format
+msgid ""
+"no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
+"exist\n"
+msgstr ""
+
+#: src/elflint.c:3915
+#, c-format
+msgid "duplicate version index %d\n"
+msgstr ""
+
+#: src/elflint.c:3929
+#, c-format
+msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
+msgstr ""
+
+#: src/elflint.c:3978
+#, c-format
+msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:3982
+#, c-format
+msgid ""
+"section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4005
+#, c-format
+msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4009
+#, c-format
+msgid ""
+"section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4026
+#, c-format
+msgid "phdr[%d]: no note entries defined for the type of file\n"
+msgstr ""
+
+#: src/elflint.c:4045
+#, c-format
+msgid "phdr[%d]: cannot get content of note section: %s\n"
+msgstr ""
+
+#: src/elflint.c:4048
+#, c-format
+msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
+msgstr ""
+
+#: src/elflint.c:4069
+#, c-format
+msgid "section [%2d] '%s': no note entries defined for the type of file\n"
+msgstr ""
+
+#: src/elflint.c:4076
+#, c-format
+msgid "section [%2d] '%s': cannot get content of note section\n"
+msgstr ""
+
+#: src/elflint.c:4079
+#, c-format
+msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
+msgstr ""
+
+#: src/elflint.c:4097
+#, c-format
+msgid ""
+"only executables, shared objects, and core files can have program headers\n"
+msgstr ""
+
+#: src/elflint.c:4112
+#, c-format
+msgid "cannot get program header entry %d: %s\n"
+msgstr ""
+
+#: src/elflint.c:4121
+#, c-format
+msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:4132
+#, c-format
+msgid "more than one INTERP entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4140
+#, c-format
+msgid "more than one TLS entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4147
+#, c-format
+msgid "static executable cannot have dynamic sections\n"
+msgstr ""
+
+#: src/elflint.c:4161
+#, c-format
+msgid "dynamic section reference in program header has wrong offset\n"
+msgstr ""
+
+#: src/elflint.c:4164
+#, c-format
+msgid "dynamic section size mismatch in program and section header\n"
+msgstr ""
+
+#: src/elflint.c:4174
+#, c-format
+msgid "more than one GNU_RELRO entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4195
+#, c-format
+msgid "loadable segment GNU_RELRO applies to is not writable\n"
+msgstr ""
+
+#: src/elflint.c:4198
+#, c-format
+msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
+msgstr ""
+
+#: src/elflint.c:4206 src/elflint.c:4229
+#, c-format
+msgid "%s segment not contained in a loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:4235
+#, c-format
+msgid "program header offset in ELF header and PHDR entry do not match"
+msgstr ""
+
+#: src/elflint.c:4259
+#, c-format
+msgid "call frame search table reference in program header has wrong offset\n"
+msgstr ""
+
+#: src/elflint.c:4262
+#, c-format
+msgid "call frame search table size mismatch in program and section header\n"
+msgstr ""
+
+#: src/elflint.c:4275
+#, c-format
+msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
+msgstr ""
+
+#: src/elflint.c:4283
+#, c-format
+msgid "call frame search table must be allocated\n"
+msgstr ""
+
+#: src/elflint.c:4286
+#, c-format
+msgid "section [%2zu] '%s' must be allocated\n"
+msgstr ""
+
+#: src/elflint.c:4290
+#, c-format
+msgid "call frame search table must not be writable\n"
+msgstr ""
+
+#: src/elflint.c:4293
+#, c-format
+msgid "section [%2zu] '%s' must not be writable\n"
+msgstr ""
+
+#: src/elflint.c:4298
+#, c-format
+msgid "call frame search table must not be executable\n"
+msgstr ""
+
+#: src/elflint.c:4301
+#, c-format
+msgid "section [%2zu] '%s' must not be executable\n"
+msgstr ""
+
+#: src/elflint.c:4312
+#, c-format
+msgid "program header entry %d: file size greater than memory size\n"
+msgstr ""
+
+#: src/elflint.c:4319
+#, c-format
+msgid "program header entry %d: alignment not a power of 2\n"
+msgstr ""
+
+#: src/elflint.c:4322
+#, c-format
+msgid ""
+"program header entry %d: file offset and virtual address not module of "
+"alignment\n"
+msgstr ""
+
+#: src/elflint.c:4335
+#, 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:4369
+#, c-format
+msgid "cannot read ELF header: %s\n"
+msgstr ""
+
+#: src/elflint.c:4395
+#, c-format
+msgid "text relocation flag set but not needed\n"
+msgstr ""
+
+#: src/findtextrel.c:70
+msgid "Input Selection:"
+msgstr ""
+
+#: src/findtextrel.c:71
+msgid "Prepend PATH to all file names"
+msgstr ""
+
+#: src/findtextrel.c:73
+msgid "Use PATH as root of debuginfo hierarchy"
+msgstr ""
+
+#: src/findtextrel.c:80
+msgid "Locate source of text relocations in FILEs (a.out by default)."
+msgstr ""
+
+#: src/findtextrel.c:84 src/nm.c:111 src/objdump.c:80 src/size.c:92
+#: src/strings.c:92 src/strip.c:97
+msgid "[FILE...]"
+msgstr ""
+
+#: src/findtextrel.c:246
+#, c-format
+msgid "cannot get ELF header '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:257
+#, c-format
+msgid "'%s' is not a DSO or PIE"
+msgstr ""
+
+#: src/findtextrel.c:274
+#, c-format
+msgid "getting get section header of section %zu: %s"
+msgstr ""
+
+#: src/findtextrel.c:292
+#, c-format
+msgid "cannot read dynamic section: %s"
+msgstr ""
+
+#: src/findtextrel.c:307
+#, c-format
+msgid "no text relocations reported in '%s'"
+msgstr ""
+
+#: src/findtextrel.c:319
+#, c-format
+msgid "while reading ELF file"
+msgstr ""
+
+#: src/findtextrel.c:328 src/findtextrel.c:345
+#, c-format
+msgid "cannot get program header index at offset %d: %s"
+msgstr ""
+
+#: src/findtextrel.c:397
+#, c-format
+msgid "cannot get section header of section %Zu: %s"
+msgstr ""
+
+#: src/findtextrel.c:409
+#, c-format
+msgid "cannot get symbol table section %zu in '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:429 src/findtextrel.c:452
+#, c-format
+msgid "cannot get relocation at index %d in section %zu in '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:517
+#, c-format
+msgid "%s not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:570
+#, c-format
+msgid ""
+"the file containing the function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:577 src/findtextrel.c:597
+#, c-format
+msgid ""
+"the file containing the function '%s' might not be compiled with -fpic/-"
+"fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:585
+#, c-format
+msgid ""
+"either the file containing the function '%s' or the file containing the "
+"function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:605
+#, c-format
+msgid ""
+"a relocation modifies memory at offset %llu in a write-protected segment\n"
+msgstr ""
+
+#: src/i386_ld.c:210
+#, c-format
+msgid "cannot allocate PLT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:232
+#, c-format
+msgid "cannot allocate PLTREL section: %s"
+msgstr ""
+
+#: src/i386_ld.c:253
+#, c-format
+msgid "cannot allocate GOT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:274
+#, c-format
+msgid "cannot allocate GOTPLT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:661
+#, c-format
+msgid "initial-executable TLS relocation cannot be used "
+msgstr ""
+
+#: src/ld.c:87
+msgid "Input File Control:"
+msgstr ""
+
+#: src/ld.c:89
+msgid "Include whole archives in the output from now on."
+msgstr ""
+
+#: src/ld.c:91
+msgid "Stop including the whole archives in the output."
+msgstr ""
+
+#: src/ld.c:92 src/ld.c:106 src/ld.c:184
+msgid "FILE"
+msgstr "DATEI"
+
+#: src/ld.c:93
+msgid "Start a group."
+msgstr "Eine Gruppe starten."
+
+#: src/ld.c:94
+msgid "End a group."
+msgstr "Eine Gruppe beenden."
+
+#: src/ld.c:95
+msgid "PATH"
+msgstr "PFAD"
+
+#: src/ld.c:96
+msgid "Add PATH to list of directories files are searched in."
+msgstr ""
+
+#: src/ld.c:98
+msgid "Only set DT_NEEDED for following dynamic libs if actually used"
+msgstr ""
+
+#: src/ld.c:100
+msgid "Always set DT_NEEDED for following dynamic libs"
+msgstr ""
+
+#: src/ld.c:102
+msgid "Ignore LD_LIBRARY_PATH environment variable."
+msgstr ""
+
+#: src/ld.c:105
+msgid "Output File Control:"
+msgstr ""
+
+#: src/ld.c:106
+msgid "Place output in FILE."
+msgstr ""
+
+#: src/ld.c:109
+msgid "Object is marked to not use default search path at runtime."
+msgstr ""
+
+#: src/ld.c:111
+msgid "Same as --whole-archive."
+msgstr "Genau wie --whole-archive."
+
+#: src/ld.c:112
+msgid ""
+"Default rules of extracting from archive; weak references are not enough."
+msgstr ""
+
+#: src/ld.c:116
+msgid "Weak references cause extraction from archive."
+msgstr ""
+
+#: src/ld.c:118
+msgid "Allow multiple definitions; first is used."
+msgstr ""
+
+#: src/ld.c:120
+msgid "Disallow/allow undefined symbols in DSOs."
+msgstr ""
+
+#: src/ld.c:123
+msgid "Object requires immediate handling of $ORIGIN."
+msgstr ""
+
+#: src/ld.c:125
+msgid "Relocation will not be processed lazily."
+msgstr ""
+
+#: src/ld.c:127
+msgid "Object cannot be unloaded at runtime."
+msgstr ""
+
+#: src/ld.c:129
+msgid "Mark object to be initialized first."
+msgstr ""
+
+#: src/ld.c:131
+msgid "Enable/disable lazy-loading flag for following dependencies."
+msgstr ""
+
+#: src/ld.c:133
+msgid "Mark object as not loadable with 'dlopen'."
+msgstr ""
+
+#: src/ld.c:135
+msgid "Ignore/record dependencies on unused DSOs."
+msgstr ""
+
+#: src/ld.c:137
+msgid "Generated DSO will be a system library."
+msgstr ""
+
+#: src/ld.c:138
+msgid "ADDRESS"
+msgstr "ADRESSE"
+
+#: src/ld.c:138
+msgid "Set entry point address."
+msgstr ""
+
+#: src/ld.c:141
+msgid "Do not link against shared libraries."
+msgstr ""
+
+#: src/ld.c:144
+msgid "Prefer linking against shared libraries."
+msgstr ""
+
+#: src/ld.c:145
+msgid "Export all dynamic symbols."
+msgstr ""
+
+#: src/ld.c:146
+msgid "Strip all symbols."
+msgstr ""
+
+#: src/ld.c:147
+msgid "Strip debugging symbols."
+msgstr ""
+
+#: src/ld.c:149
+msgid "Assume pagesize for the target system to be SIZE."
+msgstr ""
+
+#: src/ld.c:151
+msgid "Set runtime DSO search path."
+msgstr ""
+
+#: src/ld.c:154
+msgid "Set link time DSO search path."
+msgstr ""
+
+#: src/ld.c:155
+msgid "Generate dynamic shared object."
+msgstr ""
+
+#: src/ld.c:156
+msgid "Generate relocatable object."
+msgstr ""
+
+#: src/ld.c:159
+msgid "Causes symbol not assigned to a version be reduced to local."
+msgstr ""
+
+#: src/ld.c:160
+msgid "Remove unused sections."
+msgstr ""
+
+#: src/ld.c:163
+msgid "Don't remove unused sections."
+msgstr ""
+
+#: src/ld.c:164
+msgid "Set soname of shared object."
+msgstr ""
+
+#: src/ld.c:165
+msgid "Set the dynamic linker name."
+msgstr ""
+
+#: src/ld.c:168
+msgid "Add/suppress addition indentifying link-editor to .comment section."
+msgstr ""
+
+#: src/ld.c:171
+msgid "Create .eh_frame_hdr section"
+msgstr ""
+
+#: src/ld.c:173
+msgid "Set hash style to sysv, gnu or both."
+msgstr ""
+
+#: src/ld.c:175
+msgid "Generate build ID note (md5, sha1 (default), uuid)."
+msgstr ""
+
+#: src/ld.c:177
+msgid "Linker Operation Control:"
+msgstr ""
+
+#: src/ld.c:178
+msgid "Verbose messages."
+msgstr ""
+
+#: src/ld.c:179
+msgid "Trace file opens."
+msgstr ""
+
+#: src/ld.c:181
+msgid "Trade speed for less memory usage"
+msgstr ""
+
+#: src/ld.c:182
+msgid "LEVEL"
+msgstr ""
+
+#: src/ld.c:183
+msgid "Set optimization level to LEVEL."
+msgstr ""
+
+#: src/ld.c:184
+msgid "Use linker script in FILE."
+msgstr ""
+
+#: src/ld.c:187
+msgid "Select to get parser debug information"
+msgstr ""
+
+#: src/ld.c:190
+msgid "Read version information from FILE."
+msgstr ""
+
+#: src/ld.c:191
+msgid "Set emulation to NAME."
+msgstr ""
+
+#: src/ld.c:197
+msgid "Combine object and archive files."
+msgstr ""
+
+#: src/ld.c:200
+msgid "[FILE]..."
+msgstr "[DATEI]..."
+
+#: src/ld.c:333
+#, c-format
+msgid "At least one input file needed"
+msgstr "Mindestens eine Eingabedatei benötigt"
+
+#: src/ld.c:349
+#, c-format
+msgid "error while preparing linking"
+msgstr ""
+
+#: src/ld.c:356
+#, c-format
+msgid "cannot open linker script '%s'"
+msgstr ""
+
+#: src/ld.c:397
+#, c-format
+msgid "-( without matching -)"
+msgstr "-( ohne Übereinstimmung -)"
+
+#: src/ld.c:572 src/ld.c:610
+#, c-format
+msgid "only one option of -G and -r is allowed"
+msgstr "nur eine Option aus -G und -r erlaubt"
+
+#: src/ld.c:594
+#, c-format
+msgid "more than one '-m' parameter"
+msgstr ""
+
+#: src/ld.c:604 src/ld.c:1013
+#, c-format
+msgid "unknown option `-%c %s'"
+msgstr ""
+
+#: src/ld.c:646
+#, c-format
+msgid "invalid page size value '%s': ignored"
+msgstr ""
+
+#: src/ld.c:687
+#, c-format
+msgid "invalid hash style '%s'"
+msgstr ""
+
+#: src/ld.c:697
+#, c-format
+msgid "invalid build-ID style '%s'"
+msgstr ""
+
+#: src/ld.c:785
+#, c-format
+msgid "More than one output file name given."
+msgstr "Mehr als ein Name der Ausgabedatei angegeben."
+
+#: src/ld.c:802
+#, c-format
+msgid "Invalid optimization level `%s'"
+msgstr ""
+
+#: src/ld.c:850
+#, c-format
+msgid "nested -( -) groups are not allowed"
+msgstr ""
+
+#: src/ld.c:869
+#, c-format
+msgid "-) without matching -("
+msgstr "-) ohne Übereinstimmung -("
+
+#: src/ld.c:1046
+#, c-format
+msgid "unknown option '-%c %s'"
+msgstr "unbekannte Option '-%c %s'"
+
+#: src/ld.c:1150
+#, c-format
+msgid "could not find input file to determine output file format"
+msgstr ""
+
+#: src/ld.c:1152
+#, c-format
+msgid "try again with an appropriate '-m' parameter"
+msgstr ""
+
+#: src/ld.c:1446
+#, c-format
+msgid "cannot read version script '%s'"
+msgstr ""
+
+#: src/ld.c:1512 src/ld.c:1551
+#, c-format
+msgid "duplicate definition of '%s' in linker script"
+msgstr ""
+
+#: src/ldgeneric.c:209 src/ldgeneric.c:5151
+#, c-format
+msgid "cannot create string table"
+msgstr ""
+
+#: src/ldgeneric.c:255
+#, c-format
+msgid "cannot load ld backend library '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:265
+#, c-format
+msgid "cannot find init function in ld backend library '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:310
+#, c-format
+msgid "%s listed more than once as input"
+msgstr ""
+
+#: src/ldgeneric.c:424
+#, c-format
+msgid "%s (for -l%s)\n"
+msgstr ""
+
+#: src/ldgeneric.c:425
+#, c-format
+msgid "%s (for DT_NEEDED %s)\n"
+msgstr ""
+
+#: src/ldgeneric.c:573
+#, c-format
+msgid "Warning: type of `%s' changed from %s in %s to %s in %s"
+msgstr ""
+
+#: src/ldgeneric.c:586
+#, c-format
+msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
+msgstr ""
+
+#: src/ldgeneric.c:661 src/ldgeneric.c:1122 src/readelf.c:629 src/strip.c:543
+#, c-format
+msgid "cannot determine number of sections: %s"
+msgstr ""
+
+#: src/ldgeneric.c:677
+#, c-format
+msgid "(%s+%#<PRIx64>): multiple definition of %s `%s'\n"
+msgstr ""
+
+#: src/ldgeneric.c:700
+#, c-format
+msgid "(%s+%#<PRIx64>): first defined here\n"
+msgstr ""
+
+#: src/ldgeneric.c:819
+#, c-format
+msgid "%s: cannot get section group data: %s"
+msgstr ""
+
+#: src/ldgeneric.c:840
+#, c-format
+msgid "%s: section '%s' with group flag set does not belong to any group"
+msgstr ""
+
+#: src/ldgeneric.c:885
+#, c-format
+msgid "%s: section [%2d] '%s' is not in the correct section group"
+msgstr ""
+
+#: src/ldgeneric.c:1156 src/ldgeneric.c:1413 src/ldgeneric.c:1422
+#: src/ldgeneric.c:1481 src/ldgeneric.c:1490 src/ldgeneric.c:1753
+#: src/ldgeneric.c:2005
+#, c-format
+msgid "%s: invalid ELF file (%s:%d)\n"
+msgstr ""
+
+#: src/ldgeneric.c:1250
+#, c-format
+msgid "%s: only files of type ET_REL might contain section groups"
+msgstr ""
+
+#: src/ldgeneric.c:1302
+#, c-format
+msgid "%s: cannot determine signature of section group [%2zd] '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:1314
+#, c-format
+msgid "%s: cannot get content of section group [%2zd] '%s': %s'"
+msgstr ""
+
+#: src/ldgeneric.c:1328
+#, c-format
+msgid ""
+"%s: group member %zu of section group [%2zd] '%s' has too high index: %"
+"<PRIu32>"
+msgstr ""
+
+#: src/ldgeneric.c:1350
+#, c-format
+msgid "%s: section '%s' has unknown type: %d"
+msgstr ""
+
+#: src/ldgeneric.c:1729
+#, c-format
+msgid "cannot get descriptor for ELF file (%s:%d): %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:1899
+#, c-format
+msgid "cannot read archive `%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:2020
+#, c-format
+msgid "file of type %s cannot be linked in\n"
+msgstr ""
+
+#: src/ldgeneric.c:2032
+#, c-format
+msgid "%s: input file incompatible with ELF machine type %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:2044
+#, c-format
+msgid "%s: cannot get section header string table index: %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:2073
+#, c-format
+msgid "cannot use DSO '%s' when generating relocatable object file"
+msgstr ""
+
+#: src/ldgeneric.c:2158
+#, c-format
+msgid "input file '%s' ignored"
+msgstr "Eingabedatei '%s' ignoriert"
+
+#: src/ldgeneric.c:2372
+#, c-format
+msgid "undefined symbol `%s' in %s"
+msgstr "undefiniertes Symbol `%s' in %s"
+
+#: src/ldgeneric.c:2702
+#, c-format
+msgid "cannot create ELF descriptor for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:2709
+#, c-format
+msgid "could not create ELF header for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:3224 src/ldgeneric.c:3294 src/ldgeneric.c:3330
+#: src/ldgeneric.c:4457 src/ldgeneric.c:4506 src/ldgeneric.c:4538
+#: src/ldgeneric.c:4773 src/ldgeneric.c:4828 src/ldgeneric.c:5075
+#: src/ldgeneric.c:5131 src/ldgeneric.c:5600 src/ldgeneric.c:5612
+#, c-format
+msgid "cannot create section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:3444
+#, c-format
+msgid "address computation expression contains variable '%s'"
+msgstr ""
+
+#: src/ldgeneric.c:3489
+#, c-format
+msgid ""
+"argument '%<PRIuMAX>' of ALIGN in address computation expression is no power "
+"of two"
+msgstr ""
+
+#: src/ldgeneric.c:3684
+#, c-format
+msgid "cannot find entry symbol '%s': defaulting to %#0*<PRIx64>"
+msgstr ""
+
+#: src/ldgeneric.c:3690
+#, c-format
+msgid "no entry symbol specified: defaulting to %#0*<PRIx64>"
+msgstr ""
+
+#: src/ldgeneric.c:3920
+#, c-format
+msgid "cannot create GNU hash table section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4071
+#, c-format
+msgid "cannot create hash table section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4114
+#, c-format
+msgid "cannot create build ID section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4191
+#, c-format
+msgid "cannot convert section data to file format: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4200
+#, c-format
+msgid "cannot convert section data to memory format: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4261
+#, c-format
+msgid "cannot read enough data for UUID"
+msgstr ""
+
+#: src/ldgeneric.c:4358 src/ldgeneric.c:4379 src/ldgeneric.c:4408
+#: src/ldgeneric.c:6062
+#, c-format
+msgid "cannot create symbol table for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5300 src/ldgeneric.c:5852
+#, c-format
+msgid "section index too large in dynamic symbol table"
+msgstr ""
+
+#: src/ldgeneric.c:5745
+#, c-format
+msgid "cannot create versioning section: %s"
+msgstr "konnte Versionierungsabschnitt nicht erstellen: %s"
+
+#: src/ldgeneric.c:5818
+#, c-format
+msgid "cannot create dynamic symbol table for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5994
+#, c-format
+msgid "cannot create versioning data: %s"
+msgstr "konnte Versionierungsdaten nicht erstellen: %s"
+
+#: src/ldgeneric.c:6094 src/ldgeneric.c:6107 src/ldgeneric.c:6171
+#: src/ldgeneric.c:6179
+#, c-format
+msgid "cannot create section header string section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6101
+#, c-format
+msgid "cannot create section header string section"
+msgstr ""
+
+#: src/ldgeneric.c:6259
+#, c-format
+msgid "cannot create program header: %s"
+msgstr "konnte Programm-Kopf nicht erstellen: %s"
+
+#: src/ldgeneric.c:6267
+#, c-format
+msgid "while determining file layout: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6388
+#, c-format
+msgid "internal error: non-nobits section follows nobits section"
+msgstr ""
+
+#: src/ldgeneric.c:6925
+#, c-format
+msgid "cannot get header of 0th section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6941 src/unstrip.c:1808
+#, c-format
+msgid "cannot update ELF header: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6972
+#, c-format
+msgid "linker backend didn't specify function to relocate section"
+msgstr ""
+
+#: src/ldgeneric.c:6984
+#, c-format
+msgid "while writing output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6989
+#, c-format
+msgid "while finishing output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6995
+#, c-format
+msgid "cannot stat output file"
+msgstr ""
+
+#: src/ldgeneric.c:7011
+#, c-format
+msgid "WARNING: temporary output file overwritten before linking finished"
+msgstr ""
+
+#: src/ldgeneric.c:7064 src/ldgeneric.c:7075 src/ldgeneric.c:7086
+#: src/ldgeneric.c:7097 src/ldgeneric.c:7116 src/ldgeneric.c:7129
+#: src/ldgeneric.c:7141
+#, c-format
+msgid "no machine specific '%s' implementation"
+msgstr ""
+
+#: src/ldscript.y:178
+msgid "mode for segment invalid\n"
+msgstr ""
+
+#: src/ldscript.y:465
+#, c-format
+msgid "while reading version script '%s': %s at line %d"
+msgstr ""
+
+#: src/ldscript.y:466
+#, c-format
+msgid "while reading linker script '%s': %s at line %d"
+msgstr ""
+
+#: src/ldscript.y:745
+#, c-format
+msgid "symbol '%s' is declared both local and global for unnamed version"
+msgstr ""
+
+#: src/ldscript.y:747
+#, c-format
+msgid "symbol '%s' is declared both local and global for version '%s'"
+msgstr ""
+
+#: src/ldscript.y:767 src/ldscript.y:774
+#, c-format
+msgid "default visibility set as local and global"
+msgstr "Standard-Sichtbarkeit auf lokal und global gesetzt"
+
+#: src/nm.c:74 src/strip.c:73
+msgid "Output selection:"
+msgstr ""
+
+#: src/nm.c:75
+msgid "Display debugger-only symbols"
+msgstr ""
+
+#: src/nm.c:76
+msgid "Display only defined symbols"
+msgstr "Zeige nur definierte Symbole"
+
+#: src/nm.c:79
+msgid "Display dynamic symbols instead of normal symbols"
+msgstr "Zeige dynamische Symbole anstelle normaler Symbole"
+
+#: src/nm.c:80
+msgid "Display only external symbols"
+msgstr "Zeige nur externe Symbole"
+
+#: src/nm.c:81
+msgid "Display only undefined symbols"
+msgstr "Zeige nur undefinierte Symbole"
+
+#: src/nm.c:83
+msgid "Include index for symbols from archive members"
+msgstr ""
+
+#: src/nm.c:85 src/size.c:66
+msgid "Output format:"
+msgstr "Ausgabeformat:"
+
+#: src/nm.c:87
+#, fuzzy
+msgid "Print name of the input file before every symbol"
+msgstr "Zeige Name der Eingabedatei vor jedem Symbol"
+
+#: src/nm.c:90
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd', `sysv' or `posix'. The "
+"default is `sysv'"
+msgstr ""
+"Benutze das Ausgabeformat FORMAT. FORMAT kann `bsd', `sysv' or `posix' sein. "
+"Der Standard ist `sysv'"
+
+#: src/nm.c:92
+msgid "Same as --format=bsd"
+msgstr "Genau wie --format=bsd"
+
+#: src/nm.c:93
+msgid "Same as --format=posix"
+msgstr "Genau wie --format=posix"
+
+#: src/nm.c:94 src/size.c:72
+msgid "Use RADIX for printing symbol values"
+msgstr "Benutze RADIX zur Ausgabe von Symbolwerten"
+
+#: src/nm.c:95
+msgid "Mark weak symbols"
+msgstr "Kennzeichne schwache Symbole"
+
+#: src/nm.c:96
+#, fuzzy
+msgid "Print size of defined symbols"
+msgstr "Zeige Grösse der definierten Symbole"
+
+#: src/nm.c:98 src/size.c:80 src/strip.c:78 src/unstrip.c:81
+msgid "Output options:"
+msgstr "Ausgabeoptionen:"
+
+#: src/nm.c:99
+msgid "Sort symbols numerically by address"
+msgstr "Symbole anhand der Adresse numerisch sortieren"
+
+#: src/nm.c:101
+msgid "Do not sort the symbols"
+msgstr "Symbole nicht sortieren"
+
+#: src/nm.c:102
+msgid "Reverse the sense of the sort"
+msgstr "Sortierreihenfolge umkehren"
+
+#: src/nm.c:108
+msgid "List symbols from FILEs (a.out by default)."
+msgstr ""
+
+#: src/nm.c:136 src/objdump.c:105 src/size.c:117 src/strip.c:121
+#, c-format
+msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
+msgstr "%s: INTERNER FEHLER %d (%s-%s): %s"
+
+#: src/nm.c:380 src/nm.c:392 src/size.c:317 src/size.c:326 src/size.c:337
+#: src/strip.c:1816
+#, c-format
+msgid "while closing '%s'"
+msgstr "beim Schliessen von '%s'"
+
+#: src/nm.c:402 src/objdump.c:296 src/strip.c:359
+#, c-format
+msgid "%s: File format not recognized"
+msgstr "%s: Dateiformat nicht erkannt"
+
+#: src/nm.c:442
+msgid ""
+"\n"
+"Archive index:"
+msgstr ""
+"\n"
+"Archiv-Index:"
+
+#: src/nm.c:451
+#, c-format
+msgid "invalid offset %zu for symbol %s"
+msgstr "ungültiger Offset %zu für Symbol %s"
+
+#: src/nm.c:456
+#, c-format
+msgid "%s in %s\n"
+msgstr ""
+
+#: src/nm.c:464
+#, c-format
+msgid "cannot reset archive offset to beginning"
+msgstr ""
+
+#: src/nm.c:488 src/objdump.c:344
+#, c-format
+msgid "%s%s%s: file format not recognized"
+msgstr "%s%s%s: Dateiformat nicht erkannt"
+
+#: src/nm.c:700
+#, c-format
+msgid "cannot create search tree"
+msgstr "Kann Suchbaum nicht erstellen"
+
+#: src/nm.c:740 src/nm.c:1002 src/objdump.c:744 src/readelf.c:885
+#: src/readelf.c:1028 src/readelf.c:1169 src/readelf.c:1351 src/readelf.c:1549
+#: src/readelf.c:1735 src/readelf.c:1945 src/readelf.c:2199 src/readelf.c:2265
+#: src/readelf.c:2343 src/readelf.c:2841 src/readelf.c:2877 src/readelf.c:2939
+#: src/readelf.c:6493 src/readelf.c:7387 src/readelf.c:7534 src/readelf.c:7604
+#: src/size.c:425 src/size.c:499 src/strip.c:483
+#, c-format
+msgid "cannot get section header string table index"
+msgstr ""
+
+#: src/nm.c:766
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Symbole aus %s:\n"
+"\n"
+
+#: src/nm.c:768
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s[%s]:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Symbole aus %s[%s]:\n"
+"\n"
+
+#: src/nm.c:771
+#, c-format
+msgid ""
+"%*s%-*s %-*s Class Type %-*s %*s Section\n"
+"\n"
+msgstr ""
+
+#: src/nm.c:1012
+#, 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:1016
+#, c-format
+msgid "%s: size of section `%s' is not multiple of entry size"
+msgstr ""
+
+#: src/nm.c:1255
+#, c-format
+msgid "%s%s%s%s: Invalid operation"
+msgstr "%s%s%s%s: Ungültige Operation"
+
+#: src/nm.c:1312
+#, c-format
+msgid "%s%s%s: no symbols"
+msgstr "%s%s%s: keine Symbole"
+
+#: src/objdump.c:61
+msgid "Mode selection:"
+msgstr ""
+
+#: src/objdump.c:62
+msgid "Display relocation information."
+msgstr ""
+
+#: src/objdump.c:64
+msgid "Display the full contents of all sections requested"
+msgstr ""
+
+#: src/objdump.c:66
+msgid "Display assembler code of executable sections"
+msgstr ""
+
+#: src/objdump.c:68
+msgid "Output option selection:"
+msgstr ""
+
+#: src/objdump.c:70
+msgid "Only display information for section NAME."
+msgstr ""
+
+#: src/objdump.c:76
+msgid "Show information from FILEs (a.out by default)."
+msgstr ""
+
+#: src/objdump.c:236 src/readelf.c:430
+msgid "No operation specified.\n"
+msgstr "Keine Operation angegeben.\n"
+
+#: src/objdump.c:274 src/objdump.c:286
+#, c-format
+msgid "while close `%s'"
+msgstr ""
+
+#: src/objdump.c:379 src/readelf.c:1644 src/readelf.c:1818
+msgid "INVALID SYMBOL"
+msgstr ""
+
+#: src/objdump.c:394 src/readelf.c:1675 src/readelf.c:1851
+msgid "INVALID SECTION"
+msgstr ""
+
+#: src/objdump.c:510
+#, c-format
+msgid ""
+"\n"
+"RELOCATION RECORDS FOR [%s]:\n"
+"%-*s TYPE VALUE\n"
+msgstr ""
+
+#: src/objdump.c:513
+msgid "OFFSET"
+msgstr "OFFSET"
+
+#: src/objdump.c:576
+#, c-format
+msgid "Contents of section %s:\n"
+msgstr "Inhalt des Abschnitts %s:\n"
+
+#: src/objdump.c:676
+#, c-format
+msgid "cannot disassemble"
+msgstr "Disassemblieren nicht möglich"
+
+#: src/ranlib.c:74
+msgid "Generate an index to speed access to archives."
+msgstr "Erstelle einen Index zur Beschleunigung des Zugriffs auf Archive."
+
+#: src/ranlib.c:77
+msgid "ARCHIVE"
+msgstr "ARCHIV"
+
+#: src/ranlib.c:116
+#, c-format
+msgid "Archive name required"
+msgstr "Archivname benötigt"
+
+#: src/ranlib.c:194
+#, c-format
+msgid "'%s' is no archive"
+msgstr "'%s' ist kein Archiv"
+
+#: src/ranlib.c:229
+#, c-format
+msgid "error while freeing sub-ELF descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:73
+#, fuzzy
+msgid "ELF output selection:"
+msgstr "Eingabeauswahloptionen:"
+
+#: src/readelf.c:75
+msgid "All these plus -p .strtab -p .dynstr -p .comment"
+msgstr ""
+
+#: src/readelf.c:76
+msgid "Display the dynamic segment"
+msgstr ""
+
+#: src/readelf.c:77
+msgid "Display the ELF file header"
+msgstr ""
+
+#: src/readelf.c:79
+msgid "Display histogram of bucket list lengths"
+msgstr ""
+
+#: src/readelf.c:80
+msgid "Display the program headers"
+msgstr "Programm-Köpfe anzeigen"
+
+#: src/readelf.c:82
+msgid "Display relocations"
+msgstr "Relocations anzeigen"
+
+#: src/readelf.c:83
+#, fuzzy
+msgid "Display the sections' headers"
+msgstr "Programm-Köpfe anzeigen"
+
+#: src/readelf.c:85
+msgid "Display the symbol table"
+msgstr "Symboltabelle anzeigen"
+
+#: src/readelf.c:86
+msgid "Display versioning information"
+msgstr "Versionierungsinformationen anzeigen"
+
+#: src/readelf.c:87
+#, fuzzy
+msgid "Display the ELF notes"
+msgstr "Kernnotizen anzeigen"
+
+#: src/readelf.c:89
+#, fuzzy
+msgid "Display architecture specific information, if any"
+msgstr "Architekturspezifische Informationen anzeigen (falls vorhanden)"
+
+#: src/readelf.c:91
+msgid "Display sections for exception handling"
+msgstr "Abschnitte für Ausnahmebehandlung anzeigen"
+
+#: src/readelf.c:93
+msgid "Additional output selection:"
+msgstr ""
+
+#: src/readelf.c:95
+msgid ""
+"Display DWARF section content. SECTION can be one of abbrev, aranges, "
+"frame, info, loc, line, ranges, pubnames, str, macinfo, or exception"
+msgstr ""
+
+#: src/readelf.c:99
+msgid "Dump the uninterpreted contents of SECTION, by number or name"
+msgstr ""
+
+#: src/readelf.c:101
+msgid "Print string contents of sections"
+msgstr ""
+
+#: src/readelf.c:104
+msgid "Display the symbol index of an archive"
+msgstr "Symbolindex des Archivs anzeigen"
+
+#: src/readelf.c:106
+msgid "Output control:"
+msgstr "Ausgabekontrolle:"
+
+#: src/readelf.c:108
+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:114
+msgid "Print information from ELF file in human-readable form."
+msgstr "Informationen aus der ELF-Datei in menschenlesbarer Form ausgeben."
+
+#: src/readelf.c:401
+#, c-format
+msgid "Unknown DWARF debug section `%s'.\n"
+msgstr ""
+
+#: src/readelf.c:465
+#, c-format
+msgid "cannot generate Elf descriptor: %s"
+msgstr "konnte Elf-Deskriptor nicht erzeugen: %s"
+
+#: src/readelf.c:477
+#, c-format
+msgid "'%s' is not an archive, cannot print archive index"
+msgstr ""
+
+#: src/readelf.c:482
+#, c-format
+msgid "error while closing Elf descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:574
+#, c-format
+msgid "cannot stat input file"
+msgstr ""
+
+#: src/readelf.c:576
+#, c-format
+msgid "input file is empty"
+msgstr ""
+
+#: src/readelf.c:578
+#, c-format
+msgid "failed reading '%s': %s"
+msgstr "Konnte '%s' nicht lesen: %s"
+
+#: src/readelf.c:614
+#, c-format
+msgid "cannot read ELF header: %s"
+msgstr ""
+
+#: src/readelf.c:622
+#, c-format
+msgid "cannot create EBL handle"
+msgstr ""
+
+#: src/readelf.c:635
+#, fuzzy, c-format
+msgid "cannot determine number of program headers: %s"
+msgstr "konnte Programm-Kopf nicht erstellen: %s"
+
+#: src/readelf.c:721
+msgid "NONE (None)"
+msgstr ""
+
+#: src/readelf.c:722
+msgid "REL (Relocatable file)"
+msgstr ""
+
+#: src/readelf.c:723
+msgid "EXEC (Executable file)"
+msgstr ""
+
+#: src/readelf.c:724
+msgid "DYN (Shared object file)"
+msgstr ""
+
+#: src/readelf.c:725
+msgid "CORE (Core file)"
+msgstr ""
+
+#: src/readelf.c:730
+#, c-format
+msgid "OS Specific: (%x)\n"
+msgstr ""
+
+#: src/readelf.c:732
+#, c-format
+msgid "Processor Specific: (%x)\n"
+msgstr ""
+
+#: src/readelf.c:742
+msgid ""
+"ELF Header:\n"
+" Magic: "
+msgstr ""
+
+#: src/readelf.c:746
+#, c-format
+msgid ""
+"\n"
+" Class: %s\n"
+msgstr ""
+
+#: src/readelf.c:751
+#, fuzzy, c-format
+msgid " Data: %s\n"
+msgstr " Daten: %s\n"
+
+#: src/readelf.c:757
+#, c-format
+msgid " Ident Version: %hhd %s\n"
+msgstr ""
+
+#: src/readelf.c:759 src/readelf.c:776
+msgid "(current)"
+msgstr "(aktuell)"
+
+#: src/readelf.c:763
+#, c-format
+msgid " OS/ABI: %s\n"
+msgstr ""
+
+#: src/readelf.c:766
+#, c-format
+msgid " ABI Version: %hhd\n"
+msgstr ""
+
+#: src/readelf.c:769
+msgid " Type: "
+msgstr " Typ: "
+
+#: src/readelf.c:772
+#, c-format
+msgid " Machine: %s\n"
+msgstr ""
+
+#: src/readelf.c:774
+#, c-format
+msgid " Version: %d %s\n"
+msgstr ""
+
+#: src/readelf.c:778
+#, c-format
+msgid " Entry point address: %#<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:781
+#, c-format
+msgid " Start of program headers: %<PRId64> %s\n"
+msgstr ""
+
+#: src/readelf.c:782 src/readelf.c:785
+msgid "(bytes into file)"
+msgstr ""
+
+#: src/readelf.c:784
+#, c-format
+msgid " Start of section headers: %<PRId64> %s\n"
+msgstr ""
+
+#: src/readelf.c:787
+#, c-format
+msgid " Flags: %s\n"
+msgstr ""
+
+#: src/readelf.c:790
+#, c-format
+msgid " Size of this header: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:791 src/readelf.c:794 src/readelf.c:811
+msgid "(bytes)"
+msgstr "(Bytes)"
+
+#: src/readelf.c:793
+#, c-format
+msgid " Size of program header entries: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:796
+#, c-format
+msgid " Number of program headers entries: %<PRId16>"
+msgstr ""
+
+#: src/readelf.c:803
+#, c-format
+msgid " (%<PRIu32> in [0].sh_info)"
+msgstr ""
+
+#: src/readelf.c:806 src/readelf.c:823 src/readelf.c:837
+msgid " ([0] not available)"
+msgstr ""
+
+#: src/readelf.c:810
+#, c-format
+msgid " Size of section header entries: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:813
+#, c-format
+msgid " Number of section headers entries: %<PRId16>"
+msgstr ""
+
+#: src/readelf.c:820
+#, c-format
+msgid " (%<PRIu32> in [0].sh_size)"
+msgstr ""
+
+#: src/readelf.c:833
+#, c-format
+msgid " (%<PRIu32> in [0].sh_link)"
+msgstr ""
+
+#: src/readelf.c:841
+#, c-format
+msgid ""
+" Section header string table index: XINDEX%s\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:845
+#, c-format
+msgid ""
+" Section header string table index: %<PRId16>\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:877
+#, c-format
+msgid ""
+"There are %d section headers, starting at offset %#<PRIx64>:\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:887
+msgid "Section Headers:"
+msgstr ""
+
+#: src/readelf.c:890
+msgid ""
+"[Nr] Name Type Addr Off Size ES Flags Lk "
+"Inf Al"
+msgstr ""
+
+#: src/readelf.c:892
+msgid ""
+"[Nr] Name Type Addr Off Size ES "
+"Flags Lk Inf Al"
+msgstr ""
+
+#: src/readelf.c:899 src/readelf.c:1052
+#, c-format
+msgid "cannot get section: %s"
+msgstr ""
+
+#: src/readelf.c:906 src/readelf.c:1060 src/readelf.c:7554 src/unstrip.c:353
+#: src/unstrip.c:377 src/unstrip.c:427 src/unstrip.c:536 src/unstrip.c:553
+#: src/unstrip.c:591 src/unstrip.c:789 src/unstrip.c:1057 src/unstrip.c:1244
+#: src/unstrip.c:1305 src/unstrip.c:1427 src/unstrip.c:1480 src/unstrip.c:1588
+#: src/unstrip.c:1778
+#, c-format
+msgid "cannot get section header: %s"
+msgstr ""
+
+#: src/readelf.c:964
+msgid "Program Headers:"
+msgstr "Programm-Köpfe:"
+
+#: src/readelf.c:966
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align"
+msgstr ""
+
+#: src/readelf.c:969
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz "
+"MemSiz Flg Align"
+msgstr ""
+
+#: src/readelf.c:1009
+#, c-format
+msgid "\t[Requesting program interpreter: %s]\n"
+msgstr ""
+
+#: src/readelf.c:1030
+msgid ""
+"\n"
+" Section to Segment mapping:\n"
+" Segment Sections..."
+msgstr ""
+
+#: src/readelf.c:1041 src/unstrip.c:1824 src/unstrip.c:1863 src/unstrip.c:1870
+#, c-format
+msgid "cannot get program header: %s"
+msgstr ""
+
+#: src/readelf.c:1175
+#, c-format
+msgid ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1180
+#, c-format
+msgid ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1188
+msgid "<INVALID SYMBOL>"
+msgstr ""
+
+#: src/readelf.c:1202
+msgid "<INVALID SECTION>"
+msgstr ""
+
+#: src/readelf.c:1353
+#, c-format
+msgid ""
+"\n"
+"Dynamic segment contains %lu entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Dynamic segment contains %lu entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1365
+msgid " Type Value\n"
+msgstr ""
+
+#: src/readelf.c:1389
+#, c-format
+msgid "Shared library: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1394
+#, c-format
+msgid "Library soname: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1399
+#, c-format
+msgid "Library rpath: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1404
+#, c-format
+msgid "Library runpath: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1424
+#, c-format
+msgid "%<PRId64> (bytes)\n"
+msgstr ""
+
+#: src/readelf.c:1534 src/readelf.c:1720
+#, c-format
+msgid ""
+"\n"
+"Invalid symbol table at offset %#0<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:1552 src/readelf.c:1737
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1567
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1577
+msgid " Offset Type Value Name\n"
+msgstr ""
+
+#: src/readelf.c:1579
+msgid " Offset Type Value Name\n"
+msgstr ""
+
+#: src/readelf.c:1632 src/readelf.c:1643 src/readelf.c:1656 src/readelf.c:1674
+#: src/readelf.c:1686 src/readelf.c:1805 src/readelf.c:1817 src/readelf.c:1831
+#: src/readelf.c:1850 src/readelf.c:1863
+msgid "<INVALID RELOC>"
+msgstr ""
+
+#: src/readelf.c:1749
+msgid " Offset Type Value Addend Name\n"
+msgstr ""
+
+#: src/readelf.c:1751
+msgid " Offset Type Value Addend Name\n"
+msgstr ""
+
+#: src/readelf.c:1952
+#, c-format
+msgid ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entry:\n"
+msgid_plural ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1958
+#, 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:1968
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr ""
+
+#: src/readelf.c:1970
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr ""
+
+#: src/readelf.c:1990
+#, c-format
+msgid "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
+msgstr ""
+
+#: src/readelf.c:2078
+#, c-format
+msgid "bad dynamic symbol"
+msgstr ""
+
+#: src/readelf.c:2160
+msgid "none"
+msgstr "keine"
+
+#: src/readelf.c:2177
+msgid "| <unknown>"
+msgstr "| <unbekannt>"
+
+#: src/readelf.c:2202
+#, c-format
+msgid ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2225
+#, fuzzy, c-format
+msgid " %#06x: Version: %hu File: %s Cnt: %hu\n"
+msgstr " %#06x: Version: %hu Datei: %s Cnt: %hu\n"
+
+#: src/readelf.c:2238
+#, c-format
+msgid " %#06x: Name: %s Flags: %s Version: %hu\n"
+msgstr " %#06x: Name: %s Flags: %s Version: %hu\n"
+
+#: src/readelf.c:2269
+#, c-format
+msgid ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2299
+#, c-format
+msgid " %#06x: Version: %hd Flags: %s Index: %hd Cnt: %hd Name: %s\n"
+msgstr ""
+
+#: src/readelf.c:2314
+#, c-format
+msgid " %#06x: Parent %d: %s\n"
+msgstr ""
+
+#: src/readelf.c:2546
+#, c-format
+msgid ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgid_plural ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2576
+msgid " 0 *local* "
+msgstr " 0 *lokal* "
+
+#: src/readelf.c:2581
+msgid " 1 *global* "
+msgstr " 1 *global* "
+
+#: src/readelf.c:2612
+#, c-format
+msgid ""
+"\n"
+"Histogram 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"
+msgid_plural ""
+"\n"
+"Histogram for bucket list length in section [%2u] '%s' (total of %d "
+"buckets):\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2636
+#, no-c-format
+msgid " Length Number % of total Coverage\n"
+msgstr ""
+
+#: src/readelf.c:2638
+#, c-format
+msgid " 0 %6<PRIu32> %5.1f%%\n"
+msgstr " 0 %6<PRIu32> %5.1f%%\n"
+
+#: src/readelf.c:2645
+#, c-format
+msgid "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
+msgstr "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
+
+#: src/readelf.c:2658
+#, c-format
+msgid ""
+" Average number of tests: successful lookup: %f\n"
+" unsuccessful lookup: %f\n"
+msgstr ""
+
+#: src/readelf.c:2676 src/readelf.c:2718 src/readelf.c:2759
+#, c-format
+msgid "cannot get data for section %d: %s"
+msgstr ""
+
+#: src/readelf.c:2813
+#, c-format
+msgid ""
+" Symbol Bias: %u\n"
+" Bitmask Size: %zu bytes %<PRIuFAST32>%% bits set 2nd hash shift: %u\n"
+msgstr ""
+
+#: src/readelf.c:2887
+#, c-format
+msgid ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2901
+msgid ""
+" Library Time Stamp Checksum Version "
+"Flags"
+msgstr ""
+
+#: src/readelf.c:2951
+#, c-format
+msgid ""
+"\n"
+"Object attributes section [%2zu] '%s' of %<PRIu64> bytes at offset %"
+"#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:2967
+msgid " Owner Size\n"
+msgstr ""
+
+#: src/readelf.c:2993
+#, c-format
+msgid " %-13s %4<PRIu32>\n"
+msgstr " %-13s %4<PRIu32>\n"
+
+#: src/readelf.c:3025
+#, c-format
+msgid " %-4u %12<PRIu32>\n"
+msgstr " %-4u %12<PRIu32>\n"
+
+#: src/readelf.c:3030
+#, c-format
+msgid " File: %11<PRIu32>\n"
+msgstr " File: %11<PRIu32>\n"
+
+#: src/readelf.c:3065
+#, c-format
+msgid " %s: %<PRId64>, %s\n"
+msgstr " %s: %<PRId64>, %s\n"
+
+#: src/readelf.c:3068
+#, c-format
+msgid " %s: %<PRId64>\n"
+msgstr " %s: %<PRId64>\n"
+
+#: src/readelf.c:3071
+#, c-format
+msgid " %s: %s\n"
+msgstr " %s: %s\n"
+
+#: src/readelf.c:3078
+#, c-format
+msgid " %u: %<PRId64>\n"
+msgstr " %u: %<PRId64>\n"
+
+#: src/readelf.c:3081
+#, c-format
+msgid " %u: %s\n"
+msgstr " %u: %s\n"
+
+#: src/readelf.c:3117
+#, c-format
+msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr "%s+%#<PRIx64> <%s+%#<PRIx64>>"
+
+#: src/readelf.c:3120
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
+
+#: src/readelf.c:3125
+#, c-format
+msgid "%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr "%#<PRIx64> <%s+%#<PRIx64>>"
+
+#: src/readelf.c:3128
+#, c-format
+msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr "%#0*<PRIx64> <%s+%#<PRIx64>>"
+
+#: src/readelf.c:3134
+#, c-format
+msgid "%s+%#<PRIx64> <%s>"
+msgstr "%s+%#<PRIx64> <%s>"
+
+#: src/readelf.c:3137
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s>"
+msgstr "%s+%#0*<PRIx64> <%s>"
+
+#: src/readelf.c:3141
+#, c-format
+msgid "%#<PRIx64> <%s>"
+msgstr "%#<PRIx64> <%s>"
+
+#: src/readelf.c:3144
+#, c-format
+msgid "%#0*<PRIx64> <%s>"
+msgstr "%#0*<PRIx64> <%s>"
+
+#: src/readelf.c:3149
+#, c-format
+msgid "%s+%#<PRIx64>"
+msgstr "%s+%#<PRIx64>"
+
+#: src/readelf.c:3152
+#, c-format
+msgid "%s+%#0*<PRIx64>"
+msgstr "%s+%#0*<PRIx64>"
+
+#: src/readelf.c:3260
+#, c-format
+msgid "unknown tag %hx"
+msgstr "unbekannter Tag %hx"
+
+#: src/readelf.c:3262
+#, c-format
+msgid "unknown user tag %hx"
+msgstr "unbekannter Benutzer-Tag %hx"
+
+#: src/readelf.c:3480
+#, c-format
+msgid "unknown attribute %hx"
+msgstr "unbekanntes Attribut %hx"
+
+#: src/readelf.c:3483
+#, c-format
+msgid "unknown user attribute %hx"
+msgstr "unbekanntes Benutzer-Attribut %hx"
+
+#: src/readelf.c:3529
+#, c-format
+msgid "unknown form %<PRIx64>"
+msgstr "unbekannte Form %<PRIx64>"
+
+#: src/readelf.c:3763
+msgid "empty block"
+msgstr ""
+
+#: src/readelf.c:3766
+#, c-format
+msgid "%zu byte block:"
+msgstr ""
+
+#: src/readelf.c:4175
+#, c-format
+msgid "%*s[%4<PRIuMAX>] %s <TRUNCATED>\n"
+msgstr ""
+
+#: src/readelf.c:4188
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [ Code]\n"
+msgstr ""
+
+#: src/readelf.c:4195
+#, c-format
+msgid ""
+"\n"
+"Abbreviation section at offset %<PRIu64>:\n"
+msgstr ""
+
+#: src/readelf.c:4208
+#, c-format
+msgid " *** error while reading abbreviation: %s\n"
+msgstr ""
+
+#: src/readelf.c:4224
+#, c-format
+msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
+msgstr ""
+
+#: src/readelf.c:4227
+msgid "yes"
+msgstr "ja"
+
+#: src/readelf.c:4227
+msgid "no"
+msgstr "nein"
+
+#: src/readelf.c:4263
+#, c-format
+msgid "cannot get .debug_aranges content: %s"
+msgstr ""
+
+#: src/readelf.c:4268
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:4298
+#, c-format
+msgid " [%*zu] ???\n"
+msgstr " [%*zu] ???\n"
+
+#: src/readelf.c:4300
+#, c-format
+msgid ""
+" [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:4319
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr ""
+
+#: src/readelf.c:4324 src/readelf.c:4810 src/readelf.c:5452 src/readelf.c:5897
+#: src/readelf.c:5992 src/readelf.c:6164
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:4338 src/readelf.c:5911
+#, c-format
+msgid " [%6tx] <INVALID DATA>\n"
+msgstr ""
+
+#: src/readelf.c:4360 src/readelf.c:5933
+#, c-format
+msgid " [%6tx] base address %s\n"
+msgstr ""
+
+#: src/readelf.c:4371
+#, c-format
+msgid " [%6tx] %s..%s\n"
+msgstr " [%6tx] %s..%s\n"
+
+#: src/readelf.c:4373
+#, c-format
+msgid " %s..%s\n"
+msgstr " %s..%s\n"
+
+#: src/readelf.c:4799 src/readelf.c:6230 src/readelf.c:6332
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr ""
+
+#: src/readelf.c:4806
+#, c-format
+msgid ""
+"\n"
+"Call frame information section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:4833 src/readelf.c:5486
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr ""
+
+#: src/readelf.c:4855
+#, c-format
+msgid ""
+"\n"
+" [%6tx] Zero terminator\n"
+msgstr ""
+
+#: src/readelf.c:4924
+#, fuzzy, c-format
+msgid "invalid augmentation length"
+msgstr "ungültige Abschnittsausrichtung"
+
+#: src/readelf.c:4936
+msgid "FDE address encoding: "
+msgstr ""
+
+#: src/readelf.c:4942
+msgid "LSDA pointer encoding: "
+msgstr ""
+
+#: src/readelf.c:5034
+#, c-format
+msgid " (offset: %#<PRIx64>)"
+msgstr ""
+
+#: src/readelf.c:5041
+#, c-format
+msgid " (end offset: %#<PRIx64>)"
+msgstr ""
+
+#: src/readelf.c:5068
+#, c-format
+msgid " %-26sLSDA pointer: %#<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:5114
+#, c-format
+msgid "cannot get attribute code: %s"
+msgstr ""
+
+#: src/readelf.c:5122
+#, c-format
+msgid "cannot get attribute form: %s"
+msgstr ""
+
+#: src/readelf.c:5135
+#, c-format
+msgid "cannot get attribute value: %s"
+msgstr ""
+
+#: src/readelf.c:5331
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [Offset]\n"
+msgstr ""
+
+#: src/readelf.c:5356
+#, c-format
+msgid ""
+" Compilation unit at offset %<PRIu64>:\n"
+" Version: %<PRIu16>, Abbreviation section offset: %<PRIu64>, Address size: %"
+"<PRIu8>, Offset size: %<PRIu8>\n"
+msgstr ""
+
+#: src/readelf.c:5374
+#, c-format
+msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
+msgstr ""
+
+#: src/readelf.c:5385
+#, c-format
+msgid "cannot get DIE offset: %s"
+msgstr ""
+
+#: src/readelf.c:5393
+#, c-format
+msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
+msgstr ""
+
+#: src/readelf.c:5422
+#, c-format
+msgid "cannot get next DIE: %s\n"
+msgstr ""
+
+#: src/readelf.c:5429
+#, c-format
+msgid "cannot get next DIE: %s"
+msgstr ""
+
+#: src/readelf.c:5464
+#, c-format
+msgid "cannot get line data section data: %s"
+msgstr ""
+
+#: src/readelf.c:5477
+#, c-format
+msgid ""
+"\n"
+"Table at offset %Zu:\n"
+msgstr ""
+
+#: src/readelf.c:5529
+#, c-format
+msgid ""
+"\n"
+" Length: %<PRIu64>\n"
+" DWARF version: %<PRIuFAST16>\n"
+" Prologue length: %<PRIu64>\n"
+" Minimum instruction length: %<PRIuFAST8>\n"
+" Initial value if '%s': %<PRIuFAST8>\n"
+" Line base: %<PRIdFAST8>\n"
+" Line range: %<PRIuFAST8>\n"
+" Opcode base: %<PRIuFAST8>\n"
+"\n"
+"Opcodes:\n"
+msgstr ""
+
+#: src/readelf.c:5548
+#, c-format
+msgid "invalid data at offset %tu in section [%zu] '%s'"
+msgstr ""
+
+#: src/readelf.c:5563
+#, c-format
+msgid " [%*<PRIuFAST8>] %hhu argument\n"
+msgid_plural " [%*<PRIuFAST8>] %hhu arguments\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:5571
+msgid ""
+"\n"
+"Directory table:"
+msgstr ""
+
+#: src/readelf.c:5587
+msgid ""
+"\n"
+"File name table:\n"
+" Entry Dir Time Size Name"
+msgstr ""
+
+#: src/readelf.c:5616
+msgid ""
+"\n"
+"Line number statements:"
+msgstr ""
+
+#: src/readelf.c:5677
+#, c-format
+msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
+msgstr ""
+
+#: src/readelf.c:5697
+#, c-format
+msgid " extended opcode %u: "
+msgstr ""
+
+#: src/readelf.c:5702
+msgid "end of sequence"
+msgstr ""
+
+#: src/readelf.c:5717
+#, c-format
+msgid "set address to %s\n"
+msgstr ""
+
+#: src/readelf.c:5738
+#, c-format
+msgid "define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
+msgstr ""
+
+#: src/readelf.c:5747
+msgid "unknown opcode"
+msgstr ""
+
+#: src/readelf.c:5759
+msgid " copy"
+msgstr ""
+
+#: src/readelf.c:5769
+#, c-format
+msgid "advance address by %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5780
+#, c-format
+msgid " advance line by constant %d to %<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:5788
+#, c-format
+msgid " set file to %<PRIu64>\n"
+msgstr ""
+
+#: src/readelf.c:5798
+#, c-format
+msgid " set column to %<PRIu64>\n"
+msgstr ""
+
+#: src/readelf.c:5805
+#, c-format
+msgid " set '%s' to %<PRIuFAST8>\n"
+msgstr ""
+
+#: src/readelf.c:5811
+msgid " set basic block flag"
+msgstr ""
+
+#: src/readelf.c:5821
+#, c-format
+msgid "advance address by constant %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5837
+#, c-format
+msgid "advance address by fixed value %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5846
+msgid " set prologue end flag"
+msgstr ""
+
+#: src/readelf.c:5851
+msgid " set epilogue begin flag"
+msgstr ""
+
+#: src/readelf.c:5860
+#, c-format
+msgid " unknown opcode with %<PRIu8> parameter:"
+msgid_plural " unknown opcode with %<PRIu8> parameters:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:5892
+#, c-format
+msgid "cannot get .debug_loc content: %s"
+msgstr ""
+
+#: src/readelf.c:5947
+#, c-format
+msgid " [%6tx] %s..%s"
+msgstr " [%6tx] %s..%s"
+
+#: src/readelf.c:5949
+#, c-format
+msgid " %s..%s"
+msgstr " %s..%s"
+
+#: src/readelf.c:6002
+#, c-format
+msgid "cannot get macro information section data: %s"
+msgstr ""
+
+#: src/readelf.c:6081
+#, c-format
+msgid "%*s*** non-terminated string at end of section"
+msgstr ""
+
+#: src/readelf.c:6149
+#, c-format
+msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
+msgstr ""
+
+#: src/readelf.c:6188
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" %*s String\n"
+msgstr ""
+
+#: src/readelf.c:6202
+#, c-format
+msgid " *** error while reading strings: %s\n"
+msgstr ""
+
+#: src/readelf.c:6222
+#, c-format
+msgid ""
+"\n"
+"Call frame search table section [%2zu] '.eh_frame_hdr':\n"
+msgstr ""
+
+#: src/readelf.c:6324
+#, c-format
+msgid ""
+"\n"
+"Exception handling table section [%2zu] '.gcc_except_table':\n"
+msgstr ""
+
+#: src/readelf.c:6347
+#, c-format
+msgid " LPStart encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6359
+#, c-format
+msgid " TType encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6373
+#, c-format
+msgid " Call site encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6386
+msgid ""
+"\n"
+" Call site table:"
+msgstr ""
+
+#: src/readelf.c:6400
+#, c-format
+msgid ""
+" [%4u] Call site start: %#<PRIx64>\n"
+" Call site length: %<PRIu64>\n"
+" Landing pad: %#<PRIx64>\n"
+" Action: %u\n"
+msgstr ""
+
+#: src/readelf.c:6460
+#, c-format
+msgid "invalid TType encoding"
+msgstr ""
+
+#: src/readelf.c:6484
+#, c-format
+msgid "cannot get debug context descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:6620 src/readelf.c:7221
+#, c-format
+msgid "cannot convert core note data: %s"
+msgstr ""
+
+#: src/readelf.c:6961
+#, c-format
+msgid ""
+"\n"
+"%*s... <repeats %u more times> ..."
+msgstr ""
+
+#: src/readelf.c:7320
+msgid " Owner Data size Type\n"
+msgstr ""
+
+#: src/readelf.c:7338
+#, c-format
+msgid " %-13.*s %9<PRId32> %s\n"
+msgstr ""
+
+#: src/readelf.c:7372
+#, c-format
+msgid "cannot get content of note section: %s"
+msgstr ""
+
+#: src/readelf.c:7399
+#, c-format
+msgid ""
+"\n"
+"Note section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7422
+#, c-format
+msgid ""
+"\n"
+"Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7468
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no data to dump.\n"
+msgstr ""
+
+#: src/readelf.c:7474 src/readelf.c:7497
+#, c-format
+msgid "cannot get data for section [%Zu] '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7478
+#, c-format
+msgid ""
+"\n"
+"Hex dump of section [%Zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7491
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no strings to dump.\n"
+msgstr ""
+
+#: src/readelf.c:7501
+#, c-format
+msgid ""
+"\n"
+"String section [%Zu] '%s' contains %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7549
+#, c-format
+msgid ""
+"\n"
+"section [%lu] does not exist"
+msgstr ""
+
+#: src/readelf.c:7576
+#, c-format
+msgid ""
+"\n"
+"section '%s' does not exist"
+msgstr ""
+
+#: src/readelf.c:7637
+#, c-format
+msgid "cannot get symbol index of archive '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7640
+#, c-format
+msgid ""
+"\n"
+"Archive '%s' has no symbol index\n"
+msgstr ""
+
+#: src/readelf.c:7644
+#, c-format
+msgid ""
+"\n"
+"Index of archive '%s' has %Zu entries:\n"
+msgstr ""
+
+#: src/readelf.c:7662
+#, c-format
+msgid "cannot extract member at offset %Zu in '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7667
+#, c-format
+msgid "Archive member '%s' contains:\n"
+msgstr ""
+
+#: src/size.c:68
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd' or `sysv'. The default "
+"is `bsd'"
+msgstr ""
+
+#: src/size.c:70
+msgid "Same as `--format=sysv'"
+msgstr "Genau wie `--format=sysv'"
+
+#: src/size.c:71
+msgid "Same as `--format=bsd'"
+msgstr "Genau wie `--format=bsd'"
+
+#: src/size.c:74
+msgid "Same as `--radix=10'"
+msgstr "Genau wie `--radix=10'"
+
+#: src/size.c:75
+msgid "Same as `--radix=8'"
+msgstr "Genau wie `--radix=8'"
+
+#: src/size.c:76
+msgid "Same as `--radix=16'"
+msgstr "Genau wie `--radix=16'"
+
+#: src/size.c:78
+msgid "Similar to `--format=sysv' output but in one line"
+msgstr ""
+
+#: src/size.c:82
+msgid "Print size and permission flags for loadable segments"
+msgstr ""
+
+#: src/size.c:83
+msgid "Display the total sizes (bsd only)"
+msgstr ""
+
+#: src/size.c:88
+msgid "List section sizes of FILEs (a.out by default)."
+msgstr ""
+
+#: src/size.c:269
+#, c-format
+msgid "Invalid format: %s"
+msgstr "Ungültiges Format: %s"
+
+#: src/size.c:280
+#, c-format
+msgid "Invalid radix: %s"
+msgstr ""
+
+#: src/size.c:339
+#, c-format
+msgid "%s: file format not recognized"
+msgstr ""
+
+#: src/size.c:446 src/size.c:589
+#, c-format
+msgid " (ex %s)"
+msgstr ""
+
+#: src/size.c:614
+msgid "(TOTALS)\n"
+msgstr ""
+
+#: src/strings.c:70
+msgid "Output Selection:"
+msgstr ""
+
+#: src/strings.c:71
+msgid "Scan entire file, not only loaded sections"
+msgstr ""
+
+#: src/strings.c:73
+msgid "Only NUL-terminated sequences of MIN-LEN characters or more are printed"
+msgstr ""
+
+#: src/strings.c:74
+msgid ""
+"Select character size and endianess: s = 7-bit, S = 8-bit, {b,l} = 16-bit, "
+"{B,L} = 32-bit"
+msgstr ""
+
+#: src/strings.c:78
+msgid "Print name of the file before each string."
+msgstr ""
+
+#: src/strings.c:80
+msgid "Print location of the string in base 8, 10, or 16 respectively."
+msgstr ""
+
+#: src/strings.c:81
+msgid "Alias for --radix=o"
+msgstr "Alias für --radix=o"
+
+#: src/strings.c:88
+msgid "Print the strings of printable characters in files."
+msgstr ""
+
+#: src/strings.c:268 src/strings.c:303
+#, c-format
+msgid "invalid value '%s' for %s parameter"
+msgstr ""
+
+#: src/strings.c:314
+#, c-format
+msgid "invalid minimum length of matched string size"
+msgstr ""
+
+#: src/strings.c:601
+#, c-format
+msgid "lseek64 failed"
+msgstr "lseek64 fehlgeschlagen"
+
+#: src/strings.c:616 src/strings.c:680
+#, c-format
+msgid "re-mmap failed"
+msgstr "re-mmap fehlgeschlagen"
+
+#: src/strings.c:653
+#, c-format
+msgid "mprotect failed"
+msgstr "mprotect fehlgeschlagen"
+
+#: src/strip.c:74
+msgid "Place stripped output into FILE"
+msgstr ""
+
+#: src/strip.c:75
+msgid "Extract the removed sections into FILE"
+msgstr ""
+
+#: src/strip.c:76
+msgid "Embed name FILE instead of -f argument"
+msgstr ""
+
+#: src/strip.c:80
+msgid "Remove all debugging symbols"
+msgstr ""
+
+#: src/strip.c:84
+msgid "Copy modified/access timestamps to the output"
+msgstr ""
+
+#: src/strip.c:86
+msgid "Remove .comment section"
+msgstr ""
+
+#: src/strip.c:89
+msgid "Relax a few rules to handle slightly broken ELF files"
+msgstr ""
+
+#: src/strip.c:94
+msgid "Discard symbols from object files."
+msgstr ""
+
+#: src/strip.c:186
+#, c-format
+msgid "Only one input file allowed together with '-o' and '-f'"
+msgstr ""
+
+#: src/strip.c:222
+#, c-format
+msgid "-f option specified twice"
+msgstr ""
+
+#: src/strip.c:231
+#, c-format
+msgid "-F option specified twice"
+msgstr ""
+
+#: src/strip.c:240 src/unstrip.c:125
+#, c-format
+msgid "-o option specified twice"
+msgstr ""
+
+#: src/strip.c:260
+#, c-format
+msgid "-R option supports only .comment section"
+msgstr ""
+
+#: src/strip.c:298 src/strip.c:322
+#, c-format
+msgid "cannot stat input file '%s'"
+msgstr ""
+
+#: src/strip.c:312
+#, c-format
+msgid "while opening '%s'"
+msgstr ""
+
+#: src/strip.c:350
+#, c-format
+msgid "%s: cannot use -o or -f when stripping archive"
+msgstr ""
+
+#: src/strip.c:448
+#, c-format
+msgid "cannot open EBL backend"
+msgstr ""
+
+#: src/strip.c:498 src/strip.c:522
+#, c-format
+msgid "cannot create new file '%s': %s"
+msgstr ""
+
+#: src/strip.c:582
+#, c-format
+msgid "illformed file '%s'"
+msgstr ""
+
+#: src/strip.c:869 src/strip.c:956
+#, c-format
+msgid "while generating output file: %s"
+msgstr ""
+
+#: src/strip.c:929 src/strip.c:1668
+#, c-format
+msgid "%s: error while creating ELF header: %s"
+msgstr ""
+
+#: src/strip.c:943
+#, c-format
+msgid "while preparing output for '%s'"
+msgstr ""
+
+#: src/strip.c:994 src/strip.c:1050
+#, c-format
+msgid "while create section header section: %s"
+msgstr ""
+
+#: src/strip.c:1000
+#, c-format
+msgid "cannot allocate section data: %s"
+msgstr ""
+
+#: src/strip.c:1059
+#, c-format
+msgid "while create section header string table: %s"
+msgstr ""
+
+#: src/strip.c:1593 src/strip.c:1690
+#, c-format
+msgid "while writing '%s': %s"
+msgstr ""
+
+#: src/strip.c:1604
+#, c-format
+msgid "while creating '%s'"
+msgstr ""
+
+#: src/strip.c:1616
+#, c-format
+msgid "while computing checksum for debug information"
+msgstr ""
+
+#: src/strip.c:1676
+#, c-format
+msgid "%s: error while reading the file: %s"
+msgstr ""
+
+#: src/strip.c:1722 src/strip.c:1729
+#, c-format
+msgid "error while finishing '%s': %s"
+msgstr ""
+
+#: src/strip.c:1752 src/strip.c:1809
+#, c-format
+msgid "cannot set access and modification date of '%s'"
+msgstr ""
+
+#: src/unstrip.c:78
+msgid "Match MODULE against file names, not module names"
+msgstr ""
+
+#: src/unstrip.c:79
+msgid "Silently skip unfindable files"
+msgstr ""
+
+#: src/unstrip.c:82
+msgid "Place output into FILE"
+msgstr ""
+
+#: src/unstrip.c:84
+msgid "Create multiple output files under DIRECTORY"
+msgstr ""
+
+#: src/unstrip.c:85
+msgid "Use module rather than file names"
+msgstr ""
+
+#: src/unstrip.c:87
+msgid "Create output for modules that have no separate debug information"
+msgstr ""
+
+#: src/unstrip.c:90
+msgid "Apply relocations to section contents in ET_REL files"
+msgstr ""
+
+#: src/unstrip.c:92
+msgid "Only list module and file names, build IDs"
+msgstr ""
+
+#: src/unstrip.c:134
+#, c-format
+msgid "-d option specified twice"
+msgstr "Option -d zweimal angegeben"
+
+#: src/unstrip.c:166
+#, c-format
+msgid "only one of -o or -d allowed"
+msgstr "nur entweder -o oder -d erlaubt"
+
+#: src/unstrip.c:175
+#, 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:190
+#, c-format
+msgid "output directory '%s'"
+msgstr "Ausgabeverzeichnis '%s'"
+
+#: src/unstrip.c:199
+#, c-format
+msgid "exactly two file arguments are required"
+msgstr "genau zwei Datei-Argumente werden benötigt"
+
+#: src/unstrip.c:205
+#, c-format
+msgid "-m, -a, -R, and -i options not allowed with explicit files"
+msgstr ""
+
+#: src/unstrip.c:218
+#, c-format
+msgid "-o or -d is required when using implicit files"
+msgstr ""
+
+#: src/unstrip.c:254
+#, c-format
+msgid "cannot create ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:259
+#, c-format
+msgid "cannot copy ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:264 src/unstrip.c:1817
+#, c-format
+msgid "cannot create program headers: %s"
+msgstr "konnte Programm-Kopf nicht erstellen: %s"
+
+#: src/unstrip.c:270
+#, c-format
+msgid "cannot copy program header: %s"
+msgstr "konnte Programm-Kopf nicht kopieren: %s"
+
+#: src/unstrip.c:280
+#, c-format
+msgid "cannot copy section header: %s"
+msgstr ""
+
+#: src/unstrip.c:283 src/unstrip.c:1505
+#, c-format
+msgid "cannot get section data: %s"
+msgstr "konnte Abschnittsdaten nicht holen: %s"
+
+#: src/unstrip.c:285 src/unstrip.c:1507
+#, c-format
+msgid "cannot copy section data: %s"
+msgstr "konnte Abschnittsdaten nicht kopieren: %s"
+
+#: src/unstrip.c:309
+#, c-format
+msgid "cannot create directory '%s'"
+msgstr "konnte Verzeichnis nicht erstellen: %s"
+
+#: src/unstrip.c:349 src/unstrip.c:763 src/unstrip.c:1540
+#, c-format
+msgid "cannot get symbol table entry: %s"
+msgstr "konnte Eintrag aus der Symboltabelle nicht holen: %s"
+
+#: src/unstrip.c:365 src/unstrip.c:580 src/unstrip.c:601 src/unstrip.c:613
+#: src/unstrip.c:1561 src/unstrip.c:1691 src/unstrip.c:1715
+#, c-format
+msgid "cannot update symbol table: %s"
+msgstr "konnte Symboltabelle nicht aktualisieren: %s"
+
+#: src/unstrip.c:382 src/unstrip.c:432 src/unstrip.c:562 src/unstrip.c:1209
+#: src/unstrip.c:1525 src/unstrip.c:1720 src/unstrip.c:1791
+#, c-format
+msgid "cannot update section header: %s"
+msgstr ""
+
+#: src/unstrip.c:408 src/unstrip.c:419
+#, c-format
+msgid "cannot update relocation: %s"
+msgstr ""
+
+#: src/unstrip.c:507
+#, c-format
+msgid "cannot get symbol version: %s"
+msgstr ""
+
+#: src/unstrip.c:519
+#, c-format
+msgid "unexpected section type in [%Zu] with sh_link to symtab"
+msgstr ""
+
+#: src/unstrip.c:769
+#, c-format
+msgid "invalid string offset in symbol [%Zu]"
+msgstr ""
+
+#: src/unstrip.c:911 src/unstrip.c:1248
+#, c-format
+msgid "cannot read section [%Zu] name: %s"
+msgstr ""
+
+#: src/unstrip.c:952 src/unstrip.c:971 src/unstrip.c:1004
+#, c-format
+msgid "cannot read '.gnu.prelink_undo' section: %s"
+msgstr ""
+
+#: src/unstrip.c:992
+#, c-format
+msgid "invalid contents in '%s' section"
+msgstr ""
+
+#: src/unstrip.c:1047 src/unstrip.c:1370
+#, c-format
+msgid "cannot find matching section for [%Zu] '%s'"
+msgstr ""
+
+#: src/unstrip.c:1171 src/unstrip.c:1186 src/unstrip.c:1451
+#, c-format
+msgid "cannot add section name to string table: %s"
+msgstr ""
+
+#: src/unstrip.c:1195
+#, c-format
+msgid "cannot update section header string table data: %s"
+msgstr ""
+
+#: src/unstrip.c:1223 src/unstrip.c:1227
+#, c-format
+msgid "cannot get section header string table section index: %s"
+msgstr ""
+
+#: src/unstrip.c:1231 src/unstrip.c:1235 src/unstrip.c:1466
+#, c-format
+msgid "cannot get section count: %s"
+msgstr ""
+
+#: src/unstrip.c:1293 src/unstrip.c:1385
+#, c-format
+msgid "cannot read section header string table: %s"
+msgstr ""
+
+#: src/unstrip.c:1445
+#, c-format
+msgid "cannot add new section: %s"
+msgstr ""
+
+#: src/unstrip.c:1548
+#, c-format
+msgid "symbol [%Zu] has invalid section index"
+msgstr ""
+
+#: src/unstrip.c:1800
+#, c-format
+msgid "cannot get ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:1827
+#, c-format
+msgid "cannot update program header: %s"
+msgstr "konnte Programm-Kopf nicht aktualisieren: %s"
+
+#: src/unstrip.c:1832 src/unstrip.c:1911
+#, c-format
+msgid "cannot write output file: %s"
+msgstr ""
+
+#: src/unstrip.c:1880
+#, c-format
+msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+
+#: src/unstrip.c:1883
+#, c-format
+msgid ""
+"DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+
+#: src/unstrip.c:1902 src/unstrip.c:1942 src/unstrip.c:1954 src/unstrip.c:2034
+#, c-format
+msgid "cannot create ELF descriptor: %s"
+msgstr ""
+
+#: src/unstrip.c:1960
+#, c-format
+msgid "'%s' and '%s' do not seem to match"
+msgstr ""
+
+#: src/unstrip.c:1991
+#, c-format
+msgid "cannot find stripped file for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:1995
+#, c-format
+msgid "cannot open stripped file '%s' for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2010
+#, c-format
+msgid "cannot find debug file for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2014
+#, c-format
+msgid "cannot open debug file '%s' for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2027
+#, c-format
+msgid "module '%s' file '%s' is not stripped"
+msgstr ""
+
+#: src/unstrip.c:2058
+#, c-format
+msgid "cannot cache section addresses for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2191
+#, c-format
+msgid "no matching modules found"
+msgstr "kein passendes Modul gefunden"
+
+#: src/unstrip.c:2200
+#, c-format
+msgid "matched more than one module"
+msgstr "mehr als ein passendes Modul"
+
+#: src/unstrip.c:2247
+msgid ""
+"STRIPPED-FILE DEBUG-FILE\n"
+"[MODULE...]"
+msgstr ""
+
+#: src/unstrip.c:2248
+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"
+"\n"
+"MODULE arguments give file name patterns matching modules to process.\n"
+"With -f these match the file name of the main (stripped) file (slashes are "
+"never special), otherwise they match the simple module names. With no "
+"arguments, process all modules found.\n"
+"\n"
+"Multiple modules are written to files under OUTPUT-DIRECTORY, creating "
+"subdirectories as needed. With -m these files have simple module names, "
+"otherwise they have the name of the main file complete with directory "
+"underneath OUTPUT-DIRECTORY.\n"
+"\n"
+"With -n no files are written, but one line to standard output for each "
+"module:\n"
+"\tSTART+SIZE BUILDID FILE DEBUGFILE MODULENAME\n"
+"START and SIZE are hexadecimal giving the address bounds of the module. "
+"BUILDID is hexadecimal for the build ID bits, or - if no ID is known; the "
+"hexadecimal may be followed by @0xADDR giving the address where the ID "
+"resides if that is known. FILE is the file name found for the module, or - "
+"if none was found, or . if an ELF image is available but not from any named "
+"file. DEBUGFILE is the separate debuginfo file name, or - if no debuginfo "
+"was found, or . if FILE contains the debug information."
+msgstr ""
+
+#~ msgid "Equivalent to: -e -h -l"
+#~ msgstr "Entspricht: -e -h -l"
diff --git a/po/es.po b/po/es.po
new file mode 100644
index 00000000..93aa1be4
--- /dev/null
+++ b/po/es.po
@@ -0,0 +1,6026 @@
+# Fedora Spanish Translation of elfutils.master.
+# This file is distributed under the same license as the elfutils.master package.
+#
+# Domingo Becker <domingobecker@gmail.com>, 2009.
+# Gladys Guerrero Lozano <gguerrer@redhat.com>, 2009.
+# Héctor Daniel Cabrera <logan@fedoraproject.org>, 2009, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: elfutils.master.es\n"
+"Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
+"POT-Creation-Date: 2010-05-18 12:23+0000\n"
+"PO-Revision-Date: 2010-05-18 10:04-0300\n"
+"Last-Translator: Héctor Daniel Cabrera <logan@fedoraproject.org>\n"
+"Language-Team: Fedora Spanish <trans-es@lists.fedoraproject.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Spanish\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Country: ARGENTINA\n"
+
+#: ../lib/xmalloc.c:51
+#: ../lib/xmalloc.c:65
+#: ../lib/xmalloc.c:79
+#: ../src/readelf.c:2822
+#: ../src/readelf.c:3161
+#: ../src/unstrip.c:2087
+#: ../src/unstrip.c:2295
+#, c-format
+msgid "memory exhausted"
+msgstr "memoria agotada"
+
+#: ../libasm/asm_error.c:62
+#: ../libdw/dwarf_error.c:79
+#: ../libdwfl/libdwflP.h:70
+#: ../libelf/elf_error.c:81
+msgid "no error"
+msgstr "ningún error"
+
+#: ../libasm/asm_error.c:63
+#: ../libdw/dwarf_error.c:88
+#: ../libdwfl/libdwflP.h:72
+#: ../libelf/elf_error.c:112
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: ../libasm/asm_error.c:64
+#: ../src/ldgeneric.c:2687
+#, c-format
+msgid "cannot create output file"
+msgstr "no se puede crear el archivo de salida"
+
+#: ../libasm/asm_error.c:65
+msgid "invalid parameter"
+msgstr "Parámetro inválido"
+
+#: ../libasm/asm_error.c:66
+msgid "cannot change mode of output file"
+msgstr "no sepuede cambiar modo de archivo de salida"
+
+#. Something went wrong.
+#: ../libasm/asm_error.c:67
+#: ../src/ldgeneric.c:7001
+#, c-format
+msgid "cannot rename output file"
+msgstr "no se puede renombrar el archivo de salida"
+
+#: ../libasm/asm_error.c:68
+msgid "duplicate symbol"
+msgstr "Duplicar símbolo"
+
+#: ../libasm/asm_error.c:69
+msgid "invalid section type for operation"
+msgstr "tipo de sección inválido para operación"
+
+#: ../libasm/asm_error.c:70
+msgid "error during output of data"
+msgstr "error durante salida de datos"
+
+#: ../libasm/asm_error.c:71
+msgid "no backend support available"
+msgstr "No hay soporte de segundo plano"
+
+#: ../libasm/asm_error.c:81
+#: ../libdw/dwarf_error.c:80
+#: ../libdwfl/libdwflP.h:71
+#: ../libelf/elf_error.c:84
+msgid "unknown error"
+msgstr "error desconocido"
+
+#: ../libdw/dwarf_error.c:81
+msgid "invalid access"
+msgstr "Acceso inválido"
+
+#: ../libdw/dwarf_error.c:82
+msgid "no regular file"
+msgstr "no es un archivo regular"
+
+#: ../libdw/dwarf_error.c:83
+msgid "I/O error"
+msgstr "Error de E/S"
+
+#: ../libdw/dwarf_error.c:84
+msgid "invalid ELF file"
+msgstr "Archivo ELF inválido"
+
+#: ../libdw/dwarf_error.c:85
+msgid "no DWARF information"
+msgstr "Sin información de DWARF"
+
+#: ../libdw/dwarf_error.c:86
+msgid "no ELF file"
+msgstr "No hay archivo ELF"
+
+#: ../libdw/dwarf_error.c:87
+msgid "cannot get ELF header"
+msgstr "no se puede obtener el encabezamiento ELF"
+
+#: ../libdw/dwarf_error.c:89
+msgid "not implemented"
+msgstr "sin implementar"
+
+#: ../libdw/dwarf_error.c:90
+#: ../libelf/elf_error.c:128
+#: ../libelf/elf_error.c:176
+msgid "invalid command"
+msgstr "comando inválido"
+
+#: ../libdw/dwarf_error.c:91
+msgid "invalid version"
+msgstr "versión inválida"
+
+#: ../libdw/dwarf_error.c:92
+msgid "invalid file"
+msgstr "Archivo inválido"
+
+#: ../libdw/dwarf_error.c:93
+msgid "no entries found"
+msgstr "No se hallaron entradas"
+
+#: ../libdw/dwarf_error.c:94
+msgid "invalid DWARF"
+msgstr "DWARF inválido"
+
+#: ../libdw/dwarf_error.c:95
+msgid "no string data"
+msgstr "no hay datos de cadena"
+
+#: ../libdw/dwarf_error.c:96
+msgid "no address value"
+msgstr "no hay valor de dirección"
+
+#: ../libdw/dwarf_error.c:97
+msgid "no constant value"
+msgstr "no hay valor constante"
+
+#: ../libdw/dwarf_error.c:98
+msgid "no reference value"
+msgstr "no hay valor de referencia"
+
+#: ../libdw/dwarf_error.c:99
+msgid "invalid reference value"
+msgstr "valor de la referencia inválido"
+
+#: ../libdw/dwarf_error.c:100
+msgid ".debug_line section missing"
+msgstr ".debug_line section faltante"
+
+#: ../libdw/dwarf_error.c:101
+msgid "invalid .debug_line section"
+msgstr ".debug_line section inválida"
+
+#: ../libdw/dwarf_error.c:102
+msgid "debug information too big"
+msgstr "información de depuración muy grande"
+
+#: ../libdw/dwarf_error.c:103
+msgid "invalid DWARF version"
+msgstr "versión DWARF inválida"
+
+#: ../libdw/dwarf_error.c:104
+msgid "invalid directory index"
+msgstr "Índice de directorio inválido"
+
+#: ../libdw/dwarf_error.c:105
+#: ../libdwfl/libdwflP.h:91
+msgid "address out of range"
+msgstr "dirección fuera de rango"
+
+#: ../libdw/dwarf_error.c:106
+msgid "no location list value"
+msgstr "valor de lista sin ubicación"
+
+#: ../libdw/dwarf_error.c:107
+msgid "no block data"
+msgstr "sin datos de bloque "
+
+#: ../libdw/dwarf_error.c:108
+msgid "invalid line index"
+msgstr "Índice de línea inválido"
+
+#: ../libdw/dwarf_error.c:109
+msgid "invalid address range index"
+msgstr "Índice de dirección de rango inválido"
+
+#: ../libdw/dwarf_error.c:110
+#: ../libdwfl/libdwflP.h:92
+msgid "no matching address range"
+msgstr "dirección de rango no coincidente"
+
+#: ../libdw/dwarf_error.c:111
+msgid "no flag value"
+msgstr "sin valor de bandera"
+
+#: ../libdw/dwarf_error.c:112
+#: ../libelf/elf_error.c:253
+msgid "invalid offset"
+msgstr "desplazamiento inválido"
+
+#: ../libdw/dwarf_error.c:113
+msgid ".debug_ranges section missing"
+msgstr ".debug_ranges section faltante"
+
+#: ../libdw/dwarf_error.c:114
+msgid "invalid CFI section"
+msgstr "sección CFI inválida"
+
+#: ../libdwfl/argp-std.c:67
+#: ../src/unstrip.c:2237
+msgid "Input selection options:"
+msgstr "Opciones de selección de entrada:"
+
+#: ../libdwfl/argp-std.c:68
+msgid "Find addresses in FILE"
+msgstr "Hallar direcciones en FICHERO"
+
+#: ../libdwfl/argp-std.c:70
+msgid "Find addresses from signatures found in COREFILE"
+msgstr "Buscar direcciones desde firmas encontradas en COREFILE"
+
+#: ../libdwfl/argp-std.c:72
+msgid "Find addresses in files mapped into process PID"
+msgstr "Busca direcciones en archivos mapeados sobre procesos PID"
+
+#: ../libdwfl/argp-std.c:74
+msgid "Find addresses in files mapped as read from FILE in Linux /proc/PID/maps format"
+msgstr "Busca direcciones en archivos asignados como leídos desde FILE en formato Linux /proc/PID/maps"
+
+#: ../libdwfl/argp-std.c:76
+msgid "Find addresses in the running kernel"
+msgstr "Busca direcciones en el kernel que está ejecutándose"
+
+#: ../libdwfl/argp-std.c:78
+msgid "Kernel with all modules"
+msgstr "Kernel con todos los módulos"
+
+#: ../libdwfl/argp-std.c:80
+msgid "Search path for separate debuginfo files"
+msgstr "Ruta de búsqueda para archivos debugingfo independientes"
+
+#: ../libdwfl/argp-std.c:163
+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:223
+#, c-format
+msgid "cannot read ELF core file: %s"
+msgstr "No se puede leer archivo core ELF: %s"
+
+#: ../libdwfl/argp-std.c:241
+msgid "No modules recognized in core file"
+msgstr "No hay módulos reconocidos en el archivo core"
+
+#: ../libdwfl/argp-std.c:253
+msgid "cannot load kernel symbols"
+msgstr "No se pueden cargar símbolos de kernel"
+
+#. Non-fatal to have no modules since we do have the kernel.
+#: ../libdwfl/argp-std.c:257
+msgid "cannot find kernel modules"
+msgstr "no se pueden hallar módulos de kernel"
+
+#: ../libdwfl/argp-std.c:271
+msgid "cannot find kernel or modules"
+msgstr "imposible encontrar kernel o módulos"
+
+#: ../libdwfl/libdwflP.h:73
+msgid "See errno"
+msgstr "Ve errno"
+
+#: ../libdwfl/libdwflP.h:74
+msgid "See elf_errno"
+msgstr "Ver elf_errno"
+
+#: ../libdwfl/libdwflP.h:75
+msgid "See dwarf_errno"
+msgstr "Ver dwarf_errno"
+
+#: ../libdwfl/libdwflP.h:76
+msgid "See ebl_errno (XXX missing)"
+msgstr "Ver ebl_errno (no se encuentra XXX)"
+
+#: ../libdwfl/libdwflP.h:77
+msgid "gzip decompression failed"
+msgstr "falló la descompresión gzip"
+
+#: ../libdwfl/libdwflP.h:78
+msgid "bzip2 decompression failed"
+msgstr "falló la descompresión bzip2"
+
+#: ../libdwfl/libdwflP.h:79
+msgid "LZMA decompression failed"
+msgstr "falló la descompresión LZMA"
+
+#: ../libdwfl/libdwflP.h:80
+msgid "no support library found for machine"
+msgstr "no se ha encontrado una biblioteca de soporte para la máquina"
+
+#: ../libdwfl/libdwflP.h:81
+msgid "Callbacks missing for ET_REL file"
+msgstr "No se encuentran rellamadas para el archivo ET_REL"
+
+#: ../libdwfl/libdwflP.h:82
+msgid "Unsupported relocation type"
+msgstr "Tipo de reubicación no soportada"
+
+#: ../libdwfl/libdwflP.h:83
+msgid "r_offset is bogus"
+msgstr "r_offset se encuentra inutilizable"
+
+#: ../libdwfl/libdwflP.h:84
+#: ../libelf/elf_error.c:132
+#: ../libelf/elf_error.c:192
+msgid "offset out of range"
+msgstr "desplazamiento fuera de rango"
+
+#: ../libdwfl/libdwflP.h:85
+msgid "relocation refers to undefined symbol"
+msgstr "la reubicación hace referencia a un símbolo no definido"
+
+#: ../libdwfl/libdwflP.h:86
+msgid "Callback returned failure"
+msgstr "La rellamada devolvió un fallo"
+
+#: ../libdwfl/libdwflP.h:87
+msgid "No DWARF information found"
+msgstr "No se ha encontrado una información DWARF"
+
+#: ../libdwfl/libdwflP.h:88
+msgid "No symbol table found"
+msgstr "No se ha encontrado una tabla simbólica"
+
+#: ../libdwfl/libdwflP.h:89
+msgid "No ELF program headers"
+msgstr "No existen encabezados de programa ELF"
+
+#: ../libdwfl/libdwflP.h:90
+msgid "address range overlaps an existing module"
+msgstr "el rango de dirección se superpone con un módulo existente"
+
+#: ../libdwfl/libdwflP.h:93
+msgid "image truncated"
+msgstr "imagen truncada"
+
+#: ../libdwfl/libdwflP.h:94
+msgid "ELF file opened"
+msgstr "Archivo ELF abierto"
+
+#: ../libdwfl/libdwflP.h:95
+msgid "not a valid ELF file"
+msgstr "no es un archivo ELF válido"
+
+#: ../libdwfl/libdwflP.h:96
+msgid "cannot handle DWARF type description"
+msgstr "no es posible manipular tipo de descripción DWARF"
+
+#: ../libdwfl/libdwflP.h:97
+msgid "ELF file does not match build ID"
+msgstr "El archivo ELF no coincide con el ID construido"
+
+#: ../libebl/eblbackendname.c:63
+msgid "No backend"
+msgstr "No hay segundo plano (Backend)"
+
+#: ../libebl/eblcorenotetypename.c:107
+#: ../libebl/eblobjecttypename.c:78
+#: ../libebl/eblobjnotetypename.c:86
+#: ../libebl/eblosabiname.c:98
+#: ../libebl/eblsectionname.c:110
+#: ../libebl/eblsectiontypename.c:140
+#: ../libebl/eblsegmenttypename.c:104
+msgid "<unknown>"
+msgstr "<desconocido>"
+
+#: ../libebl/ebldynamictagname.c:126
+#, c-format
+msgid "<unknown>: %#<PRIx64>"
+msgstr "<desconocido>: %#<PRIx64>"
+
+#: ../libebl/eblobjnote.c:76
+#, c-format
+msgid " Build ID: "
+msgstr " Build ID: "
+
+#. A non-null terminated version string.
+#: ../libebl/eblobjnote.c:87
+#, c-format
+msgid " Linker version: %.*s\n"
+msgstr " Versión del Enlazador: %.*s\n"
+
+#: ../libebl/eblobjnote.c:136
+#, c-format
+msgid " OS: %s, ABI: "
+msgstr " OS: %s, ABI: "
+
+#: ../libebl/eblosabiname.c:95
+msgid "Stand alone"
+msgstr "Autónomo"
+
+#: ../libebl/eblsymbolbindingname.c:92
+#: ../libebl/eblsymboltypename.c:98
+#, c-format
+msgid "<unknown>: %d"
+msgstr "<desconocido>: %d"
+
+#: ../libelf/elf_error.c:88
+msgid "unknown version"
+msgstr "versión desconocida"
+
+#: ../libelf/elf_error.c:92
+msgid "unknown type"
+msgstr "tipo desconocido"
+
+#: ../libelf/elf_error.c:96
+msgid "invalid `Elf' handle"
+msgstr "manejo`ELF' inválido"
+
+#: ../libelf/elf_error.c:100
+msgid "invalid size of source operand"
+msgstr "tamaño inválido del operando fuente"
+
+#: ../libelf/elf_error.c:104
+msgid "invalid size of destination operand"
+msgstr "tamaño inválido del operando destino"
+
+#: ../libelf/elf_error.c:108
+#: ../src/readelf.c:4792
+#, c-format
+msgid "invalid encoding"
+msgstr "codificación inválida"
+
+#: ../libelf/elf_error.c:116
+msgid "invalid file descriptor"
+msgstr "descriptor de archivo inválido"
+
+#: ../libelf/elf_error.c:120
+msgid "invalid operation"
+msgstr "operación inválida"
+
+#: ../libelf/elf_error.c:124
+msgid "ELF version not set"
+msgstr "no se estableció la versión de ELF"
+
+#: ../libelf/elf_error.c:136
+msgid "invalid fmag field in archive header"
+msgstr "campo fmag no válido en el encabezamiento del archivo"
+
+#: ../libelf/elf_error.c:140
+msgid "invalid archive file"
+msgstr "fichero de archivo inválido"
+
+#: ../libelf/elf_error.c:144
+msgid "descriptor is not for an archive"
+msgstr "el descriptor no es de un archivo"
+
+#: ../libelf/elf_error.c:148
+msgid "no index available"
+msgstr "no hay índice disponible"
+
+#: ../libelf/elf_error.c:152
+msgid "cannot read data from file"
+msgstr "no se pueden leer los datos del archivo"
+
+#: ../libelf/elf_error.c:156
+msgid "cannot write data to file"
+msgstr "no se puede escribir los datos al archivo"
+
+#: ../libelf/elf_error.c:160
+msgid "invalid binary class"
+msgstr "clase de binario inválida"
+
+#: ../libelf/elf_error.c:164
+msgid "invalid section index"
+msgstr "índice de sección inválido"
+
+#: ../libelf/elf_error.c:168
+msgid "invalid operand"
+msgstr "operando inválido"
+
+#: ../libelf/elf_error.c:172
+msgid "invalid section"
+msgstr "sección inválida"
+
+#: ../libelf/elf_error.c:180
+msgid "executable header not created first"
+msgstr "no se ha creado primero el encabezamiento ejecutable"
+
+#: ../libelf/elf_error.c:184
+msgid "file descriptor disabled"
+msgstr "descriptor de archivo inhabilitada"
+
+#: ../libelf/elf_error.c:188
+msgid "archive/member file descriptor mismatch"
+msgstr "archivo/miembro no coincide el descriptor de archivos"
+
+#: ../libelf/elf_error.c:196
+msgid "cannot manipulate null section"
+msgstr "no se pudo manipular una sección nula"
+
+#: ../libelf/elf_error.c:200
+msgid "data/scn mismatch"
+msgstr "no coinciden los datos/scn"
+
+#: ../libelf/elf_error.c:204
+msgid "invalid section header"
+msgstr "encabezamiento de sección inválida"
+
+#: ../libelf/elf_error.c:208
+#: ../src/readelf.c:6264
+#: ../src/readelf.c:6365
+#, c-format
+msgid "invalid data"
+msgstr "datos inválidos"
+
+#: ../libelf/elf_error.c:212
+msgid "unknown data encoding"
+msgstr "codificación de caracteres desconocida"
+
+#: ../libelf/elf_error.c:216
+msgid "section `sh_size' too small for data"
+msgstr "el tamaño de la sección `sh_size' es demasiado pequeño para los datos "
+
+#: ../libelf/elf_error.c:220
+msgid "invalid section alignment"
+msgstr "alineación de la sección inválida"
+
+#: ../libelf/elf_error.c:224
+msgid "invalid section entry size"
+msgstr "tamaño de la entrada de la sección inválida"
+
+#: ../libelf/elf_error.c:228
+msgid "update() for write on read-only file"
+msgstr "update() para escribir sobre archivo de sólo lectura"
+
+#: ../libelf/elf_error.c:232
+msgid "no such file"
+msgstr "no hay tal archivo"
+
+#: ../libelf/elf_error.c:236
+msgid "only relocatable files can contain section groups"
+msgstr "solo los archivos reubicables pueden contener grupos de sección"
+
+#: ../libelf/elf_error.c:241
+msgid "program header only allowed in executables, shared objects, and core files"
+msgstr "los encabezamientos de los programas solo son permitidos en archivos ejecutables, archivos principales, u objetos compartidos"
+
+#: ../libelf/elf_error.c:248
+msgid "file has no program header"
+msgstr "el archivo no tiene encabezamiento de programa"
+
+#: ../src/addr2line.c:66
+msgid "Output selection options:"
+msgstr "Opciones de selección de salida:"
+
+#: ../src/addr2line.c:67
+msgid "Show only base names of source files"
+msgstr "Mostrar sólo nombres de base de ficheros fuente"
+
+#: ../src/addr2line.c:69
+msgid "Show absolute file names using compilation directory"
+msgstr "Mostrar nombres de fichero absolutos mediante directorio de compilación"
+
+#: ../src/addr2line.c:70
+msgid "Also show function names"
+msgstr "También mostrar nombres de función"
+
+#: ../src/addr2line.c:71
+msgid "Also show symbol or section names"
+msgstr "También mostrar símbolo o nombres de sección"
+
+#: ../src/addr2line.c:73
+msgid "Treat addresses as offsets relative to NAME section."
+msgstr "Manejar direcciones como compensaciones relativas a sección de NOMBRE."
+
+#: ../src/addr2line.c:75
+#: ../src/elfcmp.c:75
+#: ../src/findtextrel.c:75
+#: ../src/nm.c:103
+#: ../src/strings.c:83
+msgid "Miscellaneous:"
+msgstr "Misceláneos:"
+
+#. Short description of program.
+#: ../src/addr2line.c:84
+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)."
+
+#. Strings for arguments in help texts.
+#: ../src/addr2line.c:88
+msgid "[ADDR...]"
+msgstr "[DIREC...]"
+
+#: ../src/addr2line.c:185
+#: ../src/ar.c:289
+#: ../src/elfcmp.c:555
+#: ../src/elflint.c:239
+#: ../src/findtextrel.c:170
+#: ../src/ld.c:957
+#: ../src/nm.c:253
+#: ../src/objdump.c:181
+#: ../src/ranlib.c:136
+#: ../src/readelf.c:449
+#: ../src/size.c:219
+#: ../src/strings.c:227
+#: ../src/strip.c:204
+#: ../src/unstrip.c:234
+#, c-format
+msgid ""
+"Copyright (C) %s Red Hat, Inc.\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+"Copyright (C) %s Red Hat, Inc.\n"
+"El siguiente es un software libre; consulte el código para conocer las condiciones de copiado. NO tiene\n"
+"garantía, ni siquiera para SU COMERCIALIZACIÓN o PARA SER USADO CON UN FIN DETERMINADO.\n"
+
+#: ../src/addr2line.c:190
+#: ../src/ar.c:294
+#: ../src/elfcmp.c:560
+#: ../src/elflint.c:244
+#: ../src/findtextrel.c:175
+#: ../src/ld.c:962
+#: ../src/nm.c:258
+#: ../src/objdump.c:186
+#: ../src/ranlib.c:141
+#: ../src/readelf.c:454
+#: ../src/size.c:224
+#: ../src/strings.c:232
+#: ../src/strip.c:209
+#: ../src/unstrip.c:239
+#, c-format
+msgid "Written by %s.\n"
+msgstr "Escrito por %s.\n"
+
+#: ../src/addr2line.c:405
+#, c-format
+msgid "Section syntax requires exactly one module"
+msgstr "Sintaxis de sección requiere exactamente un módulo"
+
+#: ../src/addr2line.c:428
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside section '%s'"
+msgstr "Compensación %#<PRIxMAX> se encuentra fuera de sección '%s'"
+
+#: ../src/addr2line.c:461
+#, c-format
+msgid "cannot find symbol '%s'"
+msgstr "no se puede encontrar símbolo '%s'"
+
+#: ../src/addr2line.c:466
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
+msgstr "compensación %#<PRIxMAX> se encuentra fuera de contenido de '%s'"
+
+#: ../src/ar.c:76
+msgid "Commands:"
+msgstr "Comandos:"
+
+#: ../src/ar.c:77
+msgid "Delete files from archive."
+msgstr "Borrar archivos de un archivo"
+
+#: ../src/ar.c:78
+msgid "Move files in archive."
+msgstr "Desplazar ficheros en archivo."
+
+#: ../src/ar.c:79
+msgid "Print files in archive."
+msgstr "Imprimir ficheros en archivo."
+
+#: ../src/ar.c:80
+msgid "Quick append files to archive."
+msgstr "Adición rápida de ficheros para archivar"
+
+#: ../src/ar.c:82
+msgid "Replace existing or insert new file into archive."
+msgstr "Remplazar fichero existente o insertar uno nuevo en el archivo."
+
+#: ../src/ar.c:83
+msgid "Display content of archive."
+msgstr "Mostrar contenido de archivo"
+
+#: ../src/ar.c:84
+msgid "Extract files from archive."
+msgstr "extraer ficheros de un archivo"
+
+#: ../src/ar.c:86
+msgid "Command Modifiers:"
+msgstr "Modificadores de comandos:"
+
+#: ../src/ar.c:87
+msgid "Preserve original dates."
+msgstr "Preservar fechas originales."
+
+#: ../src/ar.c:88
+msgid "Use instance [COUNT] of name."
+msgstr "Usar instancia [COUNT] de nombre."
+
+#: ../src/ar.c:90
+msgid "Do not replace existing files with extracted files."
+msgstr "No remplazar los archivos existentes por los archivos extractados."
+
+#: ../src/ar.c:91
+msgid "Allow filename to be truncated if necessary."
+msgstr "Permitir truncamiento del nombre de archivo de ser necesario."
+
+#: ../src/ar.c:93
+msgid "Provide verbose output."
+msgstr "Proporcionar salida detallada"
+
+#: ../src/ar.c:94
+msgid "Force regeneration of symbol table."
+msgstr "Forzar regeneración de tabla de símbolos."
+
+#: ../src/ar.c:95
+msgid "Insert file after [MEMBER]."
+msgstr "Insertar archivo después de [MIEMBRO]."
+
+#: ../src/ar.c:96
+msgid "Insert file before [MEMBER]."
+msgstr "Introducir fichero antes de [MIEMBRO]."
+
+#: ../src/ar.c:97
+msgid "Same as -b."
+msgstr "Igual que -b."
+
+#: ../src/ar.c:98
+msgid "Suppress message when library has to be created."
+msgstr "Suprimir mensaje cuando se tenga que crear la biblioteca."
+
+#: ../src/ar.c:100
+msgid "Use full path for file matching."
+msgstr "Usar la ruta total para fichero coincidente."
+
+#: ../src/ar.c:101
+msgid "Update only older files in archive."
+msgstr "Actualizar sólo ficheros antiguos en archivo."
+
+#. Short description of program.
+#: ../src/ar.c:107
+msgid "Create, modify, and extract from archives."
+msgstr "Crear, modificar, y extraer de archivos."
+
+#. Strings for arguments in help texts.
+#: ../src/ar.c:110
+msgid "[MEMBER] [COUNT] ARCHIVE [FILE...]"
+msgstr "[MIEMBRO] [CONTAR] ARCHIVO [FICHERO...]"
+
+#: ../src/ar.c:192
+#, c-format
+msgid "'a', 'b', and 'i' are only allowed with the 'm' and 'r' options"
+msgstr "'a', 'b', é 'i' sólo se permiten con las opciones 'm' y 'r'."
+
+#: ../src/ar.c:197
+#, c-format
+msgid "MEMBER parameter required for 'a', 'b', and 'i' modifiers"
+msgstr "Parámetro MIEMBRO requerido para modificadores 'a', 'b', e 'i'"
+
+#: ../src/ar.c:213
+#, c-format
+msgid "'N' is only meaningful with the 'x' and 'd' options"
+msgstr "'N' sólo es significativa con las opciones `x' y `d'."
+
+#: ../src/ar.c:218
+#, c-format
+msgid "COUNT parameter required"
+msgstr "Parámetro CONTAR requerido"
+
+#: ../src/ar.c:230
+#, c-format
+msgid "invalid COUNT parameter %s"
+msgstr "Parámetro CONTAR inválido %s"
+
+#: ../src/ar.c:237
+#, c-format
+msgid "'%c' is only meaningful with the 'x' option"
+msgstr "'%c' es sólo significativo con la opción 'x'"
+
+#: ../src/ar.c:243
+#, c-format
+msgid "archive name required"
+msgstr "nombre de archivo requerido"
+
+#: ../src/ar.c:314
+#, c-format
+msgid "More than one operation specified"
+msgstr "Más de una operación especificada"
+
+#: ../src/ar.c:404
+#, c-format
+msgid "cannot open archive '%s'"
+msgstr "Imposible abrir el archivo '%s'"
+
+#: ../src/ar.c:414
+#, c-format
+msgid "cannot open archive '%s': %s"
+msgstr "Imposible abrir el archivo '%s': %s"
+
+#: ../src/ar.c:418
+#, c-format
+msgid "%s: not an archive file"
+msgstr "%s: no es un fichero de archivo"
+
+#: ../src/ar.c:422
+#, c-format
+msgid "cannot stat archive '%s'"
+msgstr "no sepuede stat el archivo '%s'"
+
+#: ../src/ar.c:434
+#, c-format
+msgid "no entry %s in archive\n"
+msgstr "no hay entrada %s en archivo\n"
+
+#: ../src/ar.c:487
+#: ../src/ar.c:929
+#: ../src/ar.c:1129
+#, c-format
+msgid "cannot create hash table"
+msgstr "Falló al crear la tabla de dispersión"
+
+#: ../src/ar.c:494
+#: ../src/ar.c:936
+#: ../src/ar.c:1138
+#, c-format
+msgid "cannot insert into hash table"
+msgstr "no sepuede insertar en tabla de dispersión"
+
+#: ../src/ar.c:502
+#: ../src/ranlib.c:176
+#, c-format
+msgid "cannot stat '%s'"
+msgstr "no se puede stat '%s'"
+
+#: ../src/ar.c:598
+#, c-format
+msgid "cannot read content of %s: %s"
+msgstr "no se puede leer el contenido de %s: %s"
+
+#: ../src/ar.c:641
+#, c-format
+msgid "cannot open %.*s"
+msgstr " Imposible abrir %.*s"
+
+#: ../src/ar.c:663
+#, c-format
+msgid "failed to write %s"
+msgstr "Falló al escribir %s"
+
+#: ../src/ar.c:675
+#, c-format
+msgid "cannot change mode of %s"
+msgstr "No se puede cambiar el modo de %s"
+
+#: ../src/ar.c:691
+#, c-format
+msgid "cannot change modification time of %s"
+msgstr "No puede cambiar tiempo de modificación de %s"
+
+#: ../src/ar.c:737
+#, c-format
+msgid "cannot rename temporary file to %.*s"
+msgstr "no sepuede renombrar fichero temporal para %.*s"
+
+#: ../src/ar.c:773
+#: ../src/ar.c:1021
+#: ../src/ar.c:1419
+#: ../src/ranlib.c:250
+#, c-format
+msgid "cannot create new file"
+msgstr "no sepuede crear fichero nuevo"
+
+#: ../src/ar.c:1220
+#, c-format
+msgid "position member %s not found"
+msgstr "no se encuentra miembro de posición %s "
+
+#: ../src/ar.c:1230
+#, c-format
+msgid "%s: no entry %s in archive!\n"
+msgstr "%s: ¡no hay entrada %s en archive!\n"
+
+#: ../src/ar.c:1259
+#: ../src/ldgeneric.c:519
+#: ../src/objdump.c:257
+#, c-format
+msgid "cannot open %s"
+msgstr "no sepuede abrir %s"
+
+#: ../src/ar.c:1264
+#, c-format
+msgid "cannot stat %s"
+msgstr "no sepuede efectuar stat %s"
+
+#: ../src/ar.c:1270
+#, c-format
+msgid "%s is no regular file"
+msgstr " %s no es un fichero ordinario "
+
+#: ../src/ar.c:1283
+#, c-format
+msgid "cannot get ELF descriptor for %s: %s\n"
+msgstr "no sepuede obtener descriptor ELF para %s: %s\n"
+
+#: ../src/ar.c:1302
+#, c-format
+msgid "cannot read %s: %s"
+msgstr "no sepuede leer %s: %s"
+
+#. The archive is too big.
+#: ../src/arlib.c:215
+#, c-format
+msgid "the archive '%s' is too large"
+msgstr " El archivo '%s' es demasiado grande"
+
+#: ../src/arlib.c:228
+#, c-format
+msgid "cannot read ELF header of %s(%s): %s"
+msgstr "no se puede leer el encabezamiento ELF de %s(%s): %s"
+
+#: ../src/elfcmp.c:69
+msgid "Control options:"
+msgstr "Opciones de control:"
+
+#: ../src/elfcmp.c:70
+msgid "Control treatment of gaps in loadable segments [ignore|match] (default: ignore)"
+msgstr "Tratamiento de control de brechas en segmento cargables [ignorar|coincidencia] (por defecto: ignorar)"
+
+#: ../src/elfcmp.c:72
+msgid "Ignore permutation of buckets in SHT_HASH section"
+msgstr "Ignorar permutación de cubetas en sección SHT_HASH"
+
+#: ../src/elfcmp.c:73
+msgid "Output nothing; yield exit status only"
+msgstr "Nada de salida; producir estado de salida únicamente"
+
+#. Short description of program.
+#: ../src/elfcmp.c:80
+msgid "Compare relevant parts of two ELF files for equality."
+msgstr "Comparar partes relevantes de dos ficheros ELF para igualdad."
+
+#. Strings for arguments in help texts.
+#: ../src/elfcmp.c:84
+msgid "FILE1 FILE2"
+msgstr "FICHERO1 FICHERO2"
+
+#: ../src/elfcmp.c:140
+msgid "Invalid number of parameters.\n"
+msgstr "Número inválido de parámetros.\n"
+
+#: ../src/elfcmp.c:168
+#: ../src/elfcmp.c:173
+#, c-format
+msgid "cannot get ELF header of '%s': %s"
+msgstr "no se puede obtener encabezamiento de '%s': %s"
+
+#: ../src/elfcmp.c:190
+#, c-format
+msgid "%s %s diff: ELF header"
+msgstr "%s %s diff: encabezamiento ELF"
+
+#: ../src/elfcmp.c:198
+#: ../src/elfcmp.c:201
+#, c-format
+msgid "cannot get section count of '%s': %s"
+msgstr "no se puede obtener un conteo de sección en '%s': %s"
+
+#: ../src/elfcmp.c:206
+#, c-format
+msgid "%s %s diff: section count"
+msgstr "%s %s diff: conteo de sección"
+
+#: ../src/elfcmp.c:214
+#: ../src/elfcmp.c:217
+#, c-format
+msgid "cannot get program header count of '%s': %s"
+msgstr "no se puede obtener un conteo de encabezado de programa de '%s': %s"
+
+#: ../src/elfcmp.c:222
+#, c-format
+msgid "%s %s diff: program header count"
+msgstr "%s %s diff: encabezado de programa"
+
+#: ../src/elfcmp.c:281
+#, c-format
+msgid "%s %s differ: section header"
+msgstr "%s %s differ: encabezamiento de sección"
+
+#: ../src/elfcmp.c:309
+#: ../src/elfcmp.c:315
+#, c-format
+msgid "cannot get content of section %zu in '%s': %s"
+msgstr "No se puede obtener contenido de sección %zu en '%s': %s"
+
+#: ../src/elfcmp.c:331
+#: ../src/elfcmp.c:337
+#, c-format
+msgid "cannot get symbol in '%s': %s"
+msgstr "No se puede obtener símbolo en '%s': %s"
+
+#: ../src/elfcmp.c:358
+#, c-format
+msgid "%s %s differ: symbol table [%zu]"
+msgstr "%s %s differ: tabla de símbolos [%zu]"
+
+#: ../src/elfcmp.c:361
+#, c-format
+msgid "%s %s differ: symbol table [%zu,%zu]"
+msgstr "%s %s differ: tabla de símbolos [%zu,%zu]"
+
+#: ../src/elfcmp.c:409
+#, c-format
+msgid "%s %s differ: section [%zu] '%s' content"
+msgstr "%s %s differ: sección [%zu] contenido '%s'"
+
+#: ../src/elfcmp.c:413
+#, c-format
+msgid "%s %s differ: section [%zu,%zu] '%s' content"
+msgstr "%s %s differ: sección [%zu,%zu] contenido '%s'"
+
+#: ../src/elfcmp.c:429
+#, c-format
+msgid "%s %s differ: unequal amount of important sections"
+msgstr "%s %s differ: cantidad desigual de secciones importantes"
+
+#: ../src/elfcmp.c:463
+#: ../src/elfcmp.c:468
+#, c-format
+msgid "cannot load data of '%s': %s"
+msgstr "no se pueden cargar los datos de '%s': %s"
+
+#: ../src/elfcmp.c:487
+#: ../src/elfcmp.c:493
+#, c-format
+msgid "cannot get program header entry %d of '%s': %s"
+msgstr "no se puede obtener entrada de encabezamiento de programa %d de '%s': %s"
+
+#: ../src/elfcmp.c:499
+#, c-format
+msgid "%s %s differ: program header %d"
+msgstr "%s %s differ: encabezamiento de programa %d"
+
+#: ../src/elfcmp.c:524
+#, c-format
+msgid "%s %s differ: gap"
+msgstr "%s %s differ: brecha"
+
+#: ../src/elfcmp.c:583
+#, c-format
+msgid "Invalid value '%s' for --gaps parameter."
+msgstr "Valor inválido '%s' para parámetro --gaps"
+
+#: ../src/elfcmp.c:607
+#: ../src/findtextrel.c:229
+#: ../src/ldgeneric.c:1767
+#: ../src/ldgeneric.c:4257
+#: ../src/nm.c:363
+#: ../src/ranlib.c:169
+#: ../src/size.c:301
+#: ../src/strings.c:183
+#: ../src/strip.c:433
+#: ../src/strip.c:468
+#: ../src/unstrip.c:1900
+#: ../src/unstrip.c:1929
+#, c-format
+msgid "cannot open '%s'"
+msgstr "Imposible abrir '%s'"
+
+#: ../src/elfcmp.c:611
+#: ../src/findtextrel.c:236
+#: ../src/ranlib.c:186
+#, c-format
+msgid "cannot create ELF descriptor for '%s': %s"
+msgstr "No puede crear descriptor ELF para '%s': %s"
+
+#: ../src/elfcmp.c:616
+#, c-format
+msgid "cannot create EBL descriptor for '%s'"
+msgstr "no se puede crear el descriptor EBL para '%s'"
+
+#: ../src/elfcmp.c:634
+#, c-format
+msgid "cannot get section header of section %zu: %s"
+msgstr "No se puede obtener el encabezamiento de sección %zu: %s"
+
+#: ../src/elfcmp.c:644
+#, c-format
+msgid "cannot get content of section %zu: %s"
+msgstr "No se puede obtener contenido de sección %zu: %s"
+
+#: ../src/elfcmp.c:654
+#: ../src/elfcmp.c:668
+#, c-format
+msgid "cannot get relocation: %s"
+msgstr "No se puede obtener reubicación: %s"
+
+#: ../src/elflint.c:72
+msgid "Be extremely strict, flag level 2 features."
+msgstr "Sea extremadamente estricto, característica de marca de nivel 2."
+
+#: ../src/elflint.c:73
+msgid "Do not print anything if successful"
+msgstr "No imprime nada si está correcto"
+
+#: ../src/elflint.c:74
+msgid "Binary is a separate debuginfo file"
+msgstr "Binario es un archivo debuginfo independiente"
+
+#: ../src/elflint.c:76
+msgid "Binary has been created with GNU ld and is therefore known to be broken in certain ways"
+msgstr "Binario ha sido creado con GNU Id y por lo tanto se sabe que puede estar roto de alguna forma"
+
+#. Short description of program.
+#: ../src/elflint.c:82
+msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
+msgstr "Chequeo minucioso de ficheros ELF de acuerdo con gABI/psABI "
+
+#. Strings for arguments in help texts.
+#: ../src/elflint.c:86
+#: ../src/readelf.c:118
+msgid "FILE..."
+msgstr "FICHERO..."
+
+#: ../src/elflint.c:159
+#: ../src/readelf.c:272
+#, c-format
+msgid "cannot open input file"
+msgstr "no se puede abrir el fichero de entrada"
+
+#: ../src/elflint.c:166
+#, c-format
+msgid "cannot generate Elf descriptor: %s\n"
+msgstr "no se puede crear descriptor ELF: %s\n"
+
+#: ../src/elflint.c:185
+#, c-format
+msgid "error while closing Elf descriptor: %s\n"
+msgstr "error al cerrar el descriptor ELF: %s\n"
+
+#: ../src/elflint.c:189
+msgid "No errors"
+msgstr "No hay errores"
+
+#: ../src/elflint.c:223
+#: ../src/readelf.c:425
+msgid "Missing file name.\n"
+msgstr "Falta el nombre de archivo.\n"
+
+#: ../src/elflint.c:302
+#, c-format
+msgid " error while freeing sub-ELF descriptor: %s\n"
+msgstr " error al liberar descriptor sub-ELF: %s\n"
+
+#. We cannot do anything.
+#: ../src/elflint.c:310
+#, 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:370
+#, 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:375
+#, 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:379
+#, 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:385
+#, 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:391
+#, c-format
+msgid "unsupport ABI version e_ident[%d] == %d\n"
+msgstr "Versión incompatible ABI e_ident[%d] == %d\n"
+
+#: ../src/elflint.c:396
+#, c-format
+msgid "e_ident[%zu] is not zero\n"
+msgstr "e_ident[%zu] no es cero\n"
+
+#: ../src/elflint.c:401
+#, c-format
+msgid "unknown object file type %d\n"
+msgstr "tipo de fichero objeto desconocido %d\n"
+
+#: ../src/elflint.c:408
+#, c-format
+msgid "unknown machine type %d\n"
+msgstr "tipo de máquina desconocido %d\n"
+
+#: ../src/elflint.c:412
+#, c-format
+msgid "unknown object file version\n"
+msgstr "versión de fichero objeto desconocido\n"
+
+#: ../src/elflint.c:418
+#, c-format
+msgid "invalid program header offset\n"
+msgstr "Compensación de encabezamiento de programa inválida\n"
+
+#: ../src/elflint.c:420
+#, 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:424
+#, 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:432
+#, 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:435
+#, c-format
+msgid "section header table must be present\n"
+msgstr "tabla de encabezamiento de sección debe estar presente\n"
+
+#: ../src/elflint.c:449
+#, 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:466
+#, c-format
+msgid "invalid section header index\n"
+msgstr "Índice de sección de encabezamiento inválido\n"
+
+#: ../src/elflint.c:480
+#, 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:489
+#, c-format
+msgid "invalid machine flags: %s\n"
+msgstr "Indicadores de máquina inválidos: %s\n"
+
+#: ../src/elflint.c:496
+#: ../src/elflint.c:513
+#, c-format
+msgid "invalid ELF header size: %hd\n"
+msgstr "tamaño inválido del encabezamiento ELF: %hd\n"
+
+#: ../src/elflint.c:499
+#: ../src/elflint.c:516
+#, c-format
+msgid "invalid program header size: %hd\n"
+msgstr "tamaño inválido del encabezamiento del programa: %hd\n"
+
+#: ../src/elflint.c:502
+#: ../src/elflint.c:519
+#, 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:505
+#: ../src/elflint.c:522
+#, c-format
+msgid "invalid section header size: %hd\n"
+msgstr "tamaño inválido del encabezamiento de sección: %hd\n"
+
+#: ../src/elflint.c:508
+#: ../src/elflint.c:525
+#, 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:569
+#, c-format
+msgid "section [%2d] '%s': section with SHF_GROUP flag set not part of a section group\n"
+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:573
+#, c-format
+msgid "section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
+msgstr "sección [%2d] '%s': el grupo de sección [%2zu] '%s' no precede al miembro de grupo\n"
+
+#: ../src/elflint.c:589
+#: ../src/elflint.c:1432
+#: ../src/elflint.c:1482
+#: ../src/elflint.c:1591
+#: ../src/elflint.c:2185
+#: ../src/elflint.c:2699
+#: ../src/elflint.c:2860
+#: ../src/elflint.c:2990
+#: ../src/elflint.c:3162
+#: ../src/elflint.c:4062
+#, 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:602
+#: ../src/elflint.c:1598
+#, c-format
+msgid "section [%2d] '%s': referenced as string table for section [%2d] '%s' but type is not SHT_STRTAB\n"
+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:625
+#, c-format
+msgid "section [%2d] '%s': symbol table cannot have more than one extended index section\n"
+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:636
+#, 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:645
+#, 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:650
+#: ../src/elflint.c:653
+#: ../src/elflint.c:656
+#: ../src/elflint.c:659
+#: ../src/elflint.c:662
+#: ../src/elflint.c:665
+#, 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:668
+#, 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:678
+#, 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:687
+#, 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:700
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: too large section index but no extended section index section\n"
+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:706
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in st_shndx (%<PRIu32>)\n"
+msgstr "Sección [%2d] '%s': símbolo %zu: XINDEX es utilizado para índice que pueda caber en st_shndx (%<PRIu32>)\n"
+
+#. || sym->st_shndx > SHN_HIRESERVE always false
+#: ../src/elflint.c:718
+#, 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:726
+#, 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:732
+#, 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:737
+#, 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:745
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
+msgstr "sección [%2d] '%s': símbolo %zu: COMMON solo es permitido en archivos realojables\n"
+
+#: ../src/elflint.c:749
+#, 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:753
+#, 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:785
+#, 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:791
+#: ../src/elflint.c:816
+#: ../src/elflint.c:859
+#, c-format
+msgid "section [%2d] '%s': symbol %zu does not fit completely in referenced section [%2d] '%s'\n"
+msgstr "Sección [%2d] '%s': símbolo %zu no se ajusta totalmente en la sección [%2d] '%s'\n"
+
+#: ../src/elflint.c:800
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have SHF_TLS flag set\n"
+msgstr "Sección [%2d] '%s': símbolo %zu: sección de referencia [%2d] '%s' no tiene establecida bandera SHF_TLS\n"
+
+#: ../src/elflint.c:810
+#: ../src/elflint.c:852
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section [%2d] '%s'\n"
+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:837
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
+msgstr "Sección [%2d] '%s': símbolo %zu: símbolo TLS, pero no hay entrada de programa TLS\n"
+
+#: ../src/elflint.c:845
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] '%s'\n"
+msgstr "Sección [%2d] '%s': símbolo %zu: st_value falta sección de referencia [%2d] '%s'\n"
+
+#: ../src/elflint.c:872
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: local symbol outside range described in sh_info\n"
+msgstr "Sección [%2d] '%s': símbolo %zu: símbolo local fuera del rango descrito en sh_info\n"
+
+#: ../src/elflint.c:879
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: non-local symbol outside range described in sh_info\n"
+msgstr "Sección [%2d] '%s': símbolo %zu: símbolo non-local fuera del rango descrito en sh_info\n"
+
+#: ../src/elflint.c:886
+#, 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:936
+#, c-format
+msgid "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section [%2d]\n"
+msgstr "Sección [%2d] '%s': símbolo _GLOBAL_OFFSET_TABLE_ se refiere a sección errada [%2d]\n"
+
+#: ../src/elflint.c:943
+#, c-format
+msgid "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] '%s'\n"
+msgstr "Sección [%2d] '%s': símbolo _GLOBAL_OFFSET_TABLE_ se refiere a sección [%2d] '%s'\n"
+
+#. This test is more strict than the psABIs which
+#. usually allow the symbol to be in the middle of
+#. the .got section, allowing negative offsets.
+#: ../src/elflint.c:959
+#, c-format
+msgid "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not match %s section address %#<PRIx64>\n"
+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:966
+#, c-format
+msgid "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not match %s section size %<PRIu64>\n"
+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:974
+#, c-format
+msgid "section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got section\n"
+msgstr "Sección [%2d] '%s': símbolo _GLOBAL_OFFSET_TABLE_ presente, pero no. sección got\n"
+
+#: ../src/elflint.c:990
+#, c-format
+msgid "section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic segment address %#<PRIx64>\n"
+msgstr "sección [%2d] '%s': Valor de símbolo _DYNAMIC_ %#<PRIx64> no coincide con la dirección de segmento%#<PRIx64>\n"
+
+#: ../src/elflint.c:997
+#, c-format
+msgid "section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic segment size %<PRIu64>\n"
+msgstr "Sección [%2d] '%s': tamaño de símbolo _DYNAMIC %<PRIu64> no coincide con tamaño de segmento %<PRIu64>\n"
+
+#: ../src/elflint.c:1010
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-default visibility\n"
+msgstr "Sección [%2d] '%s': símbolo %zu: símbolo en tabla de símbolos dinámicos sin visibilidad predeterminada\n"
+
+#: ../src/elflint.c:1014
+#, 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:1059
+#, 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:1068
+#: ../src/elflint.c:1120
+#, 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:1093
+#: ../src/elflint.c:1145
+#, c-format
+msgid "section [%2d] '%s': relative relocations after index %d as specified by DT_RELCOUNT\n"
+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:1099
+#: ../src/elflint.c:1151
+#, c-format
+msgid "section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT specified %d relative relocations\n"
+msgstr "Sección [%2d] '%s': reubicación no-relativa en %zu de índice; DT_RELCOUNT especificado %d reubicaciones relativas\n"
+
+#: ../src/elflint.c:1111
+#, 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:1193
+#, 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:1206
+#, 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:1214
+#, 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:1221
+#, 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:1228
+#, 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:1288
+#, 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:1315
+#, 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:1323
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: relocation type invalid for the file type\n"
+msgstr "Sección [%2d] '%s': reubicación %zu: tipo de reubicación inválido para el tipo de archivo\n"
+
+#: ../src/elflint.c:1331
+#, 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:1349
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can be used with %s\n"
+msgstr "Sección [%2d] '%s': reubicación %zu: sólo el símbolo '_GLOBAL_OFFSET_TABLE_' puede utilizarse con %s\n"
+
+#: ../src/elflint.c:1366
+#, 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:1381
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: copy relocation against symbol of type %s\n"
+msgstr "Sección [%2d] '%s': reubicación %zu: reubicación de copia con símbolo de tipo %s\n"
+
+#: ../src/elflint.c:1402
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: read-only section modified but text relocation flag not set\n"
+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:1417
+#, 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:1456
+#: ../src/elflint.c:1506
+#, 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:1586
+#, c-format
+msgid "more than one dynamic section present\n"
+msgstr "más de una sección dinámica presente\n"
+
+#: ../src/elflint.c:1604
+#, 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:1609
+#: ../src/elflint.c:1901
+#, 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:1619
+#, 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:1627
+#, 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:1634
+#, c-format
+msgid "section [%2d] '%s': entry %zu: unknown tag\n"
+msgstr "Sección [%2d] '%s': entrada %zu: etiqueta desconocida\n"
+
+#: ../src/elflint.c:1645
+#, 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:1655
+#, 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:1673
+#, c-format
+msgid "section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
+msgstr "Sección [%2d] '%s': entrada %zu: el valor DT_PLTREL debe ser DT_REL or DT_RELA\n"
+
+#: ../src/elflint.c:1695
+#, c-format
+msgid "section [%2d] '%s': entry %zu: pointer does not match address of section [%2d] '%s' referenced by sh_link\n"
+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:1738
+#, 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:1753
+#, c-format
+msgid "section [%2d] '%s': entry %zu: %s value must be valid offset in section [%2d] '%s'\n"
+msgstr "sección [%2d] '%s': entrada %zu: valor %s debe ser compensación válida en sección [%2d] '%s'\n"
+
+#: ../src/elflint.c:1773
+#: ../src/elflint.c:1801
+#, 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:1785
+#, 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:1794
+#, 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:1809
+#: ../src/elflint.c:1816
+#, 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:1826
+#: ../src/elflint.c:1830
+#, 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:1836
+#, 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:1847
+#: ../src/elflint.c:1851
+#: ../src/elflint.c:1855
+#: ../src/elflint.c:1859
+#, 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:1871
+#, c-format
+msgid "section [%2d] '%s': only relocatable files can have extended section index\n"
+msgstr "Sección [%2d] '%s': sólo los archivos reubicables pueden tener índice de sección extendido\n"
+
+#: ../src/elflint.c:1881
+#, 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:1886
+#, c-format
+msgid "cannot get data for symbol section\n"
+msgstr "no se puede obtener sección para símbolos\n"
+
+#: ../src/elflint.c:1889
+#, 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:1896
+#, 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:1911
+#, c-format
+msgid "section [%2d] '%s': extended section index in section [%2zu] '%s' refers to same symbol table\n"
+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:1922
+#, 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:1934
+#, c-format
+msgid "cannot get data for symbol %zu\n"
+msgstr "no puede obtener datos para símbolo %zu\n"
+
+#: ../src/elflint.c:1939
+#, 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:1955
+#: ../src/elflint.c:1996
+#, c-format
+msgid "section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
+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:1967
+#: ../src/elflint.c:2008
+#, 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:1976
+#: ../src/elflint.c:2017
+#, 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:1982
+#, 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:2023
+#, 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:2038
+#, 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:2049
+#, c-format
+msgid "section [%2d] '%s': hash table section is too small (is %ld, expected at 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:2057
+#, 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:2089
+#, c-format
+msgid "section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
+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:2110
+#, c-format
+msgid "section [%2d] '%s': symbol %u referenced in chain for bucket %zu is undefined\n"
+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:2121
+#, c-format
+msgid "section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
+msgstr "Sección [%2d] '%s': valor de dispersión para símbolo %u en cadena para cubeta %zu está errado\n"
+
+#: ../src/elflint.c:2152
+#, 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:2157
+#, c-format
+msgid "section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
+msgstr "Sección [%2d] '%s': referencia de símbolo en cadena para cubeta %zu fuera de límites\n"
+
+#: ../src/elflint.c:2163
+#, 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:2176
+#, 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:2194
+#, 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:2202
+#, 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:2207
+#, 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:2212
+#, c-format
+msgid "section [%2d] '%s': hash table has not even room for initial administrative entries\n"
+msgstr "Sección [%2d] '%s': tabla de dispersión no tiene ni siquiera espacio para entradas administrativas iniciales\n"
+
+#: ../src/elflint.c:2260
+#, 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:2338
+#: ../src/elflint.c:2342
+#, 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:2349
+#, c-format
+msgid "symbol %d referenced in new hash table in [%2zu] '%s' but not in old hash table in [%2zu] '%s'\n"
+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:2361
+#, c-format
+msgid "symbol %d referenced in old hash table in [%2zu] '%s' but not in new hash table in [%2zu] '%s'\n"
+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:2377
+#, 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:2397
+#, c-format
+msgid "section [%2d] '%s': section groups only allowed in relocatable object files\n"
+msgstr "Sección [%2d] '%s': grupos de sección sólo permitidos en archivos de objeto reubicables\n"
+
+#: ../src/elflint.c:2408
+#, 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:2413
+#, 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:2419
+#, 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:2424
+#, c-format
+msgid "section [%2d] '%s': sh_flags not zero\n"
+msgstr "Sección [%2d] '%s': sh_flags no cero\n"
+
+#: ../src/elflint.c:2431
+#, 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:2436
+#, 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:2442
+#, 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:2448
+#, 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:2457
+#, 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:2462
+#, 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:2468
+#, 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:2472
+#, 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:2483
+#, 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:2495
+#, 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:2504
+#, 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:2511
+#, 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:2517
+#, c-format
+msgid "section [%2d] '%s': element %Zu references section [%2d] '%s' without SHF_GROUP flag set\n"
+msgstr "Sección [%2d] '%s': elemento %Zu hace referencia a sección [%2d] '%s' sin establecer bandera SHF_GROUP\n"
+
+#: ../src/elflint.c:2524
+#, 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:2713
+#, c-format
+msgid "section [%2d] '%s' refers in sh_link to section [%2d] '%s' which is no dynamic symbol table\n"
+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:2724
+#, c-format
+msgid "section [%2d] '%s' has different number of entries than symbol table [%2d] '%s'\n"
+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:2740
+#, 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:2756
+#, 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:2764
+#, 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:2778
+#, 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:2783
+#, c-format
+msgid "section [%2d] '%s': symbol %d: version index %d is for defined version\n"
+msgstr "Sección [%2d] '%s': símbolo %d: índice de versión %d es para versión definida\n"
+
+#: ../src/elflint.c:2793
+#, c-format
+msgid "section [%2d] '%s': symbol %d: version index %d is for requested version\n"
+msgstr "Sección [%2d] '%s': símbolo %d: índice de versión %d es para la versión solicitada\n"
+
+#: ../src/elflint.c:2845
+#, 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:2853
+#: ../src/elflint.c:2982
+#, 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:2876
+#: ../src/elflint.c:3034
+#, 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:2882
+#: ../src/elflint.c:3040
+#, 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:2890
+#, 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:2898
+#, 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:2910
+#, 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:2917
+#, c-format
+msgid "section [%2d] '%s': auxiliary entry %d of entry %d has invalid name reference\n"
+msgstr "Sección [%2d] '%s': entrada auxiliar %d de entrada %d tiene referencia de nombre inválida\n"
+
+#: ../src/elflint.c:2924
+#, c-format
+msgid "section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: %#x, expected %#x\n"
+msgstr "Sección [%2d] '%s': entrada auxiliar %d de entrada %d tiene valor de dispersión: %#x, esperado %#x\n"
+
+#: ../src/elflint.c:2934
+#, c-format
+msgid "section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version name '%s'\n"
+msgstr "sección [%2d] '%s': entrada auxiliar %d de entrada %d tiene nombre duplicado '%s'\n"
+
+#: ../src/elflint.c:2945
+#, c-format
+msgid "section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
+msgstr "sección [%2d] '%s': entrada auxiliar %d de entrada %d tiene próximo campo errado\n"
+
+#: ../src/elflint.c:2961
+#: ../src/elflint.c:3119
+#, 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:2974
+#, 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:3019
+#, 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:3023
+#, 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:3029
+#, 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:3053
+#, 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:3060
+#, 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:3069
+#, 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:3088
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
+msgstr "Sección [%2d] '%s': entrada %d tiene referencia de nombre inválida en datos auxiliares\n"
+
+#: ../src/elflint.c:3103
+#, 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:3125
+#, 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:3141
+#, 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:3154
+#, 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:3175
+#, c-format
+msgid "section [%2d] '%s': unrecognized attribute format\n"
+msgstr "Sección[%2d] '%s': formato de atributo no reconocido\n"
+
+#: ../src/elflint.c:3191
+#, c-format
+msgid "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
+msgstr "Sección[%2d] '%s': compensación %zu: campo de longitud cero en sección de atributo\n"
+
+#: ../src/elflint.c:3200
+#, 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:3212
+#, 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:3229
+#, c-format
+msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
+msgstr "Sección [%2d] '%s': compensación %zu: sin fin ULEB128 en etiqueta de sub-sección de atributo\n"
+
+#: ../src/elflint.c:3238
+#, 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:3247
+#, c-format
+msgid "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
+msgstr "Sección [%2d] '%s': compensación %zu: campo de longitud cero length en sub-sección de atributo\n"
+
+#: ../src/elflint.c:3260
+#, c-format
+msgid "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
+msgstr "Sección [%2d] '%s': compensación %zu: longitud inválida en sub-sección de atributo\n"
+
+#. Tag_File
+#: ../src/elflint.c:3271
+#, c-format
+msgid "section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
+msgstr "Sección[%2d] '%s': compensación %zu: sub-sección de atributo tiene etiqueta inesperada %u\n"
+
+#: ../src/elflint.c:3289
+#, 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:3300
+#, 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:3313
+#, 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:3317
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
+msgstr "Sección [%2d] '%s': compensación %zu: no reconocido %s valor de atributo %<PRIu64>\n"
+
+#: ../src/elflint.c:3327
+#, 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:3333
+#, c-format
+msgid "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
+msgstr "Sección [%2d] '%s': compensación %zu: extra bytes después de la última sección de atributo\n"
+
+#: ../src/elflint.c:3422
+#, 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:3426
+#, c-format
+msgid "zeroth section has nonzero name\n"
+msgstr "Sección zeroth tiene nombre nonzero\n"
+
+#: ../src/elflint.c:3428
+#, c-format
+msgid "zeroth section has nonzero type\n"
+msgstr "Sección zeroth tiene tipo nonzero\n"
+
+#: ../src/elflint.c:3430
+#, c-format
+msgid "zeroth section has nonzero flags\n"
+msgstr "Sección zeroth tiene banderas nonzero\n"
+
+#: ../src/elflint.c:3432
+#, c-format
+msgid "zeroth section has nonzero address\n"
+msgstr "Sección zeroth tiene dirección nonzero\n"
+
+#: ../src/elflint.c:3434
+#, c-format
+msgid "zeroth section has nonzero offset\n"
+msgstr "Sección zeroth tiene compensación nonzero\n"
+
+#: ../src/elflint.c:3436
+#, c-format
+msgid "zeroth section has nonzero align value\n"
+msgstr "Sección zeroth tiene valor de alineación nonzero\n"
+
+#: ../src/elflint.c:3438
+#, 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:3441
+#, c-format
+msgid "zeroth section has nonzero size value while ELF header has nonzero shnum value\n"
+msgstr "Sección zeroth tiene valor de tamaño nonzero mientras que el encabezamiento ELF tiene valor shnum nonzero\n"
+
+#: ../src/elflint.c:3445
+#, c-format
+msgid "zeroth section has nonzero link value while ELF header does not signal overflow in shstrndx\n"
+msgstr "Sección zeroth tiene valor de enlace nonzero mientras que el encabezamiento ELF no señala sobreflujo en shstrndx\n"
+
+#: ../src/elflint.c:3449
+#, c-format
+msgid "zeroth section has nonzero link value while ELF header does not signal overflow in phnum\n"
+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:3466
+#, 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:3475
+#, c-format
+msgid "section [%2zu]: invalid name\n"
+msgstr "Sección [%2zu]: nombre inválido\n"
+
+#: ../src/elflint.c:3502
+#, 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:3518
+#, 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:3535
+#, c-format
+msgid "section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
+msgstr "Sección [%2zu] '%s' tiene banderas erradas: %s esperado y posiblemente %s, es %s\n"
+
+#: ../src/elflint.c:3553
+#, c-format
+msgid "section [%2zu] '%s' present in object file\n"
+msgstr "Sección [%2zu] '%s' presente en archivo objeto\n"
+
+#: ../src/elflint.c:3559
+#: ../src/elflint.c:3591
+#, c-format
+msgid "section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
+msgstr "Sección [%2zu] '%s' tiene bandera SHF_ALLOC establecida pero no es un segmento cargable\n"
+
+#: ../src/elflint.c:3564
+#: ../src/elflint.c:3596
+#, c-format
+msgid "section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable segments\n"
+msgstr "Sección [%2zu] '%s' no tiene bandera SHF_ALLOC establecida pero hay segmentos cargables\n"
+
+#: ../src/elflint.c:3572
+#, c-format
+msgid "section [%2zu] '%s' is extension section index table in non-object file\n"
+msgstr "Sección [%2zu] '%s' es tabla de índice de sección de extensión en archivo no-objeto\n"
+
+#: ../src/elflint.c:3615
+#, 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:3620
+#, c-format
+msgid "cannot get section header\n"
+msgstr "no se puede obtener encabezamiento de sección\n"
+
+#: ../src/elflint.c:3630
+#, c-format
+msgid "section [%2zu] '%s' has unsupported type %d\n"
+msgstr "sección [%2zu] '%s' tiene tipo %d incompatible \n"
+
+#: ../src/elflint.c:3644
+#, c-format
+msgid "section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
+msgstr "Sección [%2zu] '%s' contiene bandera(s) de procesador-específico inválidas %#<PRIx64>\n"
+
+#: ../src/elflint.c:3651
+#, 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:3659
+#, 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:3667
+#, 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:3672
+#, 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:3679
+#, 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:3684
+#, 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:3702
+#, 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:3711
+#, 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:3738
+#, c-format
+msgid "section [%2zu] '%s' not fully contained in segment of program header entry %d\n"
+msgstr "Sección [%2zu] '%s' no contenida totalmente en segmento de entrada de encabezamiento de programa %d\n"
+
+#: ../src/elflint.c:3746
+#, c-format
+msgid "section [%2zu] '%s' has type NOBITS but is read from the file in segment of program header entry %d\n"
+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:3755
+#, 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 "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:3766
+#, 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:3776
+#, 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:3786
+#, c-format
+msgid "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
+msgstr "Sección [%2zu] '%s': asignación de bandera establecida pero sección no en ningún segmento cargado\n"
+
+#: ../src/elflint.c:3792
+#, c-format
+msgid "section [%2zu] '%s': ELF header says this is the section header string table but type is not SHT_TYPE\n"
+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:3800
+#, c-format
+msgid "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
+msgstr "sección [%2zu] '%s': ficheros reubicables no pueden tener tablas de símbolos dinámicos\n"
+
+#: ../src/elflint.c:3851
+#, 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:3874
+#, 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:3885
+#, 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:3891
+#, 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:3902
+#, c-format
+msgid "no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section exist\n"
+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:3915
+#, c-format
+msgid "duplicate version index %d\n"
+msgstr "Duplicar índice de versión %d\n"
+
+#: ../src/elflint.c:3929
+#, 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:3978
+#, 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:3982
+#, c-format
+msgid "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
+msgstr "Sección [%2d] '%s': tipo de nota de fichero core desconocido %<PRIu32> en compensación %Zu\n"
+
+#: ../src/elflint.c:4005
+#, 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:4009
+#, c-format
+msgid "section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr "Sección [%2d] '%s': tipo de nota de fichero objeto desconocido %<PRIu32> en compensación %Zu\n"
+
+#: ../src/elflint.c:4026
+#, 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:4045
+#, 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:4048
+#, 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:4069
+#, 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:4076
+#, 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:4079
+#, 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:4097
+#, c-format
+msgid "only executables, shared objects, and core files can have program headers\n"
+msgstr "Sólo ejecutables, objetos compartidos y ficheros core pueden tener encabezamientos de programas\n"
+
+#: ../src/elflint.c:4112
+#, 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:4121
+#, 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:4132
+#, 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:4140
+#, 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:4147
+#, c-format
+msgid "static executable cannot have dynamic sections\n"
+msgstr "ejecutable estático no puede tener secciones dinámicas\n"
+
+#: ../src/elflint.c:4161
+#, 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:4164
+#, 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:4174
+#, 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:4195
+#, 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:4198
+#, 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:4206
+#: ../src/elflint.c:4229
+#, 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:4235
+#, 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:4259
+#, 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:4262
+#, 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:4275
+#, 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:4283
+#, 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:4286
+#, c-format
+msgid "section [%2zu] '%s' must be allocated\n"
+msgstr "sección [%2zu] '%s' debe ser asignada\n"
+
+#: ../src/elflint.c:4290
+#, 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:4293
+#, 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:4298
+#, 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:4301
+#, c-format
+msgid "section [%2zu] '%s' must not be executable\n"
+msgstr "sección [%2zu] '%s' no debe ser ejecutable\n"
+
+#: ../src/elflint.c:4312
+#, 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:4319
+#, 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:4322
+#, c-format
+msgid "program header entry %d: file offset and virtual address not module of alignment\n"
+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:4335
+#, c-format
+msgid "executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME program header entry"
+msgstr "ejecutable/DSO con sección .eh_frame_hdr no tiene una entrada de encabezamiento de programa PT_GNU_EH_FRAME"
+
+#: ../src/elflint.c:4369
+#, c-format
+msgid "cannot read ELF header: %s\n"
+msgstr "No se puede leer encabezamiento ELF: %s\n"
+
+#: ../src/elflint.c:4395
+#, c-format
+msgid "text relocation flag set but not needed\n"
+msgstr "Bandera de reubicación de texto establecida pero no necesaria\n"
+
+#: ../src/findtextrel.c:70
+msgid "Input Selection:"
+msgstr "Selección de entrada:"
+
+#: ../src/findtextrel.c:71
+msgid "Prepend PATH to all file names"
+msgstr "Agregar RUTA a todos los nombres de ficheros"
+
+#: ../src/findtextrel.c:73
+msgid "Use PATH as root of debuginfo hierarchy"
+msgstr "Usar RUTA como root de jerarquía de debuginfo"
+
+#. Short description of program.
+#: ../src/findtextrel.c:80
+msgid "Locate source of text relocations in FILEs (a.out by default)."
+msgstr "Localizar origen de reubicaciones de texto en FICHEROS (a.out por defecto)."
+
+#. Strings for arguments in help texts.
+#: ../src/findtextrel.c:84
+#: ../src/nm.c:111
+#: ../src/objdump.c:80
+#: ../src/size.c:92
+#: ../src/strings.c:92
+#: ../src/strip.c:97
+msgid "[FILE...]"
+msgstr "[FICHERO...]"
+
+#: ../src/findtextrel.c:246
+#, c-format
+msgid "cannot get ELF header '%s': %s"
+msgstr "No se puede obtener encabezamiento ELF '%s': %s"
+
+#: ../src/findtextrel.c:257
+#, c-format
+msgid "'%s' is not a DSO or PIE"
+msgstr "'%s' es no un DSO o PIE"
+
+#: ../src/findtextrel.c:274
+#, c-format
+msgid "getting get section header of section %zu: %s"
+msgstr "obtener encabezamiento de sección get de sección %zu: %s"
+
+#: ../src/findtextrel.c:292
+#, c-format
+msgid "cannot read dynamic section: %s"
+msgstr "No se puede leer sección dinámica: %s"
+
+#: ../src/findtextrel.c:307
+#, c-format
+msgid "no text relocations reported in '%s'"
+msgstr "no hay reubicaciones de texto reportado en '%s'"
+
+#: ../src/findtextrel.c:319
+#, c-format
+msgid "while reading ELF file"
+msgstr "Error al leer fichero ELF"
+
+#: ../src/findtextrel.c:328
+#: ../src/findtextrel.c:345
+#, c-format
+msgid "cannot get program header index at offset %d: %s"
+msgstr "Nos se puede obtener el índice de encabezamiento de programa en compensación %d: %s"
+
+#: ../src/findtextrel.c:397
+#, c-format
+msgid "cannot get section header of section %Zu: %s"
+msgstr "No se puede obtener encabezamiento de sección %Zu: %s"
+
+#: ../src/findtextrel.c:409
+#, c-format
+msgid "cannot get symbol table section %zu in '%s': %s"
+msgstr "No se puede obtener tabla de símbolos %zu en '%s': %s"
+
+#: ../src/findtextrel.c:429
+#: ../src/findtextrel.c:452
+#, c-format
+msgid "cannot get relocation at index %d in section %zu in '%s': %s"
+msgstr "No se puede obtener reubicación en índice %d en sección %zu en '%s': %s"
+
+#: ../src/findtextrel.c:517
+#, c-format
+msgid "%s not compiled with -fpic/-fPIC\n"
+msgstr "%s no compilado con -fpic/-fPIC\n"
+
+#: ../src/findtextrel.c:570
+#, c-format
+msgid "the file containing the function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr "El archivo que contiene la función '%s' no está compilado con -fpic/-fPIC\n"
+
+#: ../src/findtextrel.c:577
+#: ../src/findtextrel.c:597
+#, c-format
+msgid "the file containing the function '%s' might not be compiled with -fpic/-fPIC\n"
+msgstr "el fichero que contiene la función '%s' podría no estar compilado con -fpic/-fPIC\n"
+
+#: ../src/findtextrel.c:585
+#, c-format
+msgid "either the file containing the function '%s' or the file containing the function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr "Tanto el fichero que contiene la función '%s' como el fichero que contiene la función '%s' no están compilados con -fpic/-fPIC\n"
+
+#: ../src/findtextrel.c:605
+#, c-format
+msgid "a relocation modifies memory at offset %llu in a write-protected segment\n"
+msgstr "Una reubicación modifica memoria en compensación %llu en un segmento protegido contra escritura\n"
+
+#: ../src/i386_ld.c:210
+#, c-format
+msgid "cannot allocate PLT section: %s"
+msgstr "No se puede asignar sección PLT: %s"
+
+#: ../src/i386_ld.c:232
+#, c-format
+msgid "cannot allocate PLTREL section: %s"
+msgstr "No se puede asignar sección PLTREL: %s"
+
+#: ../src/i386_ld.c:253
+#, c-format
+msgid "cannot allocate GOT section: %s"
+msgstr "No se puede asignar sección GOT: %s"
+
+#: ../src/i386_ld.c:274
+#, c-format
+msgid "cannot allocate GOTPLT section: %s"
+msgstr "No se puede asignar sección GOTPLT: %s"
+
+#: ../src/i386_ld.c:661
+#, c-format
+msgid "initial-executable TLS relocation cannot be used "
+msgstr "Reubicación TLS ejecutable-inicial no se puede utilizar"
+
+#: ../src/ld.c:87
+msgid "Input File Control:"
+msgstr "Control de fichero de entrada:"
+
+#: ../src/ld.c:89
+msgid "Include whole archives in the output from now on."
+msgstr "A partir de ahora incluye archivos completos en la salida."
+
+#: ../src/ld.c:91
+msgid "Stop including the whole archives in the output."
+msgstr "Deja de incluir archivos completos en la salida."
+
+#: ../src/ld.c:92
+#: ../src/ld.c:106
+#: ../src/ld.c:184
+msgid "FILE"
+msgstr "FICHERO"
+
+#: ../src/ld.c:93
+msgid "Start a group."
+msgstr "Inicia un grupo"
+
+#: ../src/ld.c:94
+msgid "End a group."
+msgstr "Termina un grupo."
+
+#: ../src/ld.c:95
+msgid "PATH"
+msgstr "RUTA"
+
+#: ../src/ld.c:96
+msgid "Add PATH to list of directories files are searched in."
+msgstr "Agrega RUTA a la lista de los directorios en los que se realiza la búsqueda."
+
+#: ../src/ld.c:98
+msgid "Only set DT_NEEDED for following dynamic libs if actually used"
+msgstr "Sólo se define DT_NEEDED para las siguientes bibliotecas dinámicas, si están siendo utilizadas"
+
+#: ../src/ld.c:100
+msgid "Always set DT_NEEDED for following dynamic libs"
+msgstr "Siempre establece DT_NEEDED para las siguientes bibliotecas dinámicas"
+
+#: ../src/ld.c:102
+msgid "Ignore LD_LIBRARY_PATH environment variable."
+msgstr "Ignora la variable de entorno LD_LIBRARY_PATH."
+
+#: ../src/ld.c:105
+msgid "Output File Control:"
+msgstr "Control de fichero de salida:"
+
+#: ../src/ld.c:106
+msgid "Place output in FILE."
+msgstr "Coloca salida en FICHERO."
+
+#: ../src/ld.c:109
+msgid "Object is marked to not use default search path at runtime."
+msgstr "Objeto está marcado para no usar ruta de búsqueda predeterminada en tiempo de ejecución."
+
+#: ../src/ld.c:111
+msgid "Same as --whole-archive."
+msgstr "Lo mismo que --whole-archive."
+
+#: ../src/ld.c:112
+msgid "Default rules of extracting from archive; weak references are not enough."
+msgstr "Reglas establecidas por defecto para extraer desde el archivo; las referencias débiles no son suficientes."
+
+#: ../src/ld.c:116
+msgid "Weak references cause extraction from archive."
+msgstr "Referencias débiles causan extracción del archivo."
+
+#: ../src/ld.c:118
+msgid "Allow multiple definitions; first is used."
+msgstr "Permite definiciones múltiples; se utiliza la primera."
+
+#: ../src/ld.c:120
+msgid "Disallow/allow undefined symbols in DSOs."
+msgstr "Habilita/inhabilita símbolos indefinidos en los DSO."
+
+#: ../src/ld.c:123
+msgid "Object requires immediate handling of $ORIGIN."
+msgstr "Los objetos requieren manipulación inmediata de $ORIGIN."
+
+#: ../src/ld.c:125
+msgid "Relocation will not be processed lazily."
+msgstr "La reubicación no se procesará de forma perezosa."
+
+#: ../src/ld.c:127
+msgid "Object cannot be unloaded at runtime."
+msgstr "El objeto no se puede descargar en tiempo de ejecución."
+
+#: ../src/ld.c:129
+msgid "Mark object to be initialized first."
+msgstr "Marcar objeto a ser inicializado primero."
+
+#: ../src/ld.c:131
+msgid "Enable/disable lazy-loading flag for following dependencies."
+msgstr "Activar/desactivar marca lazy-loading para las siguientes dependencias."
+
+#: ../src/ld.c:133
+msgid "Mark object as not loadable with 'dlopen'."
+msgstr "Marcar el objeto como no cargable con 'dlopen'"
+
+#: ../src/ld.c:135
+msgid "Ignore/record dependencies on unused DSOs."
+msgstr "Ignorar/registrar dependencias sobre DSO no utilizados."
+
+#: ../src/ld.c:137
+msgid "Generated DSO will be a system library."
+msgstr "El DSO generado será una biblioteca del sistema."
+
+#: ../src/ld.c:138
+msgid "ADDRESS"
+msgstr "DIRECCIÓN"
+
+#: ../src/ld.c:138
+msgid "Set entry point address."
+msgstr "Establecer dirección de entrada de punto"
+
+#: ../src/ld.c:141
+msgid "Do not link against shared libraries."
+msgstr "No enlazar con bibliotecas compartidas."
+
+#: ../src/ld.c:144
+msgid "Prefer linking against shared libraries."
+msgstr "No enlazar con bibliotecas compartidas."
+
+#: ../src/ld.c:145
+msgid "Export all dynamic symbols."
+msgstr "Exportar todos los símbolos dinámicos."
+
+#: ../src/ld.c:146
+msgid "Strip all symbols."
+msgstr "Descartar todos los símbolos."
+
+#: ../src/ld.c:147
+msgid "Strip debugging symbols."
+msgstr "Descartar los símbolos de depuración."
+
+#: ../src/ld.c:149
+msgid "Assume pagesize for the target system to be SIZE."
+msgstr "Asumir que pagesize para el sistema de destino sea SIZE."
+
+#: ../src/ld.c:151
+msgid "Set runtime DSO search path."
+msgstr "Establecer la ruta de búsqueda tiempo de ejecución DSO."
+
+#: ../src/ld.c:154
+msgid "Set link time DSO search path."
+msgstr "Establecer ruta de tiempo de enlace DSO."
+
+#: ../src/ld.c:155
+msgid "Generate dynamic shared object."
+msgstr "Generar objeto compartido dinámico."
+
+#: ../src/ld.c:156
+msgid "Generate relocatable object."
+msgstr "Generar objeto reubicable"
+
+#: ../src/ld.c:159
+msgid "Causes symbol not assigned to a version be reduced to local."
+msgstr "Hacer que un símbolo no asignado a una versión sea reducido a local."
+
+#: ../src/ld.c:160
+msgid "Remove unused sections."
+msgstr "Eliminar las secciones no utilizadas."
+
+#: ../src/ld.c:163
+msgid "Don't remove unused sections."
+msgstr "No eliminar las secciones no utilizadas."
+
+#: ../src/ld.c:164
+msgid "Set soname of shared object."
+msgstr "Establecer soname de objeto compartido."
+
+#: ../src/ld.c:165
+msgid "Set the dynamic linker name."
+msgstr "Establecer el nombre de enlazador dinámico."
+
+#: ../src/ld.c:168
+msgid "Add/suppress addition indentifying link-editor to .comment section."
+msgstr "Añadir/suprimir adición identificando enlace-editor para .sección de comentario."
+
+#: ../src/ld.c:171
+msgid "Create .eh_frame_hdr section"
+msgstr "Crear una sección .eh_frame_hdr"
+
+#: ../src/ld.c:173
+msgid "Set hash style to sysv, gnu or both."
+msgstr "Establecer el estilo de dispersión un sysv, gnu o ambos."
+
+#: ../src/ld.c:175
+msgid "Generate build ID note (md5, sha1 (default), uuid)."
+msgstr "Crear una nota del ID de compilación (md5, sha1 (por defecto), uuid)."
+
+#: ../src/ld.c:177
+msgid "Linker Operation Control:"
+msgstr "Control de volumen desconocido:"
+
+#: ../src/ld.c:178
+msgid "Verbose messages."
+msgstr "Mensajes explicativos."
+
+#: ../src/ld.c:179
+msgid "Trace file opens."
+msgstr "Rastrear apertura de ficheros."
+
+#: ../src/ld.c:181
+msgid "Trade speed for less memory usage"
+msgstr "Intercambiar velocidad por menor utilización de memoria"
+
+#: ../src/ld.c:182
+msgid "LEVEL"
+msgstr "NIVEL"
+
+#: ../src/ld.c:183
+msgid "Set optimization level to LEVEL."
+msgstr "Establecer el nivel de optimización a LEVEL."
+
+#: ../src/ld.c:184
+msgid "Use linker script in FILE."
+msgstr "Usar script enlazador en FICHERO."
+
+#: ../src/ld.c:187
+msgid "Select to get parser debug information"
+msgstr "Seleccionar para obtener análisis de información de depuración"
+
+#: ../src/ld.c:190
+msgid "Read version information from FILE."
+msgstr "Leer información de versión de FICHERO."
+
+#: ../src/ld.c:191
+msgid "Set emulation to NAME."
+msgstr "Establecer emulación a NOMBRE."
+
+#. Short description of program.
+#: ../src/ld.c:197
+msgid "Combine object and archive files."
+msgstr "Combinar objeto y archivos de almacenamiento."
+
+#. Strings for arguments in help texts.
+#: ../src/ld.c:200
+msgid "[FILE]..."
+msgstr "[FICHERO]..."
+
+#: ../src/ld.c:333
+#, c-format
+msgid "At least one input file needed"
+msgstr "Se necesita al menos un fichero de entrada"
+
+#: ../src/ld.c:349
+#, c-format
+msgid "error while preparing linking"
+msgstr "Error al preparar vinculación"
+
+#: ../src/ld.c:356
+#, c-format
+msgid "cannot open linker script '%s'"
+msgstr "no se puede abrir script enlazador '%s'"
+
+#: ../src/ld.c:397
+#, c-format
+msgid "-( without matching -)"
+msgstr "-( sin coincidir -)"
+
+#: ../src/ld.c:572
+#: ../src/ld.c:610
+#, c-format
+msgid "only one option of -G and -r is allowed"
+msgstr "Solamente una opción de -G y -r es permitida"
+
+#: ../src/ld.c:594
+#, c-format
+msgid "more than one '-m' parameter"
+msgstr "más de un parámetro '-m'"
+
+#: ../src/ld.c:604
+#: ../src/ld.c:1013
+#, c-format
+msgid "unknown option `-%c %s'"
+msgstr "opción desconocida `-%c %s'"
+
+#: ../src/ld.c:646
+#, c-format
+msgid "invalid page size value '%s': ignored"
+msgstr "Valor de tamaño de página'%s': ignorado"
+
+#: ../src/ld.c:687
+#, c-format
+msgid "invalid hash style '%s'"
+msgstr "estilo de dispersión inválido '%s'"
+
+#: ../src/ld.c:697
+#, c-format
+msgid "invalid build-ID style '%s'"
+msgstr "estilo de cuerpo-ID inválido '%s'"
+
+#: ../src/ld.c:785
+#, c-format
+msgid "More than one output file name given."
+msgstr "Se ha dado más de un nombre de archivo de salida."
+
+#: ../src/ld.c:802
+#, c-format
+msgid "Invalid optimization level `%s'"
+msgstr "Nivel de optimización inválido `%s'"
+
+#: ../src/ld.c:850
+#, c-format
+msgid "nested -( -) groups are not allowed"
+msgstr "no se permiten grupos -( -) en nido"
+
+#: ../src/ld.c:869
+#, c-format
+msgid "-) without matching -("
+msgstr "-) sin coincidir -("
+
+#: ../src/ld.c:1046
+#, c-format
+msgid "unknown option '-%c %s'"
+msgstr "Opción desconocida '-%c %s'"
+
+#: ../src/ld.c:1150
+#, c-format
+msgid "could not find input file to determine output file format"
+msgstr "no se pudo encontrar un archivo de entrada que determine el formato del archivo de salida"
+
+#: ../src/ld.c:1152
+#, c-format
+msgid "try again with an appropriate '-m' parameter"
+msgstr "Inténtelo con una parámetro '-m' apropiado"
+
+#: ../src/ld.c:1446
+#, c-format
+msgid "cannot read version script '%s'"
+msgstr "No se puede leer script de versión '%s'"
+
+#. The symbol is already defined and now again
+#. in the linker script. This is an error.
+#: ../src/ld.c:1512
+#: ../src/ld.c:1551
+#, c-format
+msgid "duplicate definition of '%s' in linker script"
+msgstr "Duplicar definición de '%s' en script enlazador"
+
+#: ../src/ldgeneric.c:209
+#: ../src/ldgeneric.c:5151
+#, c-format
+msgid "cannot create string table"
+msgstr "no puede crear tabla de cadenas"
+
+#: ../src/ldgeneric.c:255
+#, c-format
+msgid "cannot load ld backend library '%s': %s"
+msgstr "no se puede cargar biblioteca ID de segundo plano '%s': %s"
+
+#: ../src/ldgeneric.c:265
+#, c-format
+msgid "cannot find init function in ld backend library '%s': %s"
+msgstr "no se pudo encontrar la función init en la biblioteca ld de segundo plano '%s': %s"
+
+#: ../src/ldgeneric.c:310
+#, c-format
+msgid "%s listed more than once as input"
+msgstr "%s listado más de una vez como entrada"
+
+#: ../src/ldgeneric.c:424
+#, c-format
+msgid "%s (for -l%s)\n"
+msgstr "%s (para -l%s)\n"
+
+#: ../src/ldgeneric.c:425
+#, c-format
+msgid "%s (for DT_NEEDED %s)\n"
+msgstr "%s (para DT_NEEDED %s)\n"
+
+#: ../src/ldgeneric.c:573
+#, c-format
+msgid "Warning: type of `%s' changed from %s in %s to %s in %s"
+msgstr "Advertencia: el tipo de `%s' cambió de %s en %s a %s en %s"
+
+#: ../src/ldgeneric.c:586
+#, c-format
+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:661
+#: ../src/ldgeneric.c:1122
+#: ../src/readelf.c:629
+#: ../src/strip.c:543
+#, c-format
+msgid "cannot determine number of sections: %s"
+msgstr "no se pudieron determinar el número de secciones: %s"
+
+#: ../src/ldgeneric.c:677
+#, c-format
+msgid "(%s+%#<PRIx64>): multiple definition of %s `%s'\n"
+msgstr "(%s+%#<PRIx64>): definición múltiplo de %s `%s'\n"
+
+#: ../src/ldgeneric.c:700
+#, c-format
+msgid "(%s+%#<PRIx64>): first defined here\n"
+msgstr "(%s+%#<PRIx64>): se definió primero aquí\n"
+
+#: ../src/ldgeneric.c:819
+#, c-format
+msgid "%s: cannot get section group data: %s"
+msgstr "%s: no se pueden obtener datos de sección de grupo: %s"
+
+#. If we come here no section group contained the given section
+#. despite the SHF_GROUP flag. This is an error in the input
+#. file.
+#: ../src/ldgeneric.c:840
+#, c-format
+msgid "%s: section '%s' with group flag set does not belong to any group"
+msgstr "%s: la sección '%s' con bandera de grupo establecida no pertenece a ningún grupo"
+
+#: ../src/ldgeneric.c:885
+#, c-format
+msgid "%s: section [%2d] '%s' is not in the correct section group"
+msgstr "%s: la sección [%2d] '%s' no se encuentra en el grupo de sección correcto"
+
+#. This should never happen.
+#: ../src/ldgeneric.c:1156
+#: ../src/ldgeneric.c:1413
+#: ../src/ldgeneric.c:1422
+#: ../src/ldgeneric.c:1481
+#: ../src/ldgeneric.c:1490
+#: ../src/ldgeneric.c:1753
+#: ../src/ldgeneric.c:2005
+#, c-format
+msgid "%s: invalid ELF file (%s:%d)\n"
+msgstr "%s: fichero ELF inválido (%s:%d)\n"
+
+#: ../src/ldgeneric.c:1250
+#, c-format
+msgid "%s: only files of type ET_REL might contain section groups"
+msgstr "%s: solo archivos de tipo ET_REL pueden contener grupos de sección"
+
+#: ../src/ldgeneric.c:1302
+#, c-format
+msgid "%s: cannot determine signature of section group [%2zd] '%s': %s"
+msgstr "%s: no es posible determinar la firma del grupo de sección [%2zd] '%s': %s "
+
+#: ../src/ldgeneric.c:1314
+#, c-format
+msgid "%s: cannot get content of section group [%2zd] '%s': %s'"
+msgstr "%s: no es posible obtener el contenido de la sección del grupo [%2zd] '%s': %s'"
+
+#: ../src/ldgeneric.c:1328
+#, c-format
+msgid "%s: group member %zu of section group [%2zd] '%s' has too high index: %<PRIu32>"
+msgstr "%s el miembro del grupo %zu del grupo de sección [%2zd] '%s' posee el índice demasiado alto: %<PRIu32>"
+
+#: ../src/ldgeneric.c:1350
+#, c-format
+msgid "%s: section '%s' has unknown type: %d"
+msgstr "%s: sección '%s' tiene tipo desconocido: %d"
+
+#: ../src/ldgeneric.c:1729
+#, c-format
+msgid "cannot get descriptor for ELF file (%s:%d): %s\n"
+msgstr "no es posible obtener descriptor para el archivo ELF (%s:%d): %s\n"
+
+#: ../src/ldgeneric.c:1899
+#, c-format
+msgid "cannot read archive `%s': %s"
+msgstr "no se puede leer archivo `%s': %s"
+
+#: ../src/ldgeneric.c:2020
+#, c-format
+msgid "file of type %s cannot be linked in\n"
+msgstr "archivo de tipo %s no puede ser enlazado en\n"
+
+#: ../src/ldgeneric.c:2032
+#, c-format
+msgid "%s: input file incompatible with ELF machine type %s\n"
+msgstr "%s: el archivo ingresado es incompatible con una máquina ELF tipo %s\n"
+
+#: ../src/ldgeneric.c:2044
+#, c-format
+msgid "%s: cannot get section header string table index: %s\n"
+msgstr "%s: no se ha podido obtener un índice para la tabla de la cadena del encabezamiento de la sección: %s\n"
+
+#: ../src/ldgeneric.c:2073
+#, c-format
+msgid "cannot use DSO '%s' when generating relocatable object file"
+msgstr "no es posible utilizar DSO '%s' al general un archivo de objeto realojable"
+
+#: ../src/ldgeneric.c:2158
+#, c-format
+msgid "input file '%s' ignored"
+msgstr "archivo de entrada '%s' ignorado"
+
+#. XXX The error message should get better. It should use
+#. the debugging information if present to tell where in the
+#. sources the undefined reference is.
+#: ../src/ldgeneric.c:2372
+#, c-format
+msgid "undefined symbol `%s' in %s"
+msgstr "símbolo indefinido `%s' en %s"
+
+#: ../src/ldgeneric.c:2702
+#, c-format
+msgid "cannot create ELF descriptor for output file: %s"
+msgstr "no es posible crear un descriptor ELF para el archivo de salida: %s"
+
+#: ../src/ldgeneric.c:2709
+#, c-format
+msgid "could not create ELF header for output file: %s"
+msgstr "no es posible crear un encabezamiento ELF para el archivo de salida: %s"
+
+#: ../src/ldgeneric.c:3224
+#: ../src/ldgeneric.c:3294
+#: ../src/ldgeneric.c:3330
+#: ../src/ldgeneric.c:4457
+#: ../src/ldgeneric.c:4506
+#: ../src/ldgeneric.c:4538
+#: ../src/ldgeneric.c:4773
+#: ../src/ldgeneric.c:4828
+#: ../src/ldgeneric.c:5075
+#: ../src/ldgeneric.c:5131
+#: ../src/ldgeneric.c:5600
+#: ../src/ldgeneric.c:5612
+#, c-format
+msgid "cannot create section for output file: %s"
+msgstr "no se puede crear sección para archivo de salida: %s"
+
+#: ../src/ldgeneric.c:3444
+#, c-format
+msgid "address computation expression contains variable '%s'"
+msgstr "la expresión de computación contiene la variable '%s'"
+
+#: ../src/ldgeneric.c:3489
+#, c-format
+msgid "argument '%<PRIuMAX>' of ALIGN in address computation expression is no power of two"
+msgstr "el argumento '%<PRIuMAX>' de ALIGN en expresión de dirección de computación no es potencia de dos"
+
+#: ../src/ldgeneric.c:3684
+#, c-format
+msgid "cannot find entry symbol '%s': defaulting to %#0*<PRIx64>"
+msgstr "no se puede encontrar símbolo de entrada '%s': predeterminada para %#0*<PRIx64>"
+
+#: ../src/ldgeneric.c:3690
+#, c-format
+msgid "no entry symbol specified: defaulting to %#0*<PRIx64>"
+msgstr "no se ha especificado una entrada de símbolo: estableciendo por defecto a %#0*<PRIx64>"
+
+#: ../src/ldgeneric.c:3920
+#, c-format
+msgid "cannot create GNU hash table section for output file: %s"
+msgstr "no se puede crear una tabla de dispersión GNU para archivo de salida: %s"
+
+#: ../src/ldgeneric.c:4071
+#, c-format
+msgid "cannot create hash table section for output file: %s"
+msgstr "no es posible crear una sección para la tabla de dispersión del archivo de salida: %s"
+
+#: ../src/ldgeneric.c:4114
+#, c-format
+msgid "cannot create build ID section: %s"
+msgstr "no se puede crear sección de creación de ID: %s"
+
+#: ../src/ldgeneric.c:4191
+#, c-format
+msgid "cannot convert section data to file format: %s"
+msgstr "no es posible convertir los datos de la sección en formato de archivo: %s"
+
+#: ../src/ldgeneric.c:4200
+#, c-format
+msgid "cannot convert section data to memory format: %s"
+msgstr "no es posible convertir datos de la sección en formato de memoria: %s"
+
+#: ../src/ldgeneric.c:4261
+#, c-format
+msgid "cannot read enough data for UUID"
+msgstr "no es posible leer suficientes datos para el UUID"
+
+#: ../src/ldgeneric.c:4358
+#: ../src/ldgeneric.c:4379
+#: ../src/ldgeneric.c:4408
+#: ../src/ldgeneric.c:6062
+#, c-format
+msgid "cannot create symbol table for output file: %s"
+msgstr "no es posible crear tabla de símbolo para el comando de salida: %s"
+
+#: ../src/ldgeneric.c:5300
+#: ../src/ldgeneric.c:5852
+#, c-format
+msgid "section index too large in dynamic symbol table"
+msgstr "el índice de la sección es demasiado extenso en la tabla de símbolos dinámicos"
+
+#: ../src/ldgeneric.c:5745
+#, c-format
+msgid "cannot create versioning section: %s"
+msgstr "no se puede crear sección de versión: %s"
+
+#: ../src/ldgeneric.c:5818
+#, c-format
+msgid "cannot create dynamic symbol table for output file: %s"
+msgstr "no es posible crear tabla de símbolos dinámicos para el archivo de salida: %s"
+
+#: ../src/ldgeneric.c:5994
+#, c-format
+msgid "cannot create versioning data: %s"
+msgstr "no se pueden crear datos de versión: %s"
+
+#: ../src/ldgeneric.c:6094
+#: ../src/ldgeneric.c:6107
+#: ../src/ldgeneric.c:6171
+#: ../src/ldgeneric.c:6179
+#, c-format
+msgid "cannot create section header string section: %s"
+msgstr "no se puede crear sección de cadenas de encabezamiento de sección: %s"
+
+#: ../src/ldgeneric.c:6101
+#, c-format
+msgid "cannot create section header string section"
+msgstr "no se puede crear sección de cadenas de encabezamiento de sección"
+
+#: ../src/ldgeneric.c:6259
+#, c-format
+msgid "cannot create program header: %s"
+msgstr "no se puede crear encabezamiento de programa: %s"
+
+#: ../src/ldgeneric.c:6267
+#, c-format
+msgid "while determining file layout: %s"
+msgstr "al determinar diseño de fichero: %s"
+
+#: ../src/ldgeneric.c:6388
+#, c-format
+msgid "internal error: non-nobits section follows nobits section"
+msgstr "error interno: sección non-nobits sigue a sección nobits"
+
+#: ../src/ldgeneric.c:6925
+#, c-format
+msgid "cannot get header of 0th section: %s"
+msgstr "No se puede obtener encabezamiento de sección 0th: %s"
+
+#: ../src/ldgeneric.c:6941
+#: ../src/unstrip.c:1808
+#, c-format
+msgid "cannot update ELF header: %s"
+msgstr "No se puede actualizar encabezamiento ELF: %s"
+
+#: ../src/ldgeneric.c:6972
+#, c-format
+msgid "linker backend didn't specify function to relocate section"
+msgstr "enlazador de segundo plano no especificó función para reubicar sección"
+
+#: ../src/ldgeneric.c:6984
+#, c-format
+msgid "while writing output file: %s"
+msgstr "Ocurrió un error de fichero de salida: %s"
+
+#: ../src/ldgeneric.c:6989
+#, c-format
+msgid "while finishing output file: %s"
+msgstr "error al cerrar el fichero de salida: %s"
+
+#: ../src/ldgeneric.c:6995
+#, c-format
+msgid "cannot stat output file"
+msgstr "no se puede generar stat de fichero de salida"
+
+#: ../src/ldgeneric.c:7011
+#, c-format
+msgid "WARNING: temporary output file overwritten before linking finished"
+msgstr "ADVERTENCIA: archivo de salida temporal sobreescrito antes que haya concluido el enlazamiento"
+
+#. This cannot be implemented generally. There should have been a
+#. machine dependent implementation and we should never have arrived
+#. here.
+#: ../src/ldgeneric.c:7064
+#: ../src/ldgeneric.c:7075
+#: ../src/ldgeneric.c:7086
+#: ../src/ldgeneric.c:7097
+#: ../src/ldgeneric.c:7116
+#: ../src/ldgeneric.c:7129
+#: ../src/ldgeneric.c:7141
+#, c-format
+msgid "no machine specific '%s' implementation"
+msgstr "no hay máquina específica de implementación '%s'"
+
+#: ../src/ldscript.y:178
+msgid "mode for segment invalid\n"
+msgstr "modo para segmento inválido\n"
+
+#: ../src/ldscript.y:465
+#, c-format
+msgid "while reading version script '%s': %s at line %d"
+msgstr "al leer script de versión '%s': %s en línea %d"
+
+#: ../src/ldscript.y:466
+#, c-format
+msgid "while reading linker script '%s': %s at line %d"
+msgstr "al leer script de enlace '%s': %s en línea %d"
+
+#: ../src/ldscript.y:745
+#, c-format
+msgid "symbol '%s' is declared both local and global for unnamed version"
+msgstr "el símbolo '%s' es declarado tanto local como global para la versión sin nombre"
+
+#: ../src/ldscript.y:747
+#, c-format
+msgid "symbol '%s' is declared both local and global for version '%s'"
+msgstr "el símbolo '%s' es declarado tanto local como global para la versión '%s'"
+
+#: ../src/ldscript.y:767
+#: ../src/ldscript.y:774
+#, c-format
+msgid "default visibility set as local and global"
+msgstr "la visibilidad establecida por defecto establecida como local y global"
+
+#: ../src/nm.c:74
+#: ../src/strip.c:73
+msgid "Output selection:"
+msgstr "Selección de salida:"
+
+#: ../src/nm.c:75
+msgid "Display debugger-only symbols"
+msgstr "Mostrar sólo símbolos del depurador"
+
+#: ../src/nm.c:76
+msgid "Display only defined symbols"
+msgstr "Mostrar sólo símbolos definidos"
+
+#: ../src/nm.c:79
+msgid "Display dynamic symbols instead of normal symbols"
+msgstr "Mostrar símbolos dinámicos en lugar de símbolos normales"
+
+#: ../src/nm.c:80
+msgid "Display only external symbols"
+msgstr "Mostrar sólo símbolos externos"
+
+#: ../src/nm.c:81
+msgid "Display only undefined symbols"
+msgstr "Mostrar sólo símbolos indefinidos"
+
+#: ../src/nm.c:83
+msgid "Include index for symbols from archive members"
+msgstr "Incluir índices para símbolos de miembros de archivo"
+
+#: ../src/nm.c:85
+#: ../src/size.c:66
+msgid "Output format:"
+msgstr "Formato de salida:"
+
+#: ../src/nm.c:87
+msgid "Print name of the input file before every symbol"
+msgstr "Imprimir nombre de archivo de entrada antes de cada símbolo"
+
+#: ../src/nm.c:90
+msgid "Use the output format FORMAT. FORMAT can be `bsd', `sysv' or `posix'. The default is `sysv'"
+msgstr "Usar el formato de salida FORMATO. FORMATO puede ser o bien `bsd', o `sysv', o `posix'. El establecido por defecto es `sysv'"
+
+#: ../src/nm.c:92
+msgid "Same as --format=bsd"
+msgstr "lo mismo que --format=bsd"
+
+#: ../src/nm.c:93
+msgid "Same as --format=posix"
+msgstr "lo mismo que --format=posix"
+
+#: ../src/nm.c:94
+#: ../src/size.c:72
+msgid "Use RADIX for printing symbol values"
+msgstr "Utilizar RADIX para imprimir valores de símbolo"
+
+#: ../src/nm.c:95
+msgid "Mark weak symbols"
+msgstr "Marcar símbolos débiles"
+
+#: ../src/nm.c:96
+msgid "Print size of defined symbols"
+msgstr "Tamaño de impresión de símbolos definidos"
+
+#: ../src/nm.c:98
+#: ../src/size.c:80
+#: ../src/strip.c:78
+#: ../src/unstrip.c:81
+msgid "Output options:"
+msgstr "Opciones de salida:"
+
+#: ../src/nm.c:99
+msgid "Sort symbols numerically by address"
+msgstr "Ordenar los símbolos numéricos por dirección"
+
+#: ../src/nm.c:101
+msgid "Do not sort the symbols"
+msgstr "No ordenar los símbolos"
+
+#: ../src/nm.c:102
+msgid "Reverse the sense of the sort"
+msgstr "Invertir el orden"
+
+#. Short description of program.
+#: ../src/nm.c:108
+msgid "List symbols from FILEs (a.out by default)."
+msgstr "Listar símbolos de FICHEROS (a.out por defecto)."
+
+#: ../src/nm.c:136
+#: ../src/objdump.c:105
+#: ../src/size.c:117
+#: ../src/strip.c:121
+#, c-format
+msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
+msgstr "%s: ERROR INTERNO %d (%s-%s): %s"
+
+#: ../src/nm.c:380
+#: ../src/nm.c:392
+#: ../src/size.c:317
+#: ../src/size.c:326
+#: ../src/size.c:337
+#: ../src/strip.c:1816
+#, c-format
+msgid "while closing '%s'"
+msgstr "error al cerrar '%s'"
+
+#: ../src/nm.c:402
+#: ../src/objdump.c:296
+#: ../src/strip.c:359
+#, c-format
+msgid "%s: File format not recognized"
+msgstr "%s: No se reconoce el formato del fichero"
+
+#. Note: 0 is no valid offset.
+#: ../src/nm.c:442
+msgid ""
+"\n"
+"Archive index:"
+msgstr ""
+"\n"
+"Índice de archivo:"
+
+#: ../src/nm.c:451
+#, c-format
+msgid "invalid offset %zu for symbol %s"
+msgstr "Compensación %zu inválida para símbolo %s"
+
+#: ../src/nm.c:456
+#, c-format
+msgid "%s in %s\n"
+msgstr "%s en %s\n"
+
+#: ../src/nm.c:464
+#, c-format
+msgid "cannot reset archive offset to beginning"
+msgstr "imposible restablecer compensación de archivo al inicio"
+
+#: ../src/nm.c:488
+#: ../src/objdump.c:344
+#, c-format
+msgid "%s%s%s: file format not recognized"
+msgstr "%s%s%s: no se reconoció el formato de fichero"
+
+#: ../src/nm.c:700
+#, c-format
+msgid "cannot create search tree"
+msgstr "No se puede crear el árbol de búsqueda"
+
+#: ../src/nm.c:740
+#: ../src/nm.c:1002
+#: ../src/objdump.c:744
+#: ../src/readelf.c:885
+#: ../src/readelf.c:1028
+#: ../src/readelf.c:1169
+#: ../src/readelf.c:1351
+#: ../src/readelf.c:1549
+#: ../src/readelf.c:1735
+#: ../src/readelf.c:1945
+#: ../src/readelf.c:2199
+#: ../src/readelf.c:2265
+#: ../src/readelf.c:2343
+#: ../src/readelf.c:2841
+#: ../src/readelf.c:2877
+#: ../src/readelf.c:2939
+#: ../src/readelf.c:6515
+#: ../src/readelf.c:7409
+#: ../src/readelf.c:7556
+#: ../src/readelf.c:7626
+#: ../src/size.c:425
+#: ../src/size.c:499
+#: ../src/strip.c:483
+#, 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:766
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Símbolos de %s:\n"
+"\n"
+
+#: ../src/nm.c:768
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s[%s]:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Símbolos de %s[%s]:\n"
+"\n"
+
+#. The header line.
+#: ../src/nm.c:771
+#, c-format
+msgid ""
+"%*s%-*s %-*s Class Type %-*s %*s Section\n"
+"\n"
+msgstr ""
+"%*s%-*s %-*s Clase Tipo %-*s %*s Sección\n"
+"\n"
+
+#: ../src/nm.c:1012
+#, 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:1016
+#, 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"
+
+#. XXX Add machine specific object file types.
+#: ../src/nm.c:1255
+#, c-format
+msgid "%s%s%s%s: Invalid operation"
+msgstr "%s%s%s%s: Operación inválida"
+
+#: ../src/nm.c:1312
+#, c-format
+msgid "%s%s%s: no symbols"
+msgstr "%s%s%s: No hay símbolos"
+
+#: ../src/objdump.c:61
+msgid "Mode selection:"
+msgstr "Selección de modo:"
+
+#: ../src/objdump.c:62
+msgid "Display relocation information."
+msgstr "Mostrar la reubicación de información."
+
+#: ../src/objdump.c:64
+msgid "Display the full contents of all sections requested"
+msgstr "Mostrar el contenido total de todas las secciones solicitadas"
+
+#: ../src/objdump.c:66
+msgid "Display assembler code of executable sections"
+msgstr "Mostrar código de ensamblador de secciones ejecutables"
+
+#: ../src/objdump.c:68
+msgid "Output option selection:"
+msgstr "Selección de opción de salida:"
+
+#: ../src/objdump.c:70
+msgid "Only display information for section NAME."
+msgstr "Sólo muestra información para NOMBRE de sección."
+
+#. Short description of program.
+#: ../src/objdump.c:76
+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:430
+msgid "No operation specified.\n"
+msgstr "No se especificó una operación.\n"
+
+#: ../src/objdump.c:274
+#: ../src/objdump.c:286
+#, c-format
+msgid "while close `%s'"
+msgstr "mientras cierra `%s'"
+
+#: ../src/objdump.c:379
+#: ../src/readelf.c:1644
+#: ../src/readelf.c:1818
+msgid "INVALID SYMBOL"
+msgstr "SÍMBOLO INVÁLIDO"
+
+#: ../src/objdump.c:394
+#: ../src/readelf.c:1675
+#: ../src/readelf.c:1851
+msgid "INVALID SECTION"
+msgstr "SECCIÓN INVÁLIDA"
+
+#: ../src/objdump.c:510
+#, c-format
+msgid ""
+"\n"
+"RELOCATION RECORDS FOR [%s]:\n"
+"%-*s TYPE VALUE\n"
+msgstr ""
+"\n"
+"REUBICACIÓN DE REGISTROS PARA [%s]:\n"
+"%-*s TIPO VALOR\n"
+
+#: ../src/objdump.c:513
+msgid "OFFSET"
+msgstr "COMPENSACIÓN"
+
+#: ../src/objdump.c:576
+#, c-format
+msgid "Contents of section %s:\n"
+msgstr "Contenido de la sección %s:\n"
+
+#: ../src/objdump.c:676
+#, c-format
+msgid "cannot disassemble"
+msgstr "No se puede desensamblar"
+
+#. Short description of program.
+#: ../src/ranlib.c:74
+msgid "Generate an index to speed access to archives."
+msgstr " Generar un índice para acelerar el acceso a los archivos."
+
+#. Strings for arguments in help texts.
+#: ../src/ranlib.c:77
+msgid "ARCHIVE"
+msgstr "ARCHIVO "
+
+#: ../src/ranlib.c:116
+#, c-format
+msgid "Archive name required"
+msgstr "Se requiere nombre de archivo"
+
+#: ../src/ranlib.c:194
+#, c-format
+msgid "'%s' is no archive"
+msgstr "%s: no es un archivo"
+
+#: ../src/ranlib.c:229
+#, c-format
+msgid "error while freeing sub-ELF descriptor: %s"
+msgstr "error al liberar descriptor sub-ELF: %s"
+
+#: ../src/readelf.c:73
+msgid "ELF output selection:"
+msgstr "Selección de salida de ELF:"
+
+#: ../src/readelf.c:75
+msgid "All these plus -p .strtab -p .dynstr -p .comment"
+msgstr "Todo esto mas -p .strtab -p .dynstr -p .comment"
+
+#: ../src/readelf.c:76
+msgid "Display the dynamic segment"
+msgstr "Mostrar el segmento dinámico"
+
+#: ../src/readelf.c:77
+msgid "Display the ELF file header"
+msgstr "Mostrar el encabezamiento del fichero ELF"
+
+#: ../src/readelf.c:79
+msgid "Display histogram of bucket list lengths"
+msgstr "Mostrar histograma de las longitudes de las listas de cubetas"
+
+#: ../src/readelf.c:80
+msgid "Display the program headers"
+msgstr "Mostrar encabezamientos de programa"
+
+#: ../src/readelf.c:82
+msgid "Display relocations"
+msgstr "Mostrar reubicaciones"
+
+#: ../src/readelf.c:83
+msgid "Display the sections' headers"
+msgstr "Mostrar los encabezados de las secciones"
+
+#: ../src/readelf.c:85
+msgid "Display the symbol table"
+msgstr "Mostrar la tabla de símbolos"
+
+#: ../src/readelf.c:86
+msgid "Display versioning information"
+msgstr "Mostrar información de versión"
+
+#: ../src/readelf.c:87
+msgid "Display the ELF notes"
+msgstr "Mostrar las notas ELF"
+
+#: ../src/readelf.c:89
+msgid "Display architecture specific information, if any"
+msgstr "Mostrar información específica de la arquitectura (si es que la hay)"
+
+#: ../src/readelf.c:91
+msgid "Display sections for exception handling"
+msgstr "Muestra secciones para manejo de excepciones"
+
+#: ../src/readelf.c:93
+msgid "Additional output selection:"
+msgstr "Selección de salida adicional:"
+
+#: ../src/readelf.c:95
+msgid "Display DWARF section content. SECTION can be one of abbrev, aranges, frame, info, loc, line, ranges, pubnames, str, macinfo, 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:99
+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:101
+msgid "Print string contents of sections"
+msgstr "Imprime contenido de cadena de secciones"
+
+#: ../src/readelf.c:104
+msgid "Display the symbol index of an archive"
+msgstr "Muestra el índice de símbolos de un archivo"
+
+#: ../src/readelf.c:106
+msgid "Output control:"
+msgstr "Control de salida:"
+
+#: ../src/readelf.c:108
+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"
+
+#. Short description of program.
+#: ../src/readelf.c:114
+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:401
+#, c-format
+msgid "Unknown DWARF debug section `%s'.\n"
+msgstr "Sección de depuración DWARF desconocida `%s'.\n"
+
+#: ../src/readelf.c:465
+#, c-format
+msgid "cannot generate Elf descriptor: %s"
+msgstr "no se puede crear descriptor ELF: %s"
+
+#: ../src/readelf.c:477
+#, 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:482
+#, c-format
+msgid "error while closing Elf descriptor: %s"
+msgstr "error al cerrar el descriptor ELF: %s"
+
+#: ../src/readelf.c:574
+#, c-format
+msgid "cannot stat input file"
+msgstr "no sepudo stat archivo de entrada"
+
+#: ../src/readelf.c:576
+#, c-format
+msgid "input file is empty"
+msgstr "archivo de entrada vacío"
+
+#: ../src/readelf.c:578
+#, c-format
+msgid "failed reading '%s': %s"
+msgstr "Falló lectura de '%s': %s"
+
+#: ../src/readelf.c:614
+#, c-format
+msgid "cannot read ELF header: %s"
+msgstr "no se pudo leer encabezamiento ELF: %s"
+
+#: ../src/readelf.c:622
+#, c-format
+msgid "cannot create EBL handle"
+msgstr "no se puede crear EBL"
+
+#: ../src/readelf.c:635
+#, 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:721
+msgid "NONE (None)"
+msgstr "NONE (Ninguno)"
+
+#: ../src/readelf.c:722
+msgid "REL (Relocatable file)"
+msgstr "REL (Fichero reubicable)"
+
+#: ../src/readelf.c:723
+msgid "EXEC (Executable file)"
+msgstr "EXEC (Fichero ejecutable)"
+
+#: ../src/readelf.c:724
+msgid "DYN (Shared object file)"
+msgstr "DYN (Fichero objeto compartido)"
+
+#: ../src/readelf.c:725
+msgid "CORE (Core file)"
+msgstr "CORE (Fichero núcleo)"
+
+#: ../src/readelf.c:730
+#, c-format
+msgid "OS Specific: (%x)\n"
+msgstr "OS Specific: (%x)\n"
+
+#. && e_type <= ET_HIPROC always true
+#: ../src/readelf.c:732
+#, c-format
+msgid "Processor Specific: (%x)\n"
+msgstr "Específico del procesador: (%x)\n"
+
+#: ../src/readelf.c:742
+msgid ""
+"ELF Header:\n"
+" Magic: "
+msgstr ""
+"Encabezamiento ELF:\n"
+" Mágico: "
+
+#: ../src/readelf.c:746
+#, c-format
+msgid ""
+"\n"
+" Class: %s\n"
+msgstr ""
+"\n"
+" Clase: %s\n"
+
+#: ../src/readelf.c:751
+#, c-format
+msgid " Data: %s\n"
+msgstr " Datos: %s\n"
+
+#: ../src/readelf.c:757
+#, c-format
+msgid " Ident Version: %hhd %s\n"
+msgstr " Versión ident: %hhd %s\n"
+
+#: ../src/readelf.c:759
+#: ../src/readelf.c:776
+msgid "(current)"
+msgstr "(actual)"
+
+#: ../src/readelf.c:763
+#, c-format
+msgid " OS/ABI: %s\n"
+msgstr " OS/ABI: %s\n"
+
+#: ../src/readelf.c:766
+#, c-format
+msgid " ABI Version: %hhd\n"
+msgstr " Versión ABI: %hhd\n"
+
+#: ../src/readelf.c:769
+msgid " Type: "
+msgstr " Tipo: "
+
+#: ../src/readelf.c:772
+#, c-format
+msgid " Machine: %s\n"
+msgstr " Máquina: %s\n"
+
+#: ../src/readelf.c:774
+#, c-format
+msgid " Version: %d %s\n"
+msgstr " Versión: %d %s\n"
+
+#: ../src/readelf.c:778
+#, c-format
+msgid " Entry point address: %#<PRIx64>\n"
+msgstr " Dirección de punto de entrada: %#<PRIx64>\n"
+
+#: ../src/readelf.c:781
+#, c-format
+msgid " Start of program headers: %<PRId64> %s\n"
+msgstr " Inicio de encabezamientos de programa: %<PRId64> %s\n"
+
+#: ../src/readelf.c:782
+#: ../src/readelf.c:785
+msgid "(bytes into file)"
+msgstr " (bytes en el archivo)"
+
+#: ../src/readelf.c:784
+#, c-format
+msgid " Start of section headers: %<PRId64> %s\n"
+msgstr " Inicio de encabezamientos de sección: %<PRId64> %s\n"
+
+#: ../src/readelf.c:787
+#, c-format
+msgid " Flags: %s\n"
+msgstr " Indicadores: %s\n"
+
+#: ../src/readelf.c:790
+#, c-format
+msgid " Size of this header: %<PRId16> %s\n"
+msgstr " Tamaño de este encabezamiento: %<PRId16> %s\n"
+
+#: ../src/readelf.c:791
+#: ../src/readelf.c:794
+#: ../src/readelf.c:811
+msgid "(bytes)"
+msgstr "(bytes)"
+
+#: ../src/readelf.c:793
+#, 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:796
+#, c-format
+msgid " Number of program headers entries: %<PRId16>"
+msgstr " Cantidad de entradas de encabezados de programa: %<PRId16>"
+
+#: ../src/readelf.c:803
+#, c-format
+msgid " (%<PRIu32> in [0].sh_info)"
+msgstr " (%<PRIu32> in [0].sh_info)"
+
+#: ../src/readelf.c:806
+#: ../src/readelf.c:823
+#: ../src/readelf.c:837
+msgid " ([0] not available)"
+msgstr " ([0] no disponible)"
+
+#: ../src/readelf.c:810
+#, 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:813
+#, c-format
+msgid " Number of section headers entries: %<PRId16>"
+msgstr " Cantidad de entradas en los encabezamientos de sección: %<PRId16>"
+
+#: ../src/readelf.c:820
+#, c-format
+msgid " (%<PRIu32> in [0].sh_size)"
+msgstr " (%<PRIu32> en [0].sh_size)"
+
+#. We managed to get the zeroth section.
+#: ../src/readelf.c:833
+#, c-format
+msgid " (%<PRIu32> in [0].sh_link)"
+msgstr " (%<PRIu32> en [0].sh_link)"
+
+#: ../src/readelf.c:841
+#, c-format
+msgid ""
+" Section header string table index: XINDEX%s\n"
+"\n"
+msgstr ""
+" Índice de tabla de cadenas de sección de encabezamiento de : XINDEX%s\n"
+"\n"
+
+#: ../src/readelf.c:845
+#, 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:877
+#, c-format
+msgid ""
+"There are %d section headers, starting at offset %#<PRIx64>:\n"
+"\n"
+msgstr ""
+"Hay %d encabezamientos de sección, comenzando en compensación %#<PRIx64>:\n"
+"\n"
+
+#: ../src/readelf.c:887
+msgid "Section Headers:"
+msgstr "encabezamientos de sección:"
+
+#: ../src/readelf.c:890
+msgid "[Nr] Name Type Addr Off Size ES Flags Lk Inf Al"
+msgstr "[Nr] Nombre Tipo Dirección Off Tamaño Inf Al Enlace banderas ES"
+
+#: ../src/readelf.c:892
+msgid "[Nr] Name Type Addr Off Size ES Flags Lk Inf Al"
+msgstr "[Nr] Name Type Addr Off Size ES Flags Lk Inf Al"
+
+#: ../src/readelf.c:899
+#: ../src/readelf.c:1052
+#, c-format
+msgid "cannot get section: %s"
+msgstr "No se puede encontrar la sección: %s"
+
+#: ../src/readelf.c:906
+#: ../src/readelf.c:1060
+#: ../src/readelf.c:7576
+#: ../src/unstrip.c:353
+#: ../src/unstrip.c:377
+#: ../src/unstrip.c:427
+#: ../src/unstrip.c:536
+#: ../src/unstrip.c:553
+#: ../src/unstrip.c:591
+#: ../src/unstrip.c:789
+#: ../src/unstrip.c:1057
+#: ../src/unstrip.c:1244
+#: ../src/unstrip.c:1305
+#: ../src/unstrip.c:1427
+#: ../src/unstrip.c:1480
+#: ../src/unstrip.c:1588
+#: ../src/unstrip.c:1778
+#, c-format
+msgid "cannot get section header: %s"
+msgstr "No se puede obtener encabezamiento de sección: %s"
+
+#: ../src/readelf.c:964
+msgid "Program Headers:"
+msgstr "encabezamientos de programa:"
+
+#: ../src/readelf.c:966
+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:969
+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:1009
+#, c-format
+msgid "\t[Requesting program interpreter: %s]\n"
+msgstr "\t[Solicitando intérprete de programa: %s]\n"
+
+#: ../src/readelf.c:1030
+msgid ""
+"\n"
+" Section to Segment mapping:\n"
+" Segment Sections..."
+msgstr ""
+"\n"
+" Sección para asignación de segmento:\n"
+" Secciones de segmento..."
+
+#: ../src/readelf.c:1041
+#: ../src/unstrip.c:1824
+#: ../src/unstrip.c:1863
+#: ../src/unstrip.c:1870
+#, c-format
+msgid "cannot get program header: %s"
+msgstr "no se puede obtener memoria para encabezamiento del programa: %s"
+
+#: ../src/readelf.c:1175
+#, c-format
+msgid ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+"\n"
+"Grupo de sección COMDAT [%2zu] '%s' con firma '%s' contiene entrada %zu:\n"
+msgstr[1] ""
+"\n"
+"Grupo de sección COMDAT [%2zu] '%s' con firma '%s' contiene entradas %zu:\n"
+
+#: ../src/readelf.c:1180
+#, c-format
+msgid ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+"\n"
+"Grupo de sección [%2zu] '%s' con firma '%s' contiene entrada %zu:\n"
+msgstr[1] ""
+"\n"
+"Grupo de sección [%2zu] '%s' con firma '%s' contiene entradas %zu:\n"
+
+#: ../src/readelf.c:1188
+msgid "<INVALID SYMBOL>"
+msgstr "<SÍMBOLO INVÁLIDO>"
+
+#: ../src/readelf.c:1202
+msgid "<INVALID SECTION>"
+msgstr "<SECCIÓN INVÁLIDA>"
+
+#: ../src/readelf.c:1353
+#, c-format
+msgid ""
+"\n"
+"Dynamic segment contains %lu entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Dynamic segment contains %lu entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+"\n"
+"Segmento dinámico contiene entrada %lu:\n"
+" Dirección: %#0*<PRIx64> Compensación: %#08<PRIx64> Enlace a sección: [%2u] '%s'\n"
+msgstr[1] ""
+"\n"
+"Segmento dinámico contiene entradas %lu:\n"
+" Dirección: %#0*<PRIx64> Compensación: %#08<PRIx64> Enlace a sección: [%2u] '%s'\n"
+
+#: ../src/readelf.c:1365
+msgid " Type Value\n"
+msgstr " Tipo Valor\n"
+
+#: ../src/readelf.c:1389
+#, c-format
+msgid "Shared library: [%s]\n"
+msgstr "Biblioteca compartida: [%s]\n"
+
+#: ../src/readelf.c:1394
+#, c-format
+msgid "Library soname: [%s]\n"
+msgstr "Nombre-so de la biblioteca: [%s]\n"
+
+#: ../src/readelf.c:1399
+#, c-format
+msgid "Library rpath: [%s]\n"
+msgstr "Rpath de la biblioteca: [%s]\n"
+
+#: ../src/readelf.c:1404
+#, c-format
+msgid "Library runpath: [%s]\n"
+msgstr "Ruta de ejecución de la biblioteca: [%s]\n"
+
+#: ../src/readelf.c:1424
+#, c-format
+msgid "%<PRId64> (bytes)\n"
+msgstr "%<PRId64> (bytes)\n"
+
+#: ../src/readelf.c:1534
+#: ../src/readelf.c:1720
+#, c-format
+msgid ""
+"\n"
+"Invalid symbol table at offset %#0<PRIx64>\n"
+msgstr ""
+"\n"
+"Tabla de símbolos inválida en compensación %#0<PRIx64>\n"
+
+#: ../src/readelf.c:1552
+#: ../src/readelf.c:1737
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+"\n"
+"Sección de reubicación [%2zu] '%s' para sección [%2u] '%s' en compensación %#0<PRIx64> contiene entrada %d:\n"
+msgstr[1] ""
+"\n"
+"Sección de reubicación [%2zu] '%s' para sección [%2u] '%s' en compensación %#0<PRIx64> contiene entradas %d:\n"
+
+#. The .rel.dyn section does not refer to a specific section but
+#. instead of section index zero. Do not try to print a section
+#. name.
+#: ../src/readelf.c:1567
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+"\n"
+"Sección de reubicación[%2u] '%s' en compensación %#0<PRIx64> contiene entrada %d:\n"
+msgstr[1] ""
+"\n"
+"Sección de reubicación [%2u] '%s' en compensación %#0<PRIx64> contiene entradas %d:\n"
+
+#: ../src/readelf.c:1577
+msgid " Offset Type Value Name\n"
+msgstr " Compensación Tipo Valor Nombre\n"
+
+#: ../src/readelf.c:1579
+msgid " Offset Type Value Name\n"
+msgstr " Compensación Tipo Valor Nombre\n"
+
+#: ../src/readelf.c:1632
+#: ../src/readelf.c:1643
+#: ../src/readelf.c:1656
+#: ../src/readelf.c:1674
+#: ../src/readelf.c:1686
+#: ../src/readelf.c:1805
+#: ../src/readelf.c:1817
+#: ../src/readelf.c:1831
+#: ../src/readelf.c:1850
+#: ../src/readelf.c:1863
+msgid "<INVALID RELOC>"
+msgstr "<REUBIC INVÁLIDA>"
+
+#: ../src/readelf.c:1749
+msgid " Offset Type Value Addend Name\n"
+msgstr " Compensación Tipo Valor Nombre Adend\n"
+
+#: ../src/readelf.c:1751
+msgid " Offset Type Value Addend Name\n"
+msgstr " Compensación Tipo Valor Nombre Adend\n"
+
+#: ../src/readelf.c:1952
+#, c-format
+msgid ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entry:\n"
+msgid_plural ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entries:\n"
+msgstr[0] ""
+"\n"
+"La tabla de símbolos [%2u] '%s' contiene entrada %u:\n"
+msgstr[1] ""
+"\n"
+"La tabla de símbolos [%2u] '%s' contiene entradas %u:\n"
+
+#: ../src/readelf.c:1958
+#, 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:1968
+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:1970
+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:1990
+#, 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:2078
+#, c-format
+msgid "bad dynamic symbol"
+msgstr "símbolo dinámico erróneo"
+
+#: ../src/readelf.c:2160
+msgid "none"
+msgstr "nada"
+
+#: ../src/readelf.c:2177
+msgid "| <unknown>"
+msgstr "| <desconocido>"
+
+#: ../src/readelf.c:2202
+#, c-format
+msgid ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+"\n"
+"Sección de versión necesita [%2u] '%s' contiene entrada %d entry:\n"
+" Dirección: %#0*<PRIx64> Compensación: %#08<PRIx64> Enlace a sección: [%2u] '%s'\n"
+msgstr[1] ""
+"\n"
+"Versión necesita sección [%2u] '%s' contiene entrada %d:\n"
+" Dirección: %#0*<PRIx64> Compensación: %#08<PRIx64> Enlace a sección: [%2u] '%s'\n"
+
+#: ../src/readelf.c:2225
+#, c-format
+msgid " %#06x: Version: %hu File: %s Cnt: %hu\n"
+msgstr " %#06x: Versión: %hu Fichero: %s Conteo: %hu\n"
+
+#: ../src/readelf.c:2238
+#, c-format
+msgid " %#06x: Name: %s Flags: %s Version: %hu\n"
+msgstr " %#06x: Nombre: %s Banderas: %s Versión: %hu\n"
+
+#: ../src/readelf.c:2269
+#, c-format
+msgid ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+"\n"
+"Sección de definición de versión [%2u] '%s' contiene entrada %d:\n"
+" Dirección: %#0*<PRIx64> Compensación: %#08<PRIx64> Enlace a sección: [%2u] '%s'\n"
+msgstr[1] ""
+"\n"
+"Sección de definición de versión [%2u] '%s' contiene %d entrada:\n"
+" Dirección: %#0*<PRIx64> Compensación: %#08<PRIx64> Enlace a sección: [%2u] '%s'\n"
+
+#: ../src/readelf.c:2299
+#, 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:2314
+#, c-format
+msgid " %#06x: Parent %d: %s\n"
+msgstr " %#06x: Principal %d: %s\n"
+
+#: ../src/readelf.c:2546
+#, c-format
+msgid ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgid_plural ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgstr[0] ""
+"\n"
+"Sección de versión de símbolos [%2u] '%s' contiene %d entrada:\n"
+" Dirección: %#0*<PRIx64> Compensación: %#08<PRIx64> Enlace a sección: [%2u] '%s'"
+msgstr[1] ""
+"\n"
+"Sección de versión de símbolos [%2u] '%s' contiene entradas %d:\n"
+" Dirección: %#0*<PRIx64> Compensación: %#08<PRIx64> Enlace a sección: [%2u] '%s'"
+
+#: ../src/readelf.c:2576
+msgid " 0 *local* "
+msgstr " 0 *local* "
+
+#: ../src/readelf.c:2581
+msgid " 1 *global* "
+msgstr " 1 *global* "
+
+#: ../src/readelf.c:2612
+#, c-format
+msgid ""
+"\n"
+"Histogram 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"
+msgid_plural ""
+"\n"
+"Histogram for bucket list length in section [%2u] '%s' (total of %d buckets):\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+"\n"
+"Histograma para longitud de lista de cubeta en sección [%2u] '%s' (total de cubetas %d):\n"
+" Dirección: %#0*<PRIx64> Compensación: %#08<PRIx64> Enlace a sección: [%2u] '%s'\n"
+msgstr[1] ""
+"\n"
+"Histograma para longitud de lista de cubeta en sección [%2u] '%s' (total de cubetas %d):\n"
+" Dirección: %#0*<PRIx64> Compensación: %#08<PRIx64> Enlace a sección: [%2u] '%s'\n"
+
+#: ../src/readelf.c:2636
+#, no-c-format
+msgid " Length Number % of total Coverage\n"
+msgstr " Longitud Número % of total Cobertura\n"
+
+#: ../src/readelf.c:2638
+#, c-format
+msgid " 0 %6<PRIu32> %5.1f%%\n"
+msgstr " 0 %6<PRIu32> %5.1f%%\n"
+
+#: ../src/readelf.c:2645
+#, c-format
+msgid "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
+msgstr "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
+
+#: ../src/readelf.c:2658
+#, c-format
+msgid ""
+" Average number of tests: successful lookup: %f\n"
+" unsuccessful lookup: %f\n"
+msgstr ""
+" Número promedio de pruebas: búsqueda exitosa: %f\n"
+" búsqueda sin éxito: %f\n"
+
+#: ../src/readelf.c:2676
+#: ../src/readelf.c:2718
+#: ../src/readelf.c:2759
+#, 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:2813
+#, c-format
+msgid ""
+" Symbol Bias: %u\n"
+" Bitmask Size: %zu bytes %<PRIuFAST32>%% bits set 2nd hash shift: %u\n"
+msgstr ""
+" Polarización de símbolo: %u\n"
+" Tamaño de Bitmask: %zu bytes %<PRIuFAST32>%% bits establecen segundo cambio de dispersión: %u\n"
+
+#: ../src/readelf.c:2887
+#, c-format
+msgid ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+"\n"
+"Sección de lista de biblioteca [%2zu] '%s' en compensación %#0<PRIx64> contiene entrada %d:\n"
+msgstr[1] ""
+"\n"
+"Sección de lista de biblioteca [%2zu] '%s' en compensación %#0<PRIx64> contiene entradas %d:\n"
+
+#: ../src/readelf.c:2901
+msgid " Library Time Stamp Checksum Version Flags"
+msgstr " Biblioteca Marca de tiempo Indicadores de versión de suma de verificación"
+
+#: ../src/readelf.c:2951
+#, c-format
+msgid ""
+"\n"
+"Object attributes section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"Sección de atributos de objeto [%2zu] '%s' de %<PRIu64> bytes con desplazamiento %#0<PRIx64>:\n"
+
+#: ../src/readelf.c:2967
+msgid " Owner Size\n"
+msgstr " Propietario Tamaño\n"
+
+#: ../src/readelf.c:2993
+#, c-format
+msgid " %-13s %4<PRIu32>\n"
+msgstr " %-13s %4<PRIu32>\n"
+
+#: ../src/readelf.c:3025
+#, c-format
+msgid " %-4u %12<PRIu32>\n"
+msgstr " %-4u %12<PRIu32>\n"
+
+#. Tag_File
+#: ../src/readelf.c:3030
+#, c-format
+msgid " File: %11<PRIu32>\n"
+msgstr " File: %11<PRIu32>\n"
+
+#: ../src/readelf.c:3065
+#, c-format
+msgid " %s: %<PRId64>, %s\n"
+msgstr " %s: %<PRId64>, %s\n"
+
+#: ../src/readelf.c:3068
+#, c-format
+msgid " %s: %<PRId64>\n"
+msgstr " %s: %<PRId64>\n"
+
+#: ../src/readelf.c:3071
+#, c-format
+msgid " %s: %s\n"
+msgstr " %s: %s\n"
+
+#: ../src/readelf.c:3078
+#, c-format
+msgid " %u: %<PRId64>\n"
+msgstr " %u: %<PRId64>\n"
+
+#: ../src/readelf.c:3081
+#, c-format
+msgid " %u: %s\n"
+msgstr " %u: %s\n"
+
+#: ../src/readelf.c:3117
+#, c-format
+msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr "%s+%#<PRIx64> <%s+%#<PRIx64>>"
+
+#: ../src/readelf.c:3120
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
+
+#: ../src/readelf.c:3125
+#, c-format
+msgid "%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr "%#<PRIx64> <%s+%#<PRIx64>>"
+
+#: ../src/readelf.c:3128
+#, c-format
+msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr "%#0*<PRIx64> <%s+%#<PRIx64>>"
+
+#: ../src/readelf.c:3134
+#, c-format
+msgid "%s+%#<PRIx64> <%s>"
+msgstr "%s+%#<PRIx64> <%s>"
+
+#: ../src/readelf.c:3137
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s>"
+msgstr "%s+%#0*<PRIx64> <%s>"
+
+#: ../src/readelf.c:3141
+#, c-format
+msgid "%#<PRIx64> <%s>"
+msgstr "%#<PRIx64> <%s>"
+
+#: ../src/readelf.c:3144
+#, c-format
+msgid "%#0*<PRIx64> <%s>"
+msgstr "%#0*<PRIx64> <%s>"
+
+#: ../src/readelf.c:3149
+#, c-format
+msgid "%s+%#<PRIx64>"
+msgstr "%s+%#<PRIx64>"
+
+#: ../src/readelf.c:3152
+#, c-format
+msgid "%s+%#0*<PRIx64>"
+msgstr "%s+%#0*<PRIx64>"
+
+#: ../src/readelf.c:3260
+#, c-format
+msgid "unknown tag %hx"
+msgstr "etiqueta %hx desconocida"
+
+#: ../src/readelf.c:3262
+#, c-format
+msgid "unknown user tag %hx"
+msgstr "Usuario de etiqueta %hx desconocido "
+
+#: ../src/readelf.c:3480
+#, c-format
+msgid "unknown attribute %hx"
+msgstr "atributo de sección %hx desconocido"
+
+#: ../src/readelf.c:3483
+#, c-format
+msgid "unknown user attribute %hx"
+msgstr "Atributo de usuario desconocido %hx"
+
+#: ../src/readelf.c:3529
+#, c-format
+msgid "unknown form %<PRIx64>"
+msgstr "Forma %<PRIx64> desconocida"
+
+#: ../src/readelf.c:3763
+msgid "empty block"
+msgstr "bloque vacío"
+
+#: ../src/readelf.c:3766
+#, c-format
+msgid "%zu byte block:"
+msgstr "bloque de byte %zu:"
+
+#: ../src/readelf.c:4188
+#, c-format
+msgid "%*s[%4<PRIuMAX>] %s <TRUNCATED>\n"
+msgstr "%*s[%4<PRIuMAX>] %s <TRUNCATED>\n"
+
+#: ../src/readelf.c:4201
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [ Code]\n"
+msgstr ""
+"\n"
+"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
+" [ Código]\n"
+
+#: ../src/readelf.c:4208
+#, c-format
+msgid ""
+"\n"
+"Abbreviation section at offset %<PRIu64>:\n"
+msgstr ""
+"\n"
+"Sección de abreviatura en compensación %<PRIu64>:\n"
+
+#: ../src/readelf.c:4221
+#, c-format
+msgid " *** error while reading abbreviation: %s\n"
+msgstr " *** error en lectura de abreviatura: %s\n"
+
+#: ../src/readelf.c:4237
+#, c-format
+msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
+msgstr " [%5u] compensación: %<PRId64>, hijos: %s, etiqueta: %s\n"
+
+#: ../src/readelf.c:4240
+msgid "yes"
+msgstr "sí"
+
+#: ../src/readelf.c:4240
+msgid "no"
+msgstr "no"
+
+#: ../src/readelf.c:4276
+#, c-format
+msgid "cannot get .debug_aranges content: %s"
+msgstr "no se ha podido obtener contenido de .debug_aranges: %s"
+
+#: ../src/readelf.c:4281
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entries:\n"
+msgstr[0] ""
+"\n"
+"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entrada %zu:\n"
+msgstr[1] ""
+"\n"
+"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64> contiene entradas %zu:\n"
+
+#: ../src/readelf.c:4311
+#, c-format
+msgid " [%*zu] ???\n"
+msgstr " [%*zu] ???\n"
+
+#: ../src/readelf.c:4313
+#, c-format
+msgid " [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
+msgstr " Inicio [%*zu]: %0#*<PRIx64>, longitud: %5<PRIu64>, compensación CU DIE: %6<PRId64>\n"
+
+#: ../src/readelf.c:4332
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr "no se ha podido obtener contenido de .debug_ranges: %s"
+
+#: ../src/readelf.c:4337
+#: ../src/readelf.c:4823
+#: ../src/readelf.c:5470
+#: ../src/readelf.c:5915
+#: ../src/readelf.c:6014
+#: ../src/readelf.c:6186
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+"\n"
+"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
+
+#: ../src/readelf.c:4351
+#: ../src/readelf.c:5933
+#, c-format
+msgid " [%6tx] <INVALID DATA>\n"
+msgstr " [%6tx] <DATOS INVÁLIDOS>\n"
+
+#: ../src/readelf.c:4373
+#: ../src/readelf.c:5955
+#, c-format
+msgid " [%6tx] base address %s\n"
+msgstr " [%6tx] (dirección base) %s\n"
+
+#. We have an address range entry.
+#. First address range entry in a list.
+#: ../src/readelf.c:4384
+#, c-format
+msgid " [%6tx] %s..%s\n"
+msgstr " [%6tx] %s..%s\n"
+
+#: ../src/readelf.c:4386
+#, c-format
+msgid " %s..%s\n"
+msgstr " %s..%s\n"
+
+#: ../src/readelf.c:4812
+#: ../src/readelf.c:6252
+#: ../src/readelf.c:6354
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr "No se puede obtener el contenido %s: %s"
+
+#: ../src/readelf.c:4819
+#, c-format
+msgid ""
+"\n"
+"Call frame information section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+"\n"
+"Sección de información de marco de llamada [%2zu] '%s' en compensación %#<PRIx64>:\n"
+
+#: ../src/readelf.c:4846
+#: ../src/readelf.c:5504
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr "Datos inválidos en sección [%zu] '%s'"
+
+#: ../src/readelf.c:4868
+#, c-format
+msgid ""
+"\n"
+" [%6tx] Zero terminator\n"
+msgstr ""
+"\n"
+" [%6tx] Terminator cero\n"
+
+#: ../src/readelf.c:4937
+#, c-format
+msgid "invalid augmentation length"
+msgstr "longitud de aumento inválida"
+
+#: ../src/readelf.c:4949
+msgid "FDE address encoding: "
+msgstr "Codificación de dirección FDE:"
+
+#: ../src/readelf.c:4955
+msgid "LSDA pointer encoding: "
+msgstr "Codificación de puntero LSDA:"
+
+#: ../src/readelf.c:5047
+#, c-format
+msgid " (offset: %#<PRIx64>)"
+msgstr " (compensación: %#<PRIx64>)"
+
+#: ../src/readelf.c:5054
+#, c-format
+msgid " (end offset: %#<PRIx64>)"
+msgstr " (fin de compensación: %#<PRIx64>)"
+
+#: ../src/readelf.c:5081
+#, c-format
+msgid " %-26sLSDA pointer: %#<PRIx64>\n"
+msgstr "Puntero %-26sLSDA: %#<PRIx64>\n"
+
+#: ../src/readelf.c:5128
+#, c-format
+msgid "cannot get attribute code: %s"
+msgstr "No se puede obtener código de atributo: %s"
+
+#: ../src/readelf.c:5136
+#, c-format
+msgid "cannot get attribute form: %s"
+msgstr "No se puede obtener forma de atributo: %s"
+
+#: ../src/readelf.c:5149
+#, c-format
+msgid "cannot get attribute value: %s"
+msgstr "No se puede obtener valor: %s"
+
+#: ../src/readelf.c:5346
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [Offset]\n"
+msgstr ""
+"\n"
+"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
+" [Offset]\n"
+
+#: ../src/readelf.c:5371
+#, c-format
+msgid ""
+" Compilation unit at offset %<PRIu64>:\n"
+" Version: %<PRIu16>, Abbreviation section offset: %<PRIu64>, Address size: %<PRIu8>, Offset size: %<PRIu8>\n"
+msgstr ""
+"Unidad de compilación en compensación %<PRIu64>:\n"
+" 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:5392
+#, 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:5403
+#, c-format
+msgid "cannot get DIE offset: %s"
+msgstr "no se puede obtener DIE en compensación: %s"
+
+#: ../src/readelf.c:5411
+#, 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:5440
+#, c-format
+msgid "cannot get next DIE: %s\n"
+msgstr "No se puede obtener próximo DIE: %s\n"
+
+#: ../src/readelf.c:5447
+#, c-format
+msgid "cannot get next DIE: %s"
+msgstr "No se puede obtener próximo DIE: %s"
+
+#: ../src/readelf.c:5482
+#, 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:5495
+#, c-format
+msgid ""
+"\n"
+"Table at offset %Zu:\n"
+msgstr ""
+"\n"
+"Tabla en compensación %Zu:\n"
+
+#. Print what we got so far.
+#: ../src/readelf.c:5547
+#, c-format
+msgid ""
+"\n"
+" Length: %<PRIu64>\n"
+" DWARF version: %<PRIuFAST16>\n"
+" Prologue length: %<PRIu64>\n"
+" Minimum instruction length: %<PRIuFAST8>\n"
+" Initial value if '%s': %<PRIuFAST8>\n"
+" Line base: %<PRIdFAST8>\n"
+" Line range: %<PRIuFAST8>\n"
+" Opcode base: %<PRIuFAST8>\n"
+"\n"
+"Opcodes:\n"
+msgstr ""
+"\n"
+" Longitud: %<PRIu64>\n"
+" Versión DWARF: %<PRIuFAST16>\n"
+" Longitud de prólogo: %<PRIu64>\n"
+" Longitud de instrucción mínima: %<PRIuFAST8>\n"
+" Valor inicial si '%s': %<PRIuFAST8>\n"
+" Base de línea: %<PRIdFAST8>\n"
+" Rango de línea: %<PRIuFAST8>\n"
+" Base de código operativo: %<PRIuFAST8>\n"
+"\n"
+"Códigos operativos:\n"
+
+#: ../src/readelf.c:5566
+#, 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:5581
+#, 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:5589
+msgid ""
+"\n"
+"Directory table:"
+msgstr ""
+"\n"
+"Tabla de Directorio:"
+
+#: ../src/readelf.c:5605
+msgid ""
+"\n"
+"File name table:\n"
+" Entry Dir Time Size Name"
+msgstr ""
+"\n"
+"Tabla de nombre de archivo:\n"
+" Directorio de entrada Tiempo Tamaño Nombre"
+
+#: ../src/readelf.c:5634
+msgid ""
+"\n"
+"Line number statements:"
+msgstr ""
+"\n"
+" Declaraciones de número de Línea:"
+
+#: ../src/readelf.c:5695
+#, 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:5715
+#, c-format
+msgid " extended opcode %u: "
+msgstr " Código operativo extendido %u: "
+
+#: ../src/readelf.c:5720
+msgid "end of sequence"
+msgstr "Fin de secuencia"
+
+#: ../src/readelf.c:5735
+#, c-format
+msgid "set address to %s\n"
+msgstr "Establecer dirección a %s\n"
+
+#: ../src/readelf.c:5756
+#, 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"
+
+#. Unknown, ignore it.
+#: ../src/readelf.c:5765
+msgid "unknown opcode"
+msgstr "código operativo desconocido "
+
+#. Takes no argument.
+#: ../src/readelf.c:5777
+msgid " copy"
+msgstr "Copiar"
+
+#: ../src/readelf.c:5787
+#, c-format
+msgid "advance address by %u to %s\n"
+msgstr "Dirección de avance por %u a %s\n"
+
+#: ../src/readelf.c:5798
+#, 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:5806
+#, c-format
+msgid " set file to %<PRIu64>\n"
+msgstr " establecer archivo a %<PRIu64>\n"
+
+#: ../src/readelf.c:5816
+#, c-format
+msgid " set column to %<PRIu64>\n"
+msgstr " Establecer columna a %<PRIu64>\n"
+
+#: ../src/readelf.c:5823
+#, c-format
+msgid " set '%s' to %<PRIuFAST8>\n"
+msgstr "Establecer '%s' a %<PRIuFAST8>\n"
+
+#. Takes no argument.
+#: ../src/readelf.c:5829
+msgid " set basic block flag"
+msgstr "Establecer bandera de bloque básico"
+
+#: ../src/readelf.c:5839
+#, 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:5855
+#, c-format
+msgid "advance address by fixed value %u to %s\n"
+msgstr "dirección de avance por valor corregido %u a %s\n"
+
+#. Takes no argument.
+#: ../src/readelf.c:5864
+msgid " set prologue end flag"
+msgstr " Establecer bandera prologue_end"
+
+#. Takes no argument.
+#: ../src/readelf.c:5869
+msgid " set epilogue begin flag"
+msgstr " Establecer bandera epilogue_begin"
+
+#. This is a new opcode the generator but not we know about.
+#. Read the parameters associated with it but then discard
+#. everything. Read all the parameters for this opcode.
+#: ../src/readelf.c:5878
+#, 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:5910
+#, c-format
+msgid "cannot get .debug_loc content: %s"
+msgstr "no es posible obtener contenido de .debug_loc: %s"
+
+#. First entry in a list.
+#: ../src/readelf.c:5969
+#, c-format
+msgid " [%6tx] %s..%s"
+msgstr " [%6tx] %s..%s"
+
+#: ../src/readelf.c:5971
+#, c-format
+msgid " %s..%s"
+msgstr " %s..%s"
+
+#: ../src/readelf.c:6024
+#, 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:6103
+#, 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:6171
+#, 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:6210
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" %*s String\n"
+msgstr ""
+"\n"
+"Sección DWARF [%2zu] '%s' en compensación %#<PRIx64>:\n"
+" %*s String\n"
+
+#: ../src/readelf.c:6224
+#, c-format
+msgid " *** error while reading strings: %s\n"
+msgstr " *** error en lectura de cadenas: %s\n"
+
+#: ../src/readelf.c:6244
+#, c-format
+msgid ""
+"\n"
+"Call frame search table section [%2zu] '.eh_frame_hdr':\n"
+msgstr ""
+"\n"
+"Sección de tabla de búsqueda de marco de llamada [%2zu] '.eh_frame_hdr':\n"
+
+#: ../src/readelf.c:6346
+#, c-format
+msgid ""
+"\n"
+"Exception handling table section [%2zu] '.gcc_except_table':\n"
+msgstr ""
+"\n"
+"Excepción en el manejo de la sección de tabla [%2zu] '.gcc_except_table':\n"
+
+#: ../src/readelf.c:6369
+#, c-format
+msgid " LPStart encoding: %#x "
+msgstr "Codificación LPStart: %#x "
+
+#: ../src/readelf.c:6381
+#, c-format
+msgid " TType encoding: %#x "
+msgstr "Codificación TType: %#x "
+
+#: ../src/readelf.c:6395
+#, c-format
+msgid " Call site encoding: %#x "
+msgstr "Codificación de sitio de llamada: %#x "
+
+#: ../src/readelf.c:6408
+msgid ""
+"\n"
+" Call site table:"
+msgstr ""
+"\n"
+" Tabla de sitio de llamada:"
+
+#: ../src/readelf.c:6422
+#, c-format
+msgid ""
+" [%4u] Call site start: %#<PRIx64>\n"
+" Call site length: %<PRIu64>\n"
+" Landing pad: %#<PRIx64>\n"
+" Action: %u\n"
+msgstr ""
+" [%4u] Call site start: %#<PRIx64>\n"
+" Call site length: %<PRIu64>\n"
+" Landing pad: %#<PRIx64>\n"
+" Action: %u\n"
+
+#: ../src/readelf.c:6482
+#, c-format
+msgid "invalid TType encoding"
+msgstr "Codificación TType inválida"
+
+#: ../src/readelf.c:6506
+#, c-format
+msgid "cannot get debug context descriptor: %s"
+msgstr "no se puede depurar descriptor de contexto: %s"
+
+#: ../src/readelf.c:6642
+#: ../src/readelf.c:7243
+#, c-format
+msgid "cannot convert core note data: %s"
+msgstr "no es posible convertir datos de la nota principal: %s"
+
+#: ../src/readelf.c:6983
+#, c-format
+msgid ""
+"\n"
+"%*s... <repeats %u more times> ..."
+msgstr ""
+"\n"
+"%*s... <repeats %u more times> ..."
+
+#: ../src/readelf.c:7342
+msgid " Owner Data size Type\n"
+msgstr " Owner Data size Type\n"
+
+#: ../src/readelf.c:7360
+#, c-format
+msgid " %-13.*s %9<PRId32> %s\n"
+msgstr " %-13.*s %9<PRId32> %s\n"
+
+#: ../src/readelf.c:7394
+#, 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:7421
+#, c-format
+msgid ""
+"\n"
+"Note section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"Sección de nota [%2zu] '%s' de %<PRIu64> bytes en compensación %#0<PRIx64>:\n"
+
+#: ../src/readelf.c:7444
+#, c-format
+msgid ""
+"\n"
+"Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"Segmento de nota de %<PRIu64> bytes en compensación %#0<PRIx64>:\n"
+
+#: ../src/readelf.c:7490
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no data to dump.\n"
+msgstr ""
+"\n"
+"Sección [%Zu] '%s' no tiene datos para volcar.\n"
+
+#: ../src/readelf.c:7496
+#: ../src/readelf.c:7519
+#, 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:7500
+#, c-format
+msgid ""
+"\n"
+"Hex dump of section [%Zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"Volcado Hex de sección [%Zu] '%s', %<PRIu64> bytes en compensación %#0<PRIx64>:\n"
+
+#: ../src/readelf.c:7513
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no strings to dump.\n"
+msgstr ""
+"\n"
+"Sección [%Zu] '%s' no tiene datos para volcar.\n"
+
+#: ../src/readelf.c:7523
+#, c-format
+msgid ""
+"\n"
+"String section [%Zu] '%s' contains %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"Sección de cadena [%Zu] '%s' contiene %<PRIu64> bytes en compensación %#0<PRIx64>:\n"
+
+#: ../src/readelf.c:7571
+#, c-format
+msgid ""
+"\n"
+"section [%lu] does not exist"
+msgstr ""
+"\n"
+"sección [%lu] no existe"
+
+#: ../src/readelf.c:7598
+#, c-format
+msgid ""
+"\n"
+"section '%s' does not exist"
+msgstr ""
+"\n"
+"sección '%s' no existe"
+
+#: ../src/readelf.c:7659
+#, 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:7662
+#, c-format
+msgid ""
+"\n"
+"Archive '%s' has no symbol index\n"
+msgstr ""
+"\n"
+"Archivo '%s' no tiene índice de símbolo\n"
+
+#: ../src/readelf.c:7666
+#, c-format
+msgid ""
+"\n"
+"Index of archive '%s' has %Zu entries:\n"
+msgstr ""
+"\n"
+"Índice de archivo '%s' tiene %Zu entradas:\n"
+
+#: ../src/readelf.c:7684
+#, 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:7689
+#, c-format
+msgid "Archive member '%s' contains:\n"
+msgstr "Miembro de archivo contiene '%s':\n"
+
+#: ../src/size.c:68
+msgid "Use the output format FORMAT. FORMAT can be `bsd' or `sysv'. The default is `bsd'"
+msgstr "Utilice el formato de salida FORMAT. FORMAT puede ser tanto `bsd' como `sysv'. El establecido por defecto es `bsd'"
+
+#: ../src/size.c:70
+msgid "Same as `--format=sysv'"
+msgstr "lo mismo que `--format=sysv'"
+
+#: ../src/size.c:71
+msgid "Same as `--format=bsd'"
+msgstr "lo mismo que `--format=bsd'"
+
+#: ../src/size.c:74
+msgid "Same as `--radix=10'"
+msgstr "lo mismo que `--radix=10'"
+
+#: ../src/size.c:75
+msgid "Same as `--radix=8'"
+msgstr "lo mismo que `--radix=8'"
+
+#: ../src/size.c:76
+msgid "Same as `--radix=16'"
+msgstr "lo mismo que`--radix=16'"
+
+#: ../src/size.c:78
+msgid "Similar to `--format=sysv' output but in one line"
+msgstr "Similar a la salida `--format=sysv' pero en una sola línea"
+
+#: ../src/size.c:82
+msgid "Print size and permission flags for loadable segments"
+msgstr "Imprime el tamaño y las marcas de permiso para los segmentos que pueden ser cargados"
+
+#: ../src/size.c:83
+msgid "Display the total sizes (bsd only)"
+msgstr "Muestra el tamaño total (bsd solamente)"
+
+#. Short description of program.
+#: ../src/size.c:88
+msgid "List section sizes of FILEs (a.out by default)."
+msgstr "Lista los tamaños de sección de FICHEROS (por defecto a.out). "
+
+#: ../src/size.c:269
+#, c-format
+msgid "Invalid format: %s"
+msgstr "Formato de archivo inválido: %s"
+
+#: ../src/size.c:280
+#, c-format
+msgid "Invalid radix: %s"
+msgstr "Radical inválido: %s"
+
+#: ../src/size.c:339
+#, c-format
+msgid "%s: file format not recognized"
+msgstr "%s: No se reconoce el formato del fichero"
+
+#: ../src/size.c:446
+#: ../src/size.c:589
+#, c-format
+msgid " (ex %s)"
+msgstr " (ex %s)"
+
+#: ../src/size.c:614
+msgid "(TOTALS)\n"
+msgstr "(TOTALES)\n"
+
+#: ../src/strings.c:70
+msgid "Output Selection:"
+msgstr "Selección de salida:"
+
+#: ../src/strings.c:71
+msgid "Scan entire file, not only loaded sections"
+msgstr "Explorar todo el archivo, no sólo las secciones cargadas"
+
+#: ../src/strings.c:73
+msgid "Only NUL-terminated sequences of MIN-LEN characters or more are printed"
+msgstr "Sólo secuencias NUL-terminated de caracteres MIN-LEN o más se imprimen"
+
+#: ../src/strings.c:74
+msgid "Select character size and endianess: s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit"
+msgstr "Seleccionar tamaño de caracter y Endianess: s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit"
+
+#: ../src/strings.c:78
+msgid "Print name of the file before each string."
+msgstr "Imprimir nombre de archivo antes de cada cadena."
+
+#: ../src/strings.c:80
+msgid "Print location of the string in base 8, 10, or 16 respectively."
+msgstr "Imprimir ubicación de la cadena en base 8, 10, o 16 respectivamente."
+
+#: ../src/strings.c:81
+msgid "Alias for --radix=o"
+msgstr "Alias para --radix=o"
+
+#. Short description of program.
+#: ../src/strings.c:88
+msgid "Print the strings of printable characters in files."
+msgstr "Imprimir las cadenas de caracteres imprimibles en archivos."
+
+#: ../src/strings.c:268
+#: ../src/strings.c:303
+#, c-format
+msgid "invalid value '%s' for %s parameter"
+msgstr "Valor inválido '%s' para parámetro %s"
+
+#: ../src/strings.c:314
+#, 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:601
+#, c-format
+msgid "lseek64 failed"
+msgstr "lseek64 falló"
+
+#: ../src/strings.c:616
+#: ../src/strings.c:680
+#, c-format
+msgid "re-mmap failed"
+msgstr "re-mmap falló"
+
+#: ../src/strings.c:653
+#, c-format
+msgid "mprotect failed"
+msgstr "mprotect falló"
+
+#: ../src/strip.c:74
+msgid "Place stripped output into FILE"
+msgstr "Colocar la salida obtenida en FICHERO"
+
+#: ../src/strip.c:75
+msgid "Extract the removed sections into FILE"
+msgstr "Extraer secciones eliminadas en FICHERO"
+
+#: ../src/strip.c:76
+msgid "Embed name FILE instead of -f argument"
+msgstr "Incorporar nombre FILE en lugar de argumento -f"
+
+#: ../src/strip.c:80
+msgid "Remove all debugging symbols"
+msgstr "Elimina todos los símbolos de depuración"
+
+#: ../src/strip.c:84
+msgid "Copy modified/access timestamps to the output"
+msgstr "Copiar marcas de tiempo modificadas/acceso a la salida"
+
+#: ../src/strip.c:86
+msgid "Remove .comment section"
+msgstr "Quitar sección de comentario"
+
+#: ../src/strip.c:89
+msgid "Relax a few rules to handle slightly broken ELF files"
+msgstr "Relaja algunas reglas para manejar ficheros ELF rotos"
+
+#. Short description of program.
+#: ../src/strip.c:94
+msgid "Discard symbols from object files."
+msgstr "Descarta símbolos de archivos objeto."
+
+#: ../src/strip.c:186
+#, c-format
+msgid "Only one input file allowed together with '-o' and '-f'"
+msgstr "Sólo se permite ingresar un archivo junto con '-o' y '-f'"
+
+#: ../src/strip.c:222
+#, c-format
+msgid "-f option specified twice"
+msgstr "opción -f especificada dos veces"
+
+#: ../src/strip.c:231
+#, c-format
+msgid "-F option specified twice"
+msgstr "opción -F especificada dos veces"
+
+#: ../src/strip.c:240
+#: ../src/unstrip.c:125
+#, c-format
+msgid "-o option specified twice"
+msgstr "opción -o especificada dos veces"
+
+#: ../src/strip.c:260
+#, c-format
+msgid "-R option supports only .comment section"
+msgstr "la opción -R soporta únicamente. sección de comentario"
+
+#: ../src/strip.c:298
+#: ../src/strip.c:322
+#, c-format
+msgid "cannot stat input file '%s'"
+msgstr "no sepuede stat fichero de entrada '%s'"
+
+#: ../src/strip.c:312
+#, c-format
+msgid "while opening '%s'"
+msgstr "mientras se abría '%s'"
+
+#: ../src/strip.c:350
+#, c-format
+msgid "%s: cannot use -o or -f when stripping archive"
+msgstr "%s: no puede utilizarse -o o -f cuando se extrae un archivo"
+
+#: ../src/strip.c:448
+#, c-format
+msgid "cannot open EBL backend"
+msgstr "No se puede abrir el segundo plano EBL"
+
+#: ../src/strip.c:498
+#: ../src/strip.c:522
+#, c-format
+msgid "cannot create new file '%s': %s"
+msgstr "no se puede crear fichero nuevo '%s': %s"
+
+#: ../src/strip.c:582
+#, c-format
+msgid "illformed file '%s'"
+msgstr "Fichero illformed '%s'"
+
+#: ../src/strip.c:869
+#: ../src/strip.c:956
+#, c-format
+msgid "while generating output file: %s"
+msgstr "al generar fichero de salida: %s"
+
+#: ../src/strip.c:929
+#: ../src/strip.c:1668
+#, c-format
+msgid "%s: error while creating ELF header: %s"
+msgstr "%s: error al crear encabezamiento ELF: %s"
+
+#: ../src/strip.c:943
+#, c-format
+msgid "while preparing output for '%s'"
+msgstr "al preparar salida para '%s'"
+
+#: ../src/strip.c:994
+#: ../src/strip.c:1050
+#, c-format
+msgid "while create section header section: %s"
+msgstr "al crear sección de encabezamiento de sección: %s"
+
+#: ../src/strip.c:1000
+#, c-format
+msgid "cannot allocate section data: %s"
+msgstr "no se puede asignar espacio para los datos: %s"
+
+#: ../src/strip.c:1059
+#, 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:1593
+#: ../src/strip.c:1690
+#, c-format
+msgid "while writing '%s': %s"
+msgstr "al escribir '%s': %s"
+
+#: ../src/strip.c:1604
+#, c-format
+msgid "while creating '%s'"
+msgstr "al crear '%s'"
+
+#: ../src/strip.c:1616
+#, 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:1676
+#, c-format
+msgid "%s: error while reading the file: %s"
+msgstr "%s: error al leer el fichero: %s"
+
+#: ../src/strip.c:1722
+#: ../src/strip.c:1729
+#, c-format
+msgid "error while finishing '%s': %s"
+msgstr "Error al terminar '%s': %s"
+
+#: ../src/strip.c:1752
+#: ../src/strip.c:1809
+#, c-format
+msgid "cannot set access and modification date of '%s'"
+msgstr "no es posible establecer acceso y fecha de modificación de '%s'"
+
+#: ../src/unstrip.c:78
+msgid "Match MODULE against file names, not module names"
+msgstr "Coincidir MODULO con nombres de archivo, no con nombres de módulo"
+
+#: ../src/unstrip.c:79
+msgid "Silently skip unfindable files"
+msgstr "Omitir silenciosamente los archivos perdidos"
+
+#: ../src/unstrip.c:82
+msgid "Place output into FILE"
+msgstr "Colocar salida en FICHERO"
+
+#: ../src/unstrip.c:84
+msgid "Create multiple output files under DIRECTORY"
+msgstr "Crear archivos de salida múltiple bajo DIRECTORIO"
+
+#: ../src/unstrip.c:85
+msgid "Use module rather than file names"
+msgstr "Usar módulo en lugar de nombres de archivo"
+
+#: ../src/unstrip.c:87
+msgid "Create output for modules that have no separate debug information"
+msgstr "Crear salida para módulos que no tienen información de depuración independiente"
+
+#: ../src/unstrip.c:90
+msgid "Apply relocations to section contents in ET_REL files"
+msgstr "Aplicar reubicaciones a contenido de sección en archivos ET_REL"
+
+#: ../src/unstrip.c:92
+msgid "Only list module and file names, build IDs"
+msgstr "Solamente listar módulo y nombres de archivo, crear los ID"
+
+#: ../src/unstrip.c:134
+#, c-format
+msgid "-d option specified twice"
+msgstr "opción -d especificada dos veces"
+
+#: ../src/unstrip.c:166
+#, c-format
+msgid "only one of -o or -d allowed"
+msgstr "Sólo se permite usar -o ó -d "
+
+#: ../src/unstrip.c:175
+#, 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:190
+#, c-format
+msgid "output directory '%s'"
+msgstr "Directorio de salida '%s'"
+
+#: ../src/unstrip.c:199
+#, c-format
+msgid "exactly two file arguments are required"
+msgstr "dos argumentos de archivos se requieren exactamente"
+
+#: ../src/unstrip.c:205
+#, 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:218
+#, 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:254
+#, c-format
+msgid "cannot create ELF header: %s"
+msgstr "no se puede crear el encabezamiento ELF: %s"
+
+#: ../src/unstrip.c:259
+#, c-format
+msgid "cannot copy ELF header: %s"
+msgstr "no se puede copiar encabezamiento ELF: %s"
+
+#: ../src/unstrip.c:264
+#: ../src/unstrip.c:1817
+#, c-format
+msgid "cannot create program headers: %s"
+msgstr "No pueden crear encabezamientos de programa: %s"
+
+#: ../src/unstrip.c:270
+#, c-format
+msgid "cannot copy program header: %s"
+msgstr "no puede copiar encabezamiento de programa: %s"
+
+#: ../src/unstrip.c:280
+#, c-format
+msgid "cannot copy section header: %s"
+msgstr "no se puede copiar encabezamiento de sección: %s"
+
+#: ../src/unstrip.c:283
+#: ../src/unstrip.c:1505
+#, c-format
+msgid "cannot get section data: %s"
+msgstr "no se pueden obtener datos de sección: %s"
+
+#: ../src/unstrip.c:285
+#: ../src/unstrip.c:1507
+#, c-format
+msgid "cannot copy section data: %s"
+msgstr "no pueden copiar datos de sección: %s"
+
+#: ../src/unstrip.c:309
+#, c-format
+msgid "cannot create directory '%s'"
+msgstr "no se puede crear el directorio '%s'"
+
+#: ../src/unstrip.c:349
+#: ../src/unstrip.c:763
+#: ../src/unstrip.c:1540
+#, c-format
+msgid "cannot get symbol table entry: %s"
+msgstr "no se puede obtener entrada de tabla de símbolos: %s"
+
+#: ../src/unstrip.c:365
+#: ../src/unstrip.c:580
+#: ../src/unstrip.c:601
+#: ../src/unstrip.c:613
+#: ../src/unstrip.c:1561
+#: ../src/unstrip.c:1691
+#: ../src/unstrip.c:1715
+#, c-format
+msgid "cannot update symbol table: %s"
+msgstr "no se puede actualizar tabla de símbolos: %s"
+
+#: ../src/unstrip.c:382
+#: ../src/unstrip.c:432
+#: ../src/unstrip.c:562
+#: ../src/unstrip.c:1209
+#: ../src/unstrip.c:1525
+#: ../src/unstrip.c:1720
+#: ../src/unstrip.c:1791
+#, c-format
+msgid "cannot update section header: %s"
+msgstr "no se puede actualizar encabezamiento de sección: %s"
+
+#: ../src/unstrip.c:408
+#: ../src/unstrip.c:419
+#, c-format
+msgid "cannot update relocation: %s"
+msgstr "no se puede actualizar reubicación: %s"
+
+#: ../src/unstrip.c:507
+#, c-format
+msgid "cannot get symbol version: %s"
+msgstr "no se puede obtener versión de símbolo: %s"
+
+#: ../src/unstrip.c:519
+#, 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:769
+#, c-format
+msgid "invalid string offset in symbol [%Zu]"
+msgstr "compensación de cadena inválida en símbolo [%Zu]"
+
+#: ../src/unstrip.c:911
+#: ../src/unstrip.c:1248
+#, c-format
+msgid "cannot read section [%Zu] name: %s"
+msgstr "no se puede leer nombre [%Zu]: %s"
+
+#: ../src/unstrip.c:952
+#: ../src/unstrip.c:971
+#: ../src/unstrip.c:1004
+#, c-format
+msgid "cannot read '.gnu.prelink_undo' section: %s"
+msgstr "no se puede leer sección '.gnu.prelink_undo': %s"
+
+#: ../src/unstrip.c:992
+#, c-format
+msgid "invalid contents in '%s' section"
+msgstr "contenido inválido en sección '%s'"
+
+#: ../src/unstrip.c:1047
+#: ../src/unstrip.c:1370
+#, c-format
+msgid "cannot find matching section for [%Zu] '%s'"
+msgstr "no se puede hallar sección coincidente para [%Zu] '%s'"
+
+#: ../src/unstrip.c:1171
+#: ../src/unstrip.c:1186
+#: ../src/unstrip.c:1451
+#, 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:1195
+#, 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:1223
+#: ../src/unstrip.c:1227
+#, 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:1231
+#: ../src/unstrip.c:1235
+#: ../src/unstrip.c:1466
+#, c-format
+msgid "cannot get section count: %s"
+msgstr "No se puede obtener cuenta de sección: %s"
+
+#: ../src/unstrip.c:1293
+#: ../src/unstrip.c:1385
+#, 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:1445
+#, c-format
+msgid "cannot add new section: %s"
+msgstr "No se puede añadir nueva sección: %s"
+
+#: ../src/unstrip.c:1548
+#, c-format
+msgid "symbol [%Zu] has invalid section index"
+msgstr "símbolo [%Zu] tiene índice de sección inválido"
+
+#: ../src/unstrip.c:1800
+#, c-format
+msgid "cannot get ELF header: %s"
+msgstr "no se puede leer encabezamiento ELF: %s"
+
+#: ../src/unstrip.c:1827
+#, c-format
+msgid "cannot update program header: %s"
+msgstr "no se puede actualizar encabezamiento de programa: %s"
+
+#: ../src/unstrip.c:1832
+#: ../src/unstrip.c:1911
+#, c-format
+msgid "cannot write output file: %s"
+msgstr "no se puede escribir al archivo de salida: %s"
+
+#: ../src/unstrip.c:1880
+#, 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:1883
+#, c-format
+msgid "DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
+msgstr "Datos DWARF en '%s' no se ajustan a polarización de pre-enlace; considere prelink -u"
+
+#: ../src/unstrip.c:1902
+#: ../src/unstrip.c:1942
+#: ../src/unstrip.c:1954
+#: ../src/unstrip.c:2034
+#, c-format
+msgid "cannot create ELF descriptor: %s"
+msgstr "no se puede crear un descriptor ELF: %s"
+
+#: ../src/unstrip.c:1960
+#, c-format
+msgid "'%s' and '%s' do not seem to match"
+msgstr "Al parecer '%s' y '%s'no coinciden"
+
+#: ../src/unstrip.c:1991
+#, 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:1995
+#, 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:2010
+#, 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:2014
+#, 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:2027
+#, c-format
+msgid "module '%s' file '%s' is not stripped"
+msgstr "No se obtuvo el archivo '%s' de módulo '%s' "
+
+#: ../src/unstrip.c:2058
+#, 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:2191
+#, c-format
+msgid "no matching modules found"
+msgstr "No se encontraron módulos coincidentes"
+
+#: ../src/unstrip.c:2200
+#, c-format
+msgid "matched more than one module"
+msgstr "coincidió con más de un módulo"
+
+#: ../src/unstrip.c:2247
+msgid ""
+"STRIPPED-FILE DEBUG-FILE\n"
+"[MODULE...]"
+msgstr ""
+"STRIPPED-FILE DEBUG-FILE\n"
+"[MODULE...]"
+
+#: ../src/unstrip.c:2248
+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"
+"\n"
+"MODULE arguments give file name patterns matching modules to process.\n"
+"With -f these match the file name of the main (stripped) file (slashes are never special), otherwise they match the simple module names. With no arguments, process all modules found.\n"
+"\n"
+"Multiple modules are written to files under OUTPUT-DIRECTORY, creating subdirectories as needed. With -m these files have simple module names, otherwise they have the name of the main file complete with directory underneath OUTPUT-DIRECTORY.\n"
+"\n"
+"With -n no files are written, but one line to standard output for each module:\n"
+"\tSTART+SIZE BUILDID FILE DEBUGFILE MODULENAME\n"
+"START and SIZE are hexadecimal giving the address bounds of the module. BUILDID is hexadecimal for the build ID bits, or - if no ID is known; the hexadecimal may be followed by @0xADDR giving the address where the ID resides if that is known. FILE is the file name found for the module, or - if none was found, or . if an ELF image is available but not from any named file. DEBUGFILE is the separate debuginfo file name, or - if no debuginfo was found, or . if FILE contains the debug information."
+msgstr ""
+"Combine stripped files with separate symbols and debug information.\vThe first form puts the result in DEBUG-FILE if -o was not given.\n"
+"\n"
+"MODULE arguments give file name patterns matching modules to process.\n"
+"With -f these match the file name of the main (stripped) file (slashes are never special), otherwise they match the simple module names. With no arguments, process all modules found.\n"
+"\n"
+"Multiple modules are written to files under OUTPUT-DIRECTORY, creating subdirectories as needed. With -m these files have simple module names, otherwise they have the name of the main file complete with directory underneath OUTPUT-DIRECTORY.\n"
+"\n"
+"With -n no files are written, but one line to standard output for each module:\n"
+"\tSTART+SIZE BUILDID FILE DEBUGFILE MODULENAME\n"
+"START and SIZE are hexadecimal giving the address bounds of the module. BUILDID is hexadecimal for the build ID bits, or - if no ID is known; the hexadecimal may be followed by @0xADDR giving the address where the ID resides if that is known. FILE is the file name found for the module, or - if none was found, or . if an ELF image is available but not from any named file. DEBUGFILE is the separate debuginfo file name, or - if no debuginfo was found, or . if FILE contains the debug information."
+
+#~ msgid "Equivalent to: -e -h -l"
+#~ msgstr "Equivalente a: -e -h -l"
+#~ msgid "zeroth section has nonzero info field\n"
+#~ msgstr "Sección zeroth tiene campo de información nonzero\n"
+#~ msgid " Version String: "
+#~ msgstr "Cadena versión:"
+#~ msgid ""
+#~ "\n"
+#~ "Section [%Zu] '%s' is empty.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Sección [%Zu] '%s' está vacía.\n"
+
diff --git a/po/fr.po b/po/fr.po
new file mode 100644
index 00000000..53c1fb10
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,5665 @@
+# Translations template for ELFUTILS.
+# Copyright (C) 2009 ORGANIZATION
+# This file is distributed under the same license as the elfutils package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: elfutils.master.fr\n"
+"Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
+"POT-Creation-Date: 2010-04-21 07:41-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <fedora-trans-fr@redhat.com>\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:51 lib/xmalloc.c:65 lib/xmalloc.c:79 src/readelf.c:2822
+#: src/readelf.c:3161 src/unstrip.c:2087 src/unstrip.c:2295
+#, c-format
+msgid "memory exhausted"
+msgstr ""
+
+#: libasm/asm_error.c:62 libdw/dwarf_error.c:79 libdwfl/libdwflP.h:70
+#: libelf/elf_error.c:81
+msgid "no error"
+msgstr ""
+
+#: libasm/asm_error.c:63 libdw/dwarf_error.c:88 libdwfl/libdwflP.h:72
+#: libelf/elf_error.c:112
+msgid "out of memory"
+msgstr ""
+
+#: libasm/asm_error.c:64 src/ldgeneric.c:2687
+#, c-format
+msgid "cannot create output file"
+msgstr ""
+
+#: libasm/asm_error.c:65
+msgid "invalid parameter"
+msgstr ""
+
+#: libasm/asm_error.c:66
+msgid "cannot change mode of output file"
+msgstr ""
+
+#: libasm/asm_error.c:67 src/ldgeneric.c:7001
+#, c-format
+msgid "cannot rename output file"
+msgstr ""
+
+#: libasm/asm_error.c:68
+msgid "duplicate symbol"
+msgstr ""
+
+#: libasm/asm_error.c:69
+msgid "invalid section type for operation"
+msgstr ""
+
+#: libasm/asm_error.c:70
+msgid "error during output of data"
+msgstr ""
+
+#: libasm/asm_error.c:71
+msgid "no backend support available"
+msgstr ""
+
+#: libasm/asm_error.c:81 libdw/dwarf_error.c:80 libdwfl/libdwflP.h:71
+#: libelf/elf_error.c:84
+msgid "unknown error"
+msgstr ""
+
+#: libdw/dwarf_error.c:81
+msgid "invalid access"
+msgstr ""
+
+#: libdw/dwarf_error.c:82
+msgid "no regular file"
+msgstr ""
+
+#: libdw/dwarf_error.c:83
+msgid "I/O error"
+msgstr ""
+
+#: libdw/dwarf_error.c:84
+msgid "invalid ELF file"
+msgstr ""
+
+#: libdw/dwarf_error.c:85
+msgid "no DWARF information"
+msgstr ""
+
+#: libdw/dwarf_error.c:86
+msgid "no ELF file"
+msgstr ""
+
+#: libdw/dwarf_error.c:87
+msgid "cannot get ELF header"
+msgstr ""
+
+#: libdw/dwarf_error.c:89
+msgid "not implemented"
+msgstr ""
+
+#: libdw/dwarf_error.c:90 libelf/elf_error.c:128 libelf/elf_error.c:176
+msgid "invalid command"
+msgstr ""
+
+#: libdw/dwarf_error.c:91
+msgid "invalid version"
+msgstr ""
+
+#: libdw/dwarf_error.c:92
+msgid "invalid file"
+msgstr ""
+
+#: libdw/dwarf_error.c:93
+msgid "no entries found"
+msgstr ""
+
+#: libdw/dwarf_error.c:94
+msgid "invalid DWARF"
+msgstr ""
+
+#: libdw/dwarf_error.c:95
+msgid "no string data"
+msgstr ""
+
+#: libdw/dwarf_error.c:96
+msgid "no address value"
+msgstr ""
+
+#: libdw/dwarf_error.c:97
+msgid "no constant value"
+msgstr ""
+
+#: libdw/dwarf_error.c:98
+msgid "no reference value"
+msgstr ""
+
+#: libdw/dwarf_error.c:99
+msgid "invalid reference value"
+msgstr ""
+
+#: libdw/dwarf_error.c:100
+msgid ".debug_line section missing"
+msgstr ""
+
+#: libdw/dwarf_error.c:101
+msgid "invalid .debug_line section"
+msgstr ""
+
+#: libdw/dwarf_error.c:102
+msgid "debug information too big"
+msgstr ""
+
+#: libdw/dwarf_error.c:103
+msgid "invalid DWARF version"
+msgstr ""
+
+#: libdw/dwarf_error.c:104
+msgid "invalid directory index"
+msgstr ""
+
+#: libdw/dwarf_error.c:105 libdwfl/libdwflP.h:91
+msgid "address out of range"
+msgstr ""
+
+#: libdw/dwarf_error.c:106
+msgid "no location list value"
+msgstr ""
+
+#: libdw/dwarf_error.c:107
+msgid "no block data"
+msgstr ""
+
+#: libdw/dwarf_error.c:108
+msgid "invalid line index"
+msgstr ""
+
+#: libdw/dwarf_error.c:109
+msgid "invalid address range index"
+msgstr ""
+
+#: libdw/dwarf_error.c:110 libdwfl/libdwflP.h:92
+msgid "no matching address range"
+msgstr ""
+
+#: libdw/dwarf_error.c:111
+msgid "no flag value"
+msgstr ""
+
+#: libdw/dwarf_error.c:112 libelf/elf_error.c:253
+msgid "invalid offset"
+msgstr ""
+
+#: libdw/dwarf_error.c:113
+msgid ".debug_ranges section missing"
+msgstr ""
+
+#: libdw/dwarf_error.c:114
+msgid "invalid CFI section"
+msgstr ""
+
+#: libdwfl/argp-std.c:67 src/unstrip.c:2237
+msgid "Input selection options:"
+msgstr ""
+
+#: libdwfl/argp-std.c:68
+msgid "Find addresses in FILE"
+msgstr ""
+
+#: libdwfl/argp-std.c:70
+msgid "Find addresses from signatures found in COREFILE"
+msgstr ""
+
+#: libdwfl/argp-std.c:72
+msgid "Find addresses in files mapped into process PID"
+msgstr ""
+
+#: libdwfl/argp-std.c:74
+msgid ""
+"Find addresses in files mapped as read from FILE in Linux /proc/PID/maps "
+"format"
+msgstr ""
+
+#: libdwfl/argp-std.c:76
+msgid "Find addresses in the running kernel"
+msgstr ""
+
+#: libdwfl/argp-std.c:78
+msgid "Kernel with all modules"
+msgstr ""
+
+#: libdwfl/argp-std.c:80
+msgid "Search path for separate debuginfo files"
+msgstr ""
+
+#: libdwfl/argp-std.c:163
+msgid "only one of -e, -p, -k, -K, or --core allowed"
+msgstr ""
+
+#: libdwfl/argp-std.c:223
+#, c-format
+msgid "cannot read ELF core file: %s"
+msgstr ""
+
+#: libdwfl/argp-std.c:241
+msgid "No modules recognized in core file"
+msgstr ""
+
+#: libdwfl/argp-std.c:253
+msgid "cannot load kernel symbols"
+msgstr ""
+
+#: libdwfl/argp-std.c:257
+msgid "cannot find kernel modules"
+msgstr ""
+
+#: libdwfl/argp-std.c:271
+msgid "cannot find kernel or modules"
+msgstr ""
+
+#: libdwfl/libdwflP.h:73
+msgid "See errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:74
+msgid "See elf_errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:75
+msgid "See dwarf_errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:76
+msgid "See ebl_errno (XXX missing)"
+msgstr ""
+
+#: libdwfl/libdwflP.h:77
+msgid "gzip decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:78
+msgid "bzip2 decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:79
+msgid "LZMA decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:80
+msgid "no support library found for machine"
+msgstr ""
+
+#: libdwfl/libdwflP.h:81
+msgid "Callbacks missing for ET_REL file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:82
+msgid "Unsupported relocation type"
+msgstr ""
+
+#: libdwfl/libdwflP.h:83
+msgid "r_offset is bogus"
+msgstr ""
+
+#: libdwfl/libdwflP.h:84 libelf/elf_error.c:132 libelf/elf_error.c:192
+msgid "offset out of range"
+msgstr ""
+
+#: libdwfl/libdwflP.h:85
+msgid "relocation refers to undefined symbol"
+msgstr ""
+
+#: libdwfl/libdwflP.h:86
+msgid "Callback returned failure"
+msgstr ""
+
+#: libdwfl/libdwflP.h:87
+msgid "No DWARF information found"
+msgstr ""
+
+#: libdwfl/libdwflP.h:88
+msgid "No symbol table found"
+msgstr ""
+
+#: libdwfl/libdwflP.h:89
+msgid "No ELF program headers"
+msgstr ""
+
+#: libdwfl/libdwflP.h:90
+msgid "address range overlaps an existing module"
+msgstr ""
+
+#: libdwfl/libdwflP.h:93
+msgid "image truncated"
+msgstr ""
+
+#: libdwfl/libdwflP.h:94
+msgid "ELF file opened"
+msgstr ""
+
+#: libdwfl/libdwflP.h:95
+msgid "not a valid ELF file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:96
+msgid "cannot handle DWARF type description"
+msgstr ""
+
+#: libebl/eblbackendname.c:63
+msgid "No backend"
+msgstr ""
+
+#: libebl/eblcorenotetypename.c:107 libebl/eblobjecttypename.c:78
+#: libebl/eblobjnotetypename.c:86 libebl/eblosabiname.c:98
+#: libebl/eblsectionname.c:110 libebl/eblsectiontypename.c:140
+#: libebl/eblsegmenttypename.c:104
+msgid "<unknown>"
+msgstr ""
+
+#: libebl/ebldynamictagname.c:126
+#, c-format
+msgid "<unknown>: %#<PRIx64>"
+msgstr ""
+
+#: libebl/eblobjnote.c:76
+#, c-format
+msgid " Build ID: "
+msgstr ""
+
+#: libebl/eblobjnote.c:87
+#, c-format
+msgid " Linker version: %.*s\n"
+msgstr ""
+
+#: libebl/eblobjnote.c:136
+#, c-format
+msgid " OS: %s, ABI: "
+msgstr ""
+
+#: libebl/eblosabiname.c:95
+msgid "Stand alone"
+msgstr ""
+
+#: libebl/eblsymbolbindingname.c:92 libebl/eblsymboltypename.c:98
+#, c-format
+msgid "<unknown>: %d"
+msgstr ""
+
+#: libelf/elf_error.c:88
+msgid "unknown version"
+msgstr ""
+
+#: libelf/elf_error.c:92
+msgid "unknown type"
+msgstr ""
+
+#: libelf/elf_error.c:96
+msgid "invalid `Elf' handle"
+msgstr ""
+
+#: libelf/elf_error.c:100
+msgid "invalid size of source operand"
+msgstr ""
+
+#: libelf/elf_error.c:104
+msgid "invalid size of destination operand"
+msgstr ""
+
+#: libelf/elf_error.c:108 src/readelf.c:4779
+#, c-format
+msgid "invalid encoding"
+msgstr ""
+
+#: libelf/elf_error.c:116
+msgid "invalid file descriptor"
+msgstr ""
+
+#: libelf/elf_error.c:120
+msgid "invalid operation"
+msgstr ""
+
+#: libelf/elf_error.c:124
+msgid "ELF version not set"
+msgstr ""
+
+#: libelf/elf_error.c:136
+msgid "invalid fmag field in archive header"
+msgstr ""
+
+#: libelf/elf_error.c:140
+msgid "invalid archive file"
+msgstr ""
+
+#: libelf/elf_error.c:144
+msgid "descriptor is not for an archive"
+msgstr ""
+
+#: libelf/elf_error.c:148
+msgid "no index available"
+msgstr ""
+
+#: libelf/elf_error.c:152
+msgid "cannot read data from file"
+msgstr ""
+
+#: libelf/elf_error.c:156
+msgid "cannot write data to file"
+msgstr ""
+
+#: libelf/elf_error.c:160
+msgid "invalid binary class"
+msgstr ""
+
+#: libelf/elf_error.c:164
+msgid "invalid section index"
+msgstr ""
+
+#: libelf/elf_error.c:168
+msgid "invalid operand"
+msgstr ""
+
+#: libelf/elf_error.c:172
+msgid "invalid section"
+msgstr ""
+
+#: libelf/elf_error.c:180
+msgid "executable header not created first"
+msgstr ""
+
+#: libelf/elf_error.c:184
+msgid "file descriptor disabled"
+msgstr ""
+
+#: libelf/elf_error.c:188
+msgid "archive/member file descriptor mismatch"
+msgstr ""
+
+#: libelf/elf_error.c:196
+msgid "cannot manipulate null section"
+msgstr ""
+
+#: libelf/elf_error.c:200
+msgid "data/scn mismatch"
+msgstr ""
+
+#: libelf/elf_error.c:204
+msgid "invalid section header"
+msgstr ""
+
+#: libelf/elf_error.c:208 src/readelf.c:6242 src/readelf.c:6343
+#, c-format
+msgid "invalid data"
+msgstr ""
+
+#: libelf/elf_error.c:212
+msgid "unknown data encoding"
+msgstr ""
+
+#: libelf/elf_error.c:216
+msgid "section `sh_size' too small for data"
+msgstr ""
+
+#: libelf/elf_error.c:220
+msgid "invalid section alignment"
+msgstr ""
+
+#: libelf/elf_error.c:224
+msgid "invalid section entry size"
+msgstr ""
+
+#: libelf/elf_error.c:228
+msgid "update() for write on read-only file"
+msgstr ""
+
+#: libelf/elf_error.c:232
+msgid "no such file"
+msgstr ""
+
+#: libelf/elf_error.c:236
+msgid "only relocatable files can contain section groups"
+msgstr ""
+
+#: libelf/elf_error.c:241
+msgid ""
+"program header only allowed in executables, shared objects, and core files"
+msgstr ""
+
+#: libelf/elf_error.c:248
+msgid "file has no program header"
+msgstr ""
+
+#: src/addr2line.c:66
+msgid "Output selection options:"
+msgstr ""
+
+#: src/addr2line.c:67
+msgid "Show only base names of source files"
+msgstr ""
+
+#: src/addr2line.c:69
+msgid "Show absolute file names using compilation directory"
+msgstr ""
+
+#: src/addr2line.c:70
+msgid "Also show function names"
+msgstr ""
+
+#: src/addr2line.c:71
+msgid "Also show symbol or section names"
+msgstr ""
+
+#: src/addr2line.c:73
+msgid "Treat addresses as offsets relative to NAME section."
+msgstr ""
+
+#: src/addr2line.c:75 src/elfcmp.c:75 src/findtextrel.c:75 src/nm.c:103
+#: src/strings.c:83
+msgid "Miscellaneous:"
+msgstr ""
+
+#: src/addr2line.c:84
+msgid ""
+"Locate source files and line information for ADDRs (in a.out by default)."
+msgstr ""
+
+#: src/addr2line.c:88
+msgid "[ADDR...]"
+msgstr ""
+
+#: src/addr2line.c:185 src/ar.c:289 src/elfcmp.c:555 src/elflint.c:239
+#: src/findtextrel.c:170 src/ld.c:957 src/nm.c:253 src/objdump.c:181
+#: src/ranlib.c:136 src/readelf.c:449 src/size.c:219 src/strings.c:227
+#: src/strip.c:204 src/unstrip.c:234
+#, c-format
+msgid ""
+"Copyright (C) %s Red Hat, Inc.\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+
+#: src/addr2line.c:190 src/ar.c:294 src/elfcmp.c:560 src/elflint.c:244
+#: src/findtextrel.c:175 src/ld.c:962 src/nm.c:258 src/objdump.c:186
+#: src/ranlib.c:141 src/readelf.c:454 src/size.c:224 src/strings.c:232
+#: src/strip.c:209 src/unstrip.c:239
+#, c-format
+msgid "Written by %s.\n"
+msgstr ""
+
+#: src/addr2line.c:405
+#, c-format
+msgid "Section syntax requires exactly one module"
+msgstr ""
+
+#: src/addr2line.c:428
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside section '%s'"
+msgstr ""
+
+#: src/addr2line.c:461
+#, c-format
+msgid "cannot find symbol '%s'"
+msgstr ""
+
+#: src/addr2line.c:466
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
+msgstr ""
+
+#: src/ar.c:76
+msgid "Commands:"
+msgstr ""
+
+#: src/ar.c:77
+msgid "Delete files from archive."
+msgstr ""
+
+#: src/ar.c:78
+msgid "Move files in archive."
+msgstr ""
+
+#: src/ar.c:79
+msgid "Print files in archive."
+msgstr ""
+
+#: src/ar.c:80
+msgid "Quick append files to archive."
+msgstr ""
+
+#: src/ar.c:82
+msgid "Replace existing or insert new file into archive."
+msgstr ""
+
+#: src/ar.c:83
+msgid "Display content of archive."
+msgstr ""
+
+#: src/ar.c:84
+msgid "Extract files from archive."
+msgstr ""
+
+#: src/ar.c:86
+msgid "Command Modifiers:"
+msgstr ""
+
+#: src/ar.c:87
+msgid "Preserve original dates."
+msgstr ""
+
+#: src/ar.c:88
+msgid "Use instance [COUNT] of name."
+msgstr ""
+
+#: src/ar.c:90
+msgid "Do not replace existing files with extracted files."
+msgstr ""
+
+#: src/ar.c:91
+msgid "Allow filename to be truncated if necessary."
+msgstr ""
+
+#: src/ar.c:93
+msgid "Provide verbose output."
+msgstr ""
+
+#: src/ar.c:94
+msgid "Force regeneration of symbol table."
+msgstr ""
+
+#: src/ar.c:95
+msgid "Insert file after [MEMBER]."
+msgstr ""
+
+#: src/ar.c:96
+msgid "Insert file before [MEMBER]."
+msgstr ""
+
+#: src/ar.c:97
+msgid "Same as -b."
+msgstr ""
+
+#: src/ar.c:98
+msgid "Suppress message when library has to be created."
+msgstr ""
+
+#: src/ar.c:100
+msgid "Use full path for file matching."
+msgstr ""
+
+#: src/ar.c:101
+msgid "Update only older files in archive."
+msgstr ""
+
+#: src/ar.c:107
+msgid "Create, modify, and extract from archives."
+msgstr ""
+
+#: src/ar.c:110
+msgid "[MEMBER] [COUNT] ARCHIVE [FILE...]"
+msgstr ""
+
+#: src/ar.c:192
+#, c-format
+msgid "'a', 'b', and 'i' are only allowed with the 'm' and 'r' options"
+msgstr ""
+
+#: src/ar.c:197
+#, c-format
+msgid "MEMBER parameter required for 'a', 'b', and 'i' modifiers"
+msgstr ""
+
+#: src/ar.c:213
+#, c-format
+msgid "'N' is only meaningful with the 'x' and 'd' options"
+msgstr ""
+
+#: src/ar.c:218
+#, c-format
+msgid "COUNT parameter required"
+msgstr ""
+
+#: src/ar.c:230
+#, c-format
+msgid "invalid COUNT parameter %s"
+msgstr ""
+
+#: src/ar.c:237
+#, c-format
+msgid "'%c' is only meaningful with the 'x' option"
+msgstr ""
+
+#: src/ar.c:243
+#, c-format
+msgid "archive name required"
+msgstr ""
+
+#: src/ar.c:314
+#, c-format
+msgid "More than one operation specified"
+msgstr ""
+
+#: src/ar.c:404
+#, c-format
+msgid "cannot open archive '%s'"
+msgstr ""
+
+#: src/ar.c:414
+#, c-format
+msgid "cannot open archive '%s': %s"
+msgstr ""
+
+#: src/ar.c:418
+#, c-format
+msgid "%s: not an archive file"
+msgstr ""
+
+#: src/ar.c:422
+#, c-format
+msgid "cannot stat archive '%s'"
+msgstr ""
+
+#: src/ar.c:434
+#, c-format
+msgid "no entry %s in archive\n"
+msgstr ""
+
+#: src/ar.c:487 src/ar.c:929 src/ar.c:1129
+#, c-format
+msgid "cannot create hash table"
+msgstr ""
+
+#: src/ar.c:494 src/ar.c:936 src/ar.c:1138
+#, c-format
+msgid "cannot insert into hash table"
+msgstr ""
+
+#: src/ar.c:502 src/ranlib.c:176
+#, c-format
+msgid "cannot stat '%s'"
+msgstr ""
+
+#: src/ar.c:598
+#, c-format
+msgid "cannot read content of %s: %s"
+msgstr ""
+
+#: src/ar.c:641
+#, c-format
+msgid "cannot open %.*s"
+msgstr ""
+
+#: src/ar.c:663
+#, c-format
+msgid "failed to write %s"
+msgstr ""
+
+#: src/ar.c:675
+#, c-format
+msgid "cannot change mode of %s"
+msgstr ""
+
+#: src/ar.c:691
+#, c-format
+msgid "cannot change modification time of %s"
+msgstr ""
+
+#: src/ar.c:737
+#, c-format
+msgid "cannot rename temporary file to %.*s"
+msgstr ""
+
+#: src/ar.c:773 src/ar.c:1021 src/ar.c:1419 src/ranlib.c:250
+#, c-format
+msgid "cannot create new file"
+msgstr ""
+
+#: src/ar.c:1220
+#, c-format
+msgid "position member %s not found"
+msgstr ""
+
+#: src/ar.c:1230
+#, c-format
+msgid "%s: no entry %s in archive!\n"
+msgstr ""
+
+#: src/ar.c:1259 src/ldgeneric.c:519 src/objdump.c:257
+#, c-format
+msgid "cannot open %s"
+msgstr ""
+
+#: src/ar.c:1264
+#, c-format
+msgid "cannot stat %s"
+msgstr ""
+
+#: src/ar.c:1270
+#, c-format
+msgid "%s is no regular file"
+msgstr ""
+
+#: src/ar.c:1283
+#, c-format
+msgid "cannot get ELF descriptor for %s: %s\n"
+msgstr ""
+
+#: src/ar.c:1302
+#, c-format
+msgid "cannot read %s: %s"
+msgstr ""
+
+#: src/arlib.c:215
+#, c-format
+msgid "the archive '%s' is too large"
+msgstr ""
+
+#: src/arlib.c:228
+#, c-format
+msgid "cannot read ELF header of %s(%s): %s"
+msgstr ""
+
+#: src/elfcmp.c:69
+msgid "Control options:"
+msgstr ""
+
+#: src/elfcmp.c:70
+msgid ""
+"Control treatment of gaps in loadable segments [ignore|match] (default: "
+"ignore)"
+msgstr ""
+
+#: src/elfcmp.c:72
+msgid "Ignore permutation of buckets in SHT_HASH section"
+msgstr ""
+
+#: src/elfcmp.c:73
+msgid "Output nothing; yield exit status only"
+msgstr ""
+
+#: src/elfcmp.c:80
+msgid "Compare relevant parts of two ELF files for equality."
+msgstr ""
+
+#: src/elfcmp.c:84
+msgid "FILE1 FILE2"
+msgstr ""
+
+#: src/elfcmp.c:140
+msgid "Invalid number of parameters.\n"
+msgstr ""
+
+#: src/elfcmp.c:168 src/elfcmp.c:173
+#, c-format
+msgid "cannot get ELF header of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:190
+#, c-format
+msgid "%s %s diff: ELF header"
+msgstr ""
+
+#: src/elfcmp.c:198 src/elfcmp.c:201
+#, c-format
+msgid "cannot get section count of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:206
+#, c-format
+msgid "%s %s diff: section count"
+msgstr ""
+
+#: src/elfcmp.c:214 src/elfcmp.c:217
+#, c-format
+msgid "cannot get program header count of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:222
+#, c-format
+msgid "%s %s diff: program header count"
+msgstr ""
+
+#: src/elfcmp.c:281
+#, c-format
+msgid "%s %s differ: section header"
+msgstr ""
+
+#: src/elfcmp.c:309 src/elfcmp.c:315
+#, c-format
+msgid "cannot get content of section %zu in '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:331 src/elfcmp.c:337
+#, c-format
+msgid "cannot get symbol in '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:358
+#, c-format
+msgid "%s %s differ: symbol table [%zu]"
+msgstr ""
+
+#: src/elfcmp.c:361
+#, c-format
+msgid "%s %s differ: symbol table [%zu,%zu]"
+msgstr ""
+
+#: src/elfcmp.c:409
+#, c-format
+msgid "%s %s differ: section [%zu] '%s' content"
+msgstr ""
+
+#: src/elfcmp.c:413
+#, c-format
+msgid "%s %s differ: section [%zu,%zu] '%s' content"
+msgstr ""
+
+#: src/elfcmp.c:429
+#, c-format
+msgid "%s %s differ: unequal amount of important sections"
+msgstr ""
+
+#: src/elfcmp.c:463 src/elfcmp.c:468
+#, c-format
+msgid "cannot load data of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:487 src/elfcmp.c:493
+#, c-format
+msgid "cannot get program header entry %d of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:499
+#, c-format
+msgid "%s %s differ: program header %d"
+msgstr ""
+
+#: src/elfcmp.c:524
+#, c-format
+msgid "%s %s differ: gap"
+msgstr ""
+
+#: src/elfcmp.c:583
+#, c-format
+msgid "Invalid value '%s' for --gaps parameter."
+msgstr ""
+
+#: src/elfcmp.c:607 src/findtextrel.c:229 src/ldgeneric.c:1767
+#: src/ldgeneric.c:4257 src/nm.c:363 src/ranlib.c:169 src/size.c:301
+#: src/strings.c:183 src/strip.c:433 src/strip.c:468 src/unstrip.c:1900
+#: src/unstrip.c:1929
+#, c-format
+msgid "cannot open '%s'"
+msgstr ""
+
+#: src/elfcmp.c:611 src/findtextrel.c:236 src/ranlib.c:186
+#, c-format
+msgid "cannot create ELF descriptor for '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:616
+#, c-format
+msgid "cannot create EBL descriptor for '%s'"
+msgstr ""
+
+#: src/elfcmp.c:634
+#, c-format
+msgid "cannot get section header of section %zu: %s"
+msgstr ""
+
+#: src/elfcmp.c:644
+#, c-format
+msgid "cannot get content of section %zu: %s"
+msgstr ""
+
+#: src/elfcmp.c:654 src/elfcmp.c:668
+#, c-format
+msgid "cannot get relocation: %s"
+msgstr ""
+
+#: src/elflint.c:72
+msgid "Be extremely strict, flag level 2 features."
+msgstr ""
+
+#: src/elflint.c:73
+msgid "Do not print anything if successful"
+msgstr ""
+
+#: src/elflint.c:74
+msgid "Binary is a separate debuginfo file"
+msgstr ""
+
+#: src/elflint.c:76
+msgid ""
+"Binary has been created with GNU ld and is therefore known to be broken in "
+"certain ways"
+msgstr ""
+
+#: src/elflint.c:82
+msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
+msgstr ""
+
+#: src/elflint.c:86 src/readelf.c:118
+msgid "FILE..."
+msgstr ""
+
+#: src/elflint.c:159 src/readelf.c:272
+#, c-format
+msgid "cannot open input file"
+msgstr ""
+
+#: src/elflint.c:166
+#, c-format
+msgid "cannot generate Elf descriptor: %s\n"
+msgstr ""
+
+#: src/elflint.c:185
+#, c-format
+msgid "error while closing Elf descriptor: %s\n"
+msgstr ""
+
+#: src/elflint.c:189
+msgid "No errors"
+msgstr ""
+
+#: src/elflint.c:223 src/readelf.c:425
+msgid "Missing file name.\n"
+msgstr ""
+
+#: src/elflint.c:302
+#, c-format
+msgid " error while freeing sub-ELF descriptor: %s\n"
+msgstr ""
+
+#: src/elflint.c:310
+#, c-format
+msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
+msgstr ""
+
+#: src/elflint.c:370
+#, c-format
+msgid "e_ident[%d] == %d is no known class\n"
+msgstr ""
+
+#: src/elflint.c:375
+#, c-format
+msgid "e_ident[%d] == %d is no known data encoding\n"
+msgstr ""
+
+#: src/elflint.c:379
+#, c-format
+msgid "unknown ELF header version number e_ident[%d] == %d\n"
+msgstr ""
+
+#: src/elflint.c:385
+#, c-format
+msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
+msgstr ""
+
+#: src/elflint.c:391
+#, c-format
+msgid "unsupport ABI version e_ident[%d] == %d\n"
+msgstr ""
+
+#: src/elflint.c:396
+#, c-format
+msgid "e_ident[%zu] is not zero\n"
+msgstr ""
+
+#: src/elflint.c:401
+#, c-format
+msgid "unknown object file type %d\n"
+msgstr ""
+
+#: src/elflint.c:408
+#, c-format
+msgid "unknown machine type %d\n"
+msgstr ""
+
+#: src/elflint.c:412
+#, c-format
+msgid "unknown object file version\n"
+msgstr ""
+
+#: src/elflint.c:418
+#, c-format
+msgid "invalid program header offset\n"
+msgstr ""
+
+#: src/elflint.c:420
+#, c-format
+msgid "executables and DSOs cannot have zero program header offset\n"
+msgstr ""
+
+#: src/elflint.c:424
+#, c-format
+msgid "invalid number of program header entries\n"
+msgstr ""
+
+#: src/elflint.c:432
+#, c-format
+msgid "invalid section header table offset\n"
+msgstr ""
+
+#: src/elflint.c:435
+#, c-format
+msgid "section header table must be present\n"
+msgstr ""
+
+#: src/elflint.c:449
+#, c-format
+msgid "invalid number of section header table entries\n"
+msgstr ""
+
+#: src/elflint.c:466
+#, c-format
+msgid "invalid section header index\n"
+msgstr ""
+
+#: src/elflint.c:480
+#, c-format
+msgid "invalid number of program header table entries\n"
+msgstr ""
+
+#: src/elflint.c:489
+#, c-format
+msgid "invalid machine flags: %s\n"
+msgstr ""
+
+#: src/elflint.c:496 src/elflint.c:513
+#, c-format
+msgid "invalid ELF header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:499 src/elflint.c:516
+#, c-format
+msgid "invalid program header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:502 src/elflint.c:519
+#, c-format
+msgid "invalid program header position or size\n"
+msgstr ""
+
+#: src/elflint.c:505 src/elflint.c:522
+#, c-format
+msgid "invalid section header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:508 src/elflint.c:525
+#, c-format
+msgid "invalid section header position or size\n"
+msgstr ""
+
+#: src/elflint.c:569
+#, c-format
+msgid ""
+"section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
+"group\n"
+msgstr ""
+
+#: src/elflint.c:573
+#, c-format
+msgid ""
+"section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
+msgstr ""
+
+#: src/elflint.c:589 src/elflint.c:1432 src/elflint.c:1482 src/elflint.c:1591
+#: src/elflint.c:2185 src/elflint.c:2699 src/elflint.c:2860 src/elflint.c:2990
+#: src/elflint.c:3162 src/elflint.c:4062
+#, c-format
+msgid "section [%2d] '%s': cannot get section data\n"
+msgstr ""
+
+#: src/elflint.c:602 src/elflint.c:1598
+#, 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:625
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol table cannot have more than one extended index "
+"section\n"
+msgstr ""
+
+#: src/elflint.c:636
+#, c-format
+msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
+msgstr ""
+
+#: src/elflint.c:645
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
+msgstr ""
+
+#: src/elflint.c:650 src/elflint.c:653 src/elflint.c:656 src/elflint.c:659
+#: src/elflint.c:662 src/elflint.c:665
+#, c-format
+msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
+msgstr ""
+
+#: src/elflint.c:668
+#, c-format
+msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
+msgstr ""
+
+#: src/elflint.c:678
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:687
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
+msgstr ""
+
+#: src/elflint.c:700
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: too large section index but no extended "
+"section index section\n"
+msgstr ""
+
+#: src/elflint.c:706
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
+"st_shndx (%<PRIu32>)\n"
+msgstr ""
+
+#: src/elflint.c:718
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
+msgstr ""
+
+#: src/elflint.c:726
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown type\n"
+msgstr ""
+
+#: src/elflint.c:732
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
+msgstr ""
+
+#: src/elflint.c:737
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
+msgstr ""
+
+#: src/elflint.c:745
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
+msgstr ""
+
+#: src/elflint.c:749
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
+msgstr ""
+
+#: src/elflint.c:753
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
+msgstr ""
+
+#: src/elflint.c:785
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:791 src/elflint.c:816 src/elflint.c:859
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu does not fit completely in referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:800
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
+"SHF_TLS flag set\n"
+msgstr ""
+
+#: src/elflint.c:810 src/elflint.c:852
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:837
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
+msgstr ""
+
+#: src/elflint.c:845
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:872
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+
+#: src/elflint.c:879
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+
+#: src/elflint.c:886
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
+msgstr ""
+
+#: src/elflint.c:936
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section [%"
+"2d]\n"
+msgstr ""
+
+#: src/elflint.c:943
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:959
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
+"match %s section address %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:966
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
+"match %s section size %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:974
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
+"section\n"
+msgstr ""
+
+#: src/elflint.c:990
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
+"segment address %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:997
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
+"segment size %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:1010
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
+"default visibility\n"
+msgstr ""
+
+#: src/elflint.c:1014
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
+msgstr ""
+
+#: src/elflint.c:1059
+#, c-format
+msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
+msgstr ""
+
+#: src/elflint.c:1068 src/elflint.c:1120
+#, c-format
+msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
+msgstr ""
+
+#: src/elflint.c:1093 src/elflint.c:1145
+#, c-format
+msgid ""
+"section [%2d] '%s': relative relocations after index %d as specified by "
+"DT_RELCOUNT\n"
+msgstr ""
+
+#: src/elflint.c:1099 src/elflint.c:1151
+#, c-format
+msgid ""
+"section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
+"specified %d relative relocations\n"
+msgstr ""
+
+#: src/elflint.c:1111
+#, c-format
+msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
+msgstr ""
+
+#: src/elflint.c:1193
+#, c-format
+msgid "section [%2d] '%s': invalid destination section index\n"
+msgstr ""
+
+#: src/elflint.c:1206
+#, c-format
+msgid "section [%2d] '%s': invalid destination section type\n"
+msgstr ""
+
+#: src/elflint.c:1214
+#, c-format
+msgid "section [%2d] '%s': sh_info should be zero\n"
+msgstr ""
+
+#: src/elflint.c:1221
+#, c-format
+msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
+msgstr ""
+
+#: src/elflint.c:1228
+#, c-format
+msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
+msgstr ""
+
+#: src/elflint.c:1288
+#, c-format
+msgid "text relocation flag set but there is no read-only segment\n"
+msgstr ""
+
+#: src/elflint.c:1315
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid type\n"
+msgstr ""
+
+#: src/elflint.c:1323
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: relocation type invalid for the file "
+"type\n"
+msgstr ""
+
+#: src/elflint.c:1331
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
+msgstr ""
+
+#: src/elflint.c:1349
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
+"be used with %s\n"
+msgstr ""
+
+#: src/elflint.c:1366
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:1381
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: copy relocation against symbol of type %"
+"s\n"
+msgstr ""
+
+#: src/elflint.c:1402
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: read-only section modified but text "
+"relocation flag not set\n"
+msgstr ""
+
+#: src/elflint.c:1417
+#, c-format
+msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
+msgstr ""
+
+#: src/elflint.c:1456 src/elflint.c:1506
+#, c-format
+msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:1586
+#, c-format
+msgid "more than one dynamic section present\n"
+msgstr ""
+
+#: src/elflint.c:1604
+#, c-format
+msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
+msgstr ""
+
+#: src/elflint.c:1609 src/elflint.c:1901
+#, c-format
+msgid "section [%2d] '%s': sh_info not zero\n"
+msgstr ""
+
+#: src/elflint.c:1619
+#, c-format
+msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:1627
+#, c-format
+msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
+msgstr ""
+
+#: src/elflint.c:1634
+#, c-format
+msgid "section [%2d] '%s': entry %zu: unknown tag\n"
+msgstr ""
+
+#: src/elflint.c:1645
+#, c-format
+msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
+msgstr ""
+
+#: src/elflint.c:1655
+#, c-format
+msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
+msgstr ""
+
+#: src/elflint.c:1673
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
+msgstr ""
+
+#: src/elflint.c:1695
+#, 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:1738
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:1753
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must be valid offset in section [%"
+"2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:1773 src/elflint.c:1801
+#, c-format
+msgid "section [%2d] '%s': contains %s entry but not %s\n"
+msgstr ""
+
+#: src/elflint.c:1785
+#, c-format
+msgid "section [%2d] '%s': mandatory tag %s not present\n"
+msgstr ""
+
+#: src/elflint.c:1794
+#, c-format
+msgid "section [%2d] '%s': no hash section present\n"
+msgstr ""
+
+#: src/elflint.c:1809 src/elflint.c:1816
+#, c-format
+msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
+msgstr ""
+
+#: src/elflint.c:1826 src/elflint.c:1830
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
+msgstr ""
+
+#: src/elflint.c:1836
+#, c-format
+msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
+msgstr ""
+
+#: src/elflint.c:1847 src/elflint.c:1851 src/elflint.c:1855 src/elflint.c:1859
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
+msgstr ""
+
+#: src/elflint.c:1871
+#, c-format
+msgid ""
+"section [%2d] '%s': only relocatable files can have extended section index\n"
+msgstr ""
+
+#: src/elflint.c:1881
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index section not for symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1886
+#, c-format
+msgid "cannot get data for symbol section\n"
+msgstr ""
+
+#: src/elflint.c:1889
+#, c-format
+msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
+msgstr ""
+
+#: src/elflint.c:1896
+#, c-format
+msgid "section [%2d] '%s': extended index table too small for symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1911
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
+"same symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1922
+#, c-format
+msgid "symbol 0 should have zero extended section index\n"
+msgstr ""
+
+#: src/elflint.c:1934
+#, c-format
+msgid "cannot get data for symbol %zu\n"
+msgstr ""
+
+#: src/elflint.c:1939
+#, c-format
+msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
+msgstr ""
+
+#: src/elflint.c:1955 src/elflint.c:1996
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
+msgstr ""
+
+#: src/elflint.c:1967 src/elflint.c:2008
+#, c-format
+msgid "section [%2d] '%s': chain array too large\n"
+msgstr ""
+
+#: src/elflint.c:1976 src/elflint.c:2017
+#, c-format
+msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:1982
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2023
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2038
+#, c-format
+msgid "section [%2d] '%s': bitmask size not power of 2: %u\n"
+msgstr ""
+
+#: src/elflint.c:2049
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected at "
+"least%ld)\n"
+msgstr ""
+
+#: src/elflint.c:2057
+#, c-format
+msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
+msgstr ""
+
+#: src/elflint.c:2089
+#, c-format
+msgid ""
+"section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
+msgstr ""
+
+#: src/elflint.c:2110
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
+"undefined\n"
+msgstr ""
+
+#: src/elflint.c:2121
+#, c-format
+msgid ""
+"section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
+msgstr ""
+
+#: src/elflint.c:2152
+#, c-format
+msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2157
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2163
+#, c-format
+msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
+msgstr ""
+
+#: src/elflint.c:2176
+#, c-format
+msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
+msgstr ""
+
+#: src/elflint.c:2194
+#, c-format
+msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
+msgstr ""
+
+#: src/elflint.c:2202
+#, c-format
+msgid "section [%2d] '%s': hash table entry size incorrect\n"
+msgstr ""
+
+#: src/elflint.c:2207
+#, c-format
+msgid "section [%2d] '%s': not marked to be allocated\n"
+msgstr ""
+
+#: src/elflint.c:2212
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table has not even room for initial administrative "
+"entries\n"
+msgstr ""
+
+#: src/elflint.c:2260
+#, c-format
+msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
+msgstr ""
+
+#: src/elflint.c:2338 src/elflint.c:2342
+#, c-format
+msgid "section [%2zu] '%s': reference to symbol index 0\n"
+msgstr ""
+
+#: src/elflint.c:2349
+#, 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:2361
+#, 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:2377
+#, c-format
+msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
+msgstr ""
+
+#: src/elflint.c:2397
+#, c-format
+msgid ""
+"section [%2d] '%s': section groups only allowed in relocatable object files\n"
+msgstr ""
+
+#: src/elflint.c:2408
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol table: %s\n"
+msgstr ""
+
+#: src/elflint.c:2413
+#, c-format
+msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
+msgstr ""
+
+#: src/elflint.c:2419
+#, c-format
+msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
+msgstr ""
+
+#: src/elflint.c:2424
+#, c-format
+msgid "section [%2d] '%s': sh_flags not zero\n"
+msgstr ""
+
+#: src/elflint.c:2431
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol for signature\n"
+msgstr ""
+
+#: src/elflint.c:2436
+#, c-format
+msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
+msgstr ""
+
+#: src/elflint.c:2442
+#, c-format
+msgid "section [%2d] '%s': sh_flags not set correctly\n"
+msgstr ""
+
+#: src/elflint.c:2448
+#, c-format
+msgid "section [%2d] '%s': cannot get data: %s\n"
+msgstr ""
+
+#: src/elflint.c:2457
+#, c-format
+msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
+msgstr ""
+
+#: src/elflint.c:2462
+#, c-format
+msgid "section [%2d] '%s': section group without flags word\n"
+msgstr ""
+
+#: src/elflint.c:2468
+#, c-format
+msgid "section [%2d] '%s': section group without member\n"
+msgstr ""
+
+#: src/elflint.c:2472
+#, c-format
+msgid "section [%2d] '%s': section group with only one member\n"
+msgstr ""
+
+#: src/elflint.c:2483
+#, c-format
+msgid "section [%2d] '%s': unknown section group flags\n"
+msgstr ""
+
+#: src/elflint.c:2495
+#, c-format
+msgid "section [%2d] '%s': section index %Zu out of range\n"
+msgstr ""
+
+#: src/elflint.c:2504
+#, c-format
+msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:2511
+#, c-format
+msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:2517
+#, c-format
+msgid ""
+"section [%2d] '%s': element %Zu references section [%2d] '%s' without "
+"SHF_GROUP flag set\n"
+msgstr ""
+
+#: src/elflint.c:2524
+#, c-format
+msgid "section [%2d] '%s' is contained in more than one section group\n"
+msgstr ""
+
+#: src/elflint.c:2713
+#, 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:2724
+#, c-format
+msgid ""
+"section [%2d] '%s' has different number of entries than symbol table [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:2740
+#, c-format
+msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
+msgstr ""
+
+#: src/elflint.c:2756
+#, c-format
+msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
+msgstr ""
+
+#: src/elflint.c:2764
+#, c-format
+msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
+msgstr ""
+
+#: src/elflint.c:2778
+#, c-format
+msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
+msgstr ""
+
+#: src/elflint.c:2783
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %d: version index %d is for defined version\n"
+msgstr ""
+
+#: src/elflint.c:2793
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %d: version index %d is for requested version\n"
+msgstr ""
+
+#: src/elflint.c:2845
+#, c-format
+msgid "more than one version reference section present\n"
+msgstr ""
+
+#: src/elflint.c:2853 src/elflint.c:2982
+#, c-format
+msgid "section [%2d] '%s': sh_link does not link to string table\n"
+msgstr ""
+
+#: src/elflint.c:2876 src/elflint.c:3034
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong version %d\n"
+msgstr ""
+
+#: src/elflint.c:2882 src/elflint.c:3040
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:2890
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid file reference\n"
+msgstr ""
+
+#: src/elflint.c:2898
+#, c-format
+msgid "section [%2d] '%s': entry %d references unknown dependency\n"
+msgstr ""
+
+#: src/elflint.c:2910
+#, c-format
+msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
+msgstr ""
+
+#: src/elflint.c:2917
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
+"reference\n"
+msgstr ""
+
+#: src/elflint.c:2924
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: %"
+"#x, expected %#x\n"
+msgstr ""
+
+#: src/elflint.c:2934
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
+"name '%s'\n"
+msgstr ""
+
+#: src/elflint.c:2945
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
+msgstr ""
+
+#: src/elflint.c:2961 src/elflint.c:3119
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
+msgstr ""
+
+#: src/elflint.c:2974
+#, c-format
+msgid "more than one version definition section present\n"
+msgstr ""
+
+#: src/elflint.c:3019
+#, c-format
+msgid "section [%2d] '%s': more than one BASE definition\n"
+msgstr ""
+
+#: src/elflint.c:3023
+#, c-format
+msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
+msgstr ""
+
+#: src/elflint.c:3029
+#, c-format
+msgid "section [%2d] '%s': entry %d has unknown flag\n"
+msgstr ""
+
+#: src/elflint.c:3053
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid name reference\n"
+msgstr ""
+
+#: src/elflint.c:3060
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
+msgstr ""
+
+#: src/elflint.c:3069
+#, c-format
+msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
+msgstr ""
+
+#: src/elflint.c:3088
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:3103
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:3125
+#, c-format
+msgid "section [%2d] '%s': no BASE definition\n"
+msgstr ""
+
+#: src/elflint.c:3141
+#, c-format
+msgid "section [%2d] '%s': unknown parent version '%s'\n"
+msgstr ""
+
+#: src/elflint.c:3154
+#, c-format
+msgid "section [%2d] '%s': empty object attributes section\n"
+msgstr ""
+
+#: src/elflint.c:3175
+#, c-format
+msgid "section [%2d] '%s': unrecognized attribute format\n"
+msgstr ""
+
+#: src/elflint.c:3191
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: zero length field in attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3200
+#, c-format
+msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3212
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
+msgstr ""
+
+#: src/elflint.c:3229
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
+msgstr ""
+
+#: src/elflint.c:3238
+#, c-format
+msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3247
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
+msgstr ""
+
+#: src/elflint.c:3260
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
+msgstr ""
+
+#: src/elflint.c:3271
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
+msgstr ""
+
+#: src/elflint.c:3289
+#, c-format
+msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
+msgstr ""
+
+#: src/elflint.c:3300
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
+msgstr ""
+
+#: src/elflint.c:3313
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
+msgstr ""
+
+#: src/elflint.c:3317
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:3327
+#, c-format
+msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
+msgstr ""
+
+#: src/elflint.c:3333
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3422
+#, c-format
+msgid "cannot get section header of zeroth section\n"
+msgstr ""
+
+#: src/elflint.c:3426
+#, c-format
+msgid "zeroth section has nonzero name\n"
+msgstr ""
+
+#: src/elflint.c:3428
+#, c-format
+msgid "zeroth section has nonzero type\n"
+msgstr ""
+
+#: src/elflint.c:3430
+#, c-format
+msgid "zeroth section has nonzero flags\n"
+msgstr ""
+
+#: src/elflint.c:3432
+#, c-format
+msgid "zeroth section has nonzero address\n"
+msgstr ""
+
+#: src/elflint.c:3434
+#, c-format
+msgid "zeroth section has nonzero offset\n"
+msgstr ""
+
+#: src/elflint.c:3436
+#, c-format
+msgid "zeroth section has nonzero align value\n"
+msgstr ""
+
+#: src/elflint.c:3438
+#, c-format
+msgid "zeroth section has nonzero entry size value\n"
+msgstr ""
+
+#: src/elflint.c:3441
+#, c-format
+msgid ""
+"zeroth section has nonzero size value while ELF header has nonzero shnum "
+"value\n"
+msgstr ""
+
+#: src/elflint.c:3445
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in shstrndx\n"
+msgstr ""
+
+#: src/elflint.c:3449
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in phnum\n"
+msgstr ""
+
+#: src/elflint.c:3466
+#, c-format
+msgid "cannot get section header for section [%2zu] '%s': %s\n"
+msgstr ""
+
+#: src/elflint.c:3475
+#, c-format
+msgid "section [%2zu]: invalid name\n"
+msgstr ""
+
+#: src/elflint.c:3502
+#, c-format
+msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3518
+#, c-format
+msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3535
+#, c-format
+msgid ""
+"section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3553
+#, c-format
+msgid "section [%2zu] '%s' present in object file\n"
+msgstr ""
+
+#: src/elflint.c:3559 src/elflint.c:3591
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
+msgstr ""
+
+#: src/elflint.c:3564 src/elflint.c:3596
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
+"segments\n"
+msgstr ""
+
+#: src/elflint.c:3572
+#, c-format
+msgid ""
+"section [%2zu] '%s' is extension section index table in non-object file\n"
+msgstr ""
+
+#: src/elflint.c:3615
+#, c-format
+msgid "section [%2zu] '%s': size not multiple of entry size\n"
+msgstr ""
+
+#: src/elflint.c:3620
+#, c-format
+msgid "cannot get section header\n"
+msgstr ""
+
+#: src/elflint.c:3630
+#, c-format
+msgid "section [%2zu] '%s' has unsupported type %d\n"
+msgstr ""
+
+#: src/elflint.c:3644
+#, c-format
+msgid ""
+"section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:3651
+#, c-format
+msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:3659
+#, c-format
+msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
+msgstr ""
+
+#: src/elflint.c:3667
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in link value\n"
+msgstr ""
+
+#: src/elflint.c:3672
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in info value\n"
+msgstr ""
+
+#: src/elflint.c:3679
+#, c-format
+msgid "section [%2zu] '%s': strings flag set without merge flag\n"
+msgstr ""
+
+#: src/elflint.c:3684
+#, c-format
+msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
+msgstr ""
+
+#: src/elflint.c:3702
+#, c-format
+msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
+msgstr ""
+
+#: src/elflint.c:3711
+#, c-format
+msgid "section [%2zu] '%s' is both executable and writable\n"
+msgstr ""
+
+#: src/elflint.c:3738
+#, c-format
+msgid ""
+"section [%2zu] '%s' not fully contained in segment of program header entry %"
+"d\n"
+msgstr ""
+
+#: src/elflint.c:3746
+#, 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:3755
+#, 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:3766
+#, c-format
+msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
+msgstr ""
+
+#: src/elflint.c:3776
+#, c-format
+msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
+msgstr ""
+
+#: src/elflint.c:3786
+#, c-format
+msgid ""
+"section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:3792
+#, 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:3800
+#, c-format
+msgid ""
+"section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
+msgstr ""
+
+#: src/elflint.c:3851
+#, c-format
+msgid "more than one version symbol table present\n"
+msgstr ""
+
+#: src/elflint.c:3874
+#, c-format
+msgid "INTERP program header entry but no .interp section\n"
+msgstr ""
+
+#: src/elflint.c:3885
+#, c-format
+msgid ""
+"loadable segment [%u] is executable but contains no executable sections\n"
+msgstr ""
+
+#: src/elflint.c:3891
+#, c-format
+msgid "loadable segment [%u] is writable but contains no writable sections\n"
+msgstr ""
+
+#: src/elflint.c:3902
+#, c-format
+msgid ""
+"no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
+"exist\n"
+msgstr ""
+
+#: src/elflint.c:3915
+#, c-format
+msgid "duplicate version index %d\n"
+msgstr ""
+
+#: src/elflint.c:3929
+#, c-format
+msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
+msgstr ""
+
+#: src/elflint.c:3978
+#, c-format
+msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:3982
+#, c-format
+msgid ""
+"section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4005
+#, c-format
+msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4009
+#, c-format
+msgid ""
+"section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4026
+#, c-format
+msgid "phdr[%d]: no note entries defined for the type of file\n"
+msgstr ""
+
+#: src/elflint.c:4045
+#, c-format
+msgid "phdr[%d]: cannot get content of note section: %s\n"
+msgstr ""
+
+#: src/elflint.c:4048
+#, c-format
+msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
+msgstr ""
+
+#: src/elflint.c:4069
+#, c-format
+msgid "section [%2d] '%s': no note entries defined for the type of file\n"
+msgstr ""
+
+#: src/elflint.c:4076
+#, c-format
+msgid "section [%2d] '%s': cannot get content of note section\n"
+msgstr ""
+
+#: src/elflint.c:4079
+#, c-format
+msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
+msgstr ""
+
+#: src/elflint.c:4097
+#, c-format
+msgid ""
+"only executables, shared objects, and core files can have program headers\n"
+msgstr ""
+
+#: src/elflint.c:4112
+#, c-format
+msgid "cannot get program header entry %d: %s\n"
+msgstr ""
+
+#: src/elflint.c:4121
+#, c-format
+msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:4132
+#, c-format
+msgid "more than one INTERP entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4140
+#, c-format
+msgid "more than one TLS entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4147
+#, c-format
+msgid "static executable cannot have dynamic sections\n"
+msgstr ""
+
+#: src/elflint.c:4161
+#, c-format
+msgid "dynamic section reference in program header has wrong offset\n"
+msgstr ""
+
+#: src/elflint.c:4164
+#, c-format
+msgid "dynamic section size mismatch in program and section header\n"
+msgstr ""
+
+#: src/elflint.c:4174
+#, c-format
+msgid "more than one GNU_RELRO entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4195
+#, c-format
+msgid "loadable segment GNU_RELRO applies to is not writable\n"
+msgstr ""
+
+#: src/elflint.c:4198
+#, c-format
+msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
+msgstr ""
+
+#: src/elflint.c:4206 src/elflint.c:4229
+#, c-format
+msgid "%s segment not contained in a loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:4235
+#, c-format
+msgid "program header offset in ELF header and PHDR entry do not match"
+msgstr ""
+
+#: src/elflint.c:4259
+#, c-format
+msgid "call frame search table reference in program header has wrong offset\n"
+msgstr ""
+
+#: src/elflint.c:4262
+#, c-format
+msgid "call frame search table size mismatch in program and section header\n"
+msgstr ""
+
+#: src/elflint.c:4275
+#, c-format
+msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
+msgstr ""
+
+#: src/elflint.c:4283
+#, c-format
+msgid "call frame search table must be allocated\n"
+msgstr ""
+
+#: src/elflint.c:4286
+#, c-format
+msgid "section [%2zu] '%s' must be allocated\n"
+msgstr ""
+
+#: src/elflint.c:4290
+#, c-format
+msgid "call frame search table must not be writable\n"
+msgstr ""
+
+#: src/elflint.c:4293
+#, c-format
+msgid "section [%2zu] '%s' must not be writable\n"
+msgstr ""
+
+#: src/elflint.c:4298
+#, c-format
+msgid "call frame search table must not be executable\n"
+msgstr ""
+
+#: src/elflint.c:4301
+#, c-format
+msgid "section [%2zu] '%s' must not be executable\n"
+msgstr ""
+
+#: src/elflint.c:4312
+#, c-format
+msgid "program header entry %d: file size greater than memory size\n"
+msgstr ""
+
+#: src/elflint.c:4319
+#, c-format
+msgid "program header entry %d: alignment not a power of 2\n"
+msgstr ""
+
+#: src/elflint.c:4322
+#, c-format
+msgid ""
+"program header entry %d: file offset and virtual address not module of "
+"alignment\n"
+msgstr ""
+
+#: src/elflint.c:4335
+#, 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:4369
+#, c-format
+msgid "cannot read ELF header: %s\n"
+msgstr ""
+
+#: src/elflint.c:4395
+#, c-format
+msgid "text relocation flag set but not needed\n"
+msgstr ""
+
+#: src/findtextrel.c:70
+msgid "Input Selection:"
+msgstr ""
+
+#: src/findtextrel.c:71
+msgid "Prepend PATH to all file names"
+msgstr ""
+
+#: src/findtextrel.c:73
+msgid "Use PATH as root of debuginfo hierarchy"
+msgstr ""
+
+#: src/findtextrel.c:80
+msgid "Locate source of text relocations in FILEs (a.out by default)."
+msgstr ""
+
+#: src/findtextrel.c:84 src/nm.c:111 src/objdump.c:80 src/size.c:92
+#: src/strings.c:92 src/strip.c:97
+msgid "[FILE...]"
+msgstr ""
+
+#: src/findtextrel.c:246
+#, c-format
+msgid "cannot get ELF header '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:257
+#, c-format
+msgid "'%s' is not a DSO or PIE"
+msgstr ""
+
+#: src/findtextrel.c:274
+#, c-format
+msgid "getting get section header of section %zu: %s"
+msgstr ""
+
+#: src/findtextrel.c:292
+#, c-format
+msgid "cannot read dynamic section: %s"
+msgstr ""
+
+#: src/findtextrel.c:307
+#, c-format
+msgid "no text relocations reported in '%s'"
+msgstr ""
+
+#: src/findtextrel.c:319
+#, c-format
+msgid "while reading ELF file"
+msgstr ""
+
+#: src/findtextrel.c:328 src/findtextrel.c:345
+#, c-format
+msgid "cannot get program header index at offset %d: %s"
+msgstr ""
+
+#: src/findtextrel.c:397
+#, c-format
+msgid "cannot get section header of section %Zu: %s"
+msgstr ""
+
+#: src/findtextrel.c:409
+#, c-format
+msgid "cannot get symbol table section %zu in '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:429 src/findtextrel.c:452
+#, c-format
+msgid "cannot get relocation at index %d in section %zu in '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:517
+#, c-format
+msgid "%s not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:570
+#, c-format
+msgid ""
+"the file containing the function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:577 src/findtextrel.c:597
+#, c-format
+msgid ""
+"the file containing the function '%s' might not be compiled with -fpic/-"
+"fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:585
+#, c-format
+msgid ""
+"either the file containing the function '%s' or the file containing the "
+"function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:605
+#, c-format
+msgid ""
+"a relocation modifies memory at offset %llu in a write-protected segment\n"
+msgstr ""
+
+#: src/i386_ld.c:210
+#, c-format
+msgid "cannot allocate PLT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:232
+#, c-format
+msgid "cannot allocate PLTREL section: %s"
+msgstr ""
+
+#: src/i386_ld.c:253
+#, c-format
+msgid "cannot allocate GOT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:274
+#, c-format
+msgid "cannot allocate GOTPLT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:661
+#, c-format
+msgid "initial-executable TLS relocation cannot be used "
+msgstr ""
+
+#: src/ld.c:87
+msgid "Input File Control:"
+msgstr ""
+
+#: src/ld.c:89
+msgid "Include whole archives in the output from now on."
+msgstr ""
+
+#: src/ld.c:91
+msgid "Stop including the whole archives in the output."
+msgstr ""
+
+#: src/ld.c:92 src/ld.c:106 src/ld.c:184
+msgid "FILE"
+msgstr ""
+
+#: src/ld.c:93
+msgid "Start a group."
+msgstr ""
+
+#: src/ld.c:94
+msgid "End a group."
+msgstr ""
+
+#: src/ld.c:95
+msgid "PATH"
+msgstr ""
+
+#: src/ld.c:96
+msgid "Add PATH to list of directories files are searched in."
+msgstr ""
+
+#: src/ld.c:98
+msgid "Only set DT_NEEDED for following dynamic libs if actually used"
+msgstr ""
+
+#: src/ld.c:100
+msgid "Always set DT_NEEDED for following dynamic libs"
+msgstr ""
+
+#: src/ld.c:102
+msgid "Ignore LD_LIBRARY_PATH environment variable."
+msgstr ""
+
+#: src/ld.c:105
+msgid "Output File Control:"
+msgstr ""
+
+#: src/ld.c:106
+msgid "Place output in FILE."
+msgstr ""
+
+#: src/ld.c:109
+msgid "Object is marked to not use default search path at runtime."
+msgstr ""
+
+#: src/ld.c:111
+msgid "Same as --whole-archive."
+msgstr ""
+
+#: src/ld.c:112
+msgid ""
+"Default rules of extracting from archive; weak references are not enough."
+msgstr ""
+
+#: src/ld.c:116
+msgid "Weak references cause extraction from archive."
+msgstr ""
+
+#: src/ld.c:118
+msgid "Allow multiple definitions; first is used."
+msgstr ""
+
+#: src/ld.c:120
+msgid "Disallow/allow undefined symbols in DSOs."
+msgstr ""
+
+#: src/ld.c:123
+msgid "Object requires immediate handling of $ORIGIN."
+msgstr ""
+
+#: src/ld.c:125
+msgid "Relocation will not be processed lazily."
+msgstr ""
+
+#: src/ld.c:127
+msgid "Object cannot be unloaded at runtime."
+msgstr ""
+
+#: src/ld.c:129
+msgid "Mark object to be initialized first."
+msgstr ""
+
+#: src/ld.c:131
+msgid "Enable/disable lazy-loading flag for following dependencies."
+msgstr ""
+
+#: src/ld.c:133
+msgid "Mark object as not loadable with 'dlopen'."
+msgstr ""
+
+#: src/ld.c:135
+msgid "Ignore/record dependencies on unused DSOs."
+msgstr ""
+
+#: src/ld.c:137
+msgid "Generated DSO will be a system library."
+msgstr ""
+
+#: src/ld.c:138
+msgid "ADDRESS"
+msgstr ""
+
+#: src/ld.c:138
+msgid "Set entry point address."
+msgstr ""
+
+#: src/ld.c:141
+msgid "Do not link against shared libraries."
+msgstr ""
+
+#: src/ld.c:144
+msgid "Prefer linking against shared libraries."
+msgstr ""
+
+#: src/ld.c:145
+msgid "Export all dynamic symbols."
+msgstr ""
+
+#: src/ld.c:146
+msgid "Strip all symbols."
+msgstr ""
+
+#: src/ld.c:147
+msgid "Strip debugging symbols."
+msgstr ""
+
+#: src/ld.c:149
+msgid "Assume pagesize for the target system to be SIZE."
+msgstr ""
+
+#: src/ld.c:151
+msgid "Set runtime DSO search path."
+msgstr ""
+
+#: src/ld.c:154
+msgid "Set link time DSO search path."
+msgstr ""
+
+#: src/ld.c:155
+msgid "Generate dynamic shared object."
+msgstr ""
+
+#: src/ld.c:156
+msgid "Generate relocatable object."
+msgstr ""
+
+#: src/ld.c:159
+msgid "Causes symbol not assigned to a version be reduced to local."
+msgstr ""
+
+#: src/ld.c:160
+msgid "Remove unused sections."
+msgstr ""
+
+#: src/ld.c:163
+msgid "Don't remove unused sections."
+msgstr ""
+
+#: src/ld.c:164
+msgid "Set soname of shared object."
+msgstr ""
+
+#: src/ld.c:165
+msgid "Set the dynamic linker name."
+msgstr ""
+
+#: src/ld.c:168
+msgid "Add/suppress addition indentifying link-editor to .comment section."
+msgstr ""
+
+#: src/ld.c:171
+msgid "Create .eh_frame_hdr section"
+msgstr ""
+
+#: src/ld.c:173
+msgid "Set hash style to sysv, gnu or both."
+msgstr ""
+
+#: src/ld.c:175
+msgid "Generate build ID note (md5, sha1 (default), uuid)."
+msgstr ""
+
+#: src/ld.c:177
+msgid "Linker Operation Control:"
+msgstr ""
+
+#: src/ld.c:178
+msgid "Verbose messages."
+msgstr ""
+
+#: src/ld.c:179
+msgid "Trace file opens."
+msgstr ""
+
+#: src/ld.c:181
+msgid "Trade speed for less memory usage"
+msgstr ""
+
+#: src/ld.c:182
+msgid "LEVEL"
+msgstr ""
+
+#: src/ld.c:183
+msgid "Set optimization level to LEVEL."
+msgstr ""
+
+#: src/ld.c:184
+msgid "Use linker script in FILE."
+msgstr ""
+
+#: src/ld.c:187
+msgid "Select to get parser debug information"
+msgstr ""
+
+#: src/ld.c:190
+msgid "Read version information from FILE."
+msgstr ""
+
+#: src/ld.c:191
+msgid "Set emulation to NAME."
+msgstr ""
+
+#: src/ld.c:197
+msgid "Combine object and archive files."
+msgstr ""
+
+#: src/ld.c:200
+msgid "[FILE]..."
+msgstr ""
+
+#: src/ld.c:333
+#, c-format
+msgid "At least one input file needed"
+msgstr ""
+
+#: src/ld.c:349
+#, c-format
+msgid "error while preparing linking"
+msgstr ""
+
+#: src/ld.c:356
+#, c-format
+msgid "cannot open linker script '%s'"
+msgstr ""
+
+#: src/ld.c:397
+#, c-format
+msgid "-( without matching -)"
+msgstr ""
+
+#: src/ld.c:572 src/ld.c:610
+#, c-format
+msgid "only one option of -G and -r is allowed"
+msgstr ""
+
+#: src/ld.c:594
+#, c-format
+msgid "more than one '-m' parameter"
+msgstr ""
+
+#: src/ld.c:604 src/ld.c:1013
+#, c-format
+msgid "unknown option `-%c %s'"
+msgstr ""
+
+#: src/ld.c:646
+#, c-format
+msgid "invalid page size value '%s': ignored"
+msgstr ""
+
+#: src/ld.c:687
+#, c-format
+msgid "invalid hash style '%s'"
+msgstr ""
+
+#: src/ld.c:697
+#, c-format
+msgid "invalid build-ID style '%s'"
+msgstr ""
+
+#: src/ld.c:785
+#, c-format
+msgid "More than one output file name given."
+msgstr ""
+
+#: src/ld.c:802
+#, c-format
+msgid "Invalid optimization level `%s'"
+msgstr ""
+
+#: src/ld.c:850
+#, c-format
+msgid "nested -( -) groups are not allowed"
+msgstr ""
+
+#: src/ld.c:869
+#, c-format
+msgid "-) without matching -("
+msgstr ""
+
+#: src/ld.c:1046
+#, c-format
+msgid "unknown option '-%c %s'"
+msgstr ""
+
+#: src/ld.c:1150
+#, c-format
+msgid "could not find input file to determine output file format"
+msgstr ""
+
+#: src/ld.c:1152
+#, c-format
+msgid "try again with an appropriate '-m' parameter"
+msgstr ""
+
+#: src/ld.c:1446
+#, c-format
+msgid "cannot read version script '%s'"
+msgstr ""
+
+#: src/ld.c:1512 src/ld.c:1551
+#, c-format
+msgid "duplicate definition of '%s' in linker script"
+msgstr ""
+
+#: src/ldgeneric.c:209 src/ldgeneric.c:5151
+#, c-format
+msgid "cannot create string table"
+msgstr ""
+
+#: src/ldgeneric.c:255
+#, c-format
+msgid "cannot load ld backend library '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:265
+#, c-format
+msgid "cannot find init function in ld backend library '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:310
+#, c-format
+msgid "%s listed more than once as input"
+msgstr ""
+
+#: src/ldgeneric.c:424
+#, c-format
+msgid "%s (for -l%s)\n"
+msgstr ""
+
+#: src/ldgeneric.c:425
+#, c-format
+msgid "%s (for DT_NEEDED %s)\n"
+msgstr ""
+
+#: src/ldgeneric.c:573
+#, c-format
+msgid "Warning: type of `%s' changed from %s in %s to %s in %s"
+msgstr ""
+
+#: src/ldgeneric.c:586
+#, c-format
+msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
+msgstr ""
+
+#: src/ldgeneric.c:661 src/ldgeneric.c:1122 src/readelf.c:629 src/strip.c:543
+#, c-format
+msgid "cannot determine number of sections: %s"
+msgstr ""
+
+#: src/ldgeneric.c:677
+#, c-format
+msgid "(%s+%#<PRIx64>): multiple definition of %s `%s'\n"
+msgstr ""
+
+#: src/ldgeneric.c:700
+#, c-format
+msgid "(%s+%#<PRIx64>): first defined here\n"
+msgstr ""
+
+#: src/ldgeneric.c:819
+#, c-format
+msgid "%s: cannot get section group data: %s"
+msgstr ""
+
+#: src/ldgeneric.c:840
+#, c-format
+msgid "%s: section '%s' with group flag set does not belong to any group"
+msgstr ""
+
+#: src/ldgeneric.c:885
+#, c-format
+msgid "%s: section [%2d] '%s' is not in the correct section group"
+msgstr ""
+
+#: src/ldgeneric.c:1156 src/ldgeneric.c:1413 src/ldgeneric.c:1422
+#: src/ldgeneric.c:1481 src/ldgeneric.c:1490 src/ldgeneric.c:1753
+#: src/ldgeneric.c:2005
+#, c-format
+msgid "%s: invalid ELF file (%s:%d)\n"
+msgstr ""
+
+#: src/ldgeneric.c:1250
+#, c-format
+msgid "%s: only files of type ET_REL might contain section groups"
+msgstr ""
+
+#: src/ldgeneric.c:1302
+#, c-format
+msgid "%s: cannot determine signature of section group [%2zd] '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:1314
+#, c-format
+msgid "%s: cannot get content of section group [%2zd] '%s': %s'"
+msgstr ""
+
+#: src/ldgeneric.c:1328
+#, c-format
+msgid ""
+"%s: group member %zu of section group [%2zd] '%s' has too high index: %"
+"<PRIu32>"
+msgstr ""
+
+#: src/ldgeneric.c:1350
+#, c-format
+msgid "%s: section '%s' has unknown type: %d"
+msgstr ""
+
+#: src/ldgeneric.c:1729
+#, c-format
+msgid "cannot get descriptor for ELF file (%s:%d): %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:1899
+#, c-format
+msgid "cannot read archive `%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:2020
+#, c-format
+msgid "file of type %s cannot be linked in\n"
+msgstr ""
+
+#: src/ldgeneric.c:2032
+#, c-format
+msgid "%s: input file incompatible with ELF machine type %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:2044
+#, c-format
+msgid "%s: cannot get section header string table index: %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:2073
+#, c-format
+msgid "cannot use DSO '%s' when generating relocatable object file"
+msgstr ""
+
+#: src/ldgeneric.c:2158
+#, c-format
+msgid "input file '%s' ignored"
+msgstr ""
+
+#: src/ldgeneric.c:2372
+#, c-format
+msgid "undefined symbol `%s' in %s"
+msgstr ""
+
+#: src/ldgeneric.c:2702
+#, c-format
+msgid "cannot create ELF descriptor for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:2709
+#, c-format
+msgid "could not create ELF header for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:3224 src/ldgeneric.c:3294 src/ldgeneric.c:3330
+#: src/ldgeneric.c:4457 src/ldgeneric.c:4506 src/ldgeneric.c:4538
+#: src/ldgeneric.c:4773 src/ldgeneric.c:4828 src/ldgeneric.c:5075
+#: src/ldgeneric.c:5131 src/ldgeneric.c:5600 src/ldgeneric.c:5612
+#, c-format
+msgid "cannot create section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:3444
+#, c-format
+msgid "address computation expression contains variable '%s'"
+msgstr ""
+
+#: src/ldgeneric.c:3489
+#, c-format
+msgid ""
+"argument '%<PRIuMAX>' of ALIGN in address computation expression is no power "
+"of two"
+msgstr ""
+
+#: src/ldgeneric.c:3684
+#, c-format
+msgid "cannot find entry symbol '%s': defaulting to %#0*<PRIx64>"
+msgstr ""
+
+#: src/ldgeneric.c:3690
+#, c-format
+msgid "no entry symbol specified: defaulting to %#0*<PRIx64>"
+msgstr ""
+
+#: src/ldgeneric.c:3920
+#, c-format
+msgid "cannot create GNU hash table section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4071
+#, c-format
+msgid "cannot create hash table section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4114
+#, c-format
+msgid "cannot create build ID section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4191
+#, c-format
+msgid "cannot convert section data to file format: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4200
+#, c-format
+msgid "cannot convert section data to memory format: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4261
+#, c-format
+msgid "cannot read enough data for UUID"
+msgstr ""
+
+#: src/ldgeneric.c:4358 src/ldgeneric.c:4379 src/ldgeneric.c:4408
+#: src/ldgeneric.c:6062
+#, c-format
+msgid "cannot create symbol table for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5300 src/ldgeneric.c:5852
+#, c-format
+msgid "section index too large in dynamic symbol table"
+msgstr ""
+
+#: src/ldgeneric.c:5745
+#, c-format
+msgid "cannot create versioning section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5818
+#, c-format
+msgid "cannot create dynamic symbol table for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5994
+#, c-format
+msgid "cannot create versioning data: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6094 src/ldgeneric.c:6107 src/ldgeneric.c:6171
+#: src/ldgeneric.c:6179
+#, c-format
+msgid "cannot create section header string section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6101
+#, c-format
+msgid "cannot create section header string section"
+msgstr ""
+
+#: src/ldgeneric.c:6259
+#, c-format
+msgid "cannot create program header: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6267
+#, c-format
+msgid "while determining file layout: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6388
+#, c-format
+msgid "internal error: non-nobits section follows nobits section"
+msgstr ""
+
+#: src/ldgeneric.c:6925
+#, c-format
+msgid "cannot get header of 0th section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6941 src/unstrip.c:1808
+#, c-format
+msgid "cannot update ELF header: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6972
+#, c-format
+msgid "linker backend didn't specify function to relocate section"
+msgstr ""
+
+#: src/ldgeneric.c:6984
+#, c-format
+msgid "while writing output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6989
+#, c-format
+msgid "while finishing output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6995
+#, c-format
+msgid "cannot stat output file"
+msgstr ""
+
+#: src/ldgeneric.c:7011
+#, c-format
+msgid "WARNING: temporary output file overwritten before linking finished"
+msgstr ""
+
+#: src/ldgeneric.c:7064 src/ldgeneric.c:7075 src/ldgeneric.c:7086
+#: src/ldgeneric.c:7097 src/ldgeneric.c:7116 src/ldgeneric.c:7129
+#: src/ldgeneric.c:7141
+#, c-format
+msgid "no machine specific '%s' implementation"
+msgstr ""
+
+#: src/ldscript.y:178
+msgid "mode for segment invalid\n"
+msgstr ""
+
+#: src/ldscript.y:465
+#, c-format
+msgid "while reading version script '%s': %s at line %d"
+msgstr ""
+
+#: src/ldscript.y:466
+#, c-format
+msgid "while reading linker script '%s': %s at line %d"
+msgstr ""
+
+#: src/ldscript.y:745
+#, c-format
+msgid "symbol '%s' is declared both local and global for unnamed version"
+msgstr ""
+
+#: src/ldscript.y:747
+#, c-format
+msgid "symbol '%s' is declared both local and global for version '%s'"
+msgstr ""
+
+#: src/ldscript.y:767 src/ldscript.y:774
+#, c-format
+msgid "default visibility set as local and global"
+msgstr ""
+
+#: src/nm.c:74 src/strip.c:73
+msgid "Output selection:"
+msgstr ""
+
+#: src/nm.c:75
+msgid "Display debugger-only symbols"
+msgstr ""
+
+#: src/nm.c:76
+msgid "Display only defined symbols"
+msgstr ""
+
+#: src/nm.c:79
+msgid "Display dynamic symbols instead of normal symbols"
+msgstr ""
+
+#: src/nm.c:80
+msgid "Display only external symbols"
+msgstr ""
+
+#: src/nm.c:81
+msgid "Display only undefined symbols"
+msgstr ""
+
+#: src/nm.c:83
+msgid "Include index for symbols from archive members"
+msgstr ""
+
+#: src/nm.c:85 src/size.c:66
+msgid "Output format:"
+msgstr ""
+
+#: src/nm.c:87
+msgid "Print name of the input file before every symbol"
+msgstr ""
+
+#: src/nm.c:90
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd', `sysv' or `posix'. The "
+"default is `sysv'"
+msgstr ""
+
+#: src/nm.c:92
+msgid "Same as --format=bsd"
+msgstr ""
+
+#: src/nm.c:93
+msgid "Same as --format=posix"
+msgstr ""
+
+#: src/nm.c:94 src/size.c:72
+msgid "Use RADIX for printing symbol values"
+msgstr ""
+
+#: src/nm.c:95
+msgid "Mark weak symbols"
+msgstr ""
+
+#: src/nm.c:96
+msgid "Print size of defined symbols"
+msgstr ""
+
+#: src/nm.c:98 src/size.c:80 src/strip.c:78 src/unstrip.c:81
+msgid "Output options:"
+msgstr ""
+
+#: src/nm.c:99
+msgid "Sort symbols numerically by address"
+msgstr ""
+
+#: src/nm.c:101
+msgid "Do not sort the symbols"
+msgstr ""
+
+#: src/nm.c:102
+msgid "Reverse the sense of the sort"
+msgstr ""
+
+#: src/nm.c:108
+msgid "List symbols from FILEs (a.out by default)."
+msgstr ""
+
+#: src/nm.c:136 src/objdump.c:105 src/size.c:117 src/strip.c:121
+#, c-format
+msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
+msgstr ""
+
+#: src/nm.c:380 src/nm.c:392 src/size.c:317 src/size.c:326 src/size.c:337
+#: src/strip.c:1816
+#, c-format
+msgid "while closing '%s'"
+msgstr ""
+
+#: src/nm.c:402 src/objdump.c:296 src/strip.c:359
+#, c-format
+msgid "%s: File format not recognized"
+msgstr ""
+
+#: src/nm.c:442
+msgid ""
+"\n"
+"Archive index:"
+msgstr ""
+
+#: src/nm.c:451
+#, c-format
+msgid "invalid offset %zu for symbol %s"
+msgstr ""
+
+#: src/nm.c:456
+#, c-format
+msgid "%s in %s\n"
+msgstr ""
+
+#: src/nm.c:464
+#, c-format
+msgid "cannot reset archive offset to beginning"
+msgstr ""
+
+#: src/nm.c:488 src/objdump.c:344
+#, c-format
+msgid "%s%s%s: file format not recognized"
+msgstr ""
+
+#: src/nm.c:700
+#, c-format
+msgid "cannot create search tree"
+msgstr ""
+
+#: src/nm.c:740 src/nm.c:1002 src/objdump.c:744 src/readelf.c:885
+#: src/readelf.c:1028 src/readelf.c:1169 src/readelf.c:1351 src/readelf.c:1549
+#: src/readelf.c:1735 src/readelf.c:1945 src/readelf.c:2199 src/readelf.c:2265
+#: src/readelf.c:2343 src/readelf.c:2841 src/readelf.c:2877 src/readelf.c:2939
+#: src/readelf.c:6493 src/readelf.c:7387 src/readelf.c:7534 src/readelf.c:7604
+#: src/size.c:425 src/size.c:499 src/strip.c:483
+#, c-format
+msgid "cannot get section header string table index"
+msgstr ""
+
+#: src/nm.c:766
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s:\n"
+"\n"
+msgstr ""
+
+#: src/nm.c:768
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s[%s]:\n"
+"\n"
+msgstr ""
+
+#: src/nm.c:771
+#, c-format
+msgid ""
+"%*s%-*s %-*s Class Type %-*s %*s Section\n"
+"\n"
+msgstr ""
+
+#: src/nm.c:1012
+#, c-format
+msgid "%s: entry size in section `%s' is not what we expect"
+msgstr ""
+
+#: src/nm.c:1016
+#, c-format
+msgid "%s: size of section `%s' is not multiple of entry size"
+msgstr ""
+
+#: src/nm.c:1255
+#, c-format
+msgid "%s%s%s%s: Invalid operation"
+msgstr ""
+
+#: src/nm.c:1312
+#, c-format
+msgid "%s%s%s: no symbols"
+msgstr ""
+
+#: src/objdump.c:61
+msgid "Mode selection:"
+msgstr ""
+
+#: src/objdump.c:62
+msgid "Display relocation information."
+msgstr ""
+
+#: src/objdump.c:64
+msgid "Display the full contents of all sections requested"
+msgstr ""
+
+#: src/objdump.c:66
+msgid "Display assembler code of executable sections"
+msgstr ""
+
+#: src/objdump.c:68
+msgid "Output option selection:"
+msgstr ""
+
+#: src/objdump.c:70
+msgid "Only display information for section NAME."
+msgstr ""
+
+#: src/objdump.c:76
+msgid "Show information from FILEs (a.out by default)."
+msgstr ""
+
+#: src/objdump.c:236 src/readelf.c:430
+msgid "No operation specified.\n"
+msgstr ""
+
+#: src/objdump.c:274 src/objdump.c:286
+#, c-format
+msgid "while close `%s'"
+msgstr ""
+
+#: src/objdump.c:379 src/readelf.c:1644 src/readelf.c:1818
+msgid "INVALID SYMBOL"
+msgstr ""
+
+#: src/objdump.c:394 src/readelf.c:1675 src/readelf.c:1851
+msgid "INVALID SECTION"
+msgstr ""
+
+#: src/objdump.c:510
+#, c-format
+msgid ""
+"\n"
+"RELOCATION RECORDS FOR [%s]:\n"
+"%-*s TYPE VALUE\n"
+msgstr ""
+
+#: src/objdump.c:513
+msgid "OFFSET"
+msgstr ""
+
+#: src/objdump.c:576
+#, c-format
+msgid "Contents of section %s:\n"
+msgstr ""
+
+#: src/objdump.c:676
+#, c-format
+msgid "cannot disassemble"
+msgstr ""
+
+#: src/ranlib.c:74
+msgid "Generate an index to speed access to archives."
+msgstr ""
+
+#: src/ranlib.c:77
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/ranlib.c:116
+#, c-format
+msgid "Archive name required"
+msgstr ""
+
+#: src/ranlib.c:194
+#, c-format
+msgid "'%s' is no archive"
+msgstr ""
+
+#: src/ranlib.c:229
+#, c-format
+msgid "error while freeing sub-ELF descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:73
+msgid "ELF output selection:"
+msgstr ""
+
+#: src/readelf.c:75
+msgid "All these plus -p .strtab -p .dynstr -p .comment"
+msgstr ""
+
+#: src/readelf.c:76
+msgid "Display the dynamic segment"
+msgstr ""
+
+#: src/readelf.c:77
+msgid "Display the ELF file header"
+msgstr ""
+
+#: src/readelf.c:79
+msgid "Display histogram of bucket list lengths"
+msgstr ""
+
+#: src/readelf.c:80
+msgid "Display the program headers"
+msgstr ""
+
+#: src/readelf.c:82
+msgid "Display relocations"
+msgstr ""
+
+#: src/readelf.c:83
+msgid "Display the sections' headers"
+msgstr ""
+
+#: src/readelf.c:85
+msgid "Display the symbol table"
+msgstr ""
+
+#: src/readelf.c:86
+msgid "Display versioning information"
+msgstr ""
+
+#: src/readelf.c:87
+msgid "Display the ELF notes"
+msgstr ""
+
+#: src/readelf.c:89
+msgid "Display architecture specific information, if any"
+msgstr ""
+
+#: src/readelf.c:91
+msgid "Display sections for exception handling"
+msgstr ""
+
+#: src/readelf.c:93
+msgid "Additional output selection:"
+msgstr ""
+
+#: src/readelf.c:95
+msgid ""
+"Display DWARF section content. SECTION can be one of abbrev, aranges, "
+"frame, info, loc, line, ranges, pubnames, str, macinfo, or exception"
+msgstr ""
+
+#: src/readelf.c:99
+msgid "Dump the uninterpreted contents of SECTION, by number or name"
+msgstr ""
+
+#: src/readelf.c:101
+msgid "Print string contents of sections"
+msgstr ""
+
+#: src/readelf.c:104
+msgid "Display the symbol index of an archive"
+msgstr ""
+
+#: src/readelf.c:106
+msgid "Output control:"
+msgstr ""
+
+#: src/readelf.c:108
+msgid "Do not find symbol names for addresses in DWARF data"
+msgstr ""
+
+#: src/readelf.c:114
+msgid "Print information from ELF file in human-readable form."
+msgstr ""
+
+#: src/readelf.c:401
+#, c-format
+msgid "Unknown DWARF debug section `%s'.\n"
+msgstr ""
+
+#: src/readelf.c:465
+#, c-format
+msgid "cannot generate Elf descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:477
+#, c-format
+msgid "'%s' is not an archive, cannot print archive index"
+msgstr ""
+
+#: src/readelf.c:482
+#, c-format
+msgid "error while closing Elf descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:574
+#, c-format
+msgid "cannot stat input file"
+msgstr ""
+
+#: src/readelf.c:576
+#, c-format
+msgid "input file is empty"
+msgstr ""
+
+#: src/readelf.c:578
+#, c-format
+msgid "failed reading '%s': %s"
+msgstr ""
+
+#: src/readelf.c:614
+#, c-format
+msgid "cannot read ELF header: %s"
+msgstr ""
+
+#: src/readelf.c:622
+#, c-format
+msgid "cannot create EBL handle"
+msgstr ""
+
+#: src/readelf.c:635
+#, c-format
+msgid "cannot determine number of program headers: %s"
+msgstr ""
+
+#: src/readelf.c:721
+msgid "NONE (None)"
+msgstr ""
+
+#: src/readelf.c:722
+msgid "REL (Relocatable file)"
+msgstr ""
+
+#: src/readelf.c:723
+msgid "EXEC (Executable file)"
+msgstr ""
+
+#: src/readelf.c:724
+msgid "DYN (Shared object file)"
+msgstr ""
+
+#: src/readelf.c:725
+msgid "CORE (Core file)"
+msgstr ""
+
+#: src/readelf.c:730
+#, c-format
+msgid "OS Specific: (%x)\n"
+msgstr ""
+
+#: src/readelf.c:732
+#, c-format
+msgid "Processor Specific: (%x)\n"
+msgstr ""
+
+#: src/readelf.c:742
+msgid ""
+"ELF Header:\n"
+" Magic: "
+msgstr ""
+
+#: src/readelf.c:746
+#, c-format
+msgid ""
+"\n"
+" Class: %s\n"
+msgstr ""
+
+#: src/readelf.c:751
+#, c-format
+msgid " Data: %s\n"
+msgstr ""
+
+#: src/readelf.c:757
+#, c-format
+msgid " Ident Version: %hhd %s\n"
+msgstr ""
+
+#: src/readelf.c:759 src/readelf.c:776
+msgid "(current)"
+msgstr ""
+
+#: src/readelf.c:763
+#, c-format
+msgid " OS/ABI: %s\n"
+msgstr ""
+
+#: src/readelf.c:766
+#, c-format
+msgid " ABI Version: %hhd\n"
+msgstr ""
+
+#: src/readelf.c:769
+msgid " Type: "
+msgstr ""
+
+#: src/readelf.c:772
+#, c-format
+msgid " Machine: %s\n"
+msgstr ""
+
+#: src/readelf.c:774
+#, c-format
+msgid " Version: %d %s\n"
+msgstr ""
+
+#: src/readelf.c:778
+#, c-format
+msgid " Entry point address: %#<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:781
+#, c-format
+msgid " Start of program headers: %<PRId64> %s\n"
+msgstr ""
+
+#: src/readelf.c:782 src/readelf.c:785
+msgid "(bytes into file)"
+msgstr ""
+
+#: src/readelf.c:784
+#, c-format
+msgid " Start of section headers: %<PRId64> %s\n"
+msgstr ""
+
+#: src/readelf.c:787
+#, c-format
+msgid " Flags: %s\n"
+msgstr ""
+
+#: src/readelf.c:790
+#, c-format
+msgid " Size of this header: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:791 src/readelf.c:794 src/readelf.c:811
+msgid "(bytes)"
+msgstr ""
+
+#: src/readelf.c:793
+#, c-format
+msgid " Size of program header entries: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:796
+#, c-format
+msgid " Number of program headers entries: %<PRId16>"
+msgstr ""
+
+#: src/readelf.c:803
+#, c-format
+msgid " (%<PRIu32> in [0].sh_info)"
+msgstr ""
+
+#: src/readelf.c:806 src/readelf.c:823 src/readelf.c:837
+msgid " ([0] not available)"
+msgstr ""
+
+#: src/readelf.c:810
+#, c-format
+msgid " Size of section header entries: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:813
+#, c-format
+msgid " Number of section headers entries: %<PRId16>"
+msgstr ""
+
+#: src/readelf.c:820
+#, c-format
+msgid " (%<PRIu32> in [0].sh_size)"
+msgstr ""
+
+#: src/readelf.c:833
+#, c-format
+msgid " (%<PRIu32> in [0].sh_link)"
+msgstr ""
+
+#: src/readelf.c:841
+#, c-format
+msgid ""
+" Section header string table index: XINDEX%s\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:845
+#, c-format
+msgid ""
+" Section header string table index: %<PRId16>\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:877
+#, c-format
+msgid ""
+"There are %d section headers, starting at offset %#<PRIx64>:\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:887
+msgid "Section Headers:"
+msgstr ""
+
+#: src/readelf.c:890
+msgid ""
+"[Nr] Name Type Addr Off Size ES Flags Lk "
+"Inf Al"
+msgstr ""
+
+#: src/readelf.c:892
+msgid ""
+"[Nr] Name Type Addr Off Size ES "
+"Flags Lk Inf Al"
+msgstr ""
+
+#: src/readelf.c:899 src/readelf.c:1052
+#, c-format
+msgid "cannot get section: %s"
+msgstr ""
+
+#: src/readelf.c:906 src/readelf.c:1060 src/readelf.c:7554 src/unstrip.c:353
+#: src/unstrip.c:377 src/unstrip.c:427 src/unstrip.c:536 src/unstrip.c:553
+#: src/unstrip.c:591 src/unstrip.c:789 src/unstrip.c:1057 src/unstrip.c:1244
+#: src/unstrip.c:1305 src/unstrip.c:1427 src/unstrip.c:1480 src/unstrip.c:1588
+#: src/unstrip.c:1778
+#, c-format
+msgid "cannot get section header: %s"
+msgstr ""
+
+#: src/readelf.c:964
+msgid "Program Headers:"
+msgstr ""
+
+#: src/readelf.c:966
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align"
+msgstr ""
+
+#: src/readelf.c:969
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz "
+"MemSiz Flg Align"
+msgstr ""
+
+#: src/readelf.c:1009
+#, c-format
+msgid "\t[Requesting program interpreter: %s]\n"
+msgstr ""
+
+#: src/readelf.c:1030
+msgid ""
+"\n"
+" Section to Segment mapping:\n"
+" Segment Sections..."
+msgstr ""
+
+#: src/readelf.c:1041 src/unstrip.c:1824 src/unstrip.c:1863 src/unstrip.c:1870
+#, c-format
+msgid "cannot get program header: %s"
+msgstr ""
+
+#: src/readelf.c:1175
+#, c-format
+msgid ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1180
+#, c-format
+msgid ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1188
+msgid "<INVALID SYMBOL>"
+msgstr ""
+
+#: src/readelf.c:1202
+msgid "<INVALID SECTION>"
+msgstr ""
+
+#: src/readelf.c:1353
+#, c-format
+msgid ""
+"\n"
+"Dynamic segment contains %lu entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Dynamic segment contains %lu entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1365
+msgid " Type Value\n"
+msgstr ""
+
+#: src/readelf.c:1389
+#, c-format
+msgid "Shared library: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1394
+#, c-format
+msgid "Library soname: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1399
+#, c-format
+msgid "Library rpath: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1404
+#, c-format
+msgid "Library runpath: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1424
+#, c-format
+msgid "%<PRId64> (bytes)\n"
+msgstr ""
+
+#: src/readelf.c:1534 src/readelf.c:1720
+#, c-format
+msgid ""
+"\n"
+"Invalid symbol table at offset %#0<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:1552 src/readelf.c:1737
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1567
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1577
+msgid " Offset Type Value Name\n"
+msgstr ""
+
+#: src/readelf.c:1579
+msgid " Offset Type Value Name\n"
+msgstr ""
+
+#: src/readelf.c:1632 src/readelf.c:1643 src/readelf.c:1656 src/readelf.c:1674
+#: src/readelf.c:1686 src/readelf.c:1805 src/readelf.c:1817 src/readelf.c:1831
+#: src/readelf.c:1850 src/readelf.c:1863
+msgid "<INVALID RELOC>"
+msgstr ""
+
+#: src/readelf.c:1749
+msgid " Offset Type Value Addend Name\n"
+msgstr ""
+
+#: src/readelf.c:1751
+msgid " Offset Type Value Addend Name\n"
+msgstr ""
+
+#: src/readelf.c:1952
+#, c-format
+msgid ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entry:\n"
+msgid_plural ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1958
+#, 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:1968
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr ""
+
+#: src/readelf.c:1970
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr ""
+
+#: src/readelf.c:1990
+#, c-format
+msgid "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
+msgstr ""
+
+#: src/readelf.c:2078
+#, c-format
+msgid "bad dynamic symbol"
+msgstr ""
+
+#: src/readelf.c:2160
+msgid "none"
+msgstr ""
+
+#: src/readelf.c:2177
+msgid "| <unknown>"
+msgstr ""
+
+#: src/readelf.c:2202
+#, c-format
+msgid ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2225
+#, c-format
+msgid " %#06x: Version: %hu File: %s Cnt: %hu\n"
+msgstr ""
+
+#: src/readelf.c:2238
+#, c-format
+msgid " %#06x: Name: %s Flags: %s Version: %hu\n"
+msgstr ""
+
+#: src/readelf.c:2269
+#, c-format
+msgid ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2299
+#, c-format
+msgid " %#06x: Version: %hd Flags: %s Index: %hd Cnt: %hd Name: %s\n"
+msgstr ""
+
+#: src/readelf.c:2314
+#, c-format
+msgid " %#06x: Parent %d: %s\n"
+msgstr ""
+
+#: src/readelf.c:2546
+#, c-format
+msgid ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgid_plural ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2576
+msgid " 0 *local* "
+msgstr ""
+
+#: src/readelf.c:2581
+msgid " 1 *global* "
+msgstr ""
+
+#: src/readelf.c:2612
+#, c-format
+msgid ""
+"\n"
+"Histogram 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"
+msgid_plural ""
+"\n"
+"Histogram for bucket list length in section [%2u] '%s' (total of %d "
+"buckets):\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2636
+#, no-c-format
+msgid " Length Number % of total Coverage\n"
+msgstr ""
+
+#: src/readelf.c:2638
+#, c-format
+msgid " 0 %6<PRIu32> %5.1f%%\n"
+msgstr ""
+
+#: src/readelf.c:2645
+#, c-format
+msgid "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
+msgstr ""
+
+#: src/readelf.c:2658
+#, c-format
+msgid ""
+" Average number of tests: successful lookup: %f\n"
+" unsuccessful lookup: %f\n"
+msgstr ""
+
+#: src/readelf.c:2676 src/readelf.c:2718 src/readelf.c:2759
+#, c-format
+msgid "cannot get data for section %d: %s"
+msgstr ""
+
+#: src/readelf.c:2813
+#, c-format
+msgid ""
+" Symbol Bias: %u\n"
+" Bitmask Size: %zu bytes %<PRIuFAST32>%% bits set 2nd hash shift: %u\n"
+msgstr ""
+
+#: src/readelf.c:2887
+#, c-format
+msgid ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2901
+msgid ""
+" Library Time Stamp Checksum Version "
+"Flags"
+msgstr ""
+
+#: src/readelf.c:2951
+#, c-format
+msgid ""
+"\n"
+"Object attributes section [%2zu] '%s' of %<PRIu64> bytes at offset %"
+"#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:2967
+msgid " Owner Size\n"
+msgstr ""
+
+#: src/readelf.c:2993
+#, c-format
+msgid " %-13s %4<PRIu32>\n"
+msgstr ""
+
+#: src/readelf.c:3025
+#, c-format
+msgid " %-4u %12<PRIu32>\n"
+msgstr ""
+
+#: src/readelf.c:3030
+#, c-format
+msgid " File: %11<PRIu32>\n"
+msgstr ""
+
+#: src/readelf.c:3065
+#, c-format
+msgid " %s: %<PRId64>, %s\n"
+msgstr ""
+
+#: src/readelf.c:3068
+#, c-format
+msgid " %s: %<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:3071
+#, c-format
+msgid " %s: %s\n"
+msgstr ""
+
+#: src/readelf.c:3078
+#, c-format
+msgid " %u: %<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:3081
+#, c-format
+msgid " %u: %s\n"
+msgstr ""
+
+#: src/readelf.c:3117
+#, c-format
+msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3120
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3125
+#, c-format
+msgid "%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3128
+#, c-format
+msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3134
+#, c-format
+msgid "%s+%#<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3137
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3141
+#, c-format
+msgid "%#<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3144
+#, c-format
+msgid "%#0*<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3149
+#, c-format
+msgid "%s+%#<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3152
+#, c-format
+msgid "%s+%#0*<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3260
+#, c-format
+msgid "unknown tag %hx"
+msgstr ""
+
+#: src/readelf.c:3262
+#, c-format
+msgid "unknown user tag %hx"
+msgstr ""
+
+#: src/readelf.c:3480
+#, c-format
+msgid "unknown attribute %hx"
+msgstr ""
+
+#: src/readelf.c:3483
+#, c-format
+msgid "unknown user attribute %hx"
+msgstr ""
+
+#: src/readelf.c:3529
+#, c-format
+msgid "unknown form %<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3763
+msgid "empty block"
+msgstr ""
+
+#: src/readelf.c:3766
+#, c-format
+msgid "%zu byte block:"
+msgstr ""
+
+#: src/readelf.c:4175
+#, c-format
+msgid "%*s[%4<PRIuMAX>] %s <TRUNCATED>\n"
+msgstr ""
+
+#: src/readelf.c:4188
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [ Code]\n"
+msgstr ""
+
+#: src/readelf.c:4195
+#, c-format
+msgid ""
+"\n"
+"Abbreviation section at offset %<PRIu64>:\n"
+msgstr ""
+
+#: src/readelf.c:4208
+#, c-format
+msgid " *** error while reading abbreviation: %s\n"
+msgstr ""
+
+#: src/readelf.c:4224
+#, c-format
+msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
+msgstr ""
+
+#: src/readelf.c:4227
+msgid "yes"
+msgstr ""
+
+#: src/readelf.c:4227
+msgid "no"
+msgstr ""
+
+#: src/readelf.c:4263
+#, c-format
+msgid "cannot get .debug_aranges content: %s"
+msgstr ""
+
+#: src/readelf.c:4268
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:4298
+#, c-format
+msgid " [%*zu] ???\n"
+msgstr ""
+
+#: src/readelf.c:4300
+#, c-format
+msgid ""
+" [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:4319
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr ""
+
+#: src/readelf.c:4324 src/readelf.c:4810 src/readelf.c:5452 src/readelf.c:5897
+#: src/readelf.c:5992 src/readelf.c:6164
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:4338 src/readelf.c:5911
+#, c-format
+msgid " [%6tx] <INVALID DATA>\n"
+msgstr ""
+
+#: src/readelf.c:4360 src/readelf.c:5933
+#, c-format
+msgid " [%6tx] base address %s\n"
+msgstr ""
+
+#: src/readelf.c:4371
+#, c-format
+msgid " [%6tx] %s..%s\n"
+msgstr ""
+
+#: src/readelf.c:4373
+#, c-format
+msgid " %s..%s\n"
+msgstr ""
+
+#: src/readelf.c:4799 src/readelf.c:6230 src/readelf.c:6332
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr ""
+
+#: src/readelf.c:4806
+#, c-format
+msgid ""
+"\n"
+"Call frame information section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:4833 src/readelf.c:5486
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr ""
+
+#: src/readelf.c:4855
+#, c-format
+msgid ""
+"\n"
+" [%6tx] Zero terminator\n"
+msgstr ""
+
+#: src/readelf.c:4924
+#, c-format
+msgid "invalid augmentation length"
+msgstr ""
+
+#: src/readelf.c:4936
+msgid "FDE address encoding: "
+msgstr ""
+
+#: src/readelf.c:4942
+msgid "LSDA pointer encoding: "
+msgstr ""
+
+#: src/readelf.c:5034
+#, c-format
+msgid " (offset: %#<PRIx64>)"
+msgstr ""
+
+#: src/readelf.c:5041
+#, c-format
+msgid " (end offset: %#<PRIx64>)"
+msgstr ""
+
+#: src/readelf.c:5068
+#, c-format
+msgid " %-26sLSDA pointer: %#<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:5114
+#, c-format
+msgid "cannot get attribute code: %s"
+msgstr ""
+
+#: src/readelf.c:5122
+#, c-format
+msgid "cannot get attribute form: %s"
+msgstr ""
+
+#: src/readelf.c:5135
+#, c-format
+msgid "cannot get attribute value: %s"
+msgstr ""
+
+#: src/readelf.c:5331
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [Offset]\n"
+msgstr ""
+
+#: src/readelf.c:5356
+#, c-format
+msgid ""
+" Compilation unit at offset %<PRIu64>:\n"
+" Version: %<PRIu16>, Abbreviation section offset: %<PRIu64>, Address size: %"
+"<PRIu8>, Offset size: %<PRIu8>\n"
+msgstr ""
+
+#: src/readelf.c:5374
+#, c-format
+msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
+msgstr ""
+
+#: src/readelf.c:5385
+#, c-format
+msgid "cannot get DIE offset: %s"
+msgstr ""
+
+#: src/readelf.c:5393
+#, c-format
+msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
+msgstr ""
+
+#: src/readelf.c:5422
+#, c-format
+msgid "cannot get next DIE: %s\n"
+msgstr ""
+
+#: src/readelf.c:5429
+#, c-format
+msgid "cannot get next DIE: %s"
+msgstr ""
+
+#: src/readelf.c:5464
+#, c-format
+msgid "cannot get line data section data: %s"
+msgstr ""
+
+#: src/readelf.c:5477
+#, c-format
+msgid ""
+"\n"
+"Table at offset %Zu:\n"
+msgstr ""
+
+#: src/readelf.c:5529
+#, c-format
+msgid ""
+"\n"
+" Length: %<PRIu64>\n"
+" DWARF version: %<PRIuFAST16>\n"
+" Prologue length: %<PRIu64>\n"
+" Minimum instruction length: %<PRIuFAST8>\n"
+" Initial value if '%s': %<PRIuFAST8>\n"
+" Line base: %<PRIdFAST8>\n"
+" Line range: %<PRIuFAST8>\n"
+" Opcode base: %<PRIuFAST8>\n"
+"\n"
+"Opcodes:\n"
+msgstr ""
+
+#: src/readelf.c:5548
+#, c-format
+msgid "invalid data at offset %tu in section [%zu] '%s'"
+msgstr ""
+
+#: src/readelf.c:5563
+#, c-format
+msgid " [%*<PRIuFAST8>] %hhu argument\n"
+msgid_plural " [%*<PRIuFAST8>] %hhu arguments\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:5571
+msgid ""
+"\n"
+"Directory table:"
+msgstr ""
+
+#: src/readelf.c:5587
+msgid ""
+"\n"
+"File name table:\n"
+" Entry Dir Time Size Name"
+msgstr ""
+
+#: src/readelf.c:5616
+msgid ""
+"\n"
+"Line number statements:"
+msgstr ""
+
+#: src/readelf.c:5677
+#, c-format
+msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
+msgstr ""
+
+#: src/readelf.c:5697
+#, c-format
+msgid " extended opcode %u: "
+msgstr ""
+
+#: src/readelf.c:5702
+msgid "end of sequence"
+msgstr ""
+
+#: src/readelf.c:5717
+#, c-format
+msgid "set address to %s\n"
+msgstr ""
+
+#: src/readelf.c:5738
+#, c-format
+msgid "define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
+msgstr ""
+
+#: src/readelf.c:5747
+msgid "unknown opcode"
+msgstr ""
+
+#: src/readelf.c:5759
+msgid " copy"
+msgstr ""
+
+#: src/readelf.c:5769
+#, c-format
+msgid "advance address by %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5780
+#, c-format
+msgid " advance line by constant %d to %<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:5788
+#, c-format
+msgid " set file to %<PRIu64>\n"
+msgstr ""
+
+#: src/readelf.c:5798
+#, c-format
+msgid " set column to %<PRIu64>\n"
+msgstr ""
+
+#: src/readelf.c:5805
+#, c-format
+msgid " set '%s' to %<PRIuFAST8>\n"
+msgstr ""
+
+#: src/readelf.c:5811
+msgid " set basic block flag"
+msgstr ""
+
+#: src/readelf.c:5821
+#, c-format
+msgid "advance address by constant %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5837
+#, c-format
+msgid "advance address by fixed value %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5846
+msgid " set prologue end flag"
+msgstr ""
+
+#: src/readelf.c:5851
+msgid " set epilogue begin flag"
+msgstr ""
+
+#: src/readelf.c:5860
+#, c-format
+msgid " unknown opcode with %<PRIu8> parameter:"
+msgid_plural " unknown opcode with %<PRIu8> parameters:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:5892
+#, c-format
+msgid "cannot get .debug_loc content: %s"
+msgstr ""
+
+#: src/readelf.c:5947
+#, c-format
+msgid " [%6tx] %s..%s"
+msgstr ""
+
+#: src/readelf.c:5949
+#, c-format
+msgid " %s..%s"
+msgstr ""
+
+#: src/readelf.c:6002
+#, c-format
+msgid "cannot get macro information section data: %s"
+msgstr ""
+
+#: src/readelf.c:6081
+#, c-format
+msgid "%*s*** non-terminated string at end of section"
+msgstr ""
+
+#: src/readelf.c:6149
+#, c-format
+msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
+msgstr ""
+
+#: src/readelf.c:6188
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" %*s String\n"
+msgstr ""
+
+#: src/readelf.c:6202
+#, c-format
+msgid " *** error while reading strings: %s\n"
+msgstr ""
+
+#: src/readelf.c:6222
+#, c-format
+msgid ""
+"\n"
+"Call frame search table section [%2zu] '.eh_frame_hdr':\n"
+msgstr ""
+
+#: src/readelf.c:6324
+#, c-format
+msgid ""
+"\n"
+"Exception handling table section [%2zu] '.gcc_except_table':\n"
+msgstr ""
+
+#: src/readelf.c:6347
+#, c-format
+msgid " LPStart encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6359
+#, c-format
+msgid " TType encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6373
+#, c-format
+msgid " Call site encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6386
+msgid ""
+"\n"
+" Call site table:"
+msgstr ""
+
+#: src/readelf.c:6400
+#, c-format
+msgid ""
+" [%4u] Call site start: %#<PRIx64>\n"
+" Call site length: %<PRIu64>\n"
+" Landing pad: %#<PRIx64>\n"
+" Action: %u\n"
+msgstr ""
+
+#: src/readelf.c:6460
+#, c-format
+msgid "invalid TType encoding"
+msgstr ""
+
+#: src/readelf.c:6484
+#, c-format
+msgid "cannot get debug context descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:6620 src/readelf.c:7221
+#, c-format
+msgid "cannot convert core note data: %s"
+msgstr ""
+
+#: src/readelf.c:6961
+#, c-format
+msgid ""
+"\n"
+"%*s... <repeats %u more times> ..."
+msgstr ""
+
+#: src/readelf.c:7320
+msgid " Owner Data size Type\n"
+msgstr ""
+
+#: src/readelf.c:7338
+#, c-format
+msgid " %-13.*s %9<PRId32> %s\n"
+msgstr ""
+
+#: src/readelf.c:7372
+#, c-format
+msgid "cannot get content of note section: %s"
+msgstr ""
+
+#: src/readelf.c:7399
+#, c-format
+msgid ""
+"\n"
+"Note section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7422
+#, c-format
+msgid ""
+"\n"
+"Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7468
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no data to dump.\n"
+msgstr ""
+
+#: src/readelf.c:7474 src/readelf.c:7497
+#, c-format
+msgid "cannot get data for section [%Zu] '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7478
+#, c-format
+msgid ""
+"\n"
+"Hex dump of section [%Zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7491
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no strings to dump.\n"
+msgstr ""
+
+#: src/readelf.c:7501
+#, c-format
+msgid ""
+"\n"
+"String section [%Zu] '%s' contains %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7549
+#, c-format
+msgid ""
+"\n"
+"section [%lu] does not exist"
+msgstr ""
+
+#: src/readelf.c:7576
+#, c-format
+msgid ""
+"\n"
+"section '%s' does not exist"
+msgstr ""
+
+#: src/readelf.c:7637
+#, c-format
+msgid "cannot get symbol index of archive '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7640
+#, c-format
+msgid ""
+"\n"
+"Archive '%s' has no symbol index\n"
+msgstr ""
+
+#: src/readelf.c:7644
+#, c-format
+msgid ""
+"\n"
+"Index of archive '%s' has %Zu entries:\n"
+msgstr ""
+
+#: src/readelf.c:7662
+#, c-format
+msgid "cannot extract member at offset %Zu in '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7667
+#, c-format
+msgid "Archive member '%s' contains:\n"
+msgstr ""
+
+#: src/size.c:68
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd' or `sysv'. The default "
+"is `bsd'"
+msgstr ""
+
+#: src/size.c:70
+msgid "Same as `--format=sysv'"
+msgstr ""
+
+#: src/size.c:71
+msgid "Same as `--format=bsd'"
+msgstr ""
+
+#: src/size.c:74
+msgid "Same as `--radix=10'"
+msgstr ""
+
+#: src/size.c:75
+msgid "Same as `--radix=8'"
+msgstr ""
+
+#: src/size.c:76
+msgid "Same as `--radix=16'"
+msgstr ""
+
+#: src/size.c:78
+msgid "Similar to `--format=sysv' output but in one line"
+msgstr ""
+
+#: src/size.c:82
+msgid "Print size and permission flags for loadable segments"
+msgstr ""
+
+#: src/size.c:83
+msgid "Display the total sizes (bsd only)"
+msgstr ""
+
+#: src/size.c:88
+msgid "List section sizes of FILEs (a.out by default)."
+msgstr ""
+
+#: src/size.c:269
+#, c-format
+msgid "Invalid format: %s"
+msgstr ""
+
+#: src/size.c:280
+#, c-format
+msgid "Invalid radix: %s"
+msgstr ""
+
+#: src/size.c:339
+#, c-format
+msgid "%s: file format not recognized"
+msgstr ""
+
+#: src/size.c:446 src/size.c:589
+#, c-format
+msgid " (ex %s)"
+msgstr ""
+
+#: src/size.c:614
+msgid "(TOTALS)\n"
+msgstr ""
+
+#: src/strings.c:70
+msgid "Output Selection:"
+msgstr ""
+
+#: src/strings.c:71
+msgid "Scan entire file, not only loaded sections"
+msgstr ""
+
+#: src/strings.c:73
+msgid "Only NUL-terminated sequences of MIN-LEN characters or more are printed"
+msgstr ""
+
+#: src/strings.c:74
+msgid ""
+"Select character size and endianess: s = 7-bit, S = 8-bit, {b,l} = 16-bit, "
+"{B,L} = 32-bit"
+msgstr ""
+
+#: src/strings.c:78
+msgid "Print name of the file before each string."
+msgstr ""
+
+#: src/strings.c:80
+msgid "Print location of the string in base 8, 10, or 16 respectively."
+msgstr ""
+
+#: src/strings.c:81
+msgid "Alias for --radix=o"
+msgstr ""
+
+#: src/strings.c:88
+msgid "Print the strings of printable characters in files."
+msgstr ""
+
+#: src/strings.c:268 src/strings.c:303
+#, c-format
+msgid "invalid value '%s' for %s parameter"
+msgstr ""
+
+#: src/strings.c:314
+#, c-format
+msgid "invalid minimum length of matched string size"
+msgstr ""
+
+#: src/strings.c:601
+#, c-format
+msgid "lseek64 failed"
+msgstr ""
+
+#: src/strings.c:616 src/strings.c:680
+#, c-format
+msgid "re-mmap failed"
+msgstr ""
+
+#: src/strings.c:653
+#, c-format
+msgid "mprotect failed"
+msgstr ""
+
+#: src/strip.c:74
+msgid "Place stripped output into FILE"
+msgstr ""
+
+#: src/strip.c:75
+msgid "Extract the removed sections into FILE"
+msgstr ""
+
+#: src/strip.c:76
+msgid "Embed name FILE instead of -f argument"
+msgstr ""
+
+#: src/strip.c:80
+msgid "Remove all debugging symbols"
+msgstr ""
+
+#: src/strip.c:84
+msgid "Copy modified/access timestamps to the output"
+msgstr ""
+
+#: src/strip.c:86
+msgid "Remove .comment section"
+msgstr ""
+
+#: src/strip.c:89
+msgid "Relax a few rules to handle slightly broken ELF files"
+msgstr ""
+
+#: src/strip.c:94
+msgid "Discard symbols from object files."
+msgstr ""
+
+#: src/strip.c:186
+#, c-format
+msgid "Only one input file allowed together with '-o' and '-f'"
+msgstr ""
+
+#: src/strip.c:222
+#, c-format
+msgid "-f option specified twice"
+msgstr ""
+
+#: src/strip.c:231
+#, c-format
+msgid "-F option specified twice"
+msgstr ""
+
+#: src/strip.c:240 src/unstrip.c:125
+#, c-format
+msgid "-o option specified twice"
+msgstr ""
+
+#: src/strip.c:260
+#, c-format
+msgid "-R option supports only .comment section"
+msgstr ""
+
+#: src/strip.c:298 src/strip.c:322
+#, c-format
+msgid "cannot stat input file '%s'"
+msgstr ""
+
+#: src/strip.c:312
+#, c-format
+msgid "while opening '%s'"
+msgstr ""
+
+#: src/strip.c:350
+#, c-format
+msgid "%s: cannot use -o or -f when stripping archive"
+msgstr ""
+
+#: src/strip.c:448
+#, c-format
+msgid "cannot open EBL backend"
+msgstr ""
+
+#: src/strip.c:498 src/strip.c:522
+#, c-format
+msgid "cannot create new file '%s': %s"
+msgstr ""
+
+#: src/strip.c:582
+#, c-format
+msgid "illformed file '%s'"
+msgstr ""
+
+#: src/strip.c:869 src/strip.c:956
+#, c-format
+msgid "while generating output file: %s"
+msgstr ""
+
+#: src/strip.c:929 src/strip.c:1668
+#, c-format
+msgid "%s: error while creating ELF header: %s"
+msgstr ""
+
+#: src/strip.c:943
+#, c-format
+msgid "while preparing output for '%s'"
+msgstr ""
+
+#: src/strip.c:994 src/strip.c:1050
+#, c-format
+msgid "while create section header section: %s"
+msgstr ""
+
+#: src/strip.c:1000
+#, c-format
+msgid "cannot allocate section data: %s"
+msgstr ""
+
+#: src/strip.c:1059
+#, c-format
+msgid "while create section header string table: %s"
+msgstr ""
+
+#: src/strip.c:1593 src/strip.c:1690
+#, c-format
+msgid "while writing '%s': %s"
+msgstr ""
+
+#: src/strip.c:1604
+#, c-format
+msgid "while creating '%s'"
+msgstr ""
+
+#: src/strip.c:1616
+#, c-format
+msgid "while computing checksum for debug information"
+msgstr ""
+
+#: src/strip.c:1676
+#, c-format
+msgid "%s: error while reading the file: %s"
+msgstr ""
+
+#: src/strip.c:1722 src/strip.c:1729
+#, c-format
+msgid "error while finishing '%s': %s"
+msgstr ""
+
+#: src/strip.c:1752 src/strip.c:1809
+#, c-format
+msgid "cannot set access and modification date of '%s'"
+msgstr ""
+
+#: src/unstrip.c:78
+msgid "Match MODULE against file names, not module names"
+msgstr ""
+
+#: src/unstrip.c:79
+msgid "Silently skip unfindable files"
+msgstr ""
+
+#: src/unstrip.c:82
+msgid "Place output into FILE"
+msgstr ""
+
+#: src/unstrip.c:84
+msgid "Create multiple output files under DIRECTORY"
+msgstr ""
+
+#: src/unstrip.c:85
+msgid "Use module rather than file names"
+msgstr ""
+
+#: src/unstrip.c:87
+msgid "Create output for modules that have no separate debug information"
+msgstr ""
+
+#: src/unstrip.c:90
+msgid "Apply relocations to section contents in ET_REL files"
+msgstr ""
+
+#: src/unstrip.c:92
+msgid "Only list module and file names, build IDs"
+msgstr ""
+
+#: src/unstrip.c:134
+#, c-format
+msgid "-d option specified twice"
+msgstr ""
+
+#: src/unstrip.c:166
+#, c-format
+msgid "only one of -o or -d allowed"
+msgstr ""
+
+#: src/unstrip.c:175
+#, c-format
+msgid "-n cannot be used with explicit files or -o or -d"
+msgstr ""
+
+#: src/unstrip.c:190
+#, c-format
+msgid "output directory '%s'"
+msgstr ""
+
+#: src/unstrip.c:199
+#, c-format
+msgid "exactly two file arguments are required"
+msgstr ""
+
+#: src/unstrip.c:205
+#, c-format
+msgid "-m, -a, -R, and -i options not allowed with explicit files"
+msgstr ""
+
+#: src/unstrip.c:218
+#, c-format
+msgid "-o or -d is required when using implicit files"
+msgstr ""
+
+#: src/unstrip.c:254
+#, c-format
+msgid "cannot create ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:259
+#, c-format
+msgid "cannot copy ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:264 src/unstrip.c:1817
+#, c-format
+msgid "cannot create program headers: %s"
+msgstr ""
+
+#: src/unstrip.c:270
+#, c-format
+msgid "cannot copy program header: %s"
+msgstr ""
+
+#: src/unstrip.c:280
+#, c-format
+msgid "cannot copy section header: %s"
+msgstr ""
+
+#: src/unstrip.c:283 src/unstrip.c:1505
+#, c-format
+msgid "cannot get section data: %s"
+msgstr ""
+
+#: src/unstrip.c:285 src/unstrip.c:1507
+#, c-format
+msgid "cannot copy section data: %s"
+msgstr ""
+
+#: src/unstrip.c:309
+#, c-format
+msgid "cannot create directory '%s'"
+msgstr ""
+
+#: src/unstrip.c:349 src/unstrip.c:763 src/unstrip.c:1540
+#, c-format
+msgid "cannot get symbol table entry: %s"
+msgstr ""
+
+#: src/unstrip.c:365 src/unstrip.c:580 src/unstrip.c:601 src/unstrip.c:613
+#: src/unstrip.c:1561 src/unstrip.c:1691 src/unstrip.c:1715
+#, c-format
+msgid "cannot update symbol table: %s"
+msgstr ""
+
+#: src/unstrip.c:382 src/unstrip.c:432 src/unstrip.c:562 src/unstrip.c:1209
+#: src/unstrip.c:1525 src/unstrip.c:1720 src/unstrip.c:1791
+#, c-format
+msgid "cannot update section header: %s"
+msgstr ""
+
+#: src/unstrip.c:408 src/unstrip.c:419
+#, c-format
+msgid "cannot update relocation: %s"
+msgstr ""
+
+#: src/unstrip.c:507
+#, c-format
+msgid "cannot get symbol version: %s"
+msgstr ""
+
+#: src/unstrip.c:519
+#, c-format
+msgid "unexpected section type in [%Zu] with sh_link to symtab"
+msgstr ""
+
+#: src/unstrip.c:769
+#, c-format
+msgid "invalid string offset in symbol [%Zu]"
+msgstr ""
+
+#: src/unstrip.c:911 src/unstrip.c:1248
+#, c-format
+msgid "cannot read section [%Zu] name: %s"
+msgstr ""
+
+#: src/unstrip.c:952 src/unstrip.c:971 src/unstrip.c:1004
+#, c-format
+msgid "cannot read '.gnu.prelink_undo' section: %s"
+msgstr ""
+
+#: src/unstrip.c:992
+#, c-format
+msgid "invalid contents in '%s' section"
+msgstr ""
+
+#: src/unstrip.c:1047 src/unstrip.c:1370
+#, c-format
+msgid "cannot find matching section for [%Zu] '%s'"
+msgstr ""
+
+#: src/unstrip.c:1171 src/unstrip.c:1186 src/unstrip.c:1451
+#, c-format
+msgid "cannot add section name to string table: %s"
+msgstr ""
+
+#: src/unstrip.c:1195
+#, c-format
+msgid "cannot update section header string table data: %s"
+msgstr ""
+
+#: src/unstrip.c:1223 src/unstrip.c:1227
+#, c-format
+msgid "cannot get section header string table section index: %s"
+msgstr ""
+
+#: src/unstrip.c:1231 src/unstrip.c:1235 src/unstrip.c:1466
+#, c-format
+msgid "cannot get section count: %s"
+msgstr ""
+
+#: src/unstrip.c:1293 src/unstrip.c:1385
+#, c-format
+msgid "cannot read section header string table: %s"
+msgstr ""
+
+#: src/unstrip.c:1445
+#, c-format
+msgid "cannot add new section: %s"
+msgstr ""
+
+#: src/unstrip.c:1548
+#, c-format
+msgid "symbol [%Zu] has invalid section index"
+msgstr ""
+
+#: src/unstrip.c:1800
+#, c-format
+msgid "cannot get ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:1827
+#, c-format
+msgid "cannot update program header: %s"
+msgstr ""
+
+#: src/unstrip.c:1832 src/unstrip.c:1911
+#, c-format
+msgid "cannot write output file: %s"
+msgstr ""
+
+#: src/unstrip.c:1880
+#, c-format
+msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+
+#: src/unstrip.c:1883
+#, c-format
+msgid ""
+"DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+
+#: src/unstrip.c:1902 src/unstrip.c:1942 src/unstrip.c:1954 src/unstrip.c:2034
+#, c-format
+msgid "cannot create ELF descriptor: %s"
+msgstr ""
+
+#: src/unstrip.c:1960
+#, c-format
+msgid "'%s' and '%s' do not seem to match"
+msgstr ""
+
+#: src/unstrip.c:1991
+#, c-format
+msgid "cannot find stripped file for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:1995
+#, c-format
+msgid "cannot open stripped file '%s' for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2010
+#, c-format
+msgid "cannot find debug file for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2014
+#, c-format
+msgid "cannot open debug file '%s' for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2027
+#, c-format
+msgid "module '%s' file '%s' is not stripped"
+msgstr ""
+
+#: src/unstrip.c:2058
+#, c-format
+msgid "cannot cache section addresses for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2191
+#, c-format
+msgid "no matching modules found"
+msgstr ""
+
+#: src/unstrip.c:2200
+#, c-format
+msgid "matched more than one module"
+msgstr ""
+
+#: src/unstrip.c:2247
+msgid ""
+"STRIPPED-FILE DEBUG-FILE\n"
+"[MODULE...]"
+msgstr ""
+
+#: src/unstrip.c:2248
+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"
+"\n"
+"MODULE arguments give file name patterns matching modules to process.\n"
+"With -f these match the file name of the main (stripped) file (slashes are "
+"never special), otherwise they match the simple module names. With no "
+"arguments, process all modules found.\n"
+"\n"
+"Multiple modules are written to files under OUTPUT-DIRECTORY, creating "
+"subdirectories as needed. With -m these files have simple module names, "
+"otherwise they have the name of the main file complete with directory "
+"underneath OUTPUT-DIRECTORY.\n"
+"\n"
+"With -n no files are written, but one line to standard output for each "
+"module:\n"
+"\tSTART+SIZE BUILDID FILE DEBUGFILE MODULENAME\n"
+"START and SIZE are hexadecimal giving the address bounds of the module. "
+"BUILDID is hexadecimal for the build ID bits, or - if no ID is known; the "
+"hexadecimal may be followed by @0xADDR giving the address where the ID "
+"resides if that is known. FILE is the file name found for the module, or - "
+"if none was found, or . if an ELF image is available but not from any named "
+"file. DEBUGFILE is the separate debuginfo file name, or - if no debuginfo "
+"was found, or . if FILE contains the debug information."
+msgstr ""
diff --git a/po/it.po b/po/it.po
new file mode 100644
index 00000000..0e2d3b27
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,5666 @@
+# translation of elfutils.master.RedHatelfutils.it.po to Italiano
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Francesco Tombolini <tombo@adamantio.net>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: elfutils.master.RedHatelfutils.it\n"
+"Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
+"POT-Creation-Date: 2010-04-21 07:41-0700\n"
+"PO-Revision-Date: 2009-04-30 03:50+0200\n"
+"Last-Translator: Francesco Tombolini <tombo@adamantio.net>\n"
+"Language-Team: Italiano <fedora-trans-it@redhat.com>\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: KBabel 1.11.4\n"
+
+#: lib/xmalloc.c:51 lib/xmalloc.c:65 lib/xmalloc.c:79 src/readelf.c:2822
+#: src/readelf.c:3161 src/unstrip.c:2087 src/unstrip.c:2295
+#, c-format
+msgid "memory exhausted"
+msgstr ""
+
+#: libasm/asm_error.c:62 libdw/dwarf_error.c:79 libdwfl/libdwflP.h:70
+#: libelf/elf_error.c:81
+msgid "no error"
+msgstr ""
+
+#: libasm/asm_error.c:63 libdw/dwarf_error.c:88 libdwfl/libdwflP.h:72
+#: libelf/elf_error.c:112
+msgid "out of memory"
+msgstr ""
+
+#: libasm/asm_error.c:64 src/ldgeneric.c:2687
+#, c-format
+msgid "cannot create output file"
+msgstr ""
+
+#: libasm/asm_error.c:65
+msgid "invalid parameter"
+msgstr ""
+
+#: libasm/asm_error.c:66
+msgid "cannot change mode of output file"
+msgstr ""
+
+#: libasm/asm_error.c:67 src/ldgeneric.c:7001
+#, c-format
+msgid "cannot rename output file"
+msgstr ""
+
+#: libasm/asm_error.c:68
+msgid "duplicate symbol"
+msgstr ""
+
+#: libasm/asm_error.c:69
+msgid "invalid section type for operation"
+msgstr ""
+
+#: libasm/asm_error.c:70
+msgid "error during output of data"
+msgstr ""
+
+#: libasm/asm_error.c:71
+msgid "no backend support available"
+msgstr ""
+
+#: libasm/asm_error.c:81 libdw/dwarf_error.c:80 libdwfl/libdwflP.h:71
+#: libelf/elf_error.c:84
+msgid "unknown error"
+msgstr ""
+
+#: libdw/dwarf_error.c:81
+msgid "invalid access"
+msgstr ""
+
+#: libdw/dwarf_error.c:82
+msgid "no regular file"
+msgstr ""
+
+#: libdw/dwarf_error.c:83
+msgid "I/O error"
+msgstr ""
+
+#: libdw/dwarf_error.c:84
+msgid "invalid ELF file"
+msgstr ""
+
+#: libdw/dwarf_error.c:85
+msgid "no DWARF information"
+msgstr ""
+
+#: libdw/dwarf_error.c:86
+msgid "no ELF file"
+msgstr ""
+
+#: libdw/dwarf_error.c:87
+msgid "cannot get ELF header"
+msgstr ""
+
+#: libdw/dwarf_error.c:89
+msgid "not implemented"
+msgstr ""
+
+#: libdw/dwarf_error.c:90 libelf/elf_error.c:128 libelf/elf_error.c:176
+msgid "invalid command"
+msgstr ""
+
+#: libdw/dwarf_error.c:91
+msgid "invalid version"
+msgstr ""
+
+#: libdw/dwarf_error.c:92
+msgid "invalid file"
+msgstr ""
+
+#: libdw/dwarf_error.c:93
+msgid "no entries found"
+msgstr ""
+
+#: libdw/dwarf_error.c:94
+msgid "invalid DWARF"
+msgstr ""
+
+#: libdw/dwarf_error.c:95
+msgid "no string data"
+msgstr ""
+
+#: libdw/dwarf_error.c:96
+msgid "no address value"
+msgstr ""
+
+#: libdw/dwarf_error.c:97
+msgid "no constant value"
+msgstr ""
+
+#: libdw/dwarf_error.c:98
+msgid "no reference value"
+msgstr ""
+
+#: libdw/dwarf_error.c:99
+msgid "invalid reference value"
+msgstr ""
+
+#: libdw/dwarf_error.c:100
+msgid ".debug_line section missing"
+msgstr ""
+
+#: libdw/dwarf_error.c:101
+msgid "invalid .debug_line section"
+msgstr ""
+
+#: libdw/dwarf_error.c:102
+msgid "debug information too big"
+msgstr ""
+
+#: libdw/dwarf_error.c:103
+msgid "invalid DWARF version"
+msgstr ""
+
+#: libdw/dwarf_error.c:104
+msgid "invalid directory index"
+msgstr ""
+
+#: libdw/dwarf_error.c:105 libdwfl/libdwflP.h:91
+msgid "address out of range"
+msgstr ""
+
+#: libdw/dwarf_error.c:106
+msgid "no location list value"
+msgstr ""
+
+#: libdw/dwarf_error.c:107
+msgid "no block data"
+msgstr ""
+
+#: libdw/dwarf_error.c:108
+msgid "invalid line index"
+msgstr ""
+
+#: libdw/dwarf_error.c:109
+msgid "invalid address range index"
+msgstr ""
+
+#: libdw/dwarf_error.c:110 libdwfl/libdwflP.h:92
+msgid "no matching address range"
+msgstr ""
+
+#: libdw/dwarf_error.c:111
+msgid "no flag value"
+msgstr ""
+
+#: libdw/dwarf_error.c:112 libelf/elf_error.c:253
+msgid "invalid offset"
+msgstr ""
+
+#: libdw/dwarf_error.c:113
+msgid ".debug_ranges section missing"
+msgstr ""
+
+#: libdw/dwarf_error.c:114
+msgid "invalid CFI section"
+msgstr ""
+
+#: libdwfl/argp-std.c:67 src/unstrip.c:2237
+msgid "Input selection options:"
+msgstr ""
+
+#: libdwfl/argp-std.c:68
+msgid "Find addresses in FILE"
+msgstr ""
+
+#: libdwfl/argp-std.c:70
+msgid "Find addresses from signatures found in COREFILE"
+msgstr ""
+
+#: libdwfl/argp-std.c:72
+msgid "Find addresses in files mapped into process PID"
+msgstr ""
+
+#: libdwfl/argp-std.c:74
+msgid ""
+"Find addresses in files mapped as read from FILE in Linux /proc/PID/maps "
+"format"
+msgstr ""
+
+#: libdwfl/argp-std.c:76
+msgid "Find addresses in the running kernel"
+msgstr ""
+
+#: libdwfl/argp-std.c:78
+msgid "Kernel with all modules"
+msgstr ""
+
+#: libdwfl/argp-std.c:80
+msgid "Search path for separate debuginfo files"
+msgstr ""
+
+#: libdwfl/argp-std.c:163
+msgid "only one of -e, -p, -k, -K, or --core allowed"
+msgstr ""
+
+#: libdwfl/argp-std.c:223
+#, c-format
+msgid "cannot read ELF core file: %s"
+msgstr ""
+
+#: libdwfl/argp-std.c:241
+msgid "No modules recognized in core file"
+msgstr ""
+
+#: libdwfl/argp-std.c:253
+msgid "cannot load kernel symbols"
+msgstr ""
+
+#: libdwfl/argp-std.c:257
+msgid "cannot find kernel modules"
+msgstr ""
+
+#: libdwfl/argp-std.c:271
+msgid "cannot find kernel or modules"
+msgstr ""
+
+#: libdwfl/libdwflP.h:73
+msgid "See errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:74
+msgid "See elf_errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:75
+msgid "See dwarf_errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:76
+msgid "See ebl_errno (XXX missing)"
+msgstr ""
+
+#: libdwfl/libdwflP.h:77
+msgid "gzip decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:78
+msgid "bzip2 decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:79
+msgid "LZMA decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:80
+msgid "no support library found for machine"
+msgstr ""
+
+#: libdwfl/libdwflP.h:81
+msgid "Callbacks missing for ET_REL file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:82
+msgid "Unsupported relocation type"
+msgstr ""
+
+#: libdwfl/libdwflP.h:83
+msgid "r_offset is bogus"
+msgstr ""
+
+#: libdwfl/libdwflP.h:84 libelf/elf_error.c:132 libelf/elf_error.c:192
+msgid "offset out of range"
+msgstr ""
+
+#: libdwfl/libdwflP.h:85
+msgid "relocation refers to undefined symbol"
+msgstr ""
+
+#: libdwfl/libdwflP.h:86
+msgid "Callback returned failure"
+msgstr ""
+
+#: libdwfl/libdwflP.h:87
+msgid "No DWARF information found"
+msgstr ""
+
+#: libdwfl/libdwflP.h:88
+msgid "No symbol table found"
+msgstr ""
+
+#: libdwfl/libdwflP.h:89
+msgid "No ELF program headers"
+msgstr ""
+
+#: libdwfl/libdwflP.h:90
+msgid "address range overlaps an existing module"
+msgstr ""
+
+#: libdwfl/libdwflP.h:93
+msgid "image truncated"
+msgstr ""
+
+#: libdwfl/libdwflP.h:94
+msgid "ELF file opened"
+msgstr ""
+
+#: libdwfl/libdwflP.h:95
+msgid "not a valid ELF file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:96
+msgid "cannot handle DWARF type description"
+msgstr ""
+
+#: libebl/eblbackendname.c:63
+msgid "No backend"
+msgstr ""
+
+#: libebl/eblcorenotetypename.c:107 libebl/eblobjecttypename.c:78
+#: libebl/eblobjnotetypename.c:86 libebl/eblosabiname.c:98
+#: libebl/eblsectionname.c:110 libebl/eblsectiontypename.c:140
+#: libebl/eblsegmenttypename.c:104
+msgid "<unknown>"
+msgstr ""
+
+#: libebl/ebldynamictagname.c:126
+#, c-format
+msgid "<unknown>: %#<PRIx64>"
+msgstr ""
+
+#: libebl/eblobjnote.c:76
+#, c-format
+msgid " Build ID: "
+msgstr ""
+
+#: libebl/eblobjnote.c:87
+#, c-format
+msgid " Linker version: %.*s\n"
+msgstr ""
+
+#: libebl/eblobjnote.c:136
+#, c-format
+msgid " OS: %s, ABI: "
+msgstr ""
+
+#: libebl/eblosabiname.c:95
+msgid "Stand alone"
+msgstr ""
+
+#: libebl/eblsymbolbindingname.c:92 libebl/eblsymboltypename.c:98
+#, c-format
+msgid "<unknown>: %d"
+msgstr ""
+
+#: libelf/elf_error.c:88
+msgid "unknown version"
+msgstr ""
+
+#: libelf/elf_error.c:92
+msgid "unknown type"
+msgstr ""
+
+#: libelf/elf_error.c:96
+msgid "invalid `Elf' handle"
+msgstr ""
+
+#: libelf/elf_error.c:100
+msgid "invalid size of source operand"
+msgstr ""
+
+#: libelf/elf_error.c:104
+msgid "invalid size of destination operand"
+msgstr ""
+
+#: libelf/elf_error.c:108 src/readelf.c:4779
+#, c-format
+msgid "invalid encoding"
+msgstr ""
+
+#: libelf/elf_error.c:116
+msgid "invalid file descriptor"
+msgstr ""
+
+#: libelf/elf_error.c:120
+msgid "invalid operation"
+msgstr ""
+
+#: libelf/elf_error.c:124
+msgid "ELF version not set"
+msgstr ""
+
+#: libelf/elf_error.c:136
+msgid "invalid fmag field in archive header"
+msgstr ""
+
+#: libelf/elf_error.c:140
+msgid "invalid archive file"
+msgstr ""
+
+#: libelf/elf_error.c:144
+msgid "descriptor is not for an archive"
+msgstr ""
+
+#: libelf/elf_error.c:148
+msgid "no index available"
+msgstr ""
+
+#: libelf/elf_error.c:152
+msgid "cannot read data from file"
+msgstr ""
+
+#: libelf/elf_error.c:156
+msgid "cannot write data to file"
+msgstr ""
+
+#: libelf/elf_error.c:160
+msgid "invalid binary class"
+msgstr ""
+
+#: libelf/elf_error.c:164
+msgid "invalid section index"
+msgstr ""
+
+#: libelf/elf_error.c:168
+msgid "invalid operand"
+msgstr ""
+
+#: libelf/elf_error.c:172
+msgid "invalid section"
+msgstr ""
+
+#: libelf/elf_error.c:180
+msgid "executable header not created first"
+msgstr ""
+
+#: libelf/elf_error.c:184
+msgid "file descriptor disabled"
+msgstr ""
+
+#: libelf/elf_error.c:188
+msgid "archive/member file descriptor mismatch"
+msgstr ""
+
+#: libelf/elf_error.c:196
+msgid "cannot manipulate null section"
+msgstr ""
+
+#: libelf/elf_error.c:200
+msgid "data/scn mismatch"
+msgstr ""
+
+#: libelf/elf_error.c:204
+msgid "invalid section header"
+msgstr ""
+
+#: libelf/elf_error.c:208 src/readelf.c:6242 src/readelf.c:6343
+#, c-format
+msgid "invalid data"
+msgstr ""
+
+#: libelf/elf_error.c:212
+msgid "unknown data encoding"
+msgstr ""
+
+#: libelf/elf_error.c:216
+msgid "section `sh_size' too small for data"
+msgstr ""
+
+#: libelf/elf_error.c:220
+msgid "invalid section alignment"
+msgstr ""
+
+#: libelf/elf_error.c:224
+msgid "invalid section entry size"
+msgstr ""
+
+#: libelf/elf_error.c:228
+msgid "update() for write on read-only file"
+msgstr ""
+
+#: libelf/elf_error.c:232
+msgid "no such file"
+msgstr ""
+
+#: libelf/elf_error.c:236
+msgid "only relocatable files can contain section groups"
+msgstr ""
+
+#: libelf/elf_error.c:241
+msgid ""
+"program header only allowed in executables, shared objects, and core files"
+msgstr ""
+
+#: libelf/elf_error.c:248
+msgid "file has no program header"
+msgstr ""
+
+#: src/addr2line.c:66
+msgid "Output selection options:"
+msgstr ""
+
+#: src/addr2line.c:67
+msgid "Show only base names of source files"
+msgstr ""
+
+#: src/addr2line.c:69
+msgid "Show absolute file names using compilation directory"
+msgstr ""
+
+#: src/addr2line.c:70
+msgid "Also show function names"
+msgstr ""
+
+#: src/addr2line.c:71
+msgid "Also show symbol or section names"
+msgstr ""
+
+#: src/addr2line.c:73
+msgid "Treat addresses as offsets relative to NAME section."
+msgstr ""
+
+#: src/addr2line.c:75 src/elfcmp.c:75 src/findtextrel.c:75 src/nm.c:103
+#: src/strings.c:83
+msgid "Miscellaneous:"
+msgstr ""
+
+#: src/addr2line.c:84
+msgid ""
+"Locate source files and line information for ADDRs (in a.out by default)."
+msgstr ""
+
+#: src/addr2line.c:88
+msgid "[ADDR...]"
+msgstr ""
+
+#: src/addr2line.c:185 src/ar.c:289 src/elfcmp.c:555 src/elflint.c:239
+#: src/findtextrel.c:170 src/ld.c:957 src/nm.c:253 src/objdump.c:181
+#: src/ranlib.c:136 src/readelf.c:449 src/size.c:219 src/strings.c:227
+#: src/strip.c:204 src/unstrip.c:234
+#, c-format
+msgid ""
+"Copyright (C) %s Red Hat, Inc.\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+
+#: src/addr2line.c:190 src/ar.c:294 src/elfcmp.c:560 src/elflint.c:244
+#: src/findtextrel.c:175 src/ld.c:962 src/nm.c:258 src/objdump.c:186
+#: src/ranlib.c:141 src/readelf.c:454 src/size.c:224 src/strings.c:232
+#: src/strip.c:209 src/unstrip.c:239
+#, c-format
+msgid "Written by %s.\n"
+msgstr ""
+
+#: src/addr2line.c:405
+#, c-format
+msgid "Section syntax requires exactly one module"
+msgstr ""
+
+#: src/addr2line.c:428
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside section '%s'"
+msgstr ""
+
+#: src/addr2line.c:461
+#, c-format
+msgid "cannot find symbol '%s'"
+msgstr ""
+
+#: src/addr2line.c:466
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
+msgstr ""
+
+#: src/ar.c:76
+msgid "Commands:"
+msgstr ""
+
+#: src/ar.c:77
+msgid "Delete files from archive."
+msgstr ""
+
+#: src/ar.c:78
+msgid "Move files in archive."
+msgstr ""
+
+#: src/ar.c:79
+msgid "Print files in archive."
+msgstr ""
+
+#: src/ar.c:80
+msgid "Quick append files to archive."
+msgstr ""
+
+#: src/ar.c:82
+msgid "Replace existing or insert new file into archive."
+msgstr ""
+
+#: src/ar.c:83
+msgid "Display content of archive."
+msgstr ""
+
+#: src/ar.c:84
+msgid "Extract files from archive."
+msgstr ""
+
+#: src/ar.c:86
+msgid "Command Modifiers:"
+msgstr ""
+
+#: src/ar.c:87
+msgid "Preserve original dates."
+msgstr ""
+
+#: src/ar.c:88
+msgid "Use instance [COUNT] of name."
+msgstr ""
+
+#: src/ar.c:90
+msgid "Do not replace existing files with extracted files."
+msgstr ""
+
+#: src/ar.c:91
+msgid "Allow filename to be truncated if necessary."
+msgstr ""
+
+#: src/ar.c:93
+msgid "Provide verbose output."
+msgstr ""
+
+#: src/ar.c:94
+msgid "Force regeneration of symbol table."
+msgstr ""
+
+#: src/ar.c:95
+msgid "Insert file after [MEMBER]."
+msgstr ""
+
+#: src/ar.c:96
+msgid "Insert file before [MEMBER]."
+msgstr ""
+
+#: src/ar.c:97
+msgid "Same as -b."
+msgstr ""
+
+#: src/ar.c:98
+msgid "Suppress message when library has to be created."
+msgstr ""
+
+#: src/ar.c:100
+msgid "Use full path for file matching."
+msgstr ""
+
+#: src/ar.c:101
+msgid "Update only older files in archive."
+msgstr ""
+
+#: src/ar.c:107
+msgid "Create, modify, and extract from archives."
+msgstr ""
+
+#: src/ar.c:110
+msgid "[MEMBER] [COUNT] ARCHIVE [FILE...]"
+msgstr ""
+
+#: src/ar.c:192
+#, c-format
+msgid "'a', 'b', and 'i' are only allowed with the 'm' and 'r' options"
+msgstr ""
+
+#: src/ar.c:197
+#, c-format
+msgid "MEMBER parameter required for 'a', 'b', and 'i' modifiers"
+msgstr ""
+
+#: src/ar.c:213
+#, c-format
+msgid "'N' is only meaningful with the 'x' and 'd' options"
+msgstr ""
+
+#: src/ar.c:218
+#, c-format
+msgid "COUNT parameter required"
+msgstr ""
+
+#: src/ar.c:230
+#, c-format
+msgid "invalid COUNT parameter %s"
+msgstr ""
+
+#: src/ar.c:237
+#, c-format
+msgid "'%c' is only meaningful with the 'x' option"
+msgstr ""
+
+#: src/ar.c:243
+#, c-format
+msgid "archive name required"
+msgstr ""
+
+#: src/ar.c:314
+#, c-format
+msgid "More than one operation specified"
+msgstr ""
+
+#: src/ar.c:404
+#, c-format
+msgid "cannot open archive '%s'"
+msgstr ""
+
+#: src/ar.c:414
+#, c-format
+msgid "cannot open archive '%s': %s"
+msgstr ""
+
+#: src/ar.c:418
+#, c-format
+msgid "%s: not an archive file"
+msgstr ""
+
+#: src/ar.c:422
+#, c-format
+msgid "cannot stat archive '%s'"
+msgstr ""
+
+#: src/ar.c:434
+#, c-format
+msgid "no entry %s in archive\n"
+msgstr ""
+
+#: src/ar.c:487 src/ar.c:929 src/ar.c:1129
+#, c-format
+msgid "cannot create hash table"
+msgstr ""
+
+#: src/ar.c:494 src/ar.c:936 src/ar.c:1138
+#, c-format
+msgid "cannot insert into hash table"
+msgstr ""
+
+#: src/ar.c:502 src/ranlib.c:176
+#, c-format
+msgid "cannot stat '%s'"
+msgstr ""
+
+#: src/ar.c:598
+#, c-format
+msgid "cannot read content of %s: %s"
+msgstr ""
+
+#: src/ar.c:641
+#, c-format
+msgid "cannot open %.*s"
+msgstr ""
+
+#: src/ar.c:663
+#, c-format
+msgid "failed to write %s"
+msgstr ""
+
+#: src/ar.c:675
+#, c-format
+msgid "cannot change mode of %s"
+msgstr ""
+
+#: src/ar.c:691
+#, c-format
+msgid "cannot change modification time of %s"
+msgstr ""
+
+#: src/ar.c:737
+#, c-format
+msgid "cannot rename temporary file to %.*s"
+msgstr ""
+
+#: src/ar.c:773 src/ar.c:1021 src/ar.c:1419 src/ranlib.c:250
+#, c-format
+msgid "cannot create new file"
+msgstr ""
+
+#: src/ar.c:1220
+#, c-format
+msgid "position member %s not found"
+msgstr ""
+
+#: src/ar.c:1230
+#, c-format
+msgid "%s: no entry %s in archive!\n"
+msgstr ""
+
+#: src/ar.c:1259 src/ldgeneric.c:519 src/objdump.c:257
+#, c-format
+msgid "cannot open %s"
+msgstr ""
+
+#: src/ar.c:1264
+#, c-format
+msgid "cannot stat %s"
+msgstr ""
+
+#: src/ar.c:1270
+#, c-format
+msgid "%s is no regular file"
+msgstr ""
+
+#: src/ar.c:1283
+#, c-format
+msgid "cannot get ELF descriptor for %s: %s\n"
+msgstr ""
+
+#: src/ar.c:1302
+#, c-format
+msgid "cannot read %s: %s"
+msgstr ""
+
+#: src/arlib.c:215
+#, c-format
+msgid "the archive '%s' is too large"
+msgstr ""
+
+#: src/arlib.c:228
+#, c-format
+msgid "cannot read ELF header of %s(%s): %s"
+msgstr ""
+
+#: src/elfcmp.c:69
+msgid "Control options:"
+msgstr ""
+
+#: src/elfcmp.c:70
+msgid ""
+"Control treatment of gaps in loadable segments [ignore|match] (default: "
+"ignore)"
+msgstr ""
+
+#: src/elfcmp.c:72
+msgid "Ignore permutation of buckets in SHT_HASH section"
+msgstr ""
+
+#: src/elfcmp.c:73
+msgid "Output nothing; yield exit status only"
+msgstr ""
+
+#: src/elfcmp.c:80
+msgid "Compare relevant parts of two ELF files for equality."
+msgstr ""
+
+#: src/elfcmp.c:84
+msgid "FILE1 FILE2"
+msgstr ""
+
+#: src/elfcmp.c:140
+msgid "Invalid number of parameters.\n"
+msgstr ""
+
+#: src/elfcmp.c:168 src/elfcmp.c:173
+#, c-format
+msgid "cannot get ELF header of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:190
+#, c-format
+msgid "%s %s diff: ELF header"
+msgstr ""
+
+#: src/elfcmp.c:198 src/elfcmp.c:201
+#, c-format
+msgid "cannot get section count of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:206
+#, c-format
+msgid "%s %s diff: section count"
+msgstr ""
+
+#: src/elfcmp.c:214 src/elfcmp.c:217
+#, c-format
+msgid "cannot get program header count of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:222
+#, c-format
+msgid "%s %s diff: program header count"
+msgstr ""
+
+#: src/elfcmp.c:281
+#, c-format
+msgid "%s %s differ: section header"
+msgstr ""
+
+#: src/elfcmp.c:309 src/elfcmp.c:315
+#, c-format
+msgid "cannot get content of section %zu in '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:331 src/elfcmp.c:337
+#, c-format
+msgid "cannot get symbol in '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:358
+#, c-format
+msgid "%s %s differ: symbol table [%zu]"
+msgstr ""
+
+#: src/elfcmp.c:361
+#, c-format
+msgid "%s %s differ: symbol table [%zu,%zu]"
+msgstr ""
+
+#: src/elfcmp.c:409
+#, c-format
+msgid "%s %s differ: section [%zu] '%s' content"
+msgstr ""
+
+#: src/elfcmp.c:413
+#, c-format
+msgid "%s %s differ: section [%zu,%zu] '%s' content"
+msgstr ""
+
+#: src/elfcmp.c:429
+#, c-format
+msgid "%s %s differ: unequal amount of important sections"
+msgstr ""
+
+#: src/elfcmp.c:463 src/elfcmp.c:468
+#, c-format
+msgid "cannot load data of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:487 src/elfcmp.c:493
+#, c-format
+msgid "cannot get program header entry %d of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:499
+#, c-format
+msgid "%s %s differ: program header %d"
+msgstr ""
+
+#: src/elfcmp.c:524
+#, c-format
+msgid "%s %s differ: gap"
+msgstr ""
+
+#: src/elfcmp.c:583
+#, c-format
+msgid "Invalid value '%s' for --gaps parameter."
+msgstr ""
+
+#: src/elfcmp.c:607 src/findtextrel.c:229 src/ldgeneric.c:1767
+#: src/ldgeneric.c:4257 src/nm.c:363 src/ranlib.c:169 src/size.c:301
+#: src/strings.c:183 src/strip.c:433 src/strip.c:468 src/unstrip.c:1900
+#: src/unstrip.c:1929
+#, c-format
+msgid "cannot open '%s'"
+msgstr ""
+
+#: src/elfcmp.c:611 src/findtextrel.c:236 src/ranlib.c:186
+#, c-format
+msgid "cannot create ELF descriptor for '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:616
+#, c-format
+msgid "cannot create EBL descriptor for '%s'"
+msgstr ""
+
+#: src/elfcmp.c:634
+#, c-format
+msgid "cannot get section header of section %zu: %s"
+msgstr ""
+
+#: src/elfcmp.c:644
+#, c-format
+msgid "cannot get content of section %zu: %s"
+msgstr ""
+
+#: src/elfcmp.c:654 src/elfcmp.c:668
+#, c-format
+msgid "cannot get relocation: %s"
+msgstr ""
+
+#: src/elflint.c:72
+msgid "Be extremely strict, flag level 2 features."
+msgstr ""
+
+#: src/elflint.c:73
+msgid "Do not print anything if successful"
+msgstr ""
+
+#: src/elflint.c:74
+msgid "Binary is a separate debuginfo file"
+msgstr ""
+
+#: src/elflint.c:76
+msgid ""
+"Binary has been created with GNU ld and is therefore known to be broken in "
+"certain ways"
+msgstr ""
+
+#: src/elflint.c:82
+msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
+msgstr ""
+
+#: src/elflint.c:86 src/readelf.c:118
+msgid "FILE..."
+msgstr ""
+
+#: src/elflint.c:159 src/readelf.c:272
+#, c-format
+msgid "cannot open input file"
+msgstr ""
+
+#: src/elflint.c:166
+#, c-format
+msgid "cannot generate Elf descriptor: %s\n"
+msgstr ""
+
+#: src/elflint.c:185
+#, c-format
+msgid "error while closing Elf descriptor: %s\n"
+msgstr ""
+
+#: src/elflint.c:189
+msgid "No errors"
+msgstr ""
+
+#: src/elflint.c:223 src/readelf.c:425
+msgid "Missing file name.\n"
+msgstr ""
+
+#: src/elflint.c:302
+#, c-format
+msgid " error while freeing sub-ELF descriptor: %s\n"
+msgstr ""
+
+#: src/elflint.c:310
+#, c-format
+msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
+msgstr ""
+
+#: src/elflint.c:370
+#, c-format
+msgid "e_ident[%d] == %d is no known class\n"
+msgstr ""
+
+#: src/elflint.c:375
+#, c-format
+msgid "e_ident[%d] == %d is no known data encoding\n"
+msgstr ""
+
+#: src/elflint.c:379
+#, c-format
+msgid "unknown ELF header version number e_ident[%d] == %d\n"
+msgstr ""
+
+#: src/elflint.c:385
+#, c-format
+msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
+msgstr ""
+
+#: src/elflint.c:391
+#, c-format
+msgid "unsupport ABI version e_ident[%d] == %d\n"
+msgstr ""
+
+#: src/elflint.c:396
+#, c-format
+msgid "e_ident[%zu] is not zero\n"
+msgstr ""
+
+#: src/elflint.c:401
+#, c-format
+msgid "unknown object file type %d\n"
+msgstr ""
+
+#: src/elflint.c:408
+#, c-format
+msgid "unknown machine type %d\n"
+msgstr ""
+
+#: src/elflint.c:412
+#, c-format
+msgid "unknown object file version\n"
+msgstr ""
+
+#: src/elflint.c:418
+#, c-format
+msgid "invalid program header offset\n"
+msgstr ""
+
+#: src/elflint.c:420
+#, c-format
+msgid "executables and DSOs cannot have zero program header offset\n"
+msgstr ""
+
+#: src/elflint.c:424
+#, c-format
+msgid "invalid number of program header entries\n"
+msgstr ""
+
+#: src/elflint.c:432
+#, c-format
+msgid "invalid section header table offset\n"
+msgstr ""
+
+#: src/elflint.c:435
+#, c-format
+msgid "section header table must be present\n"
+msgstr ""
+
+#: src/elflint.c:449
+#, c-format
+msgid "invalid number of section header table entries\n"
+msgstr ""
+
+#: src/elflint.c:466
+#, c-format
+msgid "invalid section header index\n"
+msgstr ""
+
+#: src/elflint.c:480
+#, c-format
+msgid "invalid number of program header table entries\n"
+msgstr ""
+
+#: src/elflint.c:489
+#, c-format
+msgid "invalid machine flags: %s\n"
+msgstr ""
+
+#: src/elflint.c:496 src/elflint.c:513
+#, c-format
+msgid "invalid ELF header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:499 src/elflint.c:516
+#, c-format
+msgid "invalid program header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:502 src/elflint.c:519
+#, c-format
+msgid "invalid program header position or size\n"
+msgstr ""
+
+#: src/elflint.c:505 src/elflint.c:522
+#, c-format
+msgid "invalid section header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:508 src/elflint.c:525
+#, c-format
+msgid "invalid section header position or size\n"
+msgstr ""
+
+#: src/elflint.c:569
+#, c-format
+msgid ""
+"section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
+"group\n"
+msgstr ""
+
+#: src/elflint.c:573
+#, c-format
+msgid ""
+"section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
+msgstr ""
+
+#: src/elflint.c:589 src/elflint.c:1432 src/elflint.c:1482 src/elflint.c:1591
+#: src/elflint.c:2185 src/elflint.c:2699 src/elflint.c:2860 src/elflint.c:2990
+#: src/elflint.c:3162 src/elflint.c:4062
+#, c-format
+msgid "section [%2d] '%s': cannot get section data\n"
+msgstr ""
+
+#: src/elflint.c:602 src/elflint.c:1598
+#, 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:625
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol table cannot have more than one extended index "
+"section\n"
+msgstr ""
+
+#: src/elflint.c:636
+#, c-format
+msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
+msgstr ""
+
+#: src/elflint.c:645
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
+msgstr ""
+
+#: src/elflint.c:650 src/elflint.c:653 src/elflint.c:656 src/elflint.c:659
+#: src/elflint.c:662 src/elflint.c:665
+#, c-format
+msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
+msgstr ""
+
+#: src/elflint.c:668
+#, c-format
+msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
+msgstr ""
+
+#: src/elflint.c:678
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:687
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
+msgstr ""
+
+#: src/elflint.c:700
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: too large section index but no extended "
+"section index section\n"
+msgstr ""
+
+#: src/elflint.c:706
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
+"st_shndx (%<PRIu32>)\n"
+msgstr ""
+
+#: src/elflint.c:718
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
+msgstr ""
+
+#: src/elflint.c:726
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown type\n"
+msgstr ""
+
+#: src/elflint.c:732
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
+msgstr ""
+
+#: src/elflint.c:737
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
+msgstr ""
+
+#: src/elflint.c:745
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
+msgstr ""
+
+#: src/elflint.c:749
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
+msgstr ""
+
+#: src/elflint.c:753
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
+msgstr ""
+
+#: src/elflint.c:785
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:791 src/elflint.c:816 src/elflint.c:859
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu does not fit completely in referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:800
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
+"SHF_TLS flag set\n"
+msgstr ""
+
+#: src/elflint.c:810 src/elflint.c:852
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:837
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
+msgstr ""
+
+#: src/elflint.c:845
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:872
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+
+#: src/elflint.c:879
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+
+#: src/elflint.c:886
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
+msgstr ""
+
+#: src/elflint.c:936
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section [%"
+"2d]\n"
+msgstr ""
+
+#: src/elflint.c:943
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:959
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
+"match %s section address %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:966
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
+"match %s section size %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:974
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
+"section\n"
+msgstr ""
+
+#: src/elflint.c:990
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
+"segment address %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:997
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
+"segment size %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:1010
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
+"default visibility\n"
+msgstr ""
+
+#: src/elflint.c:1014
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
+msgstr ""
+
+#: src/elflint.c:1059
+#, c-format
+msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
+msgstr ""
+
+#: src/elflint.c:1068 src/elflint.c:1120
+#, c-format
+msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
+msgstr ""
+
+#: src/elflint.c:1093 src/elflint.c:1145
+#, c-format
+msgid ""
+"section [%2d] '%s': relative relocations after index %d as specified by "
+"DT_RELCOUNT\n"
+msgstr ""
+
+#: src/elflint.c:1099 src/elflint.c:1151
+#, c-format
+msgid ""
+"section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
+"specified %d relative relocations\n"
+msgstr ""
+
+#: src/elflint.c:1111
+#, c-format
+msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
+msgstr ""
+
+#: src/elflint.c:1193
+#, c-format
+msgid "section [%2d] '%s': invalid destination section index\n"
+msgstr ""
+
+#: src/elflint.c:1206
+#, c-format
+msgid "section [%2d] '%s': invalid destination section type\n"
+msgstr ""
+
+#: src/elflint.c:1214
+#, c-format
+msgid "section [%2d] '%s': sh_info should be zero\n"
+msgstr ""
+
+#: src/elflint.c:1221
+#, c-format
+msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
+msgstr ""
+
+#: src/elflint.c:1228
+#, c-format
+msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
+msgstr ""
+
+#: src/elflint.c:1288
+#, c-format
+msgid "text relocation flag set but there is no read-only segment\n"
+msgstr ""
+
+#: src/elflint.c:1315
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid type\n"
+msgstr ""
+
+#: src/elflint.c:1323
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: relocation type invalid for the file "
+"type\n"
+msgstr ""
+
+#: src/elflint.c:1331
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
+msgstr ""
+
+#: src/elflint.c:1349
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
+"be used with %s\n"
+msgstr ""
+
+#: src/elflint.c:1366
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:1381
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: copy relocation against symbol of type %"
+"s\n"
+msgstr ""
+
+#: src/elflint.c:1402
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: read-only section modified but text "
+"relocation flag not set\n"
+msgstr ""
+
+#: src/elflint.c:1417
+#, c-format
+msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
+msgstr ""
+
+#: src/elflint.c:1456 src/elflint.c:1506
+#, c-format
+msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:1586
+#, c-format
+msgid "more than one dynamic section present\n"
+msgstr ""
+
+#: src/elflint.c:1604
+#, c-format
+msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
+msgstr ""
+
+#: src/elflint.c:1609 src/elflint.c:1901
+#, c-format
+msgid "section [%2d] '%s': sh_info not zero\n"
+msgstr ""
+
+#: src/elflint.c:1619
+#, c-format
+msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:1627
+#, c-format
+msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
+msgstr ""
+
+#: src/elflint.c:1634
+#, c-format
+msgid "section [%2d] '%s': entry %zu: unknown tag\n"
+msgstr ""
+
+#: src/elflint.c:1645
+#, c-format
+msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
+msgstr ""
+
+#: src/elflint.c:1655
+#, c-format
+msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
+msgstr ""
+
+#: src/elflint.c:1673
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
+msgstr ""
+
+#: src/elflint.c:1695
+#, 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:1738
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:1753
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must be valid offset in section [%"
+"2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:1773 src/elflint.c:1801
+#, c-format
+msgid "section [%2d] '%s': contains %s entry but not %s\n"
+msgstr ""
+
+#: src/elflint.c:1785
+#, c-format
+msgid "section [%2d] '%s': mandatory tag %s not present\n"
+msgstr ""
+
+#: src/elflint.c:1794
+#, c-format
+msgid "section [%2d] '%s': no hash section present\n"
+msgstr ""
+
+#: src/elflint.c:1809 src/elflint.c:1816
+#, c-format
+msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
+msgstr ""
+
+#: src/elflint.c:1826 src/elflint.c:1830
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
+msgstr ""
+
+#: src/elflint.c:1836
+#, c-format
+msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
+msgstr ""
+
+#: src/elflint.c:1847 src/elflint.c:1851 src/elflint.c:1855 src/elflint.c:1859
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
+msgstr ""
+
+#: src/elflint.c:1871
+#, c-format
+msgid ""
+"section [%2d] '%s': only relocatable files can have extended section index\n"
+msgstr ""
+
+#: src/elflint.c:1881
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index section not for symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1886
+#, c-format
+msgid "cannot get data for symbol section\n"
+msgstr ""
+
+#: src/elflint.c:1889
+#, c-format
+msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
+msgstr ""
+
+#: src/elflint.c:1896
+#, c-format
+msgid "section [%2d] '%s': extended index table too small for symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1911
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
+"same symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1922
+#, c-format
+msgid "symbol 0 should have zero extended section index\n"
+msgstr ""
+
+#: src/elflint.c:1934
+#, c-format
+msgid "cannot get data for symbol %zu\n"
+msgstr ""
+
+#: src/elflint.c:1939
+#, c-format
+msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
+msgstr ""
+
+#: src/elflint.c:1955 src/elflint.c:1996
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
+msgstr ""
+
+#: src/elflint.c:1967 src/elflint.c:2008
+#, c-format
+msgid "section [%2d] '%s': chain array too large\n"
+msgstr ""
+
+#: src/elflint.c:1976 src/elflint.c:2017
+#, c-format
+msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:1982
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2023
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2038
+#, c-format
+msgid "section [%2d] '%s': bitmask size not power of 2: %u\n"
+msgstr ""
+
+#: src/elflint.c:2049
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected at "
+"least%ld)\n"
+msgstr ""
+
+#: src/elflint.c:2057
+#, c-format
+msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
+msgstr ""
+
+#: src/elflint.c:2089
+#, c-format
+msgid ""
+"section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
+msgstr ""
+
+#: src/elflint.c:2110
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
+"undefined\n"
+msgstr ""
+
+#: src/elflint.c:2121
+#, c-format
+msgid ""
+"section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
+msgstr ""
+
+#: src/elflint.c:2152
+#, c-format
+msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2157
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2163
+#, c-format
+msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
+msgstr ""
+
+#: src/elflint.c:2176
+#, c-format
+msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
+msgstr ""
+
+#: src/elflint.c:2194
+#, c-format
+msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
+msgstr ""
+
+#: src/elflint.c:2202
+#, c-format
+msgid "section [%2d] '%s': hash table entry size incorrect\n"
+msgstr ""
+
+#: src/elflint.c:2207
+#, c-format
+msgid "section [%2d] '%s': not marked to be allocated\n"
+msgstr ""
+
+#: src/elflint.c:2212
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table has not even room for initial administrative "
+"entries\n"
+msgstr ""
+
+#: src/elflint.c:2260
+#, c-format
+msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
+msgstr ""
+
+#: src/elflint.c:2338 src/elflint.c:2342
+#, c-format
+msgid "section [%2zu] '%s': reference to symbol index 0\n"
+msgstr ""
+
+#: src/elflint.c:2349
+#, 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:2361
+#, 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:2377
+#, c-format
+msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
+msgstr ""
+
+#: src/elflint.c:2397
+#, c-format
+msgid ""
+"section [%2d] '%s': section groups only allowed in relocatable object files\n"
+msgstr ""
+
+#: src/elflint.c:2408
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol table: %s\n"
+msgstr ""
+
+#: src/elflint.c:2413
+#, c-format
+msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
+msgstr ""
+
+#: src/elflint.c:2419
+#, c-format
+msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
+msgstr ""
+
+#: src/elflint.c:2424
+#, c-format
+msgid "section [%2d] '%s': sh_flags not zero\n"
+msgstr ""
+
+#: src/elflint.c:2431
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol for signature\n"
+msgstr ""
+
+#: src/elflint.c:2436
+#, c-format
+msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
+msgstr ""
+
+#: src/elflint.c:2442
+#, c-format
+msgid "section [%2d] '%s': sh_flags not set correctly\n"
+msgstr ""
+
+#: src/elflint.c:2448
+#, c-format
+msgid "section [%2d] '%s': cannot get data: %s\n"
+msgstr ""
+
+#: src/elflint.c:2457
+#, c-format
+msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
+msgstr ""
+
+#: src/elflint.c:2462
+#, c-format
+msgid "section [%2d] '%s': section group without flags word\n"
+msgstr ""
+
+#: src/elflint.c:2468
+#, c-format
+msgid "section [%2d] '%s': section group without member\n"
+msgstr ""
+
+#: src/elflint.c:2472
+#, c-format
+msgid "section [%2d] '%s': section group with only one member\n"
+msgstr ""
+
+#: src/elflint.c:2483
+#, c-format
+msgid "section [%2d] '%s': unknown section group flags\n"
+msgstr ""
+
+#: src/elflint.c:2495
+#, c-format
+msgid "section [%2d] '%s': section index %Zu out of range\n"
+msgstr ""
+
+#: src/elflint.c:2504
+#, c-format
+msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:2511
+#, c-format
+msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:2517
+#, c-format
+msgid ""
+"section [%2d] '%s': element %Zu references section [%2d] '%s' without "
+"SHF_GROUP flag set\n"
+msgstr ""
+
+#: src/elflint.c:2524
+#, c-format
+msgid "section [%2d] '%s' is contained in more than one section group\n"
+msgstr ""
+
+#: src/elflint.c:2713
+#, 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:2724
+#, c-format
+msgid ""
+"section [%2d] '%s' has different number of entries than symbol table [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:2740
+#, c-format
+msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
+msgstr ""
+
+#: src/elflint.c:2756
+#, c-format
+msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
+msgstr ""
+
+#: src/elflint.c:2764
+#, c-format
+msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
+msgstr ""
+
+#: src/elflint.c:2778
+#, c-format
+msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
+msgstr ""
+
+#: src/elflint.c:2783
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %d: version index %d is for defined version\n"
+msgstr ""
+
+#: src/elflint.c:2793
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %d: version index %d is for requested version\n"
+msgstr ""
+
+#: src/elflint.c:2845
+#, c-format
+msgid "more than one version reference section present\n"
+msgstr ""
+
+#: src/elflint.c:2853 src/elflint.c:2982
+#, c-format
+msgid "section [%2d] '%s': sh_link does not link to string table\n"
+msgstr ""
+
+#: src/elflint.c:2876 src/elflint.c:3034
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong version %d\n"
+msgstr ""
+
+#: src/elflint.c:2882 src/elflint.c:3040
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:2890
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid file reference\n"
+msgstr ""
+
+#: src/elflint.c:2898
+#, c-format
+msgid "section [%2d] '%s': entry %d references unknown dependency\n"
+msgstr ""
+
+#: src/elflint.c:2910
+#, c-format
+msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
+msgstr ""
+
+#: src/elflint.c:2917
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
+"reference\n"
+msgstr ""
+
+#: src/elflint.c:2924
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: %"
+"#x, expected %#x\n"
+msgstr ""
+
+#: src/elflint.c:2934
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
+"name '%s'\n"
+msgstr ""
+
+#: src/elflint.c:2945
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
+msgstr ""
+
+#: src/elflint.c:2961 src/elflint.c:3119
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
+msgstr ""
+
+#: src/elflint.c:2974
+#, c-format
+msgid "more than one version definition section present\n"
+msgstr ""
+
+#: src/elflint.c:3019
+#, c-format
+msgid "section [%2d] '%s': more than one BASE definition\n"
+msgstr ""
+
+#: src/elflint.c:3023
+#, c-format
+msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
+msgstr ""
+
+#: src/elflint.c:3029
+#, c-format
+msgid "section [%2d] '%s': entry %d has unknown flag\n"
+msgstr ""
+
+#: src/elflint.c:3053
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid name reference\n"
+msgstr ""
+
+#: src/elflint.c:3060
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
+msgstr ""
+
+#: src/elflint.c:3069
+#, c-format
+msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
+msgstr ""
+
+#: src/elflint.c:3088
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:3103
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:3125
+#, c-format
+msgid "section [%2d] '%s': no BASE definition\n"
+msgstr ""
+
+#: src/elflint.c:3141
+#, c-format
+msgid "section [%2d] '%s': unknown parent version '%s'\n"
+msgstr ""
+
+#: src/elflint.c:3154
+#, c-format
+msgid "section [%2d] '%s': empty object attributes section\n"
+msgstr ""
+
+#: src/elflint.c:3175
+#, c-format
+msgid "section [%2d] '%s': unrecognized attribute format\n"
+msgstr ""
+
+#: src/elflint.c:3191
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: zero length field in attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3200
+#, c-format
+msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3212
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
+msgstr ""
+
+#: src/elflint.c:3229
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
+msgstr ""
+
+#: src/elflint.c:3238
+#, c-format
+msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3247
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
+msgstr ""
+
+#: src/elflint.c:3260
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
+msgstr ""
+
+#: src/elflint.c:3271
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
+msgstr ""
+
+#: src/elflint.c:3289
+#, c-format
+msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
+msgstr ""
+
+#: src/elflint.c:3300
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
+msgstr ""
+
+#: src/elflint.c:3313
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
+msgstr ""
+
+#: src/elflint.c:3317
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:3327
+#, c-format
+msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
+msgstr ""
+
+#: src/elflint.c:3333
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3422
+#, c-format
+msgid "cannot get section header of zeroth section\n"
+msgstr ""
+
+#: src/elflint.c:3426
+#, c-format
+msgid "zeroth section has nonzero name\n"
+msgstr ""
+
+#: src/elflint.c:3428
+#, c-format
+msgid "zeroth section has nonzero type\n"
+msgstr ""
+
+#: src/elflint.c:3430
+#, c-format
+msgid "zeroth section has nonzero flags\n"
+msgstr ""
+
+#: src/elflint.c:3432
+#, c-format
+msgid "zeroth section has nonzero address\n"
+msgstr ""
+
+#: src/elflint.c:3434
+#, c-format
+msgid "zeroth section has nonzero offset\n"
+msgstr ""
+
+#: src/elflint.c:3436
+#, c-format
+msgid "zeroth section has nonzero align value\n"
+msgstr ""
+
+#: src/elflint.c:3438
+#, c-format
+msgid "zeroth section has nonzero entry size value\n"
+msgstr ""
+
+#: src/elflint.c:3441
+#, c-format
+msgid ""
+"zeroth section has nonzero size value while ELF header has nonzero shnum "
+"value\n"
+msgstr ""
+
+#: src/elflint.c:3445
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in shstrndx\n"
+msgstr ""
+
+#: src/elflint.c:3449
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in phnum\n"
+msgstr ""
+
+#: src/elflint.c:3466
+#, c-format
+msgid "cannot get section header for section [%2zu] '%s': %s\n"
+msgstr ""
+
+#: src/elflint.c:3475
+#, c-format
+msgid "section [%2zu]: invalid name\n"
+msgstr ""
+
+#: src/elflint.c:3502
+#, c-format
+msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3518
+#, c-format
+msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3535
+#, c-format
+msgid ""
+"section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3553
+#, c-format
+msgid "section [%2zu] '%s' present in object file\n"
+msgstr ""
+
+#: src/elflint.c:3559 src/elflint.c:3591
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
+msgstr ""
+
+#: src/elflint.c:3564 src/elflint.c:3596
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
+"segments\n"
+msgstr ""
+
+#: src/elflint.c:3572
+#, c-format
+msgid ""
+"section [%2zu] '%s' is extension section index table in non-object file\n"
+msgstr ""
+
+#: src/elflint.c:3615
+#, c-format
+msgid "section [%2zu] '%s': size not multiple of entry size\n"
+msgstr ""
+
+#: src/elflint.c:3620
+#, c-format
+msgid "cannot get section header\n"
+msgstr ""
+
+#: src/elflint.c:3630
+#, c-format
+msgid "section [%2zu] '%s' has unsupported type %d\n"
+msgstr ""
+
+#: src/elflint.c:3644
+#, c-format
+msgid ""
+"section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:3651
+#, c-format
+msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:3659
+#, c-format
+msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
+msgstr ""
+
+#: src/elflint.c:3667
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in link value\n"
+msgstr ""
+
+#: src/elflint.c:3672
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in info value\n"
+msgstr ""
+
+#: src/elflint.c:3679
+#, c-format
+msgid "section [%2zu] '%s': strings flag set without merge flag\n"
+msgstr ""
+
+#: src/elflint.c:3684
+#, c-format
+msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
+msgstr ""
+
+#: src/elflint.c:3702
+#, c-format
+msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
+msgstr ""
+
+#: src/elflint.c:3711
+#, c-format
+msgid "section [%2zu] '%s' is both executable and writable\n"
+msgstr ""
+
+#: src/elflint.c:3738
+#, c-format
+msgid ""
+"section [%2zu] '%s' not fully contained in segment of program header entry %"
+"d\n"
+msgstr ""
+
+#: src/elflint.c:3746
+#, 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:3755
+#, 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:3766
+#, c-format
+msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
+msgstr ""
+
+#: src/elflint.c:3776
+#, c-format
+msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
+msgstr ""
+
+#: src/elflint.c:3786
+#, c-format
+msgid ""
+"section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:3792
+#, 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:3800
+#, c-format
+msgid ""
+"section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
+msgstr ""
+
+#: src/elflint.c:3851
+#, c-format
+msgid "more than one version symbol table present\n"
+msgstr ""
+
+#: src/elflint.c:3874
+#, c-format
+msgid "INTERP program header entry but no .interp section\n"
+msgstr ""
+
+#: src/elflint.c:3885
+#, c-format
+msgid ""
+"loadable segment [%u] is executable but contains no executable sections\n"
+msgstr ""
+
+#: src/elflint.c:3891
+#, c-format
+msgid "loadable segment [%u] is writable but contains no writable sections\n"
+msgstr ""
+
+#: src/elflint.c:3902
+#, c-format
+msgid ""
+"no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
+"exist\n"
+msgstr ""
+
+#: src/elflint.c:3915
+#, c-format
+msgid "duplicate version index %d\n"
+msgstr ""
+
+#: src/elflint.c:3929
+#, c-format
+msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
+msgstr ""
+
+#: src/elflint.c:3978
+#, c-format
+msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:3982
+#, c-format
+msgid ""
+"section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4005
+#, c-format
+msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4009
+#, c-format
+msgid ""
+"section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4026
+#, c-format
+msgid "phdr[%d]: no note entries defined for the type of file\n"
+msgstr ""
+
+#: src/elflint.c:4045
+#, c-format
+msgid "phdr[%d]: cannot get content of note section: %s\n"
+msgstr ""
+
+#: src/elflint.c:4048
+#, c-format
+msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
+msgstr ""
+
+#: src/elflint.c:4069
+#, c-format
+msgid "section [%2d] '%s': no note entries defined for the type of file\n"
+msgstr ""
+
+#: src/elflint.c:4076
+#, c-format
+msgid "section [%2d] '%s': cannot get content of note section\n"
+msgstr ""
+
+#: src/elflint.c:4079
+#, c-format
+msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
+msgstr ""
+
+#: src/elflint.c:4097
+#, c-format
+msgid ""
+"only executables, shared objects, and core files can have program headers\n"
+msgstr ""
+
+#: src/elflint.c:4112
+#, c-format
+msgid "cannot get program header entry %d: %s\n"
+msgstr ""
+
+#: src/elflint.c:4121
+#, c-format
+msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:4132
+#, c-format
+msgid "more than one INTERP entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4140
+#, c-format
+msgid "more than one TLS entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4147
+#, c-format
+msgid "static executable cannot have dynamic sections\n"
+msgstr ""
+
+#: src/elflint.c:4161
+#, c-format
+msgid "dynamic section reference in program header has wrong offset\n"
+msgstr ""
+
+#: src/elflint.c:4164
+#, c-format
+msgid "dynamic section size mismatch in program and section header\n"
+msgstr ""
+
+#: src/elflint.c:4174
+#, c-format
+msgid "more than one GNU_RELRO entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4195
+#, c-format
+msgid "loadable segment GNU_RELRO applies to is not writable\n"
+msgstr ""
+
+#: src/elflint.c:4198
+#, c-format
+msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
+msgstr ""
+
+#: src/elflint.c:4206 src/elflint.c:4229
+#, c-format
+msgid "%s segment not contained in a loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:4235
+#, c-format
+msgid "program header offset in ELF header and PHDR entry do not match"
+msgstr ""
+
+#: src/elflint.c:4259
+#, c-format
+msgid "call frame search table reference in program header has wrong offset\n"
+msgstr ""
+
+#: src/elflint.c:4262
+#, c-format
+msgid "call frame search table size mismatch in program and section header\n"
+msgstr ""
+
+#: src/elflint.c:4275
+#, c-format
+msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
+msgstr ""
+
+#: src/elflint.c:4283
+#, c-format
+msgid "call frame search table must be allocated\n"
+msgstr ""
+
+#: src/elflint.c:4286
+#, c-format
+msgid "section [%2zu] '%s' must be allocated\n"
+msgstr ""
+
+#: src/elflint.c:4290
+#, c-format
+msgid "call frame search table must not be writable\n"
+msgstr ""
+
+#: src/elflint.c:4293
+#, c-format
+msgid "section [%2zu] '%s' must not be writable\n"
+msgstr ""
+
+#: src/elflint.c:4298
+#, c-format
+msgid "call frame search table must not be executable\n"
+msgstr ""
+
+#: src/elflint.c:4301
+#, c-format
+msgid "section [%2zu] '%s' must not be executable\n"
+msgstr ""
+
+#: src/elflint.c:4312
+#, c-format
+msgid "program header entry %d: file size greater than memory size\n"
+msgstr ""
+
+#: src/elflint.c:4319
+#, c-format
+msgid "program header entry %d: alignment not a power of 2\n"
+msgstr ""
+
+#: src/elflint.c:4322
+#, c-format
+msgid ""
+"program header entry %d: file offset and virtual address not module of "
+"alignment\n"
+msgstr ""
+
+#: src/elflint.c:4335
+#, 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:4369
+#, c-format
+msgid "cannot read ELF header: %s\n"
+msgstr ""
+
+#: src/elflint.c:4395
+#, c-format
+msgid "text relocation flag set but not needed\n"
+msgstr ""
+
+#: src/findtextrel.c:70
+msgid "Input Selection:"
+msgstr ""
+
+#: src/findtextrel.c:71
+msgid "Prepend PATH to all file names"
+msgstr ""
+
+#: src/findtextrel.c:73
+msgid "Use PATH as root of debuginfo hierarchy"
+msgstr ""
+
+#: src/findtextrel.c:80
+msgid "Locate source of text relocations in FILEs (a.out by default)."
+msgstr ""
+
+#: src/findtextrel.c:84 src/nm.c:111 src/objdump.c:80 src/size.c:92
+#: src/strings.c:92 src/strip.c:97
+msgid "[FILE...]"
+msgstr ""
+
+#: src/findtextrel.c:246
+#, c-format
+msgid "cannot get ELF header '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:257
+#, c-format
+msgid "'%s' is not a DSO or PIE"
+msgstr ""
+
+#: src/findtextrel.c:274
+#, c-format
+msgid "getting get section header of section %zu: %s"
+msgstr ""
+
+#: src/findtextrel.c:292
+#, c-format
+msgid "cannot read dynamic section: %s"
+msgstr ""
+
+#: src/findtextrel.c:307
+#, c-format
+msgid "no text relocations reported in '%s'"
+msgstr ""
+
+#: src/findtextrel.c:319
+#, c-format
+msgid "while reading ELF file"
+msgstr ""
+
+#: src/findtextrel.c:328 src/findtextrel.c:345
+#, c-format
+msgid "cannot get program header index at offset %d: %s"
+msgstr ""
+
+#: src/findtextrel.c:397
+#, c-format
+msgid "cannot get section header of section %Zu: %s"
+msgstr ""
+
+#: src/findtextrel.c:409
+#, c-format
+msgid "cannot get symbol table section %zu in '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:429 src/findtextrel.c:452
+#, c-format
+msgid "cannot get relocation at index %d in section %zu in '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:517
+#, c-format
+msgid "%s not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:570
+#, c-format
+msgid ""
+"the file containing the function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:577 src/findtextrel.c:597
+#, c-format
+msgid ""
+"the file containing the function '%s' might not be compiled with -fpic/-"
+"fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:585
+#, c-format
+msgid ""
+"either the file containing the function '%s' or the file containing the "
+"function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:605
+#, c-format
+msgid ""
+"a relocation modifies memory at offset %llu in a write-protected segment\n"
+msgstr ""
+
+#: src/i386_ld.c:210
+#, c-format
+msgid "cannot allocate PLT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:232
+#, c-format
+msgid "cannot allocate PLTREL section: %s"
+msgstr ""
+
+#: src/i386_ld.c:253
+#, c-format
+msgid "cannot allocate GOT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:274
+#, c-format
+msgid "cannot allocate GOTPLT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:661
+#, c-format
+msgid "initial-executable TLS relocation cannot be used "
+msgstr ""
+
+#: src/ld.c:87
+msgid "Input File Control:"
+msgstr ""
+
+#: src/ld.c:89
+msgid "Include whole archives in the output from now on."
+msgstr ""
+
+#: src/ld.c:91
+msgid "Stop including the whole archives in the output."
+msgstr ""
+
+#: src/ld.c:92 src/ld.c:106 src/ld.c:184
+msgid "FILE"
+msgstr ""
+
+#: src/ld.c:93
+msgid "Start a group."
+msgstr ""
+
+#: src/ld.c:94
+msgid "End a group."
+msgstr ""
+
+#: src/ld.c:95
+msgid "PATH"
+msgstr ""
+
+#: src/ld.c:96
+msgid "Add PATH to list of directories files are searched in."
+msgstr ""
+
+#: src/ld.c:98
+msgid "Only set DT_NEEDED for following dynamic libs if actually used"
+msgstr ""
+
+#: src/ld.c:100
+msgid "Always set DT_NEEDED for following dynamic libs"
+msgstr ""
+
+#: src/ld.c:102
+msgid "Ignore LD_LIBRARY_PATH environment variable."
+msgstr ""
+
+#: src/ld.c:105
+msgid "Output File Control:"
+msgstr ""
+
+#: src/ld.c:106
+msgid "Place output in FILE."
+msgstr ""
+
+#: src/ld.c:109
+msgid "Object is marked to not use default search path at runtime."
+msgstr ""
+
+#: src/ld.c:111
+msgid "Same as --whole-archive."
+msgstr ""
+
+#: src/ld.c:112
+msgid ""
+"Default rules of extracting from archive; weak references are not enough."
+msgstr ""
+
+#: src/ld.c:116
+msgid "Weak references cause extraction from archive."
+msgstr ""
+
+#: src/ld.c:118
+msgid "Allow multiple definitions; first is used."
+msgstr ""
+
+#: src/ld.c:120
+msgid "Disallow/allow undefined symbols in DSOs."
+msgstr ""
+
+#: src/ld.c:123
+msgid "Object requires immediate handling of $ORIGIN."
+msgstr ""
+
+#: src/ld.c:125
+msgid "Relocation will not be processed lazily."
+msgstr ""
+
+#: src/ld.c:127
+msgid "Object cannot be unloaded at runtime."
+msgstr ""
+
+#: src/ld.c:129
+msgid "Mark object to be initialized first."
+msgstr ""
+
+#: src/ld.c:131
+msgid "Enable/disable lazy-loading flag for following dependencies."
+msgstr ""
+
+#: src/ld.c:133
+msgid "Mark object as not loadable with 'dlopen'."
+msgstr ""
+
+#: src/ld.c:135
+msgid "Ignore/record dependencies on unused DSOs."
+msgstr ""
+
+#: src/ld.c:137
+msgid "Generated DSO will be a system library."
+msgstr ""
+
+#: src/ld.c:138
+msgid "ADDRESS"
+msgstr ""
+
+#: src/ld.c:138
+msgid "Set entry point address."
+msgstr ""
+
+#: src/ld.c:141
+msgid "Do not link against shared libraries."
+msgstr ""
+
+#: src/ld.c:144
+msgid "Prefer linking against shared libraries."
+msgstr ""
+
+#: src/ld.c:145
+msgid "Export all dynamic symbols."
+msgstr ""
+
+#: src/ld.c:146
+msgid "Strip all symbols."
+msgstr ""
+
+#: src/ld.c:147
+msgid "Strip debugging symbols."
+msgstr ""
+
+#: src/ld.c:149
+msgid "Assume pagesize for the target system to be SIZE."
+msgstr ""
+
+#: src/ld.c:151
+msgid "Set runtime DSO search path."
+msgstr ""
+
+#: src/ld.c:154
+msgid "Set link time DSO search path."
+msgstr ""
+
+#: src/ld.c:155
+msgid "Generate dynamic shared object."
+msgstr ""
+
+#: src/ld.c:156
+msgid "Generate relocatable object."
+msgstr ""
+
+#: src/ld.c:159
+msgid "Causes symbol not assigned to a version be reduced to local."
+msgstr ""
+
+#: src/ld.c:160
+msgid "Remove unused sections."
+msgstr ""
+
+#: src/ld.c:163
+msgid "Don't remove unused sections."
+msgstr ""
+
+#: src/ld.c:164
+msgid "Set soname of shared object."
+msgstr ""
+
+#: src/ld.c:165
+msgid "Set the dynamic linker name."
+msgstr ""
+
+#: src/ld.c:168
+msgid "Add/suppress addition indentifying link-editor to .comment section."
+msgstr ""
+
+#: src/ld.c:171
+msgid "Create .eh_frame_hdr section"
+msgstr ""
+
+#: src/ld.c:173
+msgid "Set hash style to sysv, gnu or both."
+msgstr ""
+
+#: src/ld.c:175
+msgid "Generate build ID note (md5, sha1 (default), uuid)."
+msgstr ""
+
+#: src/ld.c:177
+msgid "Linker Operation Control:"
+msgstr ""
+
+#: src/ld.c:178
+msgid "Verbose messages."
+msgstr ""
+
+#: src/ld.c:179
+msgid "Trace file opens."
+msgstr ""
+
+#: src/ld.c:181
+msgid "Trade speed for less memory usage"
+msgstr ""
+
+#: src/ld.c:182
+msgid "LEVEL"
+msgstr ""
+
+#: src/ld.c:183
+msgid "Set optimization level to LEVEL."
+msgstr ""
+
+#: src/ld.c:184
+msgid "Use linker script in FILE."
+msgstr ""
+
+#: src/ld.c:187
+msgid "Select to get parser debug information"
+msgstr ""
+
+#: src/ld.c:190
+msgid "Read version information from FILE."
+msgstr ""
+
+#: src/ld.c:191
+msgid "Set emulation to NAME."
+msgstr ""
+
+#: src/ld.c:197
+msgid "Combine object and archive files."
+msgstr ""
+
+#: src/ld.c:200
+msgid "[FILE]..."
+msgstr ""
+
+#: src/ld.c:333
+#, c-format
+msgid "At least one input file needed"
+msgstr ""
+
+#: src/ld.c:349
+#, c-format
+msgid "error while preparing linking"
+msgstr ""
+
+#: src/ld.c:356
+#, c-format
+msgid "cannot open linker script '%s'"
+msgstr ""
+
+#: src/ld.c:397
+#, c-format
+msgid "-( without matching -)"
+msgstr ""
+
+#: src/ld.c:572 src/ld.c:610
+#, c-format
+msgid "only one option of -G and -r is allowed"
+msgstr ""
+
+#: src/ld.c:594
+#, c-format
+msgid "more than one '-m' parameter"
+msgstr ""
+
+#: src/ld.c:604 src/ld.c:1013
+#, c-format
+msgid "unknown option `-%c %s'"
+msgstr ""
+
+#: src/ld.c:646
+#, c-format
+msgid "invalid page size value '%s': ignored"
+msgstr ""
+
+#: src/ld.c:687
+#, c-format
+msgid "invalid hash style '%s'"
+msgstr ""
+
+#: src/ld.c:697
+#, c-format
+msgid "invalid build-ID style '%s'"
+msgstr ""
+
+#: src/ld.c:785
+#, c-format
+msgid "More than one output file name given."
+msgstr ""
+
+#: src/ld.c:802
+#, c-format
+msgid "Invalid optimization level `%s'"
+msgstr ""
+
+#: src/ld.c:850
+#, c-format
+msgid "nested -( -) groups are not allowed"
+msgstr ""
+
+#: src/ld.c:869
+#, c-format
+msgid "-) without matching -("
+msgstr ""
+
+#: src/ld.c:1046
+#, c-format
+msgid "unknown option '-%c %s'"
+msgstr ""
+
+#: src/ld.c:1150
+#, c-format
+msgid "could not find input file to determine output file format"
+msgstr ""
+
+#: src/ld.c:1152
+#, c-format
+msgid "try again with an appropriate '-m' parameter"
+msgstr ""
+
+#: src/ld.c:1446
+#, c-format
+msgid "cannot read version script '%s'"
+msgstr ""
+
+#: src/ld.c:1512 src/ld.c:1551
+#, c-format
+msgid "duplicate definition of '%s' in linker script"
+msgstr ""
+
+#: src/ldgeneric.c:209 src/ldgeneric.c:5151
+#, c-format
+msgid "cannot create string table"
+msgstr ""
+
+#: src/ldgeneric.c:255
+#, c-format
+msgid "cannot load ld backend library '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:265
+#, c-format
+msgid "cannot find init function in ld backend library '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:310
+#, c-format
+msgid "%s listed more than once as input"
+msgstr ""
+
+#: src/ldgeneric.c:424
+#, c-format
+msgid "%s (for -l%s)\n"
+msgstr ""
+
+#: src/ldgeneric.c:425
+#, c-format
+msgid "%s (for DT_NEEDED %s)\n"
+msgstr ""
+
+#: src/ldgeneric.c:573
+#, c-format
+msgid "Warning: type of `%s' changed from %s in %s to %s in %s"
+msgstr ""
+
+#: src/ldgeneric.c:586
+#, c-format
+msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
+msgstr ""
+
+#: src/ldgeneric.c:661 src/ldgeneric.c:1122 src/readelf.c:629 src/strip.c:543
+#, c-format
+msgid "cannot determine number of sections: %s"
+msgstr ""
+
+#: src/ldgeneric.c:677
+#, c-format
+msgid "(%s+%#<PRIx64>): multiple definition of %s `%s'\n"
+msgstr ""
+
+#: src/ldgeneric.c:700
+#, c-format
+msgid "(%s+%#<PRIx64>): first defined here\n"
+msgstr ""
+
+#: src/ldgeneric.c:819
+#, c-format
+msgid "%s: cannot get section group data: %s"
+msgstr ""
+
+#: src/ldgeneric.c:840
+#, c-format
+msgid "%s: section '%s' with group flag set does not belong to any group"
+msgstr ""
+
+#: src/ldgeneric.c:885
+#, c-format
+msgid "%s: section [%2d] '%s' is not in the correct section group"
+msgstr ""
+
+#: src/ldgeneric.c:1156 src/ldgeneric.c:1413 src/ldgeneric.c:1422
+#: src/ldgeneric.c:1481 src/ldgeneric.c:1490 src/ldgeneric.c:1753
+#: src/ldgeneric.c:2005
+#, c-format
+msgid "%s: invalid ELF file (%s:%d)\n"
+msgstr ""
+
+#: src/ldgeneric.c:1250
+#, c-format
+msgid "%s: only files of type ET_REL might contain section groups"
+msgstr ""
+
+#: src/ldgeneric.c:1302
+#, c-format
+msgid "%s: cannot determine signature of section group [%2zd] '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:1314
+#, c-format
+msgid "%s: cannot get content of section group [%2zd] '%s': %s'"
+msgstr ""
+
+#: src/ldgeneric.c:1328
+#, c-format
+msgid ""
+"%s: group member %zu of section group [%2zd] '%s' has too high index: %"
+"<PRIu32>"
+msgstr ""
+
+#: src/ldgeneric.c:1350
+#, c-format
+msgid "%s: section '%s' has unknown type: %d"
+msgstr ""
+
+#: src/ldgeneric.c:1729
+#, c-format
+msgid "cannot get descriptor for ELF file (%s:%d): %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:1899
+#, c-format
+msgid "cannot read archive `%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:2020
+#, c-format
+msgid "file of type %s cannot be linked in\n"
+msgstr ""
+
+#: src/ldgeneric.c:2032
+#, c-format
+msgid "%s: input file incompatible with ELF machine type %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:2044
+#, c-format
+msgid "%s: cannot get section header string table index: %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:2073
+#, c-format
+msgid "cannot use DSO '%s' when generating relocatable object file"
+msgstr ""
+
+#: src/ldgeneric.c:2158
+#, c-format
+msgid "input file '%s' ignored"
+msgstr ""
+
+#: src/ldgeneric.c:2372
+#, c-format
+msgid "undefined symbol `%s' in %s"
+msgstr ""
+
+#: src/ldgeneric.c:2702
+#, c-format
+msgid "cannot create ELF descriptor for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:2709
+#, c-format
+msgid "could not create ELF header for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:3224 src/ldgeneric.c:3294 src/ldgeneric.c:3330
+#: src/ldgeneric.c:4457 src/ldgeneric.c:4506 src/ldgeneric.c:4538
+#: src/ldgeneric.c:4773 src/ldgeneric.c:4828 src/ldgeneric.c:5075
+#: src/ldgeneric.c:5131 src/ldgeneric.c:5600 src/ldgeneric.c:5612
+#, c-format
+msgid "cannot create section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:3444
+#, c-format
+msgid "address computation expression contains variable '%s'"
+msgstr ""
+
+#: src/ldgeneric.c:3489
+#, c-format
+msgid ""
+"argument '%<PRIuMAX>' of ALIGN in address computation expression is no power "
+"of two"
+msgstr ""
+
+#: src/ldgeneric.c:3684
+#, c-format
+msgid "cannot find entry symbol '%s': defaulting to %#0*<PRIx64>"
+msgstr ""
+
+#: src/ldgeneric.c:3690
+#, c-format
+msgid "no entry symbol specified: defaulting to %#0*<PRIx64>"
+msgstr ""
+
+#: src/ldgeneric.c:3920
+#, c-format
+msgid "cannot create GNU hash table section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4071
+#, c-format
+msgid "cannot create hash table section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4114
+#, c-format
+msgid "cannot create build ID section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4191
+#, c-format
+msgid "cannot convert section data to file format: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4200
+#, c-format
+msgid "cannot convert section data to memory format: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4261
+#, c-format
+msgid "cannot read enough data for UUID"
+msgstr ""
+
+#: src/ldgeneric.c:4358 src/ldgeneric.c:4379 src/ldgeneric.c:4408
+#: src/ldgeneric.c:6062
+#, c-format
+msgid "cannot create symbol table for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5300 src/ldgeneric.c:5852
+#, c-format
+msgid "section index too large in dynamic symbol table"
+msgstr ""
+
+#: src/ldgeneric.c:5745
+#, c-format
+msgid "cannot create versioning section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5818
+#, c-format
+msgid "cannot create dynamic symbol table for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5994
+#, c-format
+msgid "cannot create versioning data: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6094 src/ldgeneric.c:6107 src/ldgeneric.c:6171
+#: src/ldgeneric.c:6179
+#, c-format
+msgid "cannot create section header string section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6101
+#, c-format
+msgid "cannot create section header string section"
+msgstr ""
+
+#: src/ldgeneric.c:6259
+#, c-format
+msgid "cannot create program header: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6267
+#, c-format
+msgid "while determining file layout: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6388
+#, c-format
+msgid "internal error: non-nobits section follows nobits section"
+msgstr ""
+
+#: src/ldgeneric.c:6925
+#, c-format
+msgid "cannot get header of 0th section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6941 src/unstrip.c:1808
+#, c-format
+msgid "cannot update ELF header: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6972
+#, c-format
+msgid "linker backend didn't specify function to relocate section"
+msgstr ""
+
+#: src/ldgeneric.c:6984
+#, c-format
+msgid "while writing output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6989
+#, c-format
+msgid "while finishing output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6995
+#, c-format
+msgid "cannot stat output file"
+msgstr ""
+
+#: src/ldgeneric.c:7011
+#, c-format
+msgid "WARNING: temporary output file overwritten before linking finished"
+msgstr ""
+
+#: src/ldgeneric.c:7064 src/ldgeneric.c:7075 src/ldgeneric.c:7086
+#: src/ldgeneric.c:7097 src/ldgeneric.c:7116 src/ldgeneric.c:7129
+#: src/ldgeneric.c:7141
+#, c-format
+msgid "no machine specific '%s' implementation"
+msgstr ""
+
+#: src/ldscript.y:178
+msgid "mode for segment invalid\n"
+msgstr ""
+
+#: src/ldscript.y:465
+#, c-format
+msgid "while reading version script '%s': %s at line %d"
+msgstr ""
+
+#: src/ldscript.y:466
+#, c-format
+msgid "while reading linker script '%s': %s at line %d"
+msgstr ""
+
+#: src/ldscript.y:745
+#, c-format
+msgid "symbol '%s' is declared both local and global for unnamed version"
+msgstr ""
+
+#: src/ldscript.y:747
+#, c-format
+msgid "symbol '%s' is declared both local and global for version '%s'"
+msgstr ""
+
+#: src/ldscript.y:767 src/ldscript.y:774
+#, c-format
+msgid "default visibility set as local and global"
+msgstr ""
+
+#: src/nm.c:74 src/strip.c:73
+msgid "Output selection:"
+msgstr ""
+
+#: src/nm.c:75
+msgid "Display debugger-only symbols"
+msgstr ""
+
+#: src/nm.c:76
+msgid "Display only defined symbols"
+msgstr ""
+
+#: src/nm.c:79
+msgid "Display dynamic symbols instead of normal symbols"
+msgstr ""
+
+#: src/nm.c:80
+msgid "Display only external symbols"
+msgstr ""
+
+#: src/nm.c:81
+msgid "Display only undefined symbols"
+msgstr ""
+
+#: src/nm.c:83
+msgid "Include index for symbols from archive members"
+msgstr ""
+
+#: src/nm.c:85 src/size.c:66
+msgid "Output format:"
+msgstr ""
+
+#: src/nm.c:87
+msgid "Print name of the input file before every symbol"
+msgstr ""
+
+#: src/nm.c:90
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd', `sysv' or `posix'. The "
+"default is `sysv'"
+msgstr ""
+
+#: src/nm.c:92
+msgid "Same as --format=bsd"
+msgstr ""
+
+#: src/nm.c:93
+msgid "Same as --format=posix"
+msgstr ""
+
+#: src/nm.c:94 src/size.c:72
+msgid "Use RADIX for printing symbol values"
+msgstr ""
+
+#: src/nm.c:95
+msgid "Mark weak symbols"
+msgstr ""
+
+#: src/nm.c:96
+msgid "Print size of defined symbols"
+msgstr ""
+
+#: src/nm.c:98 src/size.c:80 src/strip.c:78 src/unstrip.c:81
+msgid "Output options:"
+msgstr ""
+
+#: src/nm.c:99
+msgid "Sort symbols numerically by address"
+msgstr ""
+
+#: src/nm.c:101
+msgid "Do not sort the symbols"
+msgstr ""
+
+#: src/nm.c:102
+msgid "Reverse the sense of the sort"
+msgstr ""
+
+#: src/nm.c:108
+msgid "List symbols from FILEs (a.out by default)."
+msgstr ""
+
+#: src/nm.c:136 src/objdump.c:105 src/size.c:117 src/strip.c:121
+#, c-format
+msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
+msgstr ""
+
+#: src/nm.c:380 src/nm.c:392 src/size.c:317 src/size.c:326 src/size.c:337
+#: src/strip.c:1816
+#, c-format
+msgid "while closing '%s'"
+msgstr ""
+
+#: src/nm.c:402 src/objdump.c:296 src/strip.c:359
+#, c-format
+msgid "%s: File format not recognized"
+msgstr ""
+
+#: src/nm.c:442
+msgid ""
+"\n"
+"Archive index:"
+msgstr ""
+
+#: src/nm.c:451
+#, c-format
+msgid "invalid offset %zu for symbol %s"
+msgstr ""
+
+#: src/nm.c:456
+#, c-format
+msgid "%s in %s\n"
+msgstr ""
+
+#: src/nm.c:464
+#, c-format
+msgid "cannot reset archive offset to beginning"
+msgstr ""
+
+#: src/nm.c:488 src/objdump.c:344
+#, c-format
+msgid "%s%s%s: file format not recognized"
+msgstr ""
+
+#: src/nm.c:700
+#, c-format
+msgid "cannot create search tree"
+msgstr ""
+
+#: src/nm.c:740 src/nm.c:1002 src/objdump.c:744 src/readelf.c:885
+#: src/readelf.c:1028 src/readelf.c:1169 src/readelf.c:1351 src/readelf.c:1549
+#: src/readelf.c:1735 src/readelf.c:1945 src/readelf.c:2199 src/readelf.c:2265
+#: src/readelf.c:2343 src/readelf.c:2841 src/readelf.c:2877 src/readelf.c:2939
+#: src/readelf.c:6493 src/readelf.c:7387 src/readelf.c:7534 src/readelf.c:7604
+#: src/size.c:425 src/size.c:499 src/strip.c:483
+#, c-format
+msgid "cannot get section header string table index"
+msgstr ""
+
+#: src/nm.c:766
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s:\n"
+"\n"
+msgstr ""
+
+#: src/nm.c:768
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s[%s]:\n"
+"\n"
+msgstr ""
+
+#: src/nm.c:771
+#, c-format
+msgid ""
+"%*s%-*s %-*s Class Type %-*s %*s Section\n"
+"\n"
+msgstr ""
+
+#: src/nm.c:1012
+#, c-format
+msgid "%s: entry size in section `%s' is not what we expect"
+msgstr ""
+
+#: src/nm.c:1016
+#, c-format
+msgid "%s: size of section `%s' is not multiple of entry size"
+msgstr ""
+
+#: src/nm.c:1255
+#, c-format
+msgid "%s%s%s%s: Invalid operation"
+msgstr ""
+
+#: src/nm.c:1312
+#, c-format
+msgid "%s%s%s: no symbols"
+msgstr ""
+
+#: src/objdump.c:61
+msgid "Mode selection:"
+msgstr ""
+
+#: src/objdump.c:62
+msgid "Display relocation information."
+msgstr ""
+
+#: src/objdump.c:64
+msgid "Display the full contents of all sections requested"
+msgstr ""
+
+#: src/objdump.c:66
+msgid "Display assembler code of executable sections"
+msgstr ""
+
+#: src/objdump.c:68
+msgid "Output option selection:"
+msgstr ""
+
+#: src/objdump.c:70
+msgid "Only display information for section NAME."
+msgstr ""
+
+#: src/objdump.c:76
+msgid "Show information from FILEs (a.out by default)."
+msgstr ""
+
+#: src/objdump.c:236 src/readelf.c:430
+msgid "No operation specified.\n"
+msgstr ""
+
+#: src/objdump.c:274 src/objdump.c:286
+#, c-format
+msgid "while close `%s'"
+msgstr ""
+
+#: src/objdump.c:379 src/readelf.c:1644 src/readelf.c:1818
+msgid "INVALID SYMBOL"
+msgstr ""
+
+#: src/objdump.c:394 src/readelf.c:1675 src/readelf.c:1851
+msgid "INVALID SECTION"
+msgstr ""
+
+#: src/objdump.c:510
+#, c-format
+msgid ""
+"\n"
+"RELOCATION RECORDS FOR [%s]:\n"
+"%-*s TYPE VALUE\n"
+msgstr ""
+
+#: src/objdump.c:513
+msgid "OFFSET"
+msgstr ""
+
+#: src/objdump.c:576
+#, c-format
+msgid "Contents of section %s:\n"
+msgstr ""
+
+#: src/objdump.c:676
+#, c-format
+msgid "cannot disassemble"
+msgstr ""
+
+#: src/ranlib.c:74
+msgid "Generate an index to speed access to archives."
+msgstr ""
+
+#: src/ranlib.c:77
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/ranlib.c:116
+#, c-format
+msgid "Archive name required"
+msgstr ""
+
+#: src/ranlib.c:194
+#, c-format
+msgid "'%s' is no archive"
+msgstr ""
+
+#: src/ranlib.c:229
+#, c-format
+msgid "error while freeing sub-ELF descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:73
+msgid "ELF output selection:"
+msgstr ""
+
+#: src/readelf.c:75
+msgid "All these plus -p .strtab -p .dynstr -p .comment"
+msgstr ""
+
+#: src/readelf.c:76
+msgid "Display the dynamic segment"
+msgstr ""
+
+#: src/readelf.c:77
+msgid "Display the ELF file header"
+msgstr ""
+
+#: src/readelf.c:79
+msgid "Display histogram of bucket list lengths"
+msgstr ""
+
+#: src/readelf.c:80
+msgid "Display the program headers"
+msgstr ""
+
+#: src/readelf.c:82
+msgid "Display relocations"
+msgstr ""
+
+#: src/readelf.c:83
+msgid "Display the sections' headers"
+msgstr ""
+
+#: src/readelf.c:85
+msgid "Display the symbol table"
+msgstr ""
+
+#: src/readelf.c:86
+msgid "Display versioning information"
+msgstr ""
+
+#: src/readelf.c:87
+msgid "Display the ELF notes"
+msgstr ""
+
+#: src/readelf.c:89
+msgid "Display architecture specific information, if any"
+msgstr ""
+
+#: src/readelf.c:91
+msgid "Display sections for exception handling"
+msgstr ""
+
+#: src/readelf.c:93
+msgid "Additional output selection:"
+msgstr ""
+
+#: src/readelf.c:95
+msgid ""
+"Display DWARF section content. SECTION can be one of abbrev, aranges, "
+"frame, info, loc, line, ranges, pubnames, str, macinfo, or exception"
+msgstr ""
+
+#: src/readelf.c:99
+msgid "Dump the uninterpreted contents of SECTION, by number or name"
+msgstr ""
+
+#: src/readelf.c:101
+msgid "Print string contents of sections"
+msgstr ""
+
+#: src/readelf.c:104
+msgid "Display the symbol index of an archive"
+msgstr ""
+
+#: src/readelf.c:106
+msgid "Output control:"
+msgstr ""
+
+#: src/readelf.c:108
+msgid "Do not find symbol names for addresses in DWARF data"
+msgstr ""
+
+#: src/readelf.c:114
+msgid "Print information from ELF file in human-readable form."
+msgstr ""
+
+#: src/readelf.c:401
+#, c-format
+msgid "Unknown DWARF debug section `%s'.\n"
+msgstr ""
+
+#: src/readelf.c:465
+#, c-format
+msgid "cannot generate Elf descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:477
+#, c-format
+msgid "'%s' is not an archive, cannot print archive index"
+msgstr ""
+
+#: src/readelf.c:482
+#, c-format
+msgid "error while closing Elf descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:574
+#, c-format
+msgid "cannot stat input file"
+msgstr ""
+
+#: src/readelf.c:576
+#, c-format
+msgid "input file is empty"
+msgstr ""
+
+#: src/readelf.c:578
+#, c-format
+msgid "failed reading '%s': %s"
+msgstr ""
+
+#: src/readelf.c:614
+#, c-format
+msgid "cannot read ELF header: %s"
+msgstr ""
+
+#: src/readelf.c:622
+#, c-format
+msgid "cannot create EBL handle"
+msgstr ""
+
+#: src/readelf.c:635
+#, c-format
+msgid "cannot determine number of program headers: %s"
+msgstr ""
+
+#: src/readelf.c:721
+msgid "NONE (None)"
+msgstr ""
+
+#: src/readelf.c:722
+msgid "REL (Relocatable file)"
+msgstr ""
+
+#: src/readelf.c:723
+msgid "EXEC (Executable file)"
+msgstr ""
+
+#: src/readelf.c:724
+msgid "DYN (Shared object file)"
+msgstr ""
+
+#: src/readelf.c:725
+msgid "CORE (Core file)"
+msgstr ""
+
+#: src/readelf.c:730
+#, c-format
+msgid "OS Specific: (%x)\n"
+msgstr ""
+
+#: src/readelf.c:732
+#, c-format
+msgid "Processor Specific: (%x)\n"
+msgstr ""
+
+#: src/readelf.c:742
+msgid ""
+"ELF Header:\n"
+" Magic: "
+msgstr ""
+
+#: src/readelf.c:746
+#, c-format
+msgid ""
+"\n"
+" Class: %s\n"
+msgstr ""
+
+#: src/readelf.c:751
+#, c-format
+msgid " Data: %s\n"
+msgstr ""
+
+#: src/readelf.c:757
+#, c-format
+msgid " Ident Version: %hhd %s\n"
+msgstr ""
+
+#: src/readelf.c:759 src/readelf.c:776
+msgid "(current)"
+msgstr ""
+
+#: src/readelf.c:763
+#, c-format
+msgid " OS/ABI: %s\n"
+msgstr ""
+
+#: src/readelf.c:766
+#, c-format
+msgid " ABI Version: %hhd\n"
+msgstr ""
+
+#: src/readelf.c:769
+msgid " Type: "
+msgstr ""
+
+#: src/readelf.c:772
+#, c-format
+msgid " Machine: %s\n"
+msgstr ""
+
+#: src/readelf.c:774
+#, c-format
+msgid " Version: %d %s\n"
+msgstr ""
+
+#: src/readelf.c:778
+#, c-format
+msgid " Entry point address: %#<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:781
+#, c-format
+msgid " Start of program headers: %<PRId64> %s\n"
+msgstr ""
+
+#: src/readelf.c:782 src/readelf.c:785
+msgid "(bytes into file)"
+msgstr ""
+
+#: src/readelf.c:784
+#, c-format
+msgid " Start of section headers: %<PRId64> %s\n"
+msgstr ""
+
+#: src/readelf.c:787
+#, c-format
+msgid " Flags: %s\n"
+msgstr ""
+
+#: src/readelf.c:790
+#, c-format
+msgid " Size of this header: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:791 src/readelf.c:794 src/readelf.c:811
+msgid "(bytes)"
+msgstr ""
+
+#: src/readelf.c:793
+#, c-format
+msgid " Size of program header entries: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:796
+#, c-format
+msgid " Number of program headers entries: %<PRId16>"
+msgstr ""
+
+#: src/readelf.c:803
+#, c-format
+msgid " (%<PRIu32> in [0].sh_info)"
+msgstr ""
+
+#: src/readelf.c:806 src/readelf.c:823 src/readelf.c:837
+msgid " ([0] not available)"
+msgstr ""
+
+#: src/readelf.c:810
+#, c-format
+msgid " Size of section header entries: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:813
+#, c-format
+msgid " Number of section headers entries: %<PRId16>"
+msgstr ""
+
+#: src/readelf.c:820
+#, c-format
+msgid " (%<PRIu32> in [0].sh_size)"
+msgstr ""
+
+#: src/readelf.c:833
+#, c-format
+msgid " (%<PRIu32> in [0].sh_link)"
+msgstr ""
+
+#: src/readelf.c:841
+#, c-format
+msgid ""
+" Section header string table index: XINDEX%s\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:845
+#, c-format
+msgid ""
+" Section header string table index: %<PRId16>\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:877
+#, c-format
+msgid ""
+"There are %d section headers, starting at offset %#<PRIx64>:\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:887
+msgid "Section Headers:"
+msgstr ""
+
+#: src/readelf.c:890
+msgid ""
+"[Nr] Name Type Addr Off Size ES Flags Lk "
+"Inf Al"
+msgstr ""
+
+#: src/readelf.c:892
+msgid ""
+"[Nr] Name Type Addr Off Size ES "
+"Flags Lk Inf Al"
+msgstr ""
+
+#: src/readelf.c:899 src/readelf.c:1052
+#, c-format
+msgid "cannot get section: %s"
+msgstr ""
+
+#: src/readelf.c:906 src/readelf.c:1060 src/readelf.c:7554 src/unstrip.c:353
+#: src/unstrip.c:377 src/unstrip.c:427 src/unstrip.c:536 src/unstrip.c:553
+#: src/unstrip.c:591 src/unstrip.c:789 src/unstrip.c:1057 src/unstrip.c:1244
+#: src/unstrip.c:1305 src/unstrip.c:1427 src/unstrip.c:1480 src/unstrip.c:1588
+#: src/unstrip.c:1778
+#, c-format
+msgid "cannot get section header: %s"
+msgstr ""
+
+#: src/readelf.c:964
+msgid "Program Headers:"
+msgstr ""
+
+#: src/readelf.c:966
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align"
+msgstr ""
+
+#: src/readelf.c:969
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz "
+"MemSiz Flg Align"
+msgstr ""
+
+#: src/readelf.c:1009
+#, c-format
+msgid "\t[Requesting program interpreter: %s]\n"
+msgstr ""
+
+#: src/readelf.c:1030
+msgid ""
+"\n"
+" Section to Segment mapping:\n"
+" Segment Sections..."
+msgstr ""
+
+#: src/readelf.c:1041 src/unstrip.c:1824 src/unstrip.c:1863 src/unstrip.c:1870
+#, c-format
+msgid "cannot get program header: %s"
+msgstr ""
+
+#: src/readelf.c:1175
+#, c-format
+msgid ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1180
+#, c-format
+msgid ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1188
+msgid "<INVALID SYMBOL>"
+msgstr ""
+
+#: src/readelf.c:1202
+msgid "<INVALID SECTION>"
+msgstr ""
+
+#: src/readelf.c:1353
+#, c-format
+msgid ""
+"\n"
+"Dynamic segment contains %lu entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Dynamic segment contains %lu entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1365
+msgid " Type Value\n"
+msgstr ""
+
+#: src/readelf.c:1389
+#, c-format
+msgid "Shared library: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1394
+#, c-format
+msgid "Library soname: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1399
+#, c-format
+msgid "Library rpath: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1404
+#, c-format
+msgid "Library runpath: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1424
+#, c-format
+msgid "%<PRId64> (bytes)\n"
+msgstr ""
+
+#: src/readelf.c:1534 src/readelf.c:1720
+#, c-format
+msgid ""
+"\n"
+"Invalid symbol table at offset %#0<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:1552 src/readelf.c:1737
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1567
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1577
+msgid " Offset Type Value Name\n"
+msgstr ""
+
+#: src/readelf.c:1579
+msgid " Offset Type Value Name\n"
+msgstr ""
+
+#: src/readelf.c:1632 src/readelf.c:1643 src/readelf.c:1656 src/readelf.c:1674
+#: src/readelf.c:1686 src/readelf.c:1805 src/readelf.c:1817 src/readelf.c:1831
+#: src/readelf.c:1850 src/readelf.c:1863
+msgid "<INVALID RELOC>"
+msgstr ""
+
+#: src/readelf.c:1749
+msgid " Offset Type Value Addend Name\n"
+msgstr ""
+
+#: src/readelf.c:1751
+msgid " Offset Type Value Addend Name\n"
+msgstr ""
+
+#: src/readelf.c:1952
+#, c-format
+msgid ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entry:\n"
+msgid_plural ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1958
+#, 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:1968
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr ""
+
+#: src/readelf.c:1970
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr ""
+
+#: src/readelf.c:1990
+#, c-format
+msgid "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
+msgstr ""
+
+#: src/readelf.c:2078
+#, c-format
+msgid "bad dynamic symbol"
+msgstr ""
+
+#: src/readelf.c:2160
+msgid "none"
+msgstr ""
+
+#: src/readelf.c:2177
+msgid "| <unknown>"
+msgstr ""
+
+#: src/readelf.c:2202
+#, c-format
+msgid ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2225
+#, c-format
+msgid " %#06x: Version: %hu File: %s Cnt: %hu\n"
+msgstr ""
+
+#: src/readelf.c:2238
+#, c-format
+msgid " %#06x: Name: %s Flags: %s Version: %hu\n"
+msgstr ""
+
+#: src/readelf.c:2269
+#, c-format
+msgid ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2299
+#, c-format
+msgid " %#06x: Version: %hd Flags: %s Index: %hd Cnt: %hd Name: %s\n"
+msgstr ""
+
+#: src/readelf.c:2314
+#, c-format
+msgid " %#06x: Parent %d: %s\n"
+msgstr ""
+
+#: src/readelf.c:2546
+#, c-format
+msgid ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgid_plural ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2576
+msgid " 0 *local* "
+msgstr ""
+
+#: src/readelf.c:2581
+msgid " 1 *global* "
+msgstr ""
+
+#: src/readelf.c:2612
+#, c-format
+msgid ""
+"\n"
+"Histogram 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"
+msgid_plural ""
+"\n"
+"Histogram for bucket list length in section [%2u] '%s' (total of %d "
+"buckets):\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2636
+#, no-c-format
+msgid " Length Number % of total Coverage\n"
+msgstr ""
+
+#: src/readelf.c:2638
+#, c-format
+msgid " 0 %6<PRIu32> %5.1f%%\n"
+msgstr ""
+
+#: src/readelf.c:2645
+#, c-format
+msgid "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
+msgstr ""
+
+#: src/readelf.c:2658
+#, c-format
+msgid ""
+" Average number of tests: successful lookup: %f\n"
+" unsuccessful lookup: %f\n"
+msgstr ""
+
+#: src/readelf.c:2676 src/readelf.c:2718 src/readelf.c:2759
+#, c-format
+msgid "cannot get data for section %d: %s"
+msgstr ""
+
+#: src/readelf.c:2813
+#, c-format
+msgid ""
+" Symbol Bias: %u\n"
+" Bitmask Size: %zu bytes %<PRIuFAST32>%% bits set 2nd hash shift: %u\n"
+msgstr ""
+
+#: src/readelf.c:2887
+#, c-format
+msgid ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2901
+msgid ""
+" Library Time Stamp Checksum Version "
+"Flags"
+msgstr ""
+
+#: src/readelf.c:2951
+#, c-format
+msgid ""
+"\n"
+"Object attributes section [%2zu] '%s' of %<PRIu64> bytes at offset %"
+"#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:2967
+msgid " Owner Size\n"
+msgstr ""
+
+#: src/readelf.c:2993
+#, c-format
+msgid " %-13s %4<PRIu32>\n"
+msgstr ""
+
+#: src/readelf.c:3025
+#, c-format
+msgid " %-4u %12<PRIu32>\n"
+msgstr ""
+
+#: src/readelf.c:3030
+#, c-format
+msgid " File: %11<PRIu32>\n"
+msgstr ""
+
+#: src/readelf.c:3065
+#, c-format
+msgid " %s: %<PRId64>, %s\n"
+msgstr ""
+
+#: src/readelf.c:3068
+#, c-format
+msgid " %s: %<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:3071
+#, c-format
+msgid " %s: %s\n"
+msgstr ""
+
+#: src/readelf.c:3078
+#, c-format
+msgid " %u: %<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:3081
+#, c-format
+msgid " %u: %s\n"
+msgstr ""
+
+#: src/readelf.c:3117
+#, c-format
+msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3120
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3125
+#, c-format
+msgid "%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3128
+#, c-format
+msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3134
+#, c-format
+msgid "%s+%#<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3137
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3141
+#, c-format
+msgid "%#<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3144
+#, c-format
+msgid "%#0*<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3149
+#, c-format
+msgid "%s+%#<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3152
+#, c-format
+msgid "%s+%#0*<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3260
+#, c-format
+msgid "unknown tag %hx"
+msgstr ""
+
+#: src/readelf.c:3262
+#, c-format
+msgid "unknown user tag %hx"
+msgstr ""
+
+#: src/readelf.c:3480
+#, c-format
+msgid "unknown attribute %hx"
+msgstr ""
+
+#: src/readelf.c:3483
+#, c-format
+msgid "unknown user attribute %hx"
+msgstr ""
+
+#: src/readelf.c:3529
+#, c-format
+msgid "unknown form %<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3763
+msgid "empty block"
+msgstr ""
+
+#: src/readelf.c:3766
+#, c-format
+msgid "%zu byte block:"
+msgstr ""
+
+#: src/readelf.c:4175
+#, c-format
+msgid "%*s[%4<PRIuMAX>] %s <TRUNCATED>\n"
+msgstr ""
+
+#: src/readelf.c:4188
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [ Code]\n"
+msgstr ""
+
+#: src/readelf.c:4195
+#, c-format
+msgid ""
+"\n"
+"Abbreviation section at offset %<PRIu64>:\n"
+msgstr ""
+
+#: src/readelf.c:4208
+#, c-format
+msgid " *** error while reading abbreviation: %s\n"
+msgstr ""
+
+#: src/readelf.c:4224
+#, c-format
+msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
+msgstr ""
+
+#: src/readelf.c:4227
+msgid "yes"
+msgstr ""
+
+#: src/readelf.c:4227
+msgid "no"
+msgstr ""
+
+#: src/readelf.c:4263
+#, c-format
+msgid "cannot get .debug_aranges content: %s"
+msgstr ""
+
+#: src/readelf.c:4268
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:4298
+#, c-format
+msgid " [%*zu] ???\n"
+msgstr ""
+
+#: src/readelf.c:4300
+#, c-format
+msgid ""
+" [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:4319
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr ""
+
+#: src/readelf.c:4324 src/readelf.c:4810 src/readelf.c:5452 src/readelf.c:5897
+#: src/readelf.c:5992 src/readelf.c:6164
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:4338 src/readelf.c:5911
+#, c-format
+msgid " [%6tx] <INVALID DATA>\n"
+msgstr ""
+
+#: src/readelf.c:4360 src/readelf.c:5933
+#, c-format
+msgid " [%6tx] base address %s\n"
+msgstr ""
+
+#: src/readelf.c:4371
+#, c-format
+msgid " [%6tx] %s..%s\n"
+msgstr ""
+
+#: src/readelf.c:4373
+#, c-format
+msgid " %s..%s\n"
+msgstr ""
+
+#: src/readelf.c:4799 src/readelf.c:6230 src/readelf.c:6332
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr ""
+
+#: src/readelf.c:4806
+#, c-format
+msgid ""
+"\n"
+"Call frame information section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:4833 src/readelf.c:5486
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr ""
+
+#: src/readelf.c:4855
+#, c-format
+msgid ""
+"\n"
+" [%6tx] Zero terminator\n"
+msgstr ""
+
+#: src/readelf.c:4924
+#, c-format
+msgid "invalid augmentation length"
+msgstr ""
+
+#: src/readelf.c:4936
+msgid "FDE address encoding: "
+msgstr ""
+
+#: src/readelf.c:4942
+msgid "LSDA pointer encoding: "
+msgstr ""
+
+#: src/readelf.c:5034
+#, c-format
+msgid " (offset: %#<PRIx64>)"
+msgstr ""
+
+#: src/readelf.c:5041
+#, c-format
+msgid " (end offset: %#<PRIx64>)"
+msgstr ""
+
+#: src/readelf.c:5068
+#, c-format
+msgid " %-26sLSDA pointer: %#<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:5114
+#, c-format
+msgid "cannot get attribute code: %s"
+msgstr ""
+
+#: src/readelf.c:5122
+#, c-format
+msgid "cannot get attribute form: %s"
+msgstr ""
+
+#: src/readelf.c:5135
+#, c-format
+msgid "cannot get attribute value: %s"
+msgstr ""
+
+#: src/readelf.c:5331
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [Offset]\n"
+msgstr ""
+
+#: src/readelf.c:5356
+#, c-format
+msgid ""
+" Compilation unit at offset %<PRIu64>:\n"
+" Version: %<PRIu16>, Abbreviation section offset: %<PRIu64>, Address size: %"
+"<PRIu8>, Offset size: %<PRIu8>\n"
+msgstr ""
+
+#: src/readelf.c:5374
+#, c-format
+msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
+msgstr ""
+
+#: src/readelf.c:5385
+#, c-format
+msgid "cannot get DIE offset: %s"
+msgstr ""
+
+#: src/readelf.c:5393
+#, c-format
+msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
+msgstr ""
+
+#: src/readelf.c:5422
+#, c-format
+msgid "cannot get next DIE: %s\n"
+msgstr ""
+
+#: src/readelf.c:5429
+#, c-format
+msgid "cannot get next DIE: %s"
+msgstr ""
+
+#: src/readelf.c:5464
+#, c-format
+msgid "cannot get line data section data: %s"
+msgstr ""
+
+#: src/readelf.c:5477
+#, c-format
+msgid ""
+"\n"
+"Table at offset %Zu:\n"
+msgstr ""
+
+#: src/readelf.c:5529
+#, c-format
+msgid ""
+"\n"
+" Length: %<PRIu64>\n"
+" DWARF version: %<PRIuFAST16>\n"
+" Prologue length: %<PRIu64>\n"
+" Minimum instruction length: %<PRIuFAST8>\n"
+" Initial value if '%s': %<PRIuFAST8>\n"
+" Line base: %<PRIdFAST8>\n"
+" Line range: %<PRIuFAST8>\n"
+" Opcode base: %<PRIuFAST8>\n"
+"\n"
+"Opcodes:\n"
+msgstr ""
+
+#: src/readelf.c:5548
+#, c-format
+msgid "invalid data at offset %tu in section [%zu] '%s'"
+msgstr ""
+
+#: src/readelf.c:5563
+#, c-format
+msgid " [%*<PRIuFAST8>] %hhu argument\n"
+msgid_plural " [%*<PRIuFAST8>] %hhu arguments\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:5571
+msgid ""
+"\n"
+"Directory table:"
+msgstr ""
+
+#: src/readelf.c:5587
+msgid ""
+"\n"
+"File name table:\n"
+" Entry Dir Time Size Name"
+msgstr ""
+
+#: src/readelf.c:5616
+msgid ""
+"\n"
+"Line number statements:"
+msgstr ""
+
+#: src/readelf.c:5677
+#, c-format
+msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
+msgstr ""
+
+#: src/readelf.c:5697
+#, c-format
+msgid " extended opcode %u: "
+msgstr ""
+
+#: src/readelf.c:5702
+msgid "end of sequence"
+msgstr ""
+
+#: src/readelf.c:5717
+#, c-format
+msgid "set address to %s\n"
+msgstr ""
+
+#: src/readelf.c:5738
+#, c-format
+msgid "define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
+msgstr ""
+
+#: src/readelf.c:5747
+msgid "unknown opcode"
+msgstr ""
+
+#: src/readelf.c:5759
+msgid " copy"
+msgstr ""
+
+#: src/readelf.c:5769
+#, c-format
+msgid "advance address by %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5780
+#, c-format
+msgid " advance line by constant %d to %<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:5788
+#, c-format
+msgid " set file to %<PRIu64>\n"
+msgstr ""
+
+#: src/readelf.c:5798
+#, c-format
+msgid " set column to %<PRIu64>\n"
+msgstr ""
+
+#: src/readelf.c:5805
+#, c-format
+msgid " set '%s' to %<PRIuFAST8>\n"
+msgstr ""
+
+#: src/readelf.c:5811
+msgid " set basic block flag"
+msgstr ""
+
+#: src/readelf.c:5821
+#, c-format
+msgid "advance address by constant %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5837
+#, c-format
+msgid "advance address by fixed value %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5846
+msgid " set prologue end flag"
+msgstr ""
+
+#: src/readelf.c:5851
+msgid " set epilogue begin flag"
+msgstr ""
+
+#: src/readelf.c:5860
+#, c-format
+msgid " unknown opcode with %<PRIu8> parameter:"
+msgid_plural " unknown opcode with %<PRIu8> parameters:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:5892
+#, c-format
+msgid "cannot get .debug_loc content: %s"
+msgstr ""
+
+#: src/readelf.c:5947
+#, c-format
+msgid " [%6tx] %s..%s"
+msgstr ""
+
+#: src/readelf.c:5949
+#, c-format
+msgid " %s..%s"
+msgstr ""
+
+#: src/readelf.c:6002
+#, c-format
+msgid "cannot get macro information section data: %s"
+msgstr ""
+
+#: src/readelf.c:6081
+#, c-format
+msgid "%*s*** non-terminated string at end of section"
+msgstr ""
+
+#: src/readelf.c:6149
+#, c-format
+msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
+msgstr ""
+
+#: src/readelf.c:6188
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" %*s String\n"
+msgstr ""
+
+#: src/readelf.c:6202
+#, c-format
+msgid " *** error while reading strings: %s\n"
+msgstr ""
+
+#: src/readelf.c:6222
+#, c-format
+msgid ""
+"\n"
+"Call frame search table section [%2zu] '.eh_frame_hdr':\n"
+msgstr ""
+
+#: src/readelf.c:6324
+#, c-format
+msgid ""
+"\n"
+"Exception handling table section [%2zu] '.gcc_except_table':\n"
+msgstr ""
+
+#: src/readelf.c:6347
+#, c-format
+msgid " LPStart encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6359
+#, c-format
+msgid " TType encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6373
+#, c-format
+msgid " Call site encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6386
+msgid ""
+"\n"
+" Call site table:"
+msgstr ""
+
+#: src/readelf.c:6400
+#, c-format
+msgid ""
+" [%4u] Call site start: %#<PRIx64>\n"
+" Call site length: %<PRIu64>\n"
+" Landing pad: %#<PRIx64>\n"
+" Action: %u\n"
+msgstr ""
+
+#: src/readelf.c:6460
+#, c-format
+msgid "invalid TType encoding"
+msgstr ""
+
+#: src/readelf.c:6484
+#, c-format
+msgid "cannot get debug context descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:6620 src/readelf.c:7221
+#, c-format
+msgid "cannot convert core note data: %s"
+msgstr ""
+
+#: src/readelf.c:6961
+#, c-format
+msgid ""
+"\n"
+"%*s... <repeats %u more times> ..."
+msgstr ""
+
+#: src/readelf.c:7320
+msgid " Owner Data size Type\n"
+msgstr ""
+
+#: src/readelf.c:7338
+#, c-format
+msgid " %-13.*s %9<PRId32> %s\n"
+msgstr ""
+
+#: src/readelf.c:7372
+#, c-format
+msgid "cannot get content of note section: %s"
+msgstr ""
+
+#: src/readelf.c:7399
+#, c-format
+msgid ""
+"\n"
+"Note section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7422
+#, c-format
+msgid ""
+"\n"
+"Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7468
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no data to dump.\n"
+msgstr ""
+
+#: src/readelf.c:7474 src/readelf.c:7497
+#, c-format
+msgid "cannot get data for section [%Zu] '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7478
+#, c-format
+msgid ""
+"\n"
+"Hex dump of section [%Zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7491
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no strings to dump.\n"
+msgstr ""
+
+#: src/readelf.c:7501
+#, c-format
+msgid ""
+"\n"
+"String section [%Zu] '%s' contains %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7549
+#, c-format
+msgid ""
+"\n"
+"section [%lu] does not exist"
+msgstr ""
+
+#: src/readelf.c:7576
+#, c-format
+msgid ""
+"\n"
+"section '%s' does not exist"
+msgstr ""
+
+#: src/readelf.c:7637
+#, c-format
+msgid "cannot get symbol index of archive '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7640
+#, c-format
+msgid ""
+"\n"
+"Archive '%s' has no symbol index\n"
+msgstr ""
+
+#: src/readelf.c:7644
+#, c-format
+msgid ""
+"\n"
+"Index of archive '%s' has %Zu entries:\n"
+msgstr ""
+
+#: src/readelf.c:7662
+#, c-format
+msgid "cannot extract member at offset %Zu in '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7667
+#, c-format
+msgid "Archive member '%s' contains:\n"
+msgstr ""
+
+#: src/size.c:68
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd' or `sysv'. The default "
+"is `bsd'"
+msgstr ""
+
+#: src/size.c:70
+msgid "Same as `--format=sysv'"
+msgstr ""
+
+#: src/size.c:71
+msgid "Same as `--format=bsd'"
+msgstr ""
+
+#: src/size.c:74
+msgid "Same as `--radix=10'"
+msgstr ""
+
+#: src/size.c:75
+msgid "Same as `--radix=8'"
+msgstr ""
+
+#: src/size.c:76
+msgid "Same as `--radix=16'"
+msgstr ""
+
+#: src/size.c:78
+msgid "Similar to `--format=sysv' output but in one line"
+msgstr ""
+
+#: src/size.c:82
+msgid "Print size and permission flags for loadable segments"
+msgstr ""
+
+#: src/size.c:83
+msgid "Display the total sizes (bsd only)"
+msgstr ""
+
+#: src/size.c:88
+msgid "List section sizes of FILEs (a.out by default)."
+msgstr ""
+
+#: src/size.c:269
+#, c-format
+msgid "Invalid format: %s"
+msgstr ""
+
+#: src/size.c:280
+#, c-format
+msgid "Invalid radix: %s"
+msgstr ""
+
+#: src/size.c:339
+#, c-format
+msgid "%s: file format not recognized"
+msgstr ""
+
+#: src/size.c:446 src/size.c:589
+#, c-format
+msgid " (ex %s)"
+msgstr ""
+
+#: src/size.c:614
+msgid "(TOTALS)\n"
+msgstr ""
+
+#: src/strings.c:70
+msgid "Output Selection:"
+msgstr ""
+
+#: src/strings.c:71
+msgid "Scan entire file, not only loaded sections"
+msgstr ""
+
+#: src/strings.c:73
+msgid "Only NUL-terminated sequences of MIN-LEN characters or more are printed"
+msgstr ""
+
+#: src/strings.c:74
+msgid ""
+"Select character size and endianess: s = 7-bit, S = 8-bit, {b,l} = 16-bit, "
+"{B,L} = 32-bit"
+msgstr ""
+
+#: src/strings.c:78
+msgid "Print name of the file before each string."
+msgstr ""
+
+#: src/strings.c:80
+msgid "Print location of the string in base 8, 10, or 16 respectively."
+msgstr ""
+
+#: src/strings.c:81
+msgid "Alias for --radix=o"
+msgstr ""
+
+#: src/strings.c:88
+msgid "Print the strings of printable characters in files."
+msgstr ""
+
+#: src/strings.c:268 src/strings.c:303
+#, c-format
+msgid "invalid value '%s' for %s parameter"
+msgstr ""
+
+#: src/strings.c:314
+#, c-format
+msgid "invalid minimum length of matched string size"
+msgstr ""
+
+#: src/strings.c:601
+#, c-format
+msgid "lseek64 failed"
+msgstr ""
+
+#: src/strings.c:616 src/strings.c:680
+#, c-format
+msgid "re-mmap failed"
+msgstr ""
+
+#: src/strings.c:653
+#, c-format
+msgid "mprotect failed"
+msgstr ""
+
+#: src/strip.c:74
+msgid "Place stripped output into FILE"
+msgstr ""
+
+#: src/strip.c:75
+msgid "Extract the removed sections into FILE"
+msgstr ""
+
+#: src/strip.c:76
+msgid "Embed name FILE instead of -f argument"
+msgstr ""
+
+#: src/strip.c:80
+msgid "Remove all debugging symbols"
+msgstr ""
+
+#: src/strip.c:84
+msgid "Copy modified/access timestamps to the output"
+msgstr ""
+
+#: src/strip.c:86
+msgid "Remove .comment section"
+msgstr ""
+
+#: src/strip.c:89
+msgid "Relax a few rules to handle slightly broken ELF files"
+msgstr ""
+
+#: src/strip.c:94
+msgid "Discard symbols from object files."
+msgstr ""
+
+#: src/strip.c:186
+#, c-format
+msgid "Only one input file allowed together with '-o' and '-f'"
+msgstr ""
+
+#: src/strip.c:222
+#, c-format
+msgid "-f option specified twice"
+msgstr ""
+
+#: src/strip.c:231
+#, c-format
+msgid "-F option specified twice"
+msgstr ""
+
+#: src/strip.c:240 src/unstrip.c:125
+#, c-format
+msgid "-o option specified twice"
+msgstr ""
+
+#: src/strip.c:260
+#, c-format
+msgid "-R option supports only .comment section"
+msgstr ""
+
+#: src/strip.c:298 src/strip.c:322
+#, c-format
+msgid "cannot stat input file '%s'"
+msgstr ""
+
+#: src/strip.c:312
+#, c-format
+msgid "while opening '%s'"
+msgstr ""
+
+#: src/strip.c:350
+#, c-format
+msgid "%s: cannot use -o or -f when stripping archive"
+msgstr ""
+
+#: src/strip.c:448
+#, c-format
+msgid "cannot open EBL backend"
+msgstr ""
+
+#: src/strip.c:498 src/strip.c:522
+#, c-format
+msgid "cannot create new file '%s': %s"
+msgstr ""
+
+#: src/strip.c:582
+#, c-format
+msgid "illformed file '%s'"
+msgstr ""
+
+#: src/strip.c:869 src/strip.c:956
+#, c-format
+msgid "while generating output file: %s"
+msgstr ""
+
+#: src/strip.c:929 src/strip.c:1668
+#, c-format
+msgid "%s: error while creating ELF header: %s"
+msgstr ""
+
+#: src/strip.c:943
+#, c-format
+msgid "while preparing output for '%s'"
+msgstr ""
+
+#: src/strip.c:994 src/strip.c:1050
+#, c-format
+msgid "while create section header section: %s"
+msgstr ""
+
+#: src/strip.c:1000
+#, c-format
+msgid "cannot allocate section data: %s"
+msgstr ""
+
+#: src/strip.c:1059
+#, c-format
+msgid "while create section header string table: %s"
+msgstr ""
+
+#: src/strip.c:1593 src/strip.c:1690
+#, c-format
+msgid "while writing '%s': %s"
+msgstr ""
+
+#: src/strip.c:1604
+#, c-format
+msgid "while creating '%s'"
+msgstr ""
+
+#: src/strip.c:1616
+#, c-format
+msgid "while computing checksum for debug information"
+msgstr ""
+
+#: src/strip.c:1676
+#, c-format
+msgid "%s: error while reading the file: %s"
+msgstr ""
+
+#: src/strip.c:1722 src/strip.c:1729
+#, c-format
+msgid "error while finishing '%s': %s"
+msgstr ""
+
+#: src/strip.c:1752 src/strip.c:1809
+#, c-format
+msgid "cannot set access and modification date of '%s'"
+msgstr ""
+
+#: src/unstrip.c:78
+msgid "Match MODULE against file names, not module names"
+msgstr ""
+
+#: src/unstrip.c:79
+msgid "Silently skip unfindable files"
+msgstr ""
+
+#: src/unstrip.c:82
+msgid "Place output into FILE"
+msgstr ""
+
+#: src/unstrip.c:84
+msgid "Create multiple output files under DIRECTORY"
+msgstr ""
+
+#: src/unstrip.c:85
+msgid "Use module rather than file names"
+msgstr ""
+
+#: src/unstrip.c:87
+msgid "Create output for modules that have no separate debug information"
+msgstr ""
+
+#: src/unstrip.c:90
+msgid "Apply relocations to section contents in ET_REL files"
+msgstr ""
+
+#: src/unstrip.c:92
+msgid "Only list module and file names, build IDs"
+msgstr ""
+
+#: src/unstrip.c:134
+#, c-format
+msgid "-d option specified twice"
+msgstr ""
+
+#: src/unstrip.c:166
+#, c-format
+msgid "only one of -o or -d allowed"
+msgstr ""
+
+#: src/unstrip.c:175
+#, c-format
+msgid "-n cannot be used with explicit files or -o or -d"
+msgstr ""
+
+#: src/unstrip.c:190
+#, c-format
+msgid "output directory '%s'"
+msgstr ""
+
+#: src/unstrip.c:199
+#, c-format
+msgid "exactly two file arguments are required"
+msgstr ""
+
+#: src/unstrip.c:205
+#, c-format
+msgid "-m, -a, -R, and -i options not allowed with explicit files"
+msgstr ""
+
+#: src/unstrip.c:218
+#, c-format
+msgid "-o or -d is required when using implicit files"
+msgstr ""
+
+#: src/unstrip.c:254
+#, c-format
+msgid "cannot create ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:259
+#, c-format
+msgid "cannot copy ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:264 src/unstrip.c:1817
+#, c-format
+msgid "cannot create program headers: %s"
+msgstr ""
+
+#: src/unstrip.c:270
+#, c-format
+msgid "cannot copy program header: %s"
+msgstr ""
+
+#: src/unstrip.c:280
+#, c-format
+msgid "cannot copy section header: %s"
+msgstr ""
+
+#: src/unstrip.c:283 src/unstrip.c:1505
+#, c-format
+msgid "cannot get section data: %s"
+msgstr ""
+
+#: src/unstrip.c:285 src/unstrip.c:1507
+#, c-format
+msgid "cannot copy section data: %s"
+msgstr ""
+
+#: src/unstrip.c:309
+#, c-format
+msgid "cannot create directory '%s'"
+msgstr ""
+
+#: src/unstrip.c:349 src/unstrip.c:763 src/unstrip.c:1540
+#, c-format
+msgid "cannot get symbol table entry: %s"
+msgstr ""
+
+#: src/unstrip.c:365 src/unstrip.c:580 src/unstrip.c:601 src/unstrip.c:613
+#: src/unstrip.c:1561 src/unstrip.c:1691 src/unstrip.c:1715
+#, c-format
+msgid "cannot update symbol table: %s"
+msgstr ""
+
+#: src/unstrip.c:382 src/unstrip.c:432 src/unstrip.c:562 src/unstrip.c:1209
+#: src/unstrip.c:1525 src/unstrip.c:1720 src/unstrip.c:1791
+#, c-format
+msgid "cannot update section header: %s"
+msgstr ""
+
+#: src/unstrip.c:408 src/unstrip.c:419
+#, c-format
+msgid "cannot update relocation: %s"
+msgstr ""
+
+#: src/unstrip.c:507
+#, c-format
+msgid "cannot get symbol version: %s"
+msgstr ""
+
+#: src/unstrip.c:519
+#, c-format
+msgid "unexpected section type in [%Zu] with sh_link to symtab"
+msgstr ""
+
+#: src/unstrip.c:769
+#, c-format
+msgid "invalid string offset in symbol [%Zu]"
+msgstr ""
+
+#: src/unstrip.c:911 src/unstrip.c:1248
+#, c-format
+msgid "cannot read section [%Zu] name: %s"
+msgstr ""
+
+#: src/unstrip.c:952 src/unstrip.c:971 src/unstrip.c:1004
+#, c-format
+msgid "cannot read '.gnu.prelink_undo' section: %s"
+msgstr ""
+
+#: src/unstrip.c:992
+#, c-format
+msgid "invalid contents in '%s' section"
+msgstr ""
+
+#: src/unstrip.c:1047 src/unstrip.c:1370
+#, c-format
+msgid "cannot find matching section for [%Zu] '%s'"
+msgstr ""
+
+#: src/unstrip.c:1171 src/unstrip.c:1186 src/unstrip.c:1451
+#, c-format
+msgid "cannot add section name to string table: %s"
+msgstr ""
+
+#: src/unstrip.c:1195
+#, c-format
+msgid "cannot update section header string table data: %s"
+msgstr ""
+
+#: src/unstrip.c:1223 src/unstrip.c:1227
+#, c-format
+msgid "cannot get section header string table section index: %s"
+msgstr ""
+
+#: src/unstrip.c:1231 src/unstrip.c:1235 src/unstrip.c:1466
+#, c-format
+msgid "cannot get section count: %s"
+msgstr ""
+
+#: src/unstrip.c:1293 src/unstrip.c:1385
+#, c-format
+msgid "cannot read section header string table: %s"
+msgstr ""
+
+#: src/unstrip.c:1445
+#, c-format
+msgid "cannot add new section: %s"
+msgstr ""
+
+#: src/unstrip.c:1548
+#, c-format
+msgid "symbol [%Zu] has invalid section index"
+msgstr ""
+
+#: src/unstrip.c:1800
+#, c-format
+msgid "cannot get ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:1827
+#, c-format
+msgid "cannot update program header: %s"
+msgstr ""
+
+#: src/unstrip.c:1832 src/unstrip.c:1911
+#, c-format
+msgid "cannot write output file: %s"
+msgstr ""
+
+#: src/unstrip.c:1880
+#, c-format
+msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+
+#: src/unstrip.c:1883
+#, c-format
+msgid ""
+"DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+
+#: src/unstrip.c:1902 src/unstrip.c:1942 src/unstrip.c:1954 src/unstrip.c:2034
+#, c-format
+msgid "cannot create ELF descriptor: %s"
+msgstr ""
+
+#: src/unstrip.c:1960
+#, c-format
+msgid "'%s' and '%s' do not seem to match"
+msgstr ""
+
+#: src/unstrip.c:1991
+#, c-format
+msgid "cannot find stripped file for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:1995
+#, c-format
+msgid "cannot open stripped file '%s' for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2010
+#, c-format
+msgid "cannot find debug file for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2014
+#, c-format
+msgid "cannot open debug file '%s' for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2027
+#, c-format
+msgid "module '%s' file '%s' is not stripped"
+msgstr ""
+
+#: src/unstrip.c:2058
+#, c-format
+msgid "cannot cache section addresses for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2191
+#, c-format
+msgid "no matching modules found"
+msgstr ""
+
+#: src/unstrip.c:2200
+#, c-format
+msgid "matched more than one module"
+msgstr ""
+
+#: src/unstrip.c:2247
+msgid ""
+"STRIPPED-FILE DEBUG-FILE\n"
+"[MODULE...]"
+msgstr ""
+
+#: src/unstrip.c:2248
+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"
+"\n"
+"MODULE arguments give file name patterns matching modules to process.\n"
+"With -f these match the file name of the main (stripped) file (slashes are "
+"never special), otherwise they match the simple module names. With no "
+"arguments, process all modules found.\n"
+"\n"
+"Multiple modules are written to files under OUTPUT-DIRECTORY, creating "
+"subdirectories as needed. With -m these files have simple module names, "
+"otherwise they have the name of the main file complete with directory "
+"underneath OUTPUT-DIRECTORY.\n"
+"\n"
+"With -n no files are written, but one line to standard output for each "
+"module:\n"
+"\tSTART+SIZE BUILDID FILE DEBUGFILE MODULENAME\n"
+"START and SIZE are hexadecimal giving the address bounds of the module. "
+"BUILDID is hexadecimal for the build ID bits, or - if no ID is known; the "
+"hexadecimal may be followed by @0xADDR giving the address where the ID "
+"resides if that is known. FILE is the file name found for the module, or - "
+"if none was found, or . if an ELF image is available but not from any named "
+"file. DEBUGFILE is the separate debuginfo file name, or - if no debuginfo "
+"was found, or . if FILE contains the debug information."
+msgstr ""
diff --git a/po/ja.po b/po/ja.po
new file mode 100644
index 00000000..06b8b3f8
--- /dev/null
+++ b/po/ja.po
@@ -0,0 +1,5945 @@
+# translation of ja.po to Japanese
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Kiyoto Hashida <khashida@redhat.com>, 2009.
+# Hyu_gabaru Ryu_ichi <hyu_gabaru@yahoo.co.jp>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: ja\n"
+"Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
+"POT-Creation-Date: 2010-05-03 14:14-0700\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"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: lib/xmalloc.c:51 lib/xmalloc.c:65 lib/xmalloc.c:79 src/readelf.c:2822
+#: src/readelf.c:3161 src/unstrip.c:2087 src/unstrip.c:2295
+#, c-format
+msgid "memory exhausted"
+msgstr "メモリー消費済み"
+
+#: libasm/asm_error.c:62 libdw/dwarf_error.c:79 libdwfl/libdwflP.h:70
+#: libelf/elf_error.c:81
+msgid "no error"
+msgstr "エラー無し"
+
+#: libasm/asm_error.c:63 libdw/dwarf_error.c:88 libdwfl/libdwflP.h:72
+#: libelf/elf_error.c:112
+msgid "out of memory"
+msgstr "メモリー不足"
+
+#: libasm/asm_error.c:64 src/ldgeneric.c:2687
+#, c-format
+msgid "cannot create output file"
+msgstr "出力ファイルを作成できません"
+
+#: libasm/asm_error.c:65
+msgid "invalid parameter"
+msgstr "不当なパラメーター"
+
+#: libasm/asm_error.c:66
+msgid "cannot change mode of output file"
+msgstr "出力ファイルのモードを変更できません"
+
+#: libasm/asm_error.c:67 src/ldgeneric.c:7001
+#, c-format
+msgid "cannot rename output file"
+msgstr "出力ファイルの名前を変更できません"
+
+#: libasm/asm_error.c:68
+msgid "duplicate symbol"
+msgstr "重複シンボル"
+
+#: libasm/asm_error.c:69
+msgid "invalid section type for operation"
+msgstr "操作に不当なセクションタイプ"
+
+#: libasm/asm_error.c:70
+msgid "error during output of data"
+msgstr "データの出力中にエラー"
+
+#: libasm/asm_error.c:71
+msgid "no backend support available"
+msgstr "バックエンドサポートが利用できません"
+
+#: libasm/asm_error.c:81 libdw/dwarf_error.c:80 libdwfl/libdwflP.h:71
+#: libelf/elf_error.c:84
+msgid "unknown error"
+msgstr "不明なエラー"
+
+#: libdw/dwarf_error.c:81
+msgid "invalid access"
+msgstr "不当なアクセス"
+
+#: libdw/dwarf_error.c:82
+msgid "no regular file"
+msgstr "一般ファイルではありません"
+
+#: libdw/dwarf_error.c:83
+msgid "I/O error"
+msgstr "I/O エラー"
+
+#: libdw/dwarf_error.c:84
+msgid "invalid ELF file"
+msgstr "不当な ELF ファイル"
+
+#: libdw/dwarf_error.c:85
+msgid "no DWARF information"
+msgstr "DWARF 情報がありません"
+
+#: libdw/dwarf_error.c:86
+msgid "no ELF file"
+msgstr "ELF ファイルがありません"
+
+#: libdw/dwarf_error.c:87
+msgid "cannot get ELF header"
+msgstr "ELF ヘッダーを得られません"
+
+#: libdw/dwarf_error.c:89
+msgid "not implemented"
+msgstr "未実装"
+
+#: libdw/dwarf_error.c:90 libelf/elf_error.c:128 libelf/elf_error.c:176
+msgid "invalid command"
+msgstr "不当なコマンド"
+
+#: libdw/dwarf_error.c:91
+msgid "invalid version"
+msgstr "不当なバージョン"
+
+#: libdw/dwarf_error.c:92
+msgid "invalid file"
+msgstr "不当なファイル"
+
+#: libdw/dwarf_error.c:93
+msgid "no entries found"
+msgstr "項目が見つかりません"
+
+#: libdw/dwarf_error.c:94
+msgid "invalid DWARF"
+msgstr "不当な DWARF"
+
+#: libdw/dwarf_error.c:95
+msgid "no string data"
+msgstr "文字データがありません"
+
+#: libdw/dwarf_error.c:96
+msgid "no address value"
+msgstr "アドレス値ではありません"
+
+#: libdw/dwarf_error.c:97
+msgid "no constant value"
+msgstr "固定値ではありません"
+
+#: libdw/dwarf_error.c:98
+msgid "no reference value"
+msgstr "参照値がありません"
+
+#: libdw/dwarf_error.c:99
+msgid "invalid reference value"
+msgstr "不当な参照値"
+
+#: libdw/dwarf_error.c:100
+msgid ".debug_line section missing"
+msgstr ".debug_line セクションがありません"
+
+#: libdw/dwarf_error.c:101
+msgid "invalid .debug_line section"
+msgstr "不当な .debug_line セクション"
+
+#: libdw/dwarf_error.c:102
+msgid "debug information too big"
+msgstr "デバッグ情報が大きすぎます"
+
+#: libdw/dwarf_error.c:103
+msgid "invalid DWARF version"
+msgstr "不当な DWARF バージョン"
+
+#: libdw/dwarf_error.c:104
+msgid "invalid directory index"
+msgstr "不当なディレクトリー索引"
+
+#: libdw/dwarf_error.c:105 libdwfl/libdwflP.h:91
+msgid "address out of range"
+msgstr "アドレスが範囲外です"
+
+#: libdw/dwarf_error.c:106
+msgid "no location list value"
+msgstr "ロケーションリスト値ではありません"
+
+#: libdw/dwarf_error.c:107
+msgid "no block data"
+msgstr "ブロックデータではありません"
+
+#: libdw/dwarf_error.c:108
+msgid "invalid line index"
+msgstr "不当な行索引"
+
+#: libdw/dwarf_error.c:109
+msgid "invalid address range index"
+msgstr "不当なアドレス範囲索引"
+
+#: libdw/dwarf_error.c:110 libdwfl/libdwflP.h:92
+msgid "no matching address range"
+msgstr "アドレス範囲に対応しません"
+
+#: libdw/dwarf_error.c:111
+msgid "no flag value"
+msgstr "フラグ値がありません"
+
+#: libdw/dwarf_error.c:112 libelf/elf_error.c:253
+msgid "invalid offset"
+msgstr "不当なオフセット"
+
+#: libdw/dwarf_error.c:113
+msgid ".debug_ranges section missing"
+msgstr ".debug_ranges セクションがありません"
+
+#: libdw/dwarf_error.c:114
+msgid "invalid CFI section"
+msgstr "不当な CFI セクション"
+
+#: libdwfl/argp-std.c:67 src/unstrip.c:2237
+msgid "Input selection options:"
+msgstr "選択オプションを入力してください:"
+
+#: libdwfl/argp-std.c:68
+msgid "Find addresses in FILE"
+msgstr "ふぁいる 中のアドレスを探す"
+
+#: libdwfl/argp-std.c:70
+msgid "Find addresses from signatures found in COREFILE"
+msgstr "COREFILE 中で見つかった署名からアドレスを探す"
+
+#: libdwfl/argp-std.c:72
+msgid "Find addresses in files mapped into process PID"
+msgstr "プロセス PID に対応するファイル中のアドレスを探す"
+
+#: libdwfl/argp-std.c:74
+msgid ""
+"Find addresses in files mapped as read from FILE in Linux /proc/PID/maps "
+"format"
+msgstr ""
+"Linux の /proc/PID/maps 形式の ふぁいる から読み込んだものに対応するファイル"
+"のアドレスを探す"
+
+#: libdwfl/argp-std.c:76
+msgid "Find addresses in the running kernel"
+msgstr "実行中のカーネルのアドレスを探す"
+
+#: libdwfl/argp-std.c:78
+msgid "Kernel with all modules"
+msgstr "全てのモジュール付きのカーネル"
+
+#: libdwfl/argp-std.c:80
+msgid "Search path for separate debuginfo files"
+msgstr "分離した debuginfo ファイルべきパスを探す"
+
+#: libdwfl/argp-std.c:163
+msgid "only one of -e, -p, -k, -K, or --core allowed"
+msgstr "-e か、-p、-k、-K、--core のひとつだけが認められます"
+
+#: libdwfl/argp-std.c:223
+#, c-format
+msgid "cannot read ELF core file: %s"
+msgstr "ELF コアファイルを読めません: %s"
+
+#: libdwfl/argp-std.c:241
+msgid "No modules recognized in core file"
+msgstr "コアファイルの中にモジュールを認識できません"
+
+#: libdwfl/argp-std.c:253
+msgid "cannot load kernel symbols"
+msgstr "カーネルシンボルをロードできません"
+
+#: libdwfl/argp-std.c:257
+msgid "cannot find kernel modules"
+msgstr "カーネルモジュールを見つけられません"
+
+#: libdwfl/argp-std.c:271
+msgid "cannot find kernel or modules"
+msgstr "カーネルかモジュールを見つけられません"
+
+#: libdwfl/libdwflP.h:73
+msgid "See errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:74
+msgid "See elf_errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:75
+msgid "See dwarf_errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:76
+msgid "See ebl_errno (XXX missing)"
+msgstr ""
+
+#: libdwfl/libdwflP.h:77
+msgid "gzip decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:78
+msgid "bzip2 decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:79
+msgid "LZMA decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:80
+msgid "no support library found for machine"
+msgstr ""
+
+#: libdwfl/libdwflP.h:81
+msgid "Callbacks missing for ET_REL file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:82
+msgid "Unsupported relocation type"
+msgstr ""
+
+#: libdwfl/libdwflP.h:83
+msgid "r_offset is bogus"
+msgstr ""
+
+#: libdwfl/libdwflP.h:84 libelf/elf_error.c:132 libelf/elf_error.c:192
+msgid "offset out of range"
+msgstr "オフセットが範囲を越えている"
+
+#: libdwfl/libdwflP.h:85
+#, fuzzy
+msgid "relocation refers to undefined symbol"
+msgstr "定義されたシンボルの印刷サイズ"
+
+#: libdwfl/libdwflP.h:86
+msgid "Callback returned failure"
+msgstr ""
+
+#: libdwfl/libdwflP.h:87
+#, fuzzy
+msgid "No DWARF information found"
+msgstr "DWARF 情報がありません"
+
+#: libdwfl/libdwflP.h:88
+msgid "No symbol table found"
+msgstr ""
+
+#: libdwfl/libdwflP.h:89
+#, fuzzy
+msgid "No ELF program headers"
+msgstr "プログラムヘッダーを得られません: %s"
+
+#: libdwfl/libdwflP.h:90
+msgid "address range overlaps an existing module"
+msgstr ""
+
+#: libdwfl/libdwflP.h:93
+msgid "image truncated"
+msgstr ""
+
+#: libdwfl/libdwflP.h:94
+#, fuzzy
+msgid "ELF file opened"
+msgstr "ファイルのオープンを追跡します。"
+
+#: libdwfl/libdwflP.h:95
+#, fuzzy
+msgid "not a valid ELF file"
+msgstr "不当な ELF ファイル"
+
+#: libdwfl/libdwflP.h:96
+#, fuzzy
+msgid "cannot handle DWARF type description"
+msgstr "Elf 記述子を生成できません: %s"
+
+#: libebl/eblbackendname.c:63
+msgid "No backend"
+msgstr "バックエンドがありません"
+
+#: libebl/eblcorenotetypename.c:107 libebl/eblobjecttypename.c:78
+#: libebl/eblobjnotetypename.c:86 libebl/eblosabiname.c:98
+#: libebl/eblsectionname.c:110 libebl/eblsectiontypename.c:140
+#: libebl/eblsegmenttypename.c:104
+msgid "<unknown>"
+msgstr "<不明>"
+
+#: libebl/ebldynamictagname.c:126
+#, c-format
+msgid "<unknown>: %#<PRIx64>"
+msgstr "<不明>: %#<PRIx64>"
+
+#: libebl/eblobjnote.c:76
+#, c-format
+msgid " Build ID: "
+msgstr " ビルト ID: "
+
+#: libebl/eblobjnote.c:87
+#, c-format
+msgid " Linker version: %.*s\n"
+msgstr ""
+
+#: libebl/eblobjnote.c:136
+#, c-format
+msgid " OS: %s, ABI: "
+msgstr " OS: %s、ABI: "
+
+#: libebl/eblosabiname.c:95
+msgid "Stand alone"
+msgstr "スタンドアローン"
+
+#: libebl/eblsymbolbindingname.c:92 libebl/eblsymboltypename.c:98
+#, c-format
+msgid "<unknown>: %d"
+msgstr "<不明>: %d"
+
+#: libelf/elf_error.c:88
+msgid "unknown version"
+msgstr "不明なバージョン"
+
+#: libelf/elf_error.c:92
+msgid "unknown type"
+msgstr "不明なタイプ"
+
+#: libelf/elf_error.c:96
+msgid "invalid `Elf' handle"
+msgstr "無効な `Elf' の処理"
+
+#: libelf/elf_error.c:100
+msgid "invalid size of source operand"
+msgstr "ソース演算子の大きさが無効"
+
+#: libelf/elf_error.c:104
+msgid "invalid size of destination operand"
+msgstr "宛先演算子の大きさが無効"
+
+#: libelf/elf_error.c:108 src/readelf.c:4779
+#, c-format
+msgid "invalid encoding"
+msgstr "無効なエンコード"
+
+#: libelf/elf_error.c:116
+msgid "invalid file descriptor"
+msgstr "不当なファイル記述子"
+
+#: libelf/elf_error.c:120
+msgid "invalid operation"
+msgstr "不当な操作"
+
+#: libelf/elf_error.c:124
+msgid "ELF version not set"
+msgstr "ELF のバージョンが設定されていない"
+
+#: libelf/elf_error.c:136
+msgid "invalid fmag field in archive header"
+msgstr "アーカイブヘッダーの不当な fmag 領域"
+
+#: libelf/elf_error.c:140
+msgid "invalid archive file"
+msgstr "不当なアーカイブファイル"
+
+#: libelf/elf_error.c:144
+msgid "descriptor is not for an archive"
+msgstr "記述子はアーカイブ用ではありません"
+
+#: libelf/elf_error.c:148
+msgid "no index available"
+msgstr "索引が使えません"
+
+#: libelf/elf_error.c:152
+msgid "cannot read data from file"
+msgstr "ファイルからデータを読みません"
+
+#: libelf/elf_error.c:156
+msgid "cannot write data to file"
+msgstr "ファイルへデータを書けません"
+
+#: libelf/elf_error.c:160
+msgid "invalid binary class"
+msgstr "不当なバイナリークラス"
+
+#: libelf/elf_error.c:164
+msgid "invalid section index"
+msgstr "不当なセクション索引"
+
+#: libelf/elf_error.c:168
+msgid "invalid operand"
+msgstr "不当なオペランド"
+
+#: libelf/elf_error.c:172
+msgid "invalid section"
+msgstr "不当なセクション"
+
+#: libelf/elf_error.c:180
+msgid "executable header not created first"
+msgstr "エクゼキュータブルヘッダーが最初に作られていません"
+
+#: libelf/elf_error.c:184
+msgid "file descriptor disabled"
+msgstr "ファイル記述子が機能しません"
+
+#: libelf/elf_error.c:188
+#, fuzzy
+msgid "archive/member file descriptor mismatch"
+msgstr "アーカイブ/メンバー領域が不整合です"
+
+#: libelf/elf_error.c:196
+msgid "cannot manipulate null section"
+msgstr "null セクションを操作できません"
+
+#: libelf/elf_error.c:200
+msgid "data/scn mismatch"
+msgstr "データ/scnが不整合です"
+
+#: libelf/elf_error.c:204
+msgid "invalid section header"
+msgstr "不当なセクションヘッダー"
+
+#: libelf/elf_error.c:208 src/readelf.c:6242 src/readelf.c:6343
+#, c-format
+msgid "invalid data"
+msgstr "不当なデータ"
+
+#: libelf/elf_error.c:212
+msgid "unknown data encoding"
+msgstr "不明なデータエンコード"
+
+#: libelf/elf_error.c:216
+msgid "section `sh_size' too small for data"
+msgstr "`sh_size' セクションがデータには小さすぎます"
+
+#: libelf/elf_error.c:220
+msgid "invalid section alignment"
+msgstr "不当なセクション調整"
+
+#: libelf/elf_error.c:224
+msgid "invalid section entry size"
+msgstr "不当なセクション項目の大きさ"
+
+#: libelf/elf_error.c:228
+msgid "update() for write on read-only file"
+msgstr "読込み専用ファイルでの書込みのための update()"
+
+#: libelf/elf_error.c:232
+msgid "no such file"
+msgstr "そのようなファイルはありません"
+
+#: libelf/elf_error.c:236
+msgid "only relocatable files can contain section groups"
+msgstr "リロケータブルファイルのみセクショングループを含むことができます"
+
+#: libelf/elf_error.c:241
+msgid ""
+"program header only allowed in executables, shared objects, and core files"
+msgstr ""
+"プログラムヘッダーはエクゼキュータブルか、共用オブジェクト、コアファイルにの"
+"み認められています"
+
+#: libelf/elf_error.c:248
+msgid "file has no program header"
+msgstr "ファイルにプログラムヘッダーがありません"
+
+#: src/addr2line.c:66
+msgid "Output selection options:"
+msgstr ""
+
+#: src/addr2line.c:67
+msgid "Show only base names of source files"
+msgstr ""
+
+#: src/addr2line.c:69
+msgid "Show absolute file names using compilation directory"
+msgstr ""
+
+#: src/addr2line.c:70
+msgid "Also show function names"
+msgstr ""
+
+#: src/addr2line.c:71
+msgid "Also show symbol or section names"
+msgstr ""
+
+#: src/addr2line.c:73
+msgid "Treat addresses as offsets relative to NAME section."
+msgstr ""
+
+#: src/addr2line.c:75 src/elfcmp.c:75 src/findtextrel.c:75 src/nm.c:103
+#: src/strings.c:83
+msgid "Miscellaneous:"
+msgstr "雑則:"
+
+#: src/addr2line.c:84
+msgid ""
+"Locate source files and line information for ADDRs (in a.out by default)."
+msgstr ""
+
+#: src/addr2line.c:88
+msgid "[ADDR...]"
+msgstr ""
+
+#: src/addr2line.c:185 src/ar.c:289 src/elfcmp.c:555 src/elflint.c:239
+#: src/findtextrel.c:170 src/ld.c:957 src/nm.c:253 src/objdump.c:181
+#: src/ranlib.c:136 src/readelf.c:449 src/size.c:219 src/strings.c:227
+#: src/strip.c:204 src/unstrip.c:234
+#, c-format
+msgid ""
+"Copyright (C) %s Red Hat, Inc.\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+"Copyright (C) %s Red Hat, Inc.\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+
+#: src/addr2line.c:190 src/ar.c:294 src/elfcmp.c:560 src/elflint.c:244
+#: src/findtextrel.c:175 src/ld.c:962 src/nm.c:258 src/objdump.c:186
+#: src/ranlib.c:141 src/readelf.c:454 src/size.c:224 src/strings.c:232
+#: src/strip.c:209 src/unstrip.c:239
+#, c-format
+msgid "Written by %s.\n"
+msgstr "%s によって書かれました。\n"
+
+#: src/addr2line.c:405
+#, c-format
+msgid "Section syntax requires exactly one module"
+msgstr ""
+
+#: src/addr2line.c:428
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside section '%s'"
+msgstr ""
+
+#: src/addr2line.c:461
+#, c-format
+msgid "cannot find symbol '%s'"
+msgstr ""
+
+#: src/addr2line.c:466
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
+msgstr ""
+
+#: src/ar.c:76
+msgid "Commands:"
+msgstr "コマンド:"
+
+#: src/ar.c:77
+msgid "Delete files from archive."
+msgstr "アーカイブからファイルを削除。"
+
+#: src/ar.c:78
+msgid "Move files in archive."
+msgstr "アーカイブ内のファイルを移動。"
+
+#: src/ar.c:79
+msgid "Print files in archive."
+msgstr "アーカイブ内のファイルを印刷。"
+
+#: src/ar.c:80
+msgid "Quick append files to archive."
+msgstr "アーカイブへの即座のファイル追加。"
+
+#: src/ar.c:82
+msgid "Replace existing or insert new file into archive."
+msgstr "アーカイブへの既存のファイルの置き換えか、新しいファイルの挿入。"
+
+#: src/ar.c:83
+msgid "Display content of archive."
+msgstr "アーカイブの内容の表示"
+
+#: src/ar.c:84
+msgid "Extract files from archive."
+msgstr "アーカイブからのファイルの取出し"
+
+#: src/ar.c:86
+msgid "Command Modifiers:"
+msgstr "コマンド修飾子:"
+
+#: src/ar.c:87
+msgid "Preserve original dates."
+msgstr "元データの保存。"
+
+#: src/ar.c:88
+msgid "Use instance [COUNT] of name."
+msgstr "名前のインスタンス [COUNT] の使用。"
+
+#: src/ar.c:90
+msgid "Do not replace existing files with extracted files."
+msgstr "既存のファイルを抽出したファイルで置き換えない。"
+
+#: src/ar.c:91
+msgid "Allow filename to be truncated if necessary."
+msgstr "必要ならばファイル名の切り捨てを認める。"
+
+#: src/ar.c:93
+msgid "Provide verbose output."
+msgstr "饒舌な出力を提供する。"
+
+#: src/ar.c:94
+msgid "Force regeneration of symbol table."
+msgstr "シンボルテーブルの再生成を強制する。"
+
+#: src/ar.c:95
+msgid "Insert file after [MEMBER]."
+msgstr "[MEMBER]の後にファイルを挿入する。"
+
+#: src/ar.c:96
+msgid "Insert file before [MEMBER]."
+msgstr "[MEMBER]の前にファイルを挿入する。"
+
+#: src/ar.c:97
+msgid "Same as -b."
+msgstr "-b と同じ。"
+
+#: src/ar.c:98
+msgid "Suppress message when library has to be created."
+msgstr "ライブラリーを生成しなければならない時にメッセージを抑止する。"
+
+#: src/ar.c:100
+msgid "Use full path for file matching."
+msgstr "ファイル照合にフルパスを使う。"
+
+#: src/ar.c:101
+msgid "Update only older files in archive."
+msgstr "アーカイブの古いファイルのみ更新する。"
+
+#: src/ar.c:107
+msgid "Create, modify, and extract from archives."
+msgstr "アーカイブから作成や、修正、抽出する。"
+
+#: src/ar.c:110
+msgid "[MEMBER] [COUNT] ARCHIVE [FILE...]"
+msgstr "[メンバー] [合計] アーカイブ [ファイル...]"
+
+#: src/ar.c:192
+#, c-format
+msgid "'a', 'b', and 'i' are only allowed with the 'm' and 'r' options"
+msgstr "'a'や、'b'、'i'は、'm' や 'r' オプションと一緒にしか指定できません"
+
+#: src/ar.c:197
+#, c-format
+msgid "MEMBER parameter required for 'a', 'b', and 'i' modifiers"
+msgstr "'a'や、'b'、'i' 修飾子には MEMBER パラメーターが必要です"
+
+#: src/ar.c:213
+#, c-format
+msgid "'N' is only meaningful with the 'x' and 'd' options"
+msgstr "'N' は 'x' や 'd' オプションと一緒の時のみ意味を持ちます"
+
+#: src/ar.c:218
+#, c-format
+msgid "COUNT parameter required"
+msgstr "COUNT パラメーターが必要です"
+
+#: src/ar.c:230
+#, c-format
+msgid "invalid COUNT parameter %s"
+msgstr "不当な COUNT パラメーター %s"
+
+#: src/ar.c:237
+#, c-format
+msgid "'%c' is only meaningful with the 'x' option"
+msgstr "'%c' は 'x' オプションと一緒の時のみ意味を持ちます"
+
+#: src/ar.c:243
+#, c-format
+msgid "archive name required"
+msgstr "アーカイブ名が必要です"
+
+#: src/ar.c:314
+#, c-format
+msgid "More than one operation specified"
+msgstr "1つを越える操作が指定されました"
+
+#: src/ar.c:404
+#, c-format
+msgid "cannot open archive '%s'"
+msgstr "アーカイブ '%s' を開くことができません"
+
+#: src/ar.c:414
+#, c-format
+msgid "cannot open archive '%s': %s"
+msgstr "アーカイブ '%s' を開けません: %s"
+
+#: src/ar.c:418
+#, c-format
+msgid "%s: not an archive file"
+msgstr "%s: アーカイブファイルではありません"
+
+#: src/ar.c:422
+#, c-format
+msgid "cannot stat archive '%s'"
+msgstr "アーカイブに stat できません: '%s'"
+
+#: src/ar.c:434
+#, c-format
+msgid "no entry %s in archive\n"
+msgstr "アーカイブに項目 %s がありません\n"
+
+#: src/ar.c:487 src/ar.c:929 src/ar.c:1129
+#, c-format
+msgid "cannot create hash table"
+msgstr "ハッシュテーブルを生成できません"
+
+#: src/ar.c:494 src/ar.c:936 src/ar.c:1138
+#, c-format
+msgid "cannot insert into hash table"
+msgstr "ハッシュに挿入できません"
+
+#: src/ar.c:502 src/ranlib.c:176
+#, c-format
+msgid "cannot stat '%s'"
+msgstr "'%s' に stat できません"
+
+#: src/ar.c:598
+#, c-format
+msgid "cannot read content of %s: %s"
+msgstr "%s の内容を読むことができません: %s"
+
+#: src/ar.c:641
+#, c-format
+msgid "cannot open %.*s"
+msgstr "%.*s を開けません"
+
+#: src/ar.c:663
+#, c-format
+msgid "failed to write %s"
+msgstr "%s への書込みに失敗しました"
+
+#: src/ar.c:675
+#, c-format
+msgid "cannot change mode of %s"
+msgstr "%s のモードを変更できません"
+
+#: src/ar.c:691
+#, c-format
+msgid "cannot change modification time of %s"
+msgstr "%s の更新時間を変更できません"
+
+#: src/ar.c:737
+#, c-format
+msgid "cannot rename temporary file to %.*s"
+msgstr "一時ファイルを %.*s に名前変更できません"
+
+#: src/ar.c:773 src/ar.c:1021 src/ar.c:1419 src/ranlib.c:250
+#, c-format
+msgid "cannot create new file"
+msgstr "新しいファイルを生成できません"
+
+#: src/ar.c:1220
+#, c-format
+msgid "position member %s not found"
+msgstr "位置メンバー %s が見つかりません"
+
+#: src/ar.c:1230
+#, c-format
+msgid "%s: no entry %s in archive!\n"
+msgstr "%s: 項目 %s がアーカイブにありません!\n"
+
+#: src/ar.c:1259 src/ldgeneric.c:519 src/objdump.c:257
+#, c-format
+msgid "cannot open %s"
+msgstr "%s を開けません"
+
+#: src/ar.c:1264
+#, c-format
+msgid "cannot stat %s"
+msgstr "%s を stat できません"
+
+#: src/ar.c:1270
+#, c-format
+msgid "%s is no regular file"
+msgstr "%s は一般ファイルではありません"
+
+#: src/ar.c:1283
+#, c-format
+msgid "cannot get ELF descriptor for %s: %s\n"
+msgstr "%s の ELF 記述子を得られません: %s\n"
+
+#: src/ar.c:1302
+#, c-format
+msgid "cannot read %s: %s"
+msgstr "%s を読みません: %s"
+
+#: src/arlib.c:215
+#, c-format
+msgid "the archive '%s' is too large"
+msgstr "アーカイブ '%s' は大きすぎます"
+
+#: src/arlib.c:228
+#, c-format
+msgid "cannot read ELF header of %s(%s): %s"
+msgstr "%s(%s) の ELF ヘッダーを読めません: %s"
+
+#: src/elfcmp.c:69
+msgid "Control options:"
+msgstr ""
+
+#: src/elfcmp.c:70
+msgid ""
+"Control treatment of gaps in loadable segments [ignore|match] (default: "
+"ignore)"
+msgstr ""
+
+#: src/elfcmp.c:72
+msgid "Ignore permutation of buckets in SHT_HASH section"
+msgstr ""
+
+#: src/elfcmp.c:73
+msgid "Output nothing; yield exit status only"
+msgstr ""
+
+#: src/elfcmp.c:80
+msgid "Compare relevant parts of two ELF files for equality."
+msgstr ""
+
+#: src/elfcmp.c:84
+msgid "FILE1 FILE2"
+msgstr ""
+
+#: src/elfcmp.c:140
+msgid "Invalid number of parameters.\n"
+msgstr ""
+
+#: src/elfcmp.c:168 src/elfcmp.c:173
+#, c-format
+msgid "cannot get ELF header of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:190
+#, c-format
+msgid "%s %s diff: ELF header"
+msgstr ""
+
+#: src/elfcmp.c:198 src/elfcmp.c:201
+#, fuzzy, c-format
+msgid "cannot get section count of '%s': %s"
+msgstr "セクションを得られません: %s"
+
+#: src/elfcmp.c:206
+#, c-format
+msgid "%s %s diff: section count"
+msgstr ""
+
+#: src/elfcmp.c:214 src/elfcmp.c:217
+#, fuzzy, c-format
+msgid "cannot get program header count of '%s': %s"
+msgstr "プログラムヘッダーを得られません: %s"
+
+#: src/elfcmp.c:222
+#, fuzzy, c-format
+msgid "%s %s diff: program header count"
+msgstr "ファイルにプログラムヘッダーがありません"
+
+#: src/elfcmp.c:281
+#, c-format
+msgid "%s %s differ: section header"
+msgstr ""
+
+#: src/elfcmp.c:309 src/elfcmp.c:315
+#, c-format
+msgid "cannot get content of section %zu in '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:331 src/elfcmp.c:337
+#, c-format
+msgid "cannot get symbol in '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:358
+#, c-format
+msgid "%s %s differ: symbol table [%zu]"
+msgstr ""
+
+#: src/elfcmp.c:361
+#, c-format
+msgid "%s %s differ: symbol table [%zu,%zu]"
+msgstr ""
+
+#: src/elfcmp.c:409
+#, c-format
+msgid "%s %s differ: section [%zu] '%s' content"
+msgstr ""
+
+#: src/elfcmp.c:413
+#, c-format
+msgid "%s %s differ: section [%zu,%zu] '%s' content"
+msgstr ""
+
+#: src/elfcmp.c:429
+#, c-format
+msgid "%s %s differ: unequal amount of important sections"
+msgstr ""
+
+#: src/elfcmp.c:463 src/elfcmp.c:468
+#, c-format
+msgid "cannot load data of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:487 src/elfcmp.c:493
+#, c-format
+msgid "cannot get program header entry %d of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:499
+#, c-format
+msgid "%s %s differ: program header %d"
+msgstr ""
+
+#: src/elfcmp.c:524
+#, c-format
+msgid "%s %s differ: gap"
+msgstr ""
+
+#: src/elfcmp.c:583
+#, c-format
+msgid "Invalid value '%s' for --gaps parameter."
+msgstr ""
+
+#: src/elfcmp.c:607 src/findtextrel.c:229 src/ldgeneric.c:1767
+#: src/ldgeneric.c:4257 src/nm.c:363 src/ranlib.c:169 src/size.c:301
+#: src/strings.c:183 src/strip.c:433 src/strip.c:468 src/unstrip.c:1900
+#: src/unstrip.c:1929
+#, c-format
+msgid "cannot open '%s'"
+msgstr "'%s' を開けません"
+
+#: src/elfcmp.c:611 src/findtextrel.c:236 src/ranlib.c:186
+#, c-format
+msgid "cannot create ELF descriptor for '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:616
+#, c-format
+msgid "cannot create EBL descriptor for '%s'"
+msgstr ""
+
+#: src/elfcmp.c:634
+#, c-format
+msgid "cannot get section header of section %zu: %s"
+msgstr ""
+
+#: src/elfcmp.c:644
+#, c-format
+msgid "cannot get content of section %zu: %s"
+msgstr ""
+
+#: src/elfcmp.c:654 src/elfcmp.c:668
+#, c-format
+msgid "cannot get relocation: %s"
+msgstr ""
+
+#: src/elflint.c:72
+msgid "Be extremely strict, flag level 2 features."
+msgstr "非常に厳密にやってください、フラグレベル 2 機能。"
+
+#: src/elflint.c:73
+msgid "Do not print anything if successful"
+msgstr "成功したら何も印刷しない"
+
+#: src/elflint.c:74
+msgid "Binary is a separate debuginfo file"
+msgstr "バイナリーは別の debuginfo ファイルです"
+
+#: src/elflint.c:76
+msgid ""
+"Binary has been created with GNU ld and is therefore known to be broken in "
+"certain ways"
+msgstr ""
+"バイナリーは GNU ld で作成され、従ってある方法で壊れているのが知られている"
+
+#: src/elflint.c:82
+msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
+msgstr "ELF ファイルが gABI/psABI 仕様へ準拠しているかの厳密なチェック。"
+
+#: src/elflint.c:86 src/readelf.c:118
+msgid "FILE..."
+msgstr "ふぁいる..."
+
+#: src/elflint.c:159 src/readelf.c:272
+#, c-format
+msgid "cannot open input file"
+msgstr "入力ファイルを開けません"
+
+#: src/elflint.c:166
+#, c-format
+msgid "cannot generate Elf descriptor: %s\n"
+msgstr "Elf 記述子を生成できません: %s\n"
+
+#: src/elflint.c:185
+#, c-format
+msgid "error while closing Elf descriptor: %s\n"
+msgstr "Elf 記述子を閉じている時にエラー: %s\n"
+
+#: src/elflint.c:189
+msgid "No errors"
+msgstr "エラーはありません"
+
+#: src/elflint.c:223 src/readelf.c:425
+msgid "Missing file name.\n"
+msgstr "ファイル名がありません。\n"
+
+#: src/elflint.c:302
+#, c-format
+msgid " error while freeing sub-ELF descriptor: %s\n"
+msgstr "副-ELF 記述子を解放している時にエラー: %s\n"
+
+#: src/elflint.c:310
+#, c-format
+msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
+msgstr "ELF ファイルではありません - 最初に誤ったマジックバイトがあります\n"
+
+#: src/elflint.c:370
+#, c-format
+msgid "e_ident[%d] == %d is no known class\n"
+msgstr "e_ident[%d] == %d は既知のクラスではありません\n"
+
+#: src/elflint.c:375
+#, c-format
+msgid "e_ident[%d] == %d is no known data encoding\n"
+msgstr "e_ident[%d] == %d は既知のデータエンコードではありません\n"
+
+#: src/elflint.c:379
+#, c-format
+msgid "unknown ELF header version number e_ident[%d] == %d\n"
+msgstr "不明な ELF ヘッダーバージョン数 e_ident[%d] == %d\n"
+
+#: src/elflint.c:385
+#, c-format
+msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
+msgstr "不明な OS ABI e_ident[%d] == '%s'\n"
+
+#: src/elflint.c:391
+#, c-format
+msgid "unsupport ABI version e_ident[%d] == %d\n"
+msgstr "不明な ABI バージョン e_ident[%d] == %d\n"
+
+#: src/elflint.c:396
+#, c-format
+msgid "e_ident[%zu] is not zero\n"
+msgstr "e_ident[%zu] がゼロではありません\n"
+
+#: src/elflint.c:401
+#, c-format
+msgid "unknown object file type %d\n"
+msgstr "不明なオブジェクトファイルタイプ %d\n"
+
+#: src/elflint.c:408
+#, c-format
+msgid "unknown machine type %d\n"
+msgstr "不明なマシンタイプ %d\n"
+
+#: src/elflint.c:412
+#, c-format
+msgid "unknown object file version\n"
+msgstr "不明なオブジェクトファイルバージョン\n"
+
+#: src/elflint.c:418
+#, c-format
+msgid "invalid program header offset\n"
+msgstr "不当なプログラムヘッダーオフセット\n"
+
+#: src/elflint.c:420
+#, c-format
+msgid "executables and DSOs cannot have zero program header offset\n"
+msgstr ""
+"実行ファイルと DSO はプログラムヘッダーオフセットが 0 であってはいけません\n"
+
+#: src/elflint.c:424
+#, c-format
+msgid "invalid number of program header entries\n"
+msgstr "プログラムヘッダー項目数として不当な数\n"
+
+#: src/elflint.c:432
+#, c-format
+msgid "invalid section header table offset\n"
+msgstr "不当なセクションヘッダーテーブルオフセット\n"
+
+#: src/elflint.c:435
+#, c-format
+msgid "section header table must be present\n"
+msgstr "セクションヘッダーテーブルがなければなりません\n"
+
+#: src/elflint.c:449
+#, c-format
+msgid "invalid number of section header table entries\n"
+msgstr "セクションヘッダーテーブル項目数として不当な数\n"
+
+#: src/elflint.c:466
+#, c-format
+msgid "invalid section header index\n"
+msgstr "不当なセクションヘッダーインデックス\n"
+
+#: src/elflint.c:480
+#, fuzzy, c-format
+msgid "invalid number of program header table entries\n"
+msgstr "プログラムヘッダー項目数として不当な数\n"
+
+#: src/elflint.c:489
+#, c-format
+msgid "invalid machine flags: %s\n"
+msgstr "不当なマシンフラグ: %s\n"
+
+#: src/elflint.c:496 src/elflint.c:513
+#, c-format
+msgid "invalid ELF header size: %hd\n"
+msgstr "不当な ELF ヘッダーサイズ: %hd\n"
+
+#: src/elflint.c:499 src/elflint.c:516
+#, c-format
+msgid "invalid program header size: %hd\n"
+msgstr "不当なプログラムヘッダーサイズ: %hd\n"
+
+#: src/elflint.c:502 src/elflint.c:519
+#, c-format
+msgid "invalid program header position or size\n"
+msgstr "不当なプログラムヘッダー位置かサイズ\n"
+
+#: src/elflint.c:505 src/elflint.c:522
+#, c-format
+msgid "invalid section header size: %hd\n"
+msgstr "不当なセクションヘッダーサイズ: %hd\n"
+
+#: src/elflint.c:508 src/elflint.c:525
+#, c-format
+msgid "invalid section header position or size\n"
+msgstr "不当なセクションヘッダー位置かサイズ\n"
+
+#: src/elflint.c:569
+#, c-format
+msgid ""
+"section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
+"group\n"
+msgstr ""
+"セクション [%2d] '%s': SHF_GROUP フラグのあるセクションにセクショングループの"
+"一部分が設定されていません\n"
+
+#: src/elflint.c:573
+#, fuzzy, c-format
+msgid ""
+"section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
+msgstr ""
+"セクション [%2d] '%s': セクショングループ [%2zu] '%s' がグループメンバーを継"
+"続していません\n"
+
+#: src/elflint.c:589 src/elflint.c:1432 src/elflint.c:1482 src/elflint.c:1591
+#: src/elflint.c:2185 src/elflint.c:2699 src/elflint.c:2860 src/elflint.c:2990
+#: src/elflint.c:3162 src/elflint.c:4062
+#, c-format
+msgid "section [%2d] '%s': cannot get section data\n"
+msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
+
+#: src/elflint.c:602 src/elflint.c:1598
+#, c-format
+msgid ""
+"section [%2d] '%s': referenced as string table for section [%2d] '%s' but "
+"type is not SHT_STRTAB\n"
+msgstr ""
+"セクション [%2d] '%s': セクション [%2d] '%s' 用の文字列テーブルとして参照され"
+"ていますが、タイプが SHT_STRTAB ではありません\n"
+
+#: src/elflint.c:625
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol table cannot have more than one extended index "
+"section\n"
+msgstr ""
+"セクション [%2d] '%s': シンボルテーブルは 1 個を越える拡張インデックスセク"
+"ションを持てません\n"
+
+#: src/elflint.c:636
+#, c-format
+msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
+msgstr "セクション [%2u] '%s': 項目サイズが ElfXX_Sym と一致しません\n"
+
+#: src/elflint.c:645
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
+msgstr "セクション [%2d] '%s': シンボル %d を得られません: %s\n"
+
+#: src/elflint.c:650 src/elflint.c:653 src/elflint.c:656 src/elflint.c:659
+#: src/elflint.c:662 src/elflint.c:665
+#, c-format
+msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
+msgstr "セクション [%2d] '%s': 0番目の項目にある '%s' ゼロではありません\n"
+
+#: src/elflint.c:668
+#, c-format
+msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
+msgstr "セクション [%2d] '%s': 0番目の項目用の XINDEX がゼロではありません\n"
+
+#: src/elflint.c:678
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
+msgstr "セクション [%2d] '%s': シンボル %zu を得られません: %s\n"
+
+#: src/elflint.c:687
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
+msgstr "セクション [%2d] '%s': シンボル %zu: 不当な名前の値\n"
+
+#: src/elflint.c:700
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: too large section index but no extended "
+"section index section\n"
+msgstr ""
+"セクション [%2d] '%s': シンボル %zu: 大きすぎるセクションインデックスだが、拡"
+"張セクションインデックスセクションがありません\n"
+
+#: src/elflint.c:706
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
+"st_shndx (%<PRIu32>)\n"
+msgstr ""
+"セクション [%2d] '%s': シンボル %zu: st_shndx (%<PRIu32>) に適合するインデッ"
+"クス用に使われる XINDEX\n"
+
+#: src/elflint.c:718
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
+msgstr "セクション [%2d] '%s': シンボル %zu: 不当なセクションインデックス\n"
+
+#: src/elflint.c:726
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown type\n"
+msgstr "セクション [%2d] '%s': シンボル %zu: 不明なタイプ\n"
+
+#: src/elflint.c:732
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
+msgstr "セクション [%2d] '%s': シンボル %zu: 不明なシンボルバインディング\n"
+
+#: src/elflint.c:737
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
+msgstr ""
+"セクション [%2d] '%s': シンボル %zu: オブジェクトタイプと異なる固有のシンボ"
+"ル\n"
+
+#: src/elflint.c:745
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
+msgstr ""
+"セクション [%2d] '%s': シンボル %zu: COMMON はリロケータブルファイル内のみで"
+"許されます\n"
+
+#: src/elflint.c:749
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
+msgstr ""
+"セクション [%2d] '%s': シンボル %zu: ローカルな COMMON シンボルは意味がありま"
+"せん\n"
+
+#: src/elflint.c:753
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
+msgstr ""
+"セクション [%2d] '%s': シンボル %zu: COMMON セクションの機能は意味がありませ"
+"ん\n"
+
+#: src/elflint.c:785
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
+msgstr "セクション [%2d] '%s': シンボル %zu: st_value 境界外\n"
+
+#: src/elflint.c:791 src/elflint.c:816 src/elflint.c:859
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu does not fit completely in referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+"セクション [%2d] '%s': シンボル %zu は参照されるセクション [%2d] '%s' とは完"
+"全に一致しません\n"
+
+#: src/elflint.c:800
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
+"SHF_TLS flag set\n"
+msgstr ""
+"セクション [%2d] '%s': シンボル %zu: 参照されるセクション [%2d] '%s' は "
+"SHF_TLS フラグが設定されていません\n"
+
+#: src/elflint.c:810 src/elflint.c:852
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+"セクション [%2d] '%s': シンボル %zu: st_value 参照されるセクション [%2d] '%"
+"s' の境界外\n"
+
+#: src/elflint.c:837
+#, 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:845
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] '%"
+"s'\n"
+msgstr ""
+"セクション [%2d] '%s': シンボル %zu: 参照されるセクション [%2d] '%s' の"
+"st_value 不足\n"
+
+#: src/elflint.c:872
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+"セクション [%2d] '%s': シンボル %zu: sh_info に記述された範囲外のローカルシン"
+"ボル\n"
+
+#: src/elflint.c:879
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+"セクション [%2d] '%s': シンボル %zu: sh_info に記述された範囲外の非ローカルシ"
+"ンボル\n"
+
+#: src/elflint.c:886
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
+msgstr "セクション [%2d] '%s': シンボル %zu: 非ローカルセクションシンボル\n"
+
+#: src/elflint.c:936
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section [%"
+"2d]\n"
+msgstr ""
+"セクション [%2d] '%s': _GLOBAL_OFFSET_TABLE_ シンボルが間違ったセクション [%"
+"2d] を参照しています\n"
+
+#: src/elflint.c:943
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] '%"
+"s'\n"
+msgstr ""
+"セクション [%2d] '%s': _GLOBAL_OFFSET_TABLE_ シンボルはセクション [%2d] '%s' "
+"を参照しています\n"
+
+#: src/elflint.c:959
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
+"match %s section address %#<PRIx64>\n"
+msgstr ""
+"セクション [%2d] '%s': _GLOBAL_OFFSET_TABLE_ シンボル値 %#<PRIx64> は %s のセ"
+"クションアドレス %#<PRIx64> と一致しません\n"
+
+#: src/elflint.c:966
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
+"match %s section size %<PRIu64>\n"
+msgstr ""
+"セクション [%2d] '%s': _GLOBAL_OFFSET_TABLE_ シンボルサイズ %<PRIu64> は %s "
+"のセクションサイズ %<PRIu64> と一致しません\n"
+
+#: src/elflint.c:974
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
+"section\n"
+msgstr ""
+"セクション [%2d] '%s': _GLOBAL_OFFSET_TABLE_ シンボルはありますが、.got セク"
+"ションがありません\n"
+
+#: src/elflint.c:990
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
+"segment address %#<PRIx64>\n"
+msgstr ""
+"セクション [%2d] '%s': _DYNAMIC_ シンボル値 %#<PRIx64> は動的セグメントアドレ"
+"ス %#<PRIx64> と一致しません\n"
+
+#: src/elflint.c:997
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
+"segment size %<PRIu64>\n"
+msgstr ""
+"セクション [%2d] '%s': _DYNAMIC シンボルサイズ %<PRIu64> は動的セグメントサイ"
+"ズ %<PRIu64> と一致しません\n"
+
+#: src/elflint.c:1010
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
+"default visibility\n"
+msgstr ""
+"セクション [%2d] '%s': シンボル %zu: 省略以外の可視性を持った動的シンボルテー"
+"ブル中のシンボル\n"
+
+#: src/elflint.c:1014
+#, 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:1059
+#, c-format
+msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
+msgstr "セクション [%2d] '%s': この RELA セクション用に使われる DT_RELCOUNT\n"
+
+#: src/elflint.c:1068 src/elflint.c:1120
+#, 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:1093 src/elflint.c:1145
+#, c-format
+msgid ""
+"section [%2d] '%s': relative relocations after index %d as specified by "
+"DT_RELCOUNT\n"
+msgstr ""
+"セクション [%2d] '%s': UT_RELOCOUNT で指定されたインデックス %d 後の相対リロ"
+"ケーション\n"
+
+#: src/elflint.c:1099 src/elflint.c:1151
+#, c-format
+msgid ""
+"section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
+"specified %d relative relocations\n"
+msgstr ""
+"セクション [%2d] '%s': インデックス %zu での非相対リロケーション; %d 相対リ"
+"ロケーションで指定された DT_RELCOUNT\n"
+
+#: src/elflint.c:1111
+#, c-format
+msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
+msgstr "セクション [%2d] '%s': この REL セクション用に使われる DT_RELACOUNT\n"
+
+#: src/elflint.c:1193
+#, c-format
+msgid "section [%2d] '%s': invalid destination section index\n"
+msgstr "セクション [%2d] '%s': 不当な宛先セクションインデックス\n"
+
+#: src/elflint.c:1206
+#, c-format
+msgid "section [%2d] '%s': invalid destination section type\n"
+msgstr "セクション [%2d] '%s': 不当な宛先セクションタイプ\n"
+
+#: src/elflint.c:1214
+#, c-format
+msgid "section [%2d] '%s': sh_info should be zero\n"
+msgstr "セクション [%2d] '%s': sh_info はゼロでなければなりません\n"
+
+#: src/elflint.c:1221
+#, c-format
+msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
+msgstr ""
+"セクション [%2d] '%s': マージできるセクションのリロケーションは不可能です\n"
+
+#: src/elflint.c:1228
+#, c-format
+msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
+msgstr ""
+"セクション [%2d] '%s': セクション項目サイズが ElfXX_Rela と一致しません\n"
+
+#: src/elflint.c:1288
+#, c-format
+msgid "text relocation flag set but there is no read-only segment\n"
+msgstr ""
+"テキストリロケーションフラグが設定されていますが、読込み専用セグメントがあり"
+"ません\n"
+
+#: src/elflint.c:1315
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid type\n"
+msgstr "セクション [%2d] '%s': リロケーション %zu: 不当なタイプ\n"
+
+#: src/elflint.c:1323
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: relocation type invalid for the file "
+"type\n"
+msgstr ""
+"セクション [%2d] '%s': リロケーション %zu: このファイル用のリロケーションタイ"
+"プは不当です\n"
+
+#: src/elflint.c:1331
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
+msgstr ""
+"セクション [%2d] '%s': リロケーション %zu: 不当なシンボルインデックス\n"
+
+#: src/elflint.c:1349
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
+"be used with %s\n"
+msgstr ""
+"セクション [%2d] '%s': リロケーション %zu: シンボル '_GLOBAL_OFFSET_TABLE_' "
+"のみが %s と一緒に使用できます\n"
+
+#: src/elflint.c:1366
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
+msgstr "セクション [%2d] '%s': リロケーション %zu: オフセット境界外\n"
+
+#: src/elflint.c:1381
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: copy relocation against symbol of type %"
+"s\n"
+msgstr ""
+"セクション [%2d] '%s': リロケーション %zu: タイプ %s のシンボルに対するコピー"
+"リロケーション\n"
+
+#: src/elflint.c:1402
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: read-only section modified but text "
+"relocation flag not set\n"
+msgstr ""
+"セクション [%2d] '%s': リロケーション %zu: 読込み専用セクションが変更されまし"
+"たが、テキストリロケーションフラグが設定されていません\n"
+
+#: src/elflint.c:1417
+#, c-format
+msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
+msgstr ""
+"セクション [%2d] '%s': リロケーションがロードされたデータとロードされなかった"
+"データに対してです\n"
+
+#: src/elflint.c:1456 src/elflint.c:1506
+#, c-format
+msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:1586
+#, c-format
+msgid "more than one dynamic section present\n"
+msgstr ""
+
+#: src/elflint.c:1604
+#, c-format
+msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
+msgstr ""
+
+#: src/elflint.c:1609 src/elflint.c:1901
+#, c-format
+msgid "section [%2d] '%s': sh_info not zero\n"
+msgstr ""
+
+#: src/elflint.c:1619
+#, c-format
+msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:1627
+#, c-format
+msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
+msgstr ""
+
+#: src/elflint.c:1634
+#, c-format
+msgid "section [%2d] '%s': entry %zu: unknown tag\n"
+msgstr ""
+
+#: src/elflint.c:1645
+#, c-format
+msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
+msgstr ""
+
+#: src/elflint.c:1655
+#, c-format
+msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
+msgstr ""
+
+#: src/elflint.c:1673
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
+msgstr ""
+
+#: src/elflint.c:1695
+#, 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:1738
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:1753
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must be valid offset in section [%"
+"2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:1773 src/elflint.c:1801
+#, c-format
+msgid "section [%2d] '%s': contains %s entry but not %s\n"
+msgstr ""
+
+#: src/elflint.c:1785
+#, c-format
+msgid "section [%2d] '%s': mandatory tag %s not present\n"
+msgstr ""
+
+#: src/elflint.c:1794
+#, c-format
+msgid "section [%2d] '%s': no hash section present\n"
+msgstr ""
+
+#: src/elflint.c:1809 src/elflint.c:1816
+#, c-format
+msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
+msgstr ""
+
+#: src/elflint.c:1826 src/elflint.c:1830
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
+msgstr ""
+
+#: src/elflint.c:1836
+#, c-format
+msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
+msgstr ""
+
+#: src/elflint.c:1847 src/elflint.c:1851 src/elflint.c:1855 src/elflint.c:1859
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
+msgstr ""
+
+#: src/elflint.c:1871
+#, c-format
+msgid ""
+"section [%2d] '%s': only relocatable files can have extended section index\n"
+msgstr ""
+
+#: src/elflint.c:1881
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index section not for symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1886
+#, c-format
+msgid "cannot get data for symbol section\n"
+msgstr ""
+
+#: src/elflint.c:1889
+#, c-format
+msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
+msgstr ""
+
+#: src/elflint.c:1896
+#, c-format
+msgid "section [%2d] '%s': extended index table too small for symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1911
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
+"same symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1922
+#, c-format
+msgid "symbol 0 should have zero extended section index\n"
+msgstr ""
+
+#: src/elflint.c:1934
+#, c-format
+msgid "cannot get data for symbol %zu\n"
+msgstr ""
+
+#: src/elflint.c:1939
+#, c-format
+msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
+msgstr ""
+
+#: src/elflint.c:1955 src/elflint.c:1996
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
+msgstr ""
+
+#: src/elflint.c:1967 src/elflint.c:2008
+#, c-format
+msgid "section [%2d] '%s': chain array too large\n"
+msgstr ""
+
+#: src/elflint.c:1976 src/elflint.c:2017
+#, c-format
+msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:1982
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2023
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2038
+#, c-format
+msgid "section [%2d] '%s': bitmask size not power of 2: %u\n"
+msgstr ""
+
+#: src/elflint.c:2049
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected at "
+"least%ld)\n"
+msgstr ""
+
+#: src/elflint.c:2057
+#, c-format
+msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
+msgstr ""
+
+#: src/elflint.c:2089
+#, c-format
+msgid ""
+"section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
+msgstr ""
+
+#: src/elflint.c:2110
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
+"undefined\n"
+msgstr ""
+
+#: src/elflint.c:2121
+#, c-format
+msgid ""
+"section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
+msgstr ""
+
+#: src/elflint.c:2152
+#, c-format
+msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2157
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2163
+#, c-format
+msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
+msgstr ""
+
+#: src/elflint.c:2176
+#, c-format
+msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
+msgstr ""
+
+#: src/elflint.c:2194
+#, c-format
+msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
+msgstr ""
+
+#: src/elflint.c:2202
+#, c-format
+msgid "section [%2d] '%s': hash table entry size incorrect\n"
+msgstr ""
+
+#: src/elflint.c:2207
+#, c-format
+msgid "section [%2d] '%s': not marked to be allocated\n"
+msgstr ""
+
+#: src/elflint.c:2212
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table has not even room for initial administrative "
+"entries\n"
+msgstr ""
+
+#: src/elflint.c:2260
+#, c-format
+msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
+msgstr ""
+
+#: src/elflint.c:2338 src/elflint.c:2342
+#, c-format
+msgid "section [%2zu] '%s': reference to symbol index 0\n"
+msgstr ""
+
+#: src/elflint.c:2349
+#, 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:2361
+#, 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:2377
+#, c-format
+msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
+msgstr ""
+
+#: src/elflint.c:2397
+#, c-format
+msgid ""
+"section [%2d] '%s': section groups only allowed in relocatable object files\n"
+msgstr ""
+
+#: src/elflint.c:2408
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol table: %s\n"
+msgstr ""
+
+#: src/elflint.c:2413
+#, c-format
+msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
+msgstr ""
+
+#: src/elflint.c:2419
+#, c-format
+msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
+msgstr ""
+
+#: src/elflint.c:2424
+#, c-format
+msgid "section [%2d] '%s': sh_flags not zero\n"
+msgstr ""
+
+#: src/elflint.c:2431
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol for signature\n"
+msgstr ""
+
+#: src/elflint.c:2436
+#, fuzzy, c-format
+msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
+msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
+
+#: src/elflint.c:2442
+#, c-format
+msgid "section [%2d] '%s': sh_flags not set correctly\n"
+msgstr ""
+
+#: src/elflint.c:2448
+#, c-format
+msgid "section [%2d] '%s': cannot get data: %s\n"
+msgstr ""
+
+#: src/elflint.c:2457
+#, c-format
+msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
+msgstr ""
+
+#: src/elflint.c:2462
+#, c-format
+msgid "section [%2d] '%s': section group without flags word\n"
+msgstr ""
+
+#: src/elflint.c:2468
+#, c-format
+msgid "section [%2d] '%s': section group without member\n"
+msgstr ""
+
+#: src/elflint.c:2472
+#, c-format
+msgid "section [%2d] '%s': section group with only one member\n"
+msgstr ""
+
+#: src/elflint.c:2483
+#, c-format
+msgid "section [%2d] '%s': unknown section group flags\n"
+msgstr ""
+
+#: src/elflint.c:2495
+#, c-format
+msgid "section [%2d] '%s': section index %Zu out of range\n"
+msgstr ""
+
+#: src/elflint.c:2504
+#, c-format
+msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:2511
+#, c-format
+msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:2517
+#, c-format
+msgid ""
+"section [%2d] '%s': element %Zu references section [%2d] '%s' without "
+"SHF_GROUP flag set\n"
+msgstr ""
+
+#: src/elflint.c:2524
+#, c-format
+msgid "section [%2d] '%s' is contained in more than one section group\n"
+msgstr ""
+
+#: src/elflint.c:2713
+#, 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:2724
+#, c-format
+msgid ""
+"section [%2d] '%s' has different number of entries than symbol table [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:2740
+#, c-format
+msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
+msgstr ""
+
+#: src/elflint.c:2756
+#, c-format
+msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
+msgstr ""
+
+#: src/elflint.c:2764
+#, c-format
+msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
+msgstr ""
+
+#: src/elflint.c:2778
+#, c-format
+msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
+msgstr ""
+
+#: src/elflint.c:2783
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %d: version index %d is for defined version\n"
+msgstr ""
+
+#: src/elflint.c:2793
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %d: version index %d is for requested version\n"
+msgstr ""
+
+#: src/elflint.c:2845
+#, c-format
+msgid "more than one version reference section present\n"
+msgstr ""
+
+#: src/elflint.c:2853 src/elflint.c:2982
+#, c-format
+msgid "section [%2d] '%s': sh_link does not link to string table\n"
+msgstr ""
+
+#: src/elflint.c:2876 src/elflint.c:3034
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong version %d\n"
+msgstr ""
+
+#: src/elflint.c:2882 src/elflint.c:3040
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:2890
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid file reference\n"
+msgstr ""
+
+#: src/elflint.c:2898
+#, c-format
+msgid "section [%2d] '%s': entry %d references unknown dependency\n"
+msgstr ""
+
+#: src/elflint.c:2910
+#, c-format
+msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
+msgstr ""
+
+#: src/elflint.c:2917
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
+"reference\n"
+msgstr ""
+
+#: src/elflint.c:2924
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: %"
+"#x, expected %#x\n"
+msgstr ""
+
+#: src/elflint.c:2934
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
+"name '%s'\n"
+msgstr ""
+
+#: src/elflint.c:2945
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
+msgstr ""
+
+#: src/elflint.c:2961 src/elflint.c:3119
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
+msgstr ""
+
+#: src/elflint.c:2974
+#, c-format
+msgid "more than one version definition section present\n"
+msgstr ""
+
+#: src/elflint.c:3019
+#, c-format
+msgid "section [%2d] '%s': more than one BASE definition\n"
+msgstr ""
+
+#: src/elflint.c:3023
+#, c-format
+msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
+msgstr ""
+
+#: src/elflint.c:3029
+#, c-format
+msgid "section [%2d] '%s': entry %d has unknown flag\n"
+msgstr ""
+
+#: src/elflint.c:3053
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid name reference\n"
+msgstr ""
+
+#: src/elflint.c:3060
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
+msgstr ""
+
+#: src/elflint.c:3069
+#, c-format
+msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
+msgstr ""
+
+#: src/elflint.c:3088
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:3103
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:3125
+#, c-format
+msgid "section [%2d] '%s': no BASE definition\n"
+msgstr ""
+
+#: src/elflint.c:3141
+#, c-format
+msgid "section [%2d] '%s': unknown parent version '%s'\n"
+msgstr ""
+
+#: src/elflint.c:3154
+#, c-format
+msgid "section [%2d] '%s': empty object attributes section\n"
+msgstr ""
+
+#: src/elflint.c:3175
+#, c-format
+msgid "section [%2d] '%s': unrecognized attribute format\n"
+msgstr ""
+
+#: src/elflint.c:3191
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: zero length field in attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3200
+#, c-format
+msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3212
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
+msgstr ""
+
+#: src/elflint.c:3229
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
+msgstr ""
+
+#: src/elflint.c:3238
+#, c-format
+msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3247
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
+msgstr ""
+
+#: src/elflint.c:3260
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
+msgstr ""
+
+#: src/elflint.c:3271
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
+msgstr ""
+
+#: src/elflint.c:3289
+#, c-format
+msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
+msgstr ""
+
+#: src/elflint.c:3300
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
+msgstr ""
+
+#: src/elflint.c:3313
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
+msgstr ""
+
+#: src/elflint.c:3317
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:3327
+#, c-format
+msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
+msgstr ""
+
+#: src/elflint.c:3333
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3422
+#, c-format
+msgid "cannot get section header of zeroth section\n"
+msgstr ""
+
+#: src/elflint.c:3426
+#, c-format
+msgid "zeroth section has nonzero name\n"
+msgstr ""
+
+#: src/elflint.c:3428
+#, c-format
+msgid "zeroth section has nonzero type\n"
+msgstr ""
+
+#: src/elflint.c:3430
+#, c-format
+msgid "zeroth section has nonzero flags\n"
+msgstr ""
+
+#: src/elflint.c:3432
+#, c-format
+msgid "zeroth section has nonzero address\n"
+msgstr ""
+
+#: src/elflint.c:3434
+#, c-format
+msgid "zeroth section has nonzero offset\n"
+msgstr ""
+
+#: src/elflint.c:3436
+#, c-format
+msgid "zeroth section has nonzero align value\n"
+msgstr ""
+
+#: src/elflint.c:3438
+#, c-format
+msgid "zeroth section has nonzero entry size value\n"
+msgstr ""
+
+#: src/elflint.c:3441
+#, c-format
+msgid ""
+"zeroth section has nonzero size value while ELF header has nonzero shnum "
+"value\n"
+msgstr ""
+
+#: src/elflint.c:3445
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in shstrndx\n"
+msgstr ""
+
+#: src/elflint.c:3449
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in phnum\n"
+msgstr ""
+
+#: src/elflint.c:3466
+#, c-format
+msgid "cannot get section header for section [%2zu] '%s': %s\n"
+msgstr ""
+
+#: src/elflint.c:3475
+#, c-format
+msgid "section [%2zu]: invalid name\n"
+msgstr ""
+
+#: src/elflint.c:3502
+#, c-format
+msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3518
+#, c-format
+msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3535
+#, c-format
+msgid ""
+"section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3553
+#, c-format
+msgid "section [%2zu] '%s' present in object file\n"
+msgstr ""
+
+#: src/elflint.c:3559 src/elflint.c:3591
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
+msgstr ""
+
+#: src/elflint.c:3564 src/elflint.c:3596
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
+"segments\n"
+msgstr ""
+
+#: src/elflint.c:3572
+#, c-format
+msgid ""
+"section [%2zu] '%s' is extension section index table in non-object file\n"
+msgstr ""
+
+#: src/elflint.c:3615
+#, c-format
+msgid "section [%2zu] '%s': size not multiple of entry size\n"
+msgstr ""
+
+#: src/elflint.c:3620
+#, c-format
+msgid "cannot get section header\n"
+msgstr ""
+
+#: src/elflint.c:3630
+#, c-format
+msgid "section [%2zu] '%s' has unsupported type %d\n"
+msgstr ""
+
+#: src/elflint.c:3644
+#, c-format
+msgid ""
+"section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:3651
+#, c-format
+msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:3659
+#, c-format
+msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
+msgstr ""
+
+#: src/elflint.c:3667
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in link value\n"
+msgstr ""
+
+#: src/elflint.c:3672
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in info value\n"
+msgstr ""
+
+#: src/elflint.c:3679
+#, c-format
+msgid "section [%2zu] '%s': strings flag set without merge flag\n"
+msgstr ""
+
+#: src/elflint.c:3684
+#, c-format
+msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
+msgstr ""
+
+#: src/elflint.c:3702
+#, c-format
+msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
+msgstr ""
+
+#: src/elflint.c:3711
+#, c-format
+msgid "section [%2zu] '%s' is both executable and writable\n"
+msgstr ""
+
+#: src/elflint.c:3738
+#, c-format
+msgid ""
+"section [%2zu] '%s' not fully contained in segment of program header entry %"
+"d\n"
+msgstr ""
+
+#: src/elflint.c:3746
+#, 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:3755
+#, 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:3766
+#, c-format
+msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
+msgstr ""
+
+#: src/elflint.c:3776
+#, c-format
+msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
+msgstr ""
+
+#: src/elflint.c:3786
+#, c-format
+msgid ""
+"section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:3792
+#, 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:3800
+#, c-format
+msgid ""
+"section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
+msgstr ""
+
+#: src/elflint.c:3851
+#, c-format
+msgid "more than one version symbol table present\n"
+msgstr ""
+
+#: src/elflint.c:3874
+#, c-format
+msgid "INTERP program header entry but no .interp section\n"
+msgstr ""
+
+#: src/elflint.c:3885
+#, c-format
+msgid ""
+"loadable segment [%u] is executable but contains no executable sections\n"
+msgstr ""
+
+#: src/elflint.c:3891
+#, c-format
+msgid "loadable segment [%u] is writable but contains no writable sections\n"
+msgstr ""
+
+#: src/elflint.c:3902
+#, c-format
+msgid ""
+"no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
+"exist\n"
+msgstr ""
+
+#: src/elflint.c:3915
+#, c-format
+msgid "duplicate version index %d\n"
+msgstr ""
+
+#: src/elflint.c:3929
+#, c-format
+msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
+msgstr ""
+
+#: src/elflint.c:3978
+#, c-format
+msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:3982
+#, c-format
+msgid ""
+"section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4005
+#, c-format
+msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4009
+#, c-format
+msgid ""
+"section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4026
+#, c-format
+msgid "phdr[%d]: no note entries defined for the type of file\n"
+msgstr ""
+
+#: src/elflint.c:4045
+#, c-format
+msgid "phdr[%d]: cannot get content of note section: %s\n"
+msgstr ""
+
+#: src/elflint.c:4048
+#, c-format
+msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
+msgstr ""
+
+#: src/elflint.c:4069
+#, c-format
+msgid "section [%2d] '%s': no note entries defined for the type of file\n"
+msgstr ""
+
+#: src/elflint.c:4076
+#, c-format
+msgid "section [%2d] '%s': cannot get content of note section\n"
+msgstr ""
+
+#: src/elflint.c:4079
+#, c-format
+msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
+msgstr ""
+
+#: src/elflint.c:4097
+#, c-format
+msgid ""
+"only executables, shared objects, and core files can have program headers\n"
+msgstr ""
+
+#: src/elflint.c:4112
+#, c-format
+msgid "cannot get program header entry %d: %s\n"
+msgstr ""
+
+#: src/elflint.c:4121
+#, c-format
+msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:4132
+#, c-format
+msgid "more than one INTERP entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4140
+#, c-format
+msgid "more than one TLS entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4147
+#, c-format
+msgid "static executable cannot have dynamic sections\n"
+msgstr ""
+
+#: src/elflint.c:4161
+#, c-format
+msgid "dynamic section reference in program header has wrong offset\n"
+msgstr ""
+
+#: src/elflint.c:4164
+#, c-format
+msgid "dynamic section size mismatch in program and section header\n"
+msgstr ""
+
+#: src/elflint.c:4174
+#, c-format
+msgid "more than one GNU_RELRO entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4195
+#, c-format
+msgid "loadable segment GNU_RELRO applies to is not writable\n"
+msgstr ""
+
+#: src/elflint.c:4198
+#, c-format
+msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
+msgstr ""
+
+#: src/elflint.c:4206 src/elflint.c:4229
+#, c-format
+msgid "%s segment not contained in a loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:4235
+#, c-format
+msgid "program header offset in ELF header and PHDR entry do not match"
+msgstr ""
+
+#: src/elflint.c:4259
+#, c-format
+msgid "call frame search table reference in program header has wrong offset\n"
+msgstr ""
+
+#: src/elflint.c:4262
+#, c-format
+msgid "call frame search table size mismatch in program and section header\n"
+msgstr ""
+
+#: src/elflint.c:4275
+#, c-format
+msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
+msgstr ""
+
+#: src/elflint.c:4283
+#, c-format
+msgid "call frame search table must be allocated\n"
+msgstr ""
+
+#: src/elflint.c:4286
+#, c-format
+msgid "section [%2zu] '%s' must be allocated\n"
+msgstr ""
+
+#: src/elflint.c:4290
+#, c-format
+msgid "call frame search table must not be writable\n"
+msgstr ""
+
+#: src/elflint.c:4293
+#, c-format
+msgid "section [%2zu] '%s' must not be writable\n"
+msgstr ""
+
+#: src/elflint.c:4298
+#, c-format
+msgid "call frame search table must not be executable\n"
+msgstr ""
+
+#: src/elflint.c:4301
+#, c-format
+msgid "section [%2zu] '%s' must not be executable\n"
+msgstr ""
+
+#: src/elflint.c:4312
+#, c-format
+msgid "program header entry %d: file size greater than memory size\n"
+msgstr ""
+
+#: src/elflint.c:4319
+#, c-format
+msgid "program header entry %d: alignment not a power of 2\n"
+msgstr ""
+
+#: src/elflint.c:4322
+#, c-format
+msgid ""
+"program header entry %d: file offset and virtual address not module of "
+"alignment\n"
+msgstr ""
+
+#: src/elflint.c:4335
+#, 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:4369
+#, c-format
+msgid "cannot read ELF header: %s\n"
+msgstr ""
+
+#: src/elflint.c:4395
+#, c-format
+msgid "text relocation flag set but not needed\n"
+msgstr ""
+
+#: src/findtextrel.c:70
+msgid "Input Selection:"
+msgstr ""
+
+#: src/findtextrel.c:71
+msgid "Prepend PATH to all file names"
+msgstr ""
+
+#: src/findtextrel.c:73
+msgid "Use PATH as root of debuginfo hierarchy"
+msgstr ""
+
+#: src/findtextrel.c:80
+msgid "Locate source of text relocations in FILEs (a.out by default)."
+msgstr ""
+
+#: src/findtextrel.c:84 src/nm.c:111 src/objdump.c:80 src/size.c:92
+#: src/strings.c:92 src/strip.c:97
+msgid "[FILE...]"
+msgstr "[ふぁいる...]"
+
+#: src/findtextrel.c:246
+#, c-format
+msgid "cannot get ELF header '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:257
+#, c-format
+msgid "'%s' is not a DSO or PIE"
+msgstr ""
+
+#: src/findtextrel.c:274
+#, c-format
+msgid "getting get section header of section %zu: %s"
+msgstr ""
+
+#: src/findtextrel.c:292
+#, c-format
+msgid "cannot read dynamic section: %s"
+msgstr ""
+
+#: src/findtextrel.c:307
+#, c-format
+msgid "no text relocations reported in '%s'"
+msgstr ""
+
+#: src/findtextrel.c:319
+#, c-format
+msgid "while reading ELF file"
+msgstr ""
+
+#: src/findtextrel.c:328 src/findtextrel.c:345
+#, c-format
+msgid "cannot get program header index at offset %d: %s"
+msgstr ""
+
+#: src/findtextrel.c:397
+#, c-format
+msgid "cannot get section header of section %Zu: %s"
+msgstr ""
+
+#: src/findtextrel.c:409
+#, c-format
+msgid "cannot get symbol table section %zu in '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:429 src/findtextrel.c:452
+#, c-format
+msgid "cannot get relocation at index %d in section %zu in '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:517
+#, c-format
+msgid "%s not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:570
+#, c-format
+msgid ""
+"the file containing the function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:577 src/findtextrel.c:597
+#, c-format
+msgid ""
+"the file containing the function '%s' might not be compiled with -fpic/-"
+"fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:585
+#, c-format
+msgid ""
+"either the file containing the function '%s' or the file containing the "
+"function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:605
+#, c-format
+msgid ""
+"a relocation modifies memory at offset %llu in a write-protected segment\n"
+msgstr ""
+
+#: src/i386_ld.c:210
+#, c-format
+msgid "cannot allocate PLT section: %s"
+msgstr "PLT セクションを割り当てられません: %s"
+
+#: src/i386_ld.c:232
+#, c-format
+msgid "cannot allocate PLTREL section: %s"
+msgstr "PLTREL セクションを割り当てられません: %s"
+
+#: src/i386_ld.c:253
+#, c-format
+msgid "cannot allocate GOT section: %s"
+msgstr "GOT セクションを割り当てられません: %s"
+
+#: src/i386_ld.c:274
+#, c-format
+msgid "cannot allocate GOTPLT section: %s"
+msgstr "GOTPLT セクションを割り当てられません: %s"
+
+#: src/i386_ld.c:661
+#, c-format
+msgid "initial-executable TLS relocation cannot be used "
+msgstr "最初に実行される TLS リロケーションが使用されません "
+
+#: src/ld.c:87
+msgid "Input File Control:"
+msgstr "入力ファイル制御:"
+
+#: src/ld.c:89
+msgid "Include whole archives in the output from now on."
+msgstr "今から出力中の全アーカイブを含める。"
+
+#: src/ld.c:91
+#, fuzzy
+msgid "Stop including the whole archives in the output."
+msgstr "出力中の全アーカイブを含めるのを止める。"
+
+#: src/ld.c:92 src/ld.c:106 src/ld.c:184
+msgid "FILE"
+msgstr "ふぁいる"
+
+#: src/ld.c:93
+msgid "Start a group."
+msgstr "グループの開始。"
+
+#: src/ld.c:94
+msgid "End a group."
+msgstr "グループの終了。"
+
+#: src/ld.c:95
+msgid "PATH"
+msgstr "パス"
+
+#: src/ld.c:96
+msgid "Add PATH to list of directories files are searched in."
+msgstr "ファイルが検索されるディレクトリーの一覧にPATHを追加する。"
+
+#: src/ld.c:98
+msgid "Only set DT_NEEDED for following dynamic libs if actually used"
+msgstr ""
+"実際に使用されるのなら以下のダイナミックライブラリーに DT_NEEDED を設定する"
+
+#: src/ld.c:100
+msgid "Always set DT_NEEDED for following dynamic libs"
+msgstr "以下のダイナミックライブラリーに常に DT_NEEDED を設定する"
+
+#: src/ld.c:102
+msgid "Ignore LD_LIBRARY_PATH environment variable."
+msgstr "LD_LIBRARY_PATH 環境変数を無視する。"
+
+#: src/ld.c:105
+msgid "Output File Control:"
+msgstr "出力ファイル制御:"
+
+#: src/ld.c:106
+msgid "Place output in FILE."
+msgstr "出力を ふぁいる に置く。"
+
+#: src/ld.c:109
+msgid "Object is marked to not use default search path at runtime."
+msgstr "オブジェクトは実行時に省略値の検索パスを使わないと記されています。"
+
+#: src/ld.c:111
+msgid "Same as --whole-archive."
+msgstr "--whole-archive と同じ。"
+
+#: src/ld.c:112
+msgid ""
+"Default rules of extracting from archive; weak references are not enough."
+msgstr ""
+"アーカイブから抽出する時の省略値の規則: 弱い参照では十分ではありません。"
+
+#: src/ld.c:116
+msgid "Weak references cause extraction from archive."
+msgstr "弱い参照はアーカイブから抽出します。"
+
+#: src/ld.c:118
+msgid "Allow multiple definitions; first is used."
+msgstr "複数の定義を認めます: 最初を使用します。"
+
+#: src/ld.c:120
+msgid "Disallow/allow undefined symbols in DSOs."
+msgstr "DSO 中の未定義のシンボルを認めない/認める。"
+
+#: src/ld.c:123
+msgid "Object requires immediate handling of $ORIGIN."
+msgstr "オブジェクトには %ORIGIN の直接ハンドルが必要です。"
+
+#: src/ld.c:125
+msgid "Relocation will not be processed lazily."
+msgstr "リロケーションは遅延処理されません。"
+
+#: src/ld.c:127
+msgid "Object cannot be unloaded at runtime."
+msgstr "オプションは実行時にはアンロードできません。"
+
+#: src/ld.c:129
+msgid "Mark object to be initialized first."
+msgstr "オブジェクトは最初に初期化されると記します。"
+
+#: src/ld.c:131
+msgid "Enable/disable lazy-loading flag for following dependencies."
+msgstr "以下の依存性のための遅延ロードを有効/無効にします。"
+
+#: src/ld.c:133
+msgid "Mark object as not loadable with 'dlopen'."
+msgstr "'dlopen' でロードできないと記します。"
+
+#: src/ld.c:135
+msgid "Ignore/record dependencies on unused DSOs."
+msgstr "使用されない DSO の依存性を無視/記録します。"
+
+#: src/ld.c:137
+msgid "Generated DSO will be a system library."
+msgstr "生成された DSO はシステムライブラリーになります。"
+
+#: src/ld.c:138
+msgid "ADDRESS"
+msgstr "アドレス"
+
+#: src/ld.c:138
+msgid "Set entry point address."
+msgstr "入口点アドレスを設定します。"
+
+#: src/ld.c:141
+msgid "Do not link against shared libraries."
+msgstr "共用ライブラリーに対してリンクを設定してはいけません。"
+
+#: src/ld.c:144
+msgid "Prefer linking against shared libraries."
+msgstr "共用ライブラリーに対してリンクを好みます。"
+
+#: src/ld.c:145
+msgid "Export all dynamic symbols."
+msgstr "全ダイナミックシンボルをエクスポートします。"
+
+#: src/ld.c:146
+msgid "Strip all symbols."
+msgstr "全シンボルを取り除きます。"
+
+#: src/ld.c:147
+msgid "Strip debugging symbols."
+msgstr "デバッグシンボルを取り除きます。"
+
+#: src/ld.c:149
+msgid "Assume pagesize for the target system to be SIZE."
+msgstr "ターゲットシステムのページサイズを SIZE と見做します。"
+
+#: src/ld.c:151
+msgid "Set runtime DSO search path."
+msgstr "実行時 DSO 検索パスを設定します。"
+
+#: src/ld.c:154
+msgid "Set link time DSO search path."
+msgstr "リンク時 DSO 検索パスを設定します。"
+
+#: src/ld.c:155
+msgid "Generate dynamic shared object."
+msgstr "動的共用オブジェクトを生成します。"
+
+#: src/ld.c:156
+msgid "Generate relocatable object."
+msgstr "リロケータブルオブジェクトを生成します。"
+
+#: src/ld.c:159
+msgid "Causes symbol not assigned to a version be reduced to local."
+msgstr "バージョンが指定されていないシンボルはローカルに減少します。"
+
+#: src/ld.c:160
+msgid "Remove unused sections."
+msgstr "使用されていないセクションを取り除きます。"
+
+#: src/ld.c:163
+msgid "Don't remove unused sections."
+msgstr "利用されていていセクションを取り除いてはいけません。"
+
+#: src/ld.c:164
+msgid "Set soname of shared object."
+msgstr "共用ライブラリーの so 名を設定します。"
+
+#: src/ld.c:165
+msgid "Set the dynamic linker name."
+msgstr "動的リンカーの名前を設定します。"
+
+#: src/ld.c:168
+msgid "Add/suppress addition indentifying link-editor to .comment section."
+msgstr ""
+".comment セクションにリンクエディターを識別する追加情報を追加/抑止します。"
+
+#: src/ld.c:171
+msgid "Create .eh_frame_hdr section"
+msgstr ".eh_frame_hdr セクションを生成します"
+
+#: src/ld.c:173
+msgid "Set hash style to sysv, gnu or both."
+msgstr "ハッシュ形式を sysvか、gnu、両方のどれかに設定します。"
+
+#: src/ld.c:175
+msgid "Generate build ID note (md5, sha1 (default), uuid)."
+msgstr "ビルド ID ノート (md5、sh1 (省略値)、uuid) を生成します。"
+
+#: src/ld.c:177
+msgid "Linker Operation Control:"
+msgstr "リンカー操作制御:"
+
+#: src/ld.c:178
+msgid "Verbose messages."
+msgstr "饒舌メッセージ。"
+
+#: src/ld.c:179
+msgid "Trace file opens."
+msgstr "ファイルのオープンを追跡します。"
+
+#: src/ld.c:181
+msgid "Trade speed for less memory usage"
+msgstr "速度と引き換えにメモリー使用量を減らします"
+
+#: src/ld.c:182
+msgid "LEVEL"
+msgstr "れべる"
+
+#: src/ld.c:183
+msgid "Set optimization level to LEVEL."
+msgstr "最適化レベルを れべる に設定します。"
+
+#: src/ld.c:184
+msgid "Use linker script in FILE."
+msgstr "ふぁいる でリンカースクリプトを使用します。"
+
+#: src/ld.c:187
+msgid "Select to get parser debug information"
+msgstr "パーサーのデバッグ情報を得るように選択します"
+
+#: src/ld.c:190
+msgid "Read version information from FILE."
+msgstr "ふぁいる からバージョン情報を読みます。"
+
+#: src/ld.c:191
+msgid "Set emulation to NAME."
+msgstr "エミュレーションを なまえ に設定します。"
+
+#: src/ld.c:197
+msgid "Combine object and archive files."
+msgstr "オブジェクトとアーカイブファイルを一体化します。"
+
+#: src/ld.c:200
+msgid "[FILE]..."
+msgstr "[ふぁいる]..."
+
+#: src/ld.c:333
+#, c-format
+msgid "At least one input file needed"
+msgstr "少なくとも 1 つの入力ファイルが必要です"
+
+#: src/ld.c:349
+#, c-format
+msgid "error while preparing linking"
+msgstr "リンクの準備中にエラー"
+
+#: src/ld.c:356
+#, c-format
+msgid "cannot open linker script '%s'"
+msgstr "リンカースクリプト '%s' を開けません"
+
+#: src/ld.c:397
+#, c-format
+msgid "-( without matching -)"
+msgstr "-( 何も一致しない -)"
+
+#: src/ld.c:572 src/ld.c:610
+#, c-format
+msgid "only one option of -G and -r is allowed"
+msgstr "-G か -r のどちらかひとつのオプションだけ認められます"
+
+#: src/ld.c:594
+#, c-format
+msgid "more than one '-m' parameter"
+msgstr "-m パラメーターが1つを越えています"
+
+#: src/ld.c:604 src/ld.c:1013
+#, c-format
+msgid "unknown option `-%c %s'"
+msgstr "不明なオプション `%c %s'"
+
+#: src/ld.c:646
+#, c-format
+msgid "invalid page size value '%s': ignored"
+msgstr "不当なページサイズ値 '%s': 無視しました"
+
+#: src/ld.c:687
+#, c-format
+msgid "invalid hash style '%s'"
+msgstr "不当なハッシュスタイル '%s'"
+
+#: src/ld.c:697
+#, c-format
+msgid "invalid build-ID style '%s'"
+msgstr "不当なビルド-ID スタイル '%s'"
+
+#: src/ld.c:785
+#, c-format
+msgid "More than one output file name given."
+msgstr "ひとつを越える出力ファイル名が与えられました。"
+
+#: src/ld.c:802
+#, c-format
+msgid "Invalid optimization level `%s'"
+msgstr "不当な最適化レベル `%s'"
+
+#: src/ld.c:850
+#, c-format
+msgid "nested -( -) groups are not allowed"
+msgstr "ネストされた -( -) グループは認められません"
+
+#: src/ld.c:869
+#, c-format
+msgid "-) without matching -("
+msgstr "対応する -( がない -)"
+
+#: src/ld.c:1046
+#, c-format
+msgid "unknown option '-%c %s'"
+msgstr "不明なオプション '-%c %s'"
+
+#: src/ld.c:1150
+#, c-format
+msgid "could not find input file to determine output file format"
+msgstr "出力ファイル形式を決定するための入力ファイルが見つかりません"
+
+#: src/ld.c:1152
+#, c-format
+msgid "try again with an appropriate '-m' parameter"
+msgstr "適切な '-m' パラメーターを付けて再試行してください"
+
+#: src/ld.c:1446
+#, c-format
+msgid "cannot read version script '%s'"
+msgstr "バージョンスクリプト '%s' を読めません"
+
+#: src/ld.c:1512 src/ld.c:1551
+#, c-format
+msgid "duplicate definition of '%s' in linker script"
+msgstr "リンカースクリプトに '%s' の重複定義"
+
+#: src/ldgeneric.c:209 src/ldgeneric.c:5151
+#, c-format
+msgid "cannot create string table"
+msgstr "文字列テーブルを生成できません"
+
+#: src/ldgeneric.c:255
+#, c-format
+msgid "cannot load ld backend library '%s': %s"
+msgstr "ld バックエンドライブラリー '%s' をロードできません: %s"
+
+#: src/ldgeneric.c:265
+#, c-format
+msgid "cannot find init function in ld backend library '%s': %s"
+msgstr "ld バックエンドライブラリー '%s' に初期化機能が見つかりません: %s "
+
+#: src/ldgeneric.c:310
+#, c-format
+msgid "%s listed more than once as input"
+msgstr "入力に %s が 1回を越えて書かれています"
+
+#: src/ldgeneric.c:424
+#, c-format
+msgid "%s (for -l%s)\n"
+msgstr "%s (-l%s 用)\n"
+
+#: src/ldgeneric.c:425
+#, c-format
+msgid "%s (for DT_NEEDED %s)\n"
+msgstr "%s (DT_NEEDED %s 用)\n"
+
+#: src/ldgeneric.c:573
+#, c-format
+msgid "Warning: type of `%s' changed from %s in %s to %s in %s"
+msgstr ""
+"警告: `%1$s' のタイプが %3$s の %2$s から %5$s の %4$s に変更されました"
+
+#: src/ldgeneric.c:586
+#, c-format
+msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
+msgstr ""
+"警告: `%1$s の大きさが %3$s の %2$<PRIu64> から %5$s の %4$<PRIu64> に変更さ"
+"れました"
+
+#: src/ldgeneric.c:661 src/ldgeneric.c:1122 src/readelf.c:629 src/strip.c:543
+#, c-format
+msgid "cannot determine number of sections: %s"
+msgstr "セクション数を決定できません: %s"
+
+#: src/ldgeneric.c:677
+#, c-format
+msgid "(%s+%#<PRIx64>): multiple definition of %s `%s'\n"
+msgstr "(%s+%#<PRIx64>): %s の複数定義 '%s'\n"
+
+#: src/ldgeneric.c:700
+#, c-format
+msgid "(%s+%#<PRIx64>): first defined here\n"
+msgstr "(%s+%#<PRIx64>): 最初の定義はここ\n"
+
+#: src/ldgeneric.c:819
+#, c-format
+msgid "%s: cannot get section group data: %s"
+msgstr "%s: セクショングループデータを得られません: %s"
+
+#: src/ldgeneric.c:840
+#, c-format
+msgid "%s: section '%s' with group flag set does not belong to any group"
+msgstr ""
+"%s: グループフラグが設定されているセクション '%s' はどのグループにも属してい"
+"ません"
+
+#: src/ldgeneric.c:885
+#, c-format
+msgid "%s: section [%2d] '%s' is not in the correct section group"
+msgstr "%s: セクション [%2d] '%s& は正しいセクショングループに入っていません"
+
+#: src/ldgeneric.c:1156 src/ldgeneric.c:1413 src/ldgeneric.c:1422
+#: src/ldgeneric.c:1481 src/ldgeneric.c:1490 src/ldgeneric.c:1753
+#: src/ldgeneric.c:2005
+#, c-format
+msgid "%s: invalid ELF file (%s:%d)\n"
+msgstr "%s: 不当な ELF ファイル (%s:%d)\n"
+
+#: src/ldgeneric.c:1250
+#, c-format
+msgid "%s: only files of type ET_REL might contain section groups"
+msgstr "%s: タイプ ET_REL のファイルのみセクショングループを含むことができます"
+
+#: src/ldgeneric.c:1302
+#, c-format
+msgid "%s: cannot determine signature of section group [%2zd] '%s': %s"
+msgstr "%s: セクショングループ [%2zd] '%s' の署名を決定できません: %s"
+
+#: src/ldgeneric.c:1314
+#, c-format
+msgid "%s: cannot get content of section group [%2zd] '%s': %s'"
+msgstr "%s: セクショングループ [%2zd] '%s' の内容を得られません: %s'"
+
+#: src/ldgeneric.c:1328
+#, c-format
+msgid ""
+"%s: group member %zu of section group [%2zd] '%s' has too high index: %"
+"<PRIu32>"
+msgstr ""
+"%1$s: セクショングループ [%3$2zd] '%4$s' のグループメンバー %2$zu は大きすぎ"
+"るインデックスを持っています: %5$<PRIu32>"
+
+#: src/ldgeneric.c:1350
+#, c-format
+msgid "%s: section '%s' has unknown type: %d"
+msgstr "%s: セクション '%s' は不明なタイプを持っています: %d"
+
+#: src/ldgeneric.c:1729
+#, c-format
+msgid "cannot get descriptor for ELF file (%s:%d): %s\n"
+msgstr "ELF ファイル (%s:%d) のための記述子を得られません: %s\n"
+
+#: src/ldgeneric.c:1899
+#, c-format
+msgid "cannot read archive `%s': %s"
+msgstr "アーカイブ `%s' を読めません: %s"
+
+#: src/ldgeneric.c:2020
+#, c-format
+msgid "file of type %s cannot be linked in\n"
+msgstr "%s のファイルタイプがリンクされていません\n"
+
+#: src/ldgeneric.c:2032
+#, c-format
+msgid "%s: input file incompatible with ELF machine type %s\n"
+msgstr "%s: 入力ファイルは ELF マシンタイプ %s と互換性がありません\n"
+
+#: src/ldgeneric.c:2044
+#, c-format
+msgid "%s: cannot get section header string table index: %s\n"
+msgstr "%s: セクションヘッダー文字列テーブルインデックスを得られません: %s\n"
+
+#: src/ldgeneric.c:2073
+#, c-format
+msgid "cannot use DSO '%s' when generating relocatable object file"
+msgstr "リロケータブルオブジェクトファイル生成時に DSO '%s' を使えません"
+
+#: src/ldgeneric.c:2158
+#, c-format
+msgid "input file '%s' ignored"
+msgstr "入力ファイル '%s' を無視しました"
+
+#: src/ldgeneric.c:2372
+#, c-format
+msgid "undefined symbol `%s' in %s"
+msgstr "%2$s 中に未定義のシンボル `%1$s'"
+
+#: src/ldgeneric.c:2702
+#, c-format
+msgid "cannot create ELF descriptor for output file: %s"
+msgstr "出力ファイル用の ELF 記述子を生成できません: %s"
+
+#: src/ldgeneric.c:2709
+#, c-format
+msgid "could not create ELF header for output file: %s"
+msgstr "出力ファイル用の ELF ヘッダーを生成できませんでした: %s"
+
+#: src/ldgeneric.c:3224 src/ldgeneric.c:3294 src/ldgeneric.c:3330
+#: src/ldgeneric.c:4457 src/ldgeneric.c:4506 src/ldgeneric.c:4538
+#: src/ldgeneric.c:4773 src/ldgeneric.c:4828 src/ldgeneric.c:5075
+#: src/ldgeneric.c:5131 src/ldgeneric.c:5600 src/ldgeneric.c:5612
+#, c-format
+msgid "cannot create section for output file: %s"
+msgstr "出力ファイル用のセクションを生成できません: %s"
+
+#: src/ldgeneric.c:3444
+#, c-format
+msgid "address computation expression contains variable '%s'"
+msgstr "アドレス計算式が変数 '%s' を含んでいます"
+
+#: src/ldgeneric.c:3489
+#, c-format
+msgid ""
+"argument '%<PRIuMAX>' of ALIGN in address computation expression is no power "
+"of two"
+msgstr ""
+"アドレス計算式中の ALIGN のパラメーター %<PRIuMAX> が 2 の累乗ではありません"
+
+#: src/ldgeneric.c:3684
+#, c-format
+msgid "cannot find entry symbol '%s': defaulting to %#0*<PRIx64>"
+msgstr ""
+"エントリーシンボル '%s' が見つかりません: デフォルトの %#0*<PRIx64> にします"
+
+#: src/ldgeneric.c:3690
+#, c-format
+msgid "no entry symbol specified: defaulting to %#0*<PRIx64>"
+msgstr ""
+"エントリーシンボルが指定されていません: デフォルトの %#0*<PRIx64> にします"
+
+#: src/ldgeneric.c:3920
+#, c-format
+msgid "cannot create GNU hash table section for output file: %s"
+msgstr "出力ファイル用の GNU ハッシュテーブルセクションを生成できません: %s"
+
+#: src/ldgeneric.c:4071
+#, c-format
+msgid "cannot create hash table section for output file: %s"
+msgstr "出力ファイル用のハッシュテーブルセクションを生成できません: %s"
+
+#: src/ldgeneric.c:4114
+#, c-format
+msgid "cannot create build ID section: %s"
+msgstr "ビルド ID セクションを生成できません: %s"
+
+#: src/ldgeneric.c:4191
+#, c-format
+msgid "cannot convert section data to file format: %s"
+msgstr "セクションデータをファイル形式に変換できません: %s"
+
+#: src/ldgeneric.c:4200
+#, c-format
+msgid "cannot convert section data to memory format: %s"
+msgstr "セクションデータをメモリー形式に変換できません: %s"
+
+#: src/ldgeneric.c:4261
+#, c-format
+msgid "cannot read enough data for UUID"
+msgstr "UUID に十分なデータを読めません"
+
+#: src/ldgeneric.c:4358 src/ldgeneric.c:4379 src/ldgeneric.c:4408
+#: src/ldgeneric.c:6062
+#, c-format
+msgid "cannot create symbol table for output file: %s"
+msgstr "出力ファイル用のシンボルテーブルを生成できません: %s"
+
+#: src/ldgeneric.c:5300 src/ldgeneric.c:5852
+#, c-format
+msgid "section index too large in dynamic symbol table"
+msgstr "動的シンボルテーブルのセクションインデックスが大きすぎます"
+
+#: src/ldgeneric.c:5745
+#, c-format
+msgid "cannot create versioning section: %s"
+msgstr "バージョニングセクションを生成できません: %s"
+
+#: src/ldgeneric.c:5818
+#, c-format
+msgid "cannot create dynamic symbol table for output file: %s"
+msgstr "出力ファイル用の動的シンボルテーブルを生成できません: %s"
+
+#: src/ldgeneric.c:5994
+#, c-format
+msgid "cannot create versioning data: %s"
+msgstr "バージョニングデータを生成できません: %s"
+
+#: src/ldgeneric.c:6094 src/ldgeneric.c:6107 src/ldgeneric.c:6171
+#: src/ldgeneric.c:6179
+#, c-format
+msgid "cannot create section header string section: %s"
+msgstr "セクションヘッダー文字列セクションを生成できません: %s"
+
+#: src/ldgeneric.c:6101
+#, c-format
+msgid "cannot create section header string section"
+msgstr "セクションヘッダー文字列セクションを生成できません"
+
+#: src/ldgeneric.c:6259
+#, c-format
+msgid "cannot create program header: %s"
+msgstr "プログラムヘッダーを生成できません: %s"
+
+#: src/ldgeneric.c:6267
+#, c-format
+msgid "while determining file layout: %s"
+msgstr "ファイルレイアウトを決定中: %s"
+
+#: src/ldgeneric.c:6388
+#, c-format
+msgid "internal error: non-nobits section follows nobits section"
+msgstr "内部エラー: 非 nobits セクションが nobits セクションに続きます"
+
+#: src/ldgeneric.c:6925
+#, c-format
+msgid "cannot get header of 0th section: %s"
+msgstr "0番目のセクションのヘッダーを得られません: %s"
+
+#: src/ldgeneric.c:6941 src/unstrip.c:1808
+#, c-format
+msgid "cannot update ELF header: %s"
+msgstr "ELF ヘッダーを更新できません: %s"
+
+#: src/ldgeneric.c:6972
+#, c-format
+msgid "linker backend didn't specify function to relocate section"
+msgstr ""
+"リンカーバックエンドがセクションをリロケートするための機能を指定していません"
+
+#: src/ldgeneric.c:6984
+#, c-format
+msgid "while writing output file: %s"
+msgstr "出力ファイルに書込み中: %s"
+
+#: src/ldgeneric.c:6989
+#, c-format
+msgid "while finishing output file: %s"
+msgstr "出力ファイルの仕上げ中: %s"
+
+#: src/ldgeneric.c:6995
+#, c-format
+msgid "cannot stat output file"
+msgstr "出力ファイルを stat できません"
+
+#: src/ldgeneric.c:7011
+#, c-format
+msgid "WARNING: temporary output file overwritten before linking finished"
+msgstr "警告: リンクを仕上げる前に一時出力ファイルが上書きされました"
+
+#: src/ldgeneric.c:7064 src/ldgeneric.c:7075 src/ldgeneric.c:7086
+#: src/ldgeneric.c:7097 src/ldgeneric.c:7116 src/ldgeneric.c:7129
+#: src/ldgeneric.c:7141
+#, c-format
+msgid "no machine specific '%s' implementation"
+msgstr "マシン固有の '%s' 実装はありません"
+
+#: src/ldscript.y:178
+msgid "mode for segment invalid\n"
+msgstr "セグメント用のモードが不当です\n"
+
+#: src/ldscript.y:465
+#, c-format
+msgid "while reading version script '%s': %s at line %d"
+msgstr "バージョンスクリプト '%1$s' 読込み中: %3$d 行目の %2$s"
+
+#: src/ldscript.y:466
+#, c-format
+msgid "while reading linker script '%s': %s at line %d"
+msgstr "リンカースクリプト '%1$s' 読込み中: %3$d 行目の %2$s"
+
+#: src/ldscript.y:745
+#, fuzzy, c-format
+msgid "symbol '%s' is declared both local and global for unnamed version"
+msgstr "名前なしバージョン用のローカルとグローバルで宣言されたシンボル '%s'"
+
+#: src/ldscript.y:747
+#, fuzzy, c-format
+msgid "symbol '%s' is declared both local and global for version '%s'"
+msgstr "バージョン '%2$s' 用のローカルとグローバルで宣言されたシンボル '%1$s'"
+
+#: src/ldscript.y:767 src/ldscript.y:774
+#, c-format
+msgid "default visibility set as local and global"
+msgstr "ローカルとグローバルに設定されたデフォルトの可視性"
+
+#: src/nm.c:74 src/strip.c:73
+msgid "Output selection:"
+msgstr "出力選択:"
+
+#: src/nm.c:75
+msgid "Display debugger-only symbols"
+msgstr "デバッガー専用シンボルを表示"
+
+#: src/nm.c:76
+msgid "Display only defined symbols"
+msgstr "定義されたシンボルのみを表示"
+
+#: src/nm.c:79
+msgid "Display dynamic symbols instead of normal symbols"
+msgstr "通常シンボルの代わりに動的シンボルを表示"
+
+#: src/nm.c:80
+msgid "Display only external symbols"
+msgstr "外部シンボルのみを表示"
+
+#: src/nm.c:81
+msgid "Display only undefined symbols"
+msgstr "未定義シンボルのみを表示"
+
+#: src/nm.c:83
+msgid "Include index for symbols from archive members"
+msgstr "アーカイブメンバーからのシンボルの索引を含める"
+
+#: src/nm.c:85 src/size.c:66
+msgid "Output format:"
+msgstr "出力形式:"
+
+#: src/nm.c:87
+msgid "Print name of the input file before every symbol"
+msgstr "全てのシンボルの前に入力ファイル名を印刷"
+
+#: src/nm.c:90
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd', `sysv' or `posix'. The "
+"default is `sysv'"
+msgstr ""
+"出力形式として FORMATを使う。FORMAT は `bsd'か、`sysv'、`posix' のどれか。省"
+"略値は `sysv'"
+
+#: src/nm.c:92
+msgid "Same as --format=bsd"
+msgstr "--format=bsd と同じ"
+
+#: src/nm.c:93
+msgid "Same as --format=posix"
+msgstr "--format=posix と同じ"
+
+#: src/nm.c:94 src/size.c:72
+msgid "Use RADIX for printing symbol values"
+msgstr "シンボル値を印刷するために RADIX を使う"
+
+#: src/nm.c:95
+msgid "Mark weak symbols"
+msgstr "弱いシンボルに印を点ける"
+
+#: src/nm.c:96
+msgid "Print size of defined symbols"
+msgstr "定義されたシンボルの印刷サイズ"
+
+#: src/nm.c:98 src/size.c:80 src/strip.c:78 src/unstrip.c:81
+msgid "Output options:"
+msgstr "出力オプション:"
+
+#: src/nm.c:99
+msgid "Sort symbols numerically by address"
+msgstr "シンボルをアドレスにより数値的に並べ替える"
+
+#: src/nm.c:101
+msgid "Do not sort the symbols"
+msgstr "シンボルを並べ替えない"
+
+#: src/nm.c:102
+msgid "Reverse the sense of the sort"
+msgstr "並べ替えの意味を逆にする"
+
+#: src/nm.c:108
+msgid "List symbols from FILEs (a.out by default)."
+msgstr "ふぁいる からシンボルを表示 (デフォルトではa.out)。"
+
+#: src/nm.c:136 src/objdump.c:105 src/size.c:117 src/strip.c:121
+#, c-format
+msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
+msgstr "%s: 内部エラー %d (%s-%s): %s"
+
+#: src/nm.c:380 src/nm.c:392 src/size.c:317 src/size.c:326 src/size.c:337
+#: src/strip.c:1816
+#, c-format
+msgid "while closing '%s'"
+msgstr "'%s' を閉じている最中"
+
+#: src/nm.c:402 src/objdump.c:296 src/strip.c:359
+#, c-format
+msgid "%s: File format not recognized"
+msgstr "%s: ファイル形式を認識できませんでした"
+
+#: src/nm.c:442
+msgid ""
+"\n"
+"Archive index:"
+msgstr ""
+"\n"
+"アーカイブ索引:"
+
+#: src/nm.c:451
+#, c-format
+msgid "invalid offset %zu for symbol %s"
+msgstr "シンボル %2$sの不正なオフセット %1$zu "
+
+#: src/nm.c:456
+#, c-format
+msgid "%s in %s\n"
+msgstr "%2$s の中の %1$s\n"
+
+#: src/nm.c:464
+#, c-format
+msgid "cannot reset archive offset to beginning"
+msgstr "アーカイブのオフセットを最初にリセットできません"
+
+#: src/nm.c:488 src/objdump.c:344
+#, c-format
+msgid "%s%s%s: file format not recognized"
+msgstr "%s%s%s: ファイル形式を認識できません"
+
+#: src/nm.c:700
+#, c-format
+msgid "cannot create search tree"
+msgstr "検索ツリーを生成できません"
+
+#: src/nm.c:740 src/nm.c:1002 src/objdump.c:744 src/readelf.c:885
+#: src/readelf.c:1028 src/readelf.c:1169 src/readelf.c:1351 src/readelf.c:1549
+#: src/readelf.c:1735 src/readelf.c:1945 src/readelf.c:2199 src/readelf.c:2265
+#: src/readelf.c:2343 src/readelf.c:2841 src/readelf.c:2877 src/readelf.c:2939
+#: src/readelf.c:6493 src/readelf.c:7387 src/readelf.c:7534 src/readelf.c:7604
+#: src/size.c:425 src/size.c:499 src/strip.c:483
+#, c-format
+msgid "cannot get section header string table index"
+msgstr "セクションヘッダー文字列テーブル索引が得られません"
+
+#: src/nm.c:766
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"%s からのシンボル:\n"
+"\n"
+
+#: src/nm.c:768
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s[%s]:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"%s[%s]からのシンボル:\n"
+"\n"
+
+#: src/nm.c:771
+#, c-format
+msgid ""
+"%*s%-*s %-*s Class Type %-*s %*s Section\n"
+"\n"
+msgstr ""
+"%*s%-*s %-*s クラス タイプ %-*s %*s セクション\n"
+"\n"
+
+#: src/nm.c:1012
+#, c-format
+msgid "%s: entry size in section `%s' is not what we expect"
+msgstr "%s: セクションの項目の大きさ `%s' は予期したものとは異なります"
+
+#: src/nm.c:1016
+#, c-format
+msgid "%s: size of section `%s' is not multiple of entry size"
+msgstr "%s: セクション `%s' の大きさは項目の大きさの整数倍ではありません"
+
+#: src/nm.c:1255
+#, c-format
+msgid "%s%s%s%s: Invalid operation"
+msgstr "%s%s%s%s: 不当な操作"
+
+#: src/nm.c:1312
+#, c-format
+msgid "%s%s%s: no symbols"
+msgstr "%s%s%s: シンボルがありません"
+
+#: src/objdump.c:61
+msgid "Mode selection:"
+msgstr ""
+
+#: src/objdump.c:62
+msgid "Display relocation information."
+msgstr ""
+
+#: src/objdump.c:64
+msgid "Display the full contents of all sections requested"
+msgstr ""
+
+#: src/objdump.c:66
+msgid "Display assembler code of executable sections"
+msgstr ""
+
+#: src/objdump.c:68
+msgid "Output option selection:"
+msgstr ""
+
+#: src/objdump.c:70
+msgid "Only display information for section NAME."
+msgstr ""
+
+#: src/objdump.c:76
+msgid "Show information from FILEs (a.out by default)."
+msgstr ""
+
+#: src/objdump.c:236 src/readelf.c:430
+msgid "No operation specified.\n"
+msgstr "操作が指定されていません。\n"
+
+#: src/objdump.c:274 src/objdump.c:286
+#, c-format
+msgid "while close `%s'"
+msgstr ""
+
+#: src/objdump.c:379 src/readelf.c:1644 src/readelf.c:1818
+msgid "INVALID SYMBOL"
+msgstr "不当なシンボル"
+
+#: src/objdump.c:394 src/readelf.c:1675 src/readelf.c:1851
+msgid "INVALID SECTION"
+msgstr "不当なセクション"
+
+#: src/objdump.c:510
+#, c-format
+msgid ""
+"\n"
+"RELOCATION RECORDS FOR [%s]:\n"
+"%-*s TYPE VALUE\n"
+msgstr ""
+
+#: src/objdump.c:513
+msgid "OFFSET"
+msgstr ""
+
+#: src/objdump.c:576
+#, c-format
+msgid "Contents of section %s:\n"
+msgstr ""
+
+#: src/objdump.c:676
+#, c-format
+msgid "cannot disassemble"
+msgstr ""
+
+#: src/ranlib.c:74
+msgid "Generate an index to speed access to archives."
+msgstr ""
+
+#: src/ranlib.c:77
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/ranlib.c:116
+#, c-format
+msgid "Archive name required"
+msgstr ""
+
+#: src/ranlib.c:194
+#, c-format
+msgid "'%s' is no archive"
+msgstr ""
+
+#: src/ranlib.c:229
+#, c-format
+msgid "error while freeing sub-ELF descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:73
+#, fuzzy
+msgid "ELF output selection:"
+msgstr "出力選択:"
+
+#: src/readelf.c:75
+msgid "All these plus -p .strtab -p .dynstr -p .comment"
+msgstr ""
+
+#: src/readelf.c:76
+msgid "Display the dynamic segment"
+msgstr "動的セグメントを表示"
+
+#: src/readelf.c:77
+msgid "Display the ELF file header"
+msgstr "ELF ファイルヘッダーを表示"
+
+#: src/readelf.c:79
+msgid "Display histogram of bucket list lengths"
+msgstr "バケットリスト長の柱状図を表示"
+
+#: src/readelf.c:80
+msgid "Display the program headers"
+msgstr "プログラムヘッダーを表示"
+
+#: src/readelf.c:82
+msgid "Display relocations"
+msgstr "リロケーションを表示"
+
+#: src/readelf.c:83
+#, fuzzy
+msgid "Display the sections' headers"
+msgstr "セクションのヘッダーを表示"
+
+#: src/readelf.c:85
+msgid "Display the symbol table"
+msgstr "シンボルテーブルを表示"
+
+#: src/readelf.c:86
+msgid "Display versioning information"
+msgstr "バージョニング情報の表示"
+
+#: src/readelf.c:87
+#, fuzzy
+msgid "Display the ELF notes"
+msgstr "コアノートを表示"
+
+#: src/readelf.c:89
+#, fuzzy
+msgid "Display architecture specific information, if any"
+msgstr "(もしあれば)アーキテクチャー固有の情報を表示"
+
+#: src/readelf.c:91
+msgid "Display sections for exception handling"
+msgstr "例外を取り扱うためのセクションを表示"
+
+#: src/readelf.c:93
+#, fuzzy
+msgid "Additional output selection:"
+msgstr "出力選択:"
+
+#: src/readelf.c:95
+msgid ""
+"Display DWARF section content. SECTION can be one of abbrev, aranges, "
+"frame, info, loc, line, ranges, pubnames, str, macinfo, or exception"
+msgstr ""
+"DWARF セクションの内容を表示。SECTION は addrevか、aranges、frame、info、"
+"loc、ranges、pubnames、str、macinfo、exception のいずれかです"
+
+#: src/readelf.c:99
+msgid "Dump the uninterpreted contents of SECTION, by number or name"
+msgstr "数字か名前で解釈できないセクションの内容をダンプする"
+
+#: src/readelf.c:101
+msgid "Print string contents of sections"
+msgstr "セクションの文字列内容を印刷する"
+
+#: src/readelf.c:104
+msgid "Display the symbol index of an archive"
+msgstr "アーカイブのシンボル索引を表示"
+
+#: src/readelf.c:106
+msgid "Output control:"
+msgstr "出力制御:"
+
+#: src/readelf.c:108
+msgid "Do not find symbol names for addresses in DWARF data"
+msgstr "DWARFデータ中のアドレスのためのシンボル名を探さない"
+
+#: src/readelf.c:114
+msgid "Print information from ELF file in human-readable form."
+msgstr "ELF ファイルから人間が読める形で情報を印刷する。"
+
+#: src/readelf.c:401
+#, c-format
+msgid "Unknown DWARF debug section `%s'.\n"
+msgstr "不明な DWARF デバッグセクション `%s'.\n"
+
+#: src/readelf.c:465
+#, c-format
+msgid "cannot generate Elf descriptor: %s"
+msgstr "Elf 記述子を生成できません: %s"
+
+#: src/readelf.c:477
+#, c-format
+msgid "'%s' is not an archive, cannot print archive index"
+msgstr "'%s' はアーカイブではなく、アーカイブ索引を印刷できません"
+
+#: src/readelf.c:482
+#, c-format
+msgid "error while closing Elf descriptor: %s"
+msgstr "Elf 記述子を閉じている時にエラー: %s"
+
+#: src/readelf.c:574
+#, c-format
+msgid "cannot stat input file"
+msgstr "入力ファイルを stat できません"
+
+#: src/readelf.c:576
+#, c-format
+msgid "input file is empty"
+msgstr "入力ファイルが空です"
+
+#: src/readelf.c:578
+#, c-format
+msgid "failed reading '%s': %s"
+msgstr "'%s' の読込みに失敗: %s"
+
+#: src/readelf.c:614
+#, c-format
+msgid "cannot read ELF header: %s"
+msgstr "ELF ヘッダーが読めません: %s"
+
+#: src/readelf.c:622
+#, c-format
+msgid "cannot create EBL handle"
+msgstr "EBL ヘッダーを生成できません"
+
+#: src/readelf.c:635
+#, fuzzy, c-format
+msgid "cannot determine number of program headers: %s"
+msgstr "セクション数を決定できません: %s"
+
+#: src/readelf.c:721
+msgid "NONE (None)"
+msgstr "なし (なし)"
+
+#: src/readelf.c:722
+msgid "REL (Relocatable file)"
+msgstr "REL (リロケータブルファイル)"
+
+#: src/readelf.c:723
+msgid "EXEC (Executable file)"
+msgstr "(EXEC (実行ファイル)"
+
+#: src/readelf.c:724
+msgid "DYN (Shared object file)"
+msgstr "DYN (共用オブジェクトファイル)"
+
+#: src/readelf.c:725
+msgid "CORE (Core file)"
+msgstr "CORE (コアファイル)"
+
+#: src/readelf.c:730
+#, c-format
+msgid "OS Specific: (%x)\n"
+msgstr "OS 固有: (%x)\n"
+
+#: src/readelf.c:732
+#, c-format
+msgid "Processor Specific: (%x)\n"
+msgstr "プロセッサー固有: (%x)\n"
+
+#: src/readelf.c:742
+msgid ""
+"ELF Header:\n"
+" Magic: "
+msgstr ""
+"ELF ヘッダー:\n"
+" マジック: "
+
+#: src/readelf.c:746
+#, c-format
+msgid ""
+"\n"
+" Class: %s\n"
+msgstr ""
+"\n"
+" クラス: %s\n"
+
+#: src/readelf.c:751
+#, c-format
+msgid " Data: %s\n"
+msgstr " データ: %s\n"
+
+#: src/readelf.c:757
+#, c-format
+msgid " Ident Version: %hhd %s\n"
+msgstr " 識別バージョン: %hhd %s\n"
+
+#: src/readelf.c:759 src/readelf.c:776
+msgid "(current)"
+msgstr "(現在)"
+
+#: src/readelf.c:763
+#, c-format
+msgid " OS/ABI: %s\n"
+msgstr " OS/ABI: %s\n"
+
+#: src/readelf.c:766
+#, c-format
+msgid " ABI Version: %hhd\n"
+msgstr " ABI バージョン: %hhd\n"
+
+#: src/readelf.c:769
+msgid " Type: "
+msgstr " タイプ: "
+
+#: src/readelf.c:772
+#, c-format
+msgid " Machine: %s\n"
+msgstr " マシン : %s\n"
+
+#: src/readelf.c:774
+#, c-format
+msgid " Version: %d %s\n"
+msgstr " バージョン: %d %s\n"
+
+#: src/readelf.c:778
+#, c-format
+msgid " Entry point address: %#<PRIx64>\n"
+msgstr " 入口点アドレス : %#<PRIx64>\n"
+
+#: src/readelf.c:781
+#, c-format
+msgid " Start of program headers: %<PRId64> %s\n"
+msgstr " プログラムヘッダーの開始: %<PRId64> %s\n"
+
+#: src/readelf.c:782 src/readelf.c:785
+msgid "(bytes into file)"
+msgstr "(ファイルへのバイト数)"
+
+#: src/readelf.c:784
+#, c-format
+msgid " Start of section headers: %<PRId64> %s\n"
+msgstr " セクションヘッダーの開始: %<PRId64> %s\n"
+
+#: src/readelf.c:787
+#, c-format
+msgid " Flags: %s\n"
+msgstr " フラグ: %s\n"
+
+#: src/readelf.c:790
+#, c-format
+msgid " Size of this header: %<PRId16> %s\n"
+msgstr " このヘッダーの大きさ: %<PRId16> %s\n"
+
+#: src/readelf.c:791 src/readelf.c:794 src/readelf.c:811
+msgid "(bytes)"
+msgstr "(バイト)"
+
+#: src/readelf.c:793
+#, c-format
+msgid " Size of program header entries: %<PRId16> %s\n"
+msgstr " プログラムヘッダー項目の大きさ:%<PRId16> %s\n"
+
+#: src/readelf.c:796
+#, fuzzy, c-format
+msgid " Number of program headers entries: %<PRId16>"
+msgstr " プログラムヘッダー項目の数 : %<PRId16>\n"
+
+#: src/readelf.c:803
+#, fuzzy, c-format
+msgid " (%<PRIu32> in [0].sh_info)"
+msgstr "([0].sh_link の %<PRIu32>)"
+
+#: src/readelf.c:806 src/readelf.c:823 src/readelf.c:837
+msgid " ([0] not available)"
+msgstr "([0]は使えません)"
+
+#: src/readelf.c:810
+#, c-format
+msgid " Size of section header entries: %<PRId16> %s\n"
+msgstr " セクションヘッダー項目の大きさ:%<PRId16> %s\n"
+
+#: src/readelf.c:813
+#, c-format
+msgid " Number of section headers entries: %<PRId16>"
+msgstr " セクションヘッダー項目の数 : %<PRId16>"
+
+#: src/readelf.c:820
+#, c-format
+msgid " (%<PRIu32> in [0].sh_size)"
+msgstr " ([0].sh_size の %<PRIu32>)"
+
+#: src/readelf.c:833
+#, c-format
+msgid " (%<PRIu32> in [0].sh_link)"
+msgstr "([0].sh_link の %<PRIu32>)"
+
+#: src/readelf.c:841
+#, c-format
+msgid ""
+" Section header string table index: XINDEX%s\n"
+"\n"
+msgstr ""
+" セクションヘッダー文字列テーブル索引: XINDEX%s\n"
+"\n"
+
+#: src/readelf.c:845
+#, c-format
+msgid ""
+" Section header string table index: %<PRId16>\n"
+"\n"
+msgstr ""
+" セクションヘッダー文字列テーブル索引: %<PRId16>\n"
+"\n"
+
+#: src/readelf.c:877
+#, c-format
+msgid ""
+"There are %d section headers, starting at offset %#<PRIx64>:\n"
+"\n"
+msgstr ""
+"オフセット %2$#<PRIx64> から始まる %1$d 個のセクションヘッダーがあります:\n"
+"\n"
+
+#: src/readelf.c:887
+msgid "Section Headers:"
+msgstr "セクションヘッダー:"
+
+#: src/readelf.c:890
+msgid ""
+"[Nr] Name Type Addr Off Size ES Flags Lk "
+"Inf Al"
+msgstr ""
+"[番] 名前 タイプ アドレス オフセ 大きさ ES フラグLk "
+"Inf Al"
+
+#: src/readelf.c:892
+msgid ""
+"[Nr] Name Type Addr Off Size ES "
+"Flags Lk Inf Al"
+msgstr ""
+"[番] 名前 タイプ アドレス オフセ 大きさ ES "
+"フラグLk Inf Al"
+
+#: src/readelf.c:899 src/readelf.c:1052
+#, c-format
+msgid "cannot get section: %s"
+msgstr "セクションを得られません: %s"
+
+#: src/readelf.c:906 src/readelf.c:1060 src/readelf.c:7554 src/unstrip.c:353
+#: src/unstrip.c:377 src/unstrip.c:427 src/unstrip.c:536 src/unstrip.c:553
+#: src/unstrip.c:591 src/unstrip.c:789 src/unstrip.c:1057 src/unstrip.c:1244
+#: src/unstrip.c:1305 src/unstrip.c:1427 src/unstrip.c:1480 src/unstrip.c:1588
+#: src/unstrip.c:1778
+#, c-format
+msgid "cannot get section header: %s"
+msgstr "セクションヘッダーを得られません: %s"
+
+#: src/readelf.c:964
+msgid "Program Headers:"
+msgstr "プログラムヘッダー:"
+
+#: src/readelf.c:966
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align"
+msgstr ""
+" タイプ オフセ 仮アドレス 物アドレス ファイ量 メモ量 Flg 調整 "
+
+#: src/readelf.c:969
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz "
+"MemSiz Flg Align"
+msgstr ""
+" タイプ オフセ 仮想アドレス 物理アドレス ファイル量メモ"
+"量 Flg 調整 "
+
+#: src/readelf.c:1009
+#, c-format
+msgid "\t[Requesting program interpreter: %s]\n"
+msgstr "\t[プログラム割込みを要求: %s]\n"
+
+#: src/readelf.c:1030
+msgid ""
+"\n"
+" Section to Segment mapping:\n"
+" Segment Sections..."
+msgstr ""
+"\n"
+" セクションからセグメントへのマッビング:\n"
+" セグメント セクション..."
+
+#: src/readelf.c:1041 src/unstrip.c:1824 src/unstrip.c:1863 src/unstrip.c:1870
+#, c-format
+msgid "cannot get program header: %s"
+msgstr "プログラムヘッダーを得られません: %s"
+
+#: src/readelf.c:1175
+#, c-format
+msgid ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+"\n"
+"署名 '%3$s' を持つ COMDAT セクショングループ [%1$2zu] '%2$s' には %4$zu 個の"
+"項目があります:\n"
+
+#: src/readelf.c:1180
+#, c-format
+msgid ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+"\n"
+"署名 '%3$s' を持つセクショングループ [%1$2zu] '%2$s' には %4$zu 個の項目があ"
+"ります:\n"
+
+#: src/readelf.c:1188
+msgid "<INVALID SYMBOL>"
+msgstr "<不当なシンボル>"
+
+#: src/readelf.c:1202
+msgid "<INVALID SECTION>"
+msgstr "<不当なセクション>"
+
+#: src/readelf.c:1353
+#, c-format
+msgid ""
+"\n"
+"Dynamic segment contains %lu entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Dynamic segment contains %lu entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+"\n"
+"動的セグメントには %lu 個の項目があります:\n"
+" アドレス: %#0*<PRIx64> オフセット: %#08<PRIx64> セクションへのリンク: [%"
+"2u] '%s'\n"
+
+#: src/readelf.c:1365
+msgid " Type Value\n"
+msgstr " タイプ 値\n"
+
+#: src/readelf.c:1389
+#, c-format
+msgid "Shared library: [%s]\n"
+msgstr "共用ライブラリー: [%s]\n"
+
+#: src/readelf.c:1394
+#, c-format
+msgid "Library soname: [%s]\n"
+msgstr "ライブラリー so 名: [%s]\n"
+
+#: src/readelf.c:1399
+#, c-format
+msgid "Library rpath: [%s]\n"
+msgstr "ライブラリー rパス: [%s]\n"
+
+#: src/readelf.c:1404
+#, c-format
+msgid "Library runpath: [%s]\n"
+msgstr "ライブラリー run パス: [%s]\n"
+
+#: src/readelf.c:1424
+#, c-format
+msgid "%<PRId64> (bytes)\n"
+msgstr "%<PRId64> (バイト)\n"
+
+#: src/readelf.c:1534 src/readelf.c:1720
+#, c-format
+msgid ""
+"\n"
+"Invalid symbol table at offset %#0<PRIx64>\n"
+msgstr ""
+"\n"
+"オフセット %#0<PRIx64> に不当なシンボルテーブル\n"
+
+#: src/readelf.c:1552 src/readelf.c:1737
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entries:\n"
+msgstr[0] ""
+"\n"
+"オフセット %5$#0<PRIx64> のセクション [%3$2u] '%4$s' 用のリロケーションセク"
+"ション [%1$2zu] '%2$s' には %6$d 個の項目があります:\n"
+
+#: src/readelf.c:1567
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+"\n"
+"オフセット %3$#0<PRIx64> のリロケーションセクション [%1$2u] '%2$s' には %4$d "
+"個の項目があります:\n"
+
+#: src/readelf.c:1577
+msgid " Offset Type Value Name\n"
+msgstr " オフセット タイプ 値 名前\n"
+
+#: src/readelf.c:1579
+msgid " Offset Type Value Name\n"
+msgstr " オフセット タイプ 値 名前\n"
+
+#: src/readelf.c:1632 src/readelf.c:1643 src/readelf.c:1656 src/readelf.c:1674
+#: src/readelf.c:1686 src/readelf.c:1805 src/readelf.c:1817 src/readelf.c:1831
+#: src/readelf.c:1850 src/readelf.c:1863
+msgid "<INVALID RELOC>"
+msgstr "<不当なRELOC>"
+
+#: src/readelf.c:1749
+msgid " Offset Type Value Addend Name\n"
+msgstr " オフセット タイプ 値 付加名\n"
+
+#: src/readelf.c:1751
+msgid " Offset Type Value Addend Name\n"
+msgstr " オフセット タイプ 値 付加名\n"
+
+#: src/readelf.c:1952
+#, c-format
+msgid ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entry:\n"
+msgid_plural ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entries:\n"
+msgstr[0] ""
+"\n"
+"シンボルテーブル [%2u] '%s' には %u 個の項目があります:\n"
+
+#: src/readelf.c:1958
+#, 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:1968
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr " 数 : 値 大き タイプ Bind Vis Ndx 名前\n"
+
+#: src/readelf.c:1970
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr " 数 : 値 大き タイプ Bind Vis Ndx 名前\n"
+
+#: src/readelf.c:1990
+#, 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:2078
+#, c-format
+msgid "bad dynamic symbol"
+msgstr "不正な動的シンボル"
+
+#: src/readelf.c:2160
+msgid "none"
+msgstr "なし"
+
+#: src/readelf.c:2177
+msgid "| <unknown>"
+msgstr "| <不明>"
+
+#: src/readelf.c:2202
+#, c-format
+msgid ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+"\n"
+"セクション [%2u] '%s' を必要とするバージョンには %d 個の項目があります:\n"
+" アドレス: %#0*<PRIx64> オフセット: %#08<PRIx64> セクションへのリンク: [%"
+"2u] '%s'\n"
+
+#: src/readelf.c:2225
+#, c-format
+msgid " %#06x: Version: %hu File: %s Cnt: %hu\n"
+msgstr " %#06x: バージョン: %hu ファイル: %s 数: %hu\n"
+
+#: src/readelf.c:2238
+#, c-format
+msgid " %#06x: Name: %s Flags: %s Version: %hu\n"
+msgstr " %#06x: 名前: %s フラグ: %s バージョン: %hu\n"
+
+#: src/readelf.c:2269
+#, c-format
+msgid ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+"\n"
+"バージョン定義セクション [%2u] '%s' には %d 個の項目があります:\n"
+" アドレス: %#0*<PRIx64> オフセット: %#08<PRIx64> セクションへのリンク: [%"
+"2u] '%s'\n"
+
+#: src/readelf.c:2299
+#, 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:2314
+#, c-format
+msgid " %#06x: Parent %d: %s\n"
+msgstr " %#06x: 親 %d: %s\n"
+
+#: src/readelf.c:2546
+#, c-format
+msgid ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgid_plural ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgstr[0] ""
+"\n"
+"バージョンシンボルセクション [%2u] '%s' には %d 個の項目があります:\n"
+" アドレス: %#0*<PRIx64> オフセット: %#08<PRIx64> セクションへのリンク: [%"
+"2u] '%s'"
+
+#: src/readelf.c:2576
+msgid " 0 *local* "
+msgstr " 0 *ローカル* "
+
+#: src/readelf.c:2581
+msgid " 1 *global* "
+msgstr " 1 *グローバル* "
+
+#: src/readelf.c:2612
+#, c-format
+msgid ""
+"\n"
+"Histogram 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"
+msgid_plural ""
+"\n"
+"Histogram for bucket list length in section [%2u] '%s' (total of %d "
+"buckets):\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+"\n"
+"セクション [%2u] '%s' のバケット一覧の長さの柱状図(合計 %d バケット):\n"
+" アドレス: %#0*<PRIx64> オフセット: %#08<PRIx64> セクションへのリンク: [%"
+"2u] '%s'\n"
+
+#: src/readelf.c:2636
+#, fuzzy, no-c-format
+msgid " Length Number % of total Coverage\n"
+msgstr " 長さ 数 全体の% 範囲 \n"
+
+#: src/readelf.c:2638
+#, c-format
+msgid " 0 %6<PRIu32> %5.1f%%\n"
+msgstr " 0 %6<PRIu32> %5.1f%%\n"
+
+#: src/readelf.c:2645
+#, c-format
+msgid "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
+msgstr "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
+
+#: src/readelf.c:2658
+#, c-format
+msgid ""
+" Average number of tests: successful lookup: %f\n"
+" unsuccessful lookup: %f\n"
+msgstr ""
+" テストの平均数: 検索成功: %f\n"
+" 検索失敗: %f\n"
+
+#: src/readelf.c:2676 src/readelf.c:2718 src/readelf.c:2759
+#, c-format
+msgid "cannot get data for section %d: %s"
+msgstr "セクションからデータを得られません %d: %s"
+
+#: src/readelf.c:2813
+#, c-format
+msgid ""
+" Symbol Bias: %u\n"
+" Bitmask Size: %zu bytes %<PRIuFAST32>%% bits set 2nd hash shift: %u\n"
+msgstr ""
+" シンボルの偏り: %u\n"
+" ビットマスクの大きさ: %zu バイト %<PRIuFAST32>%% ビット設定 第2ハッシュシフ"
+"ト: %u\n"
+
+#: src/readelf.c:2887
+#, c-format
+msgid ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+"\n"
+"オフセット %3$#0<PRIx64> のライブラリー一覧セクション [%1$2zu] '%2$s' には %4"
+"$d 個の項目があります:\n"
+
+#: src/readelf.c:2901
+msgid ""
+" Library Time Stamp Checksum Version "
+"Flags"
+msgstr ""
+" ライブラリー タイムスタンプ チェックサム バー"
+"ジョン フラグ"
+
+#: src/readelf.c:2951
+#, c-format
+msgid ""
+"\n"
+"Object attributes section [%2zu] '%s' of %<PRIu64> bytes at offset %"
+"#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"オフセット %4$#0<PRIx64> の %3$<PRIu64> バイトのオブジェクト属性セクション [%"
+"1$2zu] '%2$s':\n"
+
+#: src/readelf.c:2967
+msgid " Owner Size\n"
+msgstr " 所有者 大きさ\n"
+
+#: src/readelf.c:2993
+#, c-format
+msgid " %-13s %4<PRIu32>\n"
+msgstr " %-13s %4<PRIu32>\n"
+
+#: src/readelf.c:3025
+#, c-format
+msgid " %-4u %12<PRIu32>\n"
+msgstr " %-4u %12<PRIu32>\n"
+
+#: src/readelf.c:3030
+#, c-format
+msgid " File: %11<PRIu32>\n"
+msgstr " ファイル: %11<PRIu32>\n"
+
+#: src/readelf.c:3065
+#, c-format
+msgid " %s: %<PRId64>, %s\n"
+msgstr " %s: %<PRId64>、%s\n"
+
+#: src/readelf.c:3068
+#, c-format
+msgid " %s: %<PRId64>\n"
+msgstr " %s: %<PRId64>\n"
+
+#: src/readelf.c:3071
+#, c-format
+msgid " %s: %s\n"
+msgstr " %s: %s\n"
+
+#: src/readelf.c:3078
+#, c-format
+msgid " %u: %<PRId64>\n"
+msgstr " %u: %<PRId64>\n"
+
+#: src/readelf.c:3081
+#, c-format
+msgid " %u: %s\n"
+msgstr " %u: %s\n"
+
+#: src/readelf.c:3117
+#, c-format
+msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr "%s+%#<PRIx64> <%s+%#<PRIx64>>"
+
+#: src/readelf.c:3120
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
+
+#: src/readelf.c:3125
+#, c-format
+msgid "%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr "%#<PRIx64> <%s+%#<PRIx64>>"
+
+#: src/readelf.c:3128
+#, c-format
+msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr "%#0*<PRIx64> <%s+%#<PRIx64>>"
+
+#: src/readelf.c:3134
+#, c-format
+msgid "%s+%#<PRIx64> <%s>"
+msgstr "%s+%#<PRIx64> <%s>"
+
+#: src/readelf.c:3137
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s>"
+msgstr "%s+%#0*<PRIx64> <%s>"
+
+#: src/readelf.c:3141
+#, c-format
+msgid "%#<PRIx64> <%s>"
+msgstr "%#<PRIx64> <%s>"
+
+#: src/readelf.c:3144
+#, c-format
+msgid "%#0*<PRIx64> <%s>"
+msgstr "%#0*<PRIx64> <%s>"
+
+#: src/readelf.c:3149
+#, c-format
+msgid "%s+%#<PRIx64>"
+msgstr "%s+%#<PRIx64>"
+
+#: src/readelf.c:3152
+#, c-format
+msgid "%s+%#0*<PRIx64>"
+msgstr "%s+%#0*<PRIx64>"
+
+#: src/readelf.c:3260
+#, c-format
+msgid "unknown tag %hx"
+msgstr "不明なタグ %hx"
+
+#: src/readelf.c:3262
+#, c-format
+msgid "unknown user tag %hx"
+msgstr "不明な利用者タグ %hx"
+
+#: src/readelf.c:3480
+#, c-format
+msgid "unknown attribute %hx"
+msgstr "不明な属性 %hx"
+
+#: src/readelf.c:3483
+#, c-format
+msgid "unknown user attribute %hx"
+msgstr "不明な利用者属性 %hx"
+
+#: src/readelf.c:3529
+#, c-format
+msgid "unknown form %<PRIx64>"
+msgstr "不明な様式 %<PRIx64>"
+
+#: src/readelf.c:3763
+msgid "empty block"
+msgstr "空ブロック"
+
+#: src/readelf.c:3766
+#, c-format
+msgid "%zu byte block:"
+msgstr "%zu バイトのブロック:"
+
+#: src/readelf.c:4175
+#, c-format
+msgid "%*s[%4<PRIuMAX>] %s <TRUNCATED>\n"
+msgstr "%*s[%4<PRIuMAX>] %s <TRUNCATED>\n"
+
+#: src/readelf.c:4188
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [ Code]\n"
+msgstr ""
+"\n"
+"オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
+" [ コード]\n"
+
+#: src/readelf.c:4195
+#, c-format
+msgid ""
+"\n"
+"Abbreviation section at offset %<PRIu64>:\n"
+msgstr ""
+"\n"
+"オフセット %<PRIu64> の略語セクション:\n"
+
+#: src/readelf.c:4208
+#, c-format
+msgid " *** error while reading abbreviation: %s\n"
+msgstr " *** 略語を読んでいる間にエラー: %s\n"
+
+#: src/readelf.c:4224
+#, c-format
+msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
+msgstr " [%5u] オフセット: %<PRId64>、子: %s、タグ: %s\n"
+
+#: src/readelf.c:4227
+msgid "yes"
+msgstr "はい"
+
+#: src/readelf.c:4227
+msgid "no"
+msgstr "いいえ"
+
+#: src/readelf.c:4263
+#, c-format
+msgid "cannot get .debug_aranges content: %s"
+msgstr ".debug_aragnes の内容を得られません: %s"
+
+#: src/readelf.c:4268
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entries:\n"
+msgstr[0] ""
+"\n"
+"オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s' には %4$zu 個の項"
+"目があります:\n"
+
+#: src/readelf.c:4298
+#, c-format
+msgid " [%*zu] ???\n"
+msgstr " [%*zu] ???\n"
+
+#: src/readelf.c:4300
+#, 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:4319
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr ".degub_ranges の内容を得られません: %s"
+
+#: src/readelf.c:4324 src/readelf.c:4810 src/readelf.c:5452 src/readelf.c:5897
+#: src/readelf.c:5992 src/readelf.c:6164
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+"\n"
+"オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
+
+#: src/readelf.c:4338 src/readelf.c:5911
+#, c-format
+msgid " [%6tx] <INVALID DATA>\n"
+msgstr " [%6tx] <不当なデータ>\n"
+
+#: src/readelf.c:4360 src/readelf.c:5933
+#, c-format
+msgid " [%6tx] base address %s\n"
+msgstr " [%6tx] ベースアドレス %s\n"
+
+#: src/readelf.c:4371
+#, c-format
+msgid " [%6tx] %s..%s\n"
+msgstr " [%6tx] %s..%s\n"
+
+#: src/readelf.c:4373
+#, c-format
+msgid " %s..%s\n"
+msgstr " %s..%s\n"
+
+#: src/readelf.c:4799 src/readelf.c:6230 src/readelf.c:6332
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr "%s の内容を得られません: %s"
+
+#: src/readelf.c:4806
+#, c-format
+msgid ""
+"\n"
+"Call frame information section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+"\n"
+"オフセット %3$#<PRIx64> の フレーム情報呼出しセクション [%1$2zu] '%2$s':\n"
+
+#: src/readelf.c:4833 src/readelf.c:5486
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr "セクション [%zu] '%s' の不当なデータ"
+
+#: src/readelf.c:4855
+#, c-format
+msgid ""
+"\n"
+" [%6tx] Zero terminator\n"
+msgstr ""
+"\n"
+" [%6tx] ゼロ終端\n"
+
+#: src/readelf.c:4924
+#, fuzzy, c-format
+msgid "invalid augmentation length"
+msgstr "不当な拡大エンコード"
+
+#: src/readelf.c:4936
+msgid "FDE address encoding: "
+msgstr "FDE アドレスエンコード"
+
+#: src/readelf.c:4942
+msgid "LSDA pointer encoding: "
+msgstr "LSDA ポインターエンコード:"
+
+#: src/readelf.c:5034
+#, c-format
+msgid " (offset: %#<PRIx64>)"
+msgstr " (オフセット: %#<PRIx64>)"
+
+#: src/readelf.c:5041
+#, c-format
+msgid " (end offset: %#<PRIx64>)"
+msgstr " (終了オフセット: %#<PRIx64>)"
+
+#: src/readelf.c:5068
+#, c-format
+msgid " %-26sLSDA pointer: %#<PRIx64>\n"
+msgstr " %-26sLSDA ポインター: %#<PRIx64>\n"
+
+#: src/readelf.c:5114
+#, c-format
+msgid "cannot get attribute code: %s"
+msgstr "属性コードを得られません: %s"
+
+#: src/readelf.c:5122
+#, c-format
+msgid "cannot get attribute form: %s"
+msgstr "属性様式を得られません: %s"
+
+#: src/readelf.c:5135
+#, c-format
+msgid "cannot get attribute value: %s"
+msgstr "属性値を得られません: %s"
+
+#: src/readelf.c:5331
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [Offset]\n"
+msgstr ""
+"\n"
+"オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
+" [オフセット]\n"
+
+#: src/readelf.c:5356
+#, c-format
+msgid ""
+" Compilation unit at offset %<PRIu64>:\n"
+" Version: %<PRIu16>, Abbreviation section offset: %<PRIu64>, Address size: %"
+"<PRIu8>, Offset size: %<PRIu8>\n"
+msgstr ""
+" オフセット %1$<PRIu64> のコンパイル単位:\n"
+" バージョン: %2$<PRIu16>、略語セクションオフセット: %3$<PRIu64>、アドレスの大"
+"きさ: %4$<PRIu8>、オフセットの大きさ: %5$<PRIu8>\n"
+
+#: src/readelf.c:5374
+#, c-format
+msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
+msgstr ""
+"セクション '%2$s' の オフセット %1$<PRIu64> の DIE を得られません: %3$s"
+
+#: src/readelf.c:5385
+#, c-format
+msgid "cannot get DIE offset: %s"
+msgstr "DIE オフセットを得られません: %s"
+
+#: src/readelf.c:5393
+#, 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:5422
+#, c-format
+msgid "cannot get next DIE: %s\n"
+msgstr "次の DIE を得られません: %s\n"
+
+#: src/readelf.c:5429
+#, c-format
+msgid "cannot get next DIE: %s"
+msgstr "次の DIE を得られません: %s"
+
+#: src/readelf.c:5464
+#, c-format
+msgid "cannot get line data section data: %s"
+msgstr "ラインデータセクションデータを得られません: %s"
+
+#: src/readelf.c:5477
+#, c-format
+msgid ""
+"\n"
+"Table at offset %Zu:\n"
+msgstr ""
+"\n"
+"オフセット %Zu のテーブル:\n"
+
+#: src/readelf.c:5529
+#, c-format
+msgid ""
+"\n"
+" Length: %<PRIu64>\n"
+" DWARF version: %<PRIuFAST16>\n"
+" Prologue length: %<PRIu64>\n"
+" Minimum instruction length: %<PRIuFAST8>\n"
+" Initial value if '%s': %<PRIuFAST8>\n"
+" Line base: %<PRIdFAST8>\n"
+" Line range: %<PRIuFAST8>\n"
+" Opcode base: %<PRIuFAST8>\n"
+"\n"
+"Opcodes:\n"
+msgstr ""
+"\n"
+" 長さ: %<PRIu64>\n"
+" DWARF バージョン: %<PRIuFAST16>\n"
+" プロローグ長: %<PRIu64>\n"
+" 最小命令長: %<PRIuFAST8>\n"
+" もし '%s' なら初期値: %<PRIuFAST8>\n"
+" 行ベース: %<PRIdFAST8>\n"
+" 行範囲: %<PRIuFAST8>\n"
+" 命令コードベース: %<PRIuFAST8>\n"
+"\n"
+"命令コード:\n"
+
+#: src/readelf.c:5548
+#, c-format
+msgid "invalid data at offset %tu in section [%zu] '%s'"
+msgstr "セクション [%2$zu] '%3$s' 中のオフセット %1$tu に不当なデータ"
+
+#: src/readelf.c:5563
+#, c-format
+msgid " [%*<PRIuFAST8>] %hhu argument\n"
+msgid_plural " [%*<PRIuFAST8>] %hhu arguments\n"
+msgstr[0] " [%*<PRIuFAST8>] %hhu パラメーター\n"
+
+#: src/readelf.c:5571
+msgid ""
+"\n"
+"Directory table:"
+msgstr ""
+"\n"
+"ディレクトリーテーブル:"
+
+#: src/readelf.c:5587
+msgid ""
+"\n"
+"File name table:\n"
+" Entry Dir Time Size Name"
+msgstr ""
+"\n"
+"ファイル名テーブル:\n"
+" Entry Dir 時刻 大きさ 名前"
+
+#: src/readelf.c:5616
+msgid ""
+"\n"
+"Line number statements:"
+msgstr ""
+"\n"
+"行 番号 文:"
+
+#: src/readelf.c:5677
+#, c-format
+msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
+msgstr " 特殊命令コード %u: アドレス+%u = %s, 行%+d = %zu\n"
+
+#: src/readelf.c:5697
+#, c-format
+msgid " extended opcode %u: "
+msgstr " 拡張命令コード %u: "
+
+#: src/readelf.c:5702
+msgid "end of sequence"
+msgstr "列の終わり"
+
+#: src/readelf.c:5717
+#, c-format
+msgid "set address to %s\n"
+msgstr "アドレスを %s に設定する\n"
+
+#: src/readelf.c:5738
+#, 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:5747
+msgid "unknown opcode"
+msgstr "不明な命令コード"
+
+#: src/readelf.c:5759
+msgid " copy"
+msgstr "複写"
+
+#: src/readelf.c:5769
+#, c-format
+msgid "advance address by %u to %s\n"
+msgstr "アドレスを %u だけ進めて %s にする\n"
+
+#: src/readelf.c:5780
+#, c-format
+msgid " advance line by constant %d to %<PRId64>\n"
+msgstr "行を定数 %d だけ進めて %<PRId64> にする\n"
+
+#: src/readelf.c:5788
+#, c-format
+msgid " set file to %<PRIu64>\n"
+msgstr " ファイルを %<PRIu64> に設定する\n"
+
+#: src/readelf.c:5798
+#, c-format
+msgid " set column to %<PRIu64>\n"
+msgstr "カラムを %<PRIu64> に設定する\n"
+
+#: src/readelf.c:5805
+#, c-format
+msgid " set '%s' to %<PRIuFAST8>\n"
+msgstr " '%s' を %<PRIuFAST8> に設定する\n"
+
+#: src/readelf.c:5811
+msgid " set basic block flag"
+msgstr "基本ブロックフラグを設定する"
+
+#: src/readelf.c:5821
+#, c-format
+msgid "advance address by constant %u to %s\n"
+msgstr "アドレスを定数 %u だけ済めて %s にする\n"
+
+#: src/readelf.c:5837
+#, c-format
+msgid "advance address by fixed value %u to %s\n"
+msgstr "アドレスを固定値 %u だけ進めて %s にする\n"
+
+#: src/readelf.c:5846
+msgid " set prologue end flag"
+msgstr "プロローグ終了フラグを設定する"
+
+#: src/readelf.c:5851
+msgid " set epilogue begin flag"
+msgstr "エピローグ開始フラグを設定する"
+
+#: src/readelf.c:5860
+#, c-format
+msgid " unknown opcode with %<PRIu8> parameter:"
+msgid_plural " unknown opcode with %<PRIu8> parameters:"
+msgstr[0] " %<PRIu8> 個のパラメーターのある不明な命令コード:"
+
+#: src/readelf.c:5892
+#, c-format
+msgid "cannot get .debug_loc content: %s"
+msgstr ".debug_loc の内容を得られません: %s"
+
+#: src/readelf.c:5947
+#, c-format
+msgid " [%6tx] %s..%s"
+msgstr " [%6tx] %s..%s"
+
+#: src/readelf.c:5949
+#, c-format
+msgid " %s..%s"
+msgstr " %s..%s"
+
+#: src/readelf.c:6002
+#, c-format
+msgid "cannot get macro information section data: %s"
+msgstr "マクロ情報セクションのデータを得られません: %s"
+
+#: src/readelf.c:6081
+#, c-format
+msgid "%*s*** non-terminated string at end of section"
+msgstr "%*s*** 最後のセクションの終端していない文字列"
+
+#: src/readelf.c:6149
+#, 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"
+
+# # "オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
+# # " %4$*s 文字列\n" がエラーになるのは何故? 取り敢えず fuzzy扱い
+#: src/readelf.c:6188
+#, fuzzy, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" %*s String\n"
+msgstr ""
+"\n"
+"オフセット %3$#<PRIx64> の DWARF セクション [%1$2zu] '%2$s':\n"
+" %4$*s 文字列\n"
+
+#: src/readelf.c:6202
+#, c-format
+msgid " *** error while reading strings: %s\n"
+msgstr " *** 文字列の読込み中にエラー: %s\n"
+
+#: src/readelf.c:6222
+#, c-format
+msgid ""
+"\n"
+"Call frame search table section [%2zu] '.eh_frame_hdr':\n"
+msgstr ""
+"\n"
+"呼出しフレーム検索テーブルセクション [%2zu] '.eh_frame_hdr':\n"
+
+#: src/readelf.c:6324
+#, c-format
+msgid ""
+"\n"
+"Exception handling table section [%2zu] '.gcc_except_table':\n"
+msgstr ""
+"\n"
+"例外取扱いテーブルセクション [%2zu] '.gcc_except_table':\n"
+
+#: src/readelf.c:6347
+#, c-format
+msgid " LPStart encoding: %#x "
+msgstr " LPStart コード化: %#x "
+
+#: src/readelf.c:6359
+#, c-format
+msgid " TType encoding: %#x "
+msgstr "TType コード化: %#x "
+
+#: src/readelf.c:6373
+#, c-format
+msgid " Call site encoding: %#x "
+msgstr "呼出しサイトコード化: %#x "
+
+#: src/readelf.c:6386
+msgid ""
+"\n"
+" Call site table:"
+msgstr ""
+"\n"
+" 呼出しサイトテーブル:"
+
+#: src/readelf.c:6400
+#, c-format
+msgid ""
+" [%4u] Call site start: %#<PRIx64>\n"
+" Call site length: %<PRIu64>\n"
+" Landing pad: %#<PRIx64>\n"
+" Action: %u\n"
+msgstr ""
+" [%4u] 呼出しサイト開始 : %#<PRIx64>\n"
+" 呼出しサイト長: %<PRIu64>\n"
+" 離着陸場: %#<PRIx64>\n"
+" 行動: %u\n"
+
+#: src/readelf.c:6460
+#, c-format
+msgid "invalid TType encoding"
+msgstr "不当な TType コード化"
+
+#: src/readelf.c:6484
+#, c-format
+msgid "cannot get debug context descriptor: %s"
+msgstr "デバッグ内容記述子を得られません: %s"
+
+#: src/readelf.c:6620 src/readelf.c:7221
+#, c-format
+msgid "cannot convert core note data: %s"
+msgstr "コアノートデータの変換ができません: %s"
+
+#: src/readelf.c:6961
+#, c-format
+msgid ""
+"\n"
+"%*s... <repeats %u more times> ..."
+msgstr ""
+"\n"
+"%*s... < %u 回の繰返し> ..."
+
+#: src/readelf.c:7320
+msgid " Owner Data size Type\n"
+msgstr " 所有者 データ大きさタイプ\n"
+
+#: src/readelf.c:7338
+#, c-format
+msgid " %-13.*s %9<PRId32> %s\n"
+msgstr " %-13.*s %9<PRId32> %s\n"
+
+#: src/readelf.c:7372
+#, c-format
+msgid "cannot get content of note section: %s"
+msgstr "ノートセクションの内容を得られません: %s"
+
+#: src/readelf.c:7399
+#, c-format
+msgid ""
+"\n"
+"Note section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"オフセット %4$#0<PRIx64> の %3$<PRIu64> バイトのノートセクション [%1$2zu] '%2"
+"$s':\n"
+
+#: src/readelf.c:7422
+#, c-format
+msgid ""
+"\n"
+"Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"オフセット %2$#0<PRIx64> の %1$<PRIu64> バイトのノートセグメント:\n"
+
+#: src/readelf.c:7468
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no data to dump.\n"
+msgstr ""
+"\n"
+"セクション [%Zu] '%s' にはダンプすべきデータがありません。\n"
+
+#: src/readelf.c:7474 src/readelf.c:7497
+#, c-format
+msgid "cannot get data for section [%Zu] '%s': %s"
+msgstr "セクション [%Zu] '%s' からデータが得られません: %s"
+
+#: src/readelf.c:7478
+#, c-format
+msgid ""
+"\n"
+"Hex dump of section [%Zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"オフセット %4$#0<PRIx64> のセクション [%1$Zu] '%2$s' の16進ダンプ、%3"
+"$<PRIu64> バイト:\n"
+
+#: src/readelf.c:7491
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no strings to dump.\n"
+msgstr ""
+"\n"
+"セクション [%Zu] '%s' にはダンプすべきデータがありません。\n"
+
+#: src/readelf.c:7501
+#, c-format
+msgid ""
+"\n"
+"String section [%Zu] '%s' contains %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"オフセット %4$#0<PRIx64> 文字列セクション [%1$Zu] '%2$s' には %3$<PRIu64> バ"
+"イトあります:\n"
+
+#: src/readelf.c:7549
+#, c-format
+msgid ""
+"\n"
+"section [%lu] does not exist"
+msgstr ""
+"\n"
+"セクション [%lu] がありません"
+
+#: src/readelf.c:7576
+#, c-format
+msgid ""
+"\n"
+"section '%s' does not exist"
+msgstr ""
+"\n"
+"セクション '%s' がありません"
+
+#: src/readelf.c:7637
+#, c-format
+msgid "cannot get symbol index of archive '%s': %s"
+msgstr "アーカイブのシンボル索引 '%s' を得られません: %s"
+
+#: src/readelf.c:7640
+#, c-format
+msgid ""
+"\n"
+"Archive '%s' has no symbol index\n"
+msgstr ""
+"\n"
+"アーカイブ '%s' にはシンボル索引がありません\n"
+
+#: src/readelf.c:7644
+#, c-format
+msgid ""
+"\n"
+"Index of archive '%s' has %Zu entries:\n"
+msgstr ""
+"\n"
+"アーカイブ '%s' の索引には %Zu 項目あります:\n"
+
+#: src/readelf.c:7662
+#, c-format
+msgid "cannot extract member at offset %Zu in '%s': %s"
+msgstr "'%2$s' の オフセット %1$Zu のメンバーを抽出できません: %3$s"
+
+#: src/readelf.c:7667
+#, c-format
+msgid "Archive member '%s' contains:\n"
+msgstr "アーカイブメンバー '%s' には以下があります:\n"
+
+#: src/size.c:68
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd' or `sysv'. The default "
+"is `bsd'"
+msgstr ""
+"出力形式として FORMAT を使ってください。FORMAT は `bsd'か、`sysv' のどちらか"
+"です。省略値は `bsd'です"
+
+#: src/size.c:70
+msgid "Same as `--format=sysv'"
+msgstr "`--format=sysv' と同じ"
+
+#: src/size.c:71
+msgid "Same as `--format=bsd'"
+msgstr "`--format=bsd' と同じ"
+
+#: src/size.c:74
+msgid "Same as `--radix=10'"
+msgstr "`--radix=10' と同じ"
+
+#: src/size.c:75
+msgid "Same as `--radix=8'"
+msgstr "`--radix=8' と同じ"
+
+#: src/size.c:76
+msgid "Same as `--radix=16'"
+msgstr "`--radix=16' と同じ"
+
+#: src/size.c:78
+msgid "Similar to `--format=sysv' output but in one line"
+msgstr "`--format=sysv' の出力と似ていますが、1行です"
+
+#: src/size.c:82
+msgid "Print size and permission flags for loadable segments"
+msgstr "ロード可能セグメントのための印刷の大きさと許可フラグ"
+
+#: src/size.c:83
+msgid "Display the total sizes (bsd only)"
+msgstr "合計の大きさを表示 (bsd のみ)"
+
+#: src/size.c:88
+msgid "List section sizes of FILEs (a.out by default)."
+msgstr "ふぁいる のセクションの大きさの一覧 (省略値は a.out)"
+
+#: src/size.c:269
+#, c-format
+msgid "Invalid format: %s"
+msgstr "不当な形式: %s"
+
+#: src/size.c:280
+#, c-format
+msgid "Invalid radix: %s"
+msgstr "不当な基数: %s"
+
+#: src/size.c:339
+#, c-format
+msgid "%s: file format not recognized"
+msgstr "%s: ファイル形式を認識できません"
+
+#: src/size.c:446 src/size.c:589
+#, c-format
+msgid " (ex %s)"
+msgstr " (ex %s)"
+
+#: src/size.c:614
+msgid "(TOTALS)\n"
+msgstr "(合計)\n"
+
+#: src/strings.c:70
+msgid "Output Selection:"
+msgstr ""
+
+#: src/strings.c:71
+msgid "Scan entire file, not only loaded sections"
+msgstr ""
+
+#: src/strings.c:73
+msgid "Only NUL-terminated sequences of MIN-LEN characters or more are printed"
+msgstr ""
+
+#: src/strings.c:74
+msgid ""
+"Select character size and endianess: s = 7-bit, S = 8-bit, {b,l} = 16-bit, "
+"{B,L} = 32-bit"
+msgstr ""
+
+#: src/strings.c:78
+msgid "Print name of the file before each string."
+msgstr ""
+
+#: src/strings.c:80
+msgid "Print location of the string in base 8, 10, or 16 respectively."
+msgstr ""
+
+#: src/strings.c:81
+msgid "Alias for --radix=o"
+msgstr ""
+
+#: src/strings.c:88
+msgid "Print the strings of printable characters in files."
+msgstr ""
+
+#: src/strings.c:268 src/strings.c:303
+#, c-format
+msgid "invalid value '%s' for %s parameter"
+msgstr ""
+
+#: src/strings.c:314
+#, c-format
+msgid "invalid minimum length of matched string size"
+msgstr ""
+
+#: src/strings.c:601
+#, c-format
+msgid "lseek64 failed"
+msgstr ""
+
+#: src/strings.c:616 src/strings.c:680
+#, c-format
+msgid "re-mmap failed"
+msgstr ""
+
+#: src/strings.c:653
+#, c-format
+msgid "mprotect failed"
+msgstr ""
+
+#: src/strip.c:74
+msgid "Place stripped output into FILE"
+msgstr "はぎ取った出力を ふぁいる に置く"
+
+#: src/strip.c:75
+msgid "Extract the removed sections into FILE"
+msgstr "抽出した取り除いたセクションを ふぁいる に置く"
+
+#: src/strip.c:76
+msgid "Embed name FILE instead of -f argument"
+msgstr "-f パラメーターの代わりに 名前 ふぁいる を有効にする"
+
+#: src/strip.c:80
+msgid "Remove all debugging symbols"
+msgstr "デバッグ用のシンボルを全て取り除く"
+
+#: src/strip.c:84
+msgid "Copy modified/access timestamps to the output"
+msgstr "修正/アクセスタイムスタンプを出力へ複写する"
+
+#: src/strip.c:86
+msgid "Remove .comment section"
+msgstr ".comment セクションを取り除く"
+
+#: src/strip.c:89
+msgid "Relax a few rules to handle slightly broken ELF files"
+msgstr "少し壊れた ELF ファイルを取り扱うためにルールを少し緩和する"
+
+#: src/strip.c:94
+msgid "Discard symbols from object files."
+msgstr "オブジェクトファイルからシンボルを破棄する"
+
+#: src/strip.c:186
+#, c-format
+msgid "Only one input file allowed together with '-o' and '-f'"
+msgstr "'-o' と '-f' と一緒の場合は入力ファイルは 1 つしか認められません"
+
+#: src/strip.c:222
+#, c-format
+msgid "-f option specified twice"
+msgstr "-f オプションが 2 回指定されています"
+
+#: src/strip.c:231
+#, c-format
+msgid "-F option specified twice"
+msgstr "-F オプションが 2 回指定されています"
+
+#: src/strip.c:240 src/unstrip.c:125
+#, c-format
+msgid "-o option specified twice"
+msgstr "-o オプションが 2 回指定されています"
+
+#: src/strip.c:260
+#, c-format
+msgid "-R option supports only .comment section"
+msgstr "-R オプションは .comment セクションのみをサポートします"
+
+#: src/strip.c:298 src/strip.c:322
+#, c-format
+msgid "cannot stat input file '%s'"
+msgstr "入力ファイル '%s' を stat できません"
+
+#: src/strip.c:312
+#, c-format
+msgid "while opening '%s'"
+msgstr "'%s' を開いている間"
+
+#: src/strip.c:350
+#, c-format
+msgid "%s: cannot use -o or -f when stripping archive"
+msgstr "%s: アーカイブから抜き出している時は -o や -f は使えません"
+
+#: src/strip.c:448
+#, c-format
+msgid "cannot open EBL backend"
+msgstr "EBL バックエンドを開けません"
+
+#: src/strip.c:498 src/strip.c:522
+#, c-format
+msgid "cannot create new file '%s': %s"
+msgstr "新しいファイル '%s' を生成できません: %s"
+
+#: src/strip.c:582
+#, c-format
+msgid "illformed file '%s'"
+msgstr "不適格なファイル '%s'"
+
+#: src/strip.c:869 src/strip.c:956
+#, c-format
+msgid "while generating output file: %s"
+msgstr "出力ファイルを生成している間: %s"
+
+#: src/strip.c:929 src/strip.c:1668
+#, c-format
+msgid "%s: error while creating ELF header: %s"
+msgstr "%s: ELF ヘッダーを生成している間にエラー: %s"
+
+#: src/strip.c:943
+#, c-format
+msgid "while preparing output for '%s'"
+msgstr "'%s' のための出力を準備している間"
+
+#: src/strip.c:994 src/strip.c:1050
+#, c-format
+msgid "while create section header section: %s"
+msgstr "セクションヘッダーセクションを生成している間: %s"
+
+#: src/strip.c:1000
+#, c-format
+msgid "cannot allocate section data: %s"
+msgstr "セクションデータを割り当てられません: %s"
+
+#: src/strip.c:1059
+#, c-format
+msgid "while create section header string table: %s"
+msgstr "セクションヘッダー文字列テーブルを生成中: %s"
+
+#: src/strip.c:1593 src/strip.c:1690
+#, c-format
+msgid "while writing '%s': %s"
+msgstr "'%s' を書込み中: %s"
+
+#: src/strip.c:1604
+#, c-format
+msgid "while creating '%s'"
+msgstr "'%s' を生成中"
+
+#: src/strip.c:1616
+#, c-format
+msgid "while computing checksum for debug information"
+msgstr "デバッグ情報のチェックサムを計算中"
+
+#: src/strip.c:1676
+#, c-format
+msgid "%s: error while reading the file: %s"
+msgstr "%s: ファイルを読込み中にエラー: %s"
+
+#: src/strip.c:1722 src/strip.c:1729
+#, c-format
+msgid "error while finishing '%s': %s"
+msgstr "'%s' の終了中にエラー: %s"
+
+#: src/strip.c:1752 src/strip.c:1809
+#, c-format
+msgid "cannot set access and modification date of '%s'"
+msgstr "'%s' のアクセスと変更日付を設定できません"
+
+#: src/unstrip.c:78
+msgid "Match MODULE against file names, not module names"
+msgstr ""
+
+#: src/unstrip.c:79
+msgid "Silently skip unfindable files"
+msgstr ""
+
+#: src/unstrip.c:82
+msgid "Place output into FILE"
+msgstr ""
+
+#: src/unstrip.c:84
+msgid "Create multiple output files under DIRECTORY"
+msgstr ""
+
+#: src/unstrip.c:85
+msgid "Use module rather than file names"
+msgstr ""
+
+#: src/unstrip.c:87
+msgid "Create output for modules that have no separate debug information"
+msgstr ""
+
+#: src/unstrip.c:90
+msgid "Apply relocations to section contents in ET_REL files"
+msgstr ""
+
+#: src/unstrip.c:92
+msgid "Only list module and file names, build IDs"
+msgstr ""
+
+#: src/unstrip.c:134
+#, c-format
+msgid "-d option specified twice"
+msgstr ""
+
+#: src/unstrip.c:166
+#, c-format
+msgid "only one of -o or -d allowed"
+msgstr ""
+
+#: src/unstrip.c:175
+#, c-format
+msgid "-n cannot be used with explicit files or -o or -d"
+msgstr ""
+
+#: src/unstrip.c:190
+#, c-format
+msgid "output directory '%s'"
+msgstr ""
+
+#: src/unstrip.c:199
+#, c-format
+msgid "exactly two file arguments are required"
+msgstr ""
+
+#: src/unstrip.c:205
+#, c-format
+msgid "-m, -a, -R, and -i options not allowed with explicit files"
+msgstr ""
+
+#: src/unstrip.c:218
+#, c-format
+msgid "-o or -d is required when using implicit files"
+msgstr ""
+
+#: src/unstrip.c:254
+#, c-format
+msgid "cannot create ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:259
+#, c-format
+msgid "cannot copy ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:264 src/unstrip.c:1817
+#, c-format
+msgid "cannot create program headers: %s"
+msgstr ""
+
+#: src/unstrip.c:270
+#, c-format
+msgid "cannot copy program header: %s"
+msgstr ""
+
+#: src/unstrip.c:280
+#, c-format
+msgid "cannot copy section header: %s"
+msgstr ""
+
+#: src/unstrip.c:283 src/unstrip.c:1505
+#, c-format
+msgid "cannot get section data: %s"
+msgstr ""
+
+#: src/unstrip.c:285 src/unstrip.c:1507
+#, c-format
+msgid "cannot copy section data: %s"
+msgstr ""
+
+#: src/unstrip.c:309
+#, c-format
+msgid "cannot create directory '%s'"
+msgstr ""
+
+#: src/unstrip.c:349 src/unstrip.c:763 src/unstrip.c:1540
+#, c-format
+msgid "cannot get symbol table entry: %s"
+msgstr ""
+
+#: src/unstrip.c:365 src/unstrip.c:580 src/unstrip.c:601 src/unstrip.c:613
+#: src/unstrip.c:1561 src/unstrip.c:1691 src/unstrip.c:1715
+#, c-format
+msgid "cannot update symbol table: %s"
+msgstr ""
+
+#: src/unstrip.c:382 src/unstrip.c:432 src/unstrip.c:562 src/unstrip.c:1209
+#: src/unstrip.c:1525 src/unstrip.c:1720 src/unstrip.c:1791
+#, c-format
+msgid "cannot update section header: %s"
+msgstr ""
+
+#: src/unstrip.c:408 src/unstrip.c:419
+#, c-format
+msgid "cannot update relocation: %s"
+msgstr ""
+
+#: src/unstrip.c:507
+#, c-format
+msgid "cannot get symbol version: %s"
+msgstr ""
+
+#: src/unstrip.c:519
+#, c-format
+msgid "unexpected section type in [%Zu] with sh_link to symtab"
+msgstr ""
+
+#: src/unstrip.c:769
+#, c-format
+msgid "invalid string offset in symbol [%Zu]"
+msgstr ""
+
+#: src/unstrip.c:911 src/unstrip.c:1248
+#, c-format
+msgid "cannot read section [%Zu] name: %s"
+msgstr ""
+
+#: src/unstrip.c:952 src/unstrip.c:971 src/unstrip.c:1004
+#, c-format
+msgid "cannot read '.gnu.prelink_undo' section: %s"
+msgstr ""
+
+#: src/unstrip.c:992
+#, c-format
+msgid "invalid contents in '%s' section"
+msgstr ""
+
+#: src/unstrip.c:1047 src/unstrip.c:1370
+#, c-format
+msgid "cannot find matching section for [%Zu] '%s'"
+msgstr ""
+
+#: src/unstrip.c:1171 src/unstrip.c:1186 src/unstrip.c:1451
+#, c-format
+msgid "cannot add section name to string table: %s"
+msgstr ""
+
+#: src/unstrip.c:1195
+#, c-format
+msgid "cannot update section header string table data: %s"
+msgstr ""
+
+#: src/unstrip.c:1223 src/unstrip.c:1227
+#, c-format
+msgid "cannot get section header string table section index: %s"
+msgstr ""
+
+#: src/unstrip.c:1231 src/unstrip.c:1235 src/unstrip.c:1466
+#, c-format
+msgid "cannot get section count: %s"
+msgstr ""
+
+#: src/unstrip.c:1293 src/unstrip.c:1385
+#, c-format
+msgid "cannot read section header string table: %s"
+msgstr ""
+
+#: src/unstrip.c:1445
+#, c-format
+msgid "cannot add new section: %s"
+msgstr ""
+
+#: src/unstrip.c:1548
+#, c-format
+msgid "symbol [%Zu] has invalid section index"
+msgstr ""
+
+#: src/unstrip.c:1800
+#, c-format
+msgid "cannot get ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:1827
+#, c-format
+msgid "cannot update program header: %s"
+msgstr ""
+
+#: src/unstrip.c:1832 src/unstrip.c:1911
+#, c-format
+msgid "cannot write output file: %s"
+msgstr ""
+
+#: src/unstrip.c:1880
+#, c-format
+msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+
+#: src/unstrip.c:1883
+#, c-format
+msgid ""
+"DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+
+#: src/unstrip.c:1902 src/unstrip.c:1942 src/unstrip.c:1954 src/unstrip.c:2034
+#, c-format
+msgid "cannot create ELF descriptor: %s"
+msgstr ""
+
+#: src/unstrip.c:1960
+#, c-format
+msgid "'%s' and '%s' do not seem to match"
+msgstr ""
+
+#: src/unstrip.c:1991
+#, c-format
+msgid "cannot find stripped file for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:1995
+#, c-format
+msgid "cannot open stripped file '%s' for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2010
+#, c-format
+msgid "cannot find debug file for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2014
+#, c-format
+msgid "cannot open debug file '%s' for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2027
+#, c-format
+msgid "module '%s' file '%s' is not stripped"
+msgstr ""
+
+#: src/unstrip.c:2058
+#, c-format
+msgid "cannot cache section addresses for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2191
+#, c-format
+msgid "no matching modules found"
+msgstr ""
+
+#: src/unstrip.c:2200
+#, c-format
+msgid "matched more than one module"
+msgstr ""
+
+#: src/unstrip.c:2247
+msgid ""
+"STRIPPED-FILE DEBUG-FILE\n"
+"[MODULE...]"
+msgstr ""
+
+#: src/unstrip.c:2248
+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"
+"\n"
+"MODULE arguments give file name patterns matching modules to process.\n"
+"With -f these match the file name of the main (stripped) file (slashes are "
+"never special), otherwise they match the simple module names. With no "
+"arguments, process all modules found.\n"
+"\n"
+"Multiple modules are written to files under OUTPUT-DIRECTORY, creating "
+"subdirectories as needed. With -m these files have simple module names, "
+"otherwise they have the name of the main file complete with directory "
+"underneath OUTPUT-DIRECTORY.\n"
+"\n"
+"With -n no files are written, but one line to standard output for each "
+"module:\n"
+"\tSTART+SIZE BUILDID FILE DEBUGFILE MODULENAME\n"
+"START and SIZE are hexadecimal giving the address bounds of the module. "
+"BUILDID is hexadecimal for the build ID bits, or - if no ID is known; the "
+"hexadecimal may be followed by @0xADDR giving the address where the ID "
+"resides if that is known. FILE is the file name found for the module, or - "
+"if none was found, or . if an ELF image is available but not from any named "
+"file. DEBUGFILE is the separate debuginfo file name, or - if no debuginfo "
+"was found, or . if FILE contains the debug information."
+msgstr ""
+
+#~ msgid " Version String: "
+#~ msgstr "バージョン文字列:"
+
+#~ msgid "Equivalent to: -e -h -l"
+#~ msgstr "右記と同等: -e -h -l"
+
+#~ msgid ""
+#~ "\n"
+#~ "Section [%Zu] '%s' is empty.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "セクション [%Zu] '%s' は空です。\n"
diff --git a/po/nl.po b/po/nl.po
new file mode 100644
index 00000000..fa608682
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,5666 @@
+# Dutch translation of elfutils
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+# Geert Warrink <geert.warrink@onsnet.nu>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Elfutils\n"
+"Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
+"POT-Creation-Date: 2010-04-21 07:41-0700\n"
+"PO-Revision-Date: 2009-09-01 18:02+0200\n"
+"Last-Translator: Geert Warrink <geert.warrink@onsnet.nu>\n"
+"Language-Team: nl <nl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+
+#: lib/xmalloc.c:51 lib/xmalloc.c:65 lib/xmalloc.c:79 src/readelf.c:2822
+#: src/readelf.c:3161 src/unstrip.c:2087 src/unstrip.c:2295
+#, c-format
+msgid "memory exhausted"
+msgstr ""
+
+#: libasm/asm_error.c:62 libdw/dwarf_error.c:79 libdwfl/libdwflP.h:70
+#: libelf/elf_error.c:81
+msgid "no error"
+msgstr ""
+
+#: libasm/asm_error.c:63 libdw/dwarf_error.c:88 libdwfl/libdwflP.h:72
+#: libelf/elf_error.c:112
+msgid "out of memory"
+msgstr ""
+
+#: libasm/asm_error.c:64 src/ldgeneric.c:2687
+#, c-format
+msgid "cannot create output file"
+msgstr ""
+
+#: libasm/asm_error.c:65
+msgid "invalid parameter"
+msgstr ""
+
+#: libasm/asm_error.c:66
+msgid "cannot change mode of output file"
+msgstr ""
+
+#: libasm/asm_error.c:67 src/ldgeneric.c:7001
+#, c-format
+msgid "cannot rename output file"
+msgstr ""
+
+#: libasm/asm_error.c:68
+msgid "duplicate symbol"
+msgstr ""
+
+#: libasm/asm_error.c:69
+msgid "invalid section type for operation"
+msgstr ""
+
+#: libasm/asm_error.c:70
+msgid "error during output of data"
+msgstr ""
+
+#: libasm/asm_error.c:71
+msgid "no backend support available"
+msgstr ""
+
+#: libasm/asm_error.c:81 libdw/dwarf_error.c:80 libdwfl/libdwflP.h:71
+#: libelf/elf_error.c:84
+msgid "unknown error"
+msgstr ""
+
+#: libdw/dwarf_error.c:81
+msgid "invalid access"
+msgstr ""
+
+#: libdw/dwarf_error.c:82
+msgid "no regular file"
+msgstr ""
+
+#: libdw/dwarf_error.c:83
+msgid "I/O error"
+msgstr ""
+
+#: libdw/dwarf_error.c:84
+msgid "invalid ELF file"
+msgstr ""
+
+#: libdw/dwarf_error.c:85
+msgid "no DWARF information"
+msgstr ""
+
+#: libdw/dwarf_error.c:86
+msgid "no ELF file"
+msgstr ""
+
+#: libdw/dwarf_error.c:87
+msgid "cannot get ELF header"
+msgstr ""
+
+#: libdw/dwarf_error.c:89
+msgid "not implemented"
+msgstr ""
+
+#: libdw/dwarf_error.c:90 libelf/elf_error.c:128 libelf/elf_error.c:176
+msgid "invalid command"
+msgstr ""
+
+#: libdw/dwarf_error.c:91
+msgid "invalid version"
+msgstr ""
+
+#: libdw/dwarf_error.c:92
+msgid "invalid file"
+msgstr ""
+
+#: libdw/dwarf_error.c:93
+msgid "no entries found"
+msgstr ""
+
+#: libdw/dwarf_error.c:94
+msgid "invalid DWARF"
+msgstr ""
+
+#: libdw/dwarf_error.c:95
+msgid "no string data"
+msgstr ""
+
+#: libdw/dwarf_error.c:96
+msgid "no address value"
+msgstr ""
+
+#: libdw/dwarf_error.c:97
+msgid "no constant value"
+msgstr ""
+
+#: libdw/dwarf_error.c:98
+msgid "no reference value"
+msgstr ""
+
+#: libdw/dwarf_error.c:99
+msgid "invalid reference value"
+msgstr ""
+
+#: libdw/dwarf_error.c:100
+msgid ".debug_line section missing"
+msgstr ""
+
+#: libdw/dwarf_error.c:101
+msgid "invalid .debug_line section"
+msgstr ""
+
+#: libdw/dwarf_error.c:102
+msgid "debug information too big"
+msgstr ""
+
+#: libdw/dwarf_error.c:103
+msgid "invalid DWARF version"
+msgstr ""
+
+#: libdw/dwarf_error.c:104
+msgid "invalid directory index"
+msgstr ""
+
+#: libdw/dwarf_error.c:105 libdwfl/libdwflP.h:91
+msgid "address out of range"
+msgstr ""
+
+#: libdw/dwarf_error.c:106
+msgid "no location list value"
+msgstr ""
+
+#: libdw/dwarf_error.c:107
+msgid "no block data"
+msgstr ""
+
+#: libdw/dwarf_error.c:108
+msgid "invalid line index"
+msgstr ""
+
+#: libdw/dwarf_error.c:109
+msgid "invalid address range index"
+msgstr ""
+
+#: libdw/dwarf_error.c:110 libdwfl/libdwflP.h:92
+msgid "no matching address range"
+msgstr ""
+
+#: libdw/dwarf_error.c:111
+msgid "no flag value"
+msgstr ""
+
+#: libdw/dwarf_error.c:112 libelf/elf_error.c:253
+msgid "invalid offset"
+msgstr ""
+
+#: libdw/dwarf_error.c:113
+msgid ".debug_ranges section missing"
+msgstr ""
+
+#: libdw/dwarf_error.c:114
+msgid "invalid CFI section"
+msgstr ""
+
+#: libdwfl/argp-std.c:67 src/unstrip.c:2237
+msgid "Input selection options:"
+msgstr ""
+
+#: libdwfl/argp-std.c:68
+msgid "Find addresses in FILE"
+msgstr ""
+
+#: libdwfl/argp-std.c:70
+msgid "Find addresses from signatures found in COREFILE"
+msgstr ""
+
+#: libdwfl/argp-std.c:72
+msgid "Find addresses in files mapped into process PID"
+msgstr ""
+
+#: libdwfl/argp-std.c:74
+msgid ""
+"Find addresses in files mapped as read from FILE in Linux /proc/PID/maps "
+"format"
+msgstr ""
+
+#: libdwfl/argp-std.c:76
+msgid "Find addresses in the running kernel"
+msgstr ""
+
+#: libdwfl/argp-std.c:78
+msgid "Kernel with all modules"
+msgstr ""
+
+#: libdwfl/argp-std.c:80
+msgid "Search path for separate debuginfo files"
+msgstr ""
+
+#: libdwfl/argp-std.c:163
+msgid "only one of -e, -p, -k, -K, or --core allowed"
+msgstr ""
+
+#: libdwfl/argp-std.c:223
+#, c-format
+msgid "cannot read ELF core file: %s"
+msgstr ""
+
+#: libdwfl/argp-std.c:241
+msgid "No modules recognized in core file"
+msgstr ""
+
+#: libdwfl/argp-std.c:253
+msgid "cannot load kernel symbols"
+msgstr ""
+
+#: libdwfl/argp-std.c:257
+msgid "cannot find kernel modules"
+msgstr ""
+
+#: libdwfl/argp-std.c:271
+msgid "cannot find kernel or modules"
+msgstr ""
+
+#: libdwfl/libdwflP.h:73
+msgid "See errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:74
+msgid "See elf_errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:75
+msgid "See dwarf_errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:76
+msgid "See ebl_errno (XXX missing)"
+msgstr ""
+
+#: libdwfl/libdwflP.h:77
+msgid "gzip decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:78
+msgid "bzip2 decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:79
+msgid "LZMA decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:80
+msgid "no support library found for machine"
+msgstr ""
+
+#: libdwfl/libdwflP.h:81
+msgid "Callbacks missing for ET_REL file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:82
+msgid "Unsupported relocation type"
+msgstr ""
+
+#: libdwfl/libdwflP.h:83
+msgid "r_offset is bogus"
+msgstr ""
+
+#: libdwfl/libdwflP.h:84 libelf/elf_error.c:132 libelf/elf_error.c:192
+msgid "offset out of range"
+msgstr ""
+
+#: libdwfl/libdwflP.h:85
+msgid "relocation refers to undefined symbol"
+msgstr ""
+
+#: libdwfl/libdwflP.h:86
+msgid "Callback returned failure"
+msgstr ""
+
+#: libdwfl/libdwflP.h:87
+msgid "No DWARF information found"
+msgstr ""
+
+#: libdwfl/libdwflP.h:88
+msgid "No symbol table found"
+msgstr ""
+
+#: libdwfl/libdwflP.h:89
+msgid "No ELF program headers"
+msgstr ""
+
+#: libdwfl/libdwflP.h:90
+msgid "address range overlaps an existing module"
+msgstr ""
+
+#: libdwfl/libdwflP.h:93
+msgid "image truncated"
+msgstr ""
+
+#: libdwfl/libdwflP.h:94
+msgid "ELF file opened"
+msgstr ""
+
+#: libdwfl/libdwflP.h:95
+msgid "not a valid ELF file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:96
+msgid "cannot handle DWARF type description"
+msgstr ""
+
+#: libebl/eblbackendname.c:63
+msgid "No backend"
+msgstr ""
+
+#: libebl/eblcorenotetypename.c:107 libebl/eblobjecttypename.c:78
+#: libebl/eblobjnotetypename.c:86 libebl/eblosabiname.c:98
+#: libebl/eblsectionname.c:110 libebl/eblsectiontypename.c:140
+#: libebl/eblsegmenttypename.c:104
+msgid "<unknown>"
+msgstr ""
+
+#: libebl/ebldynamictagname.c:126
+#, c-format
+msgid "<unknown>: %#<PRIx64>"
+msgstr ""
+
+#: libebl/eblobjnote.c:76
+#, c-format
+msgid " Build ID: "
+msgstr ""
+
+#: libebl/eblobjnote.c:87
+#, c-format
+msgid " Linker version: %.*s\n"
+msgstr ""
+
+#: libebl/eblobjnote.c:136
+#, c-format
+msgid " OS: %s, ABI: "
+msgstr ""
+
+#: libebl/eblosabiname.c:95
+msgid "Stand alone"
+msgstr ""
+
+#: libebl/eblsymbolbindingname.c:92 libebl/eblsymboltypename.c:98
+#, c-format
+msgid "<unknown>: %d"
+msgstr ""
+
+#: libelf/elf_error.c:88
+msgid "unknown version"
+msgstr ""
+
+#: libelf/elf_error.c:92
+msgid "unknown type"
+msgstr ""
+
+#: libelf/elf_error.c:96
+msgid "invalid `Elf' handle"
+msgstr ""
+
+#: libelf/elf_error.c:100
+msgid "invalid size of source operand"
+msgstr ""
+
+#: libelf/elf_error.c:104
+msgid "invalid size of destination operand"
+msgstr ""
+
+#: libelf/elf_error.c:108 src/readelf.c:4779
+#, c-format
+msgid "invalid encoding"
+msgstr ""
+
+#: libelf/elf_error.c:116
+msgid "invalid file descriptor"
+msgstr ""
+
+#: libelf/elf_error.c:120
+msgid "invalid operation"
+msgstr ""
+
+#: libelf/elf_error.c:124
+msgid "ELF version not set"
+msgstr ""
+
+#: libelf/elf_error.c:136
+msgid "invalid fmag field in archive header"
+msgstr ""
+
+#: libelf/elf_error.c:140
+msgid "invalid archive file"
+msgstr ""
+
+#: libelf/elf_error.c:144
+msgid "descriptor is not for an archive"
+msgstr ""
+
+#: libelf/elf_error.c:148
+msgid "no index available"
+msgstr ""
+
+#: libelf/elf_error.c:152
+msgid "cannot read data from file"
+msgstr ""
+
+#: libelf/elf_error.c:156
+msgid "cannot write data to file"
+msgstr ""
+
+#: libelf/elf_error.c:160
+msgid "invalid binary class"
+msgstr ""
+
+#: libelf/elf_error.c:164
+msgid "invalid section index"
+msgstr ""
+
+#: libelf/elf_error.c:168
+msgid "invalid operand"
+msgstr ""
+
+#: libelf/elf_error.c:172
+msgid "invalid section"
+msgstr ""
+
+#: libelf/elf_error.c:180
+msgid "executable header not created first"
+msgstr ""
+
+#: libelf/elf_error.c:184
+msgid "file descriptor disabled"
+msgstr ""
+
+#: libelf/elf_error.c:188
+msgid "archive/member file descriptor mismatch"
+msgstr ""
+
+#: libelf/elf_error.c:196
+msgid "cannot manipulate null section"
+msgstr ""
+
+#: libelf/elf_error.c:200
+msgid "data/scn mismatch"
+msgstr ""
+
+#: libelf/elf_error.c:204
+msgid "invalid section header"
+msgstr ""
+
+#: libelf/elf_error.c:208 src/readelf.c:6242 src/readelf.c:6343
+#, c-format
+msgid "invalid data"
+msgstr ""
+
+#: libelf/elf_error.c:212
+msgid "unknown data encoding"
+msgstr ""
+
+#: libelf/elf_error.c:216
+msgid "section `sh_size' too small for data"
+msgstr ""
+
+#: libelf/elf_error.c:220
+msgid "invalid section alignment"
+msgstr ""
+
+#: libelf/elf_error.c:224
+msgid "invalid section entry size"
+msgstr ""
+
+#: libelf/elf_error.c:228
+msgid "update() for write on read-only file"
+msgstr ""
+
+#: libelf/elf_error.c:232
+msgid "no such file"
+msgstr ""
+
+#: libelf/elf_error.c:236
+msgid "only relocatable files can contain section groups"
+msgstr ""
+
+#: libelf/elf_error.c:241
+msgid ""
+"program header only allowed in executables, shared objects, and core files"
+msgstr ""
+
+#: libelf/elf_error.c:248
+msgid "file has no program header"
+msgstr ""
+
+#: src/addr2line.c:66
+msgid "Output selection options:"
+msgstr ""
+
+#: src/addr2line.c:67
+msgid "Show only base names of source files"
+msgstr ""
+
+#: src/addr2line.c:69
+msgid "Show absolute file names using compilation directory"
+msgstr ""
+
+#: src/addr2line.c:70
+msgid "Also show function names"
+msgstr ""
+
+#: src/addr2line.c:71
+msgid "Also show symbol or section names"
+msgstr ""
+
+#: src/addr2line.c:73
+msgid "Treat addresses as offsets relative to NAME section."
+msgstr ""
+
+#: src/addr2line.c:75 src/elfcmp.c:75 src/findtextrel.c:75 src/nm.c:103
+#: src/strings.c:83
+msgid "Miscellaneous:"
+msgstr ""
+
+#: src/addr2line.c:84
+msgid ""
+"Locate source files and line information for ADDRs (in a.out by default)."
+msgstr ""
+
+#: src/addr2line.c:88
+msgid "[ADDR...]"
+msgstr ""
+
+#: src/addr2line.c:185 src/ar.c:289 src/elfcmp.c:555 src/elflint.c:239
+#: src/findtextrel.c:170 src/ld.c:957 src/nm.c:253 src/objdump.c:181
+#: src/ranlib.c:136 src/readelf.c:449 src/size.c:219 src/strings.c:227
+#: src/strip.c:204 src/unstrip.c:234
+#, c-format
+msgid ""
+"Copyright (C) %s Red Hat, Inc.\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+
+#: src/addr2line.c:190 src/ar.c:294 src/elfcmp.c:560 src/elflint.c:244
+#: src/findtextrel.c:175 src/ld.c:962 src/nm.c:258 src/objdump.c:186
+#: src/ranlib.c:141 src/readelf.c:454 src/size.c:224 src/strings.c:232
+#: src/strip.c:209 src/unstrip.c:239
+#, c-format
+msgid "Written by %s.\n"
+msgstr ""
+
+#: src/addr2line.c:405
+#, c-format
+msgid "Section syntax requires exactly one module"
+msgstr ""
+
+#: src/addr2line.c:428
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside section '%s'"
+msgstr ""
+
+#: src/addr2line.c:461
+#, c-format
+msgid "cannot find symbol '%s'"
+msgstr ""
+
+#: src/addr2line.c:466
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
+msgstr ""
+
+#: src/ar.c:76
+msgid "Commands:"
+msgstr ""
+
+#: src/ar.c:77
+msgid "Delete files from archive."
+msgstr ""
+
+#: src/ar.c:78
+msgid "Move files in archive."
+msgstr ""
+
+#: src/ar.c:79
+msgid "Print files in archive."
+msgstr ""
+
+#: src/ar.c:80
+msgid "Quick append files to archive."
+msgstr ""
+
+#: src/ar.c:82
+msgid "Replace existing or insert new file into archive."
+msgstr ""
+
+#: src/ar.c:83
+msgid "Display content of archive."
+msgstr ""
+
+#: src/ar.c:84
+msgid "Extract files from archive."
+msgstr ""
+
+#: src/ar.c:86
+msgid "Command Modifiers:"
+msgstr ""
+
+#: src/ar.c:87
+msgid "Preserve original dates."
+msgstr ""
+
+#: src/ar.c:88
+msgid "Use instance [COUNT] of name."
+msgstr ""
+
+#: src/ar.c:90
+msgid "Do not replace existing files with extracted files."
+msgstr ""
+
+#: src/ar.c:91
+msgid "Allow filename to be truncated if necessary."
+msgstr ""
+
+#: src/ar.c:93
+msgid "Provide verbose output."
+msgstr ""
+
+#: src/ar.c:94
+msgid "Force regeneration of symbol table."
+msgstr ""
+
+#: src/ar.c:95
+msgid "Insert file after [MEMBER]."
+msgstr ""
+
+#: src/ar.c:96
+msgid "Insert file before [MEMBER]."
+msgstr ""
+
+#: src/ar.c:97
+msgid "Same as -b."
+msgstr ""
+
+#: src/ar.c:98
+msgid "Suppress message when library has to be created."
+msgstr ""
+
+#: src/ar.c:100
+msgid "Use full path for file matching."
+msgstr ""
+
+#: src/ar.c:101
+msgid "Update only older files in archive."
+msgstr ""
+
+#: src/ar.c:107
+msgid "Create, modify, and extract from archives."
+msgstr ""
+
+#: src/ar.c:110
+msgid "[MEMBER] [COUNT] ARCHIVE [FILE...]"
+msgstr ""
+
+#: src/ar.c:192
+#, c-format
+msgid "'a', 'b', and 'i' are only allowed with the 'm' and 'r' options"
+msgstr ""
+
+#: src/ar.c:197
+#, c-format
+msgid "MEMBER parameter required for 'a', 'b', and 'i' modifiers"
+msgstr ""
+
+#: src/ar.c:213
+#, c-format
+msgid "'N' is only meaningful with the 'x' and 'd' options"
+msgstr ""
+
+#: src/ar.c:218
+#, c-format
+msgid "COUNT parameter required"
+msgstr ""
+
+#: src/ar.c:230
+#, c-format
+msgid "invalid COUNT parameter %s"
+msgstr ""
+
+#: src/ar.c:237
+#, c-format
+msgid "'%c' is only meaningful with the 'x' option"
+msgstr ""
+
+#: src/ar.c:243
+#, c-format
+msgid "archive name required"
+msgstr ""
+
+#: src/ar.c:314
+#, c-format
+msgid "More than one operation specified"
+msgstr ""
+
+#: src/ar.c:404
+#, c-format
+msgid "cannot open archive '%s'"
+msgstr ""
+
+#: src/ar.c:414
+#, c-format
+msgid "cannot open archive '%s': %s"
+msgstr ""
+
+#: src/ar.c:418
+#, c-format
+msgid "%s: not an archive file"
+msgstr ""
+
+#: src/ar.c:422
+#, c-format
+msgid "cannot stat archive '%s'"
+msgstr ""
+
+#: src/ar.c:434
+#, c-format
+msgid "no entry %s in archive\n"
+msgstr ""
+
+#: src/ar.c:487 src/ar.c:929 src/ar.c:1129
+#, c-format
+msgid "cannot create hash table"
+msgstr ""
+
+#: src/ar.c:494 src/ar.c:936 src/ar.c:1138
+#, c-format
+msgid "cannot insert into hash table"
+msgstr ""
+
+#: src/ar.c:502 src/ranlib.c:176
+#, c-format
+msgid "cannot stat '%s'"
+msgstr ""
+
+#: src/ar.c:598
+#, c-format
+msgid "cannot read content of %s: %s"
+msgstr ""
+
+#: src/ar.c:641
+#, c-format
+msgid "cannot open %.*s"
+msgstr ""
+
+#: src/ar.c:663
+#, c-format
+msgid "failed to write %s"
+msgstr ""
+
+#: src/ar.c:675
+#, c-format
+msgid "cannot change mode of %s"
+msgstr ""
+
+#: src/ar.c:691
+#, c-format
+msgid "cannot change modification time of %s"
+msgstr ""
+
+#: src/ar.c:737
+#, c-format
+msgid "cannot rename temporary file to %.*s"
+msgstr ""
+
+#: src/ar.c:773 src/ar.c:1021 src/ar.c:1419 src/ranlib.c:250
+#, c-format
+msgid "cannot create new file"
+msgstr ""
+
+#: src/ar.c:1220
+#, c-format
+msgid "position member %s not found"
+msgstr ""
+
+#: src/ar.c:1230
+#, c-format
+msgid "%s: no entry %s in archive!\n"
+msgstr ""
+
+#: src/ar.c:1259 src/ldgeneric.c:519 src/objdump.c:257
+#, c-format
+msgid "cannot open %s"
+msgstr ""
+
+#: src/ar.c:1264
+#, c-format
+msgid "cannot stat %s"
+msgstr ""
+
+#: src/ar.c:1270
+#, c-format
+msgid "%s is no regular file"
+msgstr ""
+
+#: src/ar.c:1283
+#, c-format
+msgid "cannot get ELF descriptor for %s: %s\n"
+msgstr ""
+
+#: src/ar.c:1302
+#, c-format
+msgid "cannot read %s: %s"
+msgstr ""
+
+#: src/arlib.c:215
+#, c-format
+msgid "the archive '%s' is too large"
+msgstr ""
+
+#: src/arlib.c:228
+#, c-format
+msgid "cannot read ELF header of %s(%s): %s"
+msgstr ""
+
+#: src/elfcmp.c:69
+msgid "Control options:"
+msgstr ""
+
+#: src/elfcmp.c:70
+msgid ""
+"Control treatment of gaps in loadable segments [ignore|match] (default: "
+"ignore)"
+msgstr ""
+
+#: src/elfcmp.c:72
+msgid "Ignore permutation of buckets in SHT_HASH section"
+msgstr ""
+
+#: src/elfcmp.c:73
+msgid "Output nothing; yield exit status only"
+msgstr ""
+
+#: src/elfcmp.c:80
+msgid "Compare relevant parts of two ELF files for equality."
+msgstr ""
+
+#: src/elfcmp.c:84
+msgid "FILE1 FILE2"
+msgstr ""
+
+#: src/elfcmp.c:140
+msgid "Invalid number of parameters.\n"
+msgstr ""
+
+#: src/elfcmp.c:168 src/elfcmp.c:173
+#, c-format
+msgid "cannot get ELF header of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:190
+#, c-format
+msgid "%s %s diff: ELF header"
+msgstr ""
+
+#: src/elfcmp.c:198 src/elfcmp.c:201
+#, c-format
+msgid "cannot get section count of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:206
+#, c-format
+msgid "%s %s diff: section count"
+msgstr ""
+
+#: src/elfcmp.c:214 src/elfcmp.c:217
+#, c-format
+msgid "cannot get program header count of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:222
+#, c-format
+msgid "%s %s diff: program header count"
+msgstr ""
+
+#: src/elfcmp.c:281
+#, c-format
+msgid "%s %s differ: section header"
+msgstr ""
+
+#: src/elfcmp.c:309 src/elfcmp.c:315
+#, c-format
+msgid "cannot get content of section %zu in '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:331 src/elfcmp.c:337
+#, c-format
+msgid "cannot get symbol in '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:358
+#, c-format
+msgid "%s %s differ: symbol table [%zu]"
+msgstr ""
+
+#: src/elfcmp.c:361
+#, c-format
+msgid "%s %s differ: symbol table [%zu,%zu]"
+msgstr ""
+
+#: src/elfcmp.c:409
+#, c-format
+msgid "%s %s differ: section [%zu] '%s' content"
+msgstr ""
+
+#: src/elfcmp.c:413
+#, c-format
+msgid "%s %s differ: section [%zu,%zu] '%s' content"
+msgstr ""
+
+#: src/elfcmp.c:429
+#, c-format
+msgid "%s %s differ: unequal amount of important sections"
+msgstr ""
+
+#: src/elfcmp.c:463 src/elfcmp.c:468
+#, c-format
+msgid "cannot load data of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:487 src/elfcmp.c:493
+#, c-format
+msgid "cannot get program header entry %d of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:499
+#, c-format
+msgid "%s %s differ: program header %d"
+msgstr ""
+
+#: src/elfcmp.c:524
+#, c-format
+msgid "%s %s differ: gap"
+msgstr ""
+
+#: src/elfcmp.c:583
+#, c-format
+msgid "Invalid value '%s' for --gaps parameter."
+msgstr ""
+
+#: src/elfcmp.c:607 src/findtextrel.c:229 src/ldgeneric.c:1767
+#: src/ldgeneric.c:4257 src/nm.c:363 src/ranlib.c:169 src/size.c:301
+#: src/strings.c:183 src/strip.c:433 src/strip.c:468 src/unstrip.c:1900
+#: src/unstrip.c:1929
+#, c-format
+msgid "cannot open '%s'"
+msgstr ""
+
+#: src/elfcmp.c:611 src/findtextrel.c:236 src/ranlib.c:186
+#, c-format
+msgid "cannot create ELF descriptor for '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:616
+#, c-format
+msgid "cannot create EBL descriptor for '%s'"
+msgstr ""
+
+#: src/elfcmp.c:634
+#, c-format
+msgid "cannot get section header of section %zu: %s"
+msgstr ""
+
+#: src/elfcmp.c:644
+#, c-format
+msgid "cannot get content of section %zu: %s"
+msgstr ""
+
+#: src/elfcmp.c:654 src/elfcmp.c:668
+#, c-format
+msgid "cannot get relocation: %s"
+msgstr ""
+
+#: src/elflint.c:72
+msgid "Be extremely strict, flag level 2 features."
+msgstr ""
+
+#: src/elflint.c:73
+msgid "Do not print anything if successful"
+msgstr ""
+
+#: src/elflint.c:74
+msgid "Binary is a separate debuginfo file"
+msgstr ""
+
+#: src/elflint.c:76
+msgid ""
+"Binary has been created with GNU ld and is therefore known to be broken in "
+"certain ways"
+msgstr ""
+
+#: src/elflint.c:82
+msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
+msgstr ""
+
+#: src/elflint.c:86 src/readelf.c:118
+msgid "FILE..."
+msgstr ""
+
+#: src/elflint.c:159 src/readelf.c:272
+#, c-format
+msgid "cannot open input file"
+msgstr ""
+
+#: src/elflint.c:166
+#, c-format
+msgid "cannot generate Elf descriptor: %s\n"
+msgstr ""
+
+#: src/elflint.c:185
+#, c-format
+msgid "error while closing Elf descriptor: %s\n"
+msgstr ""
+
+#: src/elflint.c:189
+msgid "No errors"
+msgstr ""
+
+#: src/elflint.c:223 src/readelf.c:425
+msgid "Missing file name.\n"
+msgstr ""
+
+#: src/elflint.c:302
+#, c-format
+msgid " error while freeing sub-ELF descriptor: %s\n"
+msgstr ""
+
+#: src/elflint.c:310
+#, c-format
+msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
+msgstr ""
+
+#: src/elflint.c:370
+#, c-format
+msgid "e_ident[%d] == %d is no known class\n"
+msgstr ""
+
+#: src/elflint.c:375
+#, c-format
+msgid "e_ident[%d] == %d is no known data encoding\n"
+msgstr ""
+
+#: src/elflint.c:379
+#, c-format
+msgid "unknown ELF header version number e_ident[%d] == %d\n"
+msgstr ""
+
+#: src/elflint.c:385
+#, c-format
+msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
+msgstr ""
+
+#: src/elflint.c:391
+#, c-format
+msgid "unsupport ABI version e_ident[%d] == %d\n"
+msgstr ""
+
+#: src/elflint.c:396
+#, c-format
+msgid "e_ident[%zu] is not zero\n"
+msgstr ""
+
+#: src/elflint.c:401
+#, c-format
+msgid "unknown object file type %d\n"
+msgstr ""
+
+#: src/elflint.c:408
+#, c-format
+msgid "unknown machine type %d\n"
+msgstr ""
+
+#: src/elflint.c:412
+#, c-format
+msgid "unknown object file version\n"
+msgstr ""
+
+#: src/elflint.c:418
+#, c-format
+msgid "invalid program header offset\n"
+msgstr ""
+
+#: src/elflint.c:420
+#, c-format
+msgid "executables and DSOs cannot have zero program header offset\n"
+msgstr ""
+
+#: src/elflint.c:424
+#, c-format
+msgid "invalid number of program header entries\n"
+msgstr ""
+
+#: src/elflint.c:432
+#, c-format
+msgid "invalid section header table offset\n"
+msgstr ""
+
+#: src/elflint.c:435
+#, c-format
+msgid "section header table must be present\n"
+msgstr ""
+
+#: src/elflint.c:449
+#, c-format
+msgid "invalid number of section header table entries\n"
+msgstr ""
+
+#: src/elflint.c:466
+#, c-format
+msgid "invalid section header index\n"
+msgstr ""
+
+#: src/elflint.c:480
+#, c-format
+msgid "invalid number of program header table entries\n"
+msgstr ""
+
+#: src/elflint.c:489
+#, c-format
+msgid "invalid machine flags: %s\n"
+msgstr ""
+
+#: src/elflint.c:496 src/elflint.c:513
+#, c-format
+msgid "invalid ELF header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:499 src/elflint.c:516
+#, c-format
+msgid "invalid program header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:502 src/elflint.c:519
+#, c-format
+msgid "invalid program header position or size\n"
+msgstr ""
+
+#: src/elflint.c:505 src/elflint.c:522
+#, c-format
+msgid "invalid section header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:508 src/elflint.c:525
+#, c-format
+msgid "invalid section header position or size\n"
+msgstr ""
+
+#: src/elflint.c:569
+#, c-format
+msgid ""
+"section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
+"group\n"
+msgstr ""
+
+#: src/elflint.c:573
+#, c-format
+msgid ""
+"section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
+msgstr ""
+
+#: src/elflint.c:589 src/elflint.c:1432 src/elflint.c:1482 src/elflint.c:1591
+#: src/elflint.c:2185 src/elflint.c:2699 src/elflint.c:2860 src/elflint.c:2990
+#: src/elflint.c:3162 src/elflint.c:4062
+#, c-format
+msgid "section [%2d] '%s': cannot get section data\n"
+msgstr ""
+
+#: src/elflint.c:602 src/elflint.c:1598
+#, 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:625
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol table cannot have more than one extended index "
+"section\n"
+msgstr ""
+
+#: src/elflint.c:636
+#, c-format
+msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
+msgstr ""
+
+#: src/elflint.c:645
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
+msgstr ""
+
+#: src/elflint.c:650 src/elflint.c:653 src/elflint.c:656 src/elflint.c:659
+#: src/elflint.c:662 src/elflint.c:665
+#, c-format
+msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
+msgstr ""
+
+#: src/elflint.c:668
+#, c-format
+msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
+msgstr ""
+
+#: src/elflint.c:678
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:687
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
+msgstr ""
+
+#: src/elflint.c:700
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: too large section index but no extended "
+"section index section\n"
+msgstr ""
+
+#: src/elflint.c:706
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
+"st_shndx (%<PRIu32>)\n"
+msgstr ""
+
+#: src/elflint.c:718
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
+msgstr ""
+
+#: src/elflint.c:726
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown type\n"
+msgstr ""
+
+#: src/elflint.c:732
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
+msgstr ""
+
+#: src/elflint.c:737
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
+msgstr ""
+
+#: src/elflint.c:745
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
+msgstr ""
+
+#: src/elflint.c:749
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
+msgstr ""
+
+#: src/elflint.c:753
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
+msgstr ""
+
+#: src/elflint.c:785
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:791 src/elflint.c:816 src/elflint.c:859
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu does not fit completely in referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:800
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
+"SHF_TLS flag set\n"
+msgstr ""
+
+#: src/elflint.c:810 src/elflint.c:852
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:837
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
+msgstr ""
+
+#: src/elflint.c:845
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:872
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+
+#: src/elflint.c:879
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+
+#: src/elflint.c:886
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
+msgstr ""
+
+#: src/elflint.c:936
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section [%"
+"2d]\n"
+msgstr ""
+
+#: src/elflint.c:943
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:959
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
+"match %s section address %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:966
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
+"match %s section size %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:974
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
+"section\n"
+msgstr ""
+
+#: src/elflint.c:990
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
+"segment address %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:997
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
+"segment size %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:1010
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
+"default visibility\n"
+msgstr ""
+
+#: src/elflint.c:1014
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
+msgstr ""
+
+#: src/elflint.c:1059
+#, c-format
+msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
+msgstr ""
+
+#: src/elflint.c:1068 src/elflint.c:1120
+#, c-format
+msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
+msgstr ""
+
+#: src/elflint.c:1093 src/elflint.c:1145
+#, c-format
+msgid ""
+"section [%2d] '%s': relative relocations after index %d as specified by "
+"DT_RELCOUNT\n"
+msgstr ""
+
+#: src/elflint.c:1099 src/elflint.c:1151
+#, c-format
+msgid ""
+"section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
+"specified %d relative relocations\n"
+msgstr ""
+
+#: src/elflint.c:1111
+#, c-format
+msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
+msgstr ""
+
+#: src/elflint.c:1193
+#, c-format
+msgid "section [%2d] '%s': invalid destination section index\n"
+msgstr ""
+
+#: src/elflint.c:1206
+#, c-format
+msgid "section [%2d] '%s': invalid destination section type\n"
+msgstr ""
+
+#: src/elflint.c:1214
+#, c-format
+msgid "section [%2d] '%s': sh_info should be zero\n"
+msgstr ""
+
+#: src/elflint.c:1221
+#, c-format
+msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
+msgstr ""
+
+#: src/elflint.c:1228
+#, c-format
+msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
+msgstr ""
+
+#: src/elflint.c:1288
+#, c-format
+msgid "text relocation flag set but there is no read-only segment\n"
+msgstr ""
+
+#: src/elflint.c:1315
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid type\n"
+msgstr ""
+
+#: src/elflint.c:1323
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: relocation type invalid for the file "
+"type\n"
+msgstr ""
+
+#: src/elflint.c:1331
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
+msgstr ""
+
+#: src/elflint.c:1349
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
+"be used with %s\n"
+msgstr ""
+
+#: src/elflint.c:1366
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:1381
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: copy relocation against symbol of type %"
+"s\n"
+msgstr ""
+
+#: src/elflint.c:1402
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: read-only section modified but text "
+"relocation flag not set\n"
+msgstr ""
+
+#: src/elflint.c:1417
+#, c-format
+msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
+msgstr ""
+
+#: src/elflint.c:1456 src/elflint.c:1506
+#, c-format
+msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:1586
+#, c-format
+msgid "more than one dynamic section present\n"
+msgstr ""
+
+#: src/elflint.c:1604
+#, c-format
+msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
+msgstr ""
+
+#: src/elflint.c:1609 src/elflint.c:1901
+#, c-format
+msgid "section [%2d] '%s': sh_info not zero\n"
+msgstr ""
+
+#: src/elflint.c:1619
+#, c-format
+msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:1627
+#, c-format
+msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
+msgstr ""
+
+#: src/elflint.c:1634
+#, c-format
+msgid "section [%2d] '%s': entry %zu: unknown tag\n"
+msgstr ""
+
+#: src/elflint.c:1645
+#, c-format
+msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
+msgstr ""
+
+#: src/elflint.c:1655
+#, c-format
+msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
+msgstr ""
+
+#: src/elflint.c:1673
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
+msgstr ""
+
+#: src/elflint.c:1695
+#, 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:1738
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:1753
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must be valid offset in section [%"
+"2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:1773 src/elflint.c:1801
+#, c-format
+msgid "section [%2d] '%s': contains %s entry but not %s\n"
+msgstr ""
+
+#: src/elflint.c:1785
+#, c-format
+msgid "section [%2d] '%s': mandatory tag %s not present\n"
+msgstr ""
+
+#: src/elflint.c:1794
+#, c-format
+msgid "section [%2d] '%s': no hash section present\n"
+msgstr ""
+
+#: src/elflint.c:1809 src/elflint.c:1816
+#, c-format
+msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
+msgstr ""
+
+#: src/elflint.c:1826 src/elflint.c:1830
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
+msgstr ""
+
+#: src/elflint.c:1836
+#, c-format
+msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
+msgstr ""
+
+#: src/elflint.c:1847 src/elflint.c:1851 src/elflint.c:1855 src/elflint.c:1859
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
+msgstr ""
+
+#: src/elflint.c:1871
+#, c-format
+msgid ""
+"section [%2d] '%s': only relocatable files can have extended section index\n"
+msgstr ""
+
+#: src/elflint.c:1881
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index section not for symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1886
+#, c-format
+msgid "cannot get data for symbol section\n"
+msgstr ""
+
+#: src/elflint.c:1889
+#, c-format
+msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
+msgstr ""
+
+#: src/elflint.c:1896
+#, c-format
+msgid "section [%2d] '%s': extended index table too small for symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1911
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
+"same symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1922
+#, c-format
+msgid "symbol 0 should have zero extended section index\n"
+msgstr ""
+
+#: src/elflint.c:1934
+#, c-format
+msgid "cannot get data for symbol %zu\n"
+msgstr ""
+
+#: src/elflint.c:1939
+#, c-format
+msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
+msgstr ""
+
+#: src/elflint.c:1955 src/elflint.c:1996
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
+msgstr ""
+
+#: src/elflint.c:1967 src/elflint.c:2008
+#, c-format
+msgid "section [%2d] '%s': chain array too large\n"
+msgstr ""
+
+#: src/elflint.c:1976 src/elflint.c:2017
+#, c-format
+msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:1982
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2023
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2038
+#, c-format
+msgid "section [%2d] '%s': bitmask size not power of 2: %u\n"
+msgstr ""
+
+#: src/elflint.c:2049
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected at "
+"least%ld)\n"
+msgstr ""
+
+#: src/elflint.c:2057
+#, c-format
+msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
+msgstr ""
+
+#: src/elflint.c:2089
+#, c-format
+msgid ""
+"section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
+msgstr ""
+
+#: src/elflint.c:2110
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
+"undefined\n"
+msgstr ""
+
+#: src/elflint.c:2121
+#, c-format
+msgid ""
+"section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
+msgstr ""
+
+#: src/elflint.c:2152
+#, c-format
+msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2157
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2163
+#, c-format
+msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
+msgstr ""
+
+#: src/elflint.c:2176
+#, c-format
+msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
+msgstr ""
+
+#: src/elflint.c:2194
+#, c-format
+msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
+msgstr ""
+
+#: src/elflint.c:2202
+#, c-format
+msgid "section [%2d] '%s': hash table entry size incorrect\n"
+msgstr ""
+
+#: src/elflint.c:2207
+#, c-format
+msgid "section [%2d] '%s': not marked to be allocated\n"
+msgstr ""
+
+#: src/elflint.c:2212
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table has not even room for initial administrative "
+"entries\n"
+msgstr ""
+
+#: src/elflint.c:2260
+#, c-format
+msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
+msgstr ""
+
+#: src/elflint.c:2338 src/elflint.c:2342
+#, c-format
+msgid "section [%2zu] '%s': reference to symbol index 0\n"
+msgstr ""
+
+#: src/elflint.c:2349
+#, 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:2361
+#, 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:2377
+#, c-format
+msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
+msgstr ""
+
+#: src/elflint.c:2397
+#, c-format
+msgid ""
+"section [%2d] '%s': section groups only allowed in relocatable object files\n"
+msgstr ""
+
+#: src/elflint.c:2408
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol table: %s\n"
+msgstr ""
+
+#: src/elflint.c:2413
+#, c-format
+msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
+msgstr ""
+
+#: src/elflint.c:2419
+#, c-format
+msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
+msgstr ""
+
+#: src/elflint.c:2424
+#, c-format
+msgid "section [%2d] '%s': sh_flags not zero\n"
+msgstr ""
+
+#: src/elflint.c:2431
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol for signature\n"
+msgstr ""
+
+#: src/elflint.c:2436
+#, c-format
+msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
+msgstr ""
+
+#: src/elflint.c:2442
+#, c-format
+msgid "section [%2d] '%s': sh_flags not set correctly\n"
+msgstr ""
+
+#: src/elflint.c:2448
+#, c-format
+msgid "section [%2d] '%s': cannot get data: %s\n"
+msgstr ""
+
+#: src/elflint.c:2457
+#, c-format
+msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
+msgstr ""
+
+#: src/elflint.c:2462
+#, c-format
+msgid "section [%2d] '%s': section group without flags word\n"
+msgstr ""
+
+#: src/elflint.c:2468
+#, c-format
+msgid "section [%2d] '%s': section group without member\n"
+msgstr ""
+
+#: src/elflint.c:2472
+#, c-format
+msgid "section [%2d] '%s': section group with only one member\n"
+msgstr ""
+
+#: src/elflint.c:2483
+#, c-format
+msgid "section [%2d] '%s': unknown section group flags\n"
+msgstr ""
+
+#: src/elflint.c:2495
+#, c-format
+msgid "section [%2d] '%s': section index %Zu out of range\n"
+msgstr ""
+
+#: src/elflint.c:2504
+#, c-format
+msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:2511
+#, c-format
+msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:2517
+#, c-format
+msgid ""
+"section [%2d] '%s': element %Zu references section [%2d] '%s' without "
+"SHF_GROUP flag set\n"
+msgstr ""
+
+#: src/elflint.c:2524
+#, c-format
+msgid "section [%2d] '%s' is contained in more than one section group\n"
+msgstr ""
+
+#: src/elflint.c:2713
+#, 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:2724
+#, c-format
+msgid ""
+"section [%2d] '%s' has different number of entries than symbol table [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:2740
+#, c-format
+msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
+msgstr ""
+
+#: src/elflint.c:2756
+#, c-format
+msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
+msgstr ""
+
+#: src/elflint.c:2764
+#, c-format
+msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
+msgstr ""
+
+#: src/elflint.c:2778
+#, c-format
+msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
+msgstr ""
+
+#: src/elflint.c:2783
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %d: version index %d is for defined version\n"
+msgstr ""
+
+#: src/elflint.c:2793
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %d: version index %d is for requested version\n"
+msgstr ""
+
+#: src/elflint.c:2845
+#, c-format
+msgid "more than one version reference section present\n"
+msgstr ""
+
+#: src/elflint.c:2853 src/elflint.c:2982
+#, c-format
+msgid "section [%2d] '%s': sh_link does not link to string table\n"
+msgstr ""
+
+#: src/elflint.c:2876 src/elflint.c:3034
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong version %d\n"
+msgstr ""
+
+#: src/elflint.c:2882 src/elflint.c:3040
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:2890
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid file reference\n"
+msgstr ""
+
+#: src/elflint.c:2898
+#, c-format
+msgid "section [%2d] '%s': entry %d references unknown dependency\n"
+msgstr ""
+
+#: src/elflint.c:2910
+#, c-format
+msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
+msgstr ""
+
+#: src/elflint.c:2917
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
+"reference\n"
+msgstr ""
+
+#: src/elflint.c:2924
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: %"
+"#x, expected %#x\n"
+msgstr ""
+
+#: src/elflint.c:2934
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
+"name '%s'\n"
+msgstr ""
+
+#: src/elflint.c:2945
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
+msgstr ""
+
+#: src/elflint.c:2961 src/elflint.c:3119
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
+msgstr ""
+
+#: src/elflint.c:2974
+#, c-format
+msgid "more than one version definition section present\n"
+msgstr ""
+
+#: src/elflint.c:3019
+#, c-format
+msgid "section [%2d] '%s': more than one BASE definition\n"
+msgstr ""
+
+#: src/elflint.c:3023
+#, c-format
+msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
+msgstr ""
+
+#: src/elflint.c:3029
+#, c-format
+msgid "section [%2d] '%s': entry %d has unknown flag\n"
+msgstr ""
+
+#: src/elflint.c:3053
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid name reference\n"
+msgstr ""
+
+#: src/elflint.c:3060
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
+msgstr ""
+
+#: src/elflint.c:3069
+#, c-format
+msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
+msgstr ""
+
+#: src/elflint.c:3088
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:3103
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:3125
+#, c-format
+msgid "section [%2d] '%s': no BASE definition\n"
+msgstr ""
+
+#: src/elflint.c:3141
+#, c-format
+msgid "section [%2d] '%s': unknown parent version '%s'\n"
+msgstr ""
+
+#: src/elflint.c:3154
+#, c-format
+msgid "section [%2d] '%s': empty object attributes section\n"
+msgstr ""
+
+#: src/elflint.c:3175
+#, c-format
+msgid "section [%2d] '%s': unrecognized attribute format\n"
+msgstr ""
+
+#: src/elflint.c:3191
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: zero length field in attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3200
+#, c-format
+msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3212
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
+msgstr ""
+
+#: src/elflint.c:3229
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
+msgstr ""
+
+#: src/elflint.c:3238
+#, c-format
+msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3247
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
+msgstr ""
+
+#: src/elflint.c:3260
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
+msgstr ""
+
+#: src/elflint.c:3271
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
+msgstr ""
+
+#: src/elflint.c:3289
+#, c-format
+msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
+msgstr ""
+
+#: src/elflint.c:3300
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
+msgstr ""
+
+#: src/elflint.c:3313
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
+msgstr ""
+
+#: src/elflint.c:3317
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:3327
+#, c-format
+msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
+msgstr ""
+
+#: src/elflint.c:3333
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3422
+#, c-format
+msgid "cannot get section header of zeroth section\n"
+msgstr ""
+
+#: src/elflint.c:3426
+#, c-format
+msgid "zeroth section has nonzero name\n"
+msgstr ""
+
+#: src/elflint.c:3428
+#, c-format
+msgid "zeroth section has nonzero type\n"
+msgstr ""
+
+#: src/elflint.c:3430
+#, c-format
+msgid "zeroth section has nonzero flags\n"
+msgstr ""
+
+#: src/elflint.c:3432
+#, c-format
+msgid "zeroth section has nonzero address\n"
+msgstr ""
+
+#: src/elflint.c:3434
+#, c-format
+msgid "zeroth section has nonzero offset\n"
+msgstr ""
+
+#: src/elflint.c:3436
+#, c-format
+msgid "zeroth section has nonzero align value\n"
+msgstr ""
+
+#: src/elflint.c:3438
+#, c-format
+msgid "zeroth section has nonzero entry size value\n"
+msgstr ""
+
+#: src/elflint.c:3441
+#, c-format
+msgid ""
+"zeroth section has nonzero size value while ELF header has nonzero shnum "
+"value\n"
+msgstr ""
+
+#: src/elflint.c:3445
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in shstrndx\n"
+msgstr ""
+
+#: src/elflint.c:3449
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in phnum\n"
+msgstr ""
+
+#: src/elflint.c:3466
+#, c-format
+msgid "cannot get section header for section [%2zu] '%s': %s\n"
+msgstr ""
+
+#: src/elflint.c:3475
+#, c-format
+msgid "section [%2zu]: invalid name\n"
+msgstr ""
+
+#: src/elflint.c:3502
+#, c-format
+msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3518
+#, c-format
+msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3535
+#, c-format
+msgid ""
+"section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3553
+#, c-format
+msgid "section [%2zu] '%s' present in object file\n"
+msgstr ""
+
+#: src/elflint.c:3559 src/elflint.c:3591
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
+msgstr ""
+
+#: src/elflint.c:3564 src/elflint.c:3596
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
+"segments\n"
+msgstr ""
+
+#: src/elflint.c:3572
+#, c-format
+msgid ""
+"section [%2zu] '%s' is extension section index table in non-object file\n"
+msgstr ""
+
+#: src/elflint.c:3615
+#, c-format
+msgid "section [%2zu] '%s': size not multiple of entry size\n"
+msgstr ""
+
+#: src/elflint.c:3620
+#, c-format
+msgid "cannot get section header\n"
+msgstr ""
+
+#: src/elflint.c:3630
+#, c-format
+msgid "section [%2zu] '%s' has unsupported type %d\n"
+msgstr ""
+
+#: src/elflint.c:3644
+#, c-format
+msgid ""
+"section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:3651
+#, c-format
+msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:3659
+#, c-format
+msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
+msgstr ""
+
+#: src/elflint.c:3667
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in link value\n"
+msgstr ""
+
+#: src/elflint.c:3672
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in info value\n"
+msgstr ""
+
+#: src/elflint.c:3679
+#, c-format
+msgid "section [%2zu] '%s': strings flag set without merge flag\n"
+msgstr ""
+
+#: src/elflint.c:3684
+#, c-format
+msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
+msgstr ""
+
+#: src/elflint.c:3702
+#, c-format
+msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
+msgstr ""
+
+#: src/elflint.c:3711
+#, c-format
+msgid "section [%2zu] '%s' is both executable and writable\n"
+msgstr ""
+
+#: src/elflint.c:3738
+#, c-format
+msgid ""
+"section [%2zu] '%s' not fully contained in segment of program header entry %"
+"d\n"
+msgstr ""
+
+#: src/elflint.c:3746
+#, 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:3755
+#, 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:3766
+#, c-format
+msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
+msgstr ""
+
+#: src/elflint.c:3776
+#, c-format
+msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
+msgstr ""
+
+#: src/elflint.c:3786
+#, c-format
+msgid ""
+"section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:3792
+#, 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:3800
+#, c-format
+msgid ""
+"section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
+msgstr ""
+
+#: src/elflint.c:3851
+#, c-format
+msgid "more than one version symbol table present\n"
+msgstr ""
+
+#: src/elflint.c:3874
+#, c-format
+msgid "INTERP program header entry but no .interp section\n"
+msgstr ""
+
+#: src/elflint.c:3885
+#, c-format
+msgid ""
+"loadable segment [%u] is executable but contains no executable sections\n"
+msgstr ""
+
+#: src/elflint.c:3891
+#, c-format
+msgid "loadable segment [%u] is writable but contains no writable sections\n"
+msgstr ""
+
+#: src/elflint.c:3902
+#, c-format
+msgid ""
+"no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
+"exist\n"
+msgstr ""
+
+#: src/elflint.c:3915
+#, c-format
+msgid "duplicate version index %d\n"
+msgstr ""
+
+#: src/elflint.c:3929
+#, c-format
+msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
+msgstr ""
+
+#: src/elflint.c:3978
+#, c-format
+msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:3982
+#, c-format
+msgid ""
+"section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4005
+#, c-format
+msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4009
+#, c-format
+msgid ""
+"section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4026
+#, c-format
+msgid "phdr[%d]: no note entries defined for the type of file\n"
+msgstr ""
+
+#: src/elflint.c:4045
+#, c-format
+msgid "phdr[%d]: cannot get content of note section: %s\n"
+msgstr ""
+
+#: src/elflint.c:4048
+#, c-format
+msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
+msgstr ""
+
+#: src/elflint.c:4069
+#, c-format
+msgid "section [%2d] '%s': no note entries defined for the type of file\n"
+msgstr ""
+
+#: src/elflint.c:4076
+#, c-format
+msgid "section [%2d] '%s': cannot get content of note section\n"
+msgstr ""
+
+#: src/elflint.c:4079
+#, c-format
+msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
+msgstr ""
+
+#: src/elflint.c:4097
+#, c-format
+msgid ""
+"only executables, shared objects, and core files can have program headers\n"
+msgstr ""
+
+#: src/elflint.c:4112
+#, c-format
+msgid "cannot get program header entry %d: %s\n"
+msgstr ""
+
+#: src/elflint.c:4121
+#, c-format
+msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:4132
+#, c-format
+msgid "more than one INTERP entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4140
+#, c-format
+msgid "more than one TLS entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4147
+#, c-format
+msgid "static executable cannot have dynamic sections\n"
+msgstr ""
+
+#: src/elflint.c:4161
+#, c-format
+msgid "dynamic section reference in program header has wrong offset\n"
+msgstr ""
+
+#: src/elflint.c:4164
+#, c-format
+msgid "dynamic section size mismatch in program and section header\n"
+msgstr ""
+
+#: src/elflint.c:4174
+#, c-format
+msgid "more than one GNU_RELRO entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4195
+#, c-format
+msgid "loadable segment GNU_RELRO applies to is not writable\n"
+msgstr ""
+
+#: src/elflint.c:4198
+#, c-format
+msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
+msgstr ""
+
+#: src/elflint.c:4206 src/elflint.c:4229
+#, c-format
+msgid "%s segment not contained in a loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:4235
+#, c-format
+msgid "program header offset in ELF header and PHDR entry do not match"
+msgstr ""
+
+#: src/elflint.c:4259
+#, c-format
+msgid "call frame search table reference in program header has wrong offset\n"
+msgstr ""
+
+#: src/elflint.c:4262
+#, c-format
+msgid "call frame search table size mismatch in program and section header\n"
+msgstr ""
+
+#: src/elflint.c:4275
+#, c-format
+msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
+msgstr ""
+
+#: src/elflint.c:4283
+#, c-format
+msgid "call frame search table must be allocated\n"
+msgstr ""
+
+#: src/elflint.c:4286
+#, c-format
+msgid "section [%2zu] '%s' must be allocated\n"
+msgstr ""
+
+#: src/elflint.c:4290
+#, c-format
+msgid "call frame search table must not be writable\n"
+msgstr ""
+
+#: src/elflint.c:4293
+#, c-format
+msgid "section [%2zu] '%s' must not be writable\n"
+msgstr ""
+
+#: src/elflint.c:4298
+#, c-format
+msgid "call frame search table must not be executable\n"
+msgstr ""
+
+#: src/elflint.c:4301
+#, c-format
+msgid "section [%2zu] '%s' must not be executable\n"
+msgstr ""
+
+#: src/elflint.c:4312
+#, c-format
+msgid "program header entry %d: file size greater than memory size\n"
+msgstr ""
+
+#: src/elflint.c:4319
+#, c-format
+msgid "program header entry %d: alignment not a power of 2\n"
+msgstr ""
+
+#: src/elflint.c:4322
+#, c-format
+msgid ""
+"program header entry %d: file offset and virtual address not module of "
+"alignment\n"
+msgstr ""
+
+#: src/elflint.c:4335
+#, 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:4369
+#, c-format
+msgid "cannot read ELF header: %s\n"
+msgstr ""
+
+#: src/elflint.c:4395
+#, c-format
+msgid "text relocation flag set but not needed\n"
+msgstr ""
+
+#: src/findtextrel.c:70
+msgid "Input Selection:"
+msgstr ""
+
+#: src/findtextrel.c:71
+msgid "Prepend PATH to all file names"
+msgstr ""
+
+#: src/findtextrel.c:73
+msgid "Use PATH as root of debuginfo hierarchy"
+msgstr ""
+
+#: src/findtextrel.c:80
+msgid "Locate source of text relocations in FILEs (a.out by default)."
+msgstr ""
+
+#: src/findtextrel.c:84 src/nm.c:111 src/objdump.c:80 src/size.c:92
+#: src/strings.c:92 src/strip.c:97
+msgid "[FILE...]"
+msgstr ""
+
+#: src/findtextrel.c:246
+#, c-format
+msgid "cannot get ELF header '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:257
+#, c-format
+msgid "'%s' is not a DSO or PIE"
+msgstr ""
+
+#: src/findtextrel.c:274
+#, c-format
+msgid "getting get section header of section %zu: %s"
+msgstr ""
+
+#: src/findtextrel.c:292
+#, c-format
+msgid "cannot read dynamic section: %s"
+msgstr ""
+
+#: src/findtextrel.c:307
+#, c-format
+msgid "no text relocations reported in '%s'"
+msgstr ""
+
+#: src/findtextrel.c:319
+#, c-format
+msgid "while reading ELF file"
+msgstr ""
+
+#: src/findtextrel.c:328 src/findtextrel.c:345
+#, c-format
+msgid "cannot get program header index at offset %d: %s"
+msgstr ""
+
+#: src/findtextrel.c:397
+#, c-format
+msgid "cannot get section header of section %Zu: %s"
+msgstr ""
+
+#: src/findtextrel.c:409
+#, c-format
+msgid "cannot get symbol table section %zu in '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:429 src/findtextrel.c:452
+#, c-format
+msgid "cannot get relocation at index %d in section %zu in '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:517
+#, c-format
+msgid "%s not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:570
+#, c-format
+msgid ""
+"the file containing the function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:577 src/findtextrel.c:597
+#, c-format
+msgid ""
+"the file containing the function '%s' might not be compiled with -fpic/-"
+"fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:585
+#, c-format
+msgid ""
+"either the file containing the function '%s' or the file containing the "
+"function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:605
+#, c-format
+msgid ""
+"a relocation modifies memory at offset %llu in a write-protected segment\n"
+msgstr ""
+
+#: src/i386_ld.c:210
+#, c-format
+msgid "cannot allocate PLT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:232
+#, c-format
+msgid "cannot allocate PLTREL section: %s"
+msgstr ""
+
+#: src/i386_ld.c:253
+#, c-format
+msgid "cannot allocate GOT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:274
+#, c-format
+msgid "cannot allocate GOTPLT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:661
+#, c-format
+msgid "initial-executable TLS relocation cannot be used "
+msgstr ""
+
+#: src/ld.c:87
+msgid "Input File Control:"
+msgstr ""
+
+#: src/ld.c:89
+msgid "Include whole archives in the output from now on."
+msgstr ""
+
+#: src/ld.c:91
+msgid "Stop including the whole archives in the output."
+msgstr ""
+
+#: src/ld.c:92 src/ld.c:106 src/ld.c:184
+msgid "FILE"
+msgstr ""
+
+#: src/ld.c:93
+msgid "Start a group."
+msgstr ""
+
+#: src/ld.c:94
+msgid "End a group."
+msgstr ""
+
+#: src/ld.c:95
+msgid "PATH"
+msgstr ""
+
+#: src/ld.c:96
+msgid "Add PATH to list of directories files are searched in."
+msgstr ""
+
+#: src/ld.c:98
+msgid "Only set DT_NEEDED for following dynamic libs if actually used"
+msgstr ""
+
+#: src/ld.c:100
+msgid "Always set DT_NEEDED for following dynamic libs"
+msgstr ""
+
+#: src/ld.c:102
+msgid "Ignore LD_LIBRARY_PATH environment variable."
+msgstr ""
+
+#: src/ld.c:105
+msgid "Output File Control:"
+msgstr ""
+
+#: src/ld.c:106
+msgid "Place output in FILE."
+msgstr ""
+
+#: src/ld.c:109
+msgid "Object is marked to not use default search path at runtime."
+msgstr ""
+
+#: src/ld.c:111
+msgid "Same as --whole-archive."
+msgstr ""
+
+#: src/ld.c:112
+msgid ""
+"Default rules of extracting from archive; weak references are not enough."
+msgstr ""
+
+#: src/ld.c:116
+msgid "Weak references cause extraction from archive."
+msgstr ""
+
+#: src/ld.c:118
+msgid "Allow multiple definitions; first is used."
+msgstr ""
+
+#: src/ld.c:120
+msgid "Disallow/allow undefined symbols in DSOs."
+msgstr ""
+
+#: src/ld.c:123
+msgid "Object requires immediate handling of $ORIGIN."
+msgstr ""
+
+#: src/ld.c:125
+msgid "Relocation will not be processed lazily."
+msgstr ""
+
+#: src/ld.c:127
+msgid "Object cannot be unloaded at runtime."
+msgstr ""
+
+#: src/ld.c:129
+msgid "Mark object to be initialized first."
+msgstr ""
+
+#: src/ld.c:131
+msgid "Enable/disable lazy-loading flag for following dependencies."
+msgstr ""
+
+#: src/ld.c:133
+msgid "Mark object as not loadable with 'dlopen'."
+msgstr ""
+
+#: src/ld.c:135
+msgid "Ignore/record dependencies on unused DSOs."
+msgstr ""
+
+#: src/ld.c:137
+msgid "Generated DSO will be a system library."
+msgstr ""
+
+#: src/ld.c:138
+msgid "ADDRESS"
+msgstr ""
+
+#: src/ld.c:138
+msgid "Set entry point address."
+msgstr ""
+
+#: src/ld.c:141
+msgid "Do not link against shared libraries."
+msgstr ""
+
+#: src/ld.c:144
+msgid "Prefer linking against shared libraries."
+msgstr ""
+
+#: src/ld.c:145
+msgid "Export all dynamic symbols."
+msgstr ""
+
+#: src/ld.c:146
+msgid "Strip all symbols."
+msgstr ""
+
+#: src/ld.c:147
+msgid "Strip debugging symbols."
+msgstr ""
+
+#: src/ld.c:149
+msgid "Assume pagesize for the target system to be SIZE."
+msgstr ""
+
+#: src/ld.c:151
+msgid "Set runtime DSO search path."
+msgstr ""
+
+#: src/ld.c:154
+msgid "Set link time DSO search path."
+msgstr ""
+
+#: src/ld.c:155
+msgid "Generate dynamic shared object."
+msgstr ""
+
+#: src/ld.c:156
+msgid "Generate relocatable object."
+msgstr ""
+
+#: src/ld.c:159
+msgid "Causes symbol not assigned to a version be reduced to local."
+msgstr ""
+
+#: src/ld.c:160
+msgid "Remove unused sections."
+msgstr ""
+
+#: src/ld.c:163
+msgid "Don't remove unused sections."
+msgstr ""
+
+#: src/ld.c:164
+msgid "Set soname of shared object."
+msgstr ""
+
+#: src/ld.c:165
+msgid "Set the dynamic linker name."
+msgstr ""
+
+#: src/ld.c:168
+msgid "Add/suppress addition indentifying link-editor to .comment section."
+msgstr ""
+
+#: src/ld.c:171
+msgid "Create .eh_frame_hdr section"
+msgstr ""
+
+#: src/ld.c:173
+msgid "Set hash style to sysv, gnu or both."
+msgstr ""
+
+#: src/ld.c:175
+msgid "Generate build ID note (md5, sha1 (default), uuid)."
+msgstr ""
+
+#: src/ld.c:177
+msgid "Linker Operation Control:"
+msgstr ""
+
+#: src/ld.c:178
+msgid "Verbose messages."
+msgstr ""
+
+#: src/ld.c:179
+msgid "Trace file opens."
+msgstr ""
+
+#: src/ld.c:181
+msgid "Trade speed for less memory usage"
+msgstr ""
+
+#: src/ld.c:182
+msgid "LEVEL"
+msgstr ""
+
+#: src/ld.c:183
+msgid "Set optimization level to LEVEL."
+msgstr ""
+
+#: src/ld.c:184
+msgid "Use linker script in FILE."
+msgstr ""
+
+#: src/ld.c:187
+msgid "Select to get parser debug information"
+msgstr ""
+
+#: src/ld.c:190
+msgid "Read version information from FILE."
+msgstr ""
+
+#: src/ld.c:191
+msgid "Set emulation to NAME."
+msgstr ""
+
+#: src/ld.c:197
+msgid "Combine object and archive files."
+msgstr ""
+
+#: src/ld.c:200
+msgid "[FILE]..."
+msgstr ""
+
+#: src/ld.c:333
+#, c-format
+msgid "At least one input file needed"
+msgstr ""
+
+#: src/ld.c:349
+#, c-format
+msgid "error while preparing linking"
+msgstr ""
+
+#: src/ld.c:356
+#, c-format
+msgid "cannot open linker script '%s'"
+msgstr ""
+
+#: src/ld.c:397
+#, c-format
+msgid "-( without matching -)"
+msgstr ""
+
+#: src/ld.c:572 src/ld.c:610
+#, c-format
+msgid "only one option of -G and -r is allowed"
+msgstr ""
+
+#: src/ld.c:594
+#, c-format
+msgid "more than one '-m' parameter"
+msgstr ""
+
+#: src/ld.c:604 src/ld.c:1013
+#, c-format
+msgid "unknown option `-%c %s'"
+msgstr ""
+
+#: src/ld.c:646
+#, c-format
+msgid "invalid page size value '%s': ignored"
+msgstr ""
+
+#: src/ld.c:687
+#, c-format
+msgid "invalid hash style '%s'"
+msgstr ""
+
+#: src/ld.c:697
+#, c-format
+msgid "invalid build-ID style '%s'"
+msgstr ""
+
+#: src/ld.c:785
+#, c-format
+msgid "More than one output file name given."
+msgstr ""
+
+#: src/ld.c:802
+#, c-format
+msgid "Invalid optimization level `%s'"
+msgstr ""
+
+#: src/ld.c:850
+#, c-format
+msgid "nested -( -) groups are not allowed"
+msgstr ""
+
+#: src/ld.c:869
+#, c-format
+msgid "-) without matching -("
+msgstr ""
+
+#: src/ld.c:1046
+#, c-format
+msgid "unknown option '-%c %s'"
+msgstr ""
+
+#: src/ld.c:1150
+#, c-format
+msgid "could not find input file to determine output file format"
+msgstr ""
+
+#: src/ld.c:1152
+#, c-format
+msgid "try again with an appropriate '-m' parameter"
+msgstr ""
+
+#: src/ld.c:1446
+#, c-format
+msgid "cannot read version script '%s'"
+msgstr ""
+
+#: src/ld.c:1512 src/ld.c:1551
+#, c-format
+msgid "duplicate definition of '%s' in linker script"
+msgstr ""
+
+#: src/ldgeneric.c:209 src/ldgeneric.c:5151
+#, c-format
+msgid "cannot create string table"
+msgstr ""
+
+#: src/ldgeneric.c:255
+#, c-format
+msgid "cannot load ld backend library '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:265
+#, c-format
+msgid "cannot find init function in ld backend library '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:310
+#, c-format
+msgid "%s listed more than once as input"
+msgstr ""
+
+#: src/ldgeneric.c:424
+#, c-format
+msgid "%s (for -l%s)\n"
+msgstr ""
+
+#: src/ldgeneric.c:425
+#, c-format
+msgid "%s (for DT_NEEDED %s)\n"
+msgstr ""
+
+#: src/ldgeneric.c:573
+#, c-format
+msgid "Warning: type of `%s' changed from %s in %s to %s in %s"
+msgstr ""
+
+#: src/ldgeneric.c:586
+#, c-format
+msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
+msgstr ""
+
+#: src/ldgeneric.c:661 src/ldgeneric.c:1122 src/readelf.c:629 src/strip.c:543
+#, c-format
+msgid "cannot determine number of sections: %s"
+msgstr ""
+
+#: src/ldgeneric.c:677
+#, c-format
+msgid "(%s+%#<PRIx64>): multiple definition of %s `%s'\n"
+msgstr ""
+
+#: src/ldgeneric.c:700
+#, c-format
+msgid "(%s+%#<PRIx64>): first defined here\n"
+msgstr ""
+
+#: src/ldgeneric.c:819
+#, c-format
+msgid "%s: cannot get section group data: %s"
+msgstr ""
+
+#: src/ldgeneric.c:840
+#, c-format
+msgid "%s: section '%s' with group flag set does not belong to any group"
+msgstr ""
+
+#: src/ldgeneric.c:885
+#, c-format
+msgid "%s: section [%2d] '%s' is not in the correct section group"
+msgstr ""
+
+#: src/ldgeneric.c:1156 src/ldgeneric.c:1413 src/ldgeneric.c:1422
+#: src/ldgeneric.c:1481 src/ldgeneric.c:1490 src/ldgeneric.c:1753
+#: src/ldgeneric.c:2005
+#, c-format
+msgid "%s: invalid ELF file (%s:%d)\n"
+msgstr ""
+
+#: src/ldgeneric.c:1250
+#, c-format
+msgid "%s: only files of type ET_REL might contain section groups"
+msgstr ""
+
+#: src/ldgeneric.c:1302
+#, c-format
+msgid "%s: cannot determine signature of section group [%2zd] '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:1314
+#, c-format
+msgid "%s: cannot get content of section group [%2zd] '%s': %s'"
+msgstr ""
+
+#: src/ldgeneric.c:1328
+#, c-format
+msgid ""
+"%s: group member %zu of section group [%2zd] '%s' has too high index: %"
+"<PRIu32>"
+msgstr ""
+
+#: src/ldgeneric.c:1350
+#, c-format
+msgid "%s: section '%s' has unknown type: %d"
+msgstr ""
+
+#: src/ldgeneric.c:1729
+#, c-format
+msgid "cannot get descriptor for ELF file (%s:%d): %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:1899
+#, c-format
+msgid "cannot read archive `%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:2020
+#, c-format
+msgid "file of type %s cannot be linked in\n"
+msgstr ""
+
+#: src/ldgeneric.c:2032
+#, c-format
+msgid "%s: input file incompatible with ELF machine type %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:2044
+#, c-format
+msgid "%s: cannot get section header string table index: %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:2073
+#, c-format
+msgid "cannot use DSO '%s' when generating relocatable object file"
+msgstr ""
+
+#: src/ldgeneric.c:2158
+#, c-format
+msgid "input file '%s' ignored"
+msgstr ""
+
+#: src/ldgeneric.c:2372
+#, c-format
+msgid "undefined symbol `%s' in %s"
+msgstr ""
+
+#: src/ldgeneric.c:2702
+#, c-format
+msgid "cannot create ELF descriptor for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:2709
+#, c-format
+msgid "could not create ELF header for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:3224 src/ldgeneric.c:3294 src/ldgeneric.c:3330
+#: src/ldgeneric.c:4457 src/ldgeneric.c:4506 src/ldgeneric.c:4538
+#: src/ldgeneric.c:4773 src/ldgeneric.c:4828 src/ldgeneric.c:5075
+#: src/ldgeneric.c:5131 src/ldgeneric.c:5600 src/ldgeneric.c:5612
+#, c-format
+msgid "cannot create section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:3444
+#, c-format
+msgid "address computation expression contains variable '%s'"
+msgstr ""
+
+#: src/ldgeneric.c:3489
+#, c-format
+msgid ""
+"argument '%<PRIuMAX>' of ALIGN in address computation expression is no power "
+"of two"
+msgstr ""
+
+#: src/ldgeneric.c:3684
+#, c-format
+msgid "cannot find entry symbol '%s': defaulting to %#0*<PRIx64>"
+msgstr ""
+
+#: src/ldgeneric.c:3690
+#, c-format
+msgid "no entry symbol specified: defaulting to %#0*<PRIx64>"
+msgstr ""
+
+#: src/ldgeneric.c:3920
+#, c-format
+msgid "cannot create GNU hash table section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4071
+#, c-format
+msgid "cannot create hash table section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4114
+#, c-format
+msgid "cannot create build ID section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4191
+#, c-format
+msgid "cannot convert section data to file format: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4200
+#, c-format
+msgid "cannot convert section data to memory format: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4261
+#, c-format
+msgid "cannot read enough data for UUID"
+msgstr ""
+
+#: src/ldgeneric.c:4358 src/ldgeneric.c:4379 src/ldgeneric.c:4408
+#: src/ldgeneric.c:6062
+#, c-format
+msgid "cannot create symbol table for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5300 src/ldgeneric.c:5852
+#, c-format
+msgid "section index too large in dynamic symbol table"
+msgstr ""
+
+#: src/ldgeneric.c:5745
+#, c-format
+msgid "cannot create versioning section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5818
+#, c-format
+msgid "cannot create dynamic symbol table for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5994
+#, c-format
+msgid "cannot create versioning data: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6094 src/ldgeneric.c:6107 src/ldgeneric.c:6171
+#: src/ldgeneric.c:6179
+#, c-format
+msgid "cannot create section header string section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6101
+#, c-format
+msgid "cannot create section header string section"
+msgstr ""
+
+#: src/ldgeneric.c:6259
+#, c-format
+msgid "cannot create program header: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6267
+#, c-format
+msgid "while determining file layout: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6388
+#, c-format
+msgid "internal error: non-nobits section follows nobits section"
+msgstr ""
+
+#: src/ldgeneric.c:6925
+#, c-format
+msgid "cannot get header of 0th section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6941 src/unstrip.c:1808
+#, c-format
+msgid "cannot update ELF header: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6972
+#, c-format
+msgid "linker backend didn't specify function to relocate section"
+msgstr ""
+
+#: src/ldgeneric.c:6984
+#, c-format
+msgid "while writing output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6989
+#, c-format
+msgid "while finishing output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6995
+#, c-format
+msgid "cannot stat output file"
+msgstr ""
+
+#: src/ldgeneric.c:7011
+#, c-format
+msgid "WARNING: temporary output file overwritten before linking finished"
+msgstr ""
+
+#: src/ldgeneric.c:7064 src/ldgeneric.c:7075 src/ldgeneric.c:7086
+#: src/ldgeneric.c:7097 src/ldgeneric.c:7116 src/ldgeneric.c:7129
+#: src/ldgeneric.c:7141
+#, c-format
+msgid "no machine specific '%s' implementation"
+msgstr ""
+
+#: src/ldscript.y:178
+msgid "mode for segment invalid\n"
+msgstr ""
+
+#: src/ldscript.y:465
+#, c-format
+msgid "while reading version script '%s': %s at line %d"
+msgstr ""
+
+#: src/ldscript.y:466
+#, c-format
+msgid "while reading linker script '%s': %s at line %d"
+msgstr ""
+
+#: src/ldscript.y:745
+#, c-format
+msgid "symbol '%s' is declared both local and global for unnamed version"
+msgstr ""
+
+#: src/ldscript.y:747
+#, c-format
+msgid "symbol '%s' is declared both local and global for version '%s'"
+msgstr ""
+
+#: src/ldscript.y:767 src/ldscript.y:774
+#, c-format
+msgid "default visibility set as local and global"
+msgstr ""
+
+#: src/nm.c:74 src/strip.c:73
+msgid "Output selection:"
+msgstr ""
+
+#: src/nm.c:75
+msgid "Display debugger-only symbols"
+msgstr ""
+
+#: src/nm.c:76
+msgid "Display only defined symbols"
+msgstr ""
+
+#: src/nm.c:79
+msgid "Display dynamic symbols instead of normal symbols"
+msgstr ""
+
+#: src/nm.c:80
+msgid "Display only external symbols"
+msgstr ""
+
+#: src/nm.c:81
+msgid "Display only undefined symbols"
+msgstr ""
+
+#: src/nm.c:83
+msgid "Include index for symbols from archive members"
+msgstr ""
+
+#: src/nm.c:85 src/size.c:66
+msgid "Output format:"
+msgstr ""
+
+#: src/nm.c:87
+msgid "Print name of the input file before every symbol"
+msgstr ""
+
+#: src/nm.c:90
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd', `sysv' or `posix'. The "
+"default is `sysv'"
+msgstr ""
+
+#: src/nm.c:92
+msgid "Same as --format=bsd"
+msgstr ""
+
+#: src/nm.c:93
+msgid "Same as --format=posix"
+msgstr ""
+
+#: src/nm.c:94 src/size.c:72
+msgid "Use RADIX for printing symbol values"
+msgstr ""
+
+#: src/nm.c:95
+msgid "Mark weak symbols"
+msgstr ""
+
+#: src/nm.c:96
+msgid "Print size of defined symbols"
+msgstr ""
+
+#: src/nm.c:98 src/size.c:80 src/strip.c:78 src/unstrip.c:81
+msgid "Output options:"
+msgstr ""
+
+#: src/nm.c:99
+msgid "Sort symbols numerically by address"
+msgstr ""
+
+#: src/nm.c:101
+msgid "Do not sort the symbols"
+msgstr ""
+
+#: src/nm.c:102
+msgid "Reverse the sense of the sort"
+msgstr ""
+
+#: src/nm.c:108
+msgid "List symbols from FILEs (a.out by default)."
+msgstr ""
+
+#: src/nm.c:136 src/objdump.c:105 src/size.c:117 src/strip.c:121
+#, c-format
+msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
+msgstr ""
+
+#: src/nm.c:380 src/nm.c:392 src/size.c:317 src/size.c:326 src/size.c:337
+#: src/strip.c:1816
+#, c-format
+msgid "while closing '%s'"
+msgstr ""
+
+#: src/nm.c:402 src/objdump.c:296 src/strip.c:359
+#, c-format
+msgid "%s: File format not recognized"
+msgstr ""
+
+#: src/nm.c:442
+msgid ""
+"\n"
+"Archive index:"
+msgstr ""
+
+#: src/nm.c:451
+#, c-format
+msgid "invalid offset %zu for symbol %s"
+msgstr ""
+
+#: src/nm.c:456
+#, c-format
+msgid "%s in %s\n"
+msgstr ""
+
+#: src/nm.c:464
+#, c-format
+msgid "cannot reset archive offset to beginning"
+msgstr ""
+
+#: src/nm.c:488 src/objdump.c:344
+#, c-format
+msgid "%s%s%s: file format not recognized"
+msgstr ""
+
+#: src/nm.c:700
+#, c-format
+msgid "cannot create search tree"
+msgstr ""
+
+#: src/nm.c:740 src/nm.c:1002 src/objdump.c:744 src/readelf.c:885
+#: src/readelf.c:1028 src/readelf.c:1169 src/readelf.c:1351 src/readelf.c:1549
+#: src/readelf.c:1735 src/readelf.c:1945 src/readelf.c:2199 src/readelf.c:2265
+#: src/readelf.c:2343 src/readelf.c:2841 src/readelf.c:2877 src/readelf.c:2939
+#: src/readelf.c:6493 src/readelf.c:7387 src/readelf.c:7534 src/readelf.c:7604
+#: src/size.c:425 src/size.c:499 src/strip.c:483
+#, c-format
+msgid "cannot get section header string table index"
+msgstr ""
+
+#: src/nm.c:766
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s:\n"
+"\n"
+msgstr ""
+
+#: src/nm.c:768
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s[%s]:\n"
+"\n"
+msgstr ""
+
+#: src/nm.c:771
+#, c-format
+msgid ""
+"%*s%-*s %-*s Class Type %-*s %*s Section\n"
+"\n"
+msgstr ""
+
+#: src/nm.c:1012
+#, c-format
+msgid "%s: entry size in section `%s' is not what we expect"
+msgstr ""
+
+#: src/nm.c:1016
+#, c-format
+msgid "%s: size of section `%s' is not multiple of entry size"
+msgstr ""
+
+#: src/nm.c:1255
+#, c-format
+msgid "%s%s%s%s: Invalid operation"
+msgstr ""
+
+#: src/nm.c:1312
+#, c-format
+msgid "%s%s%s: no symbols"
+msgstr ""
+
+#: src/objdump.c:61
+msgid "Mode selection:"
+msgstr ""
+
+#: src/objdump.c:62
+msgid "Display relocation information."
+msgstr ""
+
+#: src/objdump.c:64
+msgid "Display the full contents of all sections requested"
+msgstr ""
+
+#: src/objdump.c:66
+msgid "Display assembler code of executable sections"
+msgstr ""
+
+#: src/objdump.c:68
+msgid "Output option selection:"
+msgstr ""
+
+#: src/objdump.c:70
+msgid "Only display information for section NAME."
+msgstr ""
+
+#: src/objdump.c:76
+msgid "Show information from FILEs (a.out by default)."
+msgstr ""
+
+#: src/objdump.c:236 src/readelf.c:430
+msgid "No operation specified.\n"
+msgstr ""
+
+#: src/objdump.c:274 src/objdump.c:286
+#, c-format
+msgid "while close `%s'"
+msgstr ""
+
+#: src/objdump.c:379 src/readelf.c:1644 src/readelf.c:1818
+msgid "INVALID SYMBOL"
+msgstr ""
+
+#: src/objdump.c:394 src/readelf.c:1675 src/readelf.c:1851
+msgid "INVALID SECTION"
+msgstr ""
+
+#: src/objdump.c:510
+#, c-format
+msgid ""
+"\n"
+"RELOCATION RECORDS FOR [%s]:\n"
+"%-*s TYPE VALUE\n"
+msgstr ""
+
+#: src/objdump.c:513
+msgid "OFFSET"
+msgstr ""
+
+#: src/objdump.c:576
+#, c-format
+msgid "Contents of section %s:\n"
+msgstr ""
+
+#: src/objdump.c:676
+#, c-format
+msgid "cannot disassemble"
+msgstr ""
+
+#: src/ranlib.c:74
+msgid "Generate an index to speed access to archives."
+msgstr ""
+
+#: src/ranlib.c:77
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/ranlib.c:116
+#, c-format
+msgid "Archive name required"
+msgstr ""
+
+#: src/ranlib.c:194
+#, c-format
+msgid "'%s' is no archive"
+msgstr ""
+
+#: src/ranlib.c:229
+#, c-format
+msgid "error while freeing sub-ELF descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:73
+msgid "ELF output selection:"
+msgstr ""
+
+#: src/readelf.c:75
+msgid "All these plus -p .strtab -p .dynstr -p .comment"
+msgstr ""
+
+#: src/readelf.c:76
+msgid "Display the dynamic segment"
+msgstr ""
+
+#: src/readelf.c:77
+msgid "Display the ELF file header"
+msgstr ""
+
+#: src/readelf.c:79
+msgid "Display histogram of bucket list lengths"
+msgstr ""
+
+#: src/readelf.c:80
+msgid "Display the program headers"
+msgstr ""
+
+#: src/readelf.c:82
+msgid "Display relocations"
+msgstr ""
+
+#: src/readelf.c:83
+msgid "Display the sections' headers"
+msgstr ""
+
+#: src/readelf.c:85
+msgid "Display the symbol table"
+msgstr ""
+
+#: src/readelf.c:86
+msgid "Display versioning information"
+msgstr ""
+
+#: src/readelf.c:87
+msgid "Display the ELF notes"
+msgstr ""
+
+#: src/readelf.c:89
+msgid "Display architecture specific information, if any"
+msgstr ""
+
+#: src/readelf.c:91
+msgid "Display sections for exception handling"
+msgstr ""
+
+#: src/readelf.c:93
+msgid "Additional output selection:"
+msgstr ""
+
+#: src/readelf.c:95
+msgid ""
+"Display DWARF section content. SECTION can be one of abbrev, aranges, "
+"frame, info, loc, line, ranges, pubnames, str, macinfo, or exception"
+msgstr ""
+
+#: src/readelf.c:99
+msgid "Dump the uninterpreted contents of SECTION, by number or name"
+msgstr ""
+
+#: src/readelf.c:101
+msgid "Print string contents of sections"
+msgstr ""
+
+#: src/readelf.c:104
+msgid "Display the symbol index of an archive"
+msgstr ""
+
+#: src/readelf.c:106
+msgid "Output control:"
+msgstr ""
+
+#: src/readelf.c:108
+msgid "Do not find symbol names for addresses in DWARF data"
+msgstr ""
+
+#: src/readelf.c:114
+msgid "Print information from ELF file in human-readable form."
+msgstr ""
+
+#: src/readelf.c:401
+#, c-format
+msgid "Unknown DWARF debug section `%s'.\n"
+msgstr ""
+
+#: src/readelf.c:465
+#, c-format
+msgid "cannot generate Elf descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:477
+#, c-format
+msgid "'%s' is not an archive, cannot print archive index"
+msgstr ""
+
+#: src/readelf.c:482
+#, c-format
+msgid "error while closing Elf descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:574
+#, c-format
+msgid "cannot stat input file"
+msgstr ""
+
+#: src/readelf.c:576
+#, c-format
+msgid "input file is empty"
+msgstr ""
+
+#: src/readelf.c:578
+#, c-format
+msgid "failed reading '%s': %s"
+msgstr ""
+
+#: src/readelf.c:614
+#, c-format
+msgid "cannot read ELF header: %s"
+msgstr ""
+
+#: src/readelf.c:622
+#, c-format
+msgid "cannot create EBL handle"
+msgstr ""
+
+#: src/readelf.c:635
+#, c-format
+msgid "cannot determine number of program headers: %s"
+msgstr ""
+
+#: src/readelf.c:721
+msgid "NONE (None)"
+msgstr ""
+
+#: src/readelf.c:722
+msgid "REL (Relocatable file)"
+msgstr ""
+
+#: src/readelf.c:723
+msgid "EXEC (Executable file)"
+msgstr ""
+
+#: src/readelf.c:724
+msgid "DYN (Shared object file)"
+msgstr ""
+
+#: src/readelf.c:725
+msgid "CORE (Core file)"
+msgstr ""
+
+#: src/readelf.c:730
+#, c-format
+msgid "OS Specific: (%x)\n"
+msgstr ""
+
+#: src/readelf.c:732
+#, c-format
+msgid "Processor Specific: (%x)\n"
+msgstr ""
+
+#: src/readelf.c:742
+msgid ""
+"ELF Header:\n"
+" Magic: "
+msgstr ""
+
+#: src/readelf.c:746
+#, c-format
+msgid ""
+"\n"
+" Class: %s\n"
+msgstr ""
+
+#: src/readelf.c:751
+#, c-format
+msgid " Data: %s\n"
+msgstr ""
+
+#: src/readelf.c:757
+#, c-format
+msgid " Ident Version: %hhd %s\n"
+msgstr ""
+
+#: src/readelf.c:759 src/readelf.c:776
+msgid "(current)"
+msgstr ""
+
+#: src/readelf.c:763
+#, c-format
+msgid " OS/ABI: %s\n"
+msgstr ""
+
+#: src/readelf.c:766
+#, c-format
+msgid " ABI Version: %hhd\n"
+msgstr ""
+
+#: src/readelf.c:769
+msgid " Type: "
+msgstr ""
+
+#: src/readelf.c:772
+#, c-format
+msgid " Machine: %s\n"
+msgstr ""
+
+#: src/readelf.c:774
+#, c-format
+msgid " Version: %d %s\n"
+msgstr ""
+
+#: src/readelf.c:778
+#, c-format
+msgid " Entry point address: %#<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:781
+#, c-format
+msgid " Start of program headers: %<PRId64> %s\n"
+msgstr ""
+
+#: src/readelf.c:782 src/readelf.c:785
+msgid "(bytes into file)"
+msgstr ""
+
+#: src/readelf.c:784
+#, c-format
+msgid " Start of section headers: %<PRId64> %s\n"
+msgstr ""
+
+#: src/readelf.c:787
+#, c-format
+msgid " Flags: %s\n"
+msgstr ""
+
+#: src/readelf.c:790
+#, c-format
+msgid " Size of this header: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:791 src/readelf.c:794 src/readelf.c:811
+msgid "(bytes)"
+msgstr ""
+
+#: src/readelf.c:793
+#, c-format
+msgid " Size of program header entries: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:796
+#, c-format
+msgid " Number of program headers entries: %<PRId16>"
+msgstr ""
+
+#: src/readelf.c:803
+#, c-format
+msgid " (%<PRIu32> in [0].sh_info)"
+msgstr ""
+
+#: src/readelf.c:806 src/readelf.c:823 src/readelf.c:837
+msgid " ([0] not available)"
+msgstr ""
+
+#: src/readelf.c:810
+#, c-format
+msgid " Size of section header entries: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:813
+#, c-format
+msgid " Number of section headers entries: %<PRId16>"
+msgstr ""
+
+#: src/readelf.c:820
+#, c-format
+msgid " (%<PRIu32> in [0].sh_size)"
+msgstr ""
+
+#: src/readelf.c:833
+#, c-format
+msgid " (%<PRIu32> in [0].sh_link)"
+msgstr ""
+
+#: src/readelf.c:841
+#, c-format
+msgid ""
+" Section header string table index: XINDEX%s\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:845
+#, c-format
+msgid ""
+" Section header string table index: %<PRId16>\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:877
+#, c-format
+msgid ""
+"There are %d section headers, starting at offset %#<PRIx64>:\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:887
+msgid "Section Headers:"
+msgstr ""
+
+#: src/readelf.c:890
+msgid ""
+"[Nr] Name Type Addr Off Size ES Flags Lk "
+"Inf Al"
+msgstr ""
+
+#: src/readelf.c:892
+msgid ""
+"[Nr] Name Type Addr Off Size ES "
+"Flags Lk Inf Al"
+msgstr ""
+
+#: src/readelf.c:899 src/readelf.c:1052
+#, c-format
+msgid "cannot get section: %s"
+msgstr ""
+
+#: src/readelf.c:906 src/readelf.c:1060 src/readelf.c:7554 src/unstrip.c:353
+#: src/unstrip.c:377 src/unstrip.c:427 src/unstrip.c:536 src/unstrip.c:553
+#: src/unstrip.c:591 src/unstrip.c:789 src/unstrip.c:1057 src/unstrip.c:1244
+#: src/unstrip.c:1305 src/unstrip.c:1427 src/unstrip.c:1480 src/unstrip.c:1588
+#: src/unstrip.c:1778
+#, c-format
+msgid "cannot get section header: %s"
+msgstr ""
+
+#: src/readelf.c:964
+msgid "Program Headers:"
+msgstr ""
+
+#: src/readelf.c:966
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align"
+msgstr ""
+
+#: src/readelf.c:969
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz "
+"MemSiz Flg Align"
+msgstr ""
+
+#: src/readelf.c:1009
+#, c-format
+msgid "\t[Requesting program interpreter: %s]\n"
+msgstr ""
+
+#: src/readelf.c:1030
+msgid ""
+"\n"
+" Section to Segment mapping:\n"
+" Segment Sections..."
+msgstr ""
+
+#: src/readelf.c:1041 src/unstrip.c:1824 src/unstrip.c:1863 src/unstrip.c:1870
+#, c-format
+msgid "cannot get program header: %s"
+msgstr ""
+
+#: src/readelf.c:1175
+#, c-format
+msgid ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1180
+#, c-format
+msgid ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1188
+msgid "<INVALID SYMBOL>"
+msgstr ""
+
+#: src/readelf.c:1202
+msgid "<INVALID SECTION>"
+msgstr ""
+
+#: src/readelf.c:1353
+#, c-format
+msgid ""
+"\n"
+"Dynamic segment contains %lu entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Dynamic segment contains %lu entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1365
+msgid " Type Value\n"
+msgstr ""
+
+#: src/readelf.c:1389
+#, c-format
+msgid "Shared library: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1394
+#, c-format
+msgid "Library soname: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1399
+#, c-format
+msgid "Library rpath: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1404
+#, c-format
+msgid "Library runpath: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1424
+#, c-format
+msgid "%<PRId64> (bytes)\n"
+msgstr ""
+
+#: src/readelf.c:1534 src/readelf.c:1720
+#, c-format
+msgid ""
+"\n"
+"Invalid symbol table at offset %#0<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:1552 src/readelf.c:1737
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1567
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1577
+msgid " Offset Type Value Name\n"
+msgstr ""
+
+#: src/readelf.c:1579
+msgid " Offset Type Value Name\n"
+msgstr ""
+
+#: src/readelf.c:1632 src/readelf.c:1643 src/readelf.c:1656 src/readelf.c:1674
+#: src/readelf.c:1686 src/readelf.c:1805 src/readelf.c:1817 src/readelf.c:1831
+#: src/readelf.c:1850 src/readelf.c:1863
+msgid "<INVALID RELOC>"
+msgstr ""
+
+#: src/readelf.c:1749
+msgid " Offset Type Value Addend Name\n"
+msgstr ""
+
+#: src/readelf.c:1751
+msgid " Offset Type Value Addend Name\n"
+msgstr ""
+
+#: src/readelf.c:1952
+#, c-format
+msgid ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entry:\n"
+msgid_plural ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1958
+#, 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:1968
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr ""
+
+#: src/readelf.c:1970
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr ""
+
+#: src/readelf.c:1990
+#, c-format
+msgid "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
+msgstr ""
+
+#: src/readelf.c:2078
+#, c-format
+msgid "bad dynamic symbol"
+msgstr ""
+
+#: src/readelf.c:2160
+msgid "none"
+msgstr ""
+
+#: src/readelf.c:2177
+msgid "| <unknown>"
+msgstr ""
+
+#: src/readelf.c:2202
+#, c-format
+msgid ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2225
+#, c-format
+msgid " %#06x: Version: %hu File: %s Cnt: %hu\n"
+msgstr ""
+
+#: src/readelf.c:2238
+#, c-format
+msgid " %#06x: Name: %s Flags: %s Version: %hu\n"
+msgstr ""
+
+#: src/readelf.c:2269
+#, c-format
+msgid ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2299
+#, c-format
+msgid " %#06x: Version: %hd Flags: %s Index: %hd Cnt: %hd Name: %s\n"
+msgstr ""
+
+#: src/readelf.c:2314
+#, c-format
+msgid " %#06x: Parent %d: %s\n"
+msgstr ""
+
+#: src/readelf.c:2546
+#, c-format
+msgid ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgid_plural ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2576
+msgid " 0 *local* "
+msgstr ""
+
+#: src/readelf.c:2581
+msgid " 1 *global* "
+msgstr ""
+
+#: src/readelf.c:2612
+#, c-format
+msgid ""
+"\n"
+"Histogram 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"
+msgid_plural ""
+"\n"
+"Histogram for bucket list length in section [%2u] '%s' (total of %d "
+"buckets):\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2636
+#, no-c-format
+msgid " Length Number % of total Coverage\n"
+msgstr ""
+
+#: src/readelf.c:2638
+#, c-format
+msgid " 0 %6<PRIu32> %5.1f%%\n"
+msgstr ""
+
+#: src/readelf.c:2645
+#, c-format
+msgid "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
+msgstr ""
+
+#: src/readelf.c:2658
+#, c-format
+msgid ""
+" Average number of tests: successful lookup: %f\n"
+" unsuccessful lookup: %f\n"
+msgstr ""
+
+#: src/readelf.c:2676 src/readelf.c:2718 src/readelf.c:2759
+#, c-format
+msgid "cannot get data for section %d: %s"
+msgstr ""
+
+#: src/readelf.c:2813
+#, c-format
+msgid ""
+" Symbol Bias: %u\n"
+" Bitmask Size: %zu bytes %<PRIuFAST32>%% bits set 2nd hash shift: %u\n"
+msgstr ""
+
+#: src/readelf.c:2887
+#, c-format
+msgid ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2901
+msgid ""
+" Library Time Stamp Checksum Version "
+"Flags"
+msgstr ""
+
+#: src/readelf.c:2951
+#, c-format
+msgid ""
+"\n"
+"Object attributes section [%2zu] '%s' of %<PRIu64> bytes at offset %"
+"#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:2967
+msgid " Owner Size\n"
+msgstr ""
+
+#: src/readelf.c:2993
+#, c-format
+msgid " %-13s %4<PRIu32>\n"
+msgstr ""
+
+#: src/readelf.c:3025
+#, c-format
+msgid " %-4u %12<PRIu32>\n"
+msgstr ""
+
+#: src/readelf.c:3030
+#, c-format
+msgid " File: %11<PRIu32>\n"
+msgstr ""
+
+#: src/readelf.c:3065
+#, c-format
+msgid " %s: %<PRId64>, %s\n"
+msgstr ""
+
+#: src/readelf.c:3068
+#, c-format
+msgid " %s: %<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:3071
+#, c-format
+msgid " %s: %s\n"
+msgstr ""
+
+#: src/readelf.c:3078
+#, c-format
+msgid " %u: %<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:3081
+#, c-format
+msgid " %u: %s\n"
+msgstr ""
+
+#: src/readelf.c:3117
+#, c-format
+msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3120
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3125
+#, c-format
+msgid "%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3128
+#, c-format
+msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3134
+#, c-format
+msgid "%s+%#<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3137
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3141
+#, c-format
+msgid "%#<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3144
+#, c-format
+msgid "%#0*<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3149
+#, c-format
+msgid "%s+%#<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3152
+#, c-format
+msgid "%s+%#0*<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3260
+#, c-format
+msgid "unknown tag %hx"
+msgstr ""
+
+#: src/readelf.c:3262
+#, c-format
+msgid "unknown user tag %hx"
+msgstr ""
+
+#: src/readelf.c:3480
+#, c-format
+msgid "unknown attribute %hx"
+msgstr ""
+
+#: src/readelf.c:3483
+#, c-format
+msgid "unknown user attribute %hx"
+msgstr ""
+
+#: src/readelf.c:3529
+#, c-format
+msgid "unknown form %<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3763
+msgid "empty block"
+msgstr ""
+
+#: src/readelf.c:3766
+#, c-format
+msgid "%zu byte block:"
+msgstr ""
+
+#: src/readelf.c:4175
+#, c-format
+msgid "%*s[%4<PRIuMAX>] %s <TRUNCATED>\n"
+msgstr ""
+
+#: src/readelf.c:4188
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [ Code]\n"
+msgstr ""
+
+#: src/readelf.c:4195
+#, c-format
+msgid ""
+"\n"
+"Abbreviation section at offset %<PRIu64>:\n"
+msgstr ""
+
+#: src/readelf.c:4208
+#, c-format
+msgid " *** error while reading abbreviation: %s\n"
+msgstr ""
+
+#: src/readelf.c:4224
+#, c-format
+msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
+msgstr ""
+
+#: src/readelf.c:4227
+msgid "yes"
+msgstr ""
+
+#: src/readelf.c:4227
+msgid "no"
+msgstr ""
+
+#: src/readelf.c:4263
+#, c-format
+msgid "cannot get .debug_aranges content: %s"
+msgstr ""
+
+#: src/readelf.c:4268
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:4298
+#, c-format
+msgid " [%*zu] ???\n"
+msgstr ""
+
+#: src/readelf.c:4300
+#, c-format
+msgid ""
+" [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:4319
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr ""
+
+#: src/readelf.c:4324 src/readelf.c:4810 src/readelf.c:5452 src/readelf.c:5897
+#: src/readelf.c:5992 src/readelf.c:6164
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:4338 src/readelf.c:5911
+#, c-format
+msgid " [%6tx] <INVALID DATA>\n"
+msgstr ""
+
+#: src/readelf.c:4360 src/readelf.c:5933
+#, c-format
+msgid " [%6tx] base address %s\n"
+msgstr ""
+
+#: src/readelf.c:4371
+#, c-format
+msgid " [%6tx] %s..%s\n"
+msgstr ""
+
+#: src/readelf.c:4373
+#, c-format
+msgid " %s..%s\n"
+msgstr ""
+
+#: src/readelf.c:4799 src/readelf.c:6230 src/readelf.c:6332
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr ""
+
+#: src/readelf.c:4806
+#, c-format
+msgid ""
+"\n"
+"Call frame information section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:4833 src/readelf.c:5486
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr ""
+
+#: src/readelf.c:4855
+#, c-format
+msgid ""
+"\n"
+" [%6tx] Zero terminator\n"
+msgstr ""
+
+#: src/readelf.c:4924
+#, c-format
+msgid "invalid augmentation length"
+msgstr ""
+
+#: src/readelf.c:4936
+msgid "FDE address encoding: "
+msgstr ""
+
+#: src/readelf.c:4942
+msgid "LSDA pointer encoding: "
+msgstr ""
+
+#: src/readelf.c:5034
+#, c-format
+msgid " (offset: %#<PRIx64>)"
+msgstr ""
+
+#: src/readelf.c:5041
+#, c-format
+msgid " (end offset: %#<PRIx64>)"
+msgstr ""
+
+#: src/readelf.c:5068
+#, c-format
+msgid " %-26sLSDA pointer: %#<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:5114
+#, c-format
+msgid "cannot get attribute code: %s"
+msgstr ""
+
+#: src/readelf.c:5122
+#, c-format
+msgid "cannot get attribute form: %s"
+msgstr ""
+
+#: src/readelf.c:5135
+#, c-format
+msgid "cannot get attribute value: %s"
+msgstr ""
+
+#: src/readelf.c:5331
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [Offset]\n"
+msgstr ""
+
+#: src/readelf.c:5356
+#, c-format
+msgid ""
+" Compilation unit at offset %<PRIu64>:\n"
+" Version: %<PRIu16>, Abbreviation section offset: %<PRIu64>, Address size: %"
+"<PRIu8>, Offset size: %<PRIu8>\n"
+msgstr ""
+
+#: src/readelf.c:5374
+#, c-format
+msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
+msgstr ""
+
+#: src/readelf.c:5385
+#, c-format
+msgid "cannot get DIE offset: %s"
+msgstr ""
+
+#: src/readelf.c:5393
+#, c-format
+msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
+msgstr ""
+
+#: src/readelf.c:5422
+#, c-format
+msgid "cannot get next DIE: %s\n"
+msgstr ""
+
+#: src/readelf.c:5429
+#, c-format
+msgid "cannot get next DIE: %s"
+msgstr ""
+
+#: src/readelf.c:5464
+#, c-format
+msgid "cannot get line data section data: %s"
+msgstr ""
+
+#: src/readelf.c:5477
+#, c-format
+msgid ""
+"\n"
+"Table at offset %Zu:\n"
+msgstr ""
+
+#: src/readelf.c:5529
+#, c-format
+msgid ""
+"\n"
+" Length: %<PRIu64>\n"
+" DWARF version: %<PRIuFAST16>\n"
+" Prologue length: %<PRIu64>\n"
+" Minimum instruction length: %<PRIuFAST8>\n"
+" Initial value if '%s': %<PRIuFAST8>\n"
+" Line base: %<PRIdFAST8>\n"
+" Line range: %<PRIuFAST8>\n"
+" Opcode base: %<PRIuFAST8>\n"
+"\n"
+"Opcodes:\n"
+msgstr ""
+
+#: src/readelf.c:5548
+#, c-format
+msgid "invalid data at offset %tu in section [%zu] '%s'"
+msgstr ""
+
+#: src/readelf.c:5563
+#, c-format
+msgid " [%*<PRIuFAST8>] %hhu argument\n"
+msgid_plural " [%*<PRIuFAST8>] %hhu arguments\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:5571
+msgid ""
+"\n"
+"Directory table:"
+msgstr ""
+
+#: src/readelf.c:5587
+msgid ""
+"\n"
+"File name table:\n"
+" Entry Dir Time Size Name"
+msgstr ""
+
+#: src/readelf.c:5616
+msgid ""
+"\n"
+"Line number statements:"
+msgstr ""
+
+#: src/readelf.c:5677
+#, c-format
+msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
+msgstr ""
+
+#: src/readelf.c:5697
+#, c-format
+msgid " extended opcode %u: "
+msgstr ""
+
+#: src/readelf.c:5702
+msgid "end of sequence"
+msgstr ""
+
+#: src/readelf.c:5717
+#, c-format
+msgid "set address to %s\n"
+msgstr ""
+
+#: src/readelf.c:5738
+#, c-format
+msgid "define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
+msgstr ""
+
+#: src/readelf.c:5747
+msgid "unknown opcode"
+msgstr ""
+
+#: src/readelf.c:5759
+msgid " copy"
+msgstr ""
+
+#: src/readelf.c:5769
+#, c-format
+msgid "advance address by %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5780
+#, c-format
+msgid " advance line by constant %d to %<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:5788
+#, c-format
+msgid " set file to %<PRIu64>\n"
+msgstr ""
+
+#: src/readelf.c:5798
+#, c-format
+msgid " set column to %<PRIu64>\n"
+msgstr ""
+
+#: src/readelf.c:5805
+#, c-format
+msgid " set '%s' to %<PRIuFAST8>\n"
+msgstr ""
+
+#: src/readelf.c:5811
+msgid " set basic block flag"
+msgstr ""
+
+#: src/readelf.c:5821
+#, c-format
+msgid "advance address by constant %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5837
+#, c-format
+msgid "advance address by fixed value %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5846
+msgid " set prologue end flag"
+msgstr ""
+
+#: src/readelf.c:5851
+msgid " set epilogue begin flag"
+msgstr ""
+
+#: src/readelf.c:5860
+#, c-format
+msgid " unknown opcode with %<PRIu8> parameter:"
+msgid_plural " unknown opcode with %<PRIu8> parameters:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:5892
+#, c-format
+msgid "cannot get .debug_loc content: %s"
+msgstr ""
+
+#: src/readelf.c:5947
+#, c-format
+msgid " [%6tx] %s..%s"
+msgstr ""
+
+#: src/readelf.c:5949
+#, c-format
+msgid " %s..%s"
+msgstr ""
+
+#: src/readelf.c:6002
+#, c-format
+msgid "cannot get macro information section data: %s"
+msgstr ""
+
+#: src/readelf.c:6081
+#, c-format
+msgid "%*s*** non-terminated string at end of section"
+msgstr ""
+
+#: src/readelf.c:6149
+#, c-format
+msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
+msgstr ""
+
+#: src/readelf.c:6188
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" %*s String\n"
+msgstr ""
+
+#: src/readelf.c:6202
+#, c-format
+msgid " *** error while reading strings: %s\n"
+msgstr ""
+
+#: src/readelf.c:6222
+#, c-format
+msgid ""
+"\n"
+"Call frame search table section [%2zu] '.eh_frame_hdr':\n"
+msgstr ""
+
+#: src/readelf.c:6324
+#, c-format
+msgid ""
+"\n"
+"Exception handling table section [%2zu] '.gcc_except_table':\n"
+msgstr ""
+
+#: src/readelf.c:6347
+#, c-format
+msgid " LPStart encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6359
+#, c-format
+msgid " TType encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6373
+#, c-format
+msgid " Call site encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6386
+msgid ""
+"\n"
+" Call site table:"
+msgstr ""
+
+#: src/readelf.c:6400
+#, c-format
+msgid ""
+" [%4u] Call site start: %#<PRIx64>\n"
+" Call site length: %<PRIu64>\n"
+" Landing pad: %#<PRIx64>\n"
+" Action: %u\n"
+msgstr ""
+
+#: src/readelf.c:6460
+#, c-format
+msgid "invalid TType encoding"
+msgstr ""
+
+#: src/readelf.c:6484
+#, c-format
+msgid "cannot get debug context descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:6620 src/readelf.c:7221
+#, c-format
+msgid "cannot convert core note data: %s"
+msgstr ""
+
+#: src/readelf.c:6961
+#, c-format
+msgid ""
+"\n"
+"%*s... <repeats %u more times> ..."
+msgstr ""
+
+#: src/readelf.c:7320
+msgid " Owner Data size Type\n"
+msgstr ""
+
+#: src/readelf.c:7338
+#, c-format
+msgid " %-13.*s %9<PRId32> %s\n"
+msgstr ""
+
+#: src/readelf.c:7372
+#, c-format
+msgid "cannot get content of note section: %s"
+msgstr ""
+
+#: src/readelf.c:7399
+#, c-format
+msgid ""
+"\n"
+"Note section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7422
+#, c-format
+msgid ""
+"\n"
+"Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7468
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no data to dump.\n"
+msgstr ""
+
+#: src/readelf.c:7474 src/readelf.c:7497
+#, c-format
+msgid "cannot get data for section [%Zu] '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7478
+#, c-format
+msgid ""
+"\n"
+"Hex dump of section [%Zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7491
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no strings to dump.\n"
+msgstr ""
+
+#: src/readelf.c:7501
+#, c-format
+msgid ""
+"\n"
+"String section [%Zu] '%s' contains %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7549
+#, c-format
+msgid ""
+"\n"
+"section [%lu] does not exist"
+msgstr ""
+
+#: src/readelf.c:7576
+#, c-format
+msgid ""
+"\n"
+"section '%s' does not exist"
+msgstr ""
+
+#: src/readelf.c:7637
+#, c-format
+msgid "cannot get symbol index of archive '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7640
+#, c-format
+msgid ""
+"\n"
+"Archive '%s' has no symbol index\n"
+msgstr ""
+
+#: src/readelf.c:7644
+#, c-format
+msgid ""
+"\n"
+"Index of archive '%s' has %Zu entries:\n"
+msgstr ""
+
+#: src/readelf.c:7662
+#, c-format
+msgid "cannot extract member at offset %Zu in '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7667
+#, c-format
+msgid "Archive member '%s' contains:\n"
+msgstr ""
+
+#: src/size.c:68
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd' or `sysv'. The default "
+"is `bsd'"
+msgstr ""
+
+#: src/size.c:70
+msgid "Same as `--format=sysv'"
+msgstr ""
+
+#: src/size.c:71
+msgid "Same as `--format=bsd'"
+msgstr ""
+
+#: src/size.c:74
+msgid "Same as `--radix=10'"
+msgstr ""
+
+#: src/size.c:75
+msgid "Same as `--radix=8'"
+msgstr ""
+
+#: src/size.c:76
+msgid "Same as `--radix=16'"
+msgstr ""
+
+#: src/size.c:78
+msgid "Similar to `--format=sysv' output but in one line"
+msgstr ""
+
+#: src/size.c:82
+msgid "Print size and permission flags for loadable segments"
+msgstr ""
+
+#: src/size.c:83
+msgid "Display the total sizes (bsd only)"
+msgstr ""
+
+#: src/size.c:88
+msgid "List section sizes of FILEs (a.out by default)."
+msgstr ""
+
+#: src/size.c:269
+#, c-format
+msgid "Invalid format: %s"
+msgstr ""
+
+#: src/size.c:280
+#, c-format
+msgid "Invalid radix: %s"
+msgstr ""
+
+#: src/size.c:339
+#, c-format
+msgid "%s: file format not recognized"
+msgstr ""
+
+#: src/size.c:446 src/size.c:589
+#, c-format
+msgid " (ex %s)"
+msgstr ""
+
+#: src/size.c:614
+msgid "(TOTALS)\n"
+msgstr ""
+
+#: src/strings.c:70
+msgid "Output Selection:"
+msgstr ""
+
+#: src/strings.c:71
+msgid "Scan entire file, not only loaded sections"
+msgstr ""
+
+#: src/strings.c:73
+msgid "Only NUL-terminated sequences of MIN-LEN characters or more are printed"
+msgstr ""
+
+#: src/strings.c:74
+msgid ""
+"Select character size and endianess: s = 7-bit, S = 8-bit, {b,l} = 16-bit, "
+"{B,L} = 32-bit"
+msgstr ""
+
+#: src/strings.c:78
+msgid "Print name of the file before each string."
+msgstr ""
+
+#: src/strings.c:80
+msgid "Print location of the string in base 8, 10, or 16 respectively."
+msgstr ""
+
+#: src/strings.c:81
+msgid "Alias for --radix=o"
+msgstr ""
+
+#: src/strings.c:88
+msgid "Print the strings of printable characters in files."
+msgstr ""
+
+#: src/strings.c:268 src/strings.c:303
+#, c-format
+msgid "invalid value '%s' for %s parameter"
+msgstr ""
+
+#: src/strings.c:314
+#, c-format
+msgid "invalid minimum length of matched string size"
+msgstr ""
+
+#: src/strings.c:601
+#, c-format
+msgid "lseek64 failed"
+msgstr ""
+
+#: src/strings.c:616 src/strings.c:680
+#, c-format
+msgid "re-mmap failed"
+msgstr ""
+
+#: src/strings.c:653
+#, c-format
+msgid "mprotect failed"
+msgstr ""
+
+#: src/strip.c:74
+msgid "Place stripped output into FILE"
+msgstr ""
+
+#: src/strip.c:75
+msgid "Extract the removed sections into FILE"
+msgstr ""
+
+#: src/strip.c:76
+msgid "Embed name FILE instead of -f argument"
+msgstr ""
+
+#: src/strip.c:80
+msgid "Remove all debugging symbols"
+msgstr ""
+
+#: src/strip.c:84
+msgid "Copy modified/access timestamps to the output"
+msgstr ""
+
+#: src/strip.c:86
+msgid "Remove .comment section"
+msgstr ""
+
+#: src/strip.c:89
+msgid "Relax a few rules to handle slightly broken ELF files"
+msgstr ""
+
+#: src/strip.c:94
+msgid "Discard symbols from object files."
+msgstr ""
+
+#: src/strip.c:186
+#, c-format
+msgid "Only one input file allowed together with '-o' and '-f'"
+msgstr ""
+
+#: src/strip.c:222
+#, c-format
+msgid "-f option specified twice"
+msgstr ""
+
+#: src/strip.c:231
+#, c-format
+msgid "-F option specified twice"
+msgstr ""
+
+#: src/strip.c:240 src/unstrip.c:125
+#, c-format
+msgid "-o option specified twice"
+msgstr ""
+
+#: src/strip.c:260
+#, c-format
+msgid "-R option supports only .comment section"
+msgstr ""
+
+#: src/strip.c:298 src/strip.c:322
+#, c-format
+msgid "cannot stat input file '%s'"
+msgstr ""
+
+#: src/strip.c:312
+#, c-format
+msgid "while opening '%s'"
+msgstr ""
+
+#: src/strip.c:350
+#, c-format
+msgid "%s: cannot use -o or -f when stripping archive"
+msgstr ""
+
+#: src/strip.c:448
+#, c-format
+msgid "cannot open EBL backend"
+msgstr ""
+
+#: src/strip.c:498 src/strip.c:522
+#, c-format
+msgid "cannot create new file '%s': %s"
+msgstr ""
+
+#: src/strip.c:582
+#, c-format
+msgid "illformed file '%s'"
+msgstr ""
+
+#: src/strip.c:869 src/strip.c:956
+#, c-format
+msgid "while generating output file: %s"
+msgstr ""
+
+#: src/strip.c:929 src/strip.c:1668
+#, c-format
+msgid "%s: error while creating ELF header: %s"
+msgstr ""
+
+#: src/strip.c:943
+#, c-format
+msgid "while preparing output for '%s'"
+msgstr ""
+
+#: src/strip.c:994 src/strip.c:1050
+#, c-format
+msgid "while create section header section: %s"
+msgstr ""
+
+#: src/strip.c:1000
+#, c-format
+msgid "cannot allocate section data: %s"
+msgstr ""
+
+#: src/strip.c:1059
+#, c-format
+msgid "while create section header string table: %s"
+msgstr ""
+
+#: src/strip.c:1593 src/strip.c:1690
+#, c-format
+msgid "while writing '%s': %s"
+msgstr ""
+
+#: src/strip.c:1604
+#, c-format
+msgid "while creating '%s'"
+msgstr ""
+
+#: src/strip.c:1616
+#, c-format
+msgid "while computing checksum for debug information"
+msgstr ""
+
+#: src/strip.c:1676
+#, c-format
+msgid "%s: error while reading the file: %s"
+msgstr ""
+
+#: src/strip.c:1722 src/strip.c:1729
+#, c-format
+msgid "error while finishing '%s': %s"
+msgstr ""
+
+#: src/strip.c:1752 src/strip.c:1809
+#, c-format
+msgid "cannot set access and modification date of '%s'"
+msgstr ""
+
+#: src/unstrip.c:78
+msgid "Match MODULE against file names, not module names"
+msgstr ""
+
+#: src/unstrip.c:79
+msgid "Silently skip unfindable files"
+msgstr ""
+
+#: src/unstrip.c:82
+msgid "Place output into FILE"
+msgstr ""
+
+#: src/unstrip.c:84
+msgid "Create multiple output files under DIRECTORY"
+msgstr ""
+
+#: src/unstrip.c:85
+msgid "Use module rather than file names"
+msgstr ""
+
+#: src/unstrip.c:87
+msgid "Create output for modules that have no separate debug information"
+msgstr ""
+
+#: src/unstrip.c:90
+msgid "Apply relocations to section contents in ET_REL files"
+msgstr ""
+
+#: src/unstrip.c:92
+msgid "Only list module and file names, build IDs"
+msgstr ""
+
+#: src/unstrip.c:134
+#, c-format
+msgid "-d option specified twice"
+msgstr ""
+
+#: src/unstrip.c:166
+#, c-format
+msgid "only one of -o or -d allowed"
+msgstr ""
+
+#: src/unstrip.c:175
+#, c-format
+msgid "-n cannot be used with explicit files or -o or -d"
+msgstr ""
+
+#: src/unstrip.c:190
+#, c-format
+msgid "output directory '%s'"
+msgstr ""
+
+#: src/unstrip.c:199
+#, c-format
+msgid "exactly two file arguments are required"
+msgstr ""
+
+#: src/unstrip.c:205
+#, c-format
+msgid "-m, -a, -R, and -i options not allowed with explicit files"
+msgstr ""
+
+#: src/unstrip.c:218
+#, c-format
+msgid "-o or -d is required when using implicit files"
+msgstr ""
+
+#: src/unstrip.c:254
+#, c-format
+msgid "cannot create ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:259
+#, c-format
+msgid "cannot copy ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:264 src/unstrip.c:1817
+#, c-format
+msgid "cannot create program headers: %s"
+msgstr ""
+
+#: src/unstrip.c:270
+#, c-format
+msgid "cannot copy program header: %s"
+msgstr ""
+
+#: src/unstrip.c:280
+#, c-format
+msgid "cannot copy section header: %s"
+msgstr ""
+
+#: src/unstrip.c:283 src/unstrip.c:1505
+#, c-format
+msgid "cannot get section data: %s"
+msgstr ""
+
+#: src/unstrip.c:285 src/unstrip.c:1507
+#, c-format
+msgid "cannot copy section data: %s"
+msgstr ""
+
+#: src/unstrip.c:309
+#, c-format
+msgid "cannot create directory '%s'"
+msgstr ""
+
+#: src/unstrip.c:349 src/unstrip.c:763 src/unstrip.c:1540
+#, c-format
+msgid "cannot get symbol table entry: %s"
+msgstr ""
+
+#: src/unstrip.c:365 src/unstrip.c:580 src/unstrip.c:601 src/unstrip.c:613
+#: src/unstrip.c:1561 src/unstrip.c:1691 src/unstrip.c:1715
+#, c-format
+msgid "cannot update symbol table: %s"
+msgstr ""
+
+#: src/unstrip.c:382 src/unstrip.c:432 src/unstrip.c:562 src/unstrip.c:1209
+#: src/unstrip.c:1525 src/unstrip.c:1720 src/unstrip.c:1791
+#, c-format
+msgid "cannot update section header: %s"
+msgstr ""
+
+#: src/unstrip.c:408 src/unstrip.c:419
+#, c-format
+msgid "cannot update relocation: %s"
+msgstr ""
+
+#: src/unstrip.c:507
+#, c-format
+msgid "cannot get symbol version: %s"
+msgstr ""
+
+#: src/unstrip.c:519
+#, c-format
+msgid "unexpected section type in [%Zu] with sh_link to symtab"
+msgstr ""
+
+#: src/unstrip.c:769
+#, c-format
+msgid "invalid string offset in symbol [%Zu]"
+msgstr ""
+
+#: src/unstrip.c:911 src/unstrip.c:1248
+#, c-format
+msgid "cannot read section [%Zu] name: %s"
+msgstr ""
+
+#: src/unstrip.c:952 src/unstrip.c:971 src/unstrip.c:1004
+#, c-format
+msgid "cannot read '.gnu.prelink_undo' section: %s"
+msgstr ""
+
+#: src/unstrip.c:992
+#, c-format
+msgid "invalid contents in '%s' section"
+msgstr ""
+
+#: src/unstrip.c:1047 src/unstrip.c:1370
+#, c-format
+msgid "cannot find matching section for [%Zu] '%s'"
+msgstr ""
+
+#: src/unstrip.c:1171 src/unstrip.c:1186 src/unstrip.c:1451
+#, c-format
+msgid "cannot add section name to string table: %s"
+msgstr ""
+
+#: src/unstrip.c:1195
+#, c-format
+msgid "cannot update section header string table data: %s"
+msgstr ""
+
+#: src/unstrip.c:1223 src/unstrip.c:1227
+#, c-format
+msgid "cannot get section header string table section index: %s"
+msgstr ""
+
+#: src/unstrip.c:1231 src/unstrip.c:1235 src/unstrip.c:1466
+#, c-format
+msgid "cannot get section count: %s"
+msgstr ""
+
+#: src/unstrip.c:1293 src/unstrip.c:1385
+#, c-format
+msgid "cannot read section header string table: %s"
+msgstr ""
+
+#: src/unstrip.c:1445
+#, c-format
+msgid "cannot add new section: %s"
+msgstr ""
+
+#: src/unstrip.c:1548
+#, c-format
+msgid "symbol [%Zu] has invalid section index"
+msgstr ""
+
+#: src/unstrip.c:1800
+#, c-format
+msgid "cannot get ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:1827
+#, c-format
+msgid "cannot update program header: %s"
+msgstr ""
+
+#: src/unstrip.c:1832 src/unstrip.c:1911
+#, c-format
+msgid "cannot write output file: %s"
+msgstr ""
+
+#: src/unstrip.c:1880
+#, c-format
+msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+
+#: src/unstrip.c:1883
+#, c-format
+msgid ""
+"DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+
+#: src/unstrip.c:1902 src/unstrip.c:1942 src/unstrip.c:1954 src/unstrip.c:2034
+#, c-format
+msgid "cannot create ELF descriptor: %s"
+msgstr ""
+
+#: src/unstrip.c:1960
+#, c-format
+msgid "'%s' and '%s' do not seem to match"
+msgstr ""
+
+#: src/unstrip.c:1991
+#, c-format
+msgid "cannot find stripped file for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:1995
+#, c-format
+msgid "cannot open stripped file '%s' for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2010
+#, c-format
+msgid "cannot find debug file for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2014
+#, c-format
+msgid "cannot open debug file '%s' for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2027
+#, c-format
+msgid "module '%s' file '%s' is not stripped"
+msgstr ""
+
+#: src/unstrip.c:2058
+#, c-format
+msgid "cannot cache section addresses for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2191
+#, c-format
+msgid "no matching modules found"
+msgstr ""
+
+#: src/unstrip.c:2200
+#, c-format
+msgid "matched more than one module"
+msgstr ""
+
+#: src/unstrip.c:2247
+msgid ""
+"STRIPPED-FILE DEBUG-FILE\n"
+"[MODULE...]"
+msgstr ""
+
+#: src/unstrip.c:2248
+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"
+"\n"
+"MODULE arguments give file name patterns matching modules to process.\n"
+"With -f these match the file name of the main (stripped) file (slashes are "
+"never special), otherwise they match the simple module names. With no "
+"arguments, process all modules found.\n"
+"\n"
+"Multiple modules are written to files under OUTPUT-DIRECTORY, creating "
+"subdirectories as needed. With -m these files have simple module names, "
+"otherwise they have the name of the main file complete with directory "
+"underneath OUTPUT-DIRECTORY.\n"
+"\n"
+"With -n no files are written, but one line to standard output for each "
+"module:\n"
+"\tSTART+SIZE BUILDID FILE DEBUGFILE MODULENAME\n"
+"START and SIZE are hexadecimal giving the address bounds of the module. "
+"BUILDID is hexadecimal for the build ID bits, or - if no ID is known; the "
+"hexadecimal may be followed by @0xADDR giving the address where the ID "
+"resides if that is known. FILE is the file name found for the module, or - "
+"if none was found, or . if an ELF image is available but not from any named "
+"file. DEBUGFILE is the separate debuginfo file name, or - if no debuginfo "
+"was found, or . if FILE contains the debug information."
+msgstr ""
diff --git a/po/pl.po b/po/pl.po
new file mode 100644
index 00000000..da37f61b
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,6151 @@
+# translation of pl.po to Polish
+# Jakub Bogusz <qboosh@pld-linux.org>, 2003-2007.
+# Piotr Drąg <piotrdrag@gmail.com>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pl\n"
+"Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
+"POT-Creation-Date: 2010-05-03 14:14-0700\n"
+"PO-Revision-Date: 2007-03-16 20:10+0100\n"
+"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
+"Language-Team: Polish <trans-pl@lists.fedoraproject.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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:51 lib/xmalloc.c:65 lib/xmalloc.c:79 src/readelf.c:2822
+#: src/readelf.c:3161 src/unstrip.c:2087 src/unstrip.c:2295
+#, c-format
+msgid "memory exhausted"
+msgstr "pamięć wyczerpana"
+
+#: libasm/asm_error.c:62 libdw/dwarf_error.c:79 libdwfl/libdwflP.h:70
+#: libelf/elf_error.c:81
+msgid "no error"
+msgstr "bez błędu"
+
+#: libasm/asm_error.c:63 libdw/dwarf_error.c:88 libdwfl/libdwflP.h:72
+#: libelf/elf_error.c:112
+msgid "out of memory"
+msgstr "brak pamięci"
+
+#: libasm/asm_error.c:64 src/ldgeneric.c:2687
+#, c-format
+msgid "cannot create output file"
+msgstr "nie można utworzyć pliku wyjściowego"
+
+#: libasm/asm_error.c:65
+msgid "invalid parameter"
+msgstr "błędny parametr"
+
+#: libasm/asm_error.c:66
+msgid "cannot change mode of output file"
+msgstr "nie można zmienić uprawnień pliku wyjściowego"
+
+#: libasm/asm_error.c:67 src/ldgeneric.c:7001
+#, c-format
+msgid "cannot rename output file"
+msgstr "nie można zmienić nazwy pliku wyjściowego"
+
+#: libasm/asm_error.c:68
+msgid "duplicate symbol"
+msgstr "powtórzony symbol"
+
+#: libasm/asm_error.c:69
+msgid "invalid section type for operation"
+msgstr "błędny rodzaj sekcji dla tej operacji"
+
+#: libasm/asm_error.c:70
+msgid "error during output of data"
+msgstr "błąd podczas wyprowadzania danych"
+
+#: libasm/asm_error.c:71
+msgid "no backend support available"
+msgstr ""
+
+#: libasm/asm_error.c:81 libdw/dwarf_error.c:80 libdwfl/libdwflP.h:71
+#: libelf/elf_error.c:84
+msgid "unknown error"
+msgstr "nieznany błąd"
+
+#: libdw/dwarf_error.c:81
+msgid "invalid access"
+msgstr "błędny dostęp"
+
+#: libdw/dwarf_error.c:82
+msgid "no regular file"
+msgstr "to nie jest zwykły plik"
+
+#: libdw/dwarf_error.c:83
+msgid "I/O error"
+msgstr "błąd we/wy"
+
+#: libdw/dwarf_error.c:84
+msgid "invalid ELF file"
+msgstr "błędny plik ELF"
+
+#: libdw/dwarf_error.c:85
+msgid "no DWARF information"
+msgstr "brak informacji DWARF"
+
+#: libdw/dwarf_error.c:86
+msgid "no ELF file"
+msgstr "brak pliku ELF"
+
+#: libdw/dwarf_error.c:87
+msgid "cannot get ELF header"
+msgstr "nie można pobrać nagłówka ELF"
+
+#: libdw/dwarf_error.c:89
+msgid "not implemented"
+msgstr "nie zaimplementowane"
+
+#: libdw/dwarf_error.c:90 libelf/elf_error.c:128 libelf/elf_error.c:176
+msgid "invalid command"
+msgstr "błędne polecenie"
+
+#: libdw/dwarf_error.c:91
+msgid "invalid version"
+msgstr "błędna wersja"
+
+#: libdw/dwarf_error.c:92
+msgid "invalid file"
+msgstr "błędny plik"
+
+#: libdw/dwarf_error.c:93
+msgid "no entries found"
+msgstr "nie znaleziono wpisów"
+
+#: libdw/dwarf_error.c:94
+msgid "invalid DWARF"
+msgstr "błędny DWARF"
+
+#: libdw/dwarf_error.c:95
+msgid "no string data"
+msgstr "brak danych w postaci łańcucha"
+
+#: libdw/dwarf_error.c:96
+msgid "no address value"
+msgstr "brak wartości adresu"
+
+#: libdw/dwarf_error.c:97
+msgid "no constant value"
+msgstr "brak wartości stałej"
+
+#: libdw/dwarf_error.c:98
+msgid "no reference value"
+msgstr "brak wartości odwołania"
+
+#: libdw/dwarf_error.c:99
+msgid "invalid reference value"
+msgstr "błędna wartość odwołania"
+
+#: libdw/dwarf_error.c:100
+msgid ".debug_line section missing"
+msgstr "brak sekcji .debug_line"
+
+#: libdw/dwarf_error.c:101
+msgid "invalid .debug_line section"
+msgstr "błędna sekcja .debug_line"
+
+#: libdw/dwarf_error.c:102
+msgid "debug information too big"
+msgstr "informacje debugowe zbyt duże"
+
+#: libdw/dwarf_error.c:103
+msgid "invalid DWARF version"
+msgstr "błędna wersja DWARF"
+
+#: libdw/dwarf_error.c:104
+msgid "invalid directory index"
+msgstr "błędny indeks katalogu"
+
+#: libdw/dwarf_error.c:105 libdwfl/libdwflP.h:91
+msgid "address out of range"
+msgstr "adres spoza zakresu"
+
+#: libdw/dwarf_error.c:106
+msgid "no location list value"
+msgstr "brak wartości listy położeń"
+
+#: libdw/dwarf_error.c:107
+msgid "no block data"
+msgstr "brak danych blokowych"
+
+#: libdw/dwarf_error.c:108
+msgid "invalid line index"
+msgstr "błędny indeks linii"
+
+#: libdw/dwarf_error.c:109
+msgid "invalid address range index"
+msgstr "błędny indeks zakresu adresów"
+
+#: libdw/dwarf_error.c:110 libdwfl/libdwflP.h:92
+msgid "no matching address range"
+msgstr "brak pasującego zakresu adresów"
+
+#: libdw/dwarf_error.c:111
+msgid "no flag value"
+msgstr "brak wartości flagi"
+
+#: libdw/dwarf_error.c:112 libelf/elf_error.c:253
+msgid "invalid offset"
+msgstr "błędny offset"
+
+#: libdw/dwarf_error.c:113
+msgid ".debug_ranges section missing"
+msgstr "brak sekcji .debug_ranges"
+
+#: libdw/dwarf_error.c:114
+#, fuzzy
+msgid "invalid CFI section"
+msgstr "błędna wersja"
+
+#: libdwfl/argp-std.c:67 src/unstrip.c:2237
+#, fuzzy
+msgid "Input selection options:"
+msgstr "Wybór wejścia:"
+
+#: libdwfl/argp-std.c:68
+#, fuzzy
+msgid "Find addresses in FILE"
+msgstr "błędny indeks zakresu adresów"
+
+#: libdwfl/argp-std.c:70
+msgid "Find addresses from signatures found in COREFILE"
+msgstr ""
+
+#: libdwfl/argp-std.c:72
+msgid "Find addresses in files mapped into process PID"
+msgstr ""
+
+#: libdwfl/argp-std.c:74
+msgid ""
+"Find addresses in files mapped as read from FILE in Linux /proc/PID/maps "
+"format"
+msgstr ""
+
+#: libdwfl/argp-std.c:76
+msgid "Find addresses in the running kernel"
+msgstr ""
+
+#: libdwfl/argp-std.c:78
+msgid "Kernel with all modules"
+msgstr ""
+
+#: libdwfl/argp-std.c:80
+#, fuzzy
+msgid "Search path for separate debuginfo files"
+msgstr "Plik binarny jest oddzielnym plikiem debuginfo"
+
+#: libdwfl/argp-std.c:163
+#, fuzzy
+msgid "only one of -e, -p, -k, -K, or --core allowed"
+msgstr "dopuszczalna jest tylko jedna z opcji -G i -r"
+
+#: libdwfl/argp-std.c:223
+#, fuzzy, c-format
+msgid "cannot read ELF core file: %s"
+msgstr "nie można odczytać nagłówka ELF: %s"
+
+#: libdwfl/argp-std.c:241
+msgid "No modules recognized in core file"
+msgstr ""
+
+#: libdwfl/argp-std.c:253
+#, fuzzy
+msgid "cannot load kernel symbols"
+msgstr "Nie sortowanie symboli"
+
+#: libdwfl/argp-std.c:257
+msgid "cannot find kernel modules"
+msgstr ""
+
+#: libdwfl/argp-std.c:271
+msgid "cannot find kernel or modules"
+msgstr ""
+
+#: libdwfl/libdwflP.h:73
+msgid "See errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:74
+msgid "See elf_errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:75
+msgid "See dwarf_errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:76
+msgid "See ebl_errno (XXX missing)"
+msgstr ""
+
+#: libdwfl/libdwflP.h:77
+msgid "gzip decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:78
+msgid "bzip2 decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:79
+msgid "LZMA decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:80
+msgid "no support library found for machine"
+msgstr ""
+
+#: libdwfl/libdwflP.h:81
+msgid "Callbacks missing for ET_REL file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:82
+#, fuzzy
+msgid "Unsupported relocation type"
+msgstr "nie można pobrać relokacji: %s"
+
+#: libdwfl/libdwflP.h:83
+msgid "r_offset is bogus"
+msgstr ""
+
+#: libdwfl/libdwflP.h:84 libelf/elf_error.c:132 libelf/elf_error.c:192
+#, fuzzy
+msgid "offset out of range"
+msgstr "adres spoza zakresu"
+
+#: libdwfl/libdwflP.h:85
+#, fuzzy
+msgid "relocation refers to undefined symbol"
+msgstr "Wypisywanie rozmiaru zdefiniowanych symboli"
+
+#: libdwfl/libdwflP.h:86
+msgid "Callback returned failure"
+msgstr ""
+
+#: libdwfl/libdwflP.h:87
+#, fuzzy
+msgid "No DWARF information found"
+msgstr "brak informacji DWARF"
+
+#: libdwfl/libdwflP.h:88
+msgid "No symbol table found"
+msgstr ""
+
+#: libdwfl/libdwflP.h:89
+#, fuzzy
+msgid "No ELF program headers"
+msgstr "nie można pobrać nagłówka programu: %s"
+
+#: libdwfl/libdwflP.h:90
+msgid "address range overlaps an existing module"
+msgstr ""
+
+#: libdwfl/libdwflP.h:93
+msgid "image truncated"
+msgstr ""
+
+#: libdwfl/libdwflP.h:94
+#, fuzzy
+msgid "ELF file opened"
+msgstr "Śledzenie otwierania plików."
+
+#: libdwfl/libdwflP.h:95
+#, fuzzy
+msgid "not a valid ELF file"
+msgstr "błędny plik ELF"
+
+#: libdwfl/libdwflP.h:96
+#, fuzzy
+msgid "cannot handle DWARF type description"
+msgstr "nie można utworzyć deskryptora ELF dla '%s': %s"
+
+#: libebl/eblbackendname.c:63
+msgid "No backend"
+msgstr ""
+
+#: libebl/eblcorenotetypename.c:107 libebl/eblobjecttypename.c:78
+#: libebl/eblobjnotetypename.c:86 libebl/eblosabiname.c:98
+#: libebl/eblsectionname.c:110 libebl/eblsectiontypename.c:140
+#: libebl/eblsegmenttypename.c:104
+#, fuzzy
+msgid "<unknown>"
+msgstr "| <nieznany>"
+
+#: libebl/ebldynamictagname.c:126
+#, fuzzy, c-format
+msgid "<unknown>: %#<PRIx64>"
+msgstr "nieznana forma %<PRIx64>"
+
+#: libebl/eblobjnote.c:76
+#, c-format
+msgid " Build ID: "
+msgstr ""
+
+#: libebl/eblobjnote.c:87
+#, c-format
+msgid " Linker version: %.*s\n"
+msgstr ""
+
+#: libebl/eblobjnote.c:136
+#, c-format
+msgid " OS: %s, ABI: "
+msgstr ""
+
+#: libebl/eblosabiname.c:95
+msgid "Stand alone"
+msgstr ""
+
+#: libebl/eblsymbolbindingname.c:92 libebl/eblsymboltypename.c:98
+#, fuzzy, c-format
+msgid "<unknown>: %d"
+msgstr "| <nieznany>"
+
+#: libelf/elf_error.c:88
+#, fuzzy
+msgid "unknown version"
+msgstr "nieznany błąd"
+
+#: libelf/elf_error.c:92
+#, fuzzy
+msgid "unknown type"
+msgstr "nieznany kod instrukcji"
+
+#: libelf/elf_error.c:96
+#, fuzzy
+msgid "invalid `Elf' handle"
+msgstr "błędny plik"
+
+#: libelf/elf_error.c:100
+#, fuzzy
+msgid "invalid size of source operand"
+msgstr "błędny rodzaj sekcji dla tej operacji"
+
+#: libelf/elf_error.c:104
+#, fuzzy
+msgid "invalid size of destination operand"
+msgstr "błędny rodzaj sekcji dla tej operacji"
+
+#: libelf/elf_error.c:108 src/readelf.c:4779
+#, fuzzy, c-format
+msgid "invalid encoding"
+msgstr "błędne polecenie"
+
+#: libelf/elf_error.c:116
+#, fuzzy
+msgid "invalid file descriptor"
+msgstr "błędny plik"
+
+#: libelf/elf_error.c:120
+#, fuzzy
+msgid "invalid operation"
+msgstr "błędna wersja"
+
+#: libelf/elf_error.c:124
+msgid "ELF version not set"
+msgstr ""
+
+#: libelf/elf_error.c:136
+msgid "invalid fmag field in archive header"
+msgstr ""
+
+#: libelf/elf_error.c:140
+#, fuzzy
+msgid "invalid archive file"
+msgstr "błędny plik"
+
+#: libelf/elf_error.c:144
+#, fuzzy
+msgid "descriptor is not for an archive"
+msgstr "'%s' nie jest archiwum"
+
+#: libelf/elf_error.c:148
+#, fuzzy
+msgid "no index available"
+msgstr " ([0] niedostępny)"
+
+#: libelf/elf_error.c:152
+#, fuzzy
+msgid "cannot read data from file"
+msgstr "nie można utworzyć nowego pliku"
+
+#: libelf/elf_error.c:156
+#, fuzzy
+msgid "cannot write data to file"
+msgstr "nie można wykonać stat na pliku wejściowym"
+
+#: libelf/elf_error.c:160
+#, fuzzy
+msgid "invalid binary class"
+msgstr "błędny dostęp"
+
+#: libelf/elf_error.c:164
+#, fuzzy
+msgid "invalid section index"
+msgstr "błędny indeks nagłówka sekcji\n"
+
+#: libelf/elf_error.c:168
+#, fuzzy
+msgid "invalid operand"
+msgstr "błędne polecenie"
+
+#: libelf/elf_error.c:172
+#, fuzzy
+msgid "invalid section"
+msgstr "błędna wersja"
+
+#: libelf/elf_error.c:180
+msgid "executable header not created first"
+msgstr ""
+
+#: libelf/elf_error.c:184
+msgid "file descriptor disabled"
+msgstr ""
+
+#: libelf/elf_error.c:188
+msgid "archive/member file descriptor mismatch"
+msgstr ""
+
+#: libelf/elf_error.c:196
+#, fuzzy
+msgid "cannot manipulate null section"
+msgstr "nie można przydzielić danych sekcji: %s"
+
+#: libelf/elf_error.c:200
+msgid "data/scn mismatch"
+msgstr ""
+
+#: libelf/elf_error.c:204
+#, fuzzy
+msgid "invalid section header"
+msgstr "błędny indeks nagłówka sekcji\n"
+
+#: libelf/elf_error.c:208 src/readelf.c:6242 src/readelf.c:6343
+#, fuzzy, c-format
+msgid "invalid data"
+msgstr "błędny dostęp"
+
+#: libelf/elf_error.c:212
+#, fuzzy
+msgid "unknown data encoding"
+msgstr "nieznany kod instrukcji"
+
+#: libelf/elf_error.c:216
+msgid "section `sh_size' too small for data"
+msgstr ""
+
+#: libelf/elf_error.c:220
+#, fuzzy
+msgid "invalid section alignment"
+msgstr "błędny indeks nagłówka sekcji\n"
+
+#: libelf/elf_error.c:224
+#, fuzzy
+msgid "invalid section entry size"
+msgstr "błędny rozmiar nagłówka sekcji: %hd\n"
+
+#: libelf/elf_error.c:228
+msgid "update() for write on read-only file"
+msgstr ""
+
+#: libelf/elf_error.c:232
+#, fuzzy
+msgid "no such file"
+msgstr "brak pliku ELF"
+
+#: libelf/elf_error.c:236
+#, fuzzy
+msgid "only relocatable files can contain section groups"
+msgstr "%s: tylko pliki typu ET_REL mogą zawierać grupy sekcji"
+
+#: libelf/elf_error.c:241
+#, fuzzy
+msgid ""
+"program header only allowed in executables, shared objects, and core files"
+msgstr ""
+"tylko pliki wykonywalne, obiektów dzielonych i core mogą mieć nagłówki "
+"programu\n"
+
+#: libelf/elf_error.c:248
+#, fuzzy
+msgid "file has no program header"
+msgstr "Wyświetlenie nagłówków programu"
+
+#: src/addr2line.c:66
+#, fuzzy
+msgid "Output selection options:"
+msgstr "Wybór wyjścia:"
+
+#: src/addr2line.c:67
+msgid "Show only base names of source files"
+msgstr "Pokazywanie tylko podstawowych nazw plików źródłowych"
+
+#: src/addr2line.c:69
+msgid "Show absolute file names using compilation directory"
+msgstr "Pokazywanie bezwzględnych nazw plików z użyciem katalogu kompilacji"
+
+#: src/addr2line.c:70
+msgid "Also show function names"
+msgstr "Pokazywanie dodatkowo nazw funkcji"
+
+#: src/addr2line.c:71
+#, fuzzy
+msgid "Also show symbol or section names"
+msgstr "Pokazywanie dodatkowo nazw funkcji"
+
+#: src/addr2line.c:73
+msgid "Treat addresses as offsets relative to NAME section."
+msgstr ""
+
+#: src/addr2line.c:75 src/elfcmp.c:75 src/findtextrel.c:75 src/nm.c:103
+#: src/strings.c:83
+msgid "Miscellaneous:"
+msgstr "Różne:"
+
+#: src/addr2line.c:84
+msgid ""
+"Locate source files and line information for ADDRs (in a.out by default)."
+msgstr ""
+"Odnajdywanie plików źródłowych i informacji o linii dla ADRESU (domyślnie w "
+"a.out)."
+
+#: src/addr2line.c:88
+msgid "[ADDR...]"
+msgstr "[ADRES...]"
+
+#: src/addr2line.c:185 src/ar.c:289 src/elfcmp.c:555 src/elflint.c:239
+#: src/findtextrel.c:170 src/ld.c:957 src/nm.c:253 src/objdump.c:181
+#: src/ranlib.c:136 src/readelf.c:449 src/size.c:219 src/strings.c:227
+#: src/strip.c:204 src/unstrip.c:234
+#, c-format
+msgid ""
+"Copyright (C) %s Red Hat, Inc.\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+"Copyright (C) %s Red Hat, Inc.\n"
+"To oprogramowanie jest darmowe; warunki kopiowania są opisane w źródłach.\n"
+"Autorzy nie dają ŻADNYCH gwarancji, w tym również gwarancji PRZYDATNOŚCI\n"
+"DO SPRZEDAŻY LUB DO KONKRETNYCH CELÓW.\n"
+
+#: src/addr2line.c:190 src/ar.c:294 src/elfcmp.c:560 src/elflint.c:244
+#: src/findtextrel.c:175 src/ld.c:962 src/nm.c:258 src/objdump.c:186
+#: src/ranlib.c:141 src/readelf.c:454 src/size.c:224 src/strings.c:232
+#: src/strip.c:209 src/unstrip.c:239
+#, c-format
+msgid "Written by %s.\n"
+msgstr "Autorem jest %s.\n"
+
+#: src/addr2line.c:405
+#, c-format
+msgid "Section syntax requires exactly one module"
+msgstr ""
+
+#: src/addr2line.c:428
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside section '%s'"
+msgstr ""
+
+#: src/addr2line.c:461
+#, fuzzy, c-format
+msgid "cannot find symbol '%s'"
+msgstr "nie można pobrać symbolu w '%s': %s"
+
+#: src/addr2line.c:466
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
+msgstr ""
+
+#: src/ar.c:76
+msgid "Commands:"
+msgstr ""
+
+#: src/ar.c:77
+msgid "Delete files from archive."
+msgstr ""
+
+#: src/ar.c:78
+#, fuzzy
+msgid "Move files in archive."
+msgstr "'%s' nie jest archiwum"
+
+#: src/ar.c:79
+#, fuzzy
+msgid "Print files in archive."
+msgstr "'%s' nie jest archiwum"
+
+#: src/ar.c:80
+msgid "Quick append files to archive."
+msgstr ""
+
+#: src/ar.c:82
+msgid "Replace existing or insert new file into archive."
+msgstr ""
+
+#: src/ar.c:83
+msgid "Display content of archive."
+msgstr ""
+
+#: src/ar.c:84
+msgid "Extract files from archive."
+msgstr ""
+
+#: src/ar.c:86
+msgid "Command Modifiers:"
+msgstr ""
+
+#: src/ar.c:87
+msgid "Preserve original dates."
+msgstr ""
+
+#: src/ar.c:88
+msgid "Use instance [COUNT] of name."
+msgstr ""
+
+#: src/ar.c:90
+msgid "Do not replace existing files with extracted files."
+msgstr ""
+
+#: src/ar.c:91
+msgid "Allow filename to be truncated if necessary."
+msgstr ""
+
+#: src/ar.c:93
+msgid "Provide verbose output."
+msgstr ""
+
+#: src/ar.c:94
+msgid "Force regeneration of symbol table."
+msgstr ""
+
+#: src/ar.c:95
+msgid "Insert file after [MEMBER]."
+msgstr ""
+
+#: src/ar.c:96
+msgid "Insert file before [MEMBER]."
+msgstr ""
+
+#: src/ar.c:97
+#, fuzzy
+msgid "Same as -b."
+msgstr "To samo co --format=bsd"
+
+#: src/ar.c:98
+msgid "Suppress message when library has to be created."
+msgstr ""
+
+#: src/ar.c:100
+msgid "Use full path for file matching."
+msgstr ""
+
+#: src/ar.c:101
+msgid "Update only older files in archive."
+msgstr ""
+
+#: src/ar.c:107
+#, fuzzy
+msgid "Create, modify, and extract from archives."
+msgstr "Słabe odwołania powodują wyciągnięcie z archiwum."
+
+#: src/ar.c:110
+msgid "[MEMBER] [COUNT] ARCHIVE [FILE...]"
+msgstr ""
+
+#: src/ar.c:192
+#, c-format
+msgid "'a', 'b', and 'i' are only allowed with the 'm' and 'r' options"
+msgstr ""
+
+#: src/ar.c:197
+#, c-format
+msgid "MEMBER parameter required for 'a', 'b', and 'i' modifiers"
+msgstr ""
+
+#: src/ar.c:213
+#, c-format
+msgid "'N' is only meaningful with the 'x' and 'd' options"
+msgstr ""
+
+#: src/ar.c:218
+#, c-format
+msgid "COUNT parameter required"
+msgstr ""
+
+#: src/ar.c:230
+#, fuzzy, c-format
+msgid "invalid COUNT parameter %s"
+msgstr "błędny parametr"
+
+#: src/ar.c:237
+#, c-format
+msgid "'%c' is only meaningful with the 'x' option"
+msgstr ""
+
+#: src/ar.c:243
+#, fuzzy, c-format
+msgid "archive name required"
+msgstr "Wymagana nazwa archiwum"
+
+#: src/ar.c:314
+#, fuzzy, c-format
+msgid "More than one operation specified"
+msgstr "Nie podano operacji.\n"
+
+#: src/ar.c:404
+#, fuzzy, c-format
+msgid "cannot open archive '%s'"
+msgstr "nie można otworzyć '%s'"
+
+#: src/ar.c:414
+#, fuzzy, c-format
+msgid "cannot open archive '%s': %s"
+msgstr "nie można odczytać archiwum `%s': %s"
+
+#: src/ar.c:418
+#, fuzzy, c-format
+msgid "%s: not an archive file"
+msgstr "Łączenie plików obiektów i archiwów."
+
+#: src/ar.c:422
+#, fuzzy, c-format
+msgid "cannot stat archive '%s'"
+msgstr "nie można wykonać stat na '%s'"
+
+#: src/ar.c:434
+#, fuzzy, c-format
+msgid "no entry %s in archive\n"
+msgstr "'%s' nie jest archiwum"
+
+#: src/ar.c:487 src/ar.c:929 src/ar.c:1129
+#, fuzzy, c-format
+msgid "cannot create hash table"
+msgstr "nie można utworzyć tabeli łańcuchów"
+
+#: src/ar.c:494 src/ar.c:936 src/ar.c:1138
+#, fuzzy, c-format
+msgid "cannot insert into hash table"
+msgstr "nie można utworzyć tabeli łańcuchów"
+
+#: src/ar.c:502 src/ranlib.c:176
+#, c-format
+msgid "cannot stat '%s'"
+msgstr "nie można wykonać stat na '%s'"
+
+#: src/ar.c:598
+#, fuzzy, c-format
+msgid "cannot read content of %s: %s"
+msgstr "nie można pobrać zawartości sekcji %zu: %s"
+
+#: src/ar.c:641
+#, fuzzy, c-format
+msgid "cannot open %.*s"
+msgstr "nie można otworzyć %s"
+
+#: src/ar.c:663
+#, c-format
+msgid "failed to write %s"
+msgstr ""
+
+#: src/ar.c:675
+#, fuzzy, c-format
+msgid "cannot change mode of %s"
+msgstr "nie można zmienić uprawnień pliku wyjściowego"
+
+#: src/ar.c:691
+#, fuzzy, c-format
+msgid "cannot change modification time of %s"
+msgstr "nie można ustawić czasu dostępu i modyfikacji '%s'"
+
+#: src/ar.c:737
+#, fuzzy, c-format
+msgid "cannot rename temporary file to %.*s"
+msgstr "nie można zmienić nazwy pliku wyjściowego"
+
+#: src/ar.c:773 src/ar.c:1021 src/ar.c:1419 src/ranlib.c:250
+#, c-format
+msgid "cannot create new file"
+msgstr "nie można utworzyć nowego pliku"
+
+#: src/ar.c:1220
+#, c-format
+msgid "position member %s not found"
+msgstr ""
+
+#: src/ar.c:1230
+#, fuzzy, c-format
+msgid "%s: no entry %s in archive!\n"
+msgstr "'%s' nie jest archiwum"
+
+#: src/ar.c:1259 src/ldgeneric.c:519 src/objdump.c:257
+#, c-format
+msgid "cannot open %s"
+msgstr "nie można otworzyć %s"
+
+#: src/ar.c:1264
+#, fuzzy, c-format
+msgid "cannot stat %s"
+msgstr "nie można wykonać stat na '%s'"
+
+#: src/ar.c:1270
+#, fuzzy, c-format
+msgid "%s is no regular file"
+msgstr "to nie jest zwykły plik"
+
+#: src/ar.c:1283
+#, fuzzy, c-format
+msgid "cannot get ELF descriptor for %s: %s\n"
+msgstr "nie można utworzyć deskryptora ELF dla '%s': %s"
+
+#: src/ar.c:1302
+#, fuzzy, c-format
+msgid "cannot read %s: %s"
+msgstr "nie można odczytać archiwum `%s': %s"
+
+#: src/arlib.c:215
+#, c-format
+msgid "the archive '%s' is too large"
+msgstr ""
+
+#: src/arlib.c:228
+#, fuzzy, c-format
+msgid "cannot read ELF header of %s(%s): %s"
+msgstr "nie można pobrać nagłówka ELF '%s': %s"
+
+#: src/elfcmp.c:69
+msgid "Control options:"
+msgstr "Opcje sterujące:"
+
+#: src/elfcmp.c:70
+msgid ""
+"Control treatment of gaps in loadable segments [ignore|match] (default: "
+"ignore)"
+msgstr ""
+"Sterowanie traktowaniem luk w segmentach ładowanych [ignore|match] "
+"(domyślne: ignore)"
+
+#: src/elfcmp.c:72
+msgid "Ignore permutation of buckets in SHT_HASH section"
+msgstr ""
+
+#: src/elfcmp.c:73
+msgid "Output nothing; yield exit status only"
+msgstr "Bez wypisywania; przekazanie tylko kodu wyjścia"
+
+#: src/elfcmp.c:80
+msgid "Compare relevant parts of two ELF files for equality."
+msgstr "Porównywanie odpowiednich części dwóch plików ELF pod kątem równości."
+
+#: src/elfcmp.c:84
+msgid "FILE1 FILE2"
+msgstr "PLIK1 PLIK2"
+
+#: src/elfcmp.c:140
+msgid "Invalid number of parameters.\n"
+msgstr "Błędna liczba parametrów.\n"
+
+#: src/elfcmp.c:168 src/elfcmp.c:173
+#, c-format
+msgid "cannot get ELF header of '%s': %s"
+msgstr "nie można pobrać nagłówka ELF '%s': %s"
+
+#: src/elfcmp.c:190
+#, c-format
+msgid "%s %s diff: ELF header"
+msgstr "%s %s diff: nagłówek ELF"
+
+#: src/elfcmp.c:198 src/elfcmp.c:201
+#, fuzzy, c-format
+msgid "cannot get section count of '%s': %s"
+msgstr "nie można pobrać sekcji: %s"
+
+#: src/elfcmp.c:206
+#, fuzzy, c-format
+msgid "%s %s diff: section count"
+msgstr "%s %s różnią się: nagłówek sekcji"
+
+#: src/elfcmp.c:214 src/elfcmp.c:217
+#, fuzzy, c-format
+msgid "cannot get program header count of '%s': %s"
+msgstr "nie można pobrać wpisu nagłówka programu %d z '%s': %s"
+
+#: src/elfcmp.c:222
+#, fuzzy, c-format
+msgid "%s %s diff: program header count"
+msgstr "%s %s różnią się: nagłówek programu %d"
+
+#: src/elfcmp.c:281
+#, c-format
+msgid "%s %s differ: section header"
+msgstr "%s %s różnią się: nagłówek sekcji"
+
+#: src/elfcmp.c:309 src/elfcmp.c:315
+#, c-format
+msgid "cannot get content of section %zu in '%s': %s"
+msgstr "nie można pobrać zawartości sekcji %zu w '%s': %s"
+
+#: src/elfcmp.c:331 src/elfcmp.c:337
+#, c-format
+msgid "cannot get symbol in '%s': %s"
+msgstr "nie można pobrać symbolu w '%s': %s"
+
+#: src/elfcmp.c:358
+#, c-format
+msgid "%s %s differ: symbol table [%zu]"
+msgstr "%s %s różnią się: tabela symboli [%zu]"
+
+#: src/elfcmp.c:361
+#, c-format
+msgid "%s %s differ: symbol table [%zu,%zu]"
+msgstr "%s %s różnią się: tabela symboli [%zu,%zu]"
+
+#: src/elfcmp.c:409
+#, c-format
+msgid "%s %s differ: section [%zu] '%s' content"
+msgstr "%s %s różnią się: zawartość sekcji [%zu] '%s'"
+
+#: src/elfcmp.c:413
+#, c-format
+msgid "%s %s differ: section [%zu,%zu] '%s' content"
+msgstr "%s %s różnią się: zawartość sekcji [%zu,%zu] '%s'"
+
+#: src/elfcmp.c:429
+#, c-format
+msgid "%s %s differ: unequal amount of important sections"
+msgstr "%s %s różnią się: różna liczba ważnych sekcji"
+
+#: src/elfcmp.c:463 src/elfcmp.c:468
+#, c-format
+msgid "cannot load data of '%s': %s"
+msgstr "nie można odczytać danych z '%s': %s"
+
+#: src/elfcmp.c:487 src/elfcmp.c:493
+#, c-format
+msgid "cannot get program header entry %d of '%s': %s"
+msgstr "nie można pobrać wpisu nagłówka programu %d z '%s': %s"
+
+#: src/elfcmp.c:499
+#, c-format
+msgid "%s %s differ: program header %d"
+msgstr "%s %s różnią się: nagłówek programu %d"
+
+#: src/elfcmp.c:524
+#, c-format
+msgid "%s %s differ: gap"
+msgstr "%s %s różnią się: luka"
+
+#: src/elfcmp.c:583
+#, c-format
+msgid "Invalid value '%s' for --gaps parameter."
+msgstr "Błędna wartość '%s' dla parametru --gaps."
+
+#: src/elfcmp.c:607 src/findtextrel.c:229 src/ldgeneric.c:1767
+#: src/ldgeneric.c:4257 src/nm.c:363 src/ranlib.c:169 src/size.c:301
+#: src/strings.c:183 src/strip.c:433 src/strip.c:468 src/unstrip.c:1900
+#: src/unstrip.c:1929
+#, c-format
+msgid "cannot open '%s'"
+msgstr "nie można otworzyć '%s'"
+
+#: src/elfcmp.c:611 src/findtextrel.c:236 src/ranlib.c:186
+#, c-format
+msgid "cannot create ELF descriptor for '%s': %s"
+msgstr "nie można utworzyć deskryptora ELF dla '%s': %s"
+
+#: src/elfcmp.c:616
+#, c-format
+msgid "cannot create EBL descriptor for '%s'"
+msgstr "nie można utworzyć deskryptora EBL dla '%s'"
+
+#: src/elfcmp.c:634
+#, c-format
+msgid "cannot get section header of section %zu: %s"
+msgstr "nie można pobrać nagłówka sekcji dla sekcji %zu: %s"
+
+#: src/elfcmp.c:644
+#, c-format
+msgid "cannot get content of section %zu: %s"
+msgstr "nie można pobrać zawartości sekcji %zu: %s"
+
+#: src/elfcmp.c:654 src/elfcmp.c:668
+#, c-format
+msgid "cannot get relocation: %s"
+msgstr "nie można pobrać relokacji: %s"
+
+#: src/elflint.c:72
+msgid "Be extremely strict, flag level 2 features."
+msgstr "Bardzo ścisłe sprawdzanie, cechy poziomu 2 flag."
+
+#: src/elflint.c:73
+msgid "Do not print anything if successful"
+msgstr "Nie wypisywanie niczego w przypadku sukcesu"
+
+#: src/elflint.c:74
+msgid "Binary is a separate debuginfo file"
+msgstr "Plik binarny jest oddzielnym plikiem debuginfo"
+
+#: src/elflint.c:76
+msgid ""
+"Binary has been created with GNU ld and is therefore known to be broken in "
+"certain ways"
+msgstr ""
+"Binarka została utworzona przez GNU ld przez co jest uszkodzona w pewien "
+"sposób"
+
+#: src/elflint.c:82
+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:86 src/readelf.c:118
+msgid "FILE..."
+msgstr "PLIK..."
+
+#: src/elflint.c:159 src/readelf.c:272
+#, c-format
+msgid "cannot open input file"
+msgstr "nie można otworzyć pliku wejściowego"
+
+#: src/elflint.c:166
+#, c-format
+msgid "cannot generate Elf descriptor: %s\n"
+msgstr "nie można wygenerować deskryptora Elf: %s\n"
+
+#: src/elflint.c:185
+#, c-format
+msgid "error while closing Elf descriptor: %s\n"
+msgstr "błąd podczas zamykania deskryptora Elf: %s\n"
+
+#: src/elflint.c:189
+msgid "No errors"
+msgstr "Bez błędów"
+
+#: src/elflint.c:223 src/readelf.c:425
+msgid "Missing file name.\n"
+msgstr "Brak nazwy pliku.\n"
+
+#: src/elflint.c:302
+#, c-format
+msgid " error while freeing sub-ELF descriptor: %s\n"
+msgstr " błąd podczas zwalniania deskryptora pod-ELF: %s\n"
+
+#: src/elflint.c:310
+#, c-format
+msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
+msgstr "To nie jest plik ELF - ma złe bajty magiczne na początku\n"
+
+#: src/elflint.c:370
+#, 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:375
+#, 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:379
+#, 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:385
+#, c-format
+msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
+msgstr "nieobsługiwane OS ABI e_ident[%d] == '%s'\n"
+
+#: src/elflint.c:391
+#, c-format
+msgid "unsupport ABI version e_ident[%d] == %d\n"
+msgstr "nieobsługiwana wersja ABI e_ident[%d] == %d\n"
+
+#: src/elflint.c:396
+#, c-format
+msgid "e_ident[%zu] is not zero\n"
+msgstr "e_ident[%zu] nie jest zerem\n"
+
+#: src/elflint.c:401
+#, c-format
+msgid "unknown object file type %d\n"
+msgstr "nieznany typ pliku obiektu %d\n"
+
+#: src/elflint.c:408
+#, c-format
+msgid "unknown machine type %d\n"
+msgstr "nieznany typ maszyny %d\n"
+
+#: src/elflint.c:412
+#, c-format
+msgid "unknown object file version\n"
+msgstr "nieznana wersja pliku obiektu\n"
+
+#: src/elflint.c:418
+#, c-format
+msgid "invalid program header offset\n"
+msgstr "błędny offset nagłówka programu\n"
+
+#: src/elflint.c:420
+#, 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:424
+#, c-format
+msgid "invalid number of program header entries\n"
+msgstr "błędna liczba wpisów nagłówka programu\n"
+
+#: src/elflint.c:432
+#, c-format
+msgid "invalid section header table offset\n"
+msgstr "błędny offset tabeli nagłówków sekcji\n"
+
+#: src/elflint.c:435
+#, c-format
+msgid "section header table must be present\n"
+msgstr "tabela nagłówków sekcji musi istnieć\n"
+
+#: src/elflint.c:449
+#, c-format
+msgid "invalid number of section header table entries\n"
+msgstr "błędna liczba wpisów tabeli nagłówków sekcji\n"
+
+#: src/elflint.c:466
+#, c-format
+msgid "invalid section header index\n"
+msgstr "błędny indeks nagłówka sekcji\n"
+
+#: src/elflint.c:480
+#, fuzzy, c-format
+msgid "invalid number of program header table entries\n"
+msgstr "błędna liczba wpisów nagłówka programu\n"
+
+#: src/elflint.c:489
+#, c-format
+msgid "invalid machine flags: %s\n"
+msgstr "błędne flagi maszyny: %s\n"
+
+#: src/elflint.c:496 src/elflint.c:513
+#, c-format
+msgid "invalid ELF header size: %hd\n"
+msgstr "błędny rozmiar nagłówka ELF: %hd\n"
+
+#: src/elflint.c:499 src/elflint.c:516
+#, c-format
+msgid "invalid program header size: %hd\n"
+msgstr "błędny rozmiar nagłówka programu: %hd\n"
+
+#: src/elflint.c:502 src/elflint.c:519
+#, c-format
+msgid "invalid program header position or size\n"
+msgstr "błędne położenie lub rozmiar nagłówka programu\n"
+
+#: src/elflint.c:505 src/elflint.c:522
+#, c-format
+msgid "invalid section header size: %hd\n"
+msgstr "błędny rozmiar nagłówka sekcji: %hd\n"
+
+#: src/elflint.c:508 src/elflint.c:525
+#, c-format
+msgid "invalid section header position or size\n"
+msgstr "błędne położenie lub rozmiar nagłówka sekcji\n"
+
+#: src/elflint.c:569
+#, c-format
+msgid ""
+"section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
+"group\n"
+msgstr ""
+"sekcja [%2d] '%s': sekcja z flagą SHF_GROUP nie jest częścią grupy sekcji\n"
+
+#: src/elflint.c:573
+#, fuzzy, c-format
+msgid ""
+"section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
+msgstr ""
+"sekcja [%2d] '%s': grupa sekcji [%2zu] '%s' nie poprzedza elementu grupy\n"
+
+#: src/elflint.c:589 src/elflint.c:1432 src/elflint.c:1482 src/elflint.c:1591
+#: src/elflint.c:2185 src/elflint.c:2699 src/elflint.c:2860 src/elflint.c:2990
+#: src/elflint.c:3162 src/elflint.c:4062
+#, c-format
+msgid "section [%2d] '%s': cannot get section data\n"
+msgstr "sekcja [%2d] '%s': nie można pobrać danych sekcji\n"
+
+#: src/elflint.c:602 src/elflint.c:1598
+#, c-format
+msgid ""
+"section [%2d] '%s': referenced as string table for section [%2d] '%s' but "
+"type is not SHT_STRTAB\n"
+msgstr ""
+"sekcja [%2d] '%s': użyta jako tabela łańcuchów dla sekcji [%2d] '%s', ale "
+"nie jest typu SHT_STRTAB\n"
+
+#: src/elflint.c:625
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol table cannot have more than one extended index "
+"section\n"
+msgstr ""
+"sekcja [%2d] '%s': tabela symboli nie może mieć więcej niż jednej "
+"rozszerzonej sekcji indeksów\n"
+
+#: src/elflint.c:636
+#, fuzzy, c-format
+msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
+msgstr "sekcja [%2zu] '%s': rozmiar wpisu nie zgadza się z ElfXX_Sym\n"
+
+#: src/elflint.c:645
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
+msgstr "sekcja [%2d] '%s': nie można pobrać symbolu %d: %s\n"
+
+#: src/elflint.c:650 src/elflint.c:653 src/elflint.c:656 src/elflint.c:659
+#: src/elflint.c:662 src/elflint.c:665
+#, 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:668
+#, 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:678
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
+msgstr "sekcja [%2d] '%s': nie można pobrać symbolu %zu: %s\n"
+
+#: src/elflint.c:687
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
+msgstr "sekcja [%2d] '%s': symbol %zu: błędna wartość nazwy\n"
+
+#: src/elflint.c:700
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: too large section index but no extended "
+"section index section\n"
+msgstr ""
+"sekcja [%2d] '%s': symbol %zu: zbyt duży indeks sekcji, ale nie ma sekcji "
+"rozszerzonych indeksów sekcji\n"
+
+#: src/elflint.c:706
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
+"st_shndx (%<PRIu32>)\n"
+msgstr ""
+"sekcja [%2d] '%s': symbol %zu: XINDEX użyty dla indeksu, który zmieściłby "
+"się w st_shndx (%<PRIu32>)\n"
+
+#: src/elflint.c:718
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
+msgstr "sekcja [%2d] '%s': symbol %zu: błędny indeks sekcji\n"
+
+#: src/elflint.c:726
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown type\n"
+msgstr "sekcja [%2d] '%s': symbol %zu: nieznany typ\n"
+
+#: src/elflint.c:732
+#, 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:737
+#, fuzzy, c-format
+msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
+msgstr "sekcja [%2d] '%s': symbol %zu: nieznany typ\n"
+
+#: src/elflint.c:745
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
+msgstr ""
+"sekcja [%2d] '%s': symbol %zu: COMMON dopuszczalne tylko w plikach "
+"relokowalnych\n"
+
+#: src/elflint.c:749
+#, 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:753
+#, 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:785
+#, 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:791 src/elflint.c:816 src/elflint.c:859
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu does not fit completely in referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+"sekcja [%2d] '%s': symbol %zu nie mieści się w całości we wskazywanej sekcji "
+"[%2d] '%s'\n"
+
+#: src/elflint.c:800
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
+"SHF_TLS flag set\n"
+msgstr ""
+"sekcja [%2d] '%s': symbol %zu: wskazywana sekcja [%2d] '%s' nie ma "
+"ustawionej flagi SHF_TLS\n"
+
+#: src/elflint.c:810 src/elflint.c:852
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+"sekcja [%2d] '%s': symbol %zu: st_value spoza zakresu wskazywanej sekcji [%"
+"2d] '%s'\n"
+
+#: src/elflint.c:837
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
+msgstr ""
+"sekcja [%2d] '%s': symbol %zu: symbol TLS ale brak wpisu TLS nagłówka "
+"programu\n"
+
+#: src/elflint.c:845
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] '%"
+"s'\n"
+msgstr ""
+"sekcja [%2d] '%s': symbol %zu: st_value pomija wskazywaną sekcję [%2d] '%s'\n"
+
+#: src/elflint.c:872
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+"sekcja [%2d] '%s': symbol %zu: symbol lokalny spoza zakresu określonego w "
+"sh_info\n"
+
+#: src/elflint.c:879
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+"sekcja [%2d] '%s': symbol %zu: symbol nie-lokalny spoza zakresu określonego "
+"w sh_info\n"
+
+#: src/elflint.c:886
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
+msgstr "sekcja [%2d] '%s': symbol %zu: nie-lokalny symbol sekcji\n"
+
+#: src/elflint.c:936
+#, fuzzy, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section [%"
+"2d]\n"
+msgstr ""
+"sekcja [%2d] '%s': symbol _GLOBAL_OFFSET_TABLE_ odnosi się do złej sekcji\n"
+
+#: src/elflint.c:943
+#, fuzzy, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] '%"
+"s'\n"
+msgstr ""
+"sekcja [%2d] '%s': symbol _GLOBAL_OFFSET_TABLE_ odnosi się do złej sekcji\n"
+
+#: src/elflint.c:959
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
+"match %s section address %#<PRIx64>\n"
+msgstr ""
+"sekcja [%2d] '%s': wartość symbolu _GLOBAL_OFFSET_TABLE_ %#<PRIx64> nie "
+"pasuje do adresu sekcji %s %#<PRIx64>\n"
+
+#: src/elflint.c:966
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
+"match %s section size %<PRIu64>\n"
+msgstr ""
+"sekcja [%2d] '%s': rozmiar symbolu _GLOBAL_OFFSET_TABLE_ %<PRIu64> nie "
+"pasuje do rozmiaru sekcji %s %<PRIu64>\n"
+
+#: src/elflint.c:974
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
+"section\n"
+msgstr ""
+"sekcja [%2d] '%s': symbol _GLOBAL_OFFSET_TABLE_ istnieje, ale brak sekcji ."
+"got\n"
+
+#: src/elflint.c:990
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
+"segment address %#<PRIx64>\n"
+msgstr ""
+"sekcja [%2d] '%s': wartość symbolu _DYNAMIC_ %#<PRIx64> nie pasuje do adresu "
+"segmentu dynamicznego %#<PRIx64>\n"
+
+#: src/elflint.c:997
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
+"segment size %<PRIu64>\n"
+msgstr ""
+"sekcja [%2d] '%s': rozmiar symbolu _DYNAMIC_ %<PRIu64> nie pasuje do "
+"rozmiaru segmentu dynamicznego %<PRIu64>\n"
+
+#: src/elflint.c:1010
+#, fuzzy, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
+"default visibility\n"
+msgstr "sekcja [%2d] '%s': symbol %d: symbol lokalny z zakresem globalnym\n"
+
+#: src/elflint.c:1014
+#, fuzzy, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
+msgstr "sekcja [%2d] '%s': symbol %zu: nieznany typ\n"
+
+#: src/elflint.c:1059
+#, c-format
+msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
+msgstr "sekcja [%2d] '%s': wartość DT_RELCOUNT użyta dla tej sekcji RELA\n"
+
+#: src/elflint.c:1068 src/elflint.c:1120
+#, c-format
+msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
+msgstr "sekcja [%2d] '%s': wartość DT_RELCOUNT %d zbyt duża dla tej sekcji\n"
+
+#: src/elflint.c:1093 src/elflint.c:1145
+#, c-format
+msgid ""
+"section [%2d] '%s': relative relocations after index %d as specified by "
+"DT_RELCOUNT\n"
+msgstr ""
+"sekcja [%2d] '%s': relokacje względne po indeksie %d określonym przez "
+"DT_RELCOUNT\n"
+
+#: src/elflint.c:1099 src/elflint.c:1151
+#, c-format
+msgid ""
+"section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
+"specified %d relative relocations\n"
+msgstr ""
+"sekcja [%2d] '%s': relokacja bezwzględna pod indeksem %zu; DT_RELCOUNT "
+"określił %d relokacji względnych\n"
+
+#: src/elflint.c:1111
+#, 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:1193
+#, c-format
+msgid "section [%2d] '%s': invalid destination section index\n"
+msgstr "sekcja [%2d] '%s': błędny indeks sekcji docelowej\n"
+
+#: src/elflint.c:1206
+#, c-format
+msgid "section [%2d] '%s': invalid destination section type\n"
+msgstr "sekcja [%2d] '%s': błędny typ sekcji docelowej\n"
+
+#: src/elflint.c:1214
+#, c-format
+msgid "section [%2d] '%s': sh_info should be zero\n"
+msgstr "sekcja [%2d] '%s': sh_info nie jest zerem\n"
+
+#: src/elflint.c:1221
+#, c-format
+msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
+msgstr "sekcja [%2d] '%s': relokacje dla sekcji złączalnych niemożliwe\n"
+
+#: src/elflint.c:1228
+#, 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:1288
+#, c-format
+msgid "text relocation flag set but there is no read-only segment\n"
+msgstr ""
+"flaga relokacji tekstu ustawiona, ale nie ma segmentu tylko do odczytu\n"
+
+#: src/elflint.c:1315
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid type\n"
+msgstr "sekcja [%2d] '%s': relokacja %zu: błędny typ\n"
+
+#: src/elflint.c:1323
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: relocation type invalid for the file "
+"type\n"
+msgstr ""
+"sekcja [%2d] '%s': relokacja %zu: typ relokacji błędny dla tego typu pliku\n"
+
+#: src/elflint.c:1331
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
+msgstr "sekcja [%2d] '%s': relokacja %zu: błędny indeks symbolu\n"
+
+#: src/elflint.c:1349
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
+"be used with %s\n"
+msgstr ""
+"sekcja [%2d] '%s': relokacja %zu: z %s można użyć tylko symbolu "
+"'_GLOBAL_OFFSET_TABLE_'\n"
+
+#: src/elflint.c:1366
+#, 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:1381
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: copy relocation against symbol of type %"
+"s\n"
+msgstr ""
+"sekcja [%2d] '%s': relokacja %zu: relokacja kopii względem symbolu typu %s\n"
+
+#: src/elflint.c:1402
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: read-only section modified but text "
+"relocation flag not set\n"
+msgstr ""
+"sekcja [%2d] '%s': relokacja %zu: sekcja tylko do odczytu modyfikowana, ale "
+"flaga relokacji tekstu nie ustawiona\n"
+
+#: src/elflint.c:1417
+#, 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:1456 src/elflint.c:1506
+#, c-format
+msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
+msgstr "sekcja [%2d] '%s': nie można pobrać relokacji %zu: %s\n"
+
+#: src/elflint.c:1586
+#, c-format
+msgid "more than one dynamic section present\n"
+msgstr "obecna więcej niż jedna sekcja dynamiczna\n"
+
+#: src/elflint.c:1604
+#, 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:1609 src/elflint.c:1901
+#, c-format
+msgid "section [%2d] '%s': sh_info not zero\n"
+msgstr "sekcja [%2d] '%s': sh_info nie jest zerem\n"
+
+#: src/elflint.c:1619
+#, c-format
+msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
+msgstr "sekcja [%2d] '%s': nie można pobrać wpisu %zu sekcji dynamicznej: %s\n"
+
+#: src/elflint.c:1627
+#, 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:1634
+#, c-format
+msgid "section [%2d] '%s': entry %zu: unknown tag\n"
+msgstr "sekcja [%2d] '%s': wpis %zu: nieznany znacznik\n"
+
+#: src/elflint.c:1645
+#, 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:1655
+#, 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:1673
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
+msgstr ""
+"sekcja [%2d] '%s': wpis %zu: wartością DT_PLTREL musi być DT_REL lub "
+"DT_RELA\n"
+
+#: src/elflint.c:1695
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: pointer does not match address of section [%"
+"2d] '%s' referenced by sh_link\n"
+msgstr ""
+"sekcja [%2d] '%s': wpis %zu: wskaźnik nie pasuje do adresu sekcji [%2d] '%s' "
+"wskazywanej przez sh_link\n"
+
+#: src/elflint.c:1738
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
+msgstr ""
+"sekcja [%2d] '%s': wpis %zu: wartość %s musi wskazywać na załadowany "
+"segment\n"
+
+#: src/elflint.c:1753
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must be valid offset in section [%"
+"2d] '%s'\n"
+msgstr ""
+"sekcja [%2d] '%s': wpis %zu: wartość %s musi być poprawnym offsetem w sekcji "
+"[%2d] '%s'\n"
+
+#: src/elflint.c:1773 src/elflint.c:1801
+#, 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:1785
+#, 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:1794
+#, c-format
+msgid "section [%2d] '%s': no hash section present\n"
+msgstr "sekcja [%2d] '%s': brak sekcji haszy\n"
+
+#: src/elflint.c:1809 src/elflint.c:1816
+#, 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:1826 src/elflint.c:1830
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
+msgstr ""
+"sekcja [%2d] '%s': brak znacznika %s w DSO zaznaczonym przy prelinkowaniu\n"
+
+#: src/elflint.c:1836
+#, c-format
+msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
+msgstr ""
+"sekcja [%2d] '%s': plik nie-DSO zaznaczony jako zależność przy "
+"prelinkowaniu\n"
+
+#: src/elflint.c:1847 src/elflint.c:1851 src/elflint.c:1855 src/elflint.c:1859
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
+msgstr ""
+"sekcja [%2d] '%s': brak znacznika %s w prelinkowanym programie wykonywalnym\n"
+
+#: src/elflint.c:1871
+#, c-format
+msgid ""
+"section [%2d] '%s': only relocatable files can have extended section index\n"
+msgstr ""
+"sekcja [%2d] '%s': tylko pliki relokowalne mogą mieć rozszerzoną sekcję "
+"indeksów\n"
+
+#: src/elflint.c:1881
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index section not for symbol table\n"
+msgstr ""
+"sekcja [%2d] '%s': sekcja rozszerzonych indeksów sekcji nie dla tabeli "
+"symboli\n"
+
+#: src/elflint.c:1886
+#, c-format
+msgid "cannot get data for symbol section\n"
+msgstr "nie można pobrać danych dla sekcji symboli\n"
+
+#: src/elflint.c:1889
+#, 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:1896
+#, c-format
+msgid "section [%2d] '%s': extended index table too small for symbol table\n"
+msgstr ""
+"sekcja [%2d] '%s': tabela rozszerzonych indeksów za mała dla tabeli symboli\n"
+
+#: src/elflint.c:1911
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
+"same symbol table\n"
+msgstr ""
+"sekcja [%2d] '%s': rozszerzony indeks sekcji w sekcji [%2zu] '%s' odwołuje "
+"się do tej samej tabeli symboli\n"
+
+#: src/elflint.c:1922
+#, 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:1934
+#, c-format
+msgid "cannot get data for symbol %zu\n"
+msgstr "nie można pobrać danych dla symbolu %zu\n"
+
+#: src/elflint.c:1939
+#, c-format
+msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
+msgstr ""
+"rozszerzony indeks sekcji to %<PRIu32>, ale indeks symbolu to nie XINDEX\n"
+
+#: src/elflint.c:1955 src/elflint.c:1996
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
+msgstr ""
+"sekcja [%2d] '%s': sekcja tablicy haszującej jest zbyt mała (%ld, oczekiwano "
+"%ld)\n"
+
+#: src/elflint.c:1967 src/elflint.c:2008
+#, c-format
+msgid "section [%2d] '%s': chain array too large\n"
+msgstr "sekcja [%2d] '%s': tablica łańcuchowa zbyt duża\n"
+
+#: src/elflint.c:1976 src/elflint.c:2017
+#, c-format
+msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
+msgstr "sekcja [%2d] '%s': odwołanie do kubełka hasza %zu spoza zakresu\n"
+
+#: src/elflint.c:1982
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
+msgstr "sekcja [%2d] '%s': odwołanie do łańcucha hasza %zu spoza zakresu\n"
+
+#: src/elflint.c:2023
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
+msgstr ""
+"sekcja [%2d] '%s': odwołanie do łańcucha hasza %<PRIu64> spoza zakresu\n"
+
+#: src/elflint.c:2038
+#, 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:2049
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected at "
+"least%ld)\n"
+msgstr ""
+"sekcja [%2d] '%s': sekcja tablicy haszującej jest zbyt mała (%ld, oczekiwano "
+"co najmniej %ld)\n"
+
+#: src/elflint.c:2057
+#, c-format
+msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
+msgstr ""
+"sekcja [%2d] '%s': drugie przesunięcie funkcji haszującej zbyt duże: %u\n"
+
+#: src/elflint.c:2089
+#, c-format
+msgid ""
+"section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
+msgstr ""
+"sekcja [%2d] '%s': łańcuch haszujący dla kubełka %zu mniejszy niż "
+"przesunięcie indeksu symboli\n"
+
+#: src/elflint.c:2110
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
+"undefined\n"
+msgstr ""
+"sekcja [%2d] '%s': symbol %u wskazywany w łańcuchu dla kubełka %zu jest "
+"niezdefiniowany\n"
+
+#: src/elflint.c:2121
+#, c-format
+msgid ""
+"section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
+msgstr ""
+"sekcja [%2d] '%s': wartość hasza dla symbolu %u w łańcuchu dla kubełka %zu "
+"jest błędna\n"
+
+#: src/elflint.c:2152
+#, c-format
+msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
+msgstr "sekcja [%2d] '%s': łańcuch hasza dla kubełka %zu spoza zakresu\n"
+
+#: src/elflint.c:2157
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
+msgstr ""
+"sekcja [%2d] '%s': odwołanie do symbolu w łańcuchu dla kubełka %zu spoza "
+"zakresu\n"
+
+#: src/elflint.c:2163
+#, 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 tablicy haszującej\n"
+
+#: src/elflint.c:2176
+#, c-format
+msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
+msgstr ""
+"sekcja [%2d] '%s': pliki relokowalne nie mogą mieć tablic haszujących\n"
+
+#: src/elflint.c:2194
+#, c-format
+msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
+msgstr ""
+"sekcja [%2d] '%s': tablica haszująca nie dla tabeli dynamicznych symboli\n"
+
+#: src/elflint.c:2202
+#, c-format
+msgid "section [%2d] '%s': hash table entry size incorrect\n"
+msgstr "sekcja [%2d] '%s': niepoprawny rozmiar wpisu tablicy haszującej\n"
+
+#: src/elflint.c:2207
+#, c-format
+msgid "section [%2d] '%s': not marked to be allocated\n"
+msgstr "sekcja [%2d] '%s': nie oznaczona do przydzielenia\n"
+
+#: src/elflint.c:2212
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table has not even room for initial administrative "
+"entries\n"
+msgstr ""
+"sekcja [%2d] '%s': tablica haszująca nie ma miejsca nawet na początkowe "
+"wpisy administracyjne\n"
+
+#: src/elflint.c:2260
+#, c-format
+msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
+msgstr "sh_link w sekcjach hash [%2zu] '%s' i [%2zu] '%s' nie są identyczne\n"
+
+#: src/elflint.c:2338 src/elflint.c:2342
+#, 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:2349
+#, c-format
+msgid ""
+"symbol %d referenced in new hash table in [%2zu] '%s' but not in old hash "
+"table in [%2zu] '%s'\n"
+msgstr ""
+"symbol %d wymieniony w nowej tablicy haszującej w [%2zu] '%s', ale nie w "
+"starej tablicy haszującej [%2zu] '%s'\n"
+
+#: src/elflint.c:2361
+#, c-format
+msgid ""
+"symbol %d referenced in old hash table in [%2zu] '%s' but not in new hash "
+"table in [%2zu] '%s'\n"
+msgstr ""
+"symbol %d wymieniony w starej tablicy haszującej w [%2zu] '%s', ale nie w "
+"nowej tablicy haszującej w [%2zu] '%s'\n"
+
+#: src/elflint.c:2377
+#, 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:2397
+#, c-format
+msgid ""
+"section [%2d] '%s': section groups only allowed in relocatable object files\n"
+msgstr ""
+"sekcja [%2d] '%s': w plikach obiektów relokowalnych dozwolone są tylko grupy "
+"sekcji\n"
+
+#: src/elflint.c:2408
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol table: %s\n"
+msgstr "sekcja [%2d] '%s': nie można pobrać tabeli symboli: %s\n"
+
+#: src/elflint.c:2413
+#, 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 ma tabeli symboli\n"
+
+#: src/elflint.c:2419
+#, c-format
+msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
+msgstr "sekcja [%2d] '%s': błędny indeks symbolu w sh_info\n"
+
+#: src/elflint.c:2424
+#, c-format
+msgid "section [%2d] '%s': sh_flags not zero\n"
+msgstr "sekcja [%2d] '%s': niezerowe sh_flags\n"
+
+#: src/elflint.c:2431
+#, fuzzy, c-format
+msgid "section [%2d] '%s': cannot get symbol for signature\n"
+msgstr "sekcja [%2d] '%s': nie można pobrać symbolu %d: %s\n"
+
+#: src/elflint.c:2436
+#, fuzzy, c-format
+msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
+msgstr "sekcja [%2d] '%s': symbol %d: nie można odczytać danych wersji\n"
+
+#: src/elflint.c:2442
+#, 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:2448
+#, c-format
+msgid "section [%2d] '%s': cannot get data: %s\n"
+msgstr "sekcja [%2d] '%s': nie można pobrać danych: %s\n"
+
+#: src/elflint.c:2457
+#, 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"
+
+#: src/elflint.c:2462
+#, 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:2468
+#, c-format
+msgid "section [%2d] '%s': section group without member\n"
+msgstr "sekcja [%2d] '%s': grupa sekcji bez elementów\n"
+
+#: src/elflint.c:2472
+#, 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:2483
+#, c-format
+msgid "section [%2d] '%s': unknown section group flags\n"
+msgstr "sekcja [%2d] '%s': nieznane flagi grupy sekcji\n"
+
+#: src/elflint.c:2495
+#, c-format
+msgid "section [%2d] '%s': section index %Zu out of range\n"
+msgstr "sekcja [%2d] '%s': indeks sekcji %Zu spoza zakresu\n"
+
+#: src/elflint.c:2504
+#, c-format
+msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
+msgstr ""
+"sekcja [%2d] '%s': nie można pobrać nagłówka sekcji dla elementu %zu: %s\n"
+
+#: src/elflint.c:2511
+#, 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:2517
+#, c-format
+msgid ""
+"section [%2d] '%s': element %Zu references section [%2d] '%s' without "
+"SHF_GROUP flag set\n"
+msgstr ""
+"sekcja [%2d] '%s': element %Zu odwołuje się do sekcji [%2d] '%s' bez flagi "
+"SHF_GROUP\n"
+
+#: src/elflint.c:2524
+#, 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:2713
+#, c-format
+msgid ""
+"section [%2d] '%s' refers in sh_link to section [%2d] '%s' which is no "
+"dynamic symbol table\n"
+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:2724
+#, c-format
+msgid ""
+"section [%2d] '%s' has different number of entries than symbol table [%2d] '%"
+"s'\n"
+msgstr ""
+"sekcja [%2d] '%s' ma inną liczbę wpisów niż tabela symboli [%2d] '%s'\n"
+
+#: src/elflint.c:2740
+#, 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:2756
+#, 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:2764
+#, 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:2778
+#, c-format
+msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
+msgstr "sekcja [%2d] '%s': symbol %d: błędny indeks wersji %d\n"
+
+#: src/elflint.c:2783
+#, 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 "
+"zdefiniowanej\n"
+
+#: src/elflint.c:2793
+#, 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:2845
+#, c-format
+msgid "more than one version reference section present\n"
+msgstr "obecna więcej niż jedna sekcja odniesienia wersji\n"
+
+#: src/elflint.c:2853 src/elflint.c:2982
+#, 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ą łańcuchów\n"
+
+#: src/elflint.c:2876 src/elflint.c:3034
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong version %d\n"
+msgstr "sekcja [%2d] '%s': wpis %d ma złą wersję %d\n"
+
+#: src/elflint.c:2882 src/elflint.c:3040
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
+msgstr "sekcja [%2d] '%s': wpis %d ma zły offset dla danych dodatkowych\n"
+
+#: src/elflint.c:2890
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid file reference\n"
+msgstr "sekcja [%2d] '%s': symbol %d ma błędne odniesienie do pliku\n"
+
+#: src/elflint.c:2898
+#, 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:2910
+#, 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 ma nieznaną flagę\n"
+
+#: src/elflint.c:2917
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
+"reference\n"
+msgstr ""
+"sekcja [%2d] '%s': wpis dodatkowy %d do wpisu %d ma błędne odniesienie do "
+"nazwy\n"
+
+#: src/elflint.c:2924
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: %"
+"#x, expected %#x\n"
+msgstr ""
+"sekcja [%2d] '%s': wpis dodatkowy %d do wpisu %d ma złą wartość hasza: %#x, "
+"oczekiwano %#x\n"
+
+#: src/elflint.c:2934
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
+"name '%s'\n"
+msgstr ""
+"sekcja [%2d] '%s': wpis dodatkowy %d do wpisu %d ma powtórzoną nazwę wersji "
+"'%s'\n"
+
+#: src/elflint.c:2945
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
+msgstr ""
+"sekcja [%2d] '%s': wpis dodatkowy %d do wpisu %d ma złe następne pole\n"
+
+#: src/elflint.c:2961 src/elflint.c:3119
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
+msgstr "sekcja [%2d] '%s': wpis %d ma błędny offset do następnego wpisu\n"
+
+#: src/elflint.c:2974
+#, c-format
+msgid "more than one version definition section present\n"
+msgstr "obecna więcej niż jedna sekcja definicji wersji\n"
+
+#: src/elflint.c:3019
+#, 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:3023
+#, c-format
+msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
+msgstr "sekcja [%2d] '%s': definicja BASE musi mieć indeks VER_NDX_GLOBAL\n"
+
+#: src/elflint.c:3029
+#, c-format
+msgid "section [%2d] '%s': entry %d has unknown flag\n"
+msgstr "sekcja [%2d] '%s': wpis %d ma nieznaną flagę\n"
+
+#: src/elflint.c:3053
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid name reference\n"
+msgstr "sekcja [%2d] '%s': wpis %d ma błędne odniesienie do nazwy\n"
+
+#: src/elflint.c:3060
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
+msgstr "sekcja [%2d] '%s': wpis %d ma złą wartość hasza: %#x, oczekiwano %#x\n"
+
+#: src/elflint.c:3069
+#, c-format
+msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
+msgstr "sekcja [%2d] '%s': wpis %d ma powtórzoną nazwę wersji '%s'\n"
+
+#: src/elflint.c:3088
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
+msgstr ""
+"sekcja [%2d] '%s': wpis %d ma błędne odniesienie do nazwy w danych "
+"dodatkowych\n"
+
+#: src/elflint.c:3103
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
+msgstr "sekcja [%2d] '%s': wpis %d ma złe następne pole w danych dodatkowych\n"
+
+#: src/elflint.c:3125
+#, c-format
+msgid "section [%2d] '%s': no BASE definition\n"
+msgstr "sekcja [%2d] '%s': brak definicji BASE\n"
+
+#: src/elflint.c:3141
+#, c-format
+msgid "section [%2d] '%s': unknown parent version '%s'\n"
+msgstr "sekcja [%2d] '%s': nieznana wersja rodzica '%s'\n"
+
+#: src/elflint.c:3154
+#, fuzzy, c-format
+msgid "section [%2d] '%s': empty object attributes section\n"
+msgstr "sekcja [%2d] '%s': nie można pobrać danych sekcji\n"
+
+#: src/elflint.c:3175
+#, fuzzy, c-format
+msgid "section [%2d] '%s': unrecognized attribute format\n"
+msgstr "sekcja [%2d] '%s': zawiera wpis %s, ale nie %s\n"
+
+#: src/elflint.c:3191
+#, fuzzy, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: zero length field in attribute section\n"
+msgstr "sekcja [%2d] '%s': wpis %d ma złe następne pole w danych dodatkowych\n"
+
+#: src/elflint.c:3200
+#, fuzzy, c-format
+msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
+msgstr "sekcja [%2d] '%s': błędny typ sekcji docelowej\n"
+
+#: src/elflint.c:3212
+#, fuzzy, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
+msgstr "sekcja [%2d] '%s': wpis %zu: nieznany znacznik\n"
+
+#: src/elflint.c:3229
+#, fuzzy, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
+msgstr "sekcja [%2d] '%s': symbol %zu: błędny indeks sekcji\n"
+
+#: src/elflint.c:3238
+#, fuzzy, c-format
+msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
+msgstr "sekcja [%2d] '%s': symbol %zu: błędny indeks sekcji\n"
+
+#: src/elflint.c:3247
+#, fuzzy, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
+msgstr "sekcja [%2d] '%s': wpis %zu: użyto znacznika %s poziomu 2\n"
+
+#: src/elflint.c:3260
+#, fuzzy, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
+msgstr "sekcja [%2d] '%s': błędny typ sekcji docelowej\n"
+
+#: src/elflint.c:3271
+#, fuzzy, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
+msgstr "sekcja [%2d] '%s': wpis %zu: więcej niż jeden wpis ze znacznikiem %s\n"
+
+#: src/elflint.c:3289
+#, fuzzy, c-format
+msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
+msgstr "sekcja [%2d] '%s': wpis %zu: więcej niż jeden wpis ze znacznikiem %s\n"
+
+#: src/elflint.c:3300
+#, fuzzy, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
+msgstr "sekcja [%2d] '%s': symbol %zu: błędny indeks sekcji\n"
+
+#: src/elflint.c:3313
+#, fuzzy, c-format
+msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
+msgstr "sekcja [%2d] '%s': wpis %zu: więcej niż jeden wpis ze znacznikiem %s\n"
+
+#: src/elflint.c:3317
+#, fuzzy, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
+msgstr "sekcja [%2d] '%s': symbol %zu: błędna wartość nazwy\n"
+
+#: src/elflint.c:3327
+#, fuzzy, c-format
+msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
+msgstr "sekcja [%2d] '%s': wpis %zu: nieznany znacznik\n"
+
+#: src/elflint.c:3333
+#, fuzzy, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
+msgstr "sekcja [%2d] '%s': wpis %zu: więcej niż jeden wpis ze znacznikiem %s\n"
+
+#: src/elflint.c:3422
+#, c-format
+msgid "cannot get section header of zeroth section\n"
+msgstr "nie można pobrać nagłówka sekcji zerowej\n"
+
+#: src/elflint.c:3426
+#, c-format
+msgid "zeroth section has nonzero name\n"
+msgstr "sekcja zerowa ma niezerową nazwę\n"
+
+#: src/elflint.c:3428
+#, c-format
+msgid "zeroth section has nonzero type\n"
+msgstr "sekcja zerowa ma niezerowy typ\n"
+
+#: src/elflint.c:3430
+#, c-format
+msgid "zeroth section has nonzero flags\n"
+msgstr "sekcja zerowa ma niezerowe flagi\n"
+
+#: src/elflint.c:3432
+#, c-format
+msgid "zeroth section has nonzero address\n"
+msgstr "sekcja zerowa ma niezerowy adres\n"
+
+#: src/elflint.c:3434
+#, c-format
+msgid "zeroth section has nonzero offset\n"
+msgstr "sekcja zerowa ma niezerowy offset\n"
+
+#: src/elflint.c:3436
+#, c-format
+msgid "zeroth section has nonzero align value\n"
+msgstr "sekcja zerowa ma niezerową wartość wyrównania\n"
+
+#: src/elflint.c:3438
+#, c-format
+msgid "zeroth section has nonzero entry size value\n"
+msgstr "sekcja zerowa ma niezerową wartość rozmiaru wpisu\n"
+
+#: src/elflint.c:3441
+#, c-format
+msgid ""
+"zeroth section has nonzero size value while ELF header has nonzero shnum "
+"value\n"
+msgstr ""
+"sekcja zerowa ma niezerową wartość rozmiaru, a nagłówek ELF ma niezerową "
+"wartość shnum\n"
+
+#: src/elflint.c:3445
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in shstrndx\n"
+msgstr ""
+"sekcja zerowa ma niezerową wartość dowiązań, a nagłówek ELF nie sygnalizuje "
+"przepełnienia w shstrndx\n"
+
+#: src/elflint.c:3449
+#, fuzzy, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in phnum\n"
+msgstr ""
+"sekcja zerowa ma niezerową wartość dowiązań, a nagłówek ELF nie sygnalizuje "
+"przepełnienia w shstrndx\n"
+
+#: src/elflint.c:3466
+#, c-format
+msgid "cannot get section header for section [%2zu] '%s': %s\n"
+msgstr "nie można pobrać nagłówka sekcji dla sekcji [%2zu] '%s': %s\n"
+
+#: src/elflint.c:3475
+#, c-format
+msgid "section [%2zu]: invalid name\n"
+msgstr "sekcja [%2zu]: błędna nazwa\n"
+
+#: src/elflint.c:3502
+#, c-format
+msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
+msgstr "sekcja [%2d] '%s' ma zły typ: oczekiwano %s, jest %s\n"
+
+#: src/elflint.c:3518
+#, c-format
+msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
+msgstr "sekcja [%2zu] '%s' ma złe flagi: oczekiwano %s, jest %s\n"
+
+#: src/elflint.c:3535
+#, c-format
+msgid ""
+"section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
+msgstr ""
+"sekcja [%2zu] '%s' ma złe flagi: oczekiwano %s i być może %s, jest %s\n"
+
+#: src/elflint.c:3553
+#, c-format
+msgid "section [%2zu] '%s' present in object file\n"
+msgstr "sekcja [%2zu] '%s' obecna w pliku obiektu\n"
+
+#: src/elflint.c:3559 src/elflint.c:3591
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
+msgstr ""
+"sekcja [%2zu] '%s' ma flagę SHF_ALLOC, ale nie ma segmentu ładowalnego\n"
+
+#: src/elflint.c:3564 src/elflint.c:3596
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
+"segments\n"
+msgstr "sekcja [%2zu] '%s' nie ma flagi SHF_ALLOC, ale są segmenty ładowalne\n"
+
+#: src/elflint.c:3572
+#, c-format
+msgid ""
+"section [%2zu] '%s' is extension section index table in non-object file\n"
+msgstr ""
+"sekcja [%2zu] '%s' jest tabelą indeksów sekcji rozszerzeń w pliku nie-"
+"obiektowym\n"
+
+#: src/elflint.c:3615
+#, 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:3620
+#, c-format
+msgid "cannot get section header\n"
+msgstr "nie można pobrać nagłówka sekcji\n"
+
+#: src/elflint.c:3630
+#, c-format
+msgid "section [%2zu] '%s' has unsupported type %d\n"
+msgstr "sekcja [%2zu] '%s' ma nieobsługiwany typ %d\n"
+
+#: src/elflint.c:3644
+#, c-format
+msgid ""
+"section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
+msgstr ""
+"sekcja [%2zu] '%s' zawiera błędne flagi specyficzne dla procesora %"
+"#<PRIx64>\n"
+
+#: src/elflint.c:3651
+#, c-format
+msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
+msgstr "sekcja [%2zu] '%s' zawiera nieznane flagi %#<PRIx64>\n"
+
+#: src/elflint.c:3659
+#, 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:3667
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in link value\n"
+msgstr "sekcja [%2zu] '%s': błędne odwołanie do sekcji w wartości dowiązania\n"
+
+#: src/elflint.c:3672
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in info value\n"
+msgstr ""
+"sekcja [%2zu] '%s': błędne odwołanie do sekcji w wartości informacyjnej\n"
+
+#: src/elflint.c:3679
+#, c-format
+msgid "section [%2zu] '%s': strings flag set without merge flag\n"
+msgstr "sekcja [%2zu] '%s': flaga łańcuchów ustawiona bez flagi merge\n"
+
+#: src/elflint.c:3684
+#, c-format
+msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
+msgstr ""
+"sekcja [%2zu] '%s': flaga merge ustawiona, ale rozmiar wpisu jest zerowy\n"
+
+#: src/elflint.c:3702
+#, fuzzy, c-format
+msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
+msgstr "sekcja [%2zu] '%s' ma nieobsługiwany typ %d\n"
+
+#: src/elflint.c:3711
+#, fuzzy, c-format
+msgid "section [%2zu] '%s' is both executable and writable\n"
+msgstr "sekcja [%2zu] '%s': rozmiar nie jest wielokrotnością rozmiaru wpisu\n"
+
+#: src/elflint.c:3738
+#, c-format
+msgid ""
+"section [%2zu] '%s' not fully contained in segment of program header entry %"
+"d\n"
+msgstr ""
+"sekcja [%2zu] '%s' nie jest w całości zawarta w segmencie wpisu %d nagłówka "
+"programu\n"
+
+#: src/elflint.c:3746
+#, c-format
+msgid ""
+"section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
+"program header entry %d\n"
+msgstr ""
+"sekcja [%2zu] '%s' ma typ NOBITS, a jest czytana z pliku w segmencie wpisu %"
+"d nagłówka programu\n"
+
+#: src/elflint.c:3755
+#, 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 ""
+"sekcja [%2zu] '%s' nie ma typu NOBITS, a nie jest czytana z pliku w "
+"segmencie wpisu %d nagłówka programu\n"
+
+#: src/elflint.c:3766
+#, fuzzy, c-format
+msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
+msgstr ""
+"sekcja [%2zu] '%s' jest tabelą indeksów sekcji rozszerzeń w pliku nie-"
+"obiektowym\n"
+
+#: src/elflint.c:3776
+#, fuzzy, c-format
+msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
+msgstr "sekcja [%2zu] '%s': rozmiar nie jest wielokrotnością rozmiaru wpisu\n"
+
+#: src/elflint.c:3786
+#, c-format
+msgid ""
+"section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
+msgstr ""
+"sekcja [%2zu] '%s': ma flagę alloc, ale sekcja nie jest w żadnym segmencie "
+"ładowalnym\n"
+
+#: src/elflint.c:3792
+#, c-format
+msgid ""
+"section [%2zu] '%s': ELF header says this is the section header string table "
+"but type is not SHT_TYPE\n"
+msgstr ""
+"sekcja [%2zu] '%s': według nagłówka ELF to jest tabela łańcuchów nagłówków "
+"sekcji, ale typ nie jest SHT_TYPE\n"
+
+#: src/elflint.c:3800
+#, c-format
+msgid ""
+"section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
+msgstr ""
+"sekcja [%2zu] '%s': pliki relokowalne nie mogą mieć tabeli symboli "
+"dynamicznych\n"
+
+#: src/elflint.c:3851
+#, c-format
+msgid "more than one version symbol table present\n"
+msgstr "obecna więcej niż jedna tabela symboli wersji\n"
+
+#: src/elflint.c:3874
+#, c-format
+msgid "INTERP program header entry but no .interp section\n"
+msgstr "jest wpis nagłówka programu INTERP, ale nie ma sekcji .interp\n"
+
+#: src/elflint.c:3885
+#, fuzzy, c-format
+msgid ""
+"loadable segment [%u] is executable but contains no executable sections\n"
+msgstr "ładowalny segment wskazywany przez GNU_RELRO jest wykonywalny\n"
+
+#: src/elflint.c:3891
+#, fuzzy, c-format
+msgid "loadable segment [%u] is writable but contains no writable sections\n"
+msgstr "ładowalny segment wskazywany przez GNU_RELRO nie jest zapisywalny\n"
+
+#: src/elflint.c:3902
+#, c-format
+msgid ""
+"no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
+"exist\n"
+msgstr ""
+"brak sekcji .gnu.versym, ale istnieje sekcja .gnu.versym_d lub .gnu."
+"versym_r\n"
+
+#: src/elflint.c:3915
+#, c-format
+msgid "duplicate version index %d\n"
+msgstr "powtórzony indeks wersji %d\n"
+
+#: src/elflint.c:3929
+#, 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:3978
+#, fuzzy, c-format
+msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
+msgstr ""
+"phdr[%d]: nieznany typ notatki pliku core %<PRIu64> pod offsetem %<PRIu64>\n"
+
+#: src/elflint.c:3982
+#, fuzzy, c-format
+msgid ""
+"section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+"phdr[%d]: nieznany typ notatki pliku core %<PRIu64> pod offsetem %<PRIu64>\n"
+
+#: src/elflint.c:4005
+#, fuzzy, c-format
+msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+"phdr[%d]: nieznany typ notatki pliku obiektu %<PRIu64> pod offsetem %"
+"<PRIu64>\n"
+
+#: src/elflint.c:4009
+#, fuzzy, c-format
+msgid ""
+"section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+"phdr[%d]: nieznany typ notatki pliku obiektu %<PRIu64> pod offsetem %"
+"<PRIu64>\n"
+
+#: src/elflint.c:4026
+#, c-format
+msgid "phdr[%d]: no note entries defined for the type of file\n"
+msgstr "phdr[%d]: brak zdefiniowanych wpisów note dla typu pliku\n"
+
+#: src/elflint.c:4045
+#, fuzzy, c-format
+msgid "phdr[%d]: cannot get content of note section: %s\n"
+msgstr "nie można pobrać zawartości sekcji notatki: %s"
+
+#: src/elflint.c:4048
+#, fuzzy, c-format
+msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
+msgstr "phdr[%d]: nadmiarowe %zu bajtów po ostatniej notatce\n"
+
+#: src/elflint.c:4069
+#, fuzzy, c-format
+msgid "section [%2d] '%s': no note entries defined for the type of file\n"
+msgstr "phdr[%d]: brak zdefiniowanych wpisów note dla typu pliku\n"
+
+#: src/elflint.c:4076
+#, fuzzy, c-format
+msgid "section [%2d] '%s': cannot get content of note section\n"
+msgstr "sekcja [%2d] '%s': nie można pobrać danych sekcji\n"
+
+#: src/elflint.c:4079
+#, fuzzy, c-format
+msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
+msgstr "phdr[%d]: nadmiarowe %zu bajtów po ostatniej notatce\n"
+
+#: src/elflint.c:4097
+#, c-format
+msgid ""
+"only executables, shared objects, and core files can have program headers\n"
+msgstr ""
+"tylko pliki wykonywalne, obiektów dzielonych i core mogą mieć nagłówki "
+"programu\n"
+
+#: src/elflint.c:4112
+#, c-format
+msgid "cannot get program header entry %d: %s\n"
+msgstr "nie można pobrać wpisu nagłówka programu %d: %s\n"
+
+#: src/elflint.c:4121
+#, 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:4132
+#, 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:4140
+#, 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:4147
+#, c-format
+msgid "static executable cannot have dynamic sections\n"
+msgstr "statyczny program wykonywalny nie może mieć sekcji dynamicznych\n"
+
+#: src/elflint.c:4161
+#, c-format
+msgid "dynamic section reference in program header has wrong offset\n"
+msgstr "odniesienie sekcji dynamicznej w nagłówku programu ma zły offset\n"
+
+#: src/elflint.c:4164
+#, 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:4174
+#, 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:4195
+#, c-format
+msgid "loadable segment GNU_RELRO applies to is not writable\n"
+msgstr "ładowalny segment wskazywany przez GNU_RELRO nie jest zapisywalny\n"
+
+#: src/elflint.c:4198
+#, c-format
+msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
+msgstr ""
+
+#: src/elflint.c:4206 src/elflint.c:4229
+#, c-format
+msgid "%s segment not contained in a loaded segment\n"
+msgstr "segment %s nie zawiera się w ładowanym segmencie\n"
+
+#: src/elflint.c:4235
+#, 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:4259
+#, fuzzy, c-format
+msgid "call frame search table reference in program header has wrong offset\n"
+msgstr "odniesienie sekcji dynamicznej w nagłówku programu ma zły offset\n"
+
+#: src/elflint.c:4262
+#, fuzzy, c-format
+msgid "call frame search table size mismatch in program and section header\n"
+msgstr "różne rozmiary sekcji dynamicznej w nagłówku programu i sekcji\n"
+
+#: src/elflint.c:4275
+#, fuzzy, c-format
+msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
+msgstr "Tworzenie sekcji .eh_frame_hdr"
+
+#: src/elflint.c:4283
+#, c-format
+msgid "call frame search table must be allocated\n"
+msgstr ""
+
+#: src/elflint.c:4286
+#, fuzzy, c-format
+msgid "section [%2zu] '%s' must be allocated\n"
+msgstr "sekcja [%2d] '%s': nie oznaczona do przydzielenia\n"
+
+#: src/elflint.c:4290
+#, c-format
+msgid "call frame search table must not be writable\n"
+msgstr ""
+
+#: src/elflint.c:4293
+#, fuzzy, c-format
+msgid "section [%2zu] '%s' must not be writable\n"
+msgstr "sekcja [%2zu] '%s' obecna w pliku obiektu\n"
+
+#: src/elflint.c:4298
+#, c-format
+msgid "call frame search table must not be executable\n"
+msgstr ""
+
+#: src/elflint.c:4301
+#, fuzzy, c-format
+msgid "section [%2zu] '%s' must not be executable\n"
+msgstr "sekcja [%2zu] '%s' obecna w pliku obiektu\n"
+
+#: src/elflint.c:4312
+#, 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:4319
+#, 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:4322
+#, c-format
+msgid ""
+"program header entry %d: file offset and virtual address not module of "
+"alignment\n"
+msgstr ""
+"wpis nagłówka programu %d: offset w pliku i adres wirtualny nie są "
+"wielokrotnością wyrównania\n"
+
+#: src/elflint.c:4335
+#, 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:4369
+#, c-format
+msgid "cannot read ELF header: %s\n"
+msgstr "nie można odczytać nagłówka ELF: %s\n"
+
+#: src/elflint.c:4395
+#, c-format
+msgid "text relocation flag set but not needed\n"
+msgstr "flagi relokacji tekstu ustawione, ale niepotrzebne\n"
+
+#: src/findtextrel.c:70
+msgid "Input Selection:"
+msgstr "Wybór wejścia:"
+
+#: src/findtextrel.c:71
+msgid "Prepend PATH to all file names"
+msgstr "Dołączenie ŚCIEŻKI do wszystkich nazw plików"
+
+#: src/findtextrel.c:73
+msgid "Use PATH as root of debuginfo hierarchy"
+msgstr "Użycie ŚCIEŻKI jako korzenia dla hierarchii debuginfo"
+
+#: src/findtextrel.c:80
+msgid "Locate source of text relocations in FILEs (a.out by default)."
+msgstr "Odnajdywanie źródeł relokacji tekstu w PLIKACH (domyślnie a.out)."
+
+#: src/findtextrel.c:84 src/nm.c:111 src/objdump.c:80 src/size.c:92
+#: src/strings.c:92 src/strip.c:97
+msgid "[FILE...]"
+msgstr "[PLIK...]"
+
+#: src/findtextrel.c:246
+#, c-format
+msgid "cannot get ELF header '%s': %s"
+msgstr "nie można pobrać nagłówka ELF '%s': %s"
+
+#: src/findtextrel.c:257
+#, c-format
+msgid "'%s' is not a DSO or PIE"
+msgstr "'%s' nie jest DSO ani PIE"
+
+#: src/findtextrel.c:274
+#, c-format
+msgid "getting get section header of section %zu: %s"
+msgstr "podczas pobierania nagłówka sekcji dla sekcji %zu: %s"
+
+#: src/findtextrel.c:292
+#, c-format
+msgid "cannot read dynamic section: %s"
+msgstr "nie można odczytać sekcji dynamicznej: %s"
+
+#: src/findtextrel.c:307
+#, c-format
+msgid "no text relocations reported in '%s'"
+msgstr "brak relokacji tekstu w '%s'"
+
+#: src/findtextrel.c:319
+#, c-format
+msgid "while reading ELF file"
+msgstr "podczas odczytu pliku ELF"
+
+#: src/findtextrel.c:328 src/findtextrel.c:345
+#, c-format
+msgid "cannot get program header index at offset %d: %s"
+msgstr "nie można pobrać indeksu nagłówka programu pod offsetem %d: %s"
+
+#: src/findtextrel.c:397
+#, c-format
+msgid "cannot get section header of section %Zu: %s"
+msgstr "nie można pobrać nagłówka sekcji dla sekcji %Zu: %s"
+
+#: src/findtextrel.c:409
+#, c-format
+msgid "cannot get symbol table section %zu in '%s': %s"
+msgstr "nie można pobrać sekcji tabeli symboli %zu w '%s': %s"
+
+#: src/findtextrel.c:429 src/findtextrel.c:452
+#, c-format
+msgid "cannot get relocation at index %d in section %zu in '%s': %s"
+msgstr "nie można pobrać relokacji pod indeksem %d w sekcji %zu w '%s': %s"
+
+#: src/findtextrel.c:517
+#, c-format
+msgid "%s not compiled with -fpic/-fPIC\n"
+msgstr "%s nie został skompilowany z -fpic/-fPIC\n"
+
+#: src/findtextrel.c:570
+#, c-format
+msgid ""
+"the file containing the function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr "plik zawierający funkcję '%s' nie został skompilowany z -fpic/-fPIC\n"
+
+#: src/findtextrel.c:577 src/findtextrel.c:597
+#, c-format
+msgid ""
+"the file containing the function '%s' might not be compiled with -fpic/-"
+"fPIC\n"
+msgstr ""
+"plik zawierający funkcję '%s' mógł nie zostać skompilowany z -fpic/-fPIC\n"
+
+#: src/findtextrel.c:585
+#, c-format
+msgid ""
+"either the file containing the function '%s' or the file containing the "
+"function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr ""
+"plik zawierający funkcję '%s' lub plik zawierający funkcję '%s' nie został "
+"skompilowany z -fpic/-fPIC\n"
+
+#: src/findtextrel.c:605
+#, c-format
+msgid ""
+"a relocation modifies memory at offset %llu in a write-protected segment\n"
+msgstr ""
+"relokacja modyfikuje pamięć pod offsetem %llu w segmencie zabezpieczonym "
+"przed zapisem\n"
+
+#: src/i386_ld.c:210
+#, fuzzy, c-format
+msgid "cannot allocate PLT section: %s"
+msgstr "nie można przydzielić danych sekcji: %s"
+
+#: src/i386_ld.c:232
+#, fuzzy, c-format
+msgid "cannot allocate PLTREL section: %s"
+msgstr "nie można przydzielić danych sekcji: %s"
+
+#: src/i386_ld.c:253
+#, fuzzy, c-format
+msgid "cannot allocate GOT section: %s"
+msgstr "nie można przydzielić danych sekcji: %s"
+
+#: src/i386_ld.c:274
+#, fuzzy, c-format
+msgid "cannot allocate GOTPLT section: %s"
+msgstr "nie można przydzielić danych sekcji: %s"
+
+#: src/i386_ld.c:661
+#, c-format
+msgid "initial-executable TLS relocation cannot be used "
+msgstr ""
+
+#: src/ld.c:87
+msgid "Input File Control:"
+msgstr "Sterowanie plikiem wejściowym:"
+
+#: src/ld.c:89
+msgid "Include whole archives in the output from now on."
+msgstr "Dołączanie całych archiwów na wyjściu od teraz."
+
+#: src/ld.c:91
+#, fuzzy
+msgid "Stop including the whole archives in the output."
+msgstr "Koniec dołączania całych archiwów na wyjściu."
+
+#: src/ld.c:92 src/ld.c:106 src/ld.c:184
+msgid "FILE"
+msgstr "PLIK"
+
+#: src/ld.c:93
+msgid "Start a group."
+msgstr "Rozpoczęcie grupy."
+
+#: src/ld.c:94
+msgid "End a group."
+msgstr "Zakończenie grupy."
+
+#: src/ld.c:95
+msgid "PATH"
+msgstr "ŚCIEŻKA"
+
+#: src/ld.c:96
+msgid "Add PATH to list of directories files are searched in."
+msgstr "Dodanie ŚCIEŻKI do listy katalogów, w których są szukane pliki."
+
+#: src/ld.c:98
+msgid "Only set DT_NEEDED for following dynamic libs if actually used"
+msgstr ""
+"Ustawianie DT_NEEDED dla następujących bibliotek dynamicznych tylko jeśli są "
+"używane"
+
+#: src/ld.c:100
+msgid "Always set DT_NEEDED for following dynamic libs"
+msgstr "Ustawianie zawsze DT_NEEDED dla następujących bibliotek dynamicznych"
+
+#: src/ld.c:102
+msgid "Ignore LD_LIBRARY_PATH environment variable."
+msgstr "Zignorowanie zmiennej środowiskowej LD_LIBRARY_PATH."
+
+#: src/ld.c:105
+msgid "Output File Control:"
+msgstr "Sterowanie plikiem wyjściowym:"
+
+#: src/ld.c:106
+msgid "Place output in FILE."
+msgstr "Umieszczenie wyjścia w PLIKU."
+
+#: src/ld.c:109
+msgid "Object is marked to not use default search path at runtime."
+msgstr "Oznaczenie obiektu, aby nie używał domyślnej ścieżki przeszukiwań."
+
+#: src/ld.c:111
+msgid "Same as --whole-archive."
+msgstr "To samo co --whole-archive."
+
+#: src/ld.c:112
+msgid ""
+"Default rules of extracting from archive; weak references are not enough."
+msgstr ""
+"Domyślne reguły wyciągania z archiwum; słabe odwołania nie wystarczają."
+
+#: src/ld.c:116
+msgid "Weak references cause extraction from archive."
+msgstr "Słabe odwołania powodują wyciągnięcie z archiwum."
+
+#: src/ld.c:118
+msgid "Allow multiple definitions; first is used."
+msgstr "Zezwolenie na wielokrotne definicje; używana jest pierwsza."
+
+#: src/ld.c:120
+msgid "Disallow/allow undefined symbols in DSOs."
+msgstr "Nie zezwalanie/zezwalanie na niezdefiniowane symbole w DSO."
+
+#: src/ld.c:123
+msgid "Object requires immediate handling of $ORIGIN."
+msgstr "Obiekt wymaga bezpośredniego obsłużenia $ORIGIN."
+
+#: src/ld.c:125
+msgid "Relocation will not be processed lazily."
+msgstr "Relokacje nie będą przeprowadzane leniwie."
+
+#: src/ld.c:127
+msgid "Object cannot be unloaded at runtime."
+msgstr "Obiekt nie może być odładowany w czasie działania."
+
+#: src/ld.c:129
+msgid "Mark object to be initialized first."
+msgstr "Oznaczenie obiektu, aby był inicjowany pierwszy."
+
+#: src/ld.c:131
+msgid "Enable/disable lazy-loading flag for following dependencies."
+msgstr ""
+"Włączenie/wyłączenie flagi leniwego ładowania dla następnych zależności."
+
+#: src/ld.c:133
+msgid "Mark object as not loadable with 'dlopen'."
+msgstr "Oznaczenie obiektu jako nie ładowalnego przez 'dlopen'."
+
+#: src/ld.c:135
+msgid "Ignore/record dependencies on unused DSOs."
+msgstr "Zignorowanie/zapisanie zależności od nieużywanych DSO."
+
+#: src/ld.c:137
+msgid "Generated DSO will be a system library."
+msgstr "Generowany DSO będzie biblioteką systemową."
+
+#: src/ld.c:138
+msgid "ADDRESS"
+msgstr "ADRES"
+
+#: src/ld.c:138
+msgid "Set entry point address."
+msgstr "Ustawienie adresu punktu wejściowego."
+
+#: src/ld.c:141
+msgid "Do not link against shared libraries."
+msgstr "Nie linkowanie z bibliotekami dzielonymi."
+
+#: src/ld.c:144
+msgid "Prefer linking against shared libraries."
+msgstr "Preferowanie linkowania z bibliotekami dzielonymi."
+
+#: src/ld.c:145
+msgid "Export all dynamic symbols."
+msgstr "Eksportowanie wszystkich symboli dynamicznych."
+
+#: src/ld.c:146
+msgid "Strip all symbols."
+msgstr "Okrojenie wszystkich symboli."
+
+#: src/ld.c:147
+msgid "Strip debugging symbols."
+msgstr "Okrojenie symboli debugowych."
+
+#: src/ld.c:149
+msgid "Assume pagesize for the target system to be SIZE."
+msgstr "Przyjęcie dla systemu docelowego rozmiaru strony ROZMIAR."
+
+#: src/ld.c:151
+msgid "Set runtime DSO search path."
+msgstr "Ustawienie ścieżki poszukiwania DSO w czasie działania."
+
+#: src/ld.c:154
+msgid "Set link time DSO search path."
+msgstr "Ustawienie ścieżki poszukiwania DSO w czasie linkowania."
+
+#: src/ld.c:155
+msgid "Generate dynamic shared object."
+msgstr "Generowanie dynamicznego obiektu dzielonego (DSO)."
+
+#: src/ld.c:156
+msgid "Generate relocatable object."
+msgstr "Generowanie obiektu relokowalnego."
+
+#: src/ld.c:159
+msgid "Causes symbol not assigned to a version be reduced to local."
+msgstr "Ograniczenie zasięgu symboli nie przypisanych do wersji do lokalnego."
+
+#: src/ld.c:160
+msgid "Remove unused sections."
+msgstr "Usunięcie nieużywanych sekcji."
+
+#: src/ld.c:163
+msgid "Don't remove unused sections."
+msgstr "Nie usuwanie nieużywanych sekcji."
+
+#: src/ld.c:164
+msgid "Set soname of shared object."
+msgstr "Ustawienie soname obiektu dzielonego."
+
+#: src/ld.c:165
+msgid "Set the dynamic linker name."
+msgstr "Ustawienie nazwy dynamicznego linkera."
+
+#: src/ld.c:168
+#, fuzzy
+msgid "Add/suppress addition indentifying link-editor to .comment section."
+msgstr ""
+"Dodanie/pominięcie dodawania identyfikacji edytora linkowania do sekcji ."
+"comment"
+
+#: src/ld.c:171
+msgid "Create .eh_frame_hdr section"
+msgstr "Tworzenie sekcji .eh_frame_hdr"
+
+#: src/ld.c:173
+msgid "Set hash style to sysv, gnu or both."
+msgstr ""
+
+#: src/ld.c:175
+msgid "Generate build ID note (md5, sha1 (default), uuid)."
+msgstr ""
+
+#: src/ld.c:177
+msgid "Linker Operation Control:"
+msgstr "Sterowanie operacjami linkera:"
+
+#: src/ld.c:178
+msgid "Verbose messages."
+msgstr "Szczegółowe komunikaty."
+
+#: src/ld.c:179
+msgid "Trace file opens."
+msgstr "Śledzenie otwierania plików."
+
+#: src/ld.c:181
+msgid "Trade speed for less memory usage"
+msgstr "Poświęcenie szybkości dla mniejszego zużycia pamięci"
+
+#: src/ld.c:182
+msgid "LEVEL"
+msgstr "POZIOM"
+
+#: src/ld.c:183
+msgid "Set optimization level to LEVEL."
+msgstr "Ustawienie poziomu optymalizacji na POZIOM."
+
+#: src/ld.c:184
+msgid "Use linker script in FILE."
+msgstr "Użycie skryptu linkera z PLIKU."
+
+#: src/ld.c:187
+msgid "Select to get parser debug information"
+msgstr "Wybranie pobrania informacji debugowych parsera"
+
+#: src/ld.c:190
+msgid "Read version information from FILE."
+msgstr "Odczytanie informacji o wersji z PLIKU."
+
+#: src/ld.c:191
+msgid "Set emulation to NAME."
+msgstr "Ustawienie emulacji na NAZWĘ"
+
+#: src/ld.c:197
+msgid "Combine object and archive files."
+msgstr "Łączenie plików obiektów i archiwów."
+
+#: src/ld.c:200
+msgid "[FILE]..."
+msgstr "[PLIK]..."
+
+#: src/ld.c:333
+#, c-format
+msgid "At least one input file needed"
+msgstr "Potrzebny jest przynajmniej jeden plik wejściowy"
+
+#: src/ld.c:349
+#, c-format
+msgid "error while preparing linking"
+msgstr "błąd podczas przygotowywania linkowania"
+
+#: src/ld.c:356
+#, c-format
+msgid "cannot open linker script '%s'"
+msgstr "nie można otworzyć skryptu linkera '%s'"
+
+#: src/ld.c:397
+#, c-format
+msgid "-( without matching -)"
+msgstr "-( bez pasującego -)"
+
+#: src/ld.c:572 src/ld.c:610
+#, c-format
+msgid "only one option of -G and -r is allowed"
+msgstr "dopuszczalna jest tylko jedna z opcji -G i -r"
+
+#: src/ld.c:594
+#, c-format
+msgid "more than one '-m' parameter"
+msgstr "podano więcej niż jeden parametr '-m'"
+
+#: src/ld.c:604 src/ld.c:1013
+#, c-format
+msgid "unknown option `-%c %s'"
+msgstr "nieznana opcja `-%c %s'"
+
+#: src/ld.c:646
+#, c-format
+msgid "invalid page size value '%s': ignored"
+msgstr "błędna wartość rozmiaru strony '%s': zignorowano"
+
+#: src/ld.c:687
+#, fuzzy, c-format
+msgid "invalid hash style '%s'"
+msgstr "błędne flagi maszyny: %s\n"
+
+#: src/ld.c:697
+#, c-format
+msgid "invalid build-ID style '%s'"
+msgstr ""
+
+#: src/ld.c:785
+#, c-format
+msgid "More than one output file name given."
+msgstr "Podano więcej niż jeden plik wyjściowy."
+
+#: src/ld.c:802
+#, c-format
+msgid "Invalid optimization level `%s'"
+msgstr "Błędny poziom optymalizacji `%s'"
+
+#: src/ld.c:850
+#, c-format
+msgid "nested -( -) groups are not allowed"
+msgstr "zagnieżdżone grupy -( -) nie są dozwolone"
+
+#: src/ld.c:869
+#, c-format
+msgid "-) without matching -("
+msgstr "-) bez pasującego -("
+
+#: src/ld.c:1046
+#, c-format
+msgid "unknown option '-%c %s'"
+msgstr "nieznana opcja '-%c %s'"
+
+#: src/ld.c:1150
+#, c-format
+msgid "could not find input file to determine output file format"
+msgstr ""
+"nie można znaleźć pliku wejściowego, aby określić format pliku wyjściowego"
+
+#: src/ld.c:1152
+#, c-format
+msgid "try again with an appropriate '-m' parameter"
+msgstr "proszę spróbować jeszcze raz z odpowiednim parametrem '-m'"
+
+#: src/ld.c:1446
+#, c-format
+msgid "cannot read version script '%s'"
+msgstr "nie można odczytać skryptu wersji '%s'"
+
+#: src/ld.c:1512 src/ld.c:1551
+#, c-format
+msgid "duplicate definition of '%s' in linker script"
+msgstr "powtórzona definicja '%s' w skrypcie linkera"
+
+#: src/ldgeneric.c:209 src/ldgeneric.c:5151
+#, c-format
+msgid "cannot create string table"
+msgstr "nie można utworzyć tabeli łańcuchów"
+
+#: src/ldgeneric.c:255
+#, c-format
+msgid "cannot load ld backend library '%s': %s"
+msgstr "nie można odczytać biblioteki backendu ld '%s': %s"
+
+#: src/ldgeneric.c:265
+#, c-format
+msgid "cannot find init function in ld backend library '%s': %s"
+msgstr "nie można znaleźć funkcji init w bibliotece backendu ld '%s': %s"
+
+#: src/ldgeneric.c:310
+#, c-format
+msgid "%s listed more than once as input"
+msgstr "%s podano więcej niż raz na wejściu"
+
+#: src/ldgeneric.c:424
+#, c-format
+msgid "%s (for -l%s)\n"
+msgstr "%s (dla -l%s)\n"
+
+#: src/ldgeneric.c:425
+#, c-format
+msgid "%s (for DT_NEEDED %s)\n"
+msgstr "%s (dla DT_NEEDED %s)\n"
+
+#: src/ldgeneric.c:573
+#, c-format
+msgid "Warning: type of `%s' changed from %s in %s to %s in %s"
+msgstr "Uwaga: typ `%s' zmienił się z %s w %s na %s w %s"
+
+#: src/ldgeneric.c:586
+#, c-format
+msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
+msgstr "Uwaga: rozmiar `%s' zmienił się z %<PRIu64> w %s na %<PRIu64> w %s"
+
+#: src/ldgeneric.c:661 src/ldgeneric.c:1122 src/readelf.c:629 src/strip.c:543
+#, c-format
+msgid "cannot determine number of sections: %s"
+msgstr "nie można określić liczby sekcji: %s"
+
+#: src/ldgeneric.c:677
+#, c-format
+msgid "(%s+%#<PRIx64>): multiple definition of %s `%s'\n"
+msgstr "(%s+%#<PRIx64>): wielokrotna definicja %s `%s'\n"
+
+#: src/ldgeneric.c:700
+#, c-format
+msgid "(%s+%#<PRIx64>): first defined here\n"
+msgstr "(%s+%#<PRIx64>): pierwszy raz zdefiniowano tutaj\n"
+
+#: src/ldgeneric.c:819
+#, c-format
+msgid "%s: cannot get section group data: %s"
+msgstr "%s: nie można pobrać danych grupy sekcji: %s"
+
+#: src/ldgeneric.c:840
+#, c-format
+msgid "%s: section '%s' with group flag set does not belong to any group"
+msgstr "%s: sekcja '%s' z ustawioną flagą grupy nie należy do żadnej grupy"
+
+#: src/ldgeneric.c:885
+#, fuzzy, c-format
+msgid "%s: section [%2d] '%s' is not in the correct section group"
+msgstr "%s: sekcja [%2d] '%s' jest w więcej niż jednej grupie sekcji"
+
+#: src/ldgeneric.c:1156 src/ldgeneric.c:1413 src/ldgeneric.c:1422
+#: src/ldgeneric.c:1481 src/ldgeneric.c:1490 src/ldgeneric.c:1753
+#: src/ldgeneric.c:2005
+#, c-format
+msgid "%s: invalid ELF file (%s:%d)\n"
+msgstr "%s: błędny plik ELF (%s:%d)\n"
+
+#: src/ldgeneric.c:1250
+#, c-format
+msgid "%s: only files of type ET_REL might contain section groups"
+msgstr "%s: tylko pliki typu ET_REL mogą zawierać grupy sekcji"
+
+#: src/ldgeneric.c:1302
+#, c-format
+msgid "%s: cannot determine signature of section group [%2zd] '%s': %s"
+msgstr "%s: nie można określić sygnatury grupy sekcji [%2zd] '%s': %s"
+
+#: src/ldgeneric.c:1314
+#, fuzzy, c-format
+msgid "%s: cannot get content of section group [%2zd] '%s': %s'"
+msgstr "%s: nie można określić sygnatury grupy sekcji [%2zd] '%s': %s"
+
+#: src/ldgeneric.c:1328
+#, fuzzy, c-format
+msgid ""
+"%s: group member %zu of section group [%2zd] '%s' has too high index: %"
+"<PRIu32>"
+msgstr "%s: nie można określić sygnatury grupy sekcji [%2zd] '%s': %s"
+
+#: src/ldgeneric.c:1350
+#, c-format
+msgid "%s: section '%s' has unknown type: %d"
+msgstr "%s: sekcja '%s' ma nieznany typ: %d"
+
+#: src/ldgeneric.c:1729
+#, c-format
+msgid "cannot get descriptor for ELF file (%s:%d): %s\n"
+msgstr "nie można pobrać deskryptora dla pliku ELF (%s:%d): %s\n"
+
+#: src/ldgeneric.c:1899
+#, c-format
+msgid "cannot read archive `%s': %s"
+msgstr "nie można odczytać archiwum `%s': %s"
+
+#: src/ldgeneric.c:2020
+#, c-format
+msgid "file of type %s cannot be linked in\n"
+msgstr "plik typu %s nie może być wlinkowany\n"
+
+#: src/ldgeneric.c:2032
+#, c-format
+msgid "%s: input file incompatible with ELF machine type %s\n"
+msgstr "%s: plik wejściowy niekompatybilny z rodzajem maszyny ELF %s\n"
+
+#: src/ldgeneric.c:2044
+#, c-format
+msgid "%s: cannot get section header string table index: %s\n"
+msgstr "%s: nie można pobrać indeksu tabeli łańcuchów nagłówków sekcji: %s\n"
+
+#: src/ldgeneric.c:2073
+#, c-format
+msgid "cannot use DSO '%s' when generating relocatable object file"
+msgstr ""
+"nie można użyć DSO '%s' podczas generowania pliku obiektu relokowalnego"
+
+#: src/ldgeneric.c:2158
+#, c-format
+msgid "input file '%s' ignored"
+msgstr "plik wejściowy '%s' zignorowany"
+
+#: src/ldgeneric.c:2372
+#, c-format
+msgid "undefined symbol `%s' in %s"
+msgstr "niezdefiniowany symbol `%s' w %s"
+
+#: src/ldgeneric.c:2702
+#, c-format
+msgid "cannot create ELF descriptor for output file: %s"
+msgstr "nie można utworzyć deskryptora ELF dla pliku wyjściowego: %s"
+
+#: src/ldgeneric.c:2709
+#, c-format
+msgid "could not create ELF header for output file: %s"
+msgstr "nie można utworzyć nagłówka ELF dla pliku wyjściowego: %s"
+
+#: src/ldgeneric.c:3224 src/ldgeneric.c:3294 src/ldgeneric.c:3330
+#: src/ldgeneric.c:4457 src/ldgeneric.c:4506 src/ldgeneric.c:4538
+#: src/ldgeneric.c:4773 src/ldgeneric.c:4828 src/ldgeneric.c:5075
+#: src/ldgeneric.c:5131 src/ldgeneric.c:5600 src/ldgeneric.c:5612
+#, c-format
+msgid "cannot create section for output file: %s"
+msgstr "nie można utworzyć sekcji dla pliku wyjściowego: %s"
+
+#: src/ldgeneric.c:3444
+#, c-format
+msgid "address computation expression contains variable '%s'"
+msgstr "wyrażenie obliczenia adresu zawiera zmienną '%s'"
+
+#: src/ldgeneric.c:3489
+#, c-format
+msgid ""
+"argument '%<PRIuMAX>' of ALIGN in address computation expression is no power "
+"of two"
+msgstr ""
+"argument '%<PRIuMAX>' ALIGN w wyrażeniu obliczenia adresu nie jest potęgą "
+"dwójki"
+
+#: src/ldgeneric.c:3684
+#, c-format
+msgid "cannot find entry symbol '%s': defaulting to %#0*<PRIx64>"
+msgstr ""
+"nie można znaleźć symbolu wejściowego '%s': użycie domyślnego %#0*<PRIx64>"
+
+#: src/ldgeneric.c:3690
+#, c-format
+msgid "no entry symbol specified: defaulting to %#0*<PRIx64>"
+msgstr "nie określono symbolu wejściowego: użycie domyślnego %#0*<PRIx64>"
+
+#: src/ldgeneric.c:3920
+#, fuzzy, c-format
+msgid "cannot create GNU hash table section for output file: %s"
+msgstr "nie można utworzyć sekcji tablicy haszującej dla pliku wyjściowego: %s"
+
+#: src/ldgeneric.c:4071
+#, c-format
+msgid "cannot create hash table section for output file: %s"
+msgstr "nie można utworzyć sekcji tablicy haszującej dla pliku wyjściowego: %s"
+
+#: src/ldgeneric.c:4114
+#, fuzzy, c-format
+msgid "cannot create build ID section: %s"
+msgstr "nie można utworzyć sekcji wersjonowania: %s"
+
+#: src/ldgeneric.c:4191
+#, fuzzy, c-format
+msgid "cannot convert section data to file format: %s"
+msgstr "nie można utworzyć sekcji dla pliku wyjściowego: %s"
+
+#: src/ldgeneric.c:4200
+#, fuzzy, c-format
+msgid "cannot convert section data to memory format: %s"
+msgstr "nie można przydzielić danych sekcji: %s"
+
+#: src/ldgeneric.c:4261
+#, fuzzy, c-format
+msgid "cannot read enough data for UUID"
+msgstr "nie można utworzyć danych wersjonowania: %s"
+
+#: src/ldgeneric.c:4358 src/ldgeneric.c:4379 src/ldgeneric.c:4408
+#: src/ldgeneric.c:6062
+#, c-format
+msgid "cannot create symbol table for output file: %s"
+msgstr "nie można utworzyć tabeli symboli dla pliku wyjściowego: %s"
+
+#: src/ldgeneric.c:5300 src/ldgeneric.c:5852
+#, c-format
+msgid "section index too large in dynamic symbol table"
+msgstr "indeks sekcji zbyt duży w tabeli symboli dynamicznych"
+
+#: src/ldgeneric.c:5745
+#, c-format
+msgid "cannot create versioning section: %s"
+msgstr "nie można utworzyć sekcji wersjonowania: %s"
+
+#: src/ldgeneric.c:5818
+#, c-format
+msgid "cannot create dynamic symbol table for output file: %s"
+msgstr ""
+"nie można utworzyć tabeli symboli dynamicznych dla pliku wyjściowego: %s"
+
+#: src/ldgeneric.c:5994
+#, c-format
+msgid "cannot create versioning data: %s"
+msgstr "nie można utworzyć danych wersjonowania: %s"
+
+#: src/ldgeneric.c:6094 src/ldgeneric.c:6107 src/ldgeneric.c:6171
+#: src/ldgeneric.c:6179
+#, c-format
+msgid "cannot create section header string section: %s"
+msgstr "nie można utworzyć sekcji łańcuchów nagłówków sekcji: %s"
+
+#: src/ldgeneric.c:6101
+#, c-format
+msgid "cannot create section header string section"
+msgstr "nie można utworzyć sekcji łańcuchów nagłówków sekcji"
+
+#: src/ldgeneric.c:6259
+#, c-format
+msgid "cannot create program header: %s"
+msgstr "nie można utworzyć nagłówka programu: %s"
+
+#: src/ldgeneric.c:6267
+#, c-format
+msgid "while determining file layout: %s"
+msgstr "podczas określania rozkładu pliku: %s"
+
+#: src/ldgeneric.c:6388
+#, fuzzy, c-format
+msgid "internal error: non-nobits section follows nobits section"
+msgstr "błąd wewnętrzny: sekcja nobits po sekcji nobits"
+
+#: src/ldgeneric.c:6925
+#, c-format
+msgid "cannot get header of 0th section: %s"
+msgstr "nie można pobrać nagłówka zerowej sekcji: %s"
+
+#: src/ldgeneric.c:6941 src/unstrip.c:1808
+#, c-format
+msgid "cannot update ELF header: %s"
+msgstr "nie można uaktualnić nagłówka ELF: %s"
+
+#: src/ldgeneric.c:6972
+#, c-format
+msgid "linker backend didn't specify function to relocate section"
+msgstr "backend linkera nie określił funkcji dla sekcji relokacji"
+
+#: src/ldgeneric.c:6984
+#, c-format
+msgid "while writing output file: %s"
+msgstr "podczas zapisu pliku wyjściowego: %s"
+
+#: src/ldgeneric.c:6989
+#, c-format
+msgid "while finishing output file: %s"
+msgstr "podczas kończenia pliku wyjściowego: %s"
+
+#: src/ldgeneric.c:6995
+#, c-format
+msgid "cannot stat output file"
+msgstr "nie można wykonać stat na pliku wyjściowym"
+
+#: src/ldgeneric.c:7011
+#, c-format
+msgid "WARNING: temporary output file overwritten before linking finished"
+msgstr ""
+"UWAGA: tymczasowy plik wyjściowy nadpisany przed zakończeniem linkowania"
+
+#: src/ldgeneric.c:7064 src/ldgeneric.c:7075 src/ldgeneric.c:7086
+#: src/ldgeneric.c:7097 src/ldgeneric.c:7116 src/ldgeneric.c:7129
+#: src/ldgeneric.c:7141
+#, c-format
+msgid "no machine specific '%s' implementation"
+msgstr "brak implementacji '%s' specyficznej dla maszyny"
+
+#: src/ldscript.y:178
+msgid "mode for segment invalid\n"
+msgstr "błędne atrybuty dla segmentu\n"
+
+#: src/ldscript.y:465
+#, c-format
+msgid "while reading version script '%s': %s at line %d"
+msgstr "podczas odczytu skryptu wersji '%s': %s w linii %d"
+
+#: src/ldscript.y:466
+#, c-format
+msgid "while reading linker script '%s': %s at line %d"
+msgstr "podczas odczytu skryptu linkera '%s': %s w linii %d"
+
+#: src/ldscript.y:745
+#, fuzzy, c-format
+msgid "symbol '%s' is declared both local and global for unnamed version"
+msgstr ""
+"symbol '%s' zadeklarowany jednocześnie lokalny i globalny dla nienazwanej "
+"wersji"
+
+#: src/ldscript.y:747
+#, fuzzy, c-format
+msgid "symbol '%s' is declared both local and global for version '%s'"
+msgstr ""
+"symbol '%s' zadeklarowany jednocześnie lokalny i globalny dla wersji '%s'"
+
+#: src/ldscript.y:767 src/ldscript.y:774
+#, c-format
+msgid "default visibility set as local and global"
+msgstr "domyślna widoczność ustawiona jako lokalna i globalna"
+
+#: src/nm.c:74 src/strip.c:73
+msgid "Output selection:"
+msgstr "Wybór wyjścia:"
+
+#: src/nm.c:75
+msgid "Display debugger-only symbols"
+msgstr "Wyświetlenie symboli wyłącznie debugowych"
+
+#: src/nm.c:76
+msgid "Display only defined symbols"
+msgstr "Wyświetlenie tylko symboli zdefiniowanych"
+
+#: src/nm.c:79
+msgid "Display dynamic symbols instead of normal symbols"
+msgstr "Wyświetlenie symboli dynamicznych zamiast normalnych"
+
+#: src/nm.c:80
+msgid "Display only external symbols"
+msgstr "Wyświetlenie tylko symboli zewnętrznych"
+
+#: src/nm.c:81
+msgid "Display only undefined symbols"
+msgstr "Wyświetlenie tylko symboli niezdefiniowanych"
+
+#: src/nm.c:83
+msgid "Include index for symbols from archive members"
+msgstr "Dołączenie indeksu dla symboli z elementów archiwum"
+
+#: src/nm.c:85 src/size.c:66
+msgid "Output format:"
+msgstr "Format wyjścia:"
+
+#: src/nm.c:87
+msgid "Print name of the input file before every symbol"
+msgstr "Wypisanie nazwy pliku wejściowego przed każdym symbolem"
+
+#: src/nm.c:90
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd', `sysv' or `posix'. The "
+"default is `sysv'"
+msgstr ""
+"Użycie takiego FORMATU wyjściowego. Może to być `bsd', `sysv' lub `posix'. "
+"Domyślny jest `sysv'"
+
+#: src/nm.c:92
+msgid "Same as --format=bsd"
+msgstr "To samo co --format=bsd"
+
+#: src/nm.c:93
+msgid "Same as --format=posix"
+msgstr "To samo co --format=posix"
+
+#: src/nm.c:94 src/size.c:72
+msgid "Use RADIX for printing symbol values"
+msgstr "Użycie BAZY do wypisywania wartości symboli"
+
+#: src/nm.c:95
+msgid "Mark weak symbols"
+msgstr "Oznaczanie symboli słabych"
+
+#: src/nm.c:96
+msgid "Print size of defined symbols"
+msgstr "Wypisywanie rozmiaru zdefiniowanych symboli"
+
+#: src/nm.c:98 src/size.c:80 src/strip.c:78 src/unstrip.c:81
+msgid "Output options:"
+msgstr "Opcje wyjścia"
+
+#: src/nm.c:99
+msgid "Sort symbols numerically by address"
+msgstr "Sortowanie symboli numerycznie według adresu"
+
+#: src/nm.c:101
+msgid "Do not sort the symbols"
+msgstr "Nie sortowanie symboli"
+
+#: src/nm.c:102
+msgid "Reverse the sense of the sort"
+msgstr "Odwrócenie porządku sortowania"
+
+#: src/nm.c:108
+msgid "List symbols from FILEs (a.out by default)."
+msgstr "Podanie listy symboli z PLIKU (domyślnie a.out)."
+
+#: src/nm.c:136 src/objdump.c:105 src/size.c:117 src/strip.c:121
+#, c-format
+msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
+msgstr "%s: BŁĄD WEWNĘTRZNY %d (%s-%s): %s"
+
+#: src/nm.c:380 src/nm.c:392 src/size.c:317 src/size.c:326 src/size.c:337
+#: src/strip.c:1816
+#, c-format
+msgid "while closing '%s'"
+msgstr "podczas zamykania '%s'"
+
+#: src/nm.c:402 src/objdump.c:296 src/strip.c:359
+#, c-format
+msgid "%s: File format not recognized"
+msgstr "%s: Format pliku nie rozpoznany"
+
+#: src/nm.c:442
+msgid ""
+"\n"
+"Archive index:"
+msgstr ""
+"\n"
+"Indeks archiwum:"
+
+#: src/nm.c:451
+#, c-format
+msgid "invalid offset %zu for symbol %s"
+msgstr "błędny offset %zu dla symbolu %s"
+
+#: src/nm.c:456
+#, c-format
+msgid "%s in %s\n"
+msgstr "%s w %s\n"
+
+#: src/nm.c:464
+#, c-format
+msgid "cannot reset archive offset to beginning"
+msgstr "nie można przestawić offsetu w archiwum na początek"
+
+#: src/nm.c:488 src/objdump.c:344
+#, c-format
+msgid "%s%s%s: file format not recognized"
+msgstr "%s%s%s: format pliku nie rozpoznany"
+
+#: src/nm.c:700
+#, c-format
+msgid "cannot create search tree"
+msgstr "nie można utworzyć drzewa wyszukiwania"
+
+#: src/nm.c:740 src/nm.c:1002 src/objdump.c:744 src/readelf.c:885
+#: src/readelf.c:1028 src/readelf.c:1169 src/readelf.c:1351 src/readelf.c:1549
+#: src/readelf.c:1735 src/readelf.c:1945 src/readelf.c:2199 src/readelf.c:2265
+#: src/readelf.c:2343 src/readelf.c:2841 src/readelf.c:2877 src/readelf.c:2939
+#: src/readelf.c:6493 src/readelf.c:7387 src/readelf.c:7534 src/readelf.c:7604
+#: src/size.c:425 src/size.c:499 src/strip.c:483
+#, c-format
+msgid "cannot get section header string table index"
+msgstr "nie można pobrać indeksu tabeli łańcuchów nagłówków sekcji"
+
+#: src/nm.c:766
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Symbole z %s:\n"
+"\n"
+
+#: src/nm.c:768
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s[%s]:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Symbole z %s[%s]:\n"
+"\n"
+
+#: src/nm.c:771
+#, c-format
+msgid ""
+"%*s%-*s %-*s Class Type %-*s %*s Section\n"
+"\n"
+msgstr ""
+"%*s%-*s %-*s Klasa Typ %-*s %*s Sekcja\n"
+"\n"
+
+#: src/nm.c:1012
+#, 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:1016
+#, 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:1255
+#, c-format
+msgid "%s%s%s%s: Invalid operation"
+msgstr "%s%s%s%s: Błędna operacja"
+
+#: src/nm.c:1312
+#, c-format
+msgid "%s%s%s: no symbols"
+msgstr "%s%s%s: brak symboli"
+
+#: src/objdump.c:61
+#, fuzzy
+msgid "Mode selection:"
+msgstr "Wybór wyjścia:"
+
+#: src/objdump.c:62
+#, fuzzy
+msgid "Display relocation information."
+msgstr "Wyświetlenie informacji o wersjonowaniu"
+
+#: src/objdump.c:64
+msgid "Display the full contents of all sections requested"
+msgstr ""
+
+#: src/objdump.c:66
+msgid "Display assembler code of executable sections"
+msgstr ""
+
+#: src/objdump.c:68
+#, fuzzy
+msgid "Output option selection:"
+msgstr "Wybór wyjścia:"
+
+#: src/objdump.c:70
+msgid "Only display information for section NAME."
+msgstr ""
+
+#: src/objdump.c:76
+#, fuzzy
+msgid "Show information from FILEs (a.out by default)."
+msgstr "Podanie listy symboli z PLIKU (domyślnie a.out)."
+
+#: src/objdump.c:236 src/readelf.c:430
+msgid "No operation specified.\n"
+msgstr "Nie podano operacji.\n"
+
+#: src/objdump.c:274 src/objdump.c:286
+#, fuzzy, c-format
+msgid "while close `%s'"
+msgstr "podczas zamykania '%s'"
+
+#: src/objdump.c:379 src/readelf.c:1644 src/readelf.c:1818
+msgid "INVALID SYMBOL"
+msgstr "BŁĘDNY SYMBOL"
+
+#: src/objdump.c:394 src/readelf.c:1675 src/readelf.c:1851
+msgid "INVALID SECTION"
+msgstr "BŁĘDNA SEKCJA"
+
+#: src/objdump.c:510
+#, c-format
+msgid ""
+"\n"
+"RELOCATION RECORDS FOR [%s]:\n"
+"%-*s TYPE VALUE\n"
+msgstr ""
+
+#: src/objdump.c:513
+msgid "OFFSET"
+msgstr ""
+
+#: src/objdump.c:576
+#, fuzzy, c-format
+msgid "Contents of section %s:\n"
+msgstr "nie można pobrać zawartości sekcji %zu: %s"
+
+#: src/objdump.c:676
+#, c-format
+msgid "cannot disassemble"
+msgstr ""
+
+#: src/ranlib.c:74
+msgid "Generate an index to speed access to archives."
+msgstr "Generowanie indeksu w celu przyspieszenia dostępu do archiwów."
+
+#: src/ranlib.c:77
+msgid "ARCHIVE"
+msgstr "ARCHIWUM"
+
+#: src/ranlib.c:116
+#, c-format
+msgid "Archive name required"
+msgstr "Wymagana nazwa archiwum"
+
+#: src/ranlib.c:194
+#, c-format
+msgid "'%s' is no archive"
+msgstr "'%s' nie jest archiwum"
+
+#: src/ranlib.c:229
+#, c-format
+msgid "error while freeing sub-ELF descriptor: %s"
+msgstr " błąd podczas zwalniania deskryptora pod-ELF: %s"
+
+#: src/readelf.c:73
+#, fuzzy
+msgid "ELF output selection:"
+msgstr "Wybór wyjścia:"
+
+#: src/readelf.c:75
+msgid "All these plus -p .strtab -p .dynstr -p .comment"
+msgstr ""
+
+#: src/readelf.c:76
+msgid "Display the dynamic segment"
+msgstr "Wyświetlenie segmentu dynamicznego"
+
+#: src/readelf.c:77
+msgid "Display the ELF file header"
+msgstr "Wyświetlenie nagłówka pliku ELF"
+
+#: src/readelf.c:79
+msgid "Display histogram of bucket list lengths"
+msgstr "Wyświetlenie histogramu długości list kubełków"
+
+#: src/readelf.c:80
+msgid "Display the program headers"
+msgstr "Wyświetlenie nagłówków programu"
+
+#: src/readelf.c:82
+msgid "Display relocations"
+msgstr "Wyświetlenie relokacji"
+
+#: src/readelf.c:83
+#, fuzzy
+msgid "Display the sections' headers"
+msgstr "Wyświetlenie nagłówków sekcji"
+
+#: src/readelf.c:85
+msgid "Display the symbol table"
+msgstr "Wyświetlenie tabeli symboli"
+
+#: src/readelf.c:86
+msgid "Display versioning information"
+msgstr "Wyświetlenie informacji o wersjonowaniu"
+
+#: src/readelf.c:87
+#, fuzzy
+msgid "Display the ELF notes"
+msgstr "Wyświetlenie głównych notatek"
+
+#: src/readelf.c:89
+#, fuzzy
+msgid "Display architecture specific information, if any"
+msgstr "Wyświetlenie informacji specyficznych dla architektury (o ile są)"
+
+#: src/readelf.c:91
+msgid "Display sections for exception handling"
+msgstr ""
+
+#: src/readelf.c:93
+#, fuzzy
+msgid "Additional output selection:"
+msgstr "Wybór wyjścia:"
+
+#: src/readelf.c:95
+#, fuzzy
+msgid ""
+"Display DWARF section content. SECTION can be one of abbrev, aranges, "
+"frame, info, loc, line, ranges, pubnames, str, macinfo, or exception"
+msgstr ""
+"Wyświetlenie zawartości sekcji DWARF. SEKCJA może być jednym z abbrev, "
+"aranges, frame, info, loc, line, ranges, pubnames, str lub macinfo."
+
+#: src/readelf.c:99
+msgid "Dump the uninterpreted contents of SECTION, by number or name"
+msgstr ""
+
+#: src/readelf.c:101
+#, fuzzy
+msgid "Print string contents of sections"
+msgstr "nie można pobrać zawartości sekcji %zu: %s"
+
+#: src/readelf.c:104
+#, fuzzy
+msgid "Display the symbol index of an archive"
+msgstr "Wyświetlenie tabeli symboli"
+
+#: src/readelf.c:106
+msgid "Output control:"
+msgstr "Kontrola wyjścia:"
+
+#: src/readelf.c:108
+msgid "Do not find symbol names for addresses in DWARF data"
+msgstr ""
+
+#: src/readelf.c:114
+msgid "Print information from ELF file in human-readable form."
+msgstr "Wypisanie informacji z pliku ELF w postaci czytelnej dla człowieka"
+
+#: src/readelf.c:401
+#, c-format
+msgid "Unknown DWARF debug section `%s'.\n"
+msgstr "Nieznana sekcja debugowa DWARF `%s'.\n"
+
+#: src/readelf.c:465
+#, fuzzy, c-format
+msgid "cannot generate Elf descriptor: %s"
+msgstr "nie można wygenerować deskryptora Elf: %s\n"
+
+#: src/readelf.c:477
+#, c-format
+msgid "'%s' is not an archive, cannot print archive index"
+msgstr ""
+
+#: src/readelf.c:482
+#, c-format
+msgid "error while closing Elf descriptor: %s"
+msgstr "błąd podczas zamykania deskryptora Elf: %s"
+
+#: src/readelf.c:574
+#, c-format
+msgid "cannot stat input file"
+msgstr "nie można wykonać stat na pliku wejściowym"
+
+#: src/readelf.c:576
+#, c-format
+msgid "input file is empty"
+msgstr "plik wejściowy jest pusty"
+
+#: src/readelf.c:578
+#, fuzzy, c-format
+msgid "failed reading '%s': %s"
+msgstr "podczas zapisu '%s': %s"
+
+#: src/readelf.c:614
+#, c-format
+msgid "cannot read ELF header: %s"
+msgstr "nie można odczytać nagłówka ELF: %s"
+
+#: src/readelf.c:622
+#, c-format
+msgid "cannot create EBL handle"
+msgstr "nie można utworzyć uchwytu EBL"
+
+#: src/readelf.c:635
+#, fuzzy, c-format
+msgid "cannot determine number of program headers: %s"
+msgstr "nie można określić liczby sekcji: %s"
+
+#: src/readelf.c:721
+msgid "NONE (None)"
+msgstr "NONE (Żaden)"
+
+#: src/readelf.c:722
+msgid "REL (Relocatable file)"
+msgstr "REL (Plik relokowalny)"
+
+#: src/readelf.c:723
+msgid "EXEC (Executable file)"
+msgstr "EXEC (Plik wykonywalny)"
+
+#: src/readelf.c:724
+msgid "DYN (Shared object file)"
+msgstr "DYN (Plik obiektu dzielonego)"
+
+#: src/readelf.c:725
+msgid "CORE (Core file)"
+msgstr "CORE (Plik core)"
+
+#: src/readelf.c:730
+#, c-format
+msgid "OS Specific: (%x)\n"
+msgstr "Zależny od systemu: (%x)\n"
+
+#: src/readelf.c:732
+#, c-format
+msgid "Processor Specific: (%x)\n"
+msgstr "Zależny od procesora: (%x)\n"
+
+#: src/readelf.c:742
+msgid ""
+"ELF Header:\n"
+" Magic: "
+msgstr ""
+"Nagłówek ELF:\n"
+" Magic: "
+
+#: src/readelf.c:746
+#, c-format
+msgid ""
+"\n"
+" Class: %s\n"
+msgstr ""
+"\n"
+" Klasa: %s\n"
+
+#: src/readelf.c:751
+#, c-format
+msgid " Data: %s\n"
+msgstr " Dane: %s\n"
+
+#: src/readelf.c:757
+#, c-format
+msgid " Ident Version: %hhd %s\n"
+msgstr " Wersja Ident: %hhd %s\n"
+
+#: src/readelf.c:759 src/readelf.c:776
+msgid "(current)"
+msgstr "(aktualna)"
+
+#: src/readelf.c:763
+#, c-format
+msgid " OS/ABI: %s\n"
+msgstr " OS/ABI: %s\n"
+
+#: src/readelf.c:766
+#, c-format
+msgid " ABI Version: %hhd\n"
+msgstr " Wersja ABI: %hhd\n"
+
+#: src/readelf.c:769
+msgid " Type: "
+msgstr " Typ: "
+
+#: src/readelf.c:772
+#, c-format
+msgid " Machine: %s\n"
+msgstr " Maszyna: %s\n"
+
+#: src/readelf.c:774
+#, c-format
+msgid " Version: %d %s\n"
+msgstr " Wersja: %d %s\n"
+
+#: src/readelf.c:778
+#, c-format
+msgid " Entry point address: %#<PRIx64>\n"
+msgstr " Adres punktu wejściowego: %#<PRIx64>\n"
+
+#: src/readelf.c:781
+#, c-format
+msgid " Start of program headers: %<PRId64> %s\n"
+msgstr " Początek nagłówków programu: %<PRId64> %s\n"
+
+#: src/readelf.c:782 src/readelf.c:785
+msgid "(bytes into file)"
+msgstr "(bajtów w pliku)"
+
+#: src/readelf.c:784
+#, c-format
+msgid " Start of section headers: %<PRId64> %s\n"
+msgstr " Początek nagłówków sekcji: %<PRId64> %s\n"
+
+#: src/readelf.c:787
+#, c-format
+msgid " Flags: %s\n"
+msgstr " Flagi: %s\n"
+
+#: src/readelf.c:790
+#, c-format
+msgid " Size of this header: %<PRId16> %s\n"
+msgstr " Rozmiar tego nagłówka: %<PRId16> %s\n"
+
+#: src/readelf.c:791 src/readelf.c:794 src/readelf.c:811
+msgid "(bytes)"
+msgstr "(bajtów)"
+
+#: src/readelf.c:793
+#, c-format
+msgid " Size of program header entries: %<PRId16> %s\n"
+msgstr " Rozmiar wpisów nagłówka programu: %<PRId16> %s\n"
+
+#: src/readelf.c:796
+#, fuzzy, c-format
+msgid " Number of program headers entries: %<PRId16>"
+msgstr " Liczba wpisów nagłówków programu: %<PRId16>\n"
+
+#: src/readelf.c:803
+#, fuzzy, c-format
+msgid " (%<PRIu32> in [0].sh_info)"
+msgstr " (%<PRIu32> w [0].sh_link)"
+
+#: src/readelf.c:806 src/readelf.c:823 src/readelf.c:837
+msgid " ([0] not available)"
+msgstr " ([0] niedostępny)"
+
+#: src/readelf.c:810
+#, c-format
+msgid " Size of section header entries: %<PRId16> %s\n"
+msgstr " Rozmiar wpisów nagłówka sekcji: %<PRId16> %s\n"
+
+#: src/readelf.c:813
+#, c-format
+msgid " Number of section headers entries: %<PRId16>"
+msgstr " Liczba wpisów nagłówków sekcji: %<PRId16>"
+
+#: src/readelf.c:820
+#, c-format
+msgid " (%<PRIu32> in [0].sh_size)"
+msgstr " (%<PRIu32> w [0].sh_size)"
+
+#: src/readelf.c:833
+#, c-format
+msgid " (%<PRIu32> in [0].sh_link)"
+msgstr " (%<PRIu32> w [0].sh_link)"
+
+#: src/readelf.c:841
+#, c-format
+msgid ""
+" Section header string table index: XINDEX%s\n"
+"\n"
+msgstr ""
+" Indeks tabeli łańcuchów nagłówków sekcji: XINDEX%s\n"
+"\n"
+
+#: src/readelf.c:845
+#, c-format
+msgid ""
+" Section header string table index: %<PRId16>\n"
+"\n"
+msgstr ""
+" Indeks tabeli łańcuchów nagłówków sekcji: %<PRId16>\n"
+"\n"
+
+#: src/readelf.c:877
+#, c-format
+msgid ""
+"There are %d section headers, starting at offset %#<PRIx64>:\n"
+"\n"
+msgstr ""
+"Jest %d nagłówków sekcji, zaczynających się od offsetu %#<PRIx64>:\n"
+"\n"
+
+#: src/readelf.c:887
+msgid "Section Headers:"
+msgstr "Nagłówki sekcji:"
+
+#: src/readelf.c:890
+msgid ""
+"[Nr] Name Type Addr Off Size ES Flags Lk "
+"Inf Al"
+msgstr ""
+"[Nr] Nazwa Typ Adres Offset Rozm ES Flagi Lk "
+"Inf Al"
+
+#: src/readelf.c:892
+msgid ""
+"[Nr] Name Type Addr Off Size ES "
+"Flags Lk Inf Al"
+msgstr ""
+"[Nr] Nazwa Typ Adres Offset Rozmiar ES "
+"Flagi Lk Inf Al"
+
+#: src/readelf.c:899 src/readelf.c:1052
+#, c-format
+msgid "cannot get section: %s"
+msgstr "nie można pobrać sekcji: %s"
+
+#: src/readelf.c:906 src/readelf.c:1060 src/readelf.c:7554 src/unstrip.c:353
+#: src/unstrip.c:377 src/unstrip.c:427 src/unstrip.c:536 src/unstrip.c:553
+#: src/unstrip.c:591 src/unstrip.c:789 src/unstrip.c:1057 src/unstrip.c:1244
+#: src/unstrip.c:1305 src/unstrip.c:1427 src/unstrip.c:1480 src/unstrip.c:1588
+#: src/unstrip.c:1778
+#, c-format
+msgid "cannot get section header: %s"
+msgstr "nie można pobrać nagłówka sekcji: %s"
+
+#: src/readelf.c:964
+msgid "Program Headers:"
+msgstr "Nagłówki programu:"
+
+#: src/readelf.c:966
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align"
+msgstr ""
+" Typ Offset AdresWirt AdresFiz RozmPlik RozmPam Flg "
+"Wyrównanie"
+
+#: src/readelf.c:969
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz "
+"MemSiz Flg Align"
+msgstr ""
+" Typ Offset AdresWirtualny AdresFizyczny RozmPlik "
+"RozmPam Flg Wyrównanie"
+
+#: src/readelf.c:1009
+#, c-format
+msgid "\t[Requesting program interpreter: %s]\n"
+msgstr "\t[Wywołanie interpretera programu: %s]\n"
+
+#: src/readelf.c:1030
+msgid ""
+"\n"
+" Section to Segment mapping:\n"
+" Segment Sections..."
+msgstr ""
+"\n"
+" Odwzorowanie sekcji na segmenty:\n"
+" Segment Sekcje..."
+
+#: src/readelf.c:1041 src/unstrip.c:1824 src/unstrip.c:1863 src/unstrip.c:1870
+#, c-format
+msgid "cannot get program header: %s"
+msgstr "nie można pobrać nagłówka programu: %s"
+
+#: src/readelf.c:1175
+#, c-format
+msgid ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+"\n"
+"Grupa sekcji COMDAT [%2zu] '%s' z sygnaturą '%s' zawiera %zu wpis:\n"
+msgstr[1] ""
+"\n"
+"Grupa sekcji COMDAT [%2zu] '%s' z sygnaturą '%s' zawiera %zu wpisy:\n"
+msgstr[2] ""
+"\n"
+"Grupa sekcji COMDAT [%2zu] '%s' z sygnaturą '%s' zawiera %zu wpisów:\n"
+
+#: src/readelf.c:1180
+#, c-format
+msgid ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+"\n"
+"Grupa sekcji [%2zu] '%s' z sygnaturą '%s' zawiera %zu wpis:\n"
+msgstr[1] ""
+"\n"
+"Grupa sekcji [%2zu] '%s' z sygnaturą '%s' zawiera %zu wpisy:\n"
+msgstr[2] ""
+"\n"
+"Grupa sekcji [%2zu] '%s' z sygnaturą '%s' zawiera %zu wpisów:\n"
+
+#: src/readelf.c:1188
+msgid "<INVALID SYMBOL>"
+msgstr "<BŁĘDNY SYMBOL>"
+
+#: src/readelf.c:1202
+msgid "<INVALID SECTION>"
+msgstr "<BŁĘDNA SEKCJA>"
+
+#: src/readelf.c:1353
+#, c-format
+msgid ""
+"\n"
+"Dynamic segment contains %lu entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Dynamic segment contains %lu entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+"\n"
+"Segment dynamiczny zawiera %lu wpis:\n"
+" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> Dowiązanie do sekcji: [%2u] '%"
+"s'\n"
+msgstr[1] ""
+"\n"
+"Segment dynamiczny zawiera %lu wpisy:\n"
+" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> Dowiązanie do sekcji: [%2u] '%"
+"s'\n"
+msgstr[2] ""
+"\n"
+"Segment dynamiczny zawiera %lu wpisów:\n"
+" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> Dowiązanie do sekcji: [%2u] '%"
+"s'\n"
+
+#: src/readelf.c:1365
+msgid " Type Value\n"
+msgstr " Typ Wartość\n"
+
+#: src/readelf.c:1389
+#, c-format
+msgid "Shared library: [%s]\n"
+msgstr "Biblioteka dzielona: [%s]\n"
+
+#: src/readelf.c:1394
+#, c-format
+msgid "Library soname: [%s]\n"
+msgstr "soname biblioteki: [%s]\n"
+
+#: src/readelf.c:1399
+#, c-format
+msgid "Library rpath: [%s]\n"
+msgstr "rpath biblioteki: [%s]\n"
+
+#: src/readelf.c:1404
+#, c-format
+msgid "Library runpath: [%s]\n"
+msgstr "runpath biblioteki: [%s]\n"
+
+#: src/readelf.c:1424
+#, c-format
+msgid "%<PRId64> (bytes)\n"
+msgstr "%<PRId64> (bajtów)\n"
+
+#: src/readelf.c:1534 src/readelf.c:1720
+#, c-format
+msgid ""
+"\n"
+"Invalid symbol table at offset %#0<PRIx64>\n"
+msgstr ""
+"\n"
+"Błędna tabela symboli pod offsetem %#0<PRIx64>\n"
+
+#: src/readelf.c:1552 src/readelf.c:1737
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entries:\n"
+msgstr[0] ""
+"\n"
+"Sekcja relokacji [%2zu] '%s' dla sekcji [%2u] '%s' pod offsetem %#0<PRIx64> "
+"zawiera %d wpis:\n"
+msgstr[1] ""
+"\n"
+"Sekcja relokacji [%2zu] '%s' dla sekcji [%2u] '%s' pod offsetem %#0<PRIx64> "
+"zawiera %d wpisy:\n"
+msgstr[2] ""
+"\n"
+"Sekcja relokacji [%2zu] '%s' dla sekcji [%2u] '%s' pod offsetem %#0<PRIx64> "
+"zawiera %d wpisów:\n"
+
+#: src/readelf.c:1567
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+"\n"
+"Sekcja relokacji [%2u] '%s' pod offsetem %#0<PRIx64> zawiera %d wpis:\n"
+msgstr[1] ""
+"\n"
+"Sekcja relokacji [%2u] '%s' pod offsetem %#0<PRIx64> zawiera %d wpisy:\n"
+msgstr[2] ""
+"\n"
+"Sekcja relokacji [%2u] '%s' pod offsetem %#0<PRIx64> zawiera %d wpisów:\n"
+
+#: src/readelf.c:1577
+msgid " Offset Type Value Name\n"
+msgstr " Offset Typ Wartość Nazwa\n"
+
+#: src/readelf.c:1579
+msgid " Offset Type Value Name\n"
+msgstr " Offset Typ Wartość Nazwa\n"
+
+#: src/readelf.c:1632 src/readelf.c:1643 src/readelf.c:1656 src/readelf.c:1674
+#: src/readelf.c:1686 src/readelf.c:1805 src/readelf.c:1817 src/readelf.c:1831
+#: src/readelf.c:1850 src/readelf.c:1863
+msgid "<INVALID RELOC>"
+msgstr "<BŁĘDNA RELOKACJA>"
+
+#: src/readelf.c:1749
+msgid " Offset Type Value Addend Name\n"
+msgstr " Offset Typ Wartość Koniec Nazwa\n"
+
+#: src/readelf.c:1751
+msgid " Offset Type Value Addend Name\n"
+msgstr ""
+" Offset Typ Wartość Koniec Nazwa\n"
+
+#: src/readelf.c:1952
+#, c-format
+msgid ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entry:\n"
+msgid_plural ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entries:\n"
+msgstr[0] ""
+"\n"
+"Tabela symboli [%2u] '%s' zawiera %u wpis:\n"
+msgstr[1] ""
+"\n"
+"Tabela symboli [%2u] '%s' zawiera %u wpisy:\n"
+msgstr[2] ""
+"\n"
+"Tabela symboli [%2u] '%s' zawiera %u wpisów:\n"
+
+#: src/readelf.c:1958
+#, c-format
+msgid " %lu local symbol String table: [%2u] '%s'\n"
+msgid_plural " %lu local symbols String table: [%2u] '%s'\n"
+msgstr[0] " %lu symbol lokalny Tabela łańcuchów: [%2u] '%s'\n"
+msgstr[1] " %lu symbole lokalne Tabela łańcuchów: [%2u] '%s'\n"
+msgstr[2] " %lu symboli lokalnych Tabela łańcuchów: [%2u] '%s'\n"
+
+#: src/readelf.c:1968
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr " Numer: Wartość Rozm Typ Bind Widoczność Ndx Nazwa\n"
+
+#: src/readelf.c:1970
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr " Numer: Wartość Rozm Typ Bind Widoczność Ndx Nazwa\n"
+
+#: src/readelf.c:1990
+#, 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:2078
+#, c-format
+msgid "bad dynamic symbol"
+msgstr "błędny symbol dynamiczny"
+
+#: src/readelf.c:2160
+msgid "none"
+msgstr "brak"
+
+#: src/readelf.c:2177
+msgid "| <unknown>"
+msgstr "| <nieznany>"
+
+#: src/readelf.c:2202
+#, c-format
+msgid ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+"\n"
+"Sekcja wymaganych wersji [%2u] '%s' zawiera %d wpis:\n"
+" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> Dowiązanie do sekcji: [%2u] '%"
+"s'\n"
+msgstr[1] ""
+"\n"
+"Sekcja wymaganych wersji [%2u] '%s' zawiera %d wpisy:\n"
+" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> Dowiązanie do sekcji: [%2u] '%"
+"s'\n"
+msgstr[2] ""
+"\n"
+"Sekcja wymaganych wersji [%2u] '%s' zawiera %d wpisów:\n"
+" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> Dowiązanie do sekcji: [%2u] '%"
+"s'\n"
+
+#: src/readelf.c:2225
+#, c-format
+msgid " %#06x: Version: %hu File: %s Cnt: %hu\n"
+msgstr " %#06x: Wersja: %hu Plik: %s Licznik: %hu\n"
+
+#: src/readelf.c:2238
+#, c-format
+msgid " %#06x: Name: %s Flags: %s Version: %hu\n"
+msgstr " %#06x: Nazwa: %s Flagi: %s Wersja: %hu\n"
+
+#: src/readelf.c:2269
+#, c-format
+msgid ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+"\n"
+"Sekcja definicji wersji [%2u] '%s' zawiera %d wpis:\n"
+" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> Dowiązanie do sekcji: [%2u] '%"
+"s'\n"
+msgstr[1] ""
+"\n"
+"Sekcja definicji wersji [%2u] '%s' zawiera %d wpisy:\n"
+" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> Dowiązanie do sekcji: [%2u] '%"
+"s'\n"
+msgstr[2] ""
+"\n"
+"Sekcja definicji wersji [%2u] '%s' zawiera %d wpisów:\n"
+" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> Dowiązanie do sekcji: [%2u] '%"
+"s'\n"
+
+#: src/readelf.c:2299
+#, 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:2314
+#, c-format
+msgid " %#06x: Parent %d: %s\n"
+msgstr " %#06x: Rodzic %d: %s\n"
+
+#: src/readelf.c:2546
+#, c-format
+msgid ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgid_plural ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgstr[0] ""
+"\n"
+"Sekcja symboli wersji [%2u] '%s' zawiera %d wpis:\n"
+" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> Dowiązanie do sekcji: [%2u] '%s'"
+msgstr[1] ""
+"\n"
+"Sekcja symboli wersji [%2u] '%s' zawiera %d wpisy:\n"
+" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> Dowiązanie do sekcji: [%2u] '%s'"
+msgstr[2] ""
+"\n"
+"Sekcja symboli wersji [%2u] '%s' zawiera %d wpisów:\n"
+" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> Dowiązanie do sekcji: [%2u] '%s'"
+
+#: src/readelf.c:2576
+msgid " 0 *local* "
+msgstr " 0 *lokalny* "
+
+#: src/readelf.c:2581
+msgid " 1 *global* "
+msgstr " 1 *globalny* "
+
+#: src/readelf.c:2612
+#, c-format
+msgid ""
+"\n"
+"Histogram 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"
+msgid_plural ""
+"\n"
+"Histogram for bucket list length in section [%2u] '%s' (total of %d "
+"buckets):\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+"\n"
+"Histogram dla długości listy kubełków w sekcji [%2u] '%s' (w sumie %d "
+"kubełek):\n"
+" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> Dowiązanie do sekcji: [%2u] '%"
+"s'\n"
+msgstr[1] ""
+"\n"
+"Histogram dla długości listy kubełków w sekcji [%2u] '%s' (w sumie %d "
+"kubełki):\n"
+" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> Dowiązanie do sekcji: [%2u] '%"
+"s'\n"
+msgstr[2] ""
+"\n"
+"Histogram dla długości listy kubełków w sekcji [%2u] '%s' (w sumie %d "
+"kubełków):\n"
+" Adres: %#0*<PRIx64> Offset: %#08<PRIx64> Dowiązanie do sekcji: [%2u] '%"
+"s'\n"
+
+#: src/readelf.c:2636
+#, no-c-format
+msgid " Length Number % of total Coverage\n"
+msgstr " Długość Liczba % całości Pokrycie\n"
+
+#: src/readelf.c:2638
+#, c-format
+msgid " 0 %6<PRIu32> %5.1f%%\n"
+msgstr " 0 %6<PRIu32> %5.1f%%\n"
+
+#: src/readelf.c:2645
+#, c-format
+msgid "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
+msgstr "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
+
+#: src/readelf.c:2658
+#, c-format
+msgid ""
+" Average number of tests: successful lookup: %f\n"
+" unsuccessful lookup: %f\n"
+msgstr ""
+" Średnia liczba testów: udane wyszukania: %f\n"
+" nieudane wyszukania: %f\n"
+
+#: src/readelf.c:2676 src/readelf.c:2718 src/readelf.c:2759
+#, c-format
+msgid "cannot get data for section %d: %s"
+msgstr "nie można pobrać danych dla sekcji %d: %s"
+
+#: src/readelf.c:2813
+#, c-format
+msgid ""
+" Symbol Bias: %u\n"
+" Bitmask Size: %zu bytes %<PRIuFAST32>%% bits set 2nd hash shift: %u\n"
+msgstr ""
+" Przesunięcie symboli: %u\n"
+" Rozmiar maski bitowej: %zu bajtów %<PRIuFAST32>%% bitów ustawionych "
+"drugie przesunięcie hasza: %u\n"
+
+#: src/readelf.c:2887
+#, c-format
+msgid ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+"\n"
+"Sekcja listy bibliotek [%2zu] '%s' pod offsetem %#0<PRIx64> zawiera %d "
+"wpis:\n"
+msgstr[1] ""
+"\n"
+"Sekcja listy bibliotek [%2zu] '%s' pod offsetem %#0<PRIx64> zawiera %d "
+"wpisy:\n"
+msgstr[2] ""
+"\n"
+"Sekcja listy bibliotek [%2zu] '%s' pod offsetem %#0<PRIx64> zawiera %d "
+"wpisów:\n"
+
+#: src/readelf.c:2901
+msgid ""
+" Library Time Stamp Checksum Version "
+"Flags"
+msgstr ""
+" Biblioteka Oznaczenie czasu Suma k. Wersja "
+"Flagi"
+
+#: src/readelf.c:2951
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Object attributes section [%2zu] '%s' of %<PRIu64> bytes at offset %"
+"#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"Segment notatki o długości %<PRId64> bajtów pod offsetem %#0<PRIx64>:\n"
+
+#: src/readelf.c:2967
+#, fuzzy
+msgid " Owner Size\n"
+msgstr " Właściciel Rozmiar danych Typ\n"
+
+#: src/readelf.c:2993
+#, fuzzy, c-format
+msgid " %-13s %4<PRIu32>\n"
+msgstr " %-13.*s %9<PRId32> %s\n"
+
+#: src/readelf.c:3025
+#, c-format
+msgid " %-4u %12<PRIu32>\n"
+msgstr ""
+
+#: src/readelf.c:3030
+#, fuzzy, c-format
+msgid " File: %11<PRIu32>\n"
+msgstr " ustawienie pliku na %<PRIu64>\n"
+
+#: src/readelf.c:3065
+#, fuzzy, c-format
+msgid " %s: %<PRId64>, %s\n"
+msgstr " %-13.*s %9<PRId32> %s\n"
+
+#: src/readelf.c:3068
+#, fuzzy, c-format
+msgid " %s: %<PRId64>\n"
+msgstr " ustawienie pliku na %<PRIu64>\n"
+
+#: src/readelf.c:3071
+#, c-format
+msgid " %s: %s\n"
+msgstr ""
+
+#: src/readelf.c:3078
+#, fuzzy, c-format
+msgid " %u: %<PRId64>\n"
+msgstr " ustawienie pliku na %<PRIu64>\n"
+
+#: src/readelf.c:3081
+#, c-format
+msgid " %u: %s\n"
+msgstr ""
+
+#: src/readelf.c:3117
+#, c-format
+msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3120
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3125
+#, c-format
+msgid "%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3128
+#, c-format
+msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3134
+#, c-format
+msgid "%s+%#<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3137
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3141
+#, fuzzy, c-format
+msgid "%#<PRIx64> <%s>"
+msgstr "%<PRId64> (bajtów)\n"
+
+#: src/readelf.c:3144
+#, c-format
+msgid "%#0*<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3149
+#, c-format
+msgid "%s+%#<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3152
+#, c-format
+msgid "%s+%#0*<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3260
+#, c-format
+msgid "unknown tag %hx"
+msgstr "nieznany znacznik %hx"
+
+#: src/readelf.c:3262
+#, c-format
+msgid "unknown user tag %hx"
+msgstr "nieznany znacznik użytkownika %hx"
+
+#: src/readelf.c:3480
+#, c-format
+msgid "unknown attribute %hx"
+msgstr "nieznany atrybut %hx"
+
+#: src/readelf.c:3483
+#, c-format
+msgid "unknown user attribute %hx"
+msgstr "nieznany atrybut użytkownika %hx"
+
+#: src/readelf.c:3529
+#, c-format
+msgid "unknown form %<PRIx64>"
+msgstr "nieznana forma %<PRIx64>"
+
+#: src/readelf.c:3763
+msgid "empty block"
+msgstr ""
+
+#: src/readelf.c:3766
+#, c-format
+msgid "%zu byte block:"
+msgstr ""
+
+#: src/readelf.c:4175
+#, c-format
+msgid "%*s[%4<PRIuMAX>] %s <TRUNCATED>\n"
+msgstr ""
+
+#: src/readelf.c:4188
+#, fuzzy, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [ Code]\n"
+msgstr ""
+"\n"
+"Sekcja DWARF '%s' pod offsetem %#<PRIx64>:\n"
+" [ Kod]\n"
+
+#: src/readelf.c:4195
+#, c-format
+msgid ""
+"\n"
+"Abbreviation section at offset %<PRIu64>:\n"
+msgstr ""
+"\n"
+"Sekcja skrótów pod offsetem %<PRIu64>:\n"
+
+#: src/readelf.c:4208
+#, c-format
+msgid " *** error while reading abbreviation: %s\n"
+msgstr " *** błąd podczas odczytu skrótu: %s\n"
+
+#: src/readelf.c:4224
+#, c-format
+msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
+msgstr " [%5u] offset: %<PRId64>, potomek: %s, znacznik: %s\n"
+
+#: src/readelf.c:4227
+msgid "yes"
+msgstr "tak"
+
+#: src/readelf.c:4227
+msgid "no"
+msgstr "nie"
+
+#: src/readelf.c:4263
+#, c-format
+msgid "cannot get .debug_aranges content: %s"
+msgstr "nie można pobrać zawartości .debug_aranges: %s"
+
+#: src/readelf.c:4268
+#, fuzzy, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entries:\n"
+msgstr[0] ""
+"\n"
+"Sekcja DWARF '%s' pod offsetem %#<PRIx64> zawiera %zu wpis:\n"
+msgstr[1] ""
+"\n"
+"Sekcja DWARF '%s' pod offsetem %#<PRIx64> zawiera %zu wpisy:\n"
+msgstr[2] ""
+"\n"
+"Sekcja DWARF '%s' pod offsetem %#<PRIx64> zawiera %zu wpisów:\n"
+
+#: src/readelf.c:4298
+#, c-format
+msgid " [%*zu] ???\n"
+msgstr " [%*zu] ???\n"
+
+#: src/readelf.c:4300
+#, c-format
+msgid ""
+" [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
+msgstr ""
+" [%*zu] start: %0#*<PRIx64>, długość: %5<PRIu64>, offset CU DIE: %6<PRId64>\n"
+
+#: src/readelf.c:4319
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr "nie można pobrać zawartości .debug_ranges: %s"
+
+#: src/readelf.c:4324 src/readelf.c:4810 src/readelf.c:5452 src/readelf.c:5897
+#: src/readelf.c:5992 src/readelf.c:6164
+#, fuzzy, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+"\n"
+"Sekcja DWARF '%s' pod offsetem %#<PRIx64>:\n"
+
+#: src/readelf.c:4338 src/readelf.c:5911
+#, c-format
+msgid " [%6tx] <INVALID DATA>\n"
+msgstr ""
+
+#: src/readelf.c:4360 src/readelf.c:5933
+#, c-format
+msgid " [%6tx] base address %s\n"
+msgstr ""
+
+#: src/readelf.c:4371
+#, c-format
+msgid " [%6tx] %s..%s\n"
+msgstr ""
+
+#: src/readelf.c:4373
+#, c-format
+msgid " %s..%s\n"
+msgstr ""
+
+#: src/readelf.c:4799 src/readelf.c:6230 src/readelf.c:6332
+#, fuzzy, c-format
+msgid "cannot get %s content: %s"
+msgstr "nie można pobrać sekcji: %s"
+
+#: src/readelf.c:4806
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Call frame information section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+"\n"
+"Sekcja relokacji [%2u] '%s' pod offsetem %#0<PRIx64> zawiera %d wpis:\n"
+
+#: src/readelf.c:4833 src/readelf.c:5486
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr "błędne dane w sekcji [%zu] '%s'"
+
+#: src/readelf.c:4855
+#, c-format
+msgid ""
+"\n"
+" [%6tx] Zero terminator\n"
+msgstr ""
+
+#: src/readelf.c:4924
+#, c-format
+msgid "invalid augmentation length"
+msgstr ""
+
+#: src/readelf.c:4936
+msgid "FDE address encoding: "
+msgstr ""
+
+#: src/readelf.c:4942
+msgid "LSDA pointer encoding: "
+msgstr ""
+
+#: src/readelf.c:5034
+#, c-format
+msgid " (offset: %#<PRIx64>)"
+msgstr ""
+
+#: src/readelf.c:5041
+#, fuzzy, c-format
+msgid " (end offset: %#<PRIx64>)"
+msgstr ""
+"\n"
+"Sekcja DWARF '%s' pod offsetem %#<PRIx64>:\n"
+
+#: src/readelf.c:5068
+#, c-format
+msgid " %-26sLSDA pointer: %#<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:5114
+#, c-format
+msgid "cannot get attribute code: %s"
+msgstr "nie można pobrać kodu atrybutu: %s"
+
+#: src/readelf.c:5122
+#, c-format
+msgid "cannot get attribute form: %s"
+msgstr "nie można pobrać formy atrybutu: %s"
+
+#: src/readelf.c:5135
+#, c-format
+msgid "cannot get attribute value: %s"
+msgstr "nie można pobrać wartości atrybutu: %s"
+
+#: src/readelf.c:5331
+#, fuzzy, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [Offset]\n"
+msgstr ""
+"\n"
+"Sekcja DWARF '%s' pod offsetem %#<PRIx64>:\n"
+" [Offset]\n"
+
+#: src/readelf.c:5356
+#, c-format
+msgid ""
+" Compilation unit at offset %<PRIu64>:\n"
+" Version: %<PRIu16>, Abbreviation section offset: %<PRIu64>, Address size: %"
+"<PRIu8>, Offset size: %<PRIu8>\n"
+msgstr ""
+" Jednostka kompilacji pod offsetem %<PRIu64>:\n"
+" Wersja: %<PRIu16>, offset sekcji skrótów: %<PRIu64>, rozmiar adresu: %"
+"<PRIu8>, rozmiar offsetu: %<PRIu8>\n"
+
+#: src/readelf.c:5374
+#, c-format
+msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
+msgstr "nie można pobrać DIE pod offsetem %<PRIu64> w sekcji '%s': %s"
+
+#: src/readelf.c:5385
+#, c-format
+msgid "cannot get DIE offset: %s"
+msgstr "nie można pobrać offsetu DIE: %s"
+
+#: src/readelf.c:5393
+#, c-format
+msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
+msgstr ""
+"nie można pobrać znacznika DIE pod offsetem %<PRIu64> w sekcji '%s': %s"
+
+#: src/readelf.c:5422
+#, c-format
+msgid "cannot get next DIE: %s\n"
+msgstr "nie można pobrać następnego DIE: %s\n"
+
+#: src/readelf.c:5429
+#, c-format
+msgid "cannot get next DIE: %s"
+msgstr "nie można pobrać następnego DIE: %s"
+
+#: src/readelf.c:5464
+#, c-format
+msgid "cannot get line data section data: %s"
+msgstr "nie można pobrać danych sekcji danych linii: %s"
+
+#: src/readelf.c:5477
+#, c-format
+msgid ""
+"\n"
+"Table at offset %Zu:\n"
+msgstr ""
+"\n"
+"Tabela pod offsetem %Zu:\n"
+
+#: src/readelf.c:5529
+#, c-format
+msgid ""
+"\n"
+" Length: %<PRIu64>\n"
+" DWARF version: %<PRIuFAST16>\n"
+" Prologue length: %<PRIu64>\n"
+" Minimum instruction length: %<PRIuFAST8>\n"
+" Initial value if '%s': %<PRIuFAST8>\n"
+" Line base: %<PRIdFAST8>\n"
+" Line range: %<PRIuFAST8>\n"
+" Opcode base: %<PRIuFAST8>\n"
+"\n"
+"Opcodes:\n"
+msgstr ""
+"\n"
+" Długość: %<PRIu64>\n"
+" Wersja DWARF: %<PRIuFAST16>\n"
+" Długość prologu: %<PRIu64>\n"
+" Minimalna długość instrukcji: %<PRIuFAST8>\n"
+" Początkowa wartość '%s': %<PRIuFAST8>\n"
+" Początek linii: %<PRIdFAST8>\n"
+" Przedział linii: %<PRIuFAST8>\n"
+" Początek instrukcji: %<PRIuFAST8>\n"
+"\n"
+"Instrukcje:\n"
+
+#: src/readelf.c:5548
+#, fuzzy, c-format
+msgid "invalid data at offset %tu in section [%zu] '%s'"
+msgstr "błędne dane w sekcji [%zu] '%s'"
+
+#: src/readelf.c:5563
+#, c-format
+msgid " [%*<PRIuFAST8>] %hhu argument\n"
+msgid_plural " [%*<PRIuFAST8>] %hhu arguments\n"
+msgstr[0] " [%*<PRIuFAST8>] %hhu argument\n"
+msgstr[1] " [%*<PRIuFAST8>] %hhu argumenty\n"
+msgstr[2] " [%*<PRIuFAST8>] %hhu argumentów\n"
+
+#: src/readelf.c:5571
+msgid ""
+"\n"
+"Directory table:"
+msgstr ""
+"\n"
+"Tabela katalogu:"
+
+#: src/readelf.c:5587
+msgid ""
+"\n"
+"File name table:\n"
+" Entry Dir Time Size Name"
+msgstr ""
+"\n"
+"Tabela nazw plików:\n"
+" Wpis Kat Czas Rozmiar Nazwa"
+
+#: src/readelf.c:5616
+msgid ""
+"\n"
+"Line number statements:"
+msgstr ""
+"\n"
+"Instrukcje numerów linii:"
+
+#: src/readelf.c:5677
+#, fuzzy, c-format
+msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
+msgstr " instrukcja specjalna %u: adres+%u = %#<PRIx64>, linia%+d = %zu\n"
+
+#: src/readelf.c:5697
+#, c-format
+msgid " extended opcode %u: "
+msgstr " instrukcja rozszerzona %u: "
+
+#: src/readelf.c:5702
+msgid "end of sequence"
+msgstr "koniec sekwencji"
+
+#: src/readelf.c:5717
+#, fuzzy, c-format
+msgid "set address to %s\n"
+msgstr "ustawienie adresu na %#<PRIx64>\n"
+
+#: src/readelf.c:5738
+#, c-format
+msgid "define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
+msgstr ""
+"definicja nowego pliku: dir=%u, mtime=%<PRIu64>, długość=%<PRIu64>, nazwa=%"
+"s\n"
+
+#: src/readelf.c:5747
+msgid "unknown opcode"
+msgstr "nieznany kod instrukcji"
+
+#: src/readelf.c:5759
+msgid " copy"
+msgstr " kopiowanie"
+
+#: src/readelf.c:5769
+#, fuzzy, c-format
+msgid "advance address by %u to %s\n"
+msgstr " zwiększenie adresu o %u do %#<PRIx64>\n"
+
+#: src/readelf.c:5780
+#, c-format
+msgid " advance line by constant %d to %<PRId64>\n"
+msgstr " zwiększenie linii o stałą %d do %<PRId64>\n"
+
+#: src/readelf.c:5788
+#, c-format
+msgid " set file to %<PRIu64>\n"
+msgstr " ustawienie pliku na %<PRIu64>\n"
+
+#: src/readelf.c:5798
+#, c-format
+msgid " set column to %<PRIu64>\n"
+msgstr " ustawienie kolumny na %<PRIu64>\n"
+
+#: src/readelf.c:5805
+#, c-format
+msgid " set '%s' to %<PRIuFAST8>\n"
+msgstr " ustawienie '%s' na %<PRIuFAST8>\n"
+
+#: src/readelf.c:5811
+msgid " set basic block flag"
+msgstr " ustawienie podstawowej flagi bloku"
+
+#: src/readelf.c:5821
+#, fuzzy, c-format
+msgid "advance address by constant %u to %s\n"
+msgstr " zwiększenie adresu o stałą %u do %#<PRIx64>\n"
+
+#: src/readelf.c:5837
+#, fuzzy, c-format
+msgid "advance address by fixed value %u to %s\n"
+msgstr " zwiększenie adresu o stałą wartość %u do %#<PRIx64>\n"
+
+#: src/readelf.c:5846
+msgid " set prologue end flag"
+msgstr " ustawienie flagi końca prologu"
+
+#: src/readelf.c:5851
+msgid " set epilogue begin flag"
+msgstr " ustawienie flagi początku epilogu"
+
+#: src/readelf.c:5860
+#, c-format
+msgid " unknown opcode with %<PRIu8> parameter:"
+msgid_plural " unknown opcode with %<PRIu8> parameters:"
+msgstr[0] " nieznana instrukcja z %<PRIu8> parametrem:"
+msgstr[1] " nieznana instrukcja z %<PRIu8> parametrami:"
+msgstr[2] " nieznana instrukcja z %<PRIu8> parametrami:"
+
+#: src/readelf.c:5892
+#, c-format
+msgid "cannot get .debug_loc content: %s"
+msgstr "nie można pobrać zawartości .debug_log: %s"
+
+#: src/readelf.c:5947
+#, c-format
+msgid " [%6tx] %s..%s"
+msgstr ""
+
+#: src/readelf.c:5949
+#, c-format
+msgid " %s..%s"
+msgstr ""
+
+#: src/readelf.c:6002
+#, c-format
+msgid "cannot get macro information section data: %s"
+msgstr "nie można pobrać danych sekcji informacji o makrach: %s"
+
+#: src/readelf.c:6081
+#, c-format
+msgid "%*s*** non-terminated string at end of section"
+msgstr "%*s*** niezakończony łańcuch na końcu sekcji"
+
+#: src/readelf.c:6149
+#, 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:6188
+#, fuzzy, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" %*s String\n"
+msgstr ""
+"\n"
+"Sekcja DWARF '%s' pod offsetem %#<PRIx64>:\n"
+" %*s Łańcuch\n"
+
+#: src/readelf.c:6202
+#, c-format
+msgid " *** error while reading strings: %s\n"
+msgstr " *** błąd podczas odczytu łańcuchów: %s\n"
+
+#: src/readelf.c:6222
+#, c-format
+msgid ""
+"\n"
+"Call frame search table section [%2zu] '.eh_frame_hdr':\n"
+msgstr ""
+
+#: src/readelf.c:6324
+#, c-format
+msgid ""
+"\n"
+"Exception handling table section [%2zu] '.gcc_except_table':\n"
+msgstr ""
+
+#: src/readelf.c:6347
+#, c-format
+msgid " LPStart encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6359
+#, c-format
+msgid " TType encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6373
+#, c-format
+msgid " Call site encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6386
+msgid ""
+"\n"
+" Call site table:"
+msgstr ""
+
+#: src/readelf.c:6400
+#, c-format
+msgid ""
+" [%4u] Call site start: %#<PRIx64>\n"
+" Call site length: %<PRIu64>\n"
+" Landing pad: %#<PRIx64>\n"
+" Action: %u\n"
+msgstr ""
+
+#: src/readelf.c:6460
+#, fuzzy, c-format
+msgid "invalid TType encoding"
+msgstr "błędny indeks linii"
+
+#: src/readelf.c:6484
+#, c-format
+msgid "cannot get debug context descriptor: %s"
+msgstr "nie można pobrać deskryptora kontekstu debugowego: %s"
+
+#: src/readelf.c:6620 src/readelf.c:7221
+#, fuzzy, c-format
+msgid "cannot convert core note data: %s"
+msgstr "nie można pobrać zawartości sekcji notatki: %s"
+
+#: src/readelf.c:6961
+#, c-format
+msgid ""
+"\n"
+"%*s... <repeats %u more times> ..."
+msgstr ""
+
+#: src/readelf.c:7320
+msgid " Owner Data size Type\n"
+msgstr " Właściciel Rozmiar danych Typ\n"
+
+#: src/readelf.c:7338
+#, c-format
+msgid " %-13.*s %9<PRId32> %s\n"
+msgstr " %-13.*s %9<PRId32> %s\n"
+
+#: src/readelf.c:7372
+#, c-format
+msgid "cannot get content of note section: %s"
+msgstr "nie można pobrać zawartości sekcji notatki: %s"
+
+#: src/readelf.c:7399
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Note section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"Segment notatki o długości %<PRId64> bajtów pod offsetem %#0<PRIx64>:\n"
+
+#: src/readelf.c:7422
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"Segment notatki o długości %<PRId64> bajtów pod offsetem %#0<PRIx64>:\n"
+
+#: src/readelf.c:7468
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no data to dump.\n"
+msgstr "sekcja [%2zu] '%s' ma nieobsługiwany typ %d\n"
+
+#: src/readelf.c:7474 src/readelf.c:7497
+#, fuzzy, c-format
+msgid "cannot get data for section [%Zu] '%s': %s"
+msgstr "nie można pobrać danych dla sekcji %d: %s"
+
+#: src/readelf.c:7478
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Hex dump of section [%Zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"Segment notatki o długości %<PRId64> bajtów pod offsetem %#0<PRIx64>:\n"
+
+#: src/readelf.c:7491
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no strings to dump.\n"
+msgstr "sekcja [%2zu] '%s' ma nieobsługiwany typ %d\n"
+
+#: src/readelf.c:7501
+#, fuzzy, c-format
+msgid ""
+"\n"
+"String section [%Zu] '%s' contains %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"Segment notatki o długości %<PRId64> bajtów pod offsetem %#0<PRIx64>:\n"
+
+#: src/readelf.c:7549
+#, c-format
+msgid ""
+"\n"
+"section [%lu] does not exist"
+msgstr ""
+
+#: src/readelf.c:7576
+#, fuzzy, c-format
+msgid ""
+"\n"
+"section '%s' does not exist"
+msgstr "sekcja [%2d] '%s': brak obowiązkowego znacznika %s\n"
+
+#: src/readelf.c:7637
+#, fuzzy, c-format
+msgid "cannot get symbol index of archive '%s': %s"
+msgstr "nie można pobrać symbolu w '%s': %s"
+
+#: src/readelf.c:7640
+#, c-format
+msgid ""
+"\n"
+"Archive '%s' has no symbol index\n"
+msgstr ""
+
+#: src/readelf.c:7644
+#, c-format
+msgid ""
+"\n"
+"Index of archive '%s' has %Zu entries:\n"
+msgstr ""
+
+#: src/readelf.c:7662
+#, fuzzy, c-format
+msgid "cannot extract member at offset %Zu in '%s': %s"
+msgstr "nie można pobrać zawartości sekcji %zu w '%s': %s"
+
+#: src/readelf.c:7667
+#, c-format
+msgid "Archive member '%s' contains:\n"
+msgstr ""
+
+#: src/size.c:68
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd' or `sysv'. The default "
+"is `bsd'"
+msgstr ""
+"Użycie tego FORMATU wyjścia. Może to być `bsd' lub `sysv'. Domyślny jest "
+"`bsd'"
+
+#: src/size.c:70
+msgid "Same as `--format=sysv'"
+msgstr "To samo co `--format=sysv'"
+
+#: src/size.c:71
+msgid "Same as `--format=bsd'"
+msgstr "To samo co `--format=bsd'"
+
+#: src/size.c:74
+msgid "Same as `--radix=10'"
+msgstr "To samo co `--radix=10'"
+
+#: src/size.c:75
+msgid "Same as `--radix=8'"
+msgstr "To samo co `--radix=8'"
+
+#: src/size.c:76
+msgid "Same as `--radix=16'"
+msgstr "To samo co `--radix=16'"
+
+#: src/size.c:78
+msgid "Similar to `--format=sysv' output but in one line"
+msgstr "Podobnie do wyjścia `--format=sysv', ale w jednej linii"
+
+#: src/size.c:82
+msgid "Print size and permission flags for loadable segments"
+msgstr "Wypisanie rozmiaru i flag uprawnień dla segmentów ładowalnych"
+
+#: src/size.c:83
+msgid "Display the total sizes (bsd only)"
+msgstr "Wyświetlenie całkowitych rozmiarów (tylko bsd)"
+
+#: src/size.c:88
+msgid "List section sizes of FILEs (a.out by default)."
+msgstr "Podanie rozmiarów sekcji PLIKU (domyślnie a.out)."
+
+#: src/size.c:269
+#, c-format
+msgid "Invalid format: %s"
+msgstr "Błędny format: %s"
+
+#: src/size.c:280
+#, c-format
+msgid "Invalid radix: %s"
+msgstr "Błędna baza: %s"
+
+#: src/size.c:339
+#, c-format
+msgid "%s: file format not recognized"
+msgstr "%s: format pliku nie rozpoznany"
+
+#: src/size.c:446 src/size.c:589
+#, c-format
+msgid " (ex %s)"
+msgstr " (ex %s)"
+
+#: src/size.c:614
+msgid "(TOTALS)\n"
+msgstr "(CAŁKOWITE)\n"
+
+#: src/strings.c:70
+msgid "Output Selection:"
+msgstr "Wybór wyjścia:"
+
+#: src/strings.c:71
+msgid "Scan entire file, not only loaded sections"
+msgstr "Przeszukanie całego pliku, nie tylko sekcji ładowalnych"
+
+#: src/strings.c:73
+msgid "Only NUL-terminated sequences of MIN-LEN characters or more are printed"
+msgstr ""
+"Wypisywane są tylko zakończone NUL sekwencje o MIN-LEN lub więcej znaków"
+
+#: src/strings.c:74
+msgid ""
+"Select character size and endianess: s = 7-bit, S = 8-bit, {b,l} = 16-bit, "
+"{B,L} = 32-bit"
+msgstr ""
+"Wybór rozmiaru i kolejności znaków: s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,"
+"L} = 32-bit"
+
+#: src/strings.c:78
+msgid "Print name of the file before each string."
+msgstr "Wypisanie nazwy pliku przed każdym łańcuchem."
+
+#: src/strings.c:80
+msgid "Print location of the string in base 8, 10, or 16 respectively."
+msgstr "Wypisanie położenia łańcucha z podstawą odpowiednio 8, 10 lub 16."
+
+#: src/strings.c:81
+msgid "Alias for --radix=o"
+msgstr "Alias dla --radix=o"
+
+#: src/strings.c:88
+msgid "Print the strings of printable characters in files."
+msgstr "Wypisanie łańcuchów znaków drukowalnych w plikach."
+
+#: src/strings.c:268 src/strings.c:303
+#, c-format
+msgid "invalid value '%s' for %s parameter"
+msgstr "błędna wartość '%s' dla parametru %s"
+
+#: src/strings.c:314
+#, c-format
+msgid "invalid minimum length of matched string size"
+msgstr "błędna minimalna długość dopasowanego rozmiaru łańcucha"
+
+#: src/strings.c:601
+#, c-format
+msgid "lseek64 failed"
+msgstr "lseek64 nie powiodło się"
+
+#: src/strings.c:616 src/strings.c:680
+#, c-format
+msgid "re-mmap failed"
+msgstr "ponowne mmap nie powiodło się"
+
+#: src/strings.c:653
+#, c-format
+msgid "mprotect failed"
+msgstr "mprotect nie powiodło się"
+
+#: src/strip.c:74
+msgid "Place stripped output into FILE"
+msgstr "Umieszczenie okrojonego wyjścia w PLIKU"
+
+#: src/strip.c:75
+msgid "Extract the removed sections into FILE"
+msgstr "Wyciągnięcie usuwanych sekcji do PLIKU"
+
+#: src/strip.c:76
+msgid "Embed name FILE instead of -f argument"
+msgstr "Osadzenie nazwy PLIK zamiast argumentu -f"
+
+#: src/strip.c:80
+msgid "Remove all debugging symbols"
+msgstr "Usunięcie wszystkich symboli debugowych"
+
+#: src/strip.c:84
+msgid "Copy modified/access timestamps to the output"
+msgstr "Skopiowanie czasów modyfikacji/dostępu do wyjścia"
+
+#: src/strip.c:86
+msgid "Remove .comment section"
+msgstr "Usunięcie sekcji .comment"
+
+#: src/strip.c:89
+msgid "Relax a few rules to handle slightly broken ELF files"
+msgstr "Złagodzenie kilku reguł aby obsłużyć lekko uszkodzone pliki ELF"
+
+#: src/strip.c:94
+msgid "Discard symbols from object files."
+msgstr "Odrzucenie symboli z plików obiektów."
+
+#: src/strip.c:186
+#, c-format
+msgid "Only one input file allowed together with '-o' and '-f'"
+msgstr "Tylko jeden plik wejściowy jest dozwolony z '-o' i '-f'"
+
+#: src/strip.c:222
+#, c-format
+msgid "-f option specified twice"
+msgstr "opcję -f podano dwukrotnie"
+
+#: src/strip.c:231
+#, c-format
+msgid "-F option specified twice"
+msgstr "opcję -F podano dwukrotnie"
+
+#: src/strip.c:240 src/unstrip.c:125
+#, c-format
+msgid "-o option specified twice"
+msgstr "opcję -o podano dwukrotnie"
+
+#: src/strip.c:260
+#, c-format
+msgid "-R option supports only .comment section"
+msgstr "Opcja -R obsługuje tylko sekcję .comment"
+
+#: src/strip.c:298 src/strip.c:322
+#, c-format
+msgid "cannot stat input file '%s'"
+msgstr "nie można wykonać stat na pliku wejściowym '%s'"
+
+#: src/strip.c:312
+#, c-format
+msgid "while opening '%s'"
+msgstr "podczas otwierania '%s'"
+
+#: src/strip.c:350
+#, c-format
+msgid "%s: cannot use -o or -f when stripping archive"
+msgstr "%s: nie można używać -o ani -f przy okrajaniu archiwum"
+
+#: src/strip.c:448
+#, c-format
+msgid "cannot open EBL backend"
+msgstr "nie można otworzyć backendu EBL"
+
+#: src/strip.c:498 src/strip.c:522
+#, c-format
+msgid "cannot create new file '%s': %s"
+msgstr "nie można utworzyć nowego pliku '%s': %s"
+
+#: src/strip.c:582
+#, c-format
+msgid "illformed file '%s'"
+msgstr "plik '%s' ma zły format"
+
+#: src/strip.c:869 src/strip.c:956
+#, c-format
+msgid "while generating output file: %s"
+msgstr "podczas generowania pliku wyjściowego: %s"
+
+#: src/strip.c:929 src/strip.c:1668
+#, c-format
+msgid "%s: error while creating ELF header: %s"
+msgstr "%s: błąd podczas tworzenia nagłówka ELF: %s"
+
+#: src/strip.c:943
+#, c-format
+msgid "while preparing output for '%s'"
+msgstr "podczas przygotowywania wyjścia dla '%s'"
+
+#: src/strip.c:994 src/strip.c:1050
+#, c-format
+msgid "while create section header section: %s"
+msgstr "podczas tworzenia sekcji nagłówka sekcji: %s"
+
+#: src/strip.c:1000
+#, c-format
+msgid "cannot allocate section data: %s"
+msgstr "nie można przydzielić danych sekcji: %s"
+
+#: src/strip.c:1059
+#, c-format
+msgid "while create section header string table: %s"
+msgstr "podczas tworzenia tabeli łańcuchów nagłówka sekcji: %s"
+
+#: src/strip.c:1593 src/strip.c:1690
+#, c-format
+msgid "while writing '%s': %s"
+msgstr "podczas zapisu '%s': %s"
+
+#: src/strip.c:1604
+#, c-format
+msgid "while creating '%s'"
+msgstr "podczas tworzenia `%s'"
+
+#: src/strip.c:1616
+#, c-format
+msgid "while computing checksum for debug information"
+msgstr "podczas obliczania sumy kontrolnej dla informacji debugowych"
+
+#: src/strip.c:1676
+#, c-format
+msgid "%s: error while reading the file: %s"
+msgstr "%s: błąd podczas odczytu pliku: %s"
+
+#: src/strip.c:1722 src/strip.c:1729
+#, c-format
+msgid "error while finishing '%s': %s"
+msgstr "błąd podczas kończenia '%s': %s"
+
+#: src/strip.c:1752 src/strip.c:1809
+#, c-format
+msgid "cannot set access and modification date of '%s'"
+msgstr "nie można ustawić czasu dostępu i modyfikacji '%s'"
+
+#: src/unstrip.c:78
+msgid "Match MODULE against file names, not module names"
+msgstr ""
+
+#: src/unstrip.c:79
+msgid "Silently skip unfindable files"
+msgstr ""
+
+#: src/unstrip.c:82
+#, fuzzy
+msgid "Place output into FILE"
+msgstr "Umieszczenie wyjścia w PLIKU."
+
+#: src/unstrip.c:84
+msgid "Create multiple output files under DIRECTORY"
+msgstr ""
+
+#: src/unstrip.c:85
+msgid "Use module rather than file names"
+msgstr ""
+
+#: src/unstrip.c:87
+#, fuzzy
+msgid "Create output for modules that have no separate debug information"
+msgstr "Wybranie pobrania informacji debugowych parsera"
+
+#: src/unstrip.c:90
+msgid "Apply relocations to section contents in ET_REL files"
+msgstr ""
+
+#: src/unstrip.c:92
+msgid "Only list module and file names, build IDs"
+msgstr ""
+
+#: src/unstrip.c:134
+#, fuzzy, c-format
+msgid "-d option specified twice"
+msgstr "opcję -f podano dwukrotnie"
+
+#: src/unstrip.c:166
+#, fuzzy, c-format
+msgid "only one of -o or -d allowed"
+msgstr "dopuszczalna jest tylko jedna z opcji -G i -r"
+
+#: src/unstrip.c:175
+#, c-format
+msgid "-n cannot be used with explicit files or -o or -d"
+msgstr ""
+
+#: src/unstrip.c:190
+#, c-format
+msgid "output directory '%s'"
+msgstr ""
+
+#: src/unstrip.c:199
+#, c-format
+msgid "exactly two file arguments are required"
+msgstr ""
+
+#: src/unstrip.c:205
+#, c-format
+msgid "-m, -a, -R, and -i options not allowed with explicit files"
+msgstr ""
+
+#: src/unstrip.c:218
+#, c-format
+msgid "-o or -d is required when using implicit files"
+msgstr ""
+
+#: src/unstrip.c:254
+#, fuzzy, c-format
+msgid "cannot create ELF header: %s"
+msgstr "nie można odczytać nagłówka ELF: %s"
+
+#: src/unstrip.c:259
+#, fuzzy, c-format
+msgid "cannot copy ELF header: %s"
+msgstr "nie można uaktualnić nagłówka ELF: %s"
+
+#: src/unstrip.c:264 src/unstrip.c:1817
+#, fuzzy, c-format
+msgid "cannot create program headers: %s"
+msgstr "nie można utworzyć nagłówka programu: %s"
+
+#: src/unstrip.c:270
+#, fuzzy, c-format
+msgid "cannot copy program header: %s"
+msgstr "nie można pobrać nagłówka programu: %s"
+
+#: src/unstrip.c:280
+#, fuzzy, c-format
+msgid "cannot copy section header: %s"
+msgstr "nie można pobrać nagłówka sekcji: %s"
+
+#: src/unstrip.c:283 src/unstrip.c:1505
+#, fuzzy, c-format
+msgid "cannot get section data: %s"
+msgstr "nie można pobrać sekcji: %s"
+
+#: src/unstrip.c:285 src/unstrip.c:1507
+#, fuzzy, c-format
+msgid "cannot copy section data: %s"
+msgstr "nie można przydzielić danych sekcji: %s"
+
+#: src/unstrip.c:309
+#, fuzzy, c-format
+msgid "cannot create directory '%s'"
+msgstr "nie można utworzyć deskryptora EBL dla '%s'"
+
+#: src/unstrip.c:349 src/unstrip.c:763 src/unstrip.c:1540
+#, fuzzy, c-format
+msgid "cannot get symbol table entry: %s"
+msgstr "nie można pobrać sekcji tabeli symboli %zu w '%s': %s"
+
+#: src/unstrip.c:365 src/unstrip.c:580 src/unstrip.c:601 src/unstrip.c:613
+#: src/unstrip.c:1561 src/unstrip.c:1691 src/unstrip.c:1715
+#, fuzzy, c-format
+msgid "cannot update symbol table: %s"
+msgstr "nie można uaktualnić nagłówka ELF: %s"
+
+#: src/unstrip.c:382 src/unstrip.c:432 src/unstrip.c:562 src/unstrip.c:1209
+#: src/unstrip.c:1525 src/unstrip.c:1720 src/unstrip.c:1791
+#, fuzzy, c-format
+msgid "cannot update section header: %s"
+msgstr "nie można pobrać nagłówka sekcji: %s"
+
+#: src/unstrip.c:408 src/unstrip.c:419
+#, fuzzy, c-format
+msgid "cannot update relocation: %s"
+msgstr "nie można pobrać relokacji: %s"
+
+#: src/unstrip.c:507
+#, fuzzy, c-format
+msgid "cannot get symbol version: %s"
+msgstr "nie można pobrać symbolu w '%s': %s"
+
+#: src/unstrip.c:519
+#, c-format
+msgid "unexpected section type in [%Zu] with sh_link to symtab"
+msgstr ""
+
+#: src/unstrip.c:769
+#, fuzzy, c-format
+msgid "invalid string offset in symbol [%Zu]"
+msgstr "błędny offset %zu dla symbolu %s"
+
+#: src/unstrip.c:911 src/unstrip.c:1248
+#, fuzzy, c-format
+msgid "cannot read section [%Zu] name: %s"
+msgstr "nie można pobrać nagłówka sekcji: %s"
+
+#: src/unstrip.c:952 src/unstrip.c:971 src/unstrip.c:1004
+#, fuzzy, c-format
+msgid "cannot read '.gnu.prelink_undo' section: %s"
+msgstr "nie można odczytać sekcji dynamicznej: %s"
+
+#: src/unstrip.c:992
+#, fuzzy, c-format
+msgid "invalid contents in '%s' section"
+msgstr "błędna sekcja .debug_line"
+
+#: src/unstrip.c:1047 src/unstrip.c:1370
+#, fuzzy, c-format
+msgid "cannot find matching section for [%Zu] '%s'"
+msgstr "błędne dane w sekcji [%zu] '%s'"
+
+#: src/unstrip.c:1171 src/unstrip.c:1186 src/unstrip.c:1451
+#, fuzzy, c-format
+msgid "cannot add section name to string table: %s"
+msgstr "nie można pobrać indeksu tabeli łańcuchów nagłówków sekcji"
+
+#: src/unstrip.c:1195
+#, fuzzy, c-format
+msgid "cannot update section header string table data: %s"
+msgstr "%s: nie można pobrać indeksu tabeli łańcuchów nagłówków sekcji: %s\n"
+
+#: src/unstrip.c:1223 src/unstrip.c:1227
+#, fuzzy, c-format
+msgid "cannot get section header string table section index: %s"
+msgstr "%s: nie można pobrać indeksu tabeli łańcuchów nagłówków sekcji: %s\n"
+
+#: src/unstrip.c:1231 src/unstrip.c:1235 src/unstrip.c:1466
+#, fuzzy, c-format
+msgid "cannot get section count: %s"
+msgstr "nie można pobrać sekcji: %s"
+
+#: src/unstrip.c:1293 src/unstrip.c:1385
+#, fuzzy, c-format
+msgid "cannot read section header string table: %s"
+msgstr "nie można pobrać indeksu tabeli łańcuchów nagłówków sekcji"
+
+#: src/unstrip.c:1445
+#, fuzzy, c-format
+msgid "cannot add new section: %s"
+msgstr "nie można pobrać sekcji: %s"
+
+#: src/unstrip.c:1548
+#, fuzzy, c-format
+msgid "symbol [%Zu] has invalid section index"
+msgstr "sekcja [%2d] '%s': symbol %zu: błędny indeks sekcji\n"
+
+#: src/unstrip.c:1800
+#, fuzzy, c-format
+msgid "cannot get ELF header: %s"
+msgstr "nie można pobrać nagłówka ELF"
+
+#: src/unstrip.c:1827
+#, fuzzy, c-format
+msgid "cannot update program header: %s"
+msgstr "nie można utworzyć nagłówka programu: %s"
+
+#: src/unstrip.c:1832 src/unstrip.c:1911
+#, fuzzy, c-format
+msgid "cannot write output file: %s"
+msgstr "nie można utworzyć pliku wyjściowego"
+
+#: src/unstrip.c:1880
+#, c-format
+msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+
+#: src/unstrip.c:1883
+#, c-format
+msgid ""
+"DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+
+#: src/unstrip.c:1902 src/unstrip.c:1942 src/unstrip.c:1954 src/unstrip.c:2034
+#, fuzzy, c-format
+msgid "cannot create ELF descriptor: %s"
+msgstr "nie można utworzyć deskryptora ELF dla '%s': %s"
+
+#: src/unstrip.c:1960
+#, c-format
+msgid "'%s' and '%s' do not seem to match"
+msgstr ""
+
+#: src/unstrip.c:1991
+#, fuzzy, c-format
+msgid "cannot find stripped file for module '%s': %s"
+msgstr "nie można utworzyć nowego pliku '%s': %s"
+
+#: src/unstrip.c:1995
+#, fuzzy, c-format
+msgid "cannot open stripped file '%s' for module '%s': %s"
+msgstr "nie można utworzyć nowego pliku '%s': %s"
+
+#: src/unstrip.c:2010
+#, fuzzy, c-format
+msgid "cannot find debug file for module '%s': %s"
+msgstr "nie można utworzyć nowego pliku '%s': %s"
+
+#: src/unstrip.c:2014
+#, fuzzy, c-format
+msgid "cannot open debug file '%s' for module '%s': %s"
+msgstr "nie można utworzyć nowego pliku '%s': %s"
+
+#: src/unstrip.c:2027
+#, fuzzy, c-format
+msgid "module '%s' file '%s' is not stripped"
+msgstr "plik wejściowy '%s' zignorowany"
+
+#: src/unstrip.c:2058
+#, fuzzy, c-format
+msgid "cannot cache section addresses for module '%s': %s"
+msgstr "nie można pobrać nagłówka sekcji dla sekcji [%2zu] '%s': %s\n"
+
+#: src/unstrip.c:2191
+#, fuzzy, c-format
+msgid "no matching modules found"
+msgstr "brak pasującego zakresu adresów"
+
+#: src/unstrip.c:2200
+#, fuzzy, c-format
+msgid "matched more than one module"
+msgstr "%s podano więcej niż raz na wejściu"
+
+#: src/unstrip.c:2247
+msgid ""
+"STRIPPED-FILE DEBUG-FILE\n"
+"[MODULE...]"
+msgstr ""
+
+#: src/unstrip.c:2248
+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"
+"\n"
+"MODULE arguments give file name patterns matching modules to process.\n"
+"With -f these match the file name of the main (stripped) file (slashes are "
+"never special), otherwise they match the simple module names. With no "
+"arguments, process all modules found.\n"
+"\n"
+"Multiple modules are written to files under OUTPUT-DIRECTORY, creating "
+"subdirectories as needed. With -m these files have simple module names, "
+"otherwise they have the name of the main file complete with directory "
+"underneath OUTPUT-DIRECTORY.\n"
+"\n"
+"With -n no files are written, but one line to standard output for each "
+"module:\n"
+"\tSTART+SIZE BUILDID FILE DEBUGFILE MODULENAME\n"
+"START and SIZE are hexadecimal giving the address bounds of the module. "
+"BUILDID is hexadecimal for the build ID bits, or - if no ID is known; the "
+"hexadecimal may be followed by @0xADDR giving the address where the ID "
+"resides if that is known. FILE is the file name found for the module, or - "
+"if none was found, or . if an ELF image is available but not from any named "
+"file. DEBUGFILE is the separate debuginfo file name, or - if no debuginfo "
+"was found, or . if FILE contains the debug information."
+msgstr ""
diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 00000000..1040653b
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,5665 @@
+# translation of ru.po to
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ru\n"
+"Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
+"POT-Creation-Date: 2010-04-21 07:41-0700\n"
+"PO-Revision-Date: 2009-11-12 10:27+1100\n"
+"Last-Translator: NAME <EMAIL>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: lib/xmalloc.c:51 lib/xmalloc.c:65 lib/xmalloc.c:79 src/readelf.c:2822
+#: src/readelf.c:3161 src/unstrip.c:2087 src/unstrip.c:2295
+#, c-format
+msgid "memory exhausted"
+msgstr ""
+
+#: libasm/asm_error.c:62 libdw/dwarf_error.c:79 libdwfl/libdwflP.h:70
+#: libelf/elf_error.c:81
+msgid "no error"
+msgstr ""
+
+#: libasm/asm_error.c:63 libdw/dwarf_error.c:88 libdwfl/libdwflP.h:72
+#: libelf/elf_error.c:112
+msgid "out of memory"
+msgstr ""
+
+#: libasm/asm_error.c:64 src/ldgeneric.c:2687
+#, c-format
+msgid "cannot create output file"
+msgstr ""
+
+#: libasm/asm_error.c:65
+msgid "invalid parameter"
+msgstr ""
+
+#: libasm/asm_error.c:66
+msgid "cannot change mode of output file"
+msgstr ""
+
+#: libasm/asm_error.c:67 src/ldgeneric.c:7001
+#, c-format
+msgid "cannot rename output file"
+msgstr ""
+
+#: libasm/asm_error.c:68
+msgid "duplicate symbol"
+msgstr ""
+
+#: libasm/asm_error.c:69
+msgid "invalid section type for operation"
+msgstr ""
+
+#: libasm/asm_error.c:70
+msgid "error during output of data"
+msgstr ""
+
+#: libasm/asm_error.c:71
+msgid "no backend support available"
+msgstr ""
+
+#: libasm/asm_error.c:81 libdw/dwarf_error.c:80 libdwfl/libdwflP.h:71
+#: libelf/elf_error.c:84
+msgid "unknown error"
+msgstr ""
+
+#: libdw/dwarf_error.c:81
+msgid "invalid access"
+msgstr ""
+
+#: libdw/dwarf_error.c:82
+msgid "no regular file"
+msgstr ""
+
+#: libdw/dwarf_error.c:83
+msgid "I/O error"
+msgstr ""
+
+#: libdw/dwarf_error.c:84
+msgid "invalid ELF file"
+msgstr ""
+
+#: libdw/dwarf_error.c:85
+msgid "no DWARF information"
+msgstr ""
+
+#: libdw/dwarf_error.c:86
+msgid "no ELF file"
+msgstr ""
+
+#: libdw/dwarf_error.c:87
+msgid "cannot get ELF header"
+msgstr ""
+
+#: libdw/dwarf_error.c:89
+msgid "not implemented"
+msgstr ""
+
+#: libdw/dwarf_error.c:90 libelf/elf_error.c:128 libelf/elf_error.c:176
+msgid "invalid command"
+msgstr ""
+
+#: libdw/dwarf_error.c:91
+msgid "invalid version"
+msgstr ""
+
+#: libdw/dwarf_error.c:92
+msgid "invalid file"
+msgstr ""
+
+#: libdw/dwarf_error.c:93
+msgid "no entries found"
+msgstr ""
+
+#: libdw/dwarf_error.c:94
+msgid "invalid DWARF"
+msgstr ""
+
+#: libdw/dwarf_error.c:95
+msgid "no string data"
+msgstr ""
+
+#: libdw/dwarf_error.c:96
+msgid "no address value"
+msgstr ""
+
+#: libdw/dwarf_error.c:97
+msgid "no constant value"
+msgstr ""
+
+#: libdw/dwarf_error.c:98
+msgid "no reference value"
+msgstr ""
+
+#: libdw/dwarf_error.c:99
+msgid "invalid reference value"
+msgstr ""
+
+#: libdw/dwarf_error.c:100
+msgid ".debug_line section missing"
+msgstr ""
+
+#: libdw/dwarf_error.c:101
+msgid "invalid .debug_line section"
+msgstr ""
+
+#: libdw/dwarf_error.c:102
+msgid "debug information too big"
+msgstr ""
+
+#: libdw/dwarf_error.c:103
+msgid "invalid DWARF version"
+msgstr ""
+
+#: libdw/dwarf_error.c:104
+msgid "invalid directory index"
+msgstr ""
+
+#: libdw/dwarf_error.c:105 libdwfl/libdwflP.h:91
+msgid "address out of range"
+msgstr ""
+
+#: libdw/dwarf_error.c:106
+msgid "no location list value"
+msgstr ""
+
+#: libdw/dwarf_error.c:107
+msgid "no block data"
+msgstr ""
+
+#: libdw/dwarf_error.c:108
+msgid "invalid line index"
+msgstr ""
+
+#: libdw/dwarf_error.c:109
+msgid "invalid address range index"
+msgstr ""
+
+#: libdw/dwarf_error.c:110 libdwfl/libdwflP.h:92
+msgid "no matching address range"
+msgstr ""
+
+#: libdw/dwarf_error.c:111
+msgid "no flag value"
+msgstr ""
+
+#: libdw/dwarf_error.c:112 libelf/elf_error.c:253
+msgid "invalid offset"
+msgstr ""
+
+#: libdw/dwarf_error.c:113
+msgid ".debug_ranges section missing"
+msgstr ""
+
+#: libdw/dwarf_error.c:114
+msgid "invalid CFI section"
+msgstr ""
+
+#: libdwfl/argp-std.c:67 src/unstrip.c:2237
+msgid "Input selection options:"
+msgstr ""
+
+#: libdwfl/argp-std.c:68
+msgid "Find addresses in FILE"
+msgstr ""
+
+#: libdwfl/argp-std.c:70
+msgid "Find addresses from signatures found in COREFILE"
+msgstr ""
+
+#: libdwfl/argp-std.c:72
+msgid "Find addresses in files mapped into process PID"
+msgstr ""
+
+#: libdwfl/argp-std.c:74
+msgid ""
+"Find addresses in files mapped as read from FILE in Linux /proc/PID/maps "
+"format"
+msgstr ""
+
+#: libdwfl/argp-std.c:76
+msgid "Find addresses in the running kernel"
+msgstr ""
+
+#: libdwfl/argp-std.c:78
+msgid "Kernel with all modules"
+msgstr ""
+
+#: libdwfl/argp-std.c:80
+msgid "Search path for separate debuginfo files"
+msgstr ""
+
+#: libdwfl/argp-std.c:163
+msgid "only one of -e, -p, -k, -K, or --core allowed"
+msgstr ""
+
+#: libdwfl/argp-std.c:223
+#, c-format
+msgid "cannot read ELF core file: %s"
+msgstr ""
+
+#: libdwfl/argp-std.c:241
+msgid "No modules recognized in core file"
+msgstr ""
+
+#: libdwfl/argp-std.c:253
+msgid "cannot load kernel symbols"
+msgstr ""
+
+#: libdwfl/argp-std.c:257
+msgid "cannot find kernel modules"
+msgstr ""
+
+#: libdwfl/argp-std.c:271
+msgid "cannot find kernel or modules"
+msgstr ""
+
+#: libdwfl/libdwflP.h:73
+msgid "See errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:74
+msgid "See elf_errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:75
+msgid "See dwarf_errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:76
+msgid "See ebl_errno (XXX missing)"
+msgstr ""
+
+#: libdwfl/libdwflP.h:77
+msgid "gzip decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:78
+msgid "bzip2 decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:79
+msgid "LZMA decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:80
+msgid "no support library found for machine"
+msgstr ""
+
+#: libdwfl/libdwflP.h:81
+msgid "Callbacks missing for ET_REL file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:82
+msgid "Unsupported relocation type"
+msgstr ""
+
+#: libdwfl/libdwflP.h:83
+msgid "r_offset is bogus"
+msgstr ""
+
+#: libdwfl/libdwflP.h:84 libelf/elf_error.c:132 libelf/elf_error.c:192
+msgid "offset out of range"
+msgstr ""
+
+#: libdwfl/libdwflP.h:85
+msgid "relocation refers to undefined symbol"
+msgstr ""
+
+#: libdwfl/libdwflP.h:86
+msgid "Callback returned failure"
+msgstr ""
+
+#: libdwfl/libdwflP.h:87
+msgid "No DWARF information found"
+msgstr ""
+
+#: libdwfl/libdwflP.h:88
+msgid "No symbol table found"
+msgstr ""
+
+#: libdwfl/libdwflP.h:89
+msgid "No ELF program headers"
+msgstr ""
+
+#: libdwfl/libdwflP.h:90
+msgid "address range overlaps an existing module"
+msgstr ""
+
+#: libdwfl/libdwflP.h:93
+msgid "image truncated"
+msgstr ""
+
+#: libdwfl/libdwflP.h:94
+msgid "ELF file opened"
+msgstr ""
+
+#: libdwfl/libdwflP.h:95
+msgid "not a valid ELF file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:96
+msgid "cannot handle DWARF type description"
+msgstr ""
+
+#: libebl/eblbackendname.c:63
+msgid "No backend"
+msgstr ""
+
+#: libebl/eblcorenotetypename.c:107 libebl/eblobjecttypename.c:78
+#: libebl/eblobjnotetypename.c:86 libebl/eblosabiname.c:98
+#: libebl/eblsectionname.c:110 libebl/eblsectiontypename.c:140
+#: libebl/eblsegmenttypename.c:104
+msgid "<unknown>"
+msgstr ""
+
+#: libebl/ebldynamictagname.c:126
+#, c-format
+msgid "<unknown>: %#<PRIx64>"
+msgstr ""
+
+#: libebl/eblobjnote.c:76
+#, c-format
+msgid " Build ID: "
+msgstr ""
+
+#: libebl/eblobjnote.c:87
+#, c-format
+msgid " Linker version: %.*s\n"
+msgstr ""
+
+#: libebl/eblobjnote.c:136
+#, c-format
+msgid " OS: %s, ABI: "
+msgstr ""
+
+#: libebl/eblosabiname.c:95
+msgid "Stand alone"
+msgstr ""
+
+#: libebl/eblsymbolbindingname.c:92 libebl/eblsymboltypename.c:98
+#, c-format
+msgid "<unknown>: %d"
+msgstr ""
+
+#: libelf/elf_error.c:88
+msgid "unknown version"
+msgstr ""
+
+#: libelf/elf_error.c:92
+msgid "unknown type"
+msgstr ""
+
+#: libelf/elf_error.c:96
+msgid "invalid `Elf' handle"
+msgstr ""
+
+#: libelf/elf_error.c:100
+msgid "invalid size of source operand"
+msgstr ""
+
+#: libelf/elf_error.c:104
+msgid "invalid size of destination operand"
+msgstr ""
+
+#: libelf/elf_error.c:108 src/readelf.c:4779
+#, c-format
+msgid "invalid encoding"
+msgstr ""
+
+#: libelf/elf_error.c:116
+msgid "invalid file descriptor"
+msgstr ""
+
+#: libelf/elf_error.c:120
+msgid "invalid operation"
+msgstr ""
+
+#: libelf/elf_error.c:124
+msgid "ELF version not set"
+msgstr ""
+
+#: libelf/elf_error.c:136
+msgid "invalid fmag field in archive header"
+msgstr ""
+
+#: libelf/elf_error.c:140
+msgid "invalid archive file"
+msgstr ""
+
+#: libelf/elf_error.c:144
+msgid "descriptor is not for an archive"
+msgstr ""
+
+#: libelf/elf_error.c:148
+msgid "no index available"
+msgstr ""
+
+#: libelf/elf_error.c:152
+msgid "cannot read data from file"
+msgstr ""
+
+#: libelf/elf_error.c:156
+msgid "cannot write data to file"
+msgstr ""
+
+#: libelf/elf_error.c:160
+msgid "invalid binary class"
+msgstr ""
+
+#: libelf/elf_error.c:164
+msgid "invalid section index"
+msgstr ""
+
+#: libelf/elf_error.c:168
+msgid "invalid operand"
+msgstr ""
+
+#: libelf/elf_error.c:172
+msgid "invalid section"
+msgstr ""
+
+#: libelf/elf_error.c:180
+msgid "executable header not created first"
+msgstr ""
+
+#: libelf/elf_error.c:184
+msgid "file descriptor disabled"
+msgstr ""
+
+#: libelf/elf_error.c:188
+msgid "archive/member file descriptor mismatch"
+msgstr ""
+
+#: libelf/elf_error.c:196
+msgid "cannot manipulate null section"
+msgstr ""
+
+#: libelf/elf_error.c:200
+msgid "data/scn mismatch"
+msgstr ""
+
+#: libelf/elf_error.c:204
+msgid "invalid section header"
+msgstr ""
+
+#: libelf/elf_error.c:208 src/readelf.c:6242 src/readelf.c:6343
+#, c-format
+msgid "invalid data"
+msgstr ""
+
+#: libelf/elf_error.c:212
+msgid "unknown data encoding"
+msgstr ""
+
+#: libelf/elf_error.c:216
+msgid "section `sh_size' too small for data"
+msgstr ""
+
+#: libelf/elf_error.c:220
+msgid "invalid section alignment"
+msgstr ""
+
+#: libelf/elf_error.c:224
+msgid "invalid section entry size"
+msgstr ""
+
+#: libelf/elf_error.c:228
+msgid "update() for write on read-only file"
+msgstr ""
+
+#: libelf/elf_error.c:232
+msgid "no such file"
+msgstr ""
+
+#: libelf/elf_error.c:236
+msgid "only relocatable files can contain section groups"
+msgstr ""
+
+#: libelf/elf_error.c:241
+msgid ""
+"program header only allowed in executables, shared objects, and core files"
+msgstr ""
+
+#: libelf/elf_error.c:248
+msgid "file has no program header"
+msgstr ""
+
+#: src/addr2line.c:66
+msgid "Output selection options:"
+msgstr ""
+
+#: src/addr2line.c:67
+msgid "Show only base names of source files"
+msgstr ""
+
+#: src/addr2line.c:69
+msgid "Show absolute file names using compilation directory"
+msgstr ""
+
+#: src/addr2line.c:70
+msgid "Also show function names"
+msgstr ""
+
+#: src/addr2line.c:71
+msgid "Also show symbol or section names"
+msgstr ""
+
+#: src/addr2line.c:73
+msgid "Treat addresses as offsets relative to NAME section."
+msgstr ""
+
+#: src/addr2line.c:75 src/elfcmp.c:75 src/findtextrel.c:75 src/nm.c:103
+#: src/strings.c:83
+msgid "Miscellaneous:"
+msgstr ""
+
+#: src/addr2line.c:84
+msgid ""
+"Locate source files and line information for ADDRs (in a.out by default)."
+msgstr ""
+
+#: src/addr2line.c:88
+msgid "[ADDR...]"
+msgstr ""
+
+#: src/addr2line.c:185 src/ar.c:289 src/elfcmp.c:555 src/elflint.c:239
+#: src/findtextrel.c:170 src/ld.c:957 src/nm.c:253 src/objdump.c:181
+#: src/ranlib.c:136 src/readelf.c:449 src/size.c:219 src/strings.c:227
+#: src/strip.c:204 src/unstrip.c:234
+#, c-format
+msgid ""
+"Copyright (C) %s Red Hat, Inc.\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+
+#: src/addr2line.c:190 src/ar.c:294 src/elfcmp.c:560 src/elflint.c:244
+#: src/findtextrel.c:175 src/ld.c:962 src/nm.c:258 src/objdump.c:186
+#: src/ranlib.c:141 src/readelf.c:454 src/size.c:224 src/strings.c:232
+#: src/strip.c:209 src/unstrip.c:239
+#, c-format
+msgid "Written by %s.\n"
+msgstr ""
+
+#: src/addr2line.c:405
+#, c-format
+msgid "Section syntax requires exactly one module"
+msgstr ""
+
+#: src/addr2line.c:428
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside section '%s'"
+msgstr ""
+
+#: src/addr2line.c:461
+#, c-format
+msgid "cannot find symbol '%s'"
+msgstr ""
+
+#: src/addr2line.c:466
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
+msgstr ""
+
+#: src/ar.c:76
+msgid "Commands:"
+msgstr ""
+
+#: src/ar.c:77
+msgid "Delete files from archive."
+msgstr ""
+
+#: src/ar.c:78
+msgid "Move files in archive."
+msgstr ""
+
+#: src/ar.c:79
+msgid "Print files in archive."
+msgstr ""
+
+#: src/ar.c:80
+msgid "Quick append files to archive."
+msgstr ""
+
+#: src/ar.c:82
+msgid "Replace existing or insert new file into archive."
+msgstr ""
+
+#: src/ar.c:83
+msgid "Display content of archive."
+msgstr ""
+
+#: src/ar.c:84
+msgid "Extract files from archive."
+msgstr ""
+
+#: src/ar.c:86
+msgid "Command Modifiers:"
+msgstr ""
+
+#: src/ar.c:87
+msgid "Preserve original dates."
+msgstr ""
+
+#: src/ar.c:88
+msgid "Use instance [COUNT] of name."
+msgstr ""
+
+#: src/ar.c:90
+msgid "Do not replace existing files with extracted files."
+msgstr ""
+
+#: src/ar.c:91
+msgid "Allow filename to be truncated if necessary."
+msgstr ""
+
+#: src/ar.c:93
+msgid "Provide verbose output."
+msgstr ""
+
+#: src/ar.c:94
+msgid "Force regeneration of symbol table."
+msgstr ""
+
+#: src/ar.c:95
+msgid "Insert file after [MEMBER]."
+msgstr ""
+
+#: src/ar.c:96
+msgid "Insert file before [MEMBER]."
+msgstr ""
+
+#: src/ar.c:97
+msgid "Same as -b."
+msgstr ""
+
+#: src/ar.c:98
+msgid "Suppress message when library has to be created."
+msgstr ""
+
+#: src/ar.c:100
+msgid "Use full path for file matching."
+msgstr ""
+
+#: src/ar.c:101
+msgid "Update only older files in archive."
+msgstr ""
+
+#: src/ar.c:107
+msgid "Create, modify, and extract from archives."
+msgstr ""
+
+#: src/ar.c:110
+msgid "[MEMBER] [COUNT] ARCHIVE [FILE...]"
+msgstr ""
+
+#: src/ar.c:192
+#, c-format
+msgid "'a', 'b', and 'i' are only allowed with the 'm' and 'r' options"
+msgstr ""
+
+#: src/ar.c:197
+#, c-format
+msgid "MEMBER parameter required for 'a', 'b', and 'i' modifiers"
+msgstr ""
+
+#: src/ar.c:213
+#, c-format
+msgid "'N' is only meaningful with the 'x' and 'd' options"
+msgstr ""
+
+#: src/ar.c:218
+#, c-format
+msgid "COUNT parameter required"
+msgstr ""
+
+#: src/ar.c:230
+#, c-format
+msgid "invalid COUNT parameter %s"
+msgstr ""
+
+#: src/ar.c:237
+#, c-format
+msgid "'%c' is only meaningful with the 'x' option"
+msgstr ""
+
+#: src/ar.c:243
+#, c-format
+msgid "archive name required"
+msgstr ""
+
+#: src/ar.c:314
+#, c-format
+msgid "More than one operation specified"
+msgstr ""
+
+#: src/ar.c:404
+#, c-format
+msgid "cannot open archive '%s'"
+msgstr ""
+
+#: src/ar.c:414
+#, c-format
+msgid "cannot open archive '%s': %s"
+msgstr ""
+
+#: src/ar.c:418
+#, c-format
+msgid "%s: not an archive file"
+msgstr ""
+
+#: src/ar.c:422
+#, c-format
+msgid "cannot stat archive '%s'"
+msgstr ""
+
+#: src/ar.c:434
+#, c-format
+msgid "no entry %s in archive\n"
+msgstr ""
+
+#: src/ar.c:487 src/ar.c:929 src/ar.c:1129
+#, c-format
+msgid "cannot create hash table"
+msgstr ""
+
+#: src/ar.c:494 src/ar.c:936 src/ar.c:1138
+#, c-format
+msgid "cannot insert into hash table"
+msgstr ""
+
+#: src/ar.c:502 src/ranlib.c:176
+#, c-format
+msgid "cannot stat '%s'"
+msgstr ""
+
+#: src/ar.c:598
+#, c-format
+msgid "cannot read content of %s: %s"
+msgstr ""
+
+#: src/ar.c:641
+#, c-format
+msgid "cannot open %.*s"
+msgstr ""
+
+#: src/ar.c:663
+#, c-format
+msgid "failed to write %s"
+msgstr ""
+
+#: src/ar.c:675
+#, c-format
+msgid "cannot change mode of %s"
+msgstr ""
+
+#: src/ar.c:691
+#, c-format
+msgid "cannot change modification time of %s"
+msgstr ""
+
+#: src/ar.c:737
+#, c-format
+msgid "cannot rename temporary file to %.*s"
+msgstr ""
+
+#: src/ar.c:773 src/ar.c:1021 src/ar.c:1419 src/ranlib.c:250
+#, c-format
+msgid "cannot create new file"
+msgstr ""
+
+#: src/ar.c:1220
+#, c-format
+msgid "position member %s not found"
+msgstr ""
+
+#: src/ar.c:1230
+#, c-format
+msgid "%s: no entry %s in archive!\n"
+msgstr ""
+
+#: src/ar.c:1259 src/ldgeneric.c:519 src/objdump.c:257
+#, c-format
+msgid "cannot open %s"
+msgstr ""
+
+#: src/ar.c:1264
+#, c-format
+msgid "cannot stat %s"
+msgstr ""
+
+#: src/ar.c:1270
+#, c-format
+msgid "%s is no regular file"
+msgstr ""
+
+#: src/ar.c:1283
+#, c-format
+msgid "cannot get ELF descriptor for %s: %s\n"
+msgstr ""
+
+#: src/ar.c:1302
+#, c-format
+msgid "cannot read %s: %s"
+msgstr ""
+
+#: src/arlib.c:215
+#, c-format
+msgid "the archive '%s' is too large"
+msgstr ""
+
+#: src/arlib.c:228
+#, c-format
+msgid "cannot read ELF header of %s(%s): %s"
+msgstr ""
+
+#: src/elfcmp.c:69
+msgid "Control options:"
+msgstr ""
+
+#: src/elfcmp.c:70
+msgid ""
+"Control treatment of gaps in loadable segments [ignore|match] (default: "
+"ignore)"
+msgstr ""
+
+#: src/elfcmp.c:72
+msgid "Ignore permutation of buckets in SHT_HASH section"
+msgstr ""
+
+#: src/elfcmp.c:73
+msgid "Output nothing; yield exit status only"
+msgstr ""
+
+#: src/elfcmp.c:80
+msgid "Compare relevant parts of two ELF files for equality."
+msgstr ""
+
+#: src/elfcmp.c:84
+msgid "FILE1 FILE2"
+msgstr ""
+
+#: src/elfcmp.c:140
+msgid "Invalid number of parameters.\n"
+msgstr ""
+
+#: src/elfcmp.c:168 src/elfcmp.c:173
+#, c-format
+msgid "cannot get ELF header of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:190
+#, c-format
+msgid "%s %s diff: ELF header"
+msgstr ""
+
+#: src/elfcmp.c:198 src/elfcmp.c:201
+#, c-format
+msgid "cannot get section count of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:206
+#, c-format
+msgid "%s %s diff: section count"
+msgstr ""
+
+#: src/elfcmp.c:214 src/elfcmp.c:217
+#, c-format
+msgid "cannot get program header count of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:222
+#, c-format
+msgid "%s %s diff: program header count"
+msgstr ""
+
+#: src/elfcmp.c:281
+#, c-format
+msgid "%s %s differ: section header"
+msgstr ""
+
+#: src/elfcmp.c:309 src/elfcmp.c:315
+#, c-format
+msgid "cannot get content of section %zu in '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:331 src/elfcmp.c:337
+#, c-format
+msgid "cannot get symbol in '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:358
+#, c-format
+msgid "%s %s differ: symbol table [%zu]"
+msgstr ""
+
+#: src/elfcmp.c:361
+#, c-format
+msgid "%s %s differ: symbol table [%zu,%zu]"
+msgstr ""
+
+#: src/elfcmp.c:409
+#, c-format
+msgid "%s %s differ: section [%zu] '%s' content"
+msgstr ""
+
+#: src/elfcmp.c:413
+#, c-format
+msgid "%s %s differ: section [%zu,%zu] '%s' content"
+msgstr ""
+
+#: src/elfcmp.c:429
+#, c-format
+msgid "%s %s differ: unequal amount of important sections"
+msgstr ""
+
+#: src/elfcmp.c:463 src/elfcmp.c:468
+#, c-format
+msgid "cannot load data of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:487 src/elfcmp.c:493
+#, c-format
+msgid "cannot get program header entry %d of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:499
+#, c-format
+msgid "%s %s differ: program header %d"
+msgstr ""
+
+#: src/elfcmp.c:524
+#, c-format
+msgid "%s %s differ: gap"
+msgstr ""
+
+#: src/elfcmp.c:583
+#, c-format
+msgid "Invalid value '%s' for --gaps parameter."
+msgstr ""
+
+#: src/elfcmp.c:607 src/findtextrel.c:229 src/ldgeneric.c:1767
+#: src/ldgeneric.c:4257 src/nm.c:363 src/ranlib.c:169 src/size.c:301
+#: src/strings.c:183 src/strip.c:433 src/strip.c:468 src/unstrip.c:1900
+#: src/unstrip.c:1929
+#, c-format
+msgid "cannot open '%s'"
+msgstr ""
+
+#: src/elfcmp.c:611 src/findtextrel.c:236 src/ranlib.c:186
+#, c-format
+msgid "cannot create ELF descriptor for '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:616
+#, c-format
+msgid "cannot create EBL descriptor for '%s'"
+msgstr ""
+
+#: src/elfcmp.c:634
+#, c-format
+msgid "cannot get section header of section %zu: %s"
+msgstr ""
+
+#: src/elfcmp.c:644
+#, c-format
+msgid "cannot get content of section %zu: %s"
+msgstr ""
+
+#: src/elfcmp.c:654 src/elfcmp.c:668
+#, c-format
+msgid "cannot get relocation: %s"
+msgstr ""
+
+#: src/elflint.c:72
+msgid "Be extremely strict, flag level 2 features."
+msgstr ""
+
+#: src/elflint.c:73
+msgid "Do not print anything if successful"
+msgstr ""
+
+#: src/elflint.c:74
+msgid "Binary is a separate debuginfo file"
+msgstr ""
+
+#: src/elflint.c:76
+msgid ""
+"Binary has been created with GNU ld and is therefore known to be broken in "
+"certain ways"
+msgstr ""
+
+#: src/elflint.c:82
+msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
+msgstr ""
+
+#: src/elflint.c:86 src/readelf.c:118
+msgid "FILE..."
+msgstr ""
+
+#: src/elflint.c:159 src/readelf.c:272
+#, c-format
+msgid "cannot open input file"
+msgstr ""
+
+#: src/elflint.c:166
+#, c-format
+msgid "cannot generate Elf descriptor: %s\n"
+msgstr ""
+
+#: src/elflint.c:185
+#, c-format
+msgid "error while closing Elf descriptor: %s\n"
+msgstr ""
+
+#: src/elflint.c:189
+msgid "No errors"
+msgstr ""
+
+#: src/elflint.c:223 src/readelf.c:425
+msgid "Missing file name.\n"
+msgstr ""
+
+#: src/elflint.c:302
+#, c-format
+msgid " error while freeing sub-ELF descriptor: %s\n"
+msgstr ""
+
+#: src/elflint.c:310
+#, c-format
+msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
+msgstr ""
+
+#: src/elflint.c:370
+#, c-format
+msgid "e_ident[%d] == %d is no known class\n"
+msgstr ""
+
+#: src/elflint.c:375
+#, c-format
+msgid "e_ident[%d] == %d is no known data encoding\n"
+msgstr ""
+
+#: src/elflint.c:379
+#, c-format
+msgid "unknown ELF header version number e_ident[%d] == %d\n"
+msgstr ""
+
+#: src/elflint.c:385
+#, c-format
+msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
+msgstr ""
+
+#: src/elflint.c:391
+#, c-format
+msgid "unsupport ABI version e_ident[%d] == %d\n"
+msgstr ""
+
+#: src/elflint.c:396
+#, c-format
+msgid "e_ident[%zu] is not zero\n"
+msgstr ""
+
+#: src/elflint.c:401
+#, c-format
+msgid "unknown object file type %d\n"
+msgstr ""
+
+#: src/elflint.c:408
+#, c-format
+msgid "unknown machine type %d\n"
+msgstr ""
+
+#: src/elflint.c:412
+#, c-format
+msgid "unknown object file version\n"
+msgstr ""
+
+#: src/elflint.c:418
+#, c-format
+msgid "invalid program header offset\n"
+msgstr ""
+
+#: src/elflint.c:420
+#, c-format
+msgid "executables and DSOs cannot have zero program header offset\n"
+msgstr ""
+
+#: src/elflint.c:424
+#, c-format
+msgid "invalid number of program header entries\n"
+msgstr ""
+
+#: src/elflint.c:432
+#, c-format
+msgid "invalid section header table offset\n"
+msgstr ""
+
+#: src/elflint.c:435
+#, c-format
+msgid "section header table must be present\n"
+msgstr ""
+
+#: src/elflint.c:449
+#, c-format
+msgid "invalid number of section header table entries\n"
+msgstr ""
+
+#: src/elflint.c:466
+#, c-format
+msgid "invalid section header index\n"
+msgstr ""
+
+#: src/elflint.c:480
+#, c-format
+msgid "invalid number of program header table entries\n"
+msgstr ""
+
+#: src/elflint.c:489
+#, c-format
+msgid "invalid machine flags: %s\n"
+msgstr ""
+
+#: src/elflint.c:496 src/elflint.c:513
+#, c-format
+msgid "invalid ELF header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:499 src/elflint.c:516
+#, c-format
+msgid "invalid program header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:502 src/elflint.c:519
+#, c-format
+msgid "invalid program header position or size\n"
+msgstr ""
+
+#: src/elflint.c:505 src/elflint.c:522
+#, c-format
+msgid "invalid section header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:508 src/elflint.c:525
+#, c-format
+msgid "invalid section header position or size\n"
+msgstr ""
+
+#: src/elflint.c:569
+#, c-format
+msgid ""
+"section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
+"group\n"
+msgstr ""
+
+#: src/elflint.c:573
+#, c-format
+msgid ""
+"section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
+msgstr ""
+
+#: src/elflint.c:589 src/elflint.c:1432 src/elflint.c:1482 src/elflint.c:1591
+#: src/elflint.c:2185 src/elflint.c:2699 src/elflint.c:2860 src/elflint.c:2990
+#: src/elflint.c:3162 src/elflint.c:4062
+#, c-format
+msgid "section [%2d] '%s': cannot get section data\n"
+msgstr ""
+
+#: src/elflint.c:602 src/elflint.c:1598
+#, 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:625
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol table cannot have more than one extended index "
+"section\n"
+msgstr ""
+
+#: src/elflint.c:636
+#, c-format
+msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
+msgstr ""
+
+#: src/elflint.c:645
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
+msgstr ""
+
+#: src/elflint.c:650 src/elflint.c:653 src/elflint.c:656 src/elflint.c:659
+#: src/elflint.c:662 src/elflint.c:665
+#, c-format
+msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
+msgstr ""
+
+#: src/elflint.c:668
+#, c-format
+msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
+msgstr ""
+
+#: src/elflint.c:678
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:687
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
+msgstr ""
+
+#: src/elflint.c:700
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: too large section index but no extended "
+"section index section\n"
+msgstr ""
+
+#: src/elflint.c:706
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
+"st_shndx (%<PRIu32>)\n"
+msgstr ""
+
+#: src/elflint.c:718
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
+msgstr ""
+
+#: src/elflint.c:726
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown type\n"
+msgstr ""
+
+#: src/elflint.c:732
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
+msgstr ""
+
+#: src/elflint.c:737
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
+msgstr ""
+
+#: src/elflint.c:745
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
+msgstr ""
+
+#: src/elflint.c:749
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
+msgstr ""
+
+#: src/elflint.c:753
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
+msgstr ""
+
+#: src/elflint.c:785
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:791 src/elflint.c:816 src/elflint.c:859
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu does not fit completely in referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:800
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
+"SHF_TLS flag set\n"
+msgstr ""
+
+#: src/elflint.c:810 src/elflint.c:852
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:837
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
+msgstr ""
+
+#: src/elflint.c:845
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:872
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+
+#: src/elflint.c:879
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+
+#: src/elflint.c:886
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
+msgstr ""
+
+#: src/elflint.c:936
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section [%"
+"2d]\n"
+msgstr ""
+
+#: src/elflint.c:943
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:959
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
+"match %s section address %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:966
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
+"match %s section size %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:974
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
+"section\n"
+msgstr ""
+
+#: src/elflint.c:990
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
+"segment address %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:997
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
+"segment size %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:1010
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
+"default visibility\n"
+msgstr ""
+
+#: src/elflint.c:1014
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
+msgstr ""
+
+#: src/elflint.c:1059
+#, c-format
+msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
+msgstr ""
+
+#: src/elflint.c:1068 src/elflint.c:1120
+#, c-format
+msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
+msgstr ""
+
+#: src/elflint.c:1093 src/elflint.c:1145
+#, c-format
+msgid ""
+"section [%2d] '%s': relative relocations after index %d as specified by "
+"DT_RELCOUNT\n"
+msgstr ""
+
+#: src/elflint.c:1099 src/elflint.c:1151
+#, c-format
+msgid ""
+"section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
+"specified %d relative relocations\n"
+msgstr ""
+
+#: src/elflint.c:1111
+#, c-format
+msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
+msgstr ""
+
+#: src/elflint.c:1193
+#, c-format
+msgid "section [%2d] '%s': invalid destination section index\n"
+msgstr ""
+
+#: src/elflint.c:1206
+#, c-format
+msgid "section [%2d] '%s': invalid destination section type\n"
+msgstr ""
+
+#: src/elflint.c:1214
+#, c-format
+msgid "section [%2d] '%s': sh_info should be zero\n"
+msgstr ""
+
+#: src/elflint.c:1221
+#, c-format
+msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
+msgstr ""
+
+#: src/elflint.c:1228
+#, c-format
+msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
+msgstr ""
+
+#: src/elflint.c:1288
+#, c-format
+msgid "text relocation flag set but there is no read-only segment\n"
+msgstr ""
+
+#: src/elflint.c:1315
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid type\n"
+msgstr ""
+
+#: src/elflint.c:1323
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: relocation type invalid for the file "
+"type\n"
+msgstr ""
+
+#: src/elflint.c:1331
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
+msgstr ""
+
+#: src/elflint.c:1349
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
+"be used with %s\n"
+msgstr ""
+
+#: src/elflint.c:1366
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:1381
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: copy relocation against symbol of type %"
+"s\n"
+msgstr ""
+
+#: src/elflint.c:1402
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: read-only section modified but text "
+"relocation flag not set\n"
+msgstr ""
+
+#: src/elflint.c:1417
+#, c-format
+msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
+msgstr ""
+
+#: src/elflint.c:1456 src/elflint.c:1506
+#, c-format
+msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:1586
+#, c-format
+msgid "more than one dynamic section present\n"
+msgstr ""
+
+#: src/elflint.c:1604
+#, c-format
+msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
+msgstr ""
+
+#: src/elflint.c:1609 src/elflint.c:1901
+#, c-format
+msgid "section [%2d] '%s': sh_info not zero\n"
+msgstr ""
+
+#: src/elflint.c:1619
+#, c-format
+msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:1627
+#, c-format
+msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
+msgstr ""
+
+#: src/elflint.c:1634
+#, c-format
+msgid "section [%2d] '%s': entry %zu: unknown tag\n"
+msgstr ""
+
+#: src/elflint.c:1645
+#, c-format
+msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
+msgstr ""
+
+#: src/elflint.c:1655
+#, c-format
+msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
+msgstr ""
+
+#: src/elflint.c:1673
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
+msgstr ""
+
+#: src/elflint.c:1695
+#, 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:1738
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:1753
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must be valid offset in section [%"
+"2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:1773 src/elflint.c:1801
+#, c-format
+msgid "section [%2d] '%s': contains %s entry but not %s\n"
+msgstr ""
+
+#: src/elflint.c:1785
+#, c-format
+msgid "section [%2d] '%s': mandatory tag %s not present\n"
+msgstr ""
+
+#: src/elflint.c:1794
+#, c-format
+msgid "section [%2d] '%s': no hash section present\n"
+msgstr ""
+
+#: src/elflint.c:1809 src/elflint.c:1816
+#, c-format
+msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
+msgstr ""
+
+#: src/elflint.c:1826 src/elflint.c:1830
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
+msgstr ""
+
+#: src/elflint.c:1836
+#, c-format
+msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
+msgstr ""
+
+#: src/elflint.c:1847 src/elflint.c:1851 src/elflint.c:1855 src/elflint.c:1859
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
+msgstr ""
+
+#: src/elflint.c:1871
+#, c-format
+msgid ""
+"section [%2d] '%s': only relocatable files can have extended section index\n"
+msgstr ""
+
+#: src/elflint.c:1881
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index section not for symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1886
+#, c-format
+msgid "cannot get data for symbol section\n"
+msgstr ""
+
+#: src/elflint.c:1889
+#, c-format
+msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
+msgstr ""
+
+#: src/elflint.c:1896
+#, c-format
+msgid "section [%2d] '%s': extended index table too small for symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1911
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
+"same symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1922
+#, c-format
+msgid "symbol 0 should have zero extended section index\n"
+msgstr ""
+
+#: src/elflint.c:1934
+#, c-format
+msgid "cannot get data for symbol %zu\n"
+msgstr ""
+
+#: src/elflint.c:1939
+#, c-format
+msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
+msgstr ""
+
+#: src/elflint.c:1955 src/elflint.c:1996
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
+msgstr ""
+
+#: src/elflint.c:1967 src/elflint.c:2008
+#, c-format
+msgid "section [%2d] '%s': chain array too large\n"
+msgstr ""
+
+#: src/elflint.c:1976 src/elflint.c:2017
+#, c-format
+msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:1982
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2023
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2038
+#, c-format
+msgid "section [%2d] '%s': bitmask size not power of 2: %u\n"
+msgstr ""
+
+#: src/elflint.c:2049
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected at "
+"least%ld)\n"
+msgstr ""
+
+#: src/elflint.c:2057
+#, c-format
+msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
+msgstr ""
+
+#: src/elflint.c:2089
+#, c-format
+msgid ""
+"section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
+msgstr ""
+
+#: src/elflint.c:2110
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
+"undefined\n"
+msgstr ""
+
+#: src/elflint.c:2121
+#, c-format
+msgid ""
+"section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
+msgstr ""
+
+#: src/elflint.c:2152
+#, c-format
+msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2157
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2163
+#, c-format
+msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
+msgstr ""
+
+#: src/elflint.c:2176
+#, c-format
+msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
+msgstr ""
+
+#: src/elflint.c:2194
+#, c-format
+msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
+msgstr ""
+
+#: src/elflint.c:2202
+#, c-format
+msgid "section [%2d] '%s': hash table entry size incorrect\n"
+msgstr ""
+
+#: src/elflint.c:2207
+#, c-format
+msgid "section [%2d] '%s': not marked to be allocated\n"
+msgstr ""
+
+#: src/elflint.c:2212
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table has not even room for initial administrative "
+"entries\n"
+msgstr ""
+
+#: src/elflint.c:2260
+#, c-format
+msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
+msgstr ""
+
+#: src/elflint.c:2338 src/elflint.c:2342
+#, c-format
+msgid "section [%2zu] '%s': reference to symbol index 0\n"
+msgstr ""
+
+#: src/elflint.c:2349
+#, 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:2361
+#, 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:2377
+#, c-format
+msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
+msgstr ""
+
+#: src/elflint.c:2397
+#, c-format
+msgid ""
+"section [%2d] '%s': section groups only allowed in relocatable object files\n"
+msgstr ""
+
+#: src/elflint.c:2408
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol table: %s\n"
+msgstr ""
+
+#: src/elflint.c:2413
+#, c-format
+msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
+msgstr ""
+
+#: src/elflint.c:2419
+#, c-format
+msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
+msgstr ""
+
+#: src/elflint.c:2424
+#, c-format
+msgid "section [%2d] '%s': sh_flags not zero\n"
+msgstr ""
+
+#: src/elflint.c:2431
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol for signature\n"
+msgstr ""
+
+#: src/elflint.c:2436
+#, c-format
+msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
+msgstr ""
+
+#: src/elflint.c:2442
+#, c-format
+msgid "section [%2d] '%s': sh_flags not set correctly\n"
+msgstr ""
+
+#: src/elflint.c:2448
+#, c-format
+msgid "section [%2d] '%s': cannot get data: %s\n"
+msgstr ""
+
+#: src/elflint.c:2457
+#, c-format
+msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
+msgstr ""
+
+#: src/elflint.c:2462
+#, c-format
+msgid "section [%2d] '%s': section group without flags word\n"
+msgstr ""
+
+#: src/elflint.c:2468
+#, c-format
+msgid "section [%2d] '%s': section group without member\n"
+msgstr ""
+
+#: src/elflint.c:2472
+#, c-format
+msgid "section [%2d] '%s': section group with only one member\n"
+msgstr ""
+
+#: src/elflint.c:2483
+#, c-format
+msgid "section [%2d] '%s': unknown section group flags\n"
+msgstr ""
+
+#: src/elflint.c:2495
+#, c-format
+msgid "section [%2d] '%s': section index %Zu out of range\n"
+msgstr ""
+
+#: src/elflint.c:2504
+#, c-format
+msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:2511
+#, c-format
+msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:2517
+#, c-format
+msgid ""
+"section [%2d] '%s': element %Zu references section [%2d] '%s' without "
+"SHF_GROUP flag set\n"
+msgstr ""
+
+#: src/elflint.c:2524
+#, c-format
+msgid "section [%2d] '%s' is contained in more than one section group\n"
+msgstr ""
+
+#: src/elflint.c:2713
+#, 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:2724
+#, c-format
+msgid ""
+"section [%2d] '%s' has different number of entries than symbol table [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:2740
+#, c-format
+msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
+msgstr ""
+
+#: src/elflint.c:2756
+#, c-format
+msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
+msgstr ""
+
+#: src/elflint.c:2764
+#, c-format
+msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
+msgstr ""
+
+#: src/elflint.c:2778
+#, c-format
+msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
+msgstr ""
+
+#: src/elflint.c:2783
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %d: version index %d is for defined version\n"
+msgstr ""
+
+#: src/elflint.c:2793
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %d: version index %d is for requested version\n"
+msgstr ""
+
+#: src/elflint.c:2845
+#, c-format
+msgid "more than one version reference section present\n"
+msgstr ""
+
+#: src/elflint.c:2853 src/elflint.c:2982
+#, c-format
+msgid "section [%2d] '%s': sh_link does not link to string table\n"
+msgstr ""
+
+#: src/elflint.c:2876 src/elflint.c:3034
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong version %d\n"
+msgstr ""
+
+#: src/elflint.c:2882 src/elflint.c:3040
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:2890
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid file reference\n"
+msgstr ""
+
+#: src/elflint.c:2898
+#, c-format
+msgid "section [%2d] '%s': entry %d references unknown dependency\n"
+msgstr ""
+
+#: src/elflint.c:2910
+#, c-format
+msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
+msgstr ""
+
+#: src/elflint.c:2917
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
+"reference\n"
+msgstr ""
+
+#: src/elflint.c:2924
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: %"
+"#x, expected %#x\n"
+msgstr ""
+
+#: src/elflint.c:2934
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
+"name '%s'\n"
+msgstr ""
+
+#: src/elflint.c:2945
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
+msgstr ""
+
+#: src/elflint.c:2961 src/elflint.c:3119
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
+msgstr ""
+
+#: src/elflint.c:2974
+#, c-format
+msgid "more than one version definition section present\n"
+msgstr ""
+
+#: src/elflint.c:3019
+#, c-format
+msgid "section [%2d] '%s': more than one BASE definition\n"
+msgstr ""
+
+#: src/elflint.c:3023
+#, c-format
+msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
+msgstr ""
+
+#: src/elflint.c:3029
+#, c-format
+msgid "section [%2d] '%s': entry %d has unknown flag\n"
+msgstr ""
+
+#: src/elflint.c:3053
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid name reference\n"
+msgstr ""
+
+#: src/elflint.c:3060
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
+msgstr ""
+
+#: src/elflint.c:3069
+#, c-format
+msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
+msgstr ""
+
+#: src/elflint.c:3088
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:3103
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:3125
+#, c-format
+msgid "section [%2d] '%s': no BASE definition\n"
+msgstr ""
+
+#: src/elflint.c:3141
+#, c-format
+msgid "section [%2d] '%s': unknown parent version '%s'\n"
+msgstr ""
+
+#: src/elflint.c:3154
+#, c-format
+msgid "section [%2d] '%s': empty object attributes section\n"
+msgstr ""
+
+#: src/elflint.c:3175
+#, c-format
+msgid "section [%2d] '%s': unrecognized attribute format\n"
+msgstr ""
+
+#: src/elflint.c:3191
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: zero length field in attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3200
+#, c-format
+msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3212
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
+msgstr ""
+
+#: src/elflint.c:3229
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
+msgstr ""
+
+#: src/elflint.c:3238
+#, c-format
+msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3247
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
+msgstr ""
+
+#: src/elflint.c:3260
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
+msgstr ""
+
+#: src/elflint.c:3271
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
+msgstr ""
+
+#: src/elflint.c:3289
+#, c-format
+msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
+msgstr ""
+
+#: src/elflint.c:3300
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
+msgstr ""
+
+#: src/elflint.c:3313
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
+msgstr ""
+
+#: src/elflint.c:3317
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:3327
+#, c-format
+msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
+msgstr ""
+
+#: src/elflint.c:3333
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3422
+#, c-format
+msgid "cannot get section header of zeroth section\n"
+msgstr ""
+
+#: src/elflint.c:3426
+#, c-format
+msgid "zeroth section has nonzero name\n"
+msgstr ""
+
+#: src/elflint.c:3428
+#, c-format
+msgid "zeroth section has nonzero type\n"
+msgstr ""
+
+#: src/elflint.c:3430
+#, c-format
+msgid "zeroth section has nonzero flags\n"
+msgstr ""
+
+#: src/elflint.c:3432
+#, c-format
+msgid "zeroth section has nonzero address\n"
+msgstr ""
+
+#: src/elflint.c:3434
+#, c-format
+msgid "zeroth section has nonzero offset\n"
+msgstr ""
+
+#: src/elflint.c:3436
+#, c-format
+msgid "zeroth section has nonzero align value\n"
+msgstr ""
+
+#: src/elflint.c:3438
+#, c-format
+msgid "zeroth section has nonzero entry size value\n"
+msgstr ""
+
+#: src/elflint.c:3441
+#, c-format
+msgid ""
+"zeroth section has nonzero size value while ELF header has nonzero shnum "
+"value\n"
+msgstr ""
+
+#: src/elflint.c:3445
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in shstrndx\n"
+msgstr ""
+
+#: src/elflint.c:3449
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in phnum\n"
+msgstr ""
+
+#: src/elflint.c:3466
+#, c-format
+msgid "cannot get section header for section [%2zu] '%s': %s\n"
+msgstr ""
+
+#: src/elflint.c:3475
+#, c-format
+msgid "section [%2zu]: invalid name\n"
+msgstr ""
+
+#: src/elflint.c:3502
+#, c-format
+msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3518
+#, c-format
+msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3535
+#, c-format
+msgid ""
+"section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3553
+#, c-format
+msgid "section [%2zu] '%s' present in object file\n"
+msgstr ""
+
+#: src/elflint.c:3559 src/elflint.c:3591
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
+msgstr ""
+
+#: src/elflint.c:3564 src/elflint.c:3596
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
+"segments\n"
+msgstr ""
+
+#: src/elflint.c:3572
+#, c-format
+msgid ""
+"section [%2zu] '%s' is extension section index table in non-object file\n"
+msgstr ""
+
+#: src/elflint.c:3615
+#, c-format
+msgid "section [%2zu] '%s': size not multiple of entry size\n"
+msgstr ""
+
+#: src/elflint.c:3620
+#, c-format
+msgid "cannot get section header\n"
+msgstr ""
+
+#: src/elflint.c:3630
+#, c-format
+msgid "section [%2zu] '%s' has unsupported type %d\n"
+msgstr ""
+
+#: src/elflint.c:3644
+#, c-format
+msgid ""
+"section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:3651
+#, c-format
+msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:3659
+#, c-format
+msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
+msgstr ""
+
+#: src/elflint.c:3667
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in link value\n"
+msgstr ""
+
+#: src/elflint.c:3672
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in info value\n"
+msgstr ""
+
+#: src/elflint.c:3679
+#, c-format
+msgid "section [%2zu] '%s': strings flag set without merge flag\n"
+msgstr ""
+
+#: src/elflint.c:3684
+#, c-format
+msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
+msgstr ""
+
+#: src/elflint.c:3702
+#, c-format
+msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
+msgstr ""
+
+#: src/elflint.c:3711
+#, c-format
+msgid "section [%2zu] '%s' is both executable and writable\n"
+msgstr ""
+
+#: src/elflint.c:3738
+#, c-format
+msgid ""
+"section [%2zu] '%s' not fully contained in segment of program header entry %"
+"d\n"
+msgstr ""
+
+#: src/elflint.c:3746
+#, 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:3755
+#, 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:3766
+#, c-format
+msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
+msgstr ""
+
+#: src/elflint.c:3776
+#, c-format
+msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
+msgstr ""
+
+#: src/elflint.c:3786
+#, c-format
+msgid ""
+"section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:3792
+#, 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:3800
+#, c-format
+msgid ""
+"section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
+msgstr ""
+
+#: src/elflint.c:3851
+#, c-format
+msgid "more than one version symbol table present\n"
+msgstr ""
+
+#: src/elflint.c:3874
+#, c-format
+msgid "INTERP program header entry but no .interp section\n"
+msgstr ""
+
+#: src/elflint.c:3885
+#, c-format
+msgid ""
+"loadable segment [%u] is executable but contains no executable sections\n"
+msgstr ""
+
+#: src/elflint.c:3891
+#, c-format
+msgid "loadable segment [%u] is writable but contains no writable sections\n"
+msgstr ""
+
+#: src/elflint.c:3902
+#, c-format
+msgid ""
+"no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
+"exist\n"
+msgstr ""
+
+#: src/elflint.c:3915
+#, c-format
+msgid "duplicate version index %d\n"
+msgstr ""
+
+#: src/elflint.c:3929
+#, c-format
+msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
+msgstr ""
+
+#: src/elflint.c:3978
+#, c-format
+msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:3982
+#, c-format
+msgid ""
+"section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4005
+#, c-format
+msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4009
+#, c-format
+msgid ""
+"section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4026
+#, c-format
+msgid "phdr[%d]: no note entries defined for the type of file\n"
+msgstr ""
+
+#: src/elflint.c:4045
+#, c-format
+msgid "phdr[%d]: cannot get content of note section: %s\n"
+msgstr ""
+
+#: src/elflint.c:4048
+#, c-format
+msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
+msgstr ""
+
+#: src/elflint.c:4069
+#, c-format
+msgid "section [%2d] '%s': no note entries defined for the type of file\n"
+msgstr ""
+
+#: src/elflint.c:4076
+#, c-format
+msgid "section [%2d] '%s': cannot get content of note section\n"
+msgstr ""
+
+#: src/elflint.c:4079
+#, c-format
+msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
+msgstr ""
+
+#: src/elflint.c:4097
+#, c-format
+msgid ""
+"only executables, shared objects, and core files can have program headers\n"
+msgstr ""
+
+#: src/elflint.c:4112
+#, c-format
+msgid "cannot get program header entry %d: %s\n"
+msgstr ""
+
+#: src/elflint.c:4121
+#, c-format
+msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:4132
+#, c-format
+msgid "more than one INTERP entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4140
+#, c-format
+msgid "more than one TLS entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4147
+#, c-format
+msgid "static executable cannot have dynamic sections\n"
+msgstr ""
+
+#: src/elflint.c:4161
+#, c-format
+msgid "dynamic section reference in program header has wrong offset\n"
+msgstr ""
+
+#: src/elflint.c:4164
+#, c-format
+msgid "dynamic section size mismatch in program and section header\n"
+msgstr ""
+
+#: src/elflint.c:4174
+#, c-format
+msgid "more than one GNU_RELRO entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4195
+#, c-format
+msgid "loadable segment GNU_RELRO applies to is not writable\n"
+msgstr ""
+
+#: src/elflint.c:4198
+#, c-format
+msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
+msgstr ""
+
+#: src/elflint.c:4206 src/elflint.c:4229
+#, c-format
+msgid "%s segment not contained in a loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:4235
+#, c-format
+msgid "program header offset in ELF header and PHDR entry do not match"
+msgstr ""
+
+#: src/elflint.c:4259
+#, c-format
+msgid "call frame search table reference in program header has wrong offset\n"
+msgstr ""
+
+#: src/elflint.c:4262
+#, c-format
+msgid "call frame search table size mismatch in program and section header\n"
+msgstr ""
+
+#: src/elflint.c:4275
+#, c-format
+msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
+msgstr ""
+
+#: src/elflint.c:4283
+#, c-format
+msgid "call frame search table must be allocated\n"
+msgstr ""
+
+#: src/elflint.c:4286
+#, c-format
+msgid "section [%2zu] '%s' must be allocated\n"
+msgstr ""
+
+#: src/elflint.c:4290
+#, c-format
+msgid "call frame search table must not be writable\n"
+msgstr ""
+
+#: src/elflint.c:4293
+#, c-format
+msgid "section [%2zu] '%s' must not be writable\n"
+msgstr ""
+
+#: src/elflint.c:4298
+#, c-format
+msgid "call frame search table must not be executable\n"
+msgstr ""
+
+#: src/elflint.c:4301
+#, c-format
+msgid "section [%2zu] '%s' must not be executable\n"
+msgstr ""
+
+#: src/elflint.c:4312
+#, c-format
+msgid "program header entry %d: file size greater than memory size\n"
+msgstr ""
+
+#: src/elflint.c:4319
+#, c-format
+msgid "program header entry %d: alignment not a power of 2\n"
+msgstr ""
+
+#: src/elflint.c:4322
+#, c-format
+msgid ""
+"program header entry %d: file offset and virtual address not module of "
+"alignment\n"
+msgstr ""
+
+#: src/elflint.c:4335
+#, 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:4369
+#, c-format
+msgid "cannot read ELF header: %s\n"
+msgstr ""
+
+#: src/elflint.c:4395
+#, c-format
+msgid "text relocation flag set but not needed\n"
+msgstr ""
+
+#: src/findtextrel.c:70
+msgid "Input Selection:"
+msgstr ""
+
+#: src/findtextrel.c:71
+msgid "Prepend PATH to all file names"
+msgstr ""
+
+#: src/findtextrel.c:73
+msgid "Use PATH as root of debuginfo hierarchy"
+msgstr ""
+
+#: src/findtextrel.c:80
+msgid "Locate source of text relocations in FILEs (a.out by default)."
+msgstr ""
+
+#: src/findtextrel.c:84 src/nm.c:111 src/objdump.c:80 src/size.c:92
+#: src/strings.c:92 src/strip.c:97
+msgid "[FILE...]"
+msgstr ""
+
+#: src/findtextrel.c:246
+#, c-format
+msgid "cannot get ELF header '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:257
+#, c-format
+msgid "'%s' is not a DSO or PIE"
+msgstr ""
+
+#: src/findtextrel.c:274
+#, c-format
+msgid "getting get section header of section %zu: %s"
+msgstr ""
+
+#: src/findtextrel.c:292
+#, c-format
+msgid "cannot read dynamic section: %s"
+msgstr ""
+
+#: src/findtextrel.c:307
+#, c-format
+msgid "no text relocations reported in '%s'"
+msgstr ""
+
+#: src/findtextrel.c:319
+#, c-format
+msgid "while reading ELF file"
+msgstr ""
+
+#: src/findtextrel.c:328 src/findtextrel.c:345
+#, c-format
+msgid "cannot get program header index at offset %d: %s"
+msgstr ""
+
+#: src/findtextrel.c:397
+#, c-format
+msgid "cannot get section header of section %Zu: %s"
+msgstr ""
+
+#: src/findtextrel.c:409
+#, c-format
+msgid "cannot get symbol table section %zu in '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:429 src/findtextrel.c:452
+#, c-format
+msgid "cannot get relocation at index %d in section %zu in '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:517
+#, c-format
+msgid "%s not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:570
+#, c-format
+msgid ""
+"the file containing the function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:577 src/findtextrel.c:597
+#, c-format
+msgid ""
+"the file containing the function '%s' might not be compiled with -fpic/-"
+"fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:585
+#, c-format
+msgid ""
+"either the file containing the function '%s' or the file containing the "
+"function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:605
+#, c-format
+msgid ""
+"a relocation modifies memory at offset %llu in a write-protected segment\n"
+msgstr ""
+
+#: src/i386_ld.c:210
+#, c-format
+msgid "cannot allocate PLT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:232
+#, c-format
+msgid "cannot allocate PLTREL section: %s"
+msgstr ""
+
+#: src/i386_ld.c:253
+#, c-format
+msgid "cannot allocate GOT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:274
+#, c-format
+msgid "cannot allocate GOTPLT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:661
+#, c-format
+msgid "initial-executable TLS relocation cannot be used "
+msgstr ""
+
+#: src/ld.c:87
+msgid "Input File Control:"
+msgstr ""
+
+#: src/ld.c:89
+msgid "Include whole archives in the output from now on."
+msgstr ""
+
+#: src/ld.c:91
+msgid "Stop including the whole archives in the output."
+msgstr ""
+
+#: src/ld.c:92 src/ld.c:106 src/ld.c:184
+msgid "FILE"
+msgstr ""
+
+#: src/ld.c:93
+msgid "Start a group."
+msgstr ""
+
+#: src/ld.c:94
+msgid "End a group."
+msgstr ""
+
+#: src/ld.c:95
+msgid "PATH"
+msgstr ""
+
+#: src/ld.c:96
+msgid "Add PATH to list of directories files are searched in."
+msgstr ""
+
+#: src/ld.c:98
+msgid "Only set DT_NEEDED for following dynamic libs if actually used"
+msgstr ""
+
+#: src/ld.c:100
+msgid "Always set DT_NEEDED for following dynamic libs"
+msgstr ""
+
+#: src/ld.c:102
+msgid "Ignore LD_LIBRARY_PATH environment variable."
+msgstr ""
+
+#: src/ld.c:105
+msgid "Output File Control:"
+msgstr ""
+
+#: src/ld.c:106
+msgid "Place output in FILE."
+msgstr ""
+
+#: src/ld.c:109
+msgid "Object is marked to not use default search path at runtime."
+msgstr ""
+
+#: src/ld.c:111
+msgid "Same as --whole-archive."
+msgstr ""
+
+#: src/ld.c:112
+msgid ""
+"Default rules of extracting from archive; weak references are not enough."
+msgstr ""
+
+#: src/ld.c:116
+msgid "Weak references cause extraction from archive."
+msgstr ""
+
+#: src/ld.c:118
+msgid "Allow multiple definitions; first is used."
+msgstr ""
+
+#: src/ld.c:120
+msgid "Disallow/allow undefined symbols in DSOs."
+msgstr ""
+
+#: src/ld.c:123
+msgid "Object requires immediate handling of $ORIGIN."
+msgstr ""
+
+#: src/ld.c:125
+msgid "Relocation will not be processed lazily."
+msgstr ""
+
+#: src/ld.c:127
+msgid "Object cannot be unloaded at runtime."
+msgstr ""
+
+#: src/ld.c:129
+msgid "Mark object to be initialized first."
+msgstr ""
+
+#: src/ld.c:131
+msgid "Enable/disable lazy-loading flag for following dependencies."
+msgstr ""
+
+#: src/ld.c:133
+msgid "Mark object as not loadable with 'dlopen'."
+msgstr ""
+
+#: src/ld.c:135
+msgid "Ignore/record dependencies on unused DSOs."
+msgstr ""
+
+#: src/ld.c:137
+msgid "Generated DSO will be a system library."
+msgstr ""
+
+#: src/ld.c:138
+msgid "ADDRESS"
+msgstr ""
+
+#: src/ld.c:138
+msgid "Set entry point address."
+msgstr ""
+
+#: src/ld.c:141
+msgid "Do not link against shared libraries."
+msgstr ""
+
+#: src/ld.c:144
+msgid "Prefer linking against shared libraries."
+msgstr ""
+
+#: src/ld.c:145
+msgid "Export all dynamic symbols."
+msgstr ""
+
+#: src/ld.c:146
+msgid "Strip all symbols."
+msgstr ""
+
+#: src/ld.c:147
+msgid "Strip debugging symbols."
+msgstr ""
+
+#: src/ld.c:149
+msgid "Assume pagesize for the target system to be SIZE."
+msgstr ""
+
+#: src/ld.c:151
+msgid "Set runtime DSO search path."
+msgstr ""
+
+#: src/ld.c:154
+msgid "Set link time DSO search path."
+msgstr ""
+
+#: src/ld.c:155
+msgid "Generate dynamic shared object."
+msgstr ""
+
+#: src/ld.c:156
+msgid "Generate relocatable object."
+msgstr ""
+
+#: src/ld.c:159
+msgid "Causes symbol not assigned to a version be reduced to local."
+msgstr ""
+
+#: src/ld.c:160
+msgid "Remove unused sections."
+msgstr ""
+
+#: src/ld.c:163
+msgid "Don't remove unused sections."
+msgstr ""
+
+#: src/ld.c:164
+msgid "Set soname of shared object."
+msgstr ""
+
+#: src/ld.c:165
+msgid "Set the dynamic linker name."
+msgstr ""
+
+#: src/ld.c:168
+msgid "Add/suppress addition indentifying link-editor to .comment section."
+msgstr ""
+
+#: src/ld.c:171
+msgid "Create .eh_frame_hdr section"
+msgstr ""
+
+#: src/ld.c:173
+msgid "Set hash style to sysv, gnu or both."
+msgstr ""
+
+#: src/ld.c:175
+msgid "Generate build ID note (md5, sha1 (default), uuid)."
+msgstr ""
+
+#: src/ld.c:177
+msgid "Linker Operation Control:"
+msgstr ""
+
+#: src/ld.c:178
+msgid "Verbose messages."
+msgstr ""
+
+#: src/ld.c:179
+msgid "Trace file opens."
+msgstr ""
+
+#: src/ld.c:181
+msgid "Trade speed for less memory usage"
+msgstr ""
+
+#: src/ld.c:182
+msgid "LEVEL"
+msgstr ""
+
+#: src/ld.c:183
+msgid "Set optimization level to LEVEL."
+msgstr ""
+
+#: src/ld.c:184
+msgid "Use linker script in FILE."
+msgstr ""
+
+#: src/ld.c:187
+msgid "Select to get parser debug information"
+msgstr ""
+
+#: src/ld.c:190
+msgid "Read version information from FILE."
+msgstr ""
+
+#: src/ld.c:191
+msgid "Set emulation to NAME."
+msgstr ""
+
+#: src/ld.c:197
+msgid "Combine object and archive files."
+msgstr ""
+
+#: src/ld.c:200
+msgid "[FILE]..."
+msgstr ""
+
+#: src/ld.c:333
+#, c-format
+msgid "At least one input file needed"
+msgstr ""
+
+#: src/ld.c:349
+#, c-format
+msgid "error while preparing linking"
+msgstr ""
+
+#: src/ld.c:356
+#, c-format
+msgid "cannot open linker script '%s'"
+msgstr ""
+
+#: src/ld.c:397
+#, c-format
+msgid "-( without matching -)"
+msgstr ""
+
+#: src/ld.c:572 src/ld.c:610
+#, c-format
+msgid "only one option of -G and -r is allowed"
+msgstr ""
+
+#: src/ld.c:594
+#, c-format
+msgid "more than one '-m' parameter"
+msgstr ""
+
+#: src/ld.c:604 src/ld.c:1013
+#, c-format
+msgid "unknown option `-%c %s'"
+msgstr ""
+
+#: src/ld.c:646
+#, c-format
+msgid "invalid page size value '%s': ignored"
+msgstr ""
+
+#: src/ld.c:687
+#, c-format
+msgid "invalid hash style '%s'"
+msgstr ""
+
+#: src/ld.c:697
+#, c-format
+msgid "invalid build-ID style '%s'"
+msgstr ""
+
+#: src/ld.c:785
+#, c-format
+msgid "More than one output file name given."
+msgstr ""
+
+#: src/ld.c:802
+#, c-format
+msgid "Invalid optimization level `%s'"
+msgstr ""
+
+#: src/ld.c:850
+#, c-format
+msgid "nested -( -) groups are not allowed"
+msgstr ""
+
+#: src/ld.c:869
+#, c-format
+msgid "-) without matching -("
+msgstr ""
+
+#: src/ld.c:1046
+#, c-format
+msgid "unknown option '-%c %s'"
+msgstr ""
+
+#: src/ld.c:1150
+#, c-format
+msgid "could not find input file to determine output file format"
+msgstr ""
+
+#: src/ld.c:1152
+#, c-format
+msgid "try again with an appropriate '-m' parameter"
+msgstr ""
+
+#: src/ld.c:1446
+#, c-format
+msgid "cannot read version script '%s'"
+msgstr ""
+
+#: src/ld.c:1512 src/ld.c:1551
+#, c-format
+msgid "duplicate definition of '%s' in linker script"
+msgstr ""
+
+#: src/ldgeneric.c:209 src/ldgeneric.c:5151
+#, c-format
+msgid "cannot create string table"
+msgstr ""
+
+#: src/ldgeneric.c:255
+#, c-format
+msgid "cannot load ld backend library '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:265
+#, c-format
+msgid "cannot find init function in ld backend library '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:310
+#, c-format
+msgid "%s listed more than once as input"
+msgstr ""
+
+#: src/ldgeneric.c:424
+#, c-format
+msgid "%s (for -l%s)\n"
+msgstr ""
+
+#: src/ldgeneric.c:425
+#, c-format
+msgid "%s (for DT_NEEDED %s)\n"
+msgstr ""
+
+#: src/ldgeneric.c:573
+#, c-format
+msgid "Warning: type of `%s' changed from %s in %s to %s in %s"
+msgstr ""
+
+#: src/ldgeneric.c:586
+#, c-format
+msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
+msgstr ""
+
+#: src/ldgeneric.c:661 src/ldgeneric.c:1122 src/readelf.c:629 src/strip.c:543
+#, c-format
+msgid "cannot determine number of sections: %s"
+msgstr ""
+
+#: src/ldgeneric.c:677
+#, c-format
+msgid "(%s+%#<PRIx64>): multiple definition of %s `%s'\n"
+msgstr ""
+
+#: src/ldgeneric.c:700
+#, c-format
+msgid "(%s+%#<PRIx64>): first defined here\n"
+msgstr ""
+
+#: src/ldgeneric.c:819
+#, c-format
+msgid "%s: cannot get section group data: %s"
+msgstr ""
+
+#: src/ldgeneric.c:840
+#, c-format
+msgid "%s: section '%s' with group flag set does not belong to any group"
+msgstr ""
+
+#: src/ldgeneric.c:885
+#, c-format
+msgid "%s: section [%2d] '%s' is not in the correct section group"
+msgstr ""
+
+#: src/ldgeneric.c:1156 src/ldgeneric.c:1413 src/ldgeneric.c:1422
+#: src/ldgeneric.c:1481 src/ldgeneric.c:1490 src/ldgeneric.c:1753
+#: src/ldgeneric.c:2005
+#, c-format
+msgid "%s: invalid ELF file (%s:%d)\n"
+msgstr ""
+
+#: src/ldgeneric.c:1250
+#, c-format
+msgid "%s: only files of type ET_REL might contain section groups"
+msgstr ""
+
+#: src/ldgeneric.c:1302
+#, c-format
+msgid "%s: cannot determine signature of section group [%2zd] '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:1314
+#, c-format
+msgid "%s: cannot get content of section group [%2zd] '%s': %s'"
+msgstr ""
+
+#: src/ldgeneric.c:1328
+#, c-format
+msgid ""
+"%s: group member %zu of section group [%2zd] '%s' has too high index: %"
+"<PRIu32>"
+msgstr ""
+
+#: src/ldgeneric.c:1350
+#, c-format
+msgid "%s: section '%s' has unknown type: %d"
+msgstr ""
+
+#: src/ldgeneric.c:1729
+#, c-format
+msgid "cannot get descriptor for ELF file (%s:%d): %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:1899
+#, c-format
+msgid "cannot read archive `%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:2020
+#, c-format
+msgid "file of type %s cannot be linked in\n"
+msgstr ""
+
+#: src/ldgeneric.c:2032
+#, c-format
+msgid "%s: input file incompatible with ELF machine type %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:2044
+#, c-format
+msgid "%s: cannot get section header string table index: %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:2073
+#, c-format
+msgid "cannot use DSO '%s' when generating relocatable object file"
+msgstr ""
+
+#: src/ldgeneric.c:2158
+#, c-format
+msgid "input file '%s' ignored"
+msgstr ""
+
+#: src/ldgeneric.c:2372
+#, c-format
+msgid "undefined symbol `%s' in %s"
+msgstr ""
+
+#: src/ldgeneric.c:2702
+#, c-format
+msgid "cannot create ELF descriptor for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:2709
+#, c-format
+msgid "could not create ELF header for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:3224 src/ldgeneric.c:3294 src/ldgeneric.c:3330
+#: src/ldgeneric.c:4457 src/ldgeneric.c:4506 src/ldgeneric.c:4538
+#: src/ldgeneric.c:4773 src/ldgeneric.c:4828 src/ldgeneric.c:5075
+#: src/ldgeneric.c:5131 src/ldgeneric.c:5600 src/ldgeneric.c:5612
+#, c-format
+msgid "cannot create section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:3444
+#, c-format
+msgid "address computation expression contains variable '%s'"
+msgstr ""
+
+#: src/ldgeneric.c:3489
+#, c-format
+msgid ""
+"argument '%<PRIuMAX>' of ALIGN in address computation expression is no power "
+"of two"
+msgstr ""
+
+#: src/ldgeneric.c:3684
+#, c-format
+msgid "cannot find entry symbol '%s': defaulting to %#0*<PRIx64>"
+msgstr ""
+
+#: src/ldgeneric.c:3690
+#, c-format
+msgid "no entry symbol specified: defaulting to %#0*<PRIx64>"
+msgstr ""
+
+#: src/ldgeneric.c:3920
+#, c-format
+msgid "cannot create GNU hash table section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4071
+#, c-format
+msgid "cannot create hash table section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4114
+#, c-format
+msgid "cannot create build ID section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4191
+#, c-format
+msgid "cannot convert section data to file format: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4200
+#, c-format
+msgid "cannot convert section data to memory format: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4261
+#, c-format
+msgid "cannot read enough data for UUID"
+msgstr ""
+
+#: src/ldgeneric.c:4358 src/ldgeneric.c:4379 src/ldgeneric.c:4408
+#: src/ldgeneric.c:6062
+#, c-format
+msgid "cannot create symbol table for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5300 src/ldgeneric.c:5852
+#, c-format
+msgid "section index too large in dynamic symbol table"
+msgstr ""
+
+#: src/ldgeneric.c:5745
+#, c-format
+msgid "cannot create versioning section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5818
+#, c-format
+msgid "cannot create dynamic symbol table for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5994
+#, c-format
+msgid "cannot create versioning data: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6094 src/ldgeneric.c:6107 src/ldgeneric.c:6171
+#: src/ldgeneric.c:6179
+#, c-format
+msgid "cannot create section header string section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6101
+#, c-format
+msgid "cannot create section header string section"
+msgstr ""
+
+#: src/ldgeneric.c:6259
+#, c-format
+msgid "cannot create program header: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6267
+#, c-format
+msgid "while determining file layout: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6388
+#, c-format
+msgid "internal error: non-nobits section follows nobits section"
+msgstr ""
+
+#: src/ldgeneric.c:6925
+#, c-format
+msgid "cannot get header of 0th section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6941 src/unstrip.c:1808
+#, c-format
+msgid "cannot update ELF header: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6972
+#, c-format
+msgid "linker backend didn't specify function to relocate section"
+msgstr ""
+
+#: src/ldgeneric.c:6984
+#, c-format
+msgid "while writing output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6989
+#, c-format
+msgid "while finishing output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6995
+#, c-format
+msgid "cannot stat output file"
+msgstr ""
+
+#: src/ldgeneric.c:7011
+#, c-format
+msgid "WARNING: temporary output file overwritten before linking finished"
+msgstr ""
+
+#: src/ldgeneric.c:7064 src/ldgeneric.c:7075 src/ldgeneric.c:7086
+#: src/ldgeneric.c:7097 src/ldgeneric.c:7116 src/ldgeneric.c:7129
+#: src/ldgeneric.c:7141
+#, c-format
+msgid "no machine specific '%s' implementation"
+msgstr ""
+
+#: src/ldscript.y:178
+msgid "mode for segment invalid\n"
+msgstr ""
+
+#: src/ldscript.y:465
+#, c-format
+msgid "while reading version script '%s': %s at line %d"
+msgstr ""
+
+#: src/ldscript.y:466
+#, c-format
+msgid "while reading linker script '%s': %s at line %d"
+msgstr ""
+
+#: src/ldscript.y:745
+#, c-format
+msgid "symbol '%s' is declared both local and global for unnamed version"
+msgstr ""
+
+#: src/ldscript.y:747
+#, c-format
+msgid "symbol '%s' is declared both local and global for version '%s'"
+msgstr ""
+
+#: src/ldscript.y:767 src/ldscript.y:774
+#, c-format
+msgid "default visibility set as local and global"
+msgstr ""
+
+#: src/nm.c:74 src/strip.c:73
+msgid "Output selection:"
+msgstr ""
+
+#: src/nm.c:75
+msgid "Display debugger-only symbols"
+msgstr ""
+
+#: src/nm.c:76
+msgid "Display only defined symbols"
+msgstr ""
+
+#: src/nm.c:79
+msgid "Display dynamic symbols instead of normal symbols"
+msgstr ""
+
+#: src/nm.c:80
+msgid "Display only external symbols"
+msgstr ""
+
+#: src/nm.c:81
+msgid "Display only undefined symbols"
+msgstr ""
+
+#: src/nm.c:83
+msgid "Include index for symbols from archive members"
+msgstr ""
+
+#: src/nm.c:85 src/size.c:66
+msgid "Output format:"
+msgstr ""
+
+#: src/nm.c:87
+msgid "Print name of the input file before every symbol"
+msgstr ""
+
+#: src/nm.c:90
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd', `sysv' or `posix'. The "
+"default is `sysv'"
+msgstr ""
+
+#: src/nm.c:92
+msgid "Same as --format=bsd"
+msgstr ""
+
+#: src/nm.c:93
+msgid "Same as --format=posix"
+msgstr ""
+
+#: src/nm.c:94 src/size.c:72
+msgid "Use RADIX for printing symbol values"
+msgstr ""
+
+#: src/nm.c:95
+msgid "Mark weak symbols"
+msgstr ""
+
+#: src/nm.c:96
+msgid "Print size of defined symbols"
+msgstr ""
+
+#: src/nm.c:98 src/size.c:80 src/strip.c:78 src/unstrip.c:81
+msgid "Output options:"
+msgstr ""
+
+#: src/nm.c:99
+msgid "Sort symbols numerically by address"
+msgstr ""
+
+#: src/nm.c:101
+msgid "Do not sort the symbols"
+msgstr ""
+
+#: src/nm.c:102
+msgid "Reverse the sense of the sort"
+msgstr ""
+
+#: src/nm.c:108
+msgid "List symbols from FILEs (a.out by default)."
+msgstr ""
+
+#: src/nm.c:136 src/objdump.c:105 src/size.c:117 src/strip.c:121
+#, c-format
+msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
+msgstr ""
+
+#: src/nm.c:380 src/nm.c:392 src/size.c:317 src/size.c:326 src/size.c:337
+#: src/strip.c:1816
+#, c-format
+msgid "while closing '%s'"
+msgstr ""
+
+#: src/nm.c:402 src/objdump.c:296 src/strip.c:359
+#, c-format
+msgid "%s: File format not recognized"
+msgstr ""
+
+#: src/nm.c:442
+msgid ""
+"\n"
+"Archive index:"
+msgstr ""
+
+#: src/nm.c:451
+#, c-format
+msgid "invalid offset %zu for symbol %s"
+msgstr ""
+
+#: src/nm.c:456
+#, c-format
+msgid "%s in %s\n"
+msgstr ""
+
+#: src/nm.c:464
+#, c-format
+msgid "cannot reset archive offset to beginning"
+msgstr ""
+
+#: src/nm.c:488 src/objdump.c:344
+#, c-format
+msgid "%s%s%s: file format not recognized"
+msgstr ""
+
+#: src/nm.c:700
+#, c-format
+msgid "cannot create search tree"
+msgstr ""
+
+#: src/nm.c:740 src/nm.c:1002 src/objdump.c:744 src/readelf.c:885
+#: src/readelf.c:1028 src/readelf.c:1169 src/readelf.c:1351 src/readelf.c:1549
+#: src/readelf.c:1735 src/readelf.c:1945 src/readelf.c:2199 src/readelf.c:2265
+#: src/readelf.c:2343 src/readelf.c:2841 src/readelf.c:2877 src/readelf.c:2939
+#: src/readelf.c:6493 src/readelf.c:7387 src/readelf.c:7534 src/readelf.c:7604
+#: src/size.c:425 src/size.c:499 src/strip.c:483
+#, c-format
+msgid "cannot get section header string table index"
+msgstr ""
+
+#: src/nm.c:766
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s:\n"
+"\n"
+msgstr ""
+
+#: src/nm.c:768
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s[%s]:\n"
+"\n"
+msgstr ""
+
+#: src/nm.c:771
+#, c-format
+msgid ""
+"%*s%-*s %-*s Class Type %-*s %*s Section\n"
+"\n"
+msgstr ""
+
+#: src/nm.c:1012
+#, c-format
+msgid "%s: entry size in section `%s' is not what we expect"
+msgstr ""
+
+#: src/nm.c:1016
+#, c-format
+msgid "%s: size of section `%s' is not multiple of entry size"
+msgstr ""
+
+#: src/nm.c:1255
+#, c-format
+msgid "%s%s%s%s: Invalid operation"
+msgstr ""
+
+#: src/nm.c:1312
+#, c-format
+msgid "%s%s%s: no symbols"
+msgstr ""
+
+#: src/objdump.c:61
+msgid "Mode selection:"
+msgstr ""
+
+#: src/objdump.c:62
+msgid "Display relocation information."
+msgstr ""
+
+#: src/objdump.c:64
+msgid "Display the full contents of all sections requested"
+msgstr ""
+
+#: src/objdump.c:66
+msgid "Display assembler code of executable sections"
+msgstr ""
+
+#: src/objdump.c:68
+msgid "Output option selection:"
+msgstr ""
+
+#: src/objdump.c:70
+msgid "Only display information for section NAME."
+msgstr ""
+
+#: src/objdump.c:76
+msgid "Show information from FILEs (a.out by default)."
+msgstr ""
+
+#: src/objdump.c:236 src/readelf.c:430
+msgid "No operation specified.\n"
+msgstr ""
+
+#: src/objdump.c:274 src/objdump.c:286
+#, c-format
+msgid "while close `%s'"
+msgstr ""
+
+#: src/objdump.c:379 src/readelf.c:1644 src/readelf.c:1818
+msgid "INVALID SYMBOL"
+msgstr ""
+
+#: src/objdump.c:394 src/readelf.c:1675 src/readelf.c:1851
+msgid "INVALID SECTION"
+msgstr ""
+
+#: src/objdump.c:510
+#, c-format
+msgid ""
+"\n"
+"RELOCATION RECORDS FOR [%s]:\n"
+"%-*s TYPE VALUE\n"
+msgstr ""
+
+#: src/objdump.c:513
+msgid "OFFSET"
+msgstr ""
+
+#: src/objdump.c:576
+#, c-format
+msgid "Contents of section %s:\n"
+msgstr ""
+
+#: src/objdump.c:676
+#, c-format
+msgid "cannot disassemble"
+msgstr ""
+
+#: src/ranlib.c:74
+msgid "Generate an index to speed access to archives."
+msgstr ""
+
+#: src/ranlib.c:77
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/ranlib.c:116
+#, c-format
+msgid "Archive name required"
+msgstr ""
+
+#: src/ranlib.c:194
+#, c-format
+msgid "'%s' is no archive"
+msgstr ""
+
+#: src/ranlib.c:229
+#, c-format
+msgid "error while freeing sub-ELF descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:73
+msgid "ELF output selection:"
+msgstr ""
+
+#: src/readelf.c:75
+msgid "All these plus -p .strtab -p .dynstr -p .comment"
+msgstr ""
+
+#: src/readelf.c:76
+msgid "Display the dynamic segment"
+msgstr ""
+
+#: src/readelf.c:77
+msgid "Display the ELF file header"
+msgstr ""
+
+#: src/readelf.c:79
+msgid "Display histogram of bucket list lengths"
+msgstr ""
+
+#: src/readelf.c:80
+msgid "Display the program headers"
+msgstr ""
+
+#: src/readelf.c:82
+msgid "Display relocations"
+msgstr ""
+
+#: src/readelf.c:83
+msgid "Display the sections' headers"
+msgstr ""
+
+#: src/readelf.c:85
+msgid "Display the symbol table"
+msgstr ""
+
+#: src/readelf.c:86
+msgid "Display versioning information"
+msgstr ""
+
+#: src/readelf.c:87
+msgid "Display the ELF notes"
+msgstr ""
+
+#: src/readelf.c:89
+msgid "Display architecture specific information, if any"
+msgstr ""
+
+#: src/readelf.c:91
+msgid "Display sections for exception handling"
+msgstr ""
+
+#: src/readelf.c:93
+msgid "Additional output selection:"
+msgstr ""
+
+#: src/readelf.c:95
+msgid ""
+"Display DWARF section content. SECTION can be one of abbrev, aranges, "
+"frame, info, loc, line, ranges, pubnames, str, macinfo, or exception"
+msgstr ""
+
+#: src/readelf.c:99
+msgid "Dump the uninterpreted contents of SECTION, by number or name"
+msgstr ""
+
+#: src/readelf.c:101
+msgid "Print string contents of sections"
+msgstr ""
+
+#: src/readelf.c:104
+msgid "Display the symbol index of an archive"
+msgstr ""
+
+#: src/readelf.c:106
+msgid "Output control:"
+msgstr ""
+
+#: src/readelf.c:108
+msgid "Do not find symbol names for addresses in DWARF data"
+msgstr ""
+
+#: src/readelf.c:114
+msgid "Print information from ELF file in human-readable form."
+msgstr ""
+
+#: src/readelf.c:401
+#, c-format
+msgid "Unknown DWARF debug section `%s'.\n"
+msgstr ""
+
+#: src/readelf.c:465
+#, c-format
+msgid "cannot generate Elf descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:477
+#, c-format
+msgid "'%s' is not an archive, cannot print archive index"
+msgstr ""
+
+#: src/readelf.c:482
+#, c-format
+msgid "error while closing Elf descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:574
+#, c-format
+msgid "cannot stat input file"
+msgstr ""
+
+#: src/readelf.c:576
+#, c-format
+msgid "input file is empty"
+msgstr ""
+
+#: src/readelf.c:578
+#, c-format
+msgid "failed reading '%s': %s"
+msgstr ""
+
+#: src/readelf.c:614
+#, c-format
+msgid "cannot read ELF header: %s"
+msgstr ""
+
+#: src/readelf.c:622
+#, c-format
+msgid "cannot create EBL handle"
+msgstr ""
+
+#: src/readelf.c:635
+#, c-format
+msgid "cannot determine number of program headers: %s"
+msgstr ""
+
+#: src/readelf.c:721
+msgid "NONE (None)"
+msgstr ""
+
+#: src/readelf.c:722
+msgid "REL (Relocatable file)"
+msgstr ""
+
+#: src/readelf.c:723
+msgid "EXEC (Executable file)"
+msgstr ""
+
+#: src/readelf.c:724
+msgid "DYN (Shared object file)"
+msgstr ""
+
+#: src/readelf.c:725
+msgid "CORE (Core file)"
+msgstr ""
+
+#: src/readelf.c:730
+#, c-format
+msgid "OS Specific: (%x)\n"
+msgstr ""
+
+#: src/readelf.c:732
+#, c-format
+msgid "Processor Specific: (%x)\n"
+msgstr ""
+
+#: src/readelf.c:742
+msgid ""
+"ELF Header:\n"
+" Magic: "
+msgstr ""
+
+#: src/readelf.c:746
+#, c-format
+msgid ""
+"\n"
+" Class: %s\n"
+msgstr ""
+
+#: src/readelf.c:751
+#, c-format
+msgid " Data: %s\n"
+msgstr ""
+
+#: src/readelf.c:757
+#, c-format
+msgid " Ident Version: %hhd %s\n"
+msgstr ""
+
+#: src/readelf.c:759 src/readelf.c:776
+msgid "(current)"
+msgstr ""
+
+#: src/readelf.c:763
+#, c-format
+msgid " OS/ABI: %s\n"
+msgstr ""
+
+#: src/readelf.c:766
+#, c-format
+msgid " ABI Version: %hhd\n"
+msgstr ""
+
+#: src/readelf.c:769
+msgid " Type: "
+msgstr ""
+
+#: src/readelf.c:772
+#, c-format
+msgid " Machine: %s\n"
+msgstr ""
+
+#: src/readelf.c:774
+#, c-format
+msgid " Version: %d %s\n"
+msgstr ""
+
+#: src/readelf.c:778
+#, c-format
+msgid " Entry point address: %#<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:781
+#, c-format
+msgid " Start of program headers: %<PRId64> %s\n"
+msgstr ""
+
+#: src/readelf.c:782 src/readelf.c:785
+msgid "(bytes into file)"
+msgstr ""
+
+#: src/readelf.c:784
+#, c-format
+msgid " Start of section headers: %<PRId64> %s\n"
+msgstr ""
+
+#: src/readelf.c:787
+#, c-format
+msgid " Flags: %s\n"
+msgstr ""
+
+#: src/readelf.c:790
+#, c-format
+msgid " Size of this header: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:791 src/readelf.c:794 src/readelf.c:811
+msgid "(bytes)"
+msgstr ""
+
+#: src/readelf.c:793
+#, c-format
+msgid " Size of program header entries: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:796
+#, c-format
+msgid " Number of program headers entries: %<PRId16>"
+msgstr ""
+
+#: src/readelf.c:803
+#, c-format
+msgid " (%<PRIu32> in [0].sh_info)"
+msgstr ""
+
+#: src/readelf.c:806 src/readelf.c:823 src/readelf.c:837
+msgid " ([0] not available)"
+msgstr ""
+
+#: src/readelf.c:810
+#, c-format
+msgid " Size of section header entries: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:813
+#, c-format
+msgid " Number of section headers entries: %<PRId16>"
+msgstr ""
+
+#: src/readelf.c:820
+#, c-format
+msgid " (%<PRIu32> in [0].sh_size)"
+msgstr ""
+
+#: src/readelf.c:833
+#, c-format
+msgid " (%<PRIu32> in [0].sh_link)"
+msgstr ""
+
+#: src/readelf.c:841
+#, c-format
+msgid ""
+" Section header string table index: XINDEX%s\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:845
+#, c-format
+msgid ""
+" Section header string table index: %<PRId16>\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:877
+#, c-format
+msgid ""
+"There are %d section headers, starting at offset %#<PRIx64>:\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:887
+msgid "Section Headers:"
+msgstr ""
+
+#: src/readelf.c:890
+msgid ""
+"[Nr] Name Type Addr Off Size ES Flags Lk "
+"Inf Al"
+msgstr ""
+
+#: src/readelf.c:892
+msgid ""
+"[Nr] Name Type Addr Off Size ES "
+"Flags Lk Inf Al"
+msgstr ""
+
+#: src/readelf.c:899 src/readelf.c:1052
+#, c-format
+msgid "cannot get section: %s"
+msgstr ""
+
+#: src/readelf.c:906 src/readelf.c:1060 src/readelf.c:7554 src/unstrip.c:353
+#: src/unstrip.c:377 src/unstrip.c:427 src/unstrip.c:536 src/unstrip.c:553
+#: src/unstrip.c:591 src/unstrip.c:789 src/unstrip.c:1057 src/unstrip.c:1244
+#: src/unstrip.c:1305 src/unstrip.c:1427 src/unstrip.c:1480 src/unstrip.c:1588
+#: src/unstrip.c:1778
+#, c-format
+msgid "cannot get section header: %s"
+msgstr ""
+
+#: src/readelf.c:964
+msgid "Program Headers:"
+msgstr ""
+
+#: src/readelf.c:966
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align"
+msgstr ""
+
+#: src/readelf.c:969
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz "
+"MemSiz Flg Align"
+msgstr ""
+
+#: src/readelf.c:1009
+#, c-format
+msgid "\t[Requesting program interpreter: %s]\n"
+msgstr ""
+
+#: src/readelf.c:1030
+msgid ""
+"\n"
+" Section to Segment mapping:\n"
+" Segment Sections..."
+msgstr ""
+
+#: src/readelf.c:1041 src/unstrip.c:1824 src/unstrip.c:1863 src/unstrip.c:1870
+#, c-format
+msgid "cannot get program header: %s"
+msgstr ""
+
+#: src/readelf.c:1175
+#, c-format
+msgid ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1180
+#, c-format
+msgid ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1188
+msgid "<INVALID SYMBOL>"
+msgstr ""
+
+#: src/readelf.c:1202
+msgid "<INVALID SECTION>"
+msgstr ""
+
+#: src/readelf.c:1353
+#, c-format
+msgid ""
+"\n"
+"Dynamic segment contains %lu entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Dynamic segment contains %lu entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1365
+msgid " Type Value\n"
+msgstr ""
+
+#: src/readelf.c:1389
+#, c-format
+msgid "Shared library: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1394
+#, c-format
+msgid "Library soname: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1399
+#, c-format
+msgid "Library rpath: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1404
+#, c-format
+msgid "Library runpath: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1424
+#, c-format
+msgid "%<PRId64> (bytes)\n"
+msgstr ""
+
+#: src/readelf.c:1534 src/readelf.c:1720
+#, c-format
+msgid ""
+"\n"
+"Invalid symbol table at offset %#0<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:1552 src/readelf.c:1737
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1567
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1577
+msgid " Offset Type Value Name\n"
+msgstr ""
+
+#: src/readelf.c:1579
+msgid " Offset Type Value Name\n"
+msgstr ""
+
+#: src/readelf.c:1632 src/readelf.c:1643 src/readelf.c:1656 src/readelf.c:1674
+#: src/readelf.c:1686 src/readelf.c:1805 src/readelf.c:1817 src/readelf.c:1831
+#: src/readelf.c:1850 src/readelf.c:1863
+msgid "<INVALID RELOC>"
+msgstr ""
+
+#: src/readelf.c:1749
+msgid " Offset Type Value Addend Name\n"
+msgstr ""
+
+#: src/readelf.c:1751
+msgid " Offset Type Value Addend Name\n"
+msgstr ""
+
+#: src/readelf.c:1952
+#, c-format
+msgid ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entry:\n"
+msgid_plural ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1958
+#, 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:1968
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr ""
+
+#: src/readelf.c:1970
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr ""
+
+#: src/readelf.c:1990
+#, c-format
+msgid "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
+msgstr ""
+
+#: src/readelf.c:2078
+#, c-format
+msgid "bad dynamic symbol"
+msgstr ""
+
+#: src/readelf.c:2160
+msgid "none"
+msgstr ""
+
+#: src/readelf.c:2177
+msgid "| <unknown>"
+msgstr ""
+
+#: src/readelf.c:2202
+#, c-format
+msgid ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2225
+#, c-format
+msgid " %#06x: Version: %hu File: %s Cnt: %hu\n"
+msgstr ""
+
+#: src/readelf.c:2238
+#, c-format
+msgid " %#06x: Name: %s Flags: %s Version: %hu\n"
+msgstr ""
+
+#: src/readelf.c:2269
+#, c-format
+msgid ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2299
+#, c-format
+msgid " %#06x: Version: %hd Flags: %s Index: %hd Cnt: %hd Name: %s\n"
+msgstr ""
+
+#: src/readelf.c:2314
+#, c-format
+msgid " %#06x: Parent %d: %s\n"
+msgstr ""
+
+#: src/readelf.c:2546
+#, c-format
+msgid ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgid_plural ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2576
+msgid " 0 *local* "
+msgstr ""
+
+#: src/readelf.c:2581
+msgid " 1 *global* "
+msgstr ""
+
+#: src/readelf.c:2612
+#, c-format
+msgid ""
+"\n"
+"Histogram 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"
+msgid_plural ""
+"\n"
+"Histogram for bucket list length in section [%2u] '%s' (total of %d "
+"buckets):\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2636
+#, no-c-format
+msgid " Length Number % of total Coverage\n"
+msgstr ""
+
+#: src/readelf.c:2638
+#, c-format
+msgid " 0 %6<PRIu32> %5.1f%%\n"
+msgstr ""
+
+#: src/readelf.c:2645
+#, c-format
+msgid "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
+msgstr ""
+
+#: src/readelf.c:2658
+#, c-format
+msgid ""
+" Average number of tests: successful lookup: %f\n"
+" unsuccessful lookup: %f\n"
+msgstr ""
+
+#: src/readelf.c:2676 src/readelf.c:2718 src/readelf.c:2759
+#, c-format
+msgid "cannot get data for section %d: %s"
+msgstr ""
+
+#: src/readelf.c:2813
+#, c-format
+msgid ""
+" Symbol Bias: %u\n"
+" Bitmask Size: %zu bytes %<PRIuFAST32>%% bits set 2nd hash shift: %u\n"
+msgstr ""
+
+#: src/readelf.c:2887
+#, c-format
+msgid ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2901
+msgid ""
+" Library Time Stamp Checksum Version "
+"Flags"
+msgstr ""
+
+#: src/readelf.c:2951
+#, c-format
+msgid ""
+"\n"
+"Object attributes section [%2zu] '%s' of %<PRIu64> bytes at offset %"
+"#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:2967
+msgid " Owner Size\n"
+msgstr ""
+
+#: src/readelf.c:2993
+#, c-format
+msgid " %-13s %4<PRIu32>\n"
+msgstr ""
+
+#: src/readelf.c:3025
+#, c-format
+msgid " %-4u %12<PRIu32>\n"
+msgstr ""
+
+#: src/readelf.c:3030
+#, c-format
+msgid " File: %11<PRIu32>\n"
+msgstr ""
+
+#: src/readelf.c:3065
+#, c-format
+msgid " %s: %<PRId64>, %s\n"
+msgstr ""
+
+#: src/readelf.c:3068
+#, c-format
+msgid " %s: %<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:3071
+#, c-format
+msgid " %s: %s\n"
+msgstr ""
+
+#: src/readelf.c:3078
+#, c-format
+msgid " %u: %<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:3081
+#, c-format
+msgid " %u: %s\n"
+msgstr ""
+
+#: src/readelf.c:3117
+#, c-format
+msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3120
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3125
+#, c-format
+msgid "%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3128
+#, c-format
+msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3134
+#, c-format
+msgid "%s+%#<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3137
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3141
+#, c-format
+msgid "%#<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3144
+#, c-format
+msgid "%#0*<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3149
+#, c-format
+msgid "%s+%#<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3152
+#, c-format
+msgid "%s+%#0*<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3260
+#, c-format
+msgid "unknown tag %hx"
+msgstr ""
+
+#: src/readelf.c:3262
+#, c-format
+msgid "unknown user tag %hx"
+msgstr ""
+
+#: src/readelf.c:3480
+#, c-format
+msgid "unknown attribute %hx"
+msgstr ""
+
+#: src/readelf.c:3483
+#, c-format
+msgid "unknown user attribute %hx"
+msgstr ""
+
+#: src/readelf.c:3529
+#, c-format
+msgid "unknown form %<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3763
+msgid "empty block"
+msgstr ""
+
+#: src/readelf.c:3766
+#, c-format
+msgid "%zu byte block:"
+msgstr ""
+
+#: src/readelf.c:4175
+#, c-format
+msgid "%*s[%4<PRIuMAX>] %s <TRUNCATED>\n"
+msgstr ""
+
+#: src/readelf.c:4188
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [ Code]\n"
+msgstr ""
+
+#: src/readelf.c:4195
+#, c-format
+msgid ""
+"\n"
+"Abbreviation section at offset %<PRIu64>:\n"
+msgstr ""
+
+#: src/readelf.c:4208
+#, c-format
+msgid " *** error while reading abbreviation: %s\n"
+msgstr ""
+
+#: src/readelf.c:4224
+#, c-format
+msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
+msgstr ""
+
+#: src/readelf.c:4227
+msgid "yes"
+msgstr ""
+
+#: src/readelf.c:4227
+msgid "no"
+msgstr ""
+
+#: src/readelf.c:4263
+#, c-format
+msgid "cannot get .debug_aranges content: %s"
+msgstr ""
+
+#: src/readelf.c:4268
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:4298
+#, c-format
+msgid " [%*zu] ???\n"
+msgstr ""
+
+#: src/readelf.c:4300
+#, c-format
+msgid ""
+" [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:4319
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr ""
+
+#: src/readelf.c:4324 src/readelf.c:4810 src/readelf.c:5452 src/readelf.c:5897
+#: src/readelf.c:5992 src/readelf.c:6164
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:4338 src/readelf.c:5911
+#, c-format
+msgid " [%6tx] <INVALID DATA>\n"
+msgstr ""
+
+#: src/readelf.c:4360 src/readelf.c:5933
+#, c-format
+msgid " [%6tx] base address %s\n"
+msgstr ""
+
+#: src/readelf.c:4371
+#, c-format
+msgid " [%6tx] %s..%s\n"
+msgstr ""
+
+#: src/readelf.c:4373
+#, c-format
+msgid " %s..%s\n"
+msgstr ""
+
+#: src/readelf.c:4799 src/readelf.c:6230 src/readelf.c:6332
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr ""
+
+#: src/readelf.c:4806
+#, c-format
+msgid ""
+"\n"
+"Call frame information section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:4833 src/readelf.c:5486
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr ""
+
+#: src/readelf.c:4855
+#, c-format
+msgid ""
+"\n"
+" [%6tx] Zero terminator\n"
+msgstr ""
+
+#: src/readelf.c:4924
+#, c-format
+msgid "invalid augmentation length"
+msgstr ""
+
+#: src/readelf.c:4936
+msgid "FDE address encoding: "
+msgstr ""
+
+#: src/readelf.c:4942
+msgid "LSDA pointer encoding: "
+msgstr ""
+
+#: src/readelf.c:5034
+#, c-format
+msgid " (offset: %#<PRIx64>)"
+msgstr ""
+
+#: src/readelf.c:5041
+#, c-format
+msgid " (end offset: %#<PRIx64>)"
+msgstr ""
+
+#: src/readelf.c:5068
+#, c-format
+msgid " %-26sLSDA pointer: %#<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:5114
+#, c-format
+msgid "cannot get attribute code: %s"
+msgstr ""
+
+#: src/readelf.c:5122
+#, c-format
+msgid "cannot get attribute form: %s"
+msgstr ""
+
+#: src/readelf.c:5135
+#, c-format
+msgid "cannot get attribute value: %s"
+msgstr ""
+
+#: src/readelf.c:5331
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [Offset]\n"
+msgstr ""
+
+#: src/readelf.c:5356
+#, c-format
+msgid ""
+" Compilation unit at offset %<PRIu64>:\n"
+" Version: %<PRIu16>, Abbreviation section offset: %<PRIu64>, Address size: %"
+"<PRIu8>, Offset size: %<PRIu8>\n"
+msgstr ""
+
+#: src/readelf.c:5374
+#, c-format
+msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
+msgstr ""
+
+#: src/readelf.c:5385
+#, c-format
+msgid "cannot get DIE offset: %s"
+msgstr ""
+
+#: src/readelf.c:5393
+#, c-format
+msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
+msgstr ""
+
+#: src/readelf.c:5422
+#, c-format
+msgid "cannot get next DIE: %s\n"
+msgstr ""
+
+#: src/readelf.c:5429
+#, c-format
+msgid "cannot get next DIE: %s"
+msgstr ""
+
+#: src/readelf.c:5464
+#, c-format
+msgid "cannot get line data section data: %s"
+msgstr ""
+
+#: src/readelf.c:5477
+#, c-format
+msgid ""
+"\n"
+"Table at offset %Zu:\n"
+msgstr ""
+
+#: src/readelf.c:5529
+#, c-format
+msgid ""
+"\n"
+" Length: %<PRIu64>\n"
+" DWARF version: %<PRIuFAST16>\n"
+" Prologue length: %<PRIu64>\n"
+" Minimum instruction length: %<PRIuFAST8>\n"
+" Initial value if '%s': %<PRIuFAST8>\n"
+" Line base: %<PRIdFAST8>\n"
+" Line range: %<PRIuFAST8>\n"
+" Opcode base: %<PRIuFAST8>\n"
+"\n"
+"Opcodes:\n"
+msgstr ""
+
+#: src/readelf.c:5548
+#, c-format
+msgid "invalid data at offset %tu in section [%zu] '%s'"
+msgstr ""
+
+#: src/readelf.c:5563
+#, c-format
+msgid " [%*<PRIuFAST8>] %hhu argument\n"
+msgid_plural " [%*<PRIuFAST8>] %hhu arguments\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:5571
+msgid ""
+"\n"
+"Directory table:"
+msgstr ""
+
+#: src/readelf.c:5587
+msgid ""
+"\n"
+"File name table:\n"
+" Entry Dir Time Size Name"
+msgstr ""
+
+#: src/readelf.c:5616
+msgid ""
+"\n"
+"Line number statements:"
+msgstr ""
+
+#: src/readelf.c:5677
+#, c-format
+msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
+msgstr ""
+
+#: src/readelf.c:5697
+#, c-format
+msgid " extended opcode %u: "
+msgstr ""
+
+#: src/readelf.c:5702
+msgid "end of sequence"
+msgstr ""
+
+#: src/readelf.c:5717
+#, c-format
+msgid "set address to %s\n"
+msgstr ""
+
+#: src/readelf.c:5738
+#, c-format
+msgid "define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
+msgstr ""
+
+#: src/readelf.c:5747
+msgid "unknown opcode"
+msgstr ""
+
+#: src/readelf.c:5759
+msgid " copy"
+msgstr ""
+
+#: src/readelf.c:5769
+#, c-format
+msgid "advance address by %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5780
+#, c-format
+msgid " advance line by constant %d to %<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:5788
+#, c-format
+msgid " set file to %<PRIu64>\n"
+msgstr ""
+
+#: src/readelf.c:5798
+#, c-format
+msgid " set column to %<PRIu64>\n"
+msgstr ""
+
+#: src/readelf.c:5805
+#, c-format
+msgid " set '%s' to %<PRIuFAST8>\n"
+msgstr ""
+
+#: src/readelf.c:5811
+msgid " set basic block flag"
+msgstr ""
+
+#: src/readelf.c:5821
+#, c-format
+msgid "advance address by constant %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5837
+#, c-format
+msgid "advance address by fixed value %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5846
+msgid " set prologue end flag"
+msgstr ""
+
+#: src/readelf.c:5851
+msgid " set epilogue begin flag"
+msgstr ""
+
+#: src/readelf.c:5860
+#, c-format
+msgid " unknown opcode with %<PRIu8> parameter:"
+msgid_plural " unknown opcode with %<PRIu8> parameters:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:5892
+#, c-format
+msgid "cannot get .debug_loc content: %s"
+msgstr ""
+
+#: src/readelf.c:5947
+#, c-format
+msgid " [%6tx] %s..%s"
+msgstr ""
+
+#: src/readelf.c:5949
+#, c-format
+msgid " %s..%s"
+msgstr ""
+
+#: src/readelf.c:6002
+#, c-format
+msgid "cannot get macro information section data: %s"
+msgstr ""
+
+#: src/readelf.c:6081
+#, c-format
+msgid "%*s*** non-terminated string at end of section"
+msgstr ""
+
+#: src/readelf.c:6149
+#, c-format
+msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
+msgstr ""
+
+#: src/readelf.c:6188
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" %*s String\n"
+msgstr ""
+
+#: src/readelf.c:6202
+#, c-format
+msgid " *** error while reading strings: %s\n"
+msgstr ""
+
+#: src/readelf.c:6222
+#, c-format
+msgid ""
+"\n"
+"Call frame search table section [%2zu] '.eh_frame_hdr':\n"
+msgstr ""
+
+#: src/readelf.c:6324
+#, c-format
+msgid ""
+"\n"
+"Exception handling table section [%2zu] '.gcc_except_table':\n"
+msgstr ""
+
+#: src/readelf.c:6347
+#, c-format
+msgid " LPStart encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6359
+#, c-format
+msgid " TType encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6373
+#, c-format
+msgid " Call site encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6386
+msgid ""
+"\n"
+" Call site table:"
+msgstr ""
+
+#: src/readelf.c:6400
+#, c-format
+msgid ""
+" [%4u] Call site start: %#<PRIx64>\n"
+" Call site length: %<PRIu64>\n"
+" Landing pad: %#<PRIx64>\n"
+" Action: %u\n"
+msgstr ""
+
+#: src/readelf.c:6460
+#, c-format
+msgid "invalid TType encoding"
+msgstr ""
+
+#: src/readelf.c:6484
+#, c-format
+msgid "cannot get debug context descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:6620 src/readelf.c:7221
+#, c-format
+msgid "cannot convert core note data: %s"
+msgstr ""
+
+#: src/readelf.c:6961
+#, c-format
+msgid ""
+"\n"
+"%*s... <repeats %u more times> ..."
+msgstr ""
+
+#: src/readelf.c:7320
+msgid " Owner Data size Type\n"
+msgstr ""
+
+#: src/readelf.c:7338
+#, c-format
+msgid " %-13.*s %9<PRId32> %s\n"
+msgstr ""
+
+#: src/readelf.c:7372
+#, c-format
+msgid "cannot get content of note section: %s"
+msgstr ""
+
+#: src/readelf.c:7399
+#, c-format
+msgid ""
+"\n"
+"Note section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7422
+#, c-format
+msgid ""
+"\n"
+"Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7468
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no data to dump.\n"
+msgstr ""
+
+#: src/readelf.c:7474 src/readelf.c:7497
+#, c-format
+msgid "cannot get data for section [%Zu] '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7478
+#, c-format
+msgid ""
+"\n"
+"Hex dump of section [%Zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7491
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no strings to dump.\n"
+msgstr ""
+
+#: src/readelf.c:7501
+#, c-format
+msgid ""
+"\n"
+"String section [%Zu] '%s' contains %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7549
+#, c-format
+msgid ""
+"\n"
+"section [%lu] does not exist"
+msgstr ""
+
+#: src/readelf.c:7576
+#, c-format
+msgid ""
+"\n"
+"section '%s' does not exist"
+msgstr ""
+
+#: src/readelf.c:7637
+#, c-format
+msgid "cannot get symbol index of archive '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7640
+#, c-format
+msgid ""
+"\n"
+"Archive '%s' has no symbol index\n"
+msgstr ""
+
+#: src/readelf.c:7644
+#, c-format
+msgid ""
+"\n"
+"Index of archive '%s' has %Zu entries:\n"
+msgstr ""
+
+#: src/readelf.c:7662
+#, c-format
+msgid "cannot extract member at offset %Zu in '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7667
+#, c-format
+msgid "Archive member '%s' contains:\n"
+msgstr ""
+
+#: src/size.c:68
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd' or `sysv'. The default "
+"is `bsd'"
+msgstr ""
+
+#: src/size.c:70
+msgid "Same as `--format=sysv'"
+msgstr ""
+
+#: src/size.c:71
+msgid "Same as `--format=bsd'"
+msgstr ""
+
+#: src/size.c:74
+msgid "Same as `--radix=10'"
+msgstr ""
+
+#: src/size.c:75
+msgid "Same as `--radix=8'"
+msgstr ""
+
+#: src/size.c:76
+msgid "Same as `--radix=16'"
+msgstr ""
+
+#: src/size.c:78
+msgid "Similar to `--format=sysv' output but in one line"
+msgstr ""
+
+#: src/size.c:82
+msgid "Print size and permission flags for loadable segments"
+msgstr ""
+
+#: src/size.c:83
+msgid "Display the total sizes (bsd only)"
+msgstr ""
+
+#: src/size.c:88
+msgid "List section sizes of FILEs (a.out by default)."
+msgstr ""
+
+#: src/size.c:269
+#, c-format
+msgid "Invalid format: %s"
+msgstr ""
+
+#: src/size.c:280
+#, c-format
+msgid "Invalid radix: %s"
+msgstr ""
+
+#: src/size.c:339
+#, c-format
+msgid "%s: file format not recognized"
+msgstr ""
+
+#: src/size.c:446 src/size.c:589
+#, c-format
+msgid " (ex %s)"
+msgstr ""
+
+#: src/size.c:614
+msgid "(TOTALS)\n"
+msgstr ""
+
+#: src/strings.c:70
+msgid "Output Selection:"
+msgstr ""
+
+#: src/strings.c:71
+msgid "Scan entire file, not only loaded sections"
+msgstr ""
+
+#: src/strings.c:73
+msgid "Only NUL-terminated sequences of MIN-LEN characters or more are printed"
+msgstr ""
+
+#: src/strings.c:74
+msgid ""
+"Select character size and endianess: s = 7-bit, S = 8-bit, {b,l} = 16-bit, "
+"{B,L} = 32-bit"
+msgstr ""
+
+#: src/strings.c:78
+msgid "Print name of the file before each string."
+msgstr ""
+
+#: src/strings.c:80
+msgid "Print location of the string in base 8, 10, or 16 respectively."
+msgstr ""
+
+#: src/strings.c:81
+msgid "Alias for --radix=o"
+msgstr ""
+
+#: src/strings.c:88
+msgid "Print the strings of printable characters in files."
+msgstr ""
+
+#: src/strings.c:268 src/strings.c:303
+#, c-format
+msgid "invalid value '%s' for %s parameter"
+msgstr ""
+
+#: src/strings.c:314
+#, c-format
+msgid "invalid minimum length of matched string size"
+msgstr ""
+
+#: src/strings.c:601
+#, c-format
+msgid "lseek64 failed"
+msgstr ""
+
+#: src/strings.c:616 src/strings.c:680
+#, c-format
+msgid "re-mmap failed"
+msgstr ""
+
+#: src/strings.c:653
+#, c-format
+msgid "mprotect failed"
+msgstr ""
+
+#: src/strip.c:74
+msgid "Place stripped output into FILE"
+msgstr ""
+
+#: src/strip.c:75
+msgid "Extract the removed sections into FILE"
+msgstr ""
+
+#: src/strip.c:76
+msgid "Embed name FILE instead of -f argument"
+msgstr ""
+
+#: src/strip.c:80
+msgid "Remove all debugging symbols"
+msgstr ""
+
+#: src/strip.c:84
+msgid "Copy modified/access timestamps to the output"
+msgstr ""
+
+#: src/strip.c:86
+msgid "Remove .comment section"
+msgstr ""
+
+#: src/strip.c:89
+msgid "Relax a few rules to handle slightly broken ELF files"
+msgstr ""
+
+#: src/strip.c:94
+msgid "Discard symbols from object files."
+msgstr ""
+
+#: src/strip.c:186
+#, c-format
+msgid "Only one input file allowed together with '-o' and '-f'"
+msgstr ""
+
+#: src/strip.c:222
+#, c-format
+msgid "-f option specified twice"
+msgstr ""
+
+#: src/strip.c:231
+#, c-format
+msgid "-F option specified twice"
+msgstr ""
+
+#: src/strip.c:240 src/unstrip.c:125
+#, c-format
+msgid "-o option specified twice"
+msgstr ""
+
+#: src/strip.c:260
+#, c-format
+msgid "-R option supports only .comment section"
+msgstr ""
+
+#: src/strip.c:298 src/strip.c:322
+#, c-format
+msgid "cannot stat input file '%s'"
+msgstr ""
+
+#: src/strip.c:312
+#, c-format
+msgid "while opening '%s'"
+msgstr ""
+
+#: src/strip.c:350
+#, c-format
+msgid "%s: cannot use -o or -f when stripping archive"
+msgstr ""
+
+#: src/strip.c:448
+#, c-format
+msgid "cannot open EBL backend"
+msgstr ""
+
+#: src/strip.c:498 src/strip.c:522
+#, c-format
+msgid "cannot create new file '%s': %s"
+msgstr ""
+
+#: src/strip.c:582
+#, c-format
+msgid "illformed file '%s'"
+msgstr ""
+
+#: src/strip.c:869 src/strip.c:956
+#, c-format
+msgid "while generating output file: %s"
+msgstr ""
+
+#: src/strip.c:929 src/strip.c:1668
+#, c-format
+msgid "%s: error while creating ELF header: %s"
+msgstr ""
+
+#: src/strip.c:943
+#, c-format
+msgid "while preparing output for '%s'"
+msgstr ""
+
+#: src/strip.c:994 src/strip.c:1050
+#, c-format
+msgid "while create section header section: %s"
+msgstr ""
+
+#: src/strip.c:1000
+#, c-format
+msgid "cannot allocate section data: %s"
+msgstr ""
+
+#: src/strip.c:1059
+#, c-format
+msgid "while create section header string table: %s"
+msgstr ""
+
+#: src/strip.c:1593 src/strip.c:1690
+#, c-format
+msgid "while writing '%s': %s"
+msgstr ""
+
+#: src/strip.c:1604
+#, c-format
+msgid "while creating '%s'"
+msgstr ""
+
+#: src/strip.c:1616
+#, c-format
+msgid "while computing checksum for debug information"
+msgstr ""
+
+#: src/strip.c:1676
+#, c-format
+msgid "%s: error while reading the file: %s"
+msgstr ""
+
+#: src/strip.c:1722 src/strip.c:1729
+#, c-format
+msgid "error while finishing '%s': %s"
+msgstr ""
+
+#: src/strip.c:1752 src/strip.c:1809
+#, c-format
+msgid "cannot set access and modification date of '%s'"
+msgstr ""
+
+#: src/unstrip.c:78
+msgid "Match MODULE against file names, not module names"
+msgstr ""
+
+#: src/unstrip.c:79
+msgid "Silently skip unfindable files"
+msgstr ""
+
+#: src/unstrip.c:82
+msgid "Place output into FILE"
+msgstr ""
+
+#: src/unstrip.c:84
+msgid "Create multiple output files under DIRECTORY"
+msgstr ""
+
+#: src/unstrip.c:85
+msgid "Use module rather than file names"
+msgstr ""
+
+#: src/unstrip.c:87
+msgid "Create output for modules that have no separate debug information"
+msgstr ""
+
+#: src/unstrip.c:90
+msgid "Apply relocations to section contents in ET_REL files"
+msgstr ""
+
+#: src/unstrip.c:92
+msgid "Only list module and file names, build IDs"
+msgstr ""
+
+#: src/unstrip.c:134
+#, c-format
+msgid "-d option specified twice"
+msgstr ""
+
+#: src/unstrip.c:166
+#, c-format
+msgid "only one of -o or -d allowed"
+msgstr ""
+
+#: src/unstrip.c:175
+#, c-format
+msgid "-n cannot be used with explicit files or -o or -d"
+msgstr ""
+
+#: src/unstrip.c:190
+#, c-format
+msgid "output directory '%s'"
+msgstr ""
+
+#: src/unstrip.c:199
+#, c-format
+msgid "exactly two file arguments are required"
+msgstr ""
+
+#: src/unstrip.c:205
+#, c-format
+msgid "-m, -a, -R, and -i options not allowed with explicit files"
+msgstr ""
+
+#: src/unstrip.c:218
+#, c-format
+msgid "-o or -d is required when using implicit files"
+msgstr ""
+
+#: src/unstrip.c:254
+#, c-format
+msgid "cannot create ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:259
+#, c-format
+msgid "cannot copy ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:264 src/unstrip.c:1817
+#, c-format
+msgid "cannot create program headers: %s"
+msgstr ""
+
+#: src/unstrip.c:270
+#, c-format
+msgid "cannot copy program header: %s"
+msgstr ""
+
+#: src/unstrip.c:280
+#, c-format
+msgid "cannot copy section header: %s"
+msgstr ""
+
+#: src/unstrip.c:283 src/unstrip.c:1505
+#, c-format
+msgid "cannot get section data: %s"
+msgstr ""
+
+#: src/unstrip.c:285 src/unstrip.c:1507
+#, c-format
+msgid "cannot copy section data: %s"
+msgstr ""
+
+#: src/unstrip.c:309
+#, c-format
+msgid "cannot create directory '%s'"
+msgstr ""
+
+#: src/unstrip.c:349 src/unstrip.c:763 src/unstrip.c:1540
+#, c-format
+msgid "cannot get symbol table entry: %s"
+msgstr ""
+
+#: src/unstrip.c:365 src/unstrip.c:580 src/unstrip.c:601 src/unstrip.c:613
+#: src/unstrip.c:1561 src/unstrip.c:1691 src/unstrip.c:1715
+#, c-format
+msgid "cannot update symbol table: %s"
+msgstr ""
+
+#: src/unstrip.c:382 src/unstrip.c:432 src/unstrip.c:562 src/unstrip.c:1209
+#: src/unstrip.c:1525 src/unstrip.c:1720 src/unstrip.c:1791
+#, c-format
+msgid "cannot update section header: %s"
+msgstr ""
+
+#: src/unstrip.c:408 src/unstrip.c:419
+#, c-format
+msgid "cannot update relocation: %s"
+msgstr ""
+
+#: src/unstrip.c:507
+#, c-format
+msgid "cannot get symbol version: %s"
+msgstr ""
+
+#: src/unstrip.c:519
+#, c-format
+msgid "unexpected section type in [%Zu] with sh_link to symtab"
+msgstr ""
+
+#: src/unstrip.c:769
+#, c-format
+msgid "invalid string offset in symbol [%Zu]"
+msgstr ""
+
+#: src/unstrip.c:911 src/unstrip.c:1248
+#, c-format
+msgid "cannot read section [%Zu] name: %s"
+msgstr ""
+
+#: src/unstrip.c:952 src/unstrip.c:971 src/unstrip.c:1004
+#, c-format
+msgid "cannot read '.gnu.prelink_undo' section: %s"
+msgstr ""
+
+#: src/unstrip.c:992
+#, c-format
+msgid "invalid contents in '%s' section"
+msgstr ""
+
+#: src/unstrip.c:1047 src/unstrip.c:1370
+#, c-format
+msgid "cannot find matching section for [%Zu] '%s'"
+msgstr ""
+
+#: src/unstrip.c:1171 src/unstrip.c:1186 src/unstrip.c:1451
+#, c-format
+msgid "cannot add section name to string table: %s"
+msgstr ""
+
+#: src/unstrip.c:1195
+#, c-format
+msgid "cannot update section header string table data: %s"
+msgstr ""
+
+#: src/unstrip.c:1223 src/unstrip.c:1227
+#, c-format
+msgid "cannot get section header string table section index: %s"
+msgstr ""
+
+#: src/unstrip.c:1231 src/unstrip.c:1235 src/unstrip.c:1466
+#, c-format
+msgid "cannot get section count: %s"
+msgstr ""
+
+#: src/unstrip.c:1293 src/unstrip.c:1385
+#, c-format
+msgid "cannot read section header string table: %s"
+msgstr ""
+
+#: src/unstrip.c:1445
+#, c-format
+msgid "cannot add new section: %s"
+msgstr ""
+
+#: src/unstrip.c:1548
+#, c-format
+msgid "symbol [%Zu] has invalid section index"
+msgstr ""
+
+#: src/unstrip.c:1800
+#, c-format
+msgid "cannot get ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:1827
+#, c-format
+msgid "cannot update program header: %s"
+msgstr ""
+
+#: src/unstrip.c:1832 src/unstrip.c:1911
+#, c-format
+msgid "cannot write output file: %s"
+msgstr ""
+
+#: src/unstrip.c:1880
+#, c-format
+msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+
+#: src/unstrip.c:1883
+#, c-format
+msgid ""
+"DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+
+#: src/unstrip.c:1902 src/unstrip.c:1942 src/unstrip.c:1954 src/unstrip.c:2034
+#, c-format
+msgid "cannot create ELF descriptor: %s"
+msgstr ""
+
+#: src/unstrip.c:1960
+#, c-format
+msgid "'%s' and '%s' do not seem to match"
+msgstr ""
+
+#: src/unstrip.c:1991
+#, c-format
+msgid "cannot find stripped file for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:1995
+#, c-format
+msgid "cannot open stripped file '%s' for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2010
+#, c-format
+msgid "cannot find debug file for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2014
+#, c-format
+msgid "cannot open debug file '%s' for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2027
+#, c-format
+msgid "module '%s' file '%s' is not stripped"
+msgstr ""
+
+#: src/unstrip.c:2058
+#, c-format
+msgid "cannot cache section addresses for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2191
+#, c-format
+msgid "no matching modules found"
+msgstr ""
+
+#: src/unstrip.c:2200
+#, c-format
+msgid "matched more than one module"
+msgstr ""
+
+#: src/unstrip.c:2247
+msgid ""
+"STRIPPED-FILE DEBUG-FILE\n"
+"[MODULE...]"
+msgstr ""
+
+#: src/unstrip.c:2248
+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"
+"\n"
+"MODULE arguments give file name patterns matching modules to process.\n"
+"With -f these match the file name of the main (stripped) file (slashes are "
+"never special), otherwise they match the simple module names. With no "
+"arguments, process all modules found.\n"
+"\n"
+"Multiple modules are written to files under OUTPUT-DIRECTORY, creating "
+"subdirectories as needed. With -m these files have simple module names, "
+"otherwise they have the name of the main file complete with directory "
+"underneath OUTPUT-DIRECTORY.\n"
+"\n"
+"With -n no files are written, but one line to standard output for each "
+"module:\n"
+"\tSTART+SIZE BUILDID FILE DEBUGFILE MODULENAME\n"
+"START and SIZE are hexadecimal giving the address bounds of the module. "
+"BUILDID is hexadecimal for the build ID bits, or - if no ID is known; the "
+"hexadecimal may be followed by @0xADDR giving the address where the ID "
+"resides if that is known. FILE is the file name found for the module, or - "
+"if none was found, or . if an ELF image is available but not from any named "
+"file. DEBUGFILE is the separate debuginfo file name, or - if no debuginfo "
+"was found, or . if FILE contains the debug information."
+msgstr ""
diff --git a/po/uk.po b/po/uk.po
new file mode 100644
index 00000000..a655e26d
--- /dev/null
+++ b/po/uk.po
@@ -0,0 +1,6279 @@
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Yuri Chornoivan <yurchor@ukr.net>, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
+"POT-Creation-Date: 2010-05-06 14:20+0000\n"
+"PO-Revision-Date: 2010-05-06 18:07+0300\n"
+"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
+"Language-Team: Ukrainian <kde-i18n-doc@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: uk\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 "
+"&& (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Lokalize 1.0\n"
+
+#: ../lib/xmalloc.c:51 ../lib/xmalloc.c:65 ../lib/xmalloc.c:79
+#: ../src/readelf.c:2822 ../src/readelf.c:3161 ../src/unstrip.c:2087
+#: ../src/unstrip.c:2295
+#, c-format
+msgid "memory exhausted"
+msgstr "пам’ять вичерпано"
+
+#: ../libasm/asm_error.c:62 ../libdw/dwarf_error.c:79 ../libdwfl/libdwflP.h:70
+#: ../libelf/elf_error.c:81
+msgid "no error"
+msgstr "без помилок"
+
+#: ../libasm/asm_error.c:63 ../libdw/dwarf_error.c:88 ../libdwfl/libdwflP.h:72
+#: ../libelf/elf_error.c:112
+msgid "out of memory"
+msgstr "нестача пам'яті"
+
+#: ../libasm/asm_error.c:64 ../src/ldgeneric.c:2687
+#, c-format
+msgid "cannot create output file"
+msgstr "не вдалося створити файл виводу даних"
+
+#: ../libasm/asm_error.c:65
+msgid "invalid parameter"
+msgstr "некоректний параметр"
+
+#: ../libasm/asm_error.c:66
+msgid "cannot change mode of output file"
+msgstr "не вдалося змінити права доступу до файла виводу даних"
+
+#. Something went wrong.
+#: ../libasm/asm_error.c:67 ../src/ldgeneric.c:7001
+#, c-format
+msgid "cannot rename output file"
+msgstr "не вдалося перейменувати файл виводу даних"
+
+#: ../libasm/asm_error.c:68
+msgid "duplicate symbol"
+msgstr "дублювання символів"
+
+#: ../libasm/asm_error.c:69
+msgid "invalid section type for operation"
+msgstr "некоректний тип розділу для дії"
+
+#: ../libasm/asm_error.c:70
+msgid "error during output of data"
+msgstr "помилка під час спроби виведення даних"
+
+#: ../libasm/asm_error.c:71
+msgid "no backend support available"
+msgstr "підтримки серверів не передбачено"
+
+#: ../libasm/asm_error.c:81 ../libdw/dwarf_error.c:80 ../libdwfl/libdwflP.h:71
+#: ../libelf/elf_error.c:84
+msgid "unknown error"
+msgstr "невідома помилка"
+
+#: ../libdw/dwarf_error.c:81
+msgid "invalid access"
+msgstr "некоректний доступ"
+
+#: ../libdw/dwarf_error.c:82
+msgid "no regular file"
+msgstr "не є звичайним файлом"
+
+#: ../libdw/dwarf_error.c:83
+msgid "I/O error"
+msgstr "помилка вводу/виводу"
+
+#: ../libdw/dwarf_error.c:84
+msgid "invalid ELF file"
+msgstr "некоректний файл ELF"
+
+#: ../libdw/dwarf_error.c:85
+msgid "no DWARF information"
+msgstr "немає відомостей DWARF"
+
+#: ../libdw/dwarf_error.c:86
+msgid "no ELF file"
+msgstr "немає файла ELF"
+
+#: ../libdw/dwarf_error.c:87
+msgid "cannot get ELF header"
+msgstr "не вдалося отримати заголовок ELF"
+
+#: ../libdw/dwarf_error.c:89
+msgid "not implemented"
+msgstr "не реалізовано"
+
+#: ../libdw/dwarf_error.c:90 ../libelf/elf_error.c:128
+#: ../libelf/elf_error.c:176
+msgid "invalid command"
+msgstr "некоректна команда"
+
+#: ../libdw/dwarf_error.c:91
+msgid "invalid version"
+msgstr "некоректна версія"
+
+#: ../libdw/dwarf_error.c:92
+msgid "invalid file"
+msgstr "некоректний файл"
+
+#: ../libdw/dwarf_error.c:93
+msgid "no entries found"
+msgstr "запис не знайдено"
+
+#: ../libdw/dwarf_error.c:94
+msgid "invalid DWARF"
+msgstr "некоректний запис DWARF"
+
+#: ../libdw/dwarf_error.c:95
+msgid "no string data"
+msgstr "немає рядкових даних"
+
+#: ../libdw/dwarf_error.c:96
+msgid "no address value"
+msgstr "немає значення адреси"
+
+#: ../libdw/dwarf_error.c:97
+msgid "no constant value"
+msgstr "немає значення сталої"
+
+#: ../libdw/dwarf_error.c:98
+msgid "no reference value"
+msgstr "немає значення для порівняння"
+
+#: ../libdw/dwarf_error.c:99
+msgid "invalid reference value"
+msgstr "некоректне значення для порівняння"
+
+#: ../libdw/dwarf_error.c:100
+msgid ".debug_line section missing"
+msgstr "немає розділу .debug_line"
+
+#: ../libdw/dwarf_error.c:101
+msgid "invalid .debug_line section"
+msgstr "некоректний розділ .debug_line"
+
+#: ../libdw/dwarf_error.c:102
+msgid "debug information too big"
+msgstr "занадто великі відомості для діагностики"
+
+#: ../libdw/dwarf_error.c:103
+msgid "invalid DWARF version"
+msgstr "некоректна версія DWARF"
+
+#: ../libdw/dwarf_error.c:104
+msgid "invalid directory index"
+msgstr "некоректний покажчик каталогу"
+
+#: ../libdw/dwarf_error.c:105 ../libdwfl/libdwflP.h:91
+msgid "address out of range"
+msgstr "некоректна адреса"
+
+#: ../libdw/dwarf_error.c:106
+msgid "no location list value"
+msgstr "немає значення списку адрес"
+
+#: ../libdw/dwarf_error.c:107
+msgid "no block data"
+msgstr "немає блокових даних"
+
+#: ../libdw/dwarf_error.c:108
+msgid "invalid line index"
+msgstr "некоректний номер рядка"
+
+#: ../libdw/dwarf_error.c:109
+msgid "invalid address range index"
+msgstr "некоректний індекс діапазону адрес"
+
+#: ../libdw/dwarf_error.c:110 ../libdwfl/libdwflP.h:92
+msgid "no matching address range"
+msgstr "не виявлено відповідного діапазону адрес"
+
+#: ../libdw/dwarf_error.c:111
+msgid "no flag value"
+msgstr "немає значення прапорця"
+
+#: ../libdw/dwarf_error.c:112 ../libelf/elf_error.c:253
+msgid "invalid offset"
+msgstr "некоректне значення зміщення"
+
+#: ../libdw/dwarf_error.c:113
+msgid ".debug_ranges section missing"
+msgstr "немає розділу .debug_ranges"
+
+#: ../libdw/dwarf_error.c:114
+msgid "invalid CFI section"
+msgstr "некоректний розділ CFI"
+
+#: ../libdwfl/argp-std.c:67 ../src/unstrip.c:2237
+msgid "Input selection options:"
+msgstr "Вибір параметрів виведення даних:"
+
+#: ../libdwfl/argp-std.c:68
+msgid "Find addresses in FILE"
+msgstr "Знайти адреси у ФАЙЛІ"
+
+#: ../libdwfl/argp-std.c:70
+msgid "Find addresses from signatures found in COREFILE"
+msgstr "Знайти адреси за сигнатурами з файла COREFILE"
+
+#: ../libdwfl/argp-std.c:72
+msgid "Find addresses in files mapped into process PID"
+msgstr "Знайти адреси у файлах, відображених на процес з PID"
+
+#: ../libdwfl/argp-std.c:74
+msgid ""
+"Find addresses in files mapped as read from FILE in Linux /proc/PID/maps "
+"format"
+msgstr ""
+"Знайти адреси у файлах, відображених як read за ФАЙЛОМ у форматі /proc/PID/"
+"maps Linux"
+
+#: ../libdwfl/argp-std.c:76
+msgid "Find addresses in the running kernel"
+msgstr "Знайти адреси у запущеному ядрі"
+
+#: ../libdwfl/argp-std.c:78
+msgid "Kernel with all modules"
+msgstr "Ядро з усіма модулями"
+
+#: ../libdwfl/argp-std.c:80
+msgid "Search path for separate debuginfo files"
+msgstr "Шукати у вказаному каталозі окремі файли debuginfo"
+
+#: ../libdwfl/argp-std.c:163
+msgid "only one of -e, -p, -k, -K, or --core allowed"
+msgstr "можна використовувати лише один за параметрів: -e, -p, -k, -K або --core"
+
+#: ../libdwfl/argp-std.c:223
+#, c-format
+msgid "cannot read ELF core file: %s"
+msgstr "не вдалося прочитати файл core ELF: %s"
+
+#: ../libdwfl/argp-std.c:241
+msgid "No modules recognized in core file"
+msgstr "Не вдалося виявити модулі у файлі core"
+
+#: ../libdwfl/argp-std.c:253
+msgid "cannot load kernel symbols"
+msgstr "не вдалося завантажити символи ядра"
+
+#. Non-fatal to have no modules since we do have the kernel.
+#: ../libdwfl/argp-std.c:257
+msgid "cannot find kernel modules"
+msgstr "не вдалося виявити модулі ядра"
+
+#: ../libdwfl/argp-std.c:271
+msgid "cannot find kernel or modules"
+msgstr "не вдалося виявити ядро або модулі"
+
+#: ../libdwfl/libdwflP.h:73
+msgid "See errno"
+msgstr "Див. errno"
+
+#: ../libdwfl/libdwflP.h:74
+msgid "See elf_errno"
+msgstr "Див. elf_errno"
+
+#: ../libdwfl/libdwflP.h:75
+msgid "See dwarf_errno"
+msgstr "Див. dwarf_errno"
+
+#: ../libdwfl/libdwflP.h:76
+msgid "See ebl_errno (XXX missing)"
+msgstr "Див. ebl_errno (не виявлено XXX)"
+
+#: ../libdwfl/libdwflP.h:77
+msgid "gzip decompression failed"
+msgstr "Помилка під час спроби видобування з gzip"
+
+#: ../libdwfl/libdwflP.h:78
+msgid "bzip2 decompression failed"
+msgstr "Помилка під час спроби видобування з bzip2"
+
+#: ../libdwfl/libdwflP.h:79
+msgid "LZMA decompression failed"
+msgstr "Помилка під час спроби видобування з LZMA"
+
+#: ../libdwfl/libdwflP.h:80
+msgid "no support library found for machine"
+msgstr "у системі не виявлено бібліотеки підтримки"
+
+#: ../libdwfl/libdwflP.h:81
+msgid "Callbacks missing for ET_REL file"
+msgstr "Немає зворотних викликів для файла ET_REL"
+
+#: ../libdwfl/libdwflP.h:82
+msgid "Unsupported relocation type"
+msgstr "Непідтримуваний тип переміщення"
+
+#: ../libdwfl/libdwflP.h:83
+msgid "r_offset is bogus"
+msgstr "r_offset є фіктивним"
+
+#: ../libdwfl/libdwflP.h:84 ../libelf/elf_error.c:132
+#: ../libelf/elf_error.c:192
+msgid "offset out of range"
+msgstr "перевищення можливого зміщення"
+
+#: ../libdwfl/libdwflP.h:85
+msgid "relocation refers to undefined symbol"
+msgstr "переміщення посилається на невизначений символ."
+
+#: ../libdwfl/libdwflP.h:86
+msgid "Callback returned failure"
+msgstr "Зворотним викликом повернуто помилку"
+
+#: ../libdwfl/libdwflP.h:87
+msgid "No DWARF information found"
+msgstr "Не виявлено відомостей DWARF"
+
+#: ../libdwfl/libdwflP.h:88
+msgid "No symbol table found"
+msgstr "Не виявлено таблиці символів"
+
+#: ../libdwfl/libdwflP.h:89
+msgid "No ELF program headers"
+msgstr "Немає заголовків програми ELF"
+
+#: ../libdwfl/libdwflP.h:90
+msgid "address range overlaps an existing module"
+msgstr "діапазон адрес перекриває існуючий модуль"
+
+#: ../libdwfl/libdwflP.h:93
+msgid "image truncated"
+msgstr "образ обрізано"
+
+#: ../libdwfl/libdwflP.h:94
+msgid "ELF file opened"
+msgstr "Відкритий файл ELF"
+
+#: ../libdwfl/libdwflP.h:95
+msgid "not a valid ELF file"
+msgstr "не є коректним файлом ELF"
+
+#: ../libdwfl/libdwflP.h:96
+msgid "cannot handle DWARF type description"
+msgstr "не вдалося обробити опис типу DWARF"
+
+#: ../libdwfl/libdwflP.h:97
+msgid "ELF file does not match build ID"
+msgstr "Файл ELF не відповідає ідентифікатору збирання"
+
+#: ../libebl/eblbackendname.c:63
+msgid "No backend"
+msgstr "Немає сервера"
+
+#: ../libebl/eblcorenotetypename.c:107 ../libebl/eblobjecttypename.c:78
+#: ../libebl/eblobjnotetypename.c:86 ../libebl/eblosabiname.c:98
+#: ../libebl/eblsectionname.c:110 ../libebl/eblsectiontypename.c:140
+#: ../libebl/eblsegmenttypename.c:104
+msgid "<unknown>"
+msgstr "<невідомо>"
+
+#: ../libebl/ebldynamictagname.c:126
+#, c-format
+msgid "<unknown>: %#<PRIx64>"
+msgstr "<невідомо>: %#<PRIx64>"
+
+#: ../libebl/eblobjnote.c:76
+#, c-format
+msgid " Build ID: "
+msgstr " Ід. збирання: "
+
+#. A non-null terminated version string.
+#: ../libebl/eblobjnote.c:87
+#, c-format
+msgid " Linker version: %.*s\n"
+msgstr " Версія компонувальника: %.*s\n"
+
+#: ../libebl/eblobjnote.c:136
+#, c-format
+msgid " OS: %s, ABI: "
+msgstr " ОС: %s, ABI: "
+
+#: ../libebl/eblosabiname.c:95
+msgid "Stand alone"
+msgstr "Окремий"
+
+#: ../libebl/eblsymbolbindingname.c:92 ../libebl/eblsymboltypename.c:98
+#, c-format
+msgid "<unknown>: %d"
+msgstr "<невідомий>: %d"
+
+#: ../libelf/elf_error.c:88
+msgid "unknown version"
+msgstr "невідома версія"
+
+#: ../libelf/elf_error.c:92
+msgid "unknown type"
+msgstr "невизначений тип"
+
+#: ../libelf/elf_error.c:96
+msgid "invalid `Elf' handle"
+msgstr "некоректний дескриптор «Elf»"
+
+#: ../libelf/elf_error.c:100
+msgid "invalid size of source operand"
+msgstr "некоректна розмірність вхідного параметра"
+
+#: ../libelf/elf_error.c:104
+msgid "invalid size of destination operand"
+msgstr "некоректна розмірність вихідного параметра"
+
+#: ../libelf/elf_error.c:108 ../src/readelf.c:4779
+#, c-format
+msgid "invalid encoding"
+msgstr "некоректне кодування"
+
+#: ../libelf/elf_error.c:116
+msgid "invalid file descriptor"
+msgstr "некоректний дескриптор файла"
+
+#: ../libelf/elf_error.c:120
+msgid "invalid operation"
+msgstr "недійсна дія"
+
+#: ../libelf/elf_error.c:124
+msgid "ELF version not set"
+msgstr "версію ELF не вказано"
+
+#: ../libelf/elf_error.c:136
+msgid "invalid fmag field in archive header"
+msgstr "некоректне поле fmag у заголовку архіву"
+
+#: ../libelf/elf_error.c:140
+msgid "invalid archive file"
+msgstr "некоректний файл архіву"
+
+#: ../libelf/elf_error.c:144
+msgid "descriptor is not for an archive"
+msgstr "дескриптор не належить архіву"
+
+#: ../libelf/elf_error.c:148
+msgid "no index available"
+msgstr "такого номера немає"
+
+#: ../libelf/elf_error.c:152
+msgid "cannot read data from file"
+msgstr "не вдалося прочитати дані з файла"
+
+#: ../libelf/elf_error.c:156
+msgid "cannot write data to file"
+msgstr "не вдалося записати дані до файла"
+
+#: ../libelf/elf_error.c:160
+msgid "invalid binary class"
+msgstr "некоректний бінарний клас"
+
+#: ../libelf/elf_error.c:164
+msgid "invalid section index"
+msgstr "некоректний номер розділу"
+
+#: ../libelf/elf_error.c:168
+msgid "invalid operand"
+msgstr "некоректний параметр"
+
+#: ../libelf/elf_error.c:172
+msgid "invalid section"
+msgstr "некоректний розділ"
+
+#: ../libelf/elf_error.c:180
+msgid "executable header not created first"
+msgstr "заголовок виконуваного файла не було створено першим"
+
+#: ../libelf/elf_error.c:184
+msgid "file descriptor disabled"
+msgstr "дескриптор файла вимкнено"
+
+#: ../libelf/elf_error.c:188
+msgid "archive/member file descriptor mismatch"
+msgstr "невідповідність дескрипторів файлів архіву/елемента"
+
+#: ../libelf/elf_error.c:196
+msgid "cannot manipulate null section"
+msgstr "не можна оперувати нульовим розділом"
+
+#: ../libelf/elf_error.c:200
+msgid "data/scn mismatch"
+msgstr "невідповідність полів data/scn"
+
+#: ../libelf/elf_error.c:204
+msgid "invalid section header"
+msgstr "некоректний заголовок розділу"
+
+#: ../libelf/elf_error.c:208 ../src/readelf.c:6242 ../src/readelf.c:6343
+#, c-format
+msgid "invalid data"
+msgstr "некоректні дані"
+
+#: ../libelf/elf_error.c:212
+msgid "unknown data encoding"
+msgstr "невідоме кодування даних"
+
+#: ../libelf/elf_error.c:216
+msgid "section `sh_size' too small for data"
+msgstr "розділ «sh_size» є замалим для даних"
+
+#: ../libelf/elf_error.c:220
+msgid "invalid section alignment"
+msgstr "некоректне вирівнювання розділу"
+
+#: ../libelf/elf_error.c:224
+msgid "invalid section entry size"
+msgstr "некоректна розмірність запису розділу"
+
+#: ../libelf/elf_error.c:228
+msgid "update() for write on read-only file"
+msgstr "update() для запису придатного лише для читання файла"
+
+#: ../libelf/elf_error.c:232
+msgid "no such file"
+msgstr "такого файла не виявлено"
+
+#: ../libelf/elf_error.c:236
+msgid "only relocatable files can contain section groups"
+msgstr "містити групи розділів можуть лише придатні до пересування файли"
+
+#: ../libelf/elf_error.c:241
+msgid "program header only allowed in executables, shared objects, and core files"
+msgstr ""
+"заголовок програми можна використовувати лише у виконуваних файлах, об’єктах "
+"спільного використання та файлах ядра"
+
+#: ../libelf/elf_error.c:248
+msgid "file has no program header"
+msgstr "у файлі немає заголовка програми"
+
+#: ../src/addr2line.c:66
+msgid "Output selection options:"
+msgstr "Параметри вибору виведених даних:"
+
+#: ../src/addr2line.c:67
+msgid "Show only base names of source files"
+msgstr "Показувати лише базові назви файлів коду програми"
+
+#: ../src/addr2line.c:69
+msgid "Show absolute file names using compilation directory"
+msgstr "Показувати абсолютні назви файлів з використанням каталогу збирання"
+
+#: ../src/addr2line.c:70
+msgid "Also show function names"
+msgstr "Показувати також назви функцій"
+
+#: ../src/addr2line.c:71
+msgid "Also show symbol or section names"
+msgstr "Показувати також назви символів та розділів"
+
+#: ../src/addr2line.c:73
+msgid "Treat addresses as offsets relative to NAME section."
+msgstr "Вважати адреси зміщеннями відносно розділу НАЗВА."
+
+#: ../src/addr2line.c:75 ../src/elfcmp.c:75 ../src/findtextrel.c:75
+#: ../src/nm.c:103 ../src/strings.c:83
+msgid "Miscellaneous:"
+msgstr "Інше:"
+
+#. Short description of program.
+#: ../src/addr2line.c:84
+msgid "Locate source files and line information for ADDRs (in a.out by default)."
+msgstr "Шукати АДРЕСИ у файлах кодів та даних про рядки (типово, у a.out)."
+
+#. Strings for arguments in help texts.
+#: ../src/addr2line.c:88
+msgid "[ADDR...]"
+msgstr "[АДРЕСА...]"
+
+#: ../src/addr2line.c:185 ../src/ar.c:289 ../src/elfcmp.c:555
+#: ../src/elflint.c:239 ../src/findtextrel.c:170 ../src/ld.c:957
+#: ../src/nm.c:253 ../src/objdump.c:181 ../src/ranlib.c:136
+#: ../src/readelf.c:449 ../src/size.c:219 ../src/strings.c:227
+#: ../src/strip.c:204 ../src/unstrip.c:234
+#, c-format
+msgid ""
+"Copyright (C) %s Red Hat, Inc.\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+"© Red Hat, Inc., %s\n"
+"Це програмне забезпечення є вільним, умови копіювання викладено у його "
+"початкових кодах. Умовами ліцензування програми НЕ передбачено жодних "
+"гарантій, зокрема гарантій працездатності або придатності для певної мети.\n"
+
+#: ../src/addr2line.c:190 ../src/ar.c:294 ../src/elfcmp.c:560
+#: ../src/elflint.c:244 ../src/findtextrel.c:175 ../src/ld.c:962
+#: ../src/nm.c:258 ../src/objdump.c:186 ../src/ranlib.c:141
+#: ../src/readelf.c:454 ../src/size.c:224 ../src/strings.c:232
+#: ../src/strip.c:209 ../src/unstrip.c:239
+#, c-format
+msgid "Written by %s.\n"
+msgstr "Автор — %s.\n"
+
+#: ../src/addr2line.c:405
+#, c-format
+msgid "Section syntax requires exactly one module"
+msgstr "Синтаксис розділів вимагає точного одного модуля"
+
+#: ../src/addr2line.c:428
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside section '%s'"
+msgstr "зміщення %#<PRIxMAX> розташовано поза межами розділу «%s»"
+
+#: ../src/addr2line.c:461
+#, c-format
+msgid "cannot find symbol '%s'"
+msgstr "не вдалося знайти символ «%s»"
+
+#: ../src/addr2line.c:466
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
+msgstr "зміщення %#<PRIxMAX> розташовано поза межами вмісту «%s»"
+
+#: ../src/ar.c:76
+msgid "Commands:"
+msgstr "Команди:"
+
+#: ../src/ar.c:77
+msgid "Delete files from archive."
+msgstr "Вилучити файли з архіву."
+
+#: ../src/ar.c:78
+msgid "Move files in archive."
+msgstr "Пересунути файли до архіву."
+
+#: ../src/ar.c:79
+msgid "Print files in archive."
+msgstr "Надрукувати список файлів у архіві."
+
+#: ../src/ar.c:80
+msgid "Quick append files to archive."
+msgstr "Швидко додати файли до архіву."
+
+#: ../src/ar.c:82
+msgid "Replace existing or insert new file into archive."
+msgstr "Замінити поточний або вставити новий файл до архіву."
+
+#: ../src/ar.c:83
+msgid "Display content of archive."
+msgstr "Показати вміст архіву."
+
+#: ../src/ar.c:84
+msgid "Extract files from archive."
+msgstr "Видобути файли з архіву."
+
+#: ../src/ar.c:86
+msgid "Command Modifiers:"
+msgstr "Модифікатори команд:"
+
+#: ../src/ar.c:87
+msgid "Preserve original dates."
+msgstr "Зберігати початкові часові мітки."
+
+#: ../src/ar.c:88
+msgid "Use instance [COUNT] of name."
+msgstr "Використовувати екземпляр [НОМЕР] назви."
+
+#: ../src/ar.c:90
+msgid "Do not replace existing files with extracted files."
+msgstr "Не замінювати поточні файли видобутими."
+
+#: ../src/ar.c:91
+msgid "Allow filename to be truncated if necessary."
+msgstr "Уможливити, за потреби, обрізання назв файлів."
+
+#: ../src/ar.c:93
+msgid "Provide verbose output."
+msgstr "Докладний вивід даних."
+
+#: ../src/ar.c:94
+msgid "Force regeneration of symbol table."
+msgstr "Примусове повторне створення таблиці символів."
+
+#: ../src/ar.c:95
+msgid "Insert file after [MEMBER]."
+msgstr "Вставити файл після [ЕЛЕМЕНТ]."
+
+#: ../src/ar.c:96
+msgid "Insert file before [MEMBER]."
+msgstr "Вставити файл перед [ЕЛЕМЕНТ]."
+
+#: ../src/ar.c:97
+msgid "Same as -b."
+msgstr "Те саме, що і -b."
+
+#: ../src/ar.c:98
+msgid "Suppress message when library has to be created."
+msgstr "Придушити повідомлення, якщо має бути створено бібліотеку."
+
+#: ../src/ar.c:100
+msgid "Use full path for file matching."
+msgstr "Використовувати для порівняння повний шлях до файла."
+
+#: ../src/ar.c:101
+msgid "Update only older files in archive."
+msgstr "Оновлювати у архіві лише старіші файли."
+
+#. Short description of program.
+#: ../src/ar.c:107
+msgid "Create, modify, and extract from archives."
+msgstr "Створення, зміна архівів і видобування даних з архівів."
+
+#. Strings for arguments in help texts.
+#: ../src/ar.c:110
+msgid "[MEMBER] [COUNT] ARCHIVE [FILE...]"
+msgstr "[ЕЛЕМЕНТ] [НОМЕР] АРХІВ [ФАЙЛ...]"
+
+#: ../src/ar.c:192
+#, c-format
+msgid "'a', 'b', and 'i' are only allowed with the 'm' and 'r' options"
+msgstr ""
+"модифікатори «a», «b» і «i» можна використовувати лише разом з параметрами «m» і "
+"«r»"
+
+#: ../src/ar.c:197
+#, c-format
+msgid "MEMBER parameter required for 'a', 'b', and 'i' modifiers"
+msgstr "Для модифікаторів «a», «b» та «i» слід використовувати параметр ЕЛЕМЕНТ"
+
+#: ../src/ar.c:213
+#, c-format
+msgid "'N' is only meaningful with the 'x' and 'd' options"
+msgstr "«N» має значення лише разом з параметрами «x» і «d»"
+
+#: ../src/ar.c:218
+#, c-format
+msgid "COUNT parameter required"
+msgstr "потрібен параметр НОМЕР"
+
+#: ../src/ar.c:230
+#, c-format
+msgid "invalid COUNT parameter %s"
+msgstr "некоректний параметр НОМЕР %s"
+
+#: ../src/ar.c:237
+#, c-format
+msgid "'%c' is only meaningful with the 'x' option"
+msgstr "«%c» має сенс лише у разі використання параметра «x»"
+
+#: ../src/ar.c:243
+#, c-format
+msgid "archive name required"
+msgstr "слід вказати назву архіву"
+
+#: ../src/ar.c:314
+#, c-format
+msgid "More than one operation specified"
+msgstr "Вказано більше за одну дію"
+
+#: ../src/ar.c:404
+#, c-format
+msgid "cannot open archive '%s'"
+msgstr "не вдалося відкрити архів «%s»"
+
+#: ../src/ar.c:414
+#, c-format
+msgid "cannot open archive '%s': %s"
+msgstr "не вдалося відкрити архів «%s»: %s"
+
+#: ../src/ar.c:418
+#, c-format
+msgid "%s: not an archive file"
+msgstr "%s: не є файлом архіву"
+
+#: ../src/ar.c:422
+#, c-format
+msgid "cannot stat archive '%s'"
+msgstr "не вдалося отримати дані архіву «%s» за допомогою stat"
+
+#: ../src/ar.c:434
+#, c-format
+msgid "no entry %s in archive\n"
+msgstr "у архіві немає запису %s\n"
+
+#: ../src/ar.c:487 ../src/ar.c:929 ../src/ar.c:1129
+#, c-format
+msgid "cannot create hash table"
+msgstr "не вдалося створити таблицю хешів"
+
+#: ../src/ar.c:494 ../src/ar.c:936 ../src/ar.c:1138
+#, c-format
+msgid "cannot insert into hash table"
+msgstr "не вдалося вставити запис до таблиці хешів"
+
+#: ../src/ar.c:502 ../src/ranlib.c:176
+#, c-format
+msgid "cannot stat '%s'"
+msgstr "не вдалося отримати дані з «%s» за допомогою stat"
+
+#: ../src/ar.c:598
+#, c-format
+msgid "cannot read content of %s: %s"
+msgstr "не вдалося прочитати вміст з %s: %s"
+
+#: ../src/ar.c:641
+#, c-format
+msgid "cannot open %.*s"
+msgstr "не вдалося відкрити %.*s"
+
+#: ../src/ar.c:663
+#, c-format
+msgid "failed to write %s"
+msgstr "не вдалося записати %s"
+
+#: ../src/ar.c:675
+#, c-format
+msgid "cannot change mode of %s"
+msgstr "не вдалося змінити права доступу до %s"
+
+#: ../src/ar.c:691
+#, c-format
+msgid "cannot change modification time of %s"
+msgstr "не вдалося змінити часову мітку зміни %s"
+
+#: ../src/ar.c:737
+#, c-format
+msgid "cannot rename temporary file to %.*s"
+msgstr "не вдалося перейменувати файл тимчасових даних на %.*s"
+
+#: ../src/ar.c:773 ../src/ar.c:1021 ../src/ar.c:1419 ../src/ranlib.c:250
+#, c-format
+msgid "cannot create new file"
+msgstr "не вдалося створити файл"
+
+#: ../src/ar.c:1220
+#, c-format
+msgid "position member %s not found"
+msgstr "не виявлено елемента позиції %s"
+
+#: ../src/ar.c:1230
+#, c-format
+msgid "%s: no entry %s in archive!\n"
+msgstr "%s: у архіві немає запису %s!\n"
+
+#: ../src/ar.c:1259 ../src/ldgeneric.c:519 ../src/objdump.c:257
+#, c-format
+msgid "cannot open %s"
+msgstr "не вдалося відкрити %s"
+
+#: ../src/ar.c:1264
+#, c-format
+msgid "cannot stat %s"
+msgstr "не вдалося отримати дані %s за допомогою stat"
+
+#: ../src/ar.c:1270
+#, c-format
+msgid "%s is no regular file"
+msgstr "%s не є звичайним файлом"
+
+#: ../src/ar.c:1283
+#, c-format
+msgid "cannot get ELF descriptor for %s: %s\n"
+msgstr "не вдалося отримати дескриптор ELF для %s: %s\n"
+
+#: ../src/ar.c:1302
+#, c-format
+msgid "cannot read %s: %s"
+msgstr "не вдалося прочитати %s: %s"
+
+#. The archive is too big.
+#: ../src/arlib.c:215
+#, c-format
+msgid "the archive '%s' is too large"
+msgstr "розмір архіву «%s» є занадто великим"
+
+#: ../src/arlib.c:228
+#, c-format
+msgid "cannot read ELF header of %s(%s): %s"
+msgstr "не вдалося прочитати заголовок ELF з %s(%s): %s"
+
+#: ../src/elfcmp.c:69
+msgid "Control options:"
+msgstr "Параметри керування:"
+
+#: ../src/elfcmp.c:70
+msgid ""
+"Control treatment of gaps in loadable segments [ignore|match] (default: "
+"ignore)"
+msgstr ""
+"Керування обробкою проміжків у придатних до завантаження сегментах [ignore|"
+"match] (типово, ignore)"
+
+#: ../src/elfcmp.c:72
+msgid "Ignore permutation of buckets in SHT_HASH section"
+msgstr "Ігнорувати переставляння блоків у розділі SHT_HASH"
+
+#: ../src/elfcmp.c:73
+msgid "Output nothing; yield exit status only"
+msgstr "Нічого не виводити; визначити лише стан виходу"
+
+#. Short description of program.
+#: ../src/elfcmp.c:80
+msgid "Compare relevant parts of two ELF files for equality."
+msgstr "Порівнює відповідні частини двох файлів ELF."
+
+#. Strings for arguments in help texts.
+#: ../src/elfcmp.c:84
+msgid "FILE1 FILE2"
+msgstr "ФАЙЛ1 ФАЙЛ2"
+
+#: ../src/elfcmp.c:140
+msgid "Invalid number of parameters.\n"
+msgstr "Некоректна кількість параметрів.\n"
+
+#: ../src/elfcmp.c:168 ../src/elfcmp.c:173
+#, c-format
+msgid "cannot get ELF header of '%s': %s"
+msgstr "не вдалося отримати заголовок ELF «%s»: %s"
+
+#: ../src/elfcmp.c:190
+#, c-format
+msgid "%s %s diff: ELF header"
+msgstr "%s %s diff: заголовок ELF"
+
+#: ../src/elfcmp.c:198 ../src/elfcmp.c:201
+#, c-format
+msgid "cannot get section count of '%s': %s"
+msgstr "не вдалося отримати даних щодо кількості розділів «%s»: %s"
+
+#: ../src/elfcmp.c:206
+#, c-format
+msgid "%s %s diff: section count"
+msgstr "%s %s diff: кількість розділів"
+
+#: ../src/elfcmp.c:214 ../src/elfcmp.c:217
+#, c-format
+msgid "cannot get program header count of '%s': %s"
+msgstr "не вдалося отримати даних щодо кількості заголовків програми у «%s»: %s"
+
+#: ../src/elfcmp.c:222
+#, c-format
+msgid "%s %s diff: program header count"
+msgstr "%s %s diff: кількість заголовків програми"
+
+#: ../src/elfcmp.c:281
+#, c-format
+msgid "%s %s differ: section header"
+msgstr "%s %s diff: заголовок розділу"
+
+#: ../src/elfcmp.c:309 ../src/elfcmp.c:315
+#, c-format
+msgid "cannot get content of section %zu in '%s': %s"
+msgstr "не вдалося отримати вміст розділу %zu у «%s»: %s"
+
+#: ../src/elfcmp.c:331 ../src/elfcmp.c:337
+#, c-format
+msgid "cannot get symbol in '%s': %s"
+msgstr "не вдалося отримати символ у «%s»: %s"
+
+#: ../src/elfcmp.c:358
+#, c-format
+msgid "%s %s differ: symbol table [%zu]"
+msgstr "%s %s diff: таблиця символів [%zu]"
+
+#: ../src/elfcmp.c:361
+#, c-format
+msgid "%s %s differ: symbol table [%zu,%zu]"
+msgstr "%s %s diff: таблиця символів [%zu,%zu]"
+
+#: ../src/elfcmp.c:409
+#, c-format
+msgid "%s %s differ: section [%zu] '%s' content"
+msgstr "%s %s diff: розділ [%zu] «%s», вміст"
+
+#: ../src/elfcmp.c:413
+#, c-format
+msgid "%s %s differ: section [%zu,%zu] '%s' content"
+msgstr "%s %s diff: розділ [%zu,%zu] «%s», вміст"
+
+#: ../src/elfcmp.c:429
+#, c-format
+msgid "%s %s differ: unequal amount of important sections"
+msgstr "%s %s diff: невідповідність об’ємів важливих розділів"
+
+#: ../src/elfcmp.c:463 ../src/elfcmp.c:468
+#, c-format
+msgid "cannot load data of '%s': %s"
+msgstr "не вдалося завантажити дані «%s»: %s"
+
+#: ../src/elfcmp.c:487 ../src/elfcmp.c:493
+#, c-format
+msgid "cannot get program header entry %d of '%s': %s"
+msgstr "не вдалося отримати запис заголовка програми %d «%s»: %s"
+
+#: ../src/elfcmp.c:499
+#, c-format
+msgid "%s %s differ: program header %d"
+msgstr "%s %s diff: заголовок програми %d"
+
+#: ../src/elfcmp.c:524
+#, c-format
+msgid "%s %s differ: gap"
+msgstr "%s %s diff: проміжок"
+
+#: ../src/elfcmp.c:583
+#, c-format
+msgid "Invalid value '%s' for --gaps parameter."
+msgstr "Некоректне значення «%s» параметра --gaps."
+
+#: ../src/elfcmp.c:607 ../src/findtextrel.c:229 ../src/ldgeneric.c:1767
+#: ../src/ldgeneric.c:4257 ../src/nm.c:363 ../src/ranlib.c:169
+#: ../src/size.c:301 ../src/strings.c:183 ../src/strip.c:433
+#: ../src/strip.c:468 ../src/unstrip.c:1900 ../src/unstrip.c:1929
+#, c-format
+msgid "cannot open '%s'"
+msgstr "не вдалося відкрити «%s»"
+
+#: ../src/elfcmp.c:611 ../src/findtextrel.c:236 ../src/ranlib.c:186
+#, c-format
+msgid "cannot create ELF descriptor for '%s': %s"
+msgstr "не вдалося створити дескриптор ELF для «%s»: %s"
+
+#: ../src/elfcmp.c:616
+#, c-format
+msgid "cannot create EBL descriptor for '%s'"
+msgstr "не вдалося створити дескриптор EBL для «%s»"
+
+#: ../src/elfcmp.c:634
+#, c-format
+msgid "cannot get section header of section %zu: %s"
+msgstr "не вдалося отримати заголовок розділу %zu: %s"
+
+#: ../src/elfcmp.c:644
+#, c-format
+msgid "cannot get content of section %zu: %s"
+msgstr "не вдалося отримати вміст розділу %zu: %s"
+
+#: ../src/elfcmp.c:654 ../src/elfcmp.c:668
+#, c-format
+msgid "cannot get relocation: %s"
+msgstr "не вдалося отримати переміщення: %s"
+
+#: ../src/elflint.c:72
+msgid "Be extremely strict, flag level 2 features."
+msgstr "Висока строгість, увімкнути можливості рівня 2."
+
+#: ../src/elflint.c:73
+msgid "Do not print anything if successful"
+msgstr "Не виводити ніяких даних у разі успіху"
+
+#: ../src/elflint.c:74
+msgid "Binary is a separate debuginfo file"
+msgstr "Бінарний файл є окремим файлом debuginfo"
+
+#: ../src/elflint.c:76
+msgid ""
+"Binary has been created with GNU ld and is therefore known to be broken in "
+"certain ways"
+msgstr ""
+"Бінарний файл було створено за допомогою GNU ld, тому він, очевидно, є до "
+"певної міри неправильним"
+
+#. Short description of program.
+#: ../src/elflint.c:82
+msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
+msgstr ""
+"Педантична перевірка файлів ELF на сумісність зі специфікаціями gABI/psABI."
+
+#. Strings for arguments in help texts.
+#: ../src/elflint.c:86 ../src/readelf.c:118
+msgid "FILE..."
+msgstr "ФАЙЛ..."
+
+#: ../src/elflint.c:159 ../src/readelf.c:272
+#, c-format
+msgid "cannot open input file"
+msgstr "не вдалося відкрити вхідний файл."
+
+#: ../src/elflint.c:166
+#, c-format
+msgid "cannot generate Elf descriptor: %s\n"
+msgstr "не вдалося створити дескриптор Elf: %s\n"
+
+#: ../src/elflint.c:185
+#, c-format
+msgid "error while closing Elf descriptor: %s\n"
+msgstr "помилка під час спроби закриття дескриптора Elf: %s\n"
+
+#: ../src/elflint.c:189
+msgid "No errors"
+msgstr "Без помилок"
+
+#: ../src/elflint.c:223 ../src/readelf.c:425
+msgid "Missing file name.\n"
+msgstr "Не вказано назви файла.\n"
+
+#: ../src/elflint.c:302
+#, c-format
+msgid " error while freeing sub-ELF descriptor: %s\n"
+msgstr " помилка під час спроби вивільнення дескриптора суб-ELF: %s\n"
+
+#. We cannot do anything.
+#: ../src/elflint.c:310
+#, c-format
+msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
+msgstr "Не є файлом ELF. Виявлено помилкові магічні байти на початку файла\n"
+
+#: ../src/elflint.c:370
+#, c-format
+msgid "e_ident[%d] == %d is no known class\n"
+msgstr "e_ident[%d] == %d не є відомим класом\n"
+
+#: ../src/elflint.c:375
+#, c-format
+msgid "e_ident[%d] == %d is no known data encoding\n"
+msgstr "e_ident[%d] == %d не є відомим кодуванням даних\n"
+
+#: ../src/elflint.c:379
+#, c-format
+msgid "unknown ELF header version number e_ident[%d] == %d\n"
+msgstr "невідомий номер версії заголовка ELF e_ident[%d] == %d\n"
+
+#: ../src/elflint.c:385
+#, c-format
+msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
+msgstr "непідтримуване ABI ОС e_ident[%d] == «%s»\n"
+
+#: ../src/elflint.c:391
+#, c-format
+msgid "unsupport ABI version e_ident[%d] == %d\n"
+msgstr "непідтримувана версія ABI e_ident[%d] == %d\n"
+
+#: ../src/elflint.c:396
+#, c-format
+msgid "e_ident[%zu] is not zero\n"
+msgstr "e_ident[%zu] не дорівнює нулеві\n"
+
+#: ../src/elflint.c:401
+#, c-format
+msgid "unknown object file type %d\n"
+msgstr "невідомий тип об’єктних файлів %d\n"
+
+#: ../src/elflint.c:408
+#, c-format
+msgid "unknown machine type %d\n"
+msgstr "невідомий тип архітектури %d\n"
+
+#: ../src/elflint.c:412
+#, c-format
+msgid "unknown object file version\n"
+msgstr "невідома версія об’єктних файлів\n"
+
+#: ../src/elflint.c:418
+#, c-format
+msgid "invalid program header offset\n"
+msgstr "некоректне зміщення заголовка програми\n"
+
+#: ../src/elflint.c:420
+#, c-format
+msgid "executables and DSOs cannot have zero program header offset\n"
+msgstr ""
+"виконувані файли і DSO не можуть містити заголовка програми з нульовим "
+"зміщенням\n"
+
+#: ../src/elflint.c:424
+#, c-format
+msgid "invalid number of program header entries\n"
+msgstr "некоректна кількість записів заголовків програми\n"
+
+#: ../src/elflint.c:432
+#, c-format
+msgid "invalid section header table offset\n"
+msgstr "некоректне зміщення таблиці заголовків розділів\n"
+
+#: ../src/elflint.c:435
+#, c-format
+msgid "section header table must be present\n"
+msgstr "має бути вказано таблицю заголовків розділів\n"
+
+#: ../src/elflint.c:449
+#, c-format
+msgid "invalid number of section header table entries\n"
+msgstr "некоректна кількість записів таблиці заголовків розділів\n"
+
+#: ../src/elflint.c:466
+#, c-format
+msgid "invalid section header index\n"
+msgstr "некоректний індекс заголовка розділу\n"
+
+#: ../src/elflint.c:480
+#, c-format
+msgid "invalid number of program header table entries\n"
+msgstr "некоректна кількість записів таблиці заголовків програми\n"
+
+#: ../src/elflint.c:489
+#, c-format
+msgid "invalid machine flags: %s\n"
+msgstr "некоректні прапорці архітектури: %s\n"
+
+#: ../src/elflint.c:496 ../src/elflint.c:513
+#, c-format
+msgid "invalid ELF header size: %hd\n"
+msgstr "некоректний розмір заголовка ELF: %hd\n"
+
+#: ../src/elflint.c:499 ../src/elflint.c:516
+#, c-format
+msgid "invalid program header size: %hd\n"
+msgstr "некоректний розмір заголовка програми: %hd\n"
+
+#: ../src/elflint.c:502 ../src/elflint.c:519
+#, c-format
+msgid "invalid program header position or size\n"
+msgstr "некоректне розташування або розмір заголовка програми\n"
+
+#: ../src/elflint.c:505 ../src/elflint.c:522
+#, c-format
+msgid "invalid section header size: %hd\n"
+msgstr "некоректний розмір заголовка розділу: %hd\n"
+
+#: ../src/elflint.c:508 ../src/elflint.c:525
+#, c-format
+msgid "invalid section header position or size\n"
+msgstr "некоректне розташування або розмір заголовка розділу\n"
+
+#: ../src/elflint.c:569
+#, c-format
+msgid ""
+"section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
+"group\n"
+msgstr ""
+"розділ [%2d] «%s»: розділ з встановленим прапорцем SHF_GROUP не є частиною "
+"групи розділів\n"
+
+#: ../src/elflint.c:573
+#, c-format
+msgid ""
+"section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
+msgstr ""
+"розділ [%2d] «%s»: групу розділів [%2zu] «%s» мало бути визначено до розділу-"
+"елемента цієї групи\n"
+
+#: ../src/elflint.c:589 ../src/elflint.c:1432 ../src/elflint.c:1482
+#: ../src/elflint.c:1591 ../src/elflint.c:2185 ../src/elflint.c:2699
+#: ../src/elflint.c:2860 ../src/elflint.c:2990 ../src/elflint.c:3162
+#: ../src/elflint.c:4062
+#, c-format
+msgid "section [%2d] '%s': cannot get section data\n"
+msgstr "розділ [%2d] «%s»: не вдалося отримати дані розділу\n"
+
+#: ../src/elflint.c:602 ../src/elflint.c:1598
+#, c-format
+msgid ""
+"section [%2d] '%s': referenced as string table for section [%2d] '%s' but "
+"type is not SHT_STRTAB\n"
+msgstr ""
+"розділ [%2d] «%s»: надано посилання на таблицю рядків розділу [%2d] «%s», але "
+"типом даних не є SHT_STRTAB\n"
+
+#: ../src/elflint.c:625
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol table cannot have more than one extended index "
+"section\n"
+msgstr ""
+"розділ [%2d] «%s»: у таблиці символів не може бути більше одного розширеного "
+"розділу покажчика\n"
+
+#: ../src/elflint.c:636
+#, c-format
+msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
+msgstr "розділ [%2u] «%s»: розмірність запису не відповідає ElfXX_Sym\n"
+
+#: ../src/elflint.c:645
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
+msgstr "розділ [%2d] «%s»: не вдалося отримати символ %d: %s\n"
+
+#: ../src/elflint.c:650 ../src/elflint.c:653 ../src/elflint.c:656
+#: ../src/elflint.c:659 ../src/elflint.c:662 ../src/elflint.c:665
+#, c-format
+msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
+msgstr "розділ [%2d] «%s»: «%s» у нульовому записі не є нулем\n"
+
+#: ../src/elflint.c:668
+#, c-format
+msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
+msgstr "розділ [%2d] «%s»: XINDEX для нульового запису не є нулем\n"
+
+#: ../src/elflint.c:678
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
+msgstr "розділ [%2d] «%s»: не вдалося отримати символ %zu: %s\n"
+
+#: ../src/elflint.c:687
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
+msgstr "розділ [%2d] «%s»: символ %zu: некоректне значення назви\n"
+
+#: ../src/elflint.c:700
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: too large section index but no extended "
+"section index section\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %zu: занадто великий покажчик розділу за умови, що "
+"не визначено розділу розширеного покажчика розділів\n"
+
+#: ../src/elflint.c:706
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
+"st_shndx (%<PRIu32>)\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %zu: XINDEX використано для індексування, яке не "
+"відповідає st_shndx (%<PRIu32>)\n"
+
+#. || sym->st_shndx > SHN_HIRESERVE always false
+#: ../src/elflint.c:718
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
+msgstr "розділ [%2d] «%s»: символ %zu: некоректний індекс розділу\n"
+
+#: ../src/elflint.c:726
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown type\n"
+msgstr "розділ [%2d] «%s»: символ %zu: невідомий тип\n"
+
+#: ../src/elflint.c:732
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
+msgstr "розділ [%2d] «%s»: символ %zu: невідома прив’язка символу\n"
+
+#: ../src/elflint.c:737
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %zu: унікальний символ, що не належить до типу "
+"об’єктів\n"
+
+#: ../src/elflint.c:745
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %zu: COMMON можна використовувати лише у файлах, "
+"придатних до переміщення\n"
+
+#: ../src/elflint.c:749
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %zu: використання локальних символів COMMON "
+"позбавлене сенсу\n"
+
+#: ../src/elflint.c:753
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %zu: використання функції у розділі COMMON "
+"позбавлене сенсу\n"
+
+#: ../src/elflint.c:785
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %zu: значення st_value поза можливим діапазоном\n"
+
+#: ../src/elflint.c:791 ../src/elflint.c:816 ../src/elflint.c:859
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu does not fit completely in referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %zu не повністю відповідає розділу, на який "
+"посилається, [%2d] «%s»\n"
+
+#: ../src/elflint.c:800
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
+"SHF_TLS flag set\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %zu: для розділу посилання [%2d] «%s» не встановлено "
+"прапорець SHF_TLS\n"
+
+#: ../src/elflint.c:810 ../src/elflint.c:852
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %zu: значення st_value поза межами розділу "
+"посилання, [%2d] «%s»\n"
+
+#: ../src/elflint.c:837
+#, 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:845
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] '%"
+"s'\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %zu: значення st_value перед розділом посилання, [%"
+"2d] «%s»\n"
+
+#: ../src/elflint.c:872
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %zu: у sh_info описано локальний символ поза "
+"діапазоном\n"
+
+#: ../src/elflint.c:879
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %zu: у sh_info описано нелокальний символ поза "
+"діапазоном\n"
+
+#: ../src/elflint.c:886
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
+msgstr "розділ [%2d] «%s»: символ %zu: нелокальний символ розділу\n"
+
+#: ../src/elflint.c:936
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section [%"
+"2d]\n"
+msgstr ""
+"розділ [%2d] «%s»: символ _GLOBAL_OFFSET_TABLE_ посилається на помилковий "
+"розділ, [%2d]\n"
+
+#: ../src/elflint.c:943
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] '%"
+"s'\n"
+msgstr ""
+"розділ [%2d] «%s»: символ _GLOBAL_OFFSET_TABLE_ посилається на розділ [%2d] "
+"'%s'\n"
+
+#. This test is more strict than the psABIs which
+#. usually allow the symbol to be in the middle of
+#. the .got section, allowing negative offsets.
+#: ../src/elflint.c:959
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
+"match %s section address %#<PRIx64>\n"
+msgstr ""
+"розділ [%2d] «%s»: значення символу _GLOBAL_OFFSET_TABLE_ %#<PRIx64> не "
+"відповідає адресі розділу %s %#<PRIx64>\n"
+
+#: ../src/elflint.c:966
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
+"match %s section size %<PRIu64>\n"
+msgstr ""
+"розділ [%2d] «%s»: розмір символу _GLOBAL_OFFSET_TABLE_ %<PRIu64> не "
+"відповідає розміру розділу %s %<PRIu64>\n"
+
+#: ../src/elflint.c:974
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
+"section\n"
+msgstr ""
+"розділ [%2d] «%s»: виявлено символ _GLOBAL_OFFSET_TABLE_, але не виявлено "
+"розділу .got\n"
+
+#: ../src/elflint.c:990
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
+"segment address %#<PRIx64>\n"
+msgstr ""
+"розділ [%2d] «%s»: значення символу _DYNAMIC_ %#<PRIx64> не відповідає адресі "
+"динамічного сегмента %#<PRIx64>\n"
+
+#: ../src/elflint.c:997
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
+"segment size %<PRIu64>\n"
+msgstr ""
+"розділ [%2d] «%s»: розмір символу _DYNAMIC %<PRIu64> не відповідає розміру "
+"динамічного сегмента %<PRIu64>\n"
+
+#: ../src/elflint.c:1010
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
+"default visibility\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %zu: символ у динамічній таблиці символів з "
+"нетиповою видимістю\n"
+
+#: ../src/elflint.c:1014
+#, 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:1059
+#, c-format
+msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
+msgstr "розділ [%2d] «%s»: для цього розділу RELA використано DT_RELCOUNT\n"
+
+#: ../src/elflint.c:1068 ../src/elflint.c:1120
+#, 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:1093 ../src/elflint.c:1145
+#, c-format
+msgid ""
+"section [%2d] '%s': relative relocations after index %d as specified by "
+"DT_RELCOUNT\n"
+msgstr ""
+"розділ [%2d] «%s»: відносні переміщення після позиції %d, вказаної за "
+"допомогою DT_RELCOUNT\n"
+
+#: ../src/elflint.c:1099 ../src/elflint.c:1151
+#, c-format
+msgid ""
+"section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
+"specified %d relative relocations\n"
+msgstr ""
+"розділ [%2d] «%s»: безвідносне переміщення на позиції %zu; DT_RELCOUNT "
+"визначено %d відносних переміщення\n"
+
+#: ../src/elflint.c:1111
+#, c-format
+msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
+msgstr "розділ [%2d] «%s»: для цього розділу REL використано DT_RELACOUNT\n"
+
+#: ../src/elflint.c:1193
+#, c-format
+msgid "section [%2d] '%s': invalid destination section index\n"
+msgstr "розділ [%2d] «%s»: некоректний індекс розділу призначення\n"
+
+#: ../src/elflint.c:1206
+#, c-format
+msgid "section [%2d] '%s': invalid destination section type\n"
+msgstr "розділ [%2d] «%s»: некоректний тип розділу призначення\n"
+
+#: ../src/elflint.c:1214
+#, c-format
+msgid "section [%2d] '%s': sh_info should be zero\n"
+msgstr "розділ [%2d] «%s»: sh_info має бути нульовим\n"
+
+#: ../src/elflint.c:1221
+#, c-format
+msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
+msgstr ""
+"розділ [%2d] «%s»: переміщення у придатних до об’єднання розділах неможливе\n"
+
+#: ../src/elflint.c:1228
+#, c-format
+msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
+msgstr "розділ [%2d] «%s»: розмірність запису розділу не відповідає ElfXX_Rela\n"
+
+#: ../src/elflint.c:1288
+#, c-format
+msgid "text relocation flag set but there is no read-only segment\n"
+msgstr ""
+"встановлено прапорець переміщення тексту, але сегмент придатний лише до "
+"читання\n"
+
+#: ../src/elflint.c:1315
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid type\n"
+msgstr "розділ [%2d] «%s»: переміщення %zu: некоректний тип\n"
+
+#: ../src/elflint.c:1323
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: relocation type invalid for the file "
+"type\n"
+msgstr ""
+"розділ [%2d] «%s»: переміщення %zu: некоректний тип переміщення для типу "
+"файла\n"
+
+#: ../src/elflint.c:1331
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
+msgstr "розділ [%2d] «%s»: переміщення %zu: некоректний індекс символу\n"
+
+#: ../src/elflint.c:1349
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
+"be used with %s\n"
+msgstr ""
+"розділ [%2d] «%s»: переміщення %zu: з %s можна використовувати лише символ "
+"«_GLOBAL_OFFSET_TABLE_»\n"
+
+#: ../src/elflint.c:1366
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
+msgstr "розділ [%2d] «%s»: переміщення %zu: зміщення за межі діапазону\n"
+
+#: ../src/elflint.c:1381
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: copy relocation against symbol of type %"
+"s\n"
+msgstr ""
+"розділ [%2d] «%s»: переміщення %zu: переміщення копіювання для символу типу %"
+"s\n"
+
+#: ../src/elflint.c:1402
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: read-only section modified but text "
+"relocation flag not set\n"
+msgstr ""
+"розділ [%2d] «%s»: переміщення %zu: змінено придатний лише для читання "
+"розділ, але не встановлено прапорець переміщення тексту\n"
+
+#: ../src/elflint.c:1417
+#, c-format
+msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
+msgstr "розділ [%2d] «%s»: переміщення завантажених і незавантажених даних\n"
+
+#: ../src/elflint.c:1456 ../src/elflint.c:1506
+#, c-format
+msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
+msgstr "розділ [%2d] «%s»: не вдалося отримати зміщення %zu: %s\n"
+
+#: ../src/elflint.c:1586
+#, c-format
+msgid "more than one dynamic section present\n"
+msgstr "вказано більше одного динамічного розділу\n"
+
+#: ../src/elflint.c:1604
+#, c-format
+msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
+msgstr "розділ [%2d] «%s»: розмірність запису розділу не відповідає ElfXX_Dyn\n"
+
+#: ../src/elflint.c:1609 ../src/elflint.c:1901
+#, c-format
+msgid "section [%2d] '%s': sh_info not zero\n"
+msgstr "розділ [%2d] «%s»: sh_info не є нульовим\n"
+
+#: ../src/elflint.c:1619
+#, c-format
+msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
+msgstr "розділ [%2d] «%s»: не вдалося отримати запис динамічного розділу %zu: %s\n"
+
+#: ../src/elflint.c:1627
+#, 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:1634
+#, c-format
+msgid "section [%2d] '%s': entry %zu: unknown tag\n"
+msgstr "розділ [%2d] «%s»: запис %zu: невідома мітка\n"
+
+#: ../src/elflint.c:1645
+#, 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:1655
+#, c-format
+msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
+msgstr "розділ [%2d] «%s»: запис %zu: використано мітку рівня 2 %s\n"
+
+#: ../src/elflint.c:1673
+#, c-format
+msgid "section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
+msgstr ""
+"розділ [%2d] «%s»: запис %zu: значенням DT_PLTREL має бути DT_REL або "
+"DT_RELA\n"
+
+#: ../src/elflint.c:1695
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: pointer does not match address of section [%"
+"2d] '%s' referenced by sh_link\n"
+msgstr ""
+"розділ [%2d] «%s»: розділ %zu: вказівник не відповідає адресі розділу [%2d] «%"
+"s», на яку посилається sh_link\n"
+
+#: ../src/elflint.c:1738
+#, c-format
+msgid "section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
+msgstr ""
+"розділ [%2d] «%s»: запис %zu: значення %s має вказувати на завантажений "
+"сегмент\n"
+
+#: ../src/elflint.c:1753
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must be valid offset in section [%"
+"2d] '%s'\n"
+msgstr ""
+"розділ [%2d] «%s»: запис %zu: значенням %s має бути коректне зміщення у "
+"розділі [%2d] «%s»\n"
+
+#: ../src/elflint.c:1773 ../src/elflint.c:1801
+#, c-format
+msgid "section [%2d] '%s': contains %s entry but not %s\n"
+msgstr "розділ [%2d] «%s»: містить запис %s, але не %s\n"
+
+#: ../src/elflint.c:1785
+#, c-format
+msgid "section [%2d] '%s': mandatory tag %s not present\n"
+msgstr "розділ [%2d] «%s»: немає обов’язкової мітки %s\n"
+
+#: ../src/elflint.c:1794
+#, c-format
+msgid "section [%2d] '%s': no hash section present\n"
+msgstr "розділ [%2d] «%s»: не виявлено розділу хешів\n"
+
+#: ../src/elflint.c:1809 ../src/elflint.c:1816
+#, 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:1826 ../src/elflint.c:1830
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
+msgstr ""
+"розділ [%2d] «%s»: у DSO, позначеному на кроці попереднього компонування, "
+"немає мітки %s\n"
+
+#: ../src/elflint.c:1836
+#, c-format
+msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
+msgstr ""
+"розділ [%2d] «%s»: під час попереднього компонування як залежність позначено "
+"файл, який не є файлом DSO\n"
+
+#: ../src/elflint.c:1847 ../src/elflint.c:1851 ../src/elflint.c:1855
+#: ../src/elflint.c:1859
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
+msgstr ""
+"розділ [%2d] «%s»: у попередньо скомпонованому виконуваному файлі не "
+"міститься мітки %s\n"
+
+#: ../src/elflint.c:1871
+#, c-format
+msgid ""
+"section [%2d] '%s': only relocatable files can have extended section index\n"
+msgstr ""
+"розділ [%2d] «%s»: розширений розділ покажчика можуть мати лише файли, "
+"придатні до переміщення\n"
+
+#: ../src/elflint.c:1881
+#, c-format
+msgid "section [%2d] '%s': extended section index section not for symbol table\n"
+msgstr ""
+"розділ [%2d] «%s»: розділ розширеного покажчика розділів не призначено для "
+"таблиць символів\n"
+
+#: ../src/elflint.c:1886
+#, c-format
+msgid "cannot get data for symbol section\n"
+msgstr "не вдалося отримати дані для розділу символів\n"
+
+#: ../src/elflint.c:1889
+#, c-format
+msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
+msgstr "розділ [%2d] «%s»: розмірність запису не відповідає Elf32_Word\n"
+
+#: ../src/elflint.c:1896
+#, c-format
+msgid "section [%2d] '%s': extended index table too small for symbol table\n"
+msgstr ""
+"розділ [%2d] «%s»: розширена таблиця покажчика замала для таблиці символів\n"
+
+#: ../src/elflint.c:1911
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
+"same symbol table\n"
+msgstr ""
+"розділ [%2d] «%s»: розширений покажчик розділів у розділі [%2zu] «%s» "
+"посилається на ту саму таблицю розділів\n"
+
+#: ../src/elflint.c:1922
+#, c-format
+msgid "symbol 0 should have zero extended section index\n"
+msgstr "символу 0 має відповідати нульовий індекс розширеного розділу\n"
+
+#: ../src/elflint.c:1934
+#, c-format
+msgid "cannot get data for symbol %zu\n"
+msgstr "не вдалося отримати дані для символу %zu\n"
+
+#: ../src/elflint.c:1939
+#, c-format
+msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
+msgstr ""
+"індекс розширеного розділу дорівнює %<PRIu32>, але індекс символу не є "
+"XINDEX\n"
+
+#: ../src/elflint.c:1955 ../src/elflint.c:1996
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
+msgstr ""
+"розділ [%2d] «%s»: розділ таблиці хешів занадто малий (розмір %ld, мало бути "
+"— %ld)\n"
+
+#: ../src/elflint.c:1967 ../src/elflint.c:2008
+#, c-format
+msgid "section [%2d] '%s': chain array too large\n"
+msgstr "розділ [%2d] «%s»: масив ланцюжка занадто великий\n"
+
+#: ../src/elflint.c:1976 ../src/elflint.c:2017
+#, c-format
+msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
+msgstr ""
+"розділ [%2d] «%s»: посилання на хеш блоку %zu лежить поза межами діапазону\n"
+
+#: ../src/elflint.c:1982
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
+msgstr ""
+"розділ [%2d] «%s»: посилання ланцюжка хешів %zu лежить поза межами діапазону\n"
+
+#: ../src/elflint.c:2023
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
+msgstr ""
+"розділ [%2d] «%s»: посилання ланцюжка хешів %<PRIu64> лежить поза межами "
+"діапазону\n"
+
+#: ../src/elflint.c:2038
+#, c-format
+msgid "section [%2d] '%s': bitmask size not power of 2: %u\n"
+msgstr "розділ [%2d] «%s»: розмір бітової маски не є степенем 2: %u\n"
+
+#: ../src/elflint.c:2049
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected at "
+"least%ld)\n"
+msgstr ""
+"розділ [%2d] «%s»: розділ таблиці хешів занадто малий (розмір %ld, мало бути "
+"не менше %ld)\n"
+
+#: ../src/elflint.c:2057
+#, c-format
+msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
+msgstr "розділ [%2d] «%s»: зсув 2-ої функції хешування занадто великий: %u\n"
+
+#: ../src/elflint.c:2089
+#, c-format
+msgid ""
+"section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
+msgstr ""
+"розділ [%2d] '%s': ланцюжок хешів для блоку %zu розташовано нижче за позицію "
+"відхилення індексу символу\n"
+
+#: ../src/elflint.c:2110
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
+"undefined\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %u, на який посилається ланцюжок у блоці %zu не "
+"визначено\n"
+
+#: ../src/elflint.c:2121
+#, c-format
+msgid ""
+"section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
+msgstr ""
+"розділ [%2d] «%s»: значення хешу для символу %u у ланцюжку для блоку %zu є "
+"помилковим\n"
+
+#: ../src/elflint.c:2152
+#, c-format
+msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
+msgstr ""
+"розділ [%2d] «%s»: ланцюжок хешів для блоку %zu лежить поза межами діапазону\n"
+
+#: ../src/elflint.c:2157
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
+msgstr ""
+"розділ [%2d] «%s»: посилання на символ у ланцюжку для блоку %zu лежить поза "
+"межами діапазону\n"
+
+#: ../src/elflint.c:2163
+#, c-format
+msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
+msgstr "розділ [%2d] «%s»: бітова маска не відповідає назвам у таблиці хешів\n"
+
+#: ../src/elflint.c:2176
+#, c-format
+msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
+msgstr ""
+"розділ [%2d] «%s»: придатні до переміщення файли не можуть містити таблиць "
+"хешів\n"
+
+#: ../src/elflint.c:2194
+#, c-format
+msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
+msgstr ""
+"розділ [%2d] «%s»: таблицю хешів не призначено для зберігання таблиці "
+"динамічних символів\n"
+
+#: ../src/elflint.c:2202
+#, c-format
+msgid "section [%2d] '%s': hash table entry size incorrect\n"
+msgstr "розділ [%2d] «%s»: розмірність запису таблиці хешів є некоректною\n"
+
+#: ../src/elflint.c:2207
+#, c-format
+msgid "section [%2d] '%s': not marked to be allocated\n"
+msgstr "розділ [%2d] «%s»: не позначено для пересування\n"
+
+#: ../src/elflint.c:2212
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table has not even room for initial administrative "
+"entries\n"
+msgstr ""
+"розділ [%2d] «%s»: у таблиці хешів виявлено незвичайне розташування "
+"початкових адміністративних записів\n"
+
+#: ../src/elflint.c:2260
+#, 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:2338 ../src/elflint.c:2342
+#, c-format
+msgid "section [%2zu] '%s': reference to symbol index 0\n"
+msgstr "розділ [%2zu] «%s»: посилання на індекс символів 0\n"
+
+#: ../src/elflint.c:2349
+#, c-format
+msgid ""
+"symbol %d referenced in new hash table in [%2zu] '%s' but not in old hash "
+"table in [%2zu] '%s'\n"
+msgstr ""
+"виявлено посилання на символ %d у новій таблиці хешів у [%2zu] «%s», але його "
+"немає у старій таблиці хешів у [%2zu] «%s»\n"
+
+#: ../src/elflint.c:2361
+#, c-format
+msgid ""
+"symbol %d referenced in old hash table in [%2zu] '%s' but not in new hash "
+"table in [%2zu] '%s'\n"
+msgstr ""
+"виявлено посилання на символ %d у старій таблиці хешів у [%2zu] «%s», але "
+"його немає у новій таблиці хешів у [%2zu] «%s»\n"
+
+#: ../src/elflint.c:2377
+#, c-format
+msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
+msgstr "розділ [%2d] «%s»: ненульове значення sh_%s для розділу NULL\n"
+
+#: ../src/elflint.c:2397
+#, c-format
+msgid ""
+"section [%2d] '%s': section groups only allowed in relocatable object files\n"
+msgstr ""
+"розділ [%2d] «%s»: групи розділів передбачено лише для придатних до "
+"переміщення об’єктних файлах\n"
+
+#: ../src/elflint.c:2408
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol table: %s\n"
+msgstr "розділ [%2d] «%s»: не вдалося отримати таблицю символів: %s\n"
+
+#: ../src/elflint.c:2413
+#, 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:2419
+#, c-format
+msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
+msgstr "розділ [%2d] «%s»: некоректний індекс символу у sh_info\n"
+
+#: ../src/elflint.c:2424
+#, c-format
+msgid "section [%2d] '%s': sh_flags not zero\n"
+msgstr "розділ [%2d] «%s»: sh_flags не є нульовим\n"
+
+#: ../src/elflint.c:2431
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol for signature\n"
+msgstr "розділ [%2d] «%s»: не вдалося отримати символ для підпису\n"
+
+#: ../src/elflint.c:2436
+#, c-format
+msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
+msgstr "розділ [%2d] «%s»: символ підпису не може бути порожнім рядком\n"
+
+#: ../src/elflint.c:2442
+#, c-format
+msgid "section [%2d] '%s': sh_flags not set correctly\n"
+msgstr "розділ [%2d] «%s»: для sh_flags встановлено помилкове значення\n"
+
+#: ../src/elflint.c:2448
+#, c-format
+msgid "section [%2d] '%s': cannot get data: %s\n"
+msgstr "розділ [%2d] «%s»: не вдалося отримати дані: %s\n"
+
+#: ../src/elflint.c:2457
+#, 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:2462
+#, c-format
+msgid "section [%2d] '%s': section group without flags word\n"
+msgstr "розділ [%2d] «%s»: група розділів без значення типу word прапорців\n"
+
+#: ../src/elflint.c:2468
+#, c-format
+msgid "section [%2d] '%s': section group without member\n"
+msgstr "розділ [%2d] «%s»: група розділів без елементів\n"
+
+#: ../src/elflint.c:2472
+#, c-format
+msgid "section [%2d] '%s': section group with only one member\n"
+msgstr "розділ [%2d] «%s»: група розділів, що містить лише один елемент\n"
+
+#: ../src/elflint.c:2483
+#, c-format
+msgid "section [%2d] '%s': unknown section group flags\n"
+msgstr "розділ [%2d] «%s»: невідомі прапорці групи розділів\n"
+
+#: ../src/elflint.c:2495
+#, c-format
+msgid "section [%2d] '%s': section index %Zu out of range\n"
+msgstr "розділ [%2d] «%s»: індекс розділу %Zu поза межами діапазону\n"
+
+#: ../src/elflint.c:2504
+#, c-format
+msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
+msgstr ""
+"розділ [%2d] «%s»: не вдалося отримати заголовок розділу для елемента %zu: %"
+"s\n"
+
+#: ../src/elflint.c:2511
+#, c-format
+msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
+msgstr "розділ [%2d] «%s»: група розділів містить іншу групу [%2d] «%s»\n"
+
+#: ../src/elflint.c:2517
+#, c-format
+msgid ""
+"section [%2d] '%s': element %Zu references section [%2d] '%s' without "
+"SHF_GROUP flag set\n"
+msgstr ""
+"розділ [%2d] «%s»: елемент %Zu посилається на розділ [%2d] «%s» без "
+"встановленого прапорця SHF_GROUP\n"
+
+#: ../src/elflint.c:2524
+#, c-format
+msgid "section [%2d] '%s' is contained in more than one section group\n"
+msgstr "розділ [%2d] «%s» міститься у більше ніж одній групі розділів\n"
+
+#: ../src/elflint.c:2713
+#, c-format
+msgid ""
+"section [%2d] '%s' refers in sh_link to section [%2d] '%s' which is no "
+"dynamic symbol table\n"
+msgstr ""
+"розділ [%2d] «%s» посилається у sh_link на розділ [%2d] «%s», який не має "
+"динамічної таблиці символів\n"
+
+#: ../src/elflint.c:2724
+#, c-format
+msgid ""
+"section [%2d] '%s' has different number of entries than symbol table [%2d] '%"
+"s'\n"
+msgstr ""
+"кількість записів у розділі [%2d] «%s» відрізняється від кількості у таблиці "
+"символів [%2d] «%s»\n"
+
+#: ../src/elflint.c:2740
+#, c-format
+msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
+msgstr "розділ [%2d] «%s»: символ %d: не вдалося прочитати дані щодо версії\n"
+
+#: ../src/elflint.c:2756
+#, c-format
+msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
+msgstr "розділ [%2d] «%s»: символ %d: локальний символ у загальному контексті\n"
+
+#: ../src/elflint.c:2764
+#, c-format
+msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
+msgstr "розділ [%2d] «%s»: символ %d: локальний символ з версією\n"
+
+#: ../src/elflint.c:2778
+#, c-format
+msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
+msgstr "розділ [%2d] «%s»: символ %d: некоректний індекс версії %d\n"
+
+#: ../src/elflint.c:2783
+#, c-format
+msgid "section [%2d] '%s': symbol %d: version index %d is for defined version\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %d: індекси версії %d призначено до визначеної "
+"версії\n"
+
+#: ../src/elflint.c:2793
+#, c-format
+msgid "section [%2d] '%s': symbol %d: version index %d is for requested version\n"
+msgstr ""
+"розділ [%2d] «%s»: символ %d: індекс версії %d призначено для версії, на яку "
+"надійшов запит\n"
+
+#: ../src/elflint.c:2845
+#, c-format
+msgid "more than one version reference section present\n"
+msgstr "виявлено більше за один розділ посилань на версії\n"
+
+#: ../src/elflint.c:2853 ../src/elflint.c:2982
+#, c-format
+msgid "section [%2d] '%s': sh_link does not link to string table\n"
+msgstr "розділ [%2d] «%s»: sh_link не посилається на таблицю рядків\n"
+
+#: ../src/elflint.c:2876 ../src/elflint.c:3034
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong version %d\n"
+msgstr "розділ [%2d] «%s»: запис %d має помилкову версію %d\n"
+
+#: ../src/elflint.c:2882 ../src/elflint.c:3040
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
+msgstr ""
+"розділ [%2d] «%s»: запис %d містить помилкове зміщення у допоміжних даних\n"
+
+#: ../src/elflint.c:2890
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid file reference\n"
+msgstr "розділ [%2d] «%s»: запис %d містить некоректне посилання на файл\n"
+
+#: ../src/elflint.c:2898
+#, c-format
+msgid "section [%2d] '%s': entry %d references unknown dependency\n"
+msgstr "розділ [%2d] «%s»: запис %d посилається на невідому залежність\n"
+
+#: ../src/elflint.c:2910
+#, 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:2917
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
+"reference\n"
+msgstr ""
+"розділ [%2d] «%s»: допоміжний запис %d запису %d містить некоректне посилання "
+"на назву\n"
+
+#: ../src/elflint.c:2924
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: %"
+"#x, expected %#x\n"
+msgstr ""
+"розділ [%2d] «%s»: допоміжний запис %d запису %d має помилкове значення хешу: "
+"%#x, мало бути %#x\n"
+
+#: ../src/elflint.c:2934
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
+"name '%s'\n"
+msgstr ""
+"розділ [%2d] «%s»: допоміжний запис %d запису %d містить дублікати назви "
+"версії «%s»\n"
+
+#: ../src/elflint.c:2945
+#, c-format
+msgid "section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
+msgstr ""
+"розділ [%2d] «%s»: допоміжний запис %d запису %d має помилкове наступне поле\n"
+
+#: ../src/elflint.c:2961 ../src/elflint.c:3119
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
+msgstr ""
+"розділ [%2d] «%s»: запис %d має некоректне зміщення щодо наступного запису\n"
+
+#: ../src/elflint.c:2974
+#, c-format
+msgid "more than one version definition section present\n"
+msgstr "виявлено більше за один розділ визначення версій\n"
+
+#: ../src/elflint.c:3019
+#, c-format
+msgid "section [%2d] '%s': more than one BASE definition\n"
+msgstr "розділ [%2d] «%s»: повторне визначення BASE\n"
+
+#: ../src/elflint.c:3023
+#, 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:3029
+#, c-format
+msgid "section [%2d] '%s': entry %d has unknown flag\n"
+msgstr "розділ [%2d] «%s»: невідомий прапорець запису %d\n"
+
+#: ../src/elflint.c:3053
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid name reference\n"
+msgstr "розділ [%2d] «%s»: запис %d містить некоректне посилання на назву\n"
+
+#: ../src/elflint.c:3060
+#, 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:3069
+#, c-format
+msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
+msgstr "розділ [%2d] «%s»: запис %d містить дублікати назви версії «%s»\n"
+
+#: ../src/elflint.c:3088
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
+msgstr ""
+"розділ [%2d] «%s»: запис %d містить некоректне посилання на назву у "
+"допоміжних даних\n"
+
+#: ../src/elflint.c:3103
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
+msgstr ""
+"розділ [%2d] «%s»: у допоміжних даних запису %d міститься помилкове поле "
+"наступного запису\n"
+
+#: ../src/elflint.c:3125
+#, c-format
+msgid "section [%2d] '%s': no BASE definition\n"
+msgstr "розділ [%2d] «%s»: немає визначення BASE\n"
+
+#: ../src/elflint.c:3141
+#, c-format
+msgid "section [%2d] '%s': unknown parent version '%s'\n"
+msgstr "розділ [%2d] «%s»: невідома основна версія «%s»\n"
+
+#: ../src/elflint.c:3154
+#, c-format
+msgid "section [%2d] '%s': empty object attributes section\n"
+msgstr "розділ [%2d] «%s»: порожній розділ атрибутів об’єкта\n"
+
+#: ../src/elflint.c:3175
+#, c-format
+msgid "section [%2d] '%s': unrecognized attribute format\n"
+msgstr "розділ [%2d] «%s»: не вдалося визначити формат атрибутів\n"
+
+#: ../src/elflint.c:3191
+#, c-format
+msgid "section [%2d] '%s': offset %zu: zero length field in attribute section\n"
+msgstr ""
+"розділ [%2d] «%s»: зміщення %zu: поле нульового розміру у розділі атрибутів\n"
+
+#: ../src/elflint.c:3200
+#, c-format
+msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
+msgstr "розділ [%2d] «%s»: зміщення %zu: некоректна довжина у розділі атрибутів\n"
+
+#: ../src/elflint.c:3212
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
+msgstr "розділ [%2d] «%s»: зміщення %zu: незавершений рядок назви постачальника\n"
+
+#: ../src/elflint.c:3229
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
+msgstr ""
+"розділ [%2d] «%s»: зміщення %zu: незавершене поле ULEB128 у тезі підрозділу "
+"атрибутів\n"
+
+#: ../src/elflint.c:3238
+#, c-format
+msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
+msgstr "розділ [%2d] «%s»: зміщення %zu: обрізаний розділ атрибутів\n"
+
+#: ../src/elflint.c:3247
+#, c-format
+msgid "section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
+msgstr ""
+"розділ [%2d] «%s»: зміщення %zu: поле нульового розміру у підрозділі "
+"атрибутів\n"
+
+#: ../src/elflint.c:3260
+#, c-format
+msgid "section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
+msgstr ""
+"розділ [%2d] «%s»: зміщення %zu: некоректна довжина у підрозділі атрибутів\n"
+
+#. Tag_File
+#: ../src/elflint.c:3271
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
+msgstr ""
+"розділ [%2d] «%s»: зміщення %zu: підрозділ атрибутів містить неочікуваний теґ "
+"%u\n"
+
+#: ../src/elflint.c:3289
+#, c-format
+msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
+msgstr ""
+"розділ [%2d] «%s»: зміщення %zu: незавершене поле ULEB128 у тезі атрибуту\n"
+
+#: ../src/elflint.c:3300
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
+msgstr "розділ [%2d] «%s»: зміщення %zu: незавершений рядок у атрибуті\n"
+
+#: ../src/elflint.c:3313
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
+msgstr "розділ [%2d] «%s»: зміщення %zu: незавершений теґ атрибуту %u\n"
+
+#: ../src/elflint.c:3317
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
+msgstr "розділ [%2d] «%s»: зміщення %zu: невідоме значення %s атрибуту %<PRIu64>\n"
+
+#: ../src/elflint.c:3327
+#, c-format
+msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
+msgstr "розділ [%2d] «%s»: зміщення %zu: невідомий постачальник «%s»\n"
+
+#: ../src/elflint.c:3333
+#, c-format
+msgid "section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
+msgstr ""
+"розділ [%2d] «%s»: зміщення %zu: зайві байти після останнього розділу "
+"атрибутів\n"
+
+#: ../src/elflint.c:3422
+#, c-format
+msgid "cannot get section header of zeroth section\n"
+msgstr "не вдалося отримати заголовок нульового розділу\n"
+
+#: ../src/elflint.c:3426
+#, c-format
+msgid "zeroth section has nonzero name\n"
+msgstr "нульовий розділ має ненульову назву\n"
+
+#: ../src/elflint.c:3428
+#, c-format
+msgid "zeroth section has nonzero type\n"
+msgstr "нульовий розділ має ненульовий тип\n"
+
+#: ../src/elflint.c:3430
+#, c-format
+msgid "zeroth section has nonzero flags\n"
+msgstr "нульовий розділ має ненульові прапорці\n"
+
+#: ../src/elflint.c:3432
+#, c-format
+msgid "zeroth section has nonzero address\n"
+msgstr "нульовий розділ має ненульову адресу\n"
+
+#: ../src/elflint.c:3434
+#, c-format
+msgid "zeroth section has nonzero offset\n"
+msgstr "нульовий розділ має ненульове зміщення\n"
+
+#: ../src/elflint.c:3436
+#, c-format
+msgid "zeroth section has nonzero align value\n"
+msgstr "нульовий розділ має ненульове значення вирівнювання\n"
+
+#: ../src/elflint.c:3438
+#, c-format
+msgid "zeroth section has nonzero entry size value\n"
+msgstr "нульовий розділ має ненульове значення розміру запису\n"
+
+#: ../src/elflint.c:3441
+#, c-format
+msgid ""
+"zeroth section has nonzero size value while ELF header has nonzero shnum "
+"value\n"
+msgstr ""
+"нульовий розділ має ненульове значення розміру, хоча заголовок ELF ман "
+"ненульове значення shnum\n"
+
+#: ../src/elflint.c:3445
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in shstrndx\n"
+msgstr ""
+"нульовий розділ має ненульове значення компонування, хоча у заголовку ELF "
+"немає сигналу переповнення у shstrndx\n"
+
+#: ../src/elflint.c:3449
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in phnum\n"
+msgstr ""
+"нульовий розділ має ненульове значення компонування, хоча у заголовку ELF "
+"немає сигналу переповнення у phnum\n"
+
+#: ../src/elflint.c:3466
+#, c-format
+msgid "cannot get section header for section [%2zu] '%s': %s\n"
+msgstr "не вдалося отримати заголовок розділу [%2zu] «%s»: %s\n"
+
+#: ../src/elflint.c:3475
+#, c-format
+msgid "section [%2zu]: invalid name\n"
+msgstr "розділ [%2zu]: некоректна назва\n"
+
+#: ../src/elflint.c:3502
+#, c-format
+msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
+msgstr "розділ [%2d] «%s» належить до помилкового типу: мав бути %s, маємо %s\n"
+
+#: ../src/elflint.c:3518
+#, c-format
+msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
+msgstr "розділ [%2zu] «%s» має помилкові прапорці: мало бути %s, маємо %s\n"
+
+#: ../src/elflint.c:3535
+#, c-format
+msgid "section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
+msgstr ""
+"розділ [%2zu] «%s» має помилкові прапорці: мало бути %s, можливо, %s, але "
+"маємо %s\n"
+
+#: ../src/elflint.c:3553
+#, c-format
+msgid "section [%2zu] '%s' present in object file\n"
+msgstr "у об’єктному файлі виявлено розділ [%2zu] «%s»\n"
+
+#: ../src/elflint.c:3559 ../src/elflint.c:3591
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
+msgstr ""
+"у розділ [%2zu] «%s» встановлено прапорець SHF_ALLOC, але немає придатного до "
+"завантаження сегмента\n"
+
+#: ../src/elflint.c:3564 ../src/elflint.c:3596
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
+"segments\n"
+msgstr ""
+"у розділі [%2zu] «%s» не встановлено прапорець SHF_ALLOC, але є придатні до "
+"завантаження сегменти\n"
+
+#: ../src/elflint.c:3572
+#, c-format
+msgid "section [%2zu] '%s' is extension section index table in non-object file\n"
+msgstr ""
+"розділ [%2zu] «%s» є таблицею-покажчиком розділу розширень у файлі, який не є "
+"об’єктним\n"
+
+#: ../src/elflint.c:3615
+#, c-format
+msgid "section [%2zu] '%s': size not multiple of entry size\n"
+msgstr "розділ [%2zu] «%s»: розмір не є кратним до розміру запису\n"
+
+#: ../src/elflint.c:3620
+#, c-format
+msgid "cannot get section header\n"
+msgstr "не вдалося отримати заголовок розділу\n"
+
+#: ../src/elflint.c:3630
+#, c-format
+msgid "section [%2zu] '%s' has unsupported type %d\n"
+msgstr "розділ [%2zu] «%s» належить до непідтримуваного типу %d\n"
+
+#: ../src/elflint.c:3644
+#, c-format
+msgid ""
+"section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
+msgstr ""
+"розділ [%2zu] «%s» містить некоректні специфічні для процесора прапорці %"
+"#<PRIx64>\n"
+
+#: ../src/elflint.c:3651
+#, c-format
+msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
+msgstr "розділ [%2zu] «%s» містить невідомі прапорці %#<PRIx64>\n"
+
+#: ../src/elflint.c:3659
+#, c-format
+msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
+msgstr ""
+"розділ [%2zu] «%s»: адреса розділів локальних даних потоків не є нульовою\n"
+
+#: ../src/elflint.c:3667
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in link value\n"
+msgstr ""
+"розділ [%2zu] «%s»: некоректне посилання на розділ у значенні компонування\n"
+
+#: ../src/elflint.c:3672
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in info value\n"
+msgstr "розділ [%2zu] «%s»: некоректне посилання на розділ у значенні відомостей\n"
+
+#: ../src/elflint.c:3679
+#, c-format
+msgid "section [%2zu] '%s': strings flag set without merge flag\n"
+msgstr "розділ [%2zu] «%s»: встановлено прапорець strings без прапорця merge\n"
+
+#: ../src/elflint.c:3684
+#, c-format
+msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
+msgstr ""
+"розділ [%2zu] «%s»: встановлено прапорець merge, але розмір запису є "
+"нульовим\n"
+
+#: ../src/elflint.c:3702
+#, c-format
+msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
+msgstr "розділ [%2zu] «%s» має неочікуваний тип %d для виконуваного розділу\n"
+
+#: ../src/elflint.c:3711
+#, c-format
+msgid "section [%2zu] '%s' is both executable and writable\n"
+msgstr "розділ [%2zu] «%s» є одночасно виконуваним і придатним до запису\n"
+
+#: ../src/elflint.c:3738
+#, c-format
+msgid ""
+"section [%2zu] '%s' not fully contained in segment of program header entry %"
+"d\n"
+msgstr ""
+"розділ [%2zu] «%s» не повністю міститься у сегменті запису заголовка програми "
+"%d\n"
+
+#: ../src/elflint.c:3746
+#, c-format
+msgid ""
+"section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
+"program header entry %d\n"
+msgstr ""
+"розділ [%2zu] «%s» належить до типу NOBITS, але його читання виконується з "
+"файла у сегментів запису заголовка програми %d\n"
+
+#: ../src/elflint.c:3755
+#, 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 ""
+"розділ [%2zu] «%s» не належить до типу NOBITS, але його читання не "
+"виконується з файла у сегментів запису заголовка програми %d\n"
+
+#: ../src/elflint.c:3766
+#, c-format
+msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
+msgstr "розділ [%2zu] «%s» є виконуваним у невиконуваному сегменті %d\n"
+
+#: ../src/elflint.c:3776
+#, c-format
+msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
+msgstr ""
+"розділ [%2zu] «%s» є придатним до запису у непридатному до запису сегменті %"
+"d\n"
+
+#: ../src/elflint.c:3786
+#, c-format
+msgid "section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
+msgstr ""
+"розділ [%2zu] «%s»: встановлено прапорець alloc, але розділ не перебуває у "
+"жодному завантаженому сегменті\n"
+
+#: ../src/elflint.c:3792
+#, c-format
+msgid ""
+"section [%2zu] '%s': ELF header says this is the section header string table "
+"but type is not SHT_TYPE\n"
+msgstr ""
+"розділ [%2zu] «%s»: заголовок ELF повідомляє про те, що це таблиця рядків "
+"заголовка розділу, але ця таблиця не належить до типу SHT_TYPE\n"
+
+#: ../src/elflint.c:3800
+#, c-format
+msgid "section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
+msgstr ""
+"розділ [%2zu] «%s»: придатні до переміщення файли не можуть містити "
+"динамічних таблиць символів\n"
+
+#: ../src/elflint.c:3851
+#, c-format
+msgid "more than one version symbol table present\n"
+msgstr "виявлено більше за одну таблицю символів версій\n"
+
+#: ../src/elflint.c:3874
+#, c-format
+msgid "INTERP program header entry but no .interp section\n"
+msgstr "існує запис заголовка програми INTERP, але не розділ .interp\n"
+
+#: ../src/elflint.c:3885
+#, c-format
+msgid "loadable segment [%u] is executable but contains no executable sections\n"
+msgstr ""
+"придатний до завантаження сегмент [%u] є виконуваним, але не містить "
+"виконуваних розділів\n"
+
+#: ../src/elflint.c:3891
+#, c-format
+msgid "loadable segment [%u] is writable but contains no writable sections\n"
+msgstr ""
+"придатний до завантаження розділ [%u] є придатним до запису, але не містить "
+"придатних до запису розділів\n"
+
+#: ../src/elflint.c:3902
+#, c-format
+msgid ""
+"no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
+"exist\n"
+msgstr ""
+"немає розділу .gnu.versym, хоча існує розділ .gnu.versym_d або .gnu."
+"versym_r\n"
+
+#: ../src/elflint.c:3915
+#, c-format
+msgid "duplicate version index %d\n"
+msgstr "дублікат індексу версії %d\n"
+
+#: ../src/elflint.c:3929
+#, 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:3978
+#, 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:3982
+#, c-format
+msgid "section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+"розділ [%2d] «%s»: невідомий тип нотатки файла core %<PRIu32> за зміщенням %"
+"Zu\n"
+
+#: ../src/elflint.c:4005
+#, c-format
+msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+"phdr[%d]: невідомий тип нотатки об’єктного файла %<PRIu32> за зміщенням %Zu\n"
+
+#: ../src/elflint.c:4009
+#, c-format
+msgid "section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+"розділ [%2d] «%s»: невідомий тип нотатки об’єктного файла %<PRIu32> за "
+"зміщенням %Zu\n"
+
+#: ../src/elflint.c:4026
+#, c-format
+msgid "phdr[%d]: no note entries defined for the type of file\n"
+msgstr "phdr[%d]: для цього типу файлів не визначено записів нотаток\n"
+
+#: ../src/elflint.c:4045
+#, c-format
+msgid "phdr[%d]: cannot get content of note section: %s\n"
+msgstr "phdr[%d]: не вдалося отримати вміст розділу нотаток: %s\n"
+
+#: ../src/elflint.c:4048
+#, c-format
+msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
+msgstr "phdr[%d]: зайві %<PRIu64> байтів після останнього запису нотатки\n"
+
+#: ../src/elflint.c:4069
+#, c-format
+msgid "section [%2d] '%s': no note entries defined for the type of file\n"
+msgstr "розділ [%2d] «%s»: для цього типу файлів не визначено записів нотаток\n"
+
+#: ../src/elflint.c:4076
+#, c-format
+msgid "section [%2d] '%s': cannot get content of note section\n"
+msgstr "розділ [%2d] «%s»: не вдалося отримати вміст розділу нотаток\n"
+
+#: ../src/elflint.c:4079
+#, c-format
+msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
+msgstr "розділ [%2d] «%s»: додаткові %<PRIu64> байтів після останньої нотатки\n"
+
+#: ../src/elflint.c:4097
+#, c-format
+msgid "only executables, shared objects, and core files can have program headers\n"
+msgstr ""
+"заголовки програм можуть бути лише у виконуваних файлів, об’єктних файлів "
+"спільного використання або файлів core\n"
+
+#: ../src/elflint.c:4112
+#, c-format
+msgid "cannot get program header entry %d: %s\n"
+msgstr "не вдалося отримати запис заголовка програми %d: %s\n"
+
+#: ../src/elflint.c:4121
+#, c-format
+msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
+msgstr ""
+"запис заголовка програми %d: невідомий тип запису заголовка програми %"
+"#<PRIx64>\n"
+
+#: ../src/elflint.c:4132
+#, c-format
+msgid "more than one INTERP entry in program header\n"
+msgstr "більше за один запис INTERP у заголовку програми\n"
+
+#: ../src/elflint.c:4140
+#, c-format
+msgid "more than one TLS entry in program header\n"
+msgstr "більше за один запис TLS у заголовку програми\n"
+
+#: ../src/elflint.c:4147
+#, c-format
+msgid "static executable cannot have dynamic sections\n"
+msgstr "у статичному виконуваному файлі не може бути динамічних розділів\n"
+
+#: ../src/elflint.c:4161
+#, c-format
+msgid "dynamic section reference in program header has wrong offset\n"
+msgstr ""
+"посилання на динамічний розділ у заголовку програми має помилкове зміщення\n"
+
+#: ../src/elflint.c:4164
+#, c-format
+msgid "dynamic section size mismatch in program and section header\n"
+msgstr ""
+"розміри динамічного розділу у заголовку програми та у заголовку розділу не "
+"збігаються\n"
+
+#: ../src/elflint.c:4174
+#, c-format
+msgid "more than one GNU_RELRO entry in program header\n"
+msgstr "більше за один запис GNU_RELRO у заголовку програми\n"
+
+#: ../src/elflint.c:4195
+#, c-format
+msgid "loadable segment GNU_RELRO applies to is not writable\n"
+msgstr ""
+"придатний до завантаження сегмент, до якого звертається GNU_RELRO, "
+"непридатний до запису\n"
+
+#: ../src/elflint.c:4198
+#, c-format
+msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
+msgstr ""
+"прапорці придатного до завантаження сегмента [%u] не відповідають прапорцям "
+"GNU_RELRO [%u]\n"
+
+#: ../src/elflint.c:4206 ../src/elflint.c:4229
+#, c-format
+msgid "%s segment not contained in a loaded segment\n"
+msgstr "сегмент %s не міститься у завантаженому сегменті\n"
+
+#: ../src/elflint.c:4235
+#, c-format
+msgid "program header offset in ELF header and PHDR entry do not match"
+msgstr "зміщення заголовка програми у заголовку ELF і запис PHDR не збігаються"
+
+#: ../src/elflint.c:4259
+#, c-format
+msgid "call frame search table reference in program header has wrong offset\n"
+msgstr ""
+"посилання на таблицю вікон викликів у заголовку програми має помилкове "
+"зміщення\n"
+
+#: ../src/elflint.c:4262
+#, c-format
+msgid "call frame search table size mismatch in program and section header\n"
+msgstr ""
+"розміри таблиці пошуку вікон виклику у заголовку програми та у заголовку "
+"розділу не збігаються\n"
+
+#: ../src/elflint.c:4275
+#, 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:4283
+#, c-format
+msgid "call frame search table must be allocated\n"
+msgstr "таблицю пошуку вікон викликів має бути розміщено у пам’яті\n"
+
+#: ../src/elflint.c:4286
+#, c-format
+msgid "section [%2zu] '%s' must be allocated\n"
+msgstr "розділ [%2zu] «%s» має бути розміщено у пам’яті\n"
+
+#: ../src/elflint.c:4290
+#, c-format
+msgid "call frame search table must not be writable\n"
+msgstr "таблиця пошуку вікон викликів не повинна бути придатною до запису\n"
+
+#: ../src/elflint.c:4293
+#, c-format
+msgid "section [%2zu] '%s' must not be writable\n"
+msgstr "розділ [%2zu] «%s» не повинен бути придатним до запису\n"
+
+#: ../src/elflint.c:4298
+#, c-format
+msgid "call frame search table must not be executable\n"
+msgstr "таблиця пошуку вікон викликів не повинна бути придатною до виконання\n"
+
+#: ../src/elflint.c:4301
+#, c-format
+msgid "section [%2zu] '%s' must not be executable\n"
+msgstr "розділ [%2zu] «%s» не повинен бути придатним до виконання\n"
+
+#: ../src/elflint.c:4312
+#, c-format
+msgid "program header entry %d: file size greater than memory size\n"
+msgstr "запис заголовка програми %d: розмір файла перевищує об’єм пам’яті\n"
+
+#: ../src/elflint.c:4319
+#, c-format
+msgid "program header entry %d: alignment not a power of 2\n"
+msgstr "запис заголовка програми %d: значення вирівнювання не є степенем 2\n"
+
+#: ../src/elflint.c:4322
+#, c-format
+msgid ""
+"program header entry %d: file offset and virtual address not module of "
+"alignment\n"
+msgstr ""
+"запис заголовка програми %d: зміщення у файлі і віртуальна адреса не "
+"співвідносяться з вирівнюванням\n"
+
+#: ../src/elflint.c:4335
+#, c-format
+msgid ""
+"executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
+"program header entry"
+msgstr ""
+"виконуваний модуль/DSO з розділом .eh_frame_hdr не містить запису заголовка "
+"програми PT_GNU_EH_FRAME"
+
+#: ../src/elflint.c:4369
+#, c-format
+msgid "cannot read ELF header: %s\n"
+msgstr "не вдалося прочитати заголовок ELF: %s\n"
+
+#: ../src/elflint.c:4395
+#, c-format
+msgid "text relocation flag set but not needed\n"
+msgstr ""
+"встановлено прапорець переміщення тексту, але такий прапорець не потрібен\n"
+
+#: ../src/findtextrel.c:70
+msgid "Input Selection:"
+msgstr "Вибір параметрів виводу даних:"
+
+#: ../src/findtextrel.c:71
+msgid "Prepend PATH to all file names"
+msgstr "Додавати ШЛЯХ до всіх назв файлів"
+
+#: ../src/findtextrel.c:73
+msgid "Use PATH as root of debuginfo hierarchy"
+msgstr "Використовувати ШЛЯХ як кореневий каталог для ієрархії debuginfo"
+
+#. Short description of program.
+#: ../src/findtextrel.c:80
+msgid "Locate source of text relocations in FILEs (a.out by default)."
+msgstr "Шукає джерело переміщеного тексту у ФАЙЛАХ (типово, a.out)."
+
+#. Strings for arguments in help texts.
+#: ../src/findtextrel.c:84 ../src/nm.c:111 ../src/objdump.c:80
+#: ../src/size.c:92 ../src/strings.c:92 ../src/strip.c:97
+msgid "[FILE...]"
+msgstr "[ФАЙЛ...]"
+
+#: ../src/findtextrel.c:246
+#, c-format
+msgid "cannot get ELF header '%s': %s"
+msgstr "не вдалося отримати заголовок ELF «%s»: %s"
+
+#: ../src/findtextrel.c:257
+#, c-format
+msgid "'%s' is not a DSO or PIE"
+msgstr "«%s» не є DSO або PIE"
+
+#: ../src/findtextrel.c:274
+#, c-format
+msgid "getting get section header of section %zu: %s"
+msgstr "отримання заголовка розділу get розділу %zu: %s"
+
+#: ../src/findtextrel.c:292
+#, c-format
+msgid "cannot read dynamic section: %s"
+msgstr "не вдалося прочитати динамічний розділ: %s"
+
+#: ../src/findtextrel.c:307
+#, c-format
+msgid "no text relocations reported in '%s'"
+msgstr "у «%s» не виявлено переміщень тексту"
+
+#: ../src/findtextrel.c:319
+#, c-format
+msgid "while reading ELF file"
+msgstr "під час спроби читання файла ELF"
+
+#: ../src/findtextrel.c:328 ../src/findtextrel.c:345
+#, c-format
+msgid "cannot get program header index at offset %d: %s"
+msgstr "не вдалося отримати індекс заголовка програми за зміщенням %d: %s"
+
+#: ../src/findtextrel.c:397
+#, c-format
+msgid "cannot get section header of section %Zu: %s"
+msgstr "не вдалося отримати заголовок розділу %Zu: %s"
+
+#: ../src/findtextrel.c:409
+#, c-format
+msgid "cannot get symbol table section %zu in '%s': %s"
+msgstr "не вдалося отримати таблицю символів розділу %zu у «%s»: %s"
+
+#: ../src/findtextrel.c:429 ../src/findtextrel.c:452
+#, c-format
+msgid "cannot get relocation at index %d in section %zu in '%s': %s"
+msgstr "не вдалося отримати переміщення за індексом %d у розділі %zu у «%s»: %s"
+
+#: ../src/findtextrel.c:517
+#, c-format
+msgid "%s not compiled with -fpic/-fPIC\n"
+msgstr "%s не зібрано з -fpic/-fPIC\n"
+
+#: ../src/findtextrel.c:570
+#, c-format
+msgid "the file containing the function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr "файл, що містить функцію «%s», не було зібрано з параметрами -fpic/-fPIC\n"
+
+#: ../src/findtextrel.c:577 ../src/findtextrel.c:597
+#, c-format
+msgid ""
+"the file containing the function '%s' might not be compiled with -fpic/-"
+"fPIC\n"
+msgstr ""
+"файл, що містить функцію «%s», ймовірно, не було зібрано з параметрами -fpic/-"
+"fPIC\n"
+
+#: ../src/findtextrel.c:585
+#, c-format
+msgid ""
+"either the file containing the function '%s' or the file containing the "
+"function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr ""
+"файл, що містить функцію «%s», або файл, що містить функцію «%s», зібрано без "
+"параметрів -fpic/-fPIC\n"
+
+#: ../src/findtextrel.c:605
+#, c-format
+msgid "a relocation modifies memory at offset %llu in a write-protected segment\n"
+msgstr ""
+"переміщення призводить до зміни запису пам’яті за зміщенням %llu у "
+"захищеному від запису сегменті\n"
+
+#: ../src/i386_ld.c:210
+#, c-format
+msgid "cannot allocate PLT section: %s"
+msgstr "не вдалося розмістити PLT-розділ: %s"
+
+#: ../src/i386_ld.c:232
+#, c-format
+msgid "cannot allocate PLTREL section: %s"
+msgstr "не вдалося розмістити розділ PLTREL: %s"
+
+#: ../src/i386_ld.c:253
+#, c-format
+msgid "cannot allocate GOT section: %s"
+msgstr "не вдалося розмістити розділ GOT: %s"
+
+#: ../src/i386_ld.c:274
+#, c-format
+msgid "cannot allocate GOTPLT section: %s"
+msgstr "не вдалося розмістити розділ GOTPLT: %s"
+
+#: ../src/i386_ld.c:661
+#, c-format
+msgid "initial-executable TLS relocation cannot be used "
+msgstr "не можна використовувати переміщення TLS у початковому виконуваному файлі"
+
+#: ../src/ld.c:87
+msgid "Input File Control:"
+msgstr "Керування файлом вхідних даних:"
+
+#: ../src/ld.c:89
+msgid "Include whole archives in the output from now on."
+msgstr "Відтепер включати цілі архіви до виведених даних."
+
+#: ../src/ld.c:91
+msgid "Stop including the whole archives in the output."
+msgstr "Припинити включення цілих архівів до вихідних даних."
+
+#: ../src/ld.c:92 ../src/ld.c:106 ../src/ld.c:184
+msgid "FILE"
+msgstr "ФАЙЛ"
+
+#: ../src/ld.c:93
+msgid "Start a group."
+msgstr "Почати групу."
+
+#: ../src/ld.c:94
+msgid "End a group."
+msgstr "Завершити групу."
+
+#: ../src/ld.c:95
+msgid "PATH"
+msgstr "ШЛЯХ"
+
+#: ../src/ld.c:96
+msgid "Add PATH to list of directories files are searched in."
+msgstr "Додати ШЛЯХ до списку каталогів, у яких слід шукати файли."
+
+#: ../src/ld.c:98
+msgid "Only set DT_NEEDED for following dynamic libs if actually used"
+msgstr ""
+"Встановлювати DT_NEEDED лише для наступних динамічних бібліотек, якщо він "
+"справді використовується"
+
+#: ../src/ld.c:100
+msgid "Always set DT_NEEDED for following dynamic libs"
+msgstr "Завжди встановлювати DT_NEEDED для наступних динамічних бібліотек"
+
+#: ../src/ld.c:102
+msgid "Ignore LD_LIBRARY_PATH environment variable."
+msgstr "Ігнорувати змінну середовища LD_LIBRARY_PATH."
+
+#: ../src/ld.c:105
+msgid "Output File Control:"
+msgstr "Керування файлом виведених даних:"
+
+#: ../src/ld.c:106
+msgid "Place output in FILE."
+msgstr "Вивести дані до ФАЙЛА."
+
+#: ../src/ld.c:109
+msgid "Object is marked to not use default search path at runtime."
+msgstr ""
+"Об’єкт позначено, як таких, який не використовує типовий шлях пошуку під час "
+"запуску."
+
+#: ../src/ld.c:111
+msgid "Same as --whole-archive."
+msgstr "Те саме, що --whole-archive."
+
+#: ../src/ld.c:112
+msgid "Default rules of extracting from archive; weak references are not enough."
+msgstr "Типові правила видобування з архівів; слабкого посилання недостатньо."
+
+#: ../src/ld.c:116
+msgid "Weak references cause extraction from archive."
+msgstr "Слабкі посилання спричиняють видобування з архіву."
+
+#: ../src/ld.c:118
+msgid "Allow multiple definitions; first is used."
+msgstr "Дозволити декілька визначень. Використовуватиметься лише перше."
+
+#: ../src/ld.c:120
+msgid "Disallow/allow undefined symbols in DSOs."
+msgstr "Заборонити/Дозволити невизначені символи у DSO."
+
+#: ../src/ld.c:123
+msgid "Object requires immediate handling of $ORIGIN."
+msgstr "Об’єкт вимагає негайної обробки $ORIGIN."
+
+#: ../src/ld.c:125
+msgid "Relocation will not be processed lazily."
+msgstr "Переміщення не буде оброблятися у лінивому режимі."
+
+#: ../src/ld.c:127
+msgid "Object cannot be unloaded at runtime."
+msgstr "Об’єкт не можна вивантажувати під час запуску."
+
+#: ../src/ld.c:129
+msgid "Mark object to be initialized first."
+msgstr "Позначити об’єкт, як такий, що потребує ініціалізації."
+
+#: ../src/ld.c:131
+msgid "Enable/disable lazy-loading flag for following dependencies."
+msgstr ""
+"Увімкнути/Вимкнути прапорець лінивого завантаження для наведених нижче "
+"залежностей."
+
+#: ../src/ld.c:133
+msgid "Mark object as not loadable with 'dlopen'."
+msgstr "Позначити об’єкт, як непридатний для завантаження за допомогою «dlopen»."
+
+#: ../src/ld.c:135
+msgid "Ignore/record dependencies on unused DSOs."
+msgstr "Ігнорувати/Записувати залежності невикористаних DSO."
+
+#: ../src/ld.c:137
+msgid "Generated DSO will be a system library."
+msgstr "Створена DSO буде системною бібліотекою."
+
+#: ../src/ld.c:138
+msgid "ADDRESS"
+msgstr "АДРЕСА"
+
+#: ../src/ld.c:138
+msgid "Set entry point address."
+msgstr "Встановити адресу точки входу."
+
+#: ../src/ld.c:141
+msgid "Do not link against shared libraries."
+msgstr "Не компонувати з бібліотеками спільного використання."
+
+#: ../src/ld.c:144
+msgid "Prefer linking against shared libraries."
+msgstr "Надавати перевагу компонуванню з бібліотеками спільного використання."
+
+#: ../src/ld.c:145
+msgid "Export all dynamic symbols."
+msgstr "Експортувати всі динамічні символи."
+
+#: ../src/ld.c:146
+msgid "Strip all symbols."
+msgstr "Вилучити всі символи."
+
+#: ../src/ld.c:147
+msgid "Strip debugging symbols."
+msgstr "Вилучити символи зневаджування."
+
+#: ../src/ld.c:149
+msgid "Assume pagesize for the target system to be SIZE."
+msgstr "Вважати розмір сторінки для системи призначення рівним значенню РОЗМІР."
+
+#: ../src/ld.c:151
+msgid "Set runtime DSO search path."
+msgstr "Встановити шлях пошуку DSO під час запуску."
+
+#: ../src/ld.c:154
+msgid "Set link time DSO search path."
+msgstr "Встановити шлях пошуку DSO під час компонування."
+
+#: ../src/ld.c:155
+msgid "Generate dynamic shared object."
+msgstr "Створити динамічний об’єкт спільного використання."
+
+#: ../src/ld.c:156
+msgid "Generate relocatable object."
+msgstr "Створити придатний для переміщення об’єкт."
+
+#: ../src/ld.c:159
+msgid "Causes symbol not assigned to a version be reduced to local."
+msgstr "Спричиняє перетворення символів, не прив’язаних до версії, на локальні."
+
+#: ../src/ld.c:160
+msgid "Remove unused sections."
+msgstr "Вилучити невикористані розділи."
+
+#: ../src/ld.c:163
+msgid "Don't remove unused sections."
+msgstr "Не вилучати невикористані розділи."
+
+#: ../src/ld.c:164
+msgid "Set soname of shared object."
+msgstr "Встановити soname об’єкта спільного використання."
+
+#: ../src/ld.c:165
+msgid "Set the dynamic linker name."
+msgstr "Встановити назву динамічного компонувальника."
+
+#: ../src/ld.c:168
+msgid "Add/suppress addition indentifying link-editor to .comment section."
+msgstr ""
+"Додати/Придушити додавання ідентифікації редактора компонування до розділу ."
+"comment."
+
+#: ../src/ld.c:171
+msgid "Create .eh_frame_hdr section"
+msgstr "Створити розділ .eh_frame_hdr"
+
+#: ../src/ld.c:173
+msgid "Set hash style to sysv, gnu or both."
+msgstr "Встановити формат хешування у значення sysv, gnu або both."
+
+#: ../src/ld.c:175
+msgid "Generate build ID note (md5, sha1 (default), uuid)."
+msgstr "Створити запису ідентифікатора збирання (md5, sha1 (типовий), uuid)."
+
+#: ../src/ld.c:177
+msgid "Linker Operation Control:"
+msgstr "Керування роботою компонувальника:"
+
+#: ../src/ld.c:178
+msgid "Verbose messages."
+msgstr "Докладні повідомлення."
+
+#: ../src/ld.c:179
+msgid "Trace file opens."
+msgstr "Спостерігати за відкриттями файлів."
+
+#: ../src/ld.c:181
+msgid "Trade speed for less memory usage"
+msgstr "Зменшити споживання пам’яті за рахунок швидкості"
+
+#: ../src/ld.c:182
+msgid "LEVEL"
+msgstr "РІВЕНЬ"
+
+#: ../src/ld.c:183
+msgid "Set optimization level to LEVEL."
+msgstr "Встановити рівень оптимізації РІВЕНЬ."
+
+#: ../src/ld.c:184
+msgid "Use linker script in FILE."
+msgstr "Використати скрипт компонування у ФАЙЛі."
+
+#: ../src/ld.c:187
+msgid "Select to get parser debug information"
+msgstr "Позначте, щоб отримати діагностичні дані обробника"
+
+#: ../src/ld.c:190
+msgid "Read version information from FILE."
+msgstr "Прочитати відомості щодо версії з ФАЙЛа."
+
+#: ../src/ld.c:191
+msgid "Set emulation to NAME."
+msgstr "Встановити режим емуляції на основі НАЗВИ."
+
+#. Short description of program.
+#: ../src/ld.c:197
+msgid "Combine object and archive files."
+msgstr "Комбінує об’єктні файли і файли архівів."
+
+#. Strings for arguments in help texts.
+#: ../src/ld.c:200
+msgid "[FILE]..."
+msgstr "[ФАЙЛ]..."
+
+#: ../src/ld.c:333
+#, c-format
+msgid "At least one input file needed"
+msgstr "Потрібен принаймні один файл вхідних даних"
+
+#: ../src/ld.c:349
+#, c-format
+msgid "error while preparing linking"
+msgstr "помилка під час приготування до компонування"
+
+#: ../src/ld.c:356
+#, c-format
+msgid "cannot open linker script '%s'"
+msgstr "не вдалося відкрити скрипт компонування «%s»"
+
+#: ../src/ld.c:397
+#, c-format
+msgid "-( without matching -)"
+msgstr "-( без відповідника -)"
+
+#: ../src/ld.c:572 ../src/ld.c:610
+#, c-format
+msgid "only one option of -G and -r is allowed"
+msgstr "можна використовувати лише один з параметрів -G або -r"
+
+#: ../src/ld.c:594
+#, c-format
+msgid "more than one '-m' parameter"
+msgstr "декілька параметрів «-m»"
+
+#: ../src/ld.c:604 ../src/ld.c:1013
+#, c-format
+msgid "unknown option `-%c %s'"
+msgstr "невідомий параметр «-%c %s»"
+
+#: ../src/ld.c:646
+#, c-format
+msgid "invalid page size value '%s': ignored"
+msgstr "некоректне значення розміру сторінки «%s»: проігноровано"
+
+#: ../src/ld.c:687
+#, c-format
+msgid "invalid hash style '%s'"
+msgstr "некоректний формат хешування «%s»"
+
+#: ../src/ld.c:697
+#, c-format
+msgid "invalid build-ID style '%s'"
+msgstr "некоректний формат ідентифікатора збирання «%s»"
+
+#: ../src/ld.c:785
+#, c-format
+msgid "More than one output file name given."
+msgstr "Вказано декілька назв файлів виведення даних."
+
+#: ../src/ld.c:802
+#, c-format
+msgid "Invalid optimization level `%s'"
+msgstr "Некоректний рівень оптимізації «%s»"
+
+#: ../src/ld.c:850
+#, c-format
+msgid "nested -( -) groups are not allowed"
+msgstr "підтримки вкладених груп -( -) не передбачено"
+
+#: ../src/ld.c:869
+#, c-format
+msgid "-) without matching -("
+msgstr "-) без відповідника -("
+
+#: ../src/ld.c:1046
+#, c-format
+msgid "unknown option '-%c %s'"
+msgstr "невідомий параметр «-%c %s»"
+
+#: ../src/ld.c:1150
+#, c-format
+msgid "could not find input file to determine output file format"
+msgstr ""
+"не вдалося виявити файл вхідних даних для визначення формату файла вихідних "
+"даних"
+
+#: ../src/ld.c:1152
+#, c-format
+msgid "try again with an appropriate '-m' parameter"
+msgstr "повторіть спробу з належним параметром «-m»"
+
+#: ../src/ld.c:1446
+#, c-format
+msgid "cannot read version script '%s'"
+msgstr "не вдалося прочитати скрипт версій «%s»"
+
+#. The symbol is already defined and now again
+#. in the linker script. This is an error.
+#: ../src/ld.c:1512 ../src/ld.c:1551
+#, c-format
+msgid "duplicate definition of '%s' in linker script"
+msgstr "повторне визначення «%s» у скрипті компонування"
+
+#: ../src/ldgeneric.c:209 ../src/ldgeneric.c:5151
+#, c-format
+msgid "cannot create string table"
+msgstr "не вдалося створити таблицю рядків"
+
+#: ../src/ldgeneric.c:255
+#, c-format
+msgid "cannot load ld backend library '%s': %s"
+msgstr "не вдалося завантажити бібліотеку сервера ld «%s»: %s"
+
+#: ../src/ldgeneric.c:265
+#, c-format
+msgid "cannot find init function in ld backend library '%s': %s"
+msgstr "не вдалося виявити функцію init у бібліотеці сервера ld «%s»: %s"
+
+#: ../src/ldgeneric.c:310
+#, c-format
+msgid "%s listed more than once as input"
+msgstr "%s вказано декілька разів як джерело даних"
+
+#: ../src/ldgeneric.c:424
+#, c-format
+msgid "%s (for -l%s)\n"
+msgstr "%s (для -l%s)\n"
+
+#: ../src/ldgeneric.c:425
+#, c-format
+msgid "%s (for DT_NEEDED %s)\n"
+msgstr "%s (для DT_NEEDED %s)\n"
+
+#: ../src/ldgeneric.c:573
+#, c-format
+msgid "Warning: type of `%s' changed from %s in %s to %s in %s"
+msgstr "Попередження: тип «%s» змінився з %s у %s на %s у %s"
+
+#: ../src/ldgeneric.c:586
+#, c-format
+msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
+msgstr "Попередження: розмір «%s» змінено з %<PRIu64> у %s на %<PRIu64> у %s"
+
+#: ../src/ldgeneric.c:661 ../src/ldgeneric.c:1122 ../src/readelf.c:629
+#: ../src/strip.c:543
+#, c-format
+msgid "cannot determine number of sections: %s"
+msgstr "не вдалося визначити кількість розділів: %s"
+
+#: ../src/ldgeneric.c:677
+#, c-format
+msgid "(%s+%#<PRIx64>): multiple definition of %s `%s'\n"
+msgstr "(%s+%#<PRIx64>): повторне визначення %s «%s»\n"
+
+#: ../src/ldgeneric.c:700
+#, c-format
+msgid "(%s+%#<PRIx64>): first defined here\n"
+msgstr "(%s+%#<PRIx64>): вперше визначено тут\n"
+
+#: ../src/ldgeneric.c:819
+#, c-format
+msgid "%s: cannot get section group data: %s"
+msgstr "%s: не вдалося отримати дані групи розділів: %s"
+
+#. If we come here no section group contained the given section
+#. despite the SHF_GROUP flag. This is an error in the input
+#. file.
+#: ../src/ldgeneric.c:840
+#, c-format
+msgid "%s: section '%s' with group flag set does not belong to any group"
+msgstr "%s: розділ «%s» з встановленим прапорцем групи не належить жодній групі"
+
+#: ../src/ldgeneric.c:885
+#, c-format
+msgid "%s: section [%2d] '%s' is not in the correct section group"
+msgstr "%s: розділ [%2d] «%s» не належить до відповідної групи розділів"
+
+#. This should never happen.
+#: ../src/ldgeneric.c:1156 ../src/ldgeneric.c:1413 ../src/ldgeneric.c:1422
+#: ../src/ldgeneric.c:1481 ../src/ldgeneric.c:1490 ../src/ldgeneric.c:1753
+#: ../src/ldgeneric.c:2005
+#, c-format
+msgid "%s: invalid ELF file (%s:%d)\n"
+msgstr "%s: некоректний файл ELF (%s:%d)\n"
+
+#: ../src/ldgeneric.c:1250
+#, c-format
+msgid "%s: only files of type ET_REL might contain section groups"
+msgstr "%s: групи розділів можуть містити лише файли типу ET_REL"
+
+#: ../src/ldgeneric.c:1302
+#, c-format
+msgid "%s: cannot determine signature of section group [%2zd] '%s': %s"
+msgstr "%s: не вдалося визначити підпис групи розділів [%2zd] «%s»: %s"
+
+#: ../src/ldgeneric.c:1314
+#, c-format
+msgid "%s: cannot get content of section group [%2zd] '%s': %s'"
+msgstr "%s: не вдалося отримати вміст групи розділів [%2zd] «%s»: %s'"
+
+#: ../src/ldgeneric.c:1328
+#, c-format
+msgid ""
+"%s: group member %zu of section group [%2zd] '%s' has too high index: %"
+"<PRIu32>"
+msgstr ""
+"%s: елемент групи %zu групи розділів [%2zd] «%s» має надто високий індекс: %"
+"<PRIu32>"
+
+#: ../src/ldgeneric.c:1350
+#, c-format
+msgid "%s: section '%s' has unknown type: %d"
+msgstr "%s: розділ «%s» належить до невідомого типу: %d"
+
+#: ../src/ldgeneric.c:1729
+#, c-format
+msgid "cannot get descriptor for ELF file (%s:%d): %s\n"
+msgstr "не вдалося отримати дескриптор файла ELF (%s:%d): %s\n"
+
+#: ../src/ldgeneric.c:1899
+#, c-format
+msgid "cannot read archive `%s': %s"
+msgstr "не вдалося прочитати архів «%s»: %s"
+
+#: ../src/ldgeneric.c:2020
+#, c-format
+msgid "file of type %s cannot be linked in\n"
+msgstr "файл типу %s не можна скомпонувати у\n"
+
+#: ../src/ldgeneric.c:2032
+#, c-format
+msgid "%s: input file incompatible with ELF machine type %s\n"
+msgstr "%s: файл вхідних даних несумісний з типом архітектури ELF %s\n"
+
+#: ../src/ldgeneric.c:2044
+#, c-format
+msgid "%s: cannot get section header string table index: %s\n"
+msgstr "%s: не вдалося отримати покажчик таблиці рядків заголовка розділу: %s\n"
+
+#: ../src/ldgeneric.c:2073
+#, c-format
+msgid "cannot use DSO '%s' when generating relocatable object file"
+msgstr ""
+"не вдалося використати DSO «%s» під час створення придатного до переміщення "
+"об’єктного файла"
+
+#: ../src/ldgeneric.c:2158
+#, c-format
+msgid "input file '%s' ignored"
+msgstr "файл вхідних даних «%s» проігноровано"
+
+#. XXX The error message should get better. It should use
+#. the debugging information if present to tell where in the
+#. sources the undefined reference is.
+#: ../src/ldgeneric.c:2372
+#, c-format
+msgid "undefined symbol `%s' in %s"
+msgstr "невизначений символ «%s» у %s"
+
+#: ../src/ldgeneric.c:2702
+#, c-format
+msgid "cannot create ELF descriptor for output file: %s"
+msgstr "не вдалося створити дескриптор ELF для файла вихідних даних: %s"
+
+#: ../src/ldgeneric.c:2709
+#, c-format
+msgid "could not create ELF header for output file: %s"
+msgstr "не вдалося створити заголовок ELF для файла виведених даних: %s"
+
+#: ../src/ldgeneric.c:3224 ../src/ldgeneric.c:3294 ../src/ldgeneric.c:3330
+#: ../src/ldgeneric.c:4457 ../src/ldgeneric.c:4506 ../src/ldgeneric.c:4538
+#: ../src/ldgeneric.c:4773 ../src/ldgeneric.c:4828 ../src/ldgeneric.c:5075
+#: ../src/ldgeneric.c:5131 ../src/ldgeneric.c:5600 ../src/ldgeneric.c:5612
+#, c-format
+msgid "cannot create section for output file: %s"
+msgstr "не вдалося створити розділ для файла вихідних даних: %s"
+
+#: ../src/ldgeneric.c:3444
+#, c-format
+msgid "address computation expression contains variable '%s'"
+msgstr "вираз обчислення адреси містить змінну «%s»"
+
+#: ../src/ldgeneric.c:3489
+#, c-format
+msgid ""
+"argument '%<PRIuMAX>' of ALIGN in address computation expression is no power "
+"of two"
+msgstr ""
+"значення «%<PRIuMAX>» ALIGN у виразі обчислення адреси не є степенем двійки"
+
+#: ../src/ldgeneric.c:3684
+#, c-format
+msgid "cannot find entry symbol '%s': defaulting to %#0*<PRIx64>"
+msgstr ""
+"не вдалося знайти символ запису «%s»: встановлено типове значення %#0*<PRIx64>"
+
+#: ../src/ldgeneric.c:3690
+#, c-format
+msgid "no entry symbol specified: defaulting to %#0*<PRIx64>"
+msgstr "не вказано символу запису: встановлено типове значення %#0*<PRIx64>"
+
+#: ../src/ldgeneric.c:3920
+#, c-format
+msgid "cannot create GNU hash table section for output file: %s"
+msgstr "не вдалося створити розділ таблиці хешів GNU для файла вихідних даних: %s"
+
+#: ../src/ldgeneric.c:4071
+#, c-format
+msgid "cannot create hash table section for output file: %s"
+msgstr "не вдалося створити розділ таблиці хешів для файла вихідних даних: %s"
+
+#: ../src/ldgeneric.c:4114
+#, c-format
+msgid "cannot create build ID section: %s"
+msgstr "не вдалося створити розділу ідентифікатора збирання: %s"
+
+#: ../src/ldgeneric.c:4191
+#, c-format
+msgid "cannot convert section data to file format: %s"
+msgstr "не вдалося перетворити дані розділу у формат файла: %s"
+
+#: ../src/ldgeneric.c:4200
+#, c-format
+msgid "cannot convert section data to memory format: %s"
+msgstr "не вдалося перетворити дані розділу у формат вмісту пам’яті: %s"
+
+#: ../src/ldgeneric.c:4261
+#, c-format
+msgid "cannot read enough data for UUID"
+msgstr "не вдалося прочитати достатньо даних для встановлення UUID"
+
+#: ../src/ldgeneric.c:4358 ../src/ldgeneric.c:4379 ../src/ldgeneric.c:4408
+#: ../src/ldgeneric.c:6062
+#, c-format
+msgid "cannot create symbol table for output file: %s"
+msgstr "не вдалося створити таблицю символів для файла вихідних даних: %s"
+
+#: ../src/ldgeneric.c:5300 ../src/ldgeneric.c:5852
+#, c-format
+msgid "section index too large in dynamic symbol table"
+msgstr "у таблиці динамічних символів покажчик є занадто великим"
+
+#: ../src/ldgeneric.c:5745
+#, c-format
+msgid "cannot create versioning section: %s"
+msgstr "не вдалося створити розділ версій: %s"
+
+#: ../src/ldgeneric.c:5818
+#, c-format
+msgid "cannot create dynamic symbol table for output file: %s"
+msgstr ""
+"не вдалося створити динамічну таблицю символів для файла вихідних даних: %s"
+
+#: ../src/ldgeneric.c:5994
+#, c-format
+msgid "cannot create versioning data: %s"
+msgstr "не вдалося створити даних версії: %s"
+
+#: ../src/ldgeneric.c:6094 ../src/ldgeneric.c:6107 ../src/ldgeneric.c:6171
+#: ../src/ldgeneric.c:6179
+#, c-format
+msgid "cannot create section header string section: %s"
+msgstr "не вдалося створити розділ рядків заголовка розділу: %s"
+
+#: ../src/ldgeneric.c:6101
+#, c-format
+msgid "cannot create section header string section"
+msgstr "не вдалося створити розділ рядків заголовка розділу"
+
+#: ../src/ldgeneric.c:6259
+#, c-format
+msgid "cannot create program header: %s"
+msgstr "не вдалося створити заголовок програми: %s"
+
+#: ../src/ldgeneric.c:6267
+#, c-format
+msgid "while determining file layout: %s"
+msgstr "під час визначення компонування файла: %s"
+
+#: ../src/ldgeneric.c:6388
+#, c-format
+msgid "internal error: non-nobits section follows nobits section"
+msgstr "внутрішня помилка: небезбітовий розділ слідом за безбітовим розділом"
+
+#: ../src/ldgeneric.c:6925
+#, c-format
+msgid "cannot get header of 0th section: %s"
+msgstr "не вдалося отримати заголовок 0-го розділу: %s"
+
+#: ../src/ldgeneric.c:6941 ../src/unstrip.c:1808
+#, c-format
+msgid "cannot update ELF header: %s"
+msgstr "не вдалося оновити заголовок ELF: %s"
+
+#: ../src/ldgeneric.c:6972
+#, c-format
+msgid "linker backend didn't specify function to relocate section"
+msgstr "у сервері компонування не визначено функції для розділу переміщення"
+
+#: ../src/ldgeneric.c:6984
+#, c-format
+msgid "while writing output file: %s"
+msgstr "під час запису файла вихідних даних: %s"
+
+#: ../src/ldgeneric.c:6989
+#, c-format
+msgid "while finishing output file: %s"
+msgstr "під час закриття файла вихідних даних: %s"
+
+#: ../src/ldgeneric.c:6995
+#, c-format
+msgid "cannot stat output file"
+msgstr "не вдалося обробити stat файл виводу даних"
+
+#: ../src/ldgeneric.c:7011
+#, c-format
+msgid "WARNING: temporary output file overwritten before linking finished"
+msgstr ""
+"ПОПЕРЕДЖЕННЯ: файл тимчасового виводу даних було перезаписано до завершення "
+"компонування"
+
+#. This cannot be implemented generally. There should have been a
+#. machine dependent implementation and we should never have arrived
+#. here.
+#: ../src/ldgeneric.c:7064 ../src/ldgeneric.c:7075 ../src/ldgeneric.c:7086
+#: ../src/ldgeneric.c:7097 ../src/ldgeneric.c:7116 ../src/ldgeneric.c:7129
+#: ../src/ldgeneric.c:7141
+#, c-format
+msgid "no machine specific '%s' implementation"
+msgstr "не специфічна для архітектури реалізація «%s»"
+
+#: ../src/ldscript.y:178
+msgid "mode for segment invalid\n"
+msgstr "режим сегмента є некоректним\n"
+
+#: ../src/ldscript.y:465
+#, c-format
+msgid "while reading version script '%s': %s at line %d"
+msgstr "під час читання скрипту версій «%s»: %s у рядку %d"
+
+#: ../src/ldscript.y:466
+#, c-format
+msgid "while reading linker script '%s': %s at line %d"
+msgstr "під час читання скрипту компонування «%s»: %s у рядку %d"
+
+#: ../src/ldscript.y:745
+#, c-format
+msgid "symbol '%s' is declared both local and global for unnamed version"
+msgstr "символ «%s» оголошено локально і на загальному рівні для версії без назви"
+
+#: ../src/ldscript.y:747
+#, c-format
+msgid "symbol '%s' is declared both local and global for version '%s'"
+msgstr "символ «%s» оголошено локально і на загальному рівні для версії «%s»"
+
+#: ../src/ldscript.y:767 ../src/ldscript.y:774
+#, c-format
+msgid "default visibility set as local and global"
+msgstr "типову видимість визначено як локальну і загальну"
+
+#: ../src/nm.c:74 ../src/strip.c:73
+msgid "Output selection:"
+msgstr "Вибір виводу:"
+
+#: ../src/nm.c:75
+msgid "Display debugger-only symbols"
+msgstr "Показувати лише діагностичні символи"
+
+#: ../src/nm.c:76
+msgid "Display only defined symbols"
+msgstr "Показувати лише визначені символи"
+
+#: ../src/nm.c:79
+msgid "Display dynamic symbols instead of normal symbols"
+msgstr "Показувати динамічні символи замість звичайних символів"
+
+#: ../src/nm.c:80
+msgid "Display only external symbols"
+msgstr "Показувати лише зовнішні символи"
+
+#: ../src/nm.c:81
+msgid "Display only undefined symbols"
+msgstr "Показувати лише невизначені символи"
+
+#: ../src/nm.c:83
+msgid "Include index for symbols from archive members"
+msgstr "Включити покажчик для символів з елементів архіву"
+
+#: ../src/nm.c:85 ../src/size.c:66
+msgid "Output format:"
+msgstr "Формат виводу:"
+
+#: ../src/nm.c:87
+msgid "Print name of the input file before every symbol"
+msgstr "Виводити перед кожним символом назву вхідного файла"
+
+#: ../src/nm.c:90
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd', `sysv' or `posix'. The "
+"default is `sysv'"
+msgstr ""
+"Використовувати формат виводу ФОРМАТ. ФОРМАТом може бути «bsd», «sysv» або "
+"«posix». Типовим форматом є «sysv»"
+
+#: ../src/nm.c:92
+msgid "Same as --format=bsd"
+msgstr "Те саме, що і --format=bsd"
+
+#: ../src/nm.c:93
+msgid "Same as --format=posix"
+msgstr "Те саме, що і --format=posix"
+
+#: ../src/nm.c:94 ../src/size.c:72
+msgid "Use RADIX for printing symbol values"
+msgstr "Використовувати ОСНОВУ числення для виводу символьних значень"
+
+#: ../src/nm.c:95
+msgid "Mark weak symbols"
+msgstr "Позначати слабкі символи"
+
+#: ../src/nm.c:96
+msgid "Print size of defined symbols"
+msgstr "Вивести розмір визначених символів"
+
+#: ../src/nm.c:98 ../src/size.c:80 ../src/strip.c:78 ../src/unstrip.c:81
+msgid "Output options:"
+msgstr "Параметри виводу:"
+
+#: ../src/nm.c:99
+msgid "Sort symbols numerically by address"
+msgstr "Числове впорядкування символів за адресою"
+
+#: ../src/nm.c:101
+msgid "Do not sort the symbols"
+msgstr "Не впорядковувати символи"
+
+#: ../src/nm.c:102
+msgid "Reverse the sense of the sort"
+msgstr "Змінити порядок на протилежний"
+
+#. Short description of program.
+#: ../src/nm.c:108
+msgid "List symbols from FILEs (a.out by default)."
+msgstr "Показати список символів з ФАЙЛів (типово з a.out)."
+
+#: ../src/nm.c:136 ../src/objdump.c:105 ../src/size.c:117 ../src/strip.c:121
+#, c-format
+msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
+msgstr "%s: ВНУТРІШНЯ ПОМИЛКА %d (%s-%s): %s"
+
+#: ../src/nm.c:380 ../src/nm.c:392 ../src/size.c:317 ../src/size.c:326
+#: ../src/size.c:337 ../src/strip.c:1816
+#, c-format
+msgid "while closing '%s'"
+msgstr "під час закриття «%s»"
+
+#: ../src/nm.c:402 ../src/objdump.c:296 ../src/strip.c:359
+#, c-format
+msgid "%s: File format not recognized"
+msgstr "%s: не вдалося розпізнати формат файла"
+
+#. Note: 0 is no valid offset.
+#: ../src/nm.c:442
+msgid ""
+"\n"
+"Archive index:"
+msgstr ""
+"\n"
+"Покажчик архіву:"
+
+#: ../src/nm.c:451
+#, c-format
+msgid "invalid offset %zu for symbol %s"
+msgstr "некоректне зміщення %zu для символу %s"
+
+#: ../src/nm.c:456
+#, c-format
+msgid "%s in %s\n"
+msgstr "%s у %s\n"
+
+#: ../src/nm.c:464
+#, c-format
+msgid "cannot reset archive offset to beginning"
+msgstr "не вдалося відновити зміщення початку архіву"
+
+#: ../src/nm.c:488 ../src/objdump.c:344
+#, c-format
+msgid "%s%s%s: file format not recognized"
+msgstr "%s%s%s: не вдалося розпізнати формат файла"
+
+#: ../src/nm.c:700
+#, c-format
+msgid "cannot create search tree"
+msgstr "не вдалося створити дерево пошуку"
+
+#: ../src/nm.c:740 ../src/nm.c:1002 ../src/objdump.c:744 ../src/readelf.c:885
+#: ../src/readelf.c:1028 ../src/readelf.c:1169 ../src/readelf.c:1351
+#: ../src/readelf.c:1549 ../src/readelf.c:1735 ../src/readelf.c:1945
+#: ../src/readelf.c:2199 ../src/readelf.c:2265 ../src/readelf.c:2343
+#: ../src/readelf.c:2841 ../src/readelf.c:2877 ../src/readelf.c:2939
+#: ../src/readelf.c:6493 ../src/readelf.c:7387 ../src/readelf.c:7534
+#: ../src/readelf.c:7604 ../src/size.c:425 ../src/size.c:499
+#: ../src/strip.c:483
+#, c-format
+msgid "cannot get section header string table index"
+msgstr "не вдалося визначити індекс заголовка розділу у таблиці рядків"
+
+#: ../src/nm.c:766
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Символи з %s:\n"
+"\n"
+
+#: ../src/nm.c:768
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s[%s]:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Символи з %s[%s]:\n"
+"\n"
+
+#. The header line.
+#: ../src/nm.c:771
+#, c-format
+msgid ""
+"%*s%-*s %-*s Class Type %-*s %*s Section\n"
+"\n"
+msgstr ""
+"%*s%-*s %-*s Клас Тип %-*s %*s Розділ\n"
+"\n"
+
+#: ../src/nm.c:1012
+#, c-format
+msgid "%s: entry size in section `%s' is not what we expect"
+msgstr "%s: розмір запису у розділі «%s» не є очікуваним"
+
+#: ../src/nm.c:1016
+#, c-format
+msgid "%s: size of section `%s' is not multiple of entry size"
+msgstr "%s: розмір розділу «%s» не є кратним до розміру запису"
+
+#. XXX Add machine specific object file types.
+#: ../src/nm.c:1255
+#, c-format
+msgid "%s%s%s%s: Invalid operation"
+msgstr "%s%s%s%s: некоректна дія"
+
+#: ../src/nm.c:1312
+#, c-format
+msgid "%s%s%s: no symbols"
+msgstr "%s%s%s: немає символів"
+
+#: ../src/objdump.c:61
+msgid "Mode selection:"
+msgstr "Вибір режиму:"
+
+#: ../src/objdump.c:62
+msgid "Display relocation information."
+msgstr "Показати інформацію про переміщення."
+
+#: ../src/objdump.c:64
+msgid "Display the full contents of all sections requested"
+msgstr "Показати весь вміст всіх вказаних розділів"
+
+#: ../src/objdump.c:66
+msgid "Display assembler code of executable sections"
+msgstr "Показати код асемблера виконуваних розділів"
+
+#: ../src/objdump.c:68
+msgid "Output option selection:"
+msgstr "Вибір параметрів виводу:"
+
+#: ../src/objdump.c:70
+msgid "Only display information for section NAME."
+msgstr "Показати інформацію лише з розділу НАЗВА."
+
+#. Short description of program.
+#: ../src/objdump.c:76
+msgid "Show information from FILEs (a.out by default)."
+msgstr "Показати інформацію з ФАЙЛів (типово a.out)."
+
+#: ../src/objdump.c:236 ../src/readelf.c:430
+msgid "No operation specified.\n"
+msgstr "Не вказано дії.\n"
+
+#: ../src/objdump.c:274 ../src/objdump.c:286
+#, c-format
+msgid "while close `%s'"
+msgstr "під час закриття «%s»"
+
+#: ../src/objdump.c:379 ../src/readelf.c:1644 ../src/readelf.c:1818
+msgid "INVALID SYMBOL"
+msgstr "НЕКОРЕКТНИЙ СИМВОЛ"
+
+#: ../src/objdump.c:394 ../src/readelf.c:1675 ../src/readelf.c:1851
+msgid "INVALID SECTION"
+msgstr "НЕКОРЕКТНИЙ РОЗДІЛ"
+
+#: ../src/objdump.c:510
+#, c-format
+msgid ""
+"\n"
+"RELOCATION RECORDS FOR [%s]:\n"
+"%-*s TYPE VALUE\n"
+msgstr ""
+"\n"
+"ЗАПИСИ ПЕРЕМІЩЕННЯ ДЛЯ [%s]:\n"
+"%-*s ТИП ЗНАЧЕННЯ\n"
+
+#: ../src/objdump.c:513
+msgid "OFFSET"
+msgstr "ЗМІЩЕННЯ"
+
+#: ../src/objdump.c:576
+#, c-format
+msgid "Contents of section %s:\n"
+msgstr "Вміст розділу %s:\n"
+
+#: ../src/objdump.c:676
+#, c-format
+msgid "cannot disassemble"
+msgstr "не вдалося дизасемблювати"
+
+#. Short description of program.
+#: ../src/ranlib.c:74
+msgid "Generate an index to speed access to archives."
+msgstr "Створювати покажчик для пришвидшення доступу до архівів."
+
+#. Strings for arguments in help texts.
+#: ../src/ranlib.c:77
+msgid "ARCHIVE"
+msgstr "АРХІВ"
+
+#: ../src/ranlib.c:116
+#, c-format
+msgid "Archive name required"
+msgstr "Слід вказати назву архіву"
+
+#: ../src/ranlib.c:194
+#, c-format
+msgid "'%s' is no archive"
+msgstr "«%s» не є архівом"
+
+#: ../src/ranlib.c:229
+#, c-format
+msgid "error while freeing sub-ELF descriptor: %s"
+msgstr "помилка під час спроби вивільнення дескриптора під-ELF: %s"
+
+#: ../src/readelf.c:73
+msgid "ELF output selection:"
+msgstr "Вибір виводу ELF:"
+
+#: ../src/readelf.c:75
+msgid "All these plus -p .strtab -p .dynstr -p .comment"
+msgstr "Все це плюс -p .strtab -p .dynstr -p .comment"
+
+#: ../src/readelf.c:76
+msgid "Display the dynamic segment"
+msgstr "Показувати динамічний сегмент"
+
+#: ../src/readelf.c:77
+msgid "Display the ELF file header"
+msgstr "Показувати заголовок файла ELF"
+
+#: ../src/readelf.c:79
+msgid "Display histogram of bucket list lengths"
+msgstr "Показати гістограму довжин списку блоків"
+
+#: ../src/readelf.c:80
+msgid "Display the program headers"
+msgstr "Показувати заголовки програми"
+
+#: ../src/readelf.c:82
+msgid "Display relocations"
+msgstr "Показувати переміщення"
+
+#: ../src/readelf.c:83
+msgid "Display the sections' headers"
+msgstr "Показувати заголовки розділів"
+
+#: ../src/readelf.c:85
+msgid "Display the symbol table"
+msgstr "Показувати таблицю символів"
+
+#: ../src/readelf.c:86
+msgid "Display versioning information"
+msgstr "Показувати відомості щодо версії"
+
+#: ../src/readelf.c:87
+msgid "Display the ELF notes"
+msgstr "Показувати нотатки ELF"
+
+#: ../src/readelf.c:89
+msgid "Display architecture specific information, if any"
+msgstr "Показувати специфічні для архітектури дані, якщо такі буде виявлено"
+
+#: ../src/readelf.c:91
+msgid "Display sections for exception handling"
+msgstr "Показувати розділи для обробки виключень"
+
+#: ../src/readelf.c:93
+msgid "Additional output selection:"
+msgstr "Додатковий вибір виводу:"
+
+#: ../src/readelf.c:95
+msgid ""
+"Display DWARF section content. SECTION can be one of abbrev, aranges, "
+"frame, info, loc, line, ranges, pubnames, str, macinfo, or exception"
+msgstr ""
+"Показати вміст розділу DWARF. Значенням РОЗДІЛ може бути abbrev, aranges, "
+"frame, info, loc, line, ranges, pubnames, str, macinfo або exception"
+
+#: ../src/readelf.c:99
+msgid "Dump the uninterpreted contents of SECTION, by number or name"
+msgstr ""
+"Створити дамп даних РОЗДІЛ, які не вдалося інтерпретувати, за номером або "
+"назвами"
+
+#: ../src/readelf.c:101
+msgid "Print string contents of sections"
+msgstr "Виводити вміст рядків розділів"
+
+#: ../src/readelf.c:104
+msgid "Display the symbol index of an archive"
+msgstr "Показувати покажчик символів архіву"
+
+#: ../src/readelf.c:106
+msgid "Output control:"
+msgstr "Керування виводом:"
+
+#: ../src/readelf.c:108
+msgid "Do not find symbol names for addresses in DWARF data"
+msgstr "Не шукати назви символів для адресу у даних DWARF"
+
+#. Short description of program.
+#: ../src/readelf.c:114
+msgid "Print information from ELF file in human-readable form."
+msgstr "Виводити відомості з файла ELF у придатному для читання форматі."
+
+#: ../src/readelf.c:401
+#, c-format
+msgid "Unknown DWARF debug section `%s'.\n"
+msgstr "Невідомий діагностичний розділ DWARF «%s».\n"
+
+#: ../src/readelf.c:465
+#, c-format
+msgid "cannot generate Elf descriptor: %s"
+msgstr "не вдалося створити дескриптор Elf: %s"
+
+#: ../src/readelf.c:477
+#, c-format
+msgid "'%s' is not an archive, cannot print archive index"
+msgstr "«%s» не є архівом, виведення покажчика архіву неможливе"
+
+#: ../src/readelf.c:482
+#, c-format
+msgid "error while closing Elf descriptor: %s"
+msgstr "помилка під час спроби закриття дескриптора Elf: %s"
+
+#: ../src/readelf.c:574
+#, c-format
+msgid "cannot stat input file"
+msgstr "не вдалося отримати дані з вхідного файла за допомогою stat"
+
+#: ../src/readelf.c:576
+#, c-format
+msgid "input file is empty"
+msgstr "вхідний файл є порожнім"
+
+#: ../src/readelf.c:578
+#, c-format
+msgid "failed reading '%s': %s"
+msgstr "не вдалося прочитати «%s»: %s"
+
+#: ../src/readelf.c:614
+#, c-format
+msgid "cannot read ELF header: %s"
+msgstr "не вдалося прочитати заголовок ELF: %s"
+
+#: ../src/readelf.c:622
+#, c-format
+msgid "cannot create EBL handle"
+msgstr "не вдалося створити дескриптор EBL"
+
+#: ../src/readelf.c:635
+#, c-format
+msgid "cannot determine number of program headers: %s"
+msgstr "не вдалося визначити кількість заголовків програми: %s"
+
+#: ../src/readelf.c:721
+msgid "NONE (None)"
+msgstr "NONE (Немає)"
+
+#: ../src/readelf.c:722
+msgid "REL (Relocatable file)"
+msgstr "REL (Придатний до переміщення файл)"
+
+#: ../src/readelf.c:723
+msgid "EXEC (Executable file)"
+msgstr "EXEC (Виконуваний файл)"
+
+#: ../src/readelf.c:724
+msgid "DYN (Shared object file)"
+msgstr "DYN (Файл об’єктів спільного використання)"
+
+#: ../src/readelf.c:725
+msgid "CORE (Core file)"
+msgstr "CORE (Файл ядра)"
+
+#: ../src/readelf.c:730
+#, c-format
+msgid "OS Specific: (%x)\n"
+msgstr "ОС-специфічне: (%x)\n"
+
+#. && e_type <= ET_HIPROC always true
+#: ../src/readelf.c:732
+#, c-format
+msgid "Processor Specific: (%x)\n"
+msgstr "Специфічне для процесора: (%x)\n"
+
+#: ../src/readelf.c:742
+msgid ""
+"ELF Header:\n"
+" Magic: "
+msgstr ""
+"Заголовок ELF:\n"
+" Magic: "
+
+#: ../src/readelf.c:746
+#, c-format
+msgid ""
+"\n"
+" Class: %s\n"
+msgstr ""
+"\n"
+" Клас: %s\n"
+
+#: ../src/readelf.c:751
+#, c-format
+msgid " Data: %s\n"
+msgstr " Дані: %s\n"
+
+#: ../src/readelf.c:757
+#, c-format
+msgid " Ident Version: %hhd %s\n"
+msgstr " Версія Ident: %hhd %s\n"
+
+#: ../src/readelf.c:759 ../src/readelf.c:776
+msgid "(current)"
+msgstr "(поточний)"
+
+#: ../src/readelf.c:763
+#, c-format
+msgid " OS/ABI: %s\n"
+msgstr " ОС/ABI: %s\n"
+
+#: ../src/readelf.c:766
+#, c-format
+msgid " ABI Version: %hhd\n"
+msgstr " Версія ABI: %hhd\n"
+
+#: ../src/readelf.c:769
+msgid " Type: "
+msgstr " Тип: "
+
+#: ../src/readelf.c:772
+#, c-format
+msgid " Machine: %s\n"
+msgstr " Архітектура: %s\n"
+
+#: ../src/readelf.c:774
+#, c-format
+msgid " Version: %d %s\n"
+msgstr " Версія: %d %s\n"
+
+#: ../src/readelf.c:778
+#, c-format
+msgid " Entry point address: %#<PRIx64>\n"
+msgstr " Адреса вхідної точки: %#<PRIx64>\n"
+
+#: ../src/readelf.c:781
+#, c-format
+msgid " Start of program headers: %<PRId64> %s\n"
+msgstr " Початок заголовків програм: %<PRId64> %s\n"
+
+#: ../src/readelf.c:782 ../src/readelf.c:785
+msgid "(bytes into file)"
+msgstr "(байтів у файл)"
+
+#: ../src/readelf.c:784
+#, c-format
+msgid " Start of section headers: %<PRId64> %s\n"
+msgstr " Початок заголовків розділів: %<PRId64> %s\n"
+
+#: ../src/readelf.c:787
+#, c-format
+msgid " Flags: %s\n"
+msgstr " Прапорці: %s\n"
+
+#: ../src/readelf.c:790
+#, c-format
+msgid " Size of this header: %<PRId16> %s\n"
+msgstr " Розмір цього заголовка: %<PRId16> %s\n"
+
+#: ../src/readelf.c:791 ../src/readelf.c:794 ../src/readelf.c:811
+msgid "(bytes)"
+msgstr "(байтів)"
+
+#: ../src/readelf.c:793
+#, c-format
+msgid " Size of program header entries: %<PRId16> %s\n"
+msgstr " Розмір записів заголовка програми: %<PRId16> %s\n"
+
+#: ../src/readelf.c:796
+#, c-format
+msgid " Number of program headers entries: %<PRId16>"
+msgstr " Кількість записів заголовків програми: %<PRId16>"
+
+#: ../src/readelf.c:803
+#, c-format
+msgid " (%<PRIu32> in [0].sh_info)"
+msgstr " (%<PRIu32> у [0].sh_info)"
+
+#: ../src/readelf.c:806 ../src/readelf.c:823 ../src/readelf.c:837
+msgid " ([0] not available)"
+msgstr " ([0] недоступний)"
+
+#: ../src/readelf.c:810
+#, c-format
+msgid " Size of section header entries: %<PRId16> %s\n"
+msgstr " Розмір записів заголовків розділів: %<PRId16> %s\n"
+
+#: ../src/readelf.c:813
+#, c-format
+msgid " Number of section headers entries: %<PRId16>"
+msgstr " Кількість записів заголовків розділів: %<PRId16>"
+
+#: ../src/readelf.c:820
+#, c-format
+msgid " (%<PRIu32> in [0].sh_size)"
+msgstr " (%<PRIu32> у [0].sh_size)"
+
+#. We managed to get the zeroth section.
+#: ../src/readelf.c:833
+#, c-format
+msgid " (%<PRIu32> in [0].sh_link)"
+msgstr " (%<PRIu32> у [0].sh_link)"
+
+#: ../src/readelf.c:841
+#, c-format
+msgid ""
+" Section header string table index: XINDEX%s\n"
+"\n"
+msgstr ""
+" Індекс заголовка розділу у таблиці рядків: XINDEX%s\n"
+"\n"
+
+#: ../src/readelf.c:845
+#, c-format
+msgid ""
+" Section header string table index: %<PRId16>\n"
+"\n"
+msgstr ""
+" Індекс заголовка розділу у таблиці рядків: %<PRId16>\n"
+"\n"
+
+#: ../src/readelf.c:877
+#, c-format
+msgid ""
+"There are %d section headers, starting at offset %#<PRIx64>:\n"
+"\n"
+msgstr ""
+"Виявлено %d заголовків розділів, зміщення початку — %#<PRIx64>:\n"
+"\n"
+
+#: ../src/readelf.c:887
+msgid "Section Headers:"
+msgstr "Заголовки розділів:"
+
+#: ../src/readelf.c:890
+msgid ""
+"[Nr] Name Type Addr Off Size ES Flags Lk "
+"Inf Al"
+msgstr ""
+"[№ ] Назва Тип Адр Змі Розмір ES Прап Lk "
+"Інф Al"
+
+#: ../src/readelf.c:892
+msgid ""
+"[Nr] Name Type Addr Off Size ES "
+"Flags Lk Inf Al"
+msgstr ""
+"[№ ] Назва Тип Адр Змі Розмір ES "
+"Прап Lk Інф Al"
+
+#: ../src/readelf.c:899 ../src/readelf.c:1052
+#, c-format
+msgid "cannot get section: %s"
+msgstr "не вдалося отримати розділ: %s"
+
+#: ../src/readelf.c:906 ../src/readelf.c:1060 ../src/readelf.c:7554
+#: ../src/unstrip.c:353 ../src/unstrip.c:377 ../src/unstrip.c:427
+#: ../src/unstrip.c:536 ../src/unstrip.c:553 ../src/unstrip.c:591
+#: ../src/unstrip.c:789 ../src/unstrip.c:1057 ../src/unstrip.c:1244
+#: ../src/unstrip.c:1305 ../src/unstrip.c:1427 ../src/unstrip.c:1480
+#: ../src/unstrip.c:1588 ../src/unstrip.c:1778
+#, c-format
+msgid "cannot get section header: %s"
+msgstr "не вдалося отримати заголовок розділу: %s"
+
+#: ../src/readelf.c:964
+msgid "Program Headers:"
+msgstr "Заголовки програми:"
+
+#: ../src/readelf.c:966
+msgid " Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align"
+msgstr ""
+" Тип Зміщен ВіртАдр ФізАдр РозмФайл РозмПам Пра Вирів"
+
+#: ../src/readelf.c:969
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz "
+"MemSiz Flg Align"
+msgstr ""
+" Тип Зміщен ВіртАдр ФізАдр "
+"РозмФайлРозмПам Пра Вирів"
+
+#: ../src/readelf.c:1009
+#, c-format
+msgid "\t[Requesting program interpreter: %s]\n"
+msgstr "\t[Запит щодо інтерпретатора програми: %s]\n"
+
+#: ../src/readelf.c:1030
+msgid ""
+"\n"
+" Section to Segment mapping:\n"
+" Segment Sections..."
+msgstr ""
+"\n"
+" Відображення розділів на сегмент:\n"
+" Розділи сегмента..."
+
+#: ../src/readelf.c:1041 ../src/unstrip.c:1824 ../src/unstrip.c:1863
+#: ../src/unstrip.c:1870
+#, c-format
+msgid "cannot get program header: %s"
+msgstr "не вдалося отримати заголовок програми: %s"
+
+#: ../src/readelf.c:1175
+#, c-format
+msgid ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+"\n"
+"Група розділів COMDAT [%2zu] «%s» з підписом «%s» містить %zu запис:\n"
+msgstr[1] ""
+"\n"
+"Група розділів COMDAT [%2zu] «%s» з підписом «%s» містить %zu записи:\n"
+msgstr[2] ""
+"\n"
+"Група розділів COMDAT [%2zu] «%s» з підписом «%s» містить %zu записів:\n"
+
+#: ../src/readelf.c:1180
+#, c-format
+msgid ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+"\n"
+"Група розділів [%2zu] «%s» з підписом «%s» містить %zu запис:\n"
+msgstr[1] ""
+"\n"
+"Група розділів [%2zu] «%s» з підписом «%s» містить %zu записи:\n"
+msgstr[2] ""
+"\n"
+"Група розділів [%2zu] «%s» з підписом «%s» містить %zu записів:\n"
+
+#: ../src/readelf.c:1188
+msgid "<INVALID SYMBOL>"
+msgstr "<НЕКОРЕКТНИЙ СИМВОЛ>"
+
+#: ../src/readelf.c:1202
+msgid "<INVALID SECTION>"
+msgstr "<НЕКОРЕКТНИЙ РОЗДІЛ>"
+
+#: ../src/readelf.c:1353
+#, c-format
+msgid ""
+"\n"
+"Dynamic segment contains %lu entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Dynamic segment contains %lu entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+"\n"
+"Динамічний сегмент містить %lu запис:\n"
+" Адр: %#0*<PRIx64> Зміщення: %#08<PRIx64> Пос. на розділ: [%2u] '%s'\n"
+msgstr[1] ""
+"\n"
+"Динамічний сегмент містить %lu записи:\n"
+" Адр: %#0*<PRIx64> Зміщення: %#08<PRIx64> Пос. на розділ: [%2u] '%s'\n"
+msgstr[2] ""
+"\n"
+"Динамічний сегмент містить %lu записів:\n"
+" Адр: %#0*<PRIx64> Зміщення: %#08<PRIx64> Пос. на розділ: [%2u] '%s'\n"
+
+#: ../src/readelf.c:1365
+msgid " Type Value\n"
+msgstr " Тип Значення\n"
+
+#: ../src/readelf.c:1389
+#, c-format
+msgid "Shared library: [%s]\n"
+msgstr "Спільна бібліотека: [%s]\n"
+
+#: ../src/readelf.c:1394
+#, c-format
+msgid "Library soname: [%s]\n"
+msgstr "Назва so бібліотеки: [%s]\n"
+
+#: ../src/readelf.c:1399
+#, c-format
+msgid "Library rpath: [%s]\n"
+msgstr "Rpath бібліотеки: [%s]\n"
+
+#: ../src/readelf.c:1404
+#, c-format
+msgid "Library runpath: [%s]\n"
+msgstr "Runpath бібліотеки: [%s]\n"
+
+#: ../src/readelf.c:1424
+#, c-format
+msgid "%<PRId64> (bytes)\n"
+msgstr "%<PRId64> (байт)\n"
+
+#: ../src/readelf.c:1534 ../src/readelf.c:1720
+#, c-format
+msgid ""
+"\n"
+"Invalid symbol table at offset %#0<PRIx64>\n"
+msgstr ""
+"\n"
+"Некоректна таблиця символів за зміщенням %#0<PRIx64>\n"
+
+#: ../src/readelf.c:1552 ../src/readelf.c:1737
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entries:\n"
+msgstr[0] ""
+"\n"
+"Розділ переміщення [%2zu] «%s» для розділу [%2u] «%s» за зміщенням %#0<PRIx64> "
+"містить %d запис:\n"
+msgstr[1] ""
+"\n"
+"Розділ переміщення [%2zu] «%s» для розділу [%2u] «%s» за зміщенням %#0<PRIx64> "
+"містить %d записи:\n"
+msgstr[2] ""
+"\n"
+"Розділ переміщення [%2zu] «%s» для розділу [%2u] «%s» за зміщенням %#0<PRIx64> "
+"містить %d записів:\n"
+
+#. The .rel.dyn section does not refer to a specific section but
+#. instead of section index zero. Do not try to print a section
+#. name.
+#: ../src/readelf.c:1567
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+"\n"
+"Розділ переміщення [%2u] «%s» за зміщенням %#0<PRIx64> містить %d запис:\n"
+msgstr[1] ""
+"\n"
+"Розділ переміщення [%2u] «%s» за зміщенням %#0<PRIx64> містить %d записи:\n"
+msgstr[2] ""
+"\n"
+"Розділ переміщення [%2u] «%s» за зміщенням %#0<PRIx64> містить %d записів:\n"
+
+#: ../src/readelf.c:1577
+msgid " Offset Type Value Name\n"
+msgstr " Зміщення Тип Значення Назва\n"
+
+#: ../src/readelf.c:1579
+msgid " Offset Type Value Name\n"
+msgstr " Зміщення Тип Значення Назва\n"
+
+#: ../src/readelf.c:1632 ../src/readelf.c:1643 ../src/readelf.c:1656
+#: ../src/readelf.c:1674 ../src/readelf.c:1686 ../src/readelf.c:1805
+#: ../src/readelf.c:1817 ../src/readelf.c:1831 ../src/readelf.c:1850
+#: ../src/readelf.c:1863
+msgid "<INVALID RELOC>"
+msgstr "<НЕКОРЕКТНЕ ПЕРЕМІЩЕННЯ>"
+
+#: ../src/readelf.c:1749
+msgid " Offset Type Value Addend Name\n"
+msgstr " Зміщення Тип Значення Назва додатка\n"
+
+#: ../src/readelf.c:1751
+msgid " Offset Type Value Addend Name\n"
+msgstr " Зміщення Тип Значення Назва додатка\n"
+
+#: ../src/readelf.c:1952
+#, c-format
+msgid ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entry:\n"
+msgid_plural ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entries:\n"
+msgstr[0] ""
+"\n"
+"Таблиця символів [%2u] «%s» містить %u запис:\n"
+msgstr[1] ""
+"\n"
+"Таблиця символів [%2u] «%s» містить %u записи:\n"
+msgstr[2] ""
+"\n"
+"Таблиця символів [%2u] «%s» містить %u записів:\n"
+
+#: ../src/readelf.c:1958
+#, 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"
+msgstr[1] " %lu лок. символи Таблиця символів: [%2u] «%s»\n"
+msgstr[2] " %lu лок. символів Таблиця символів: [%2u] «%s»\n"
+
+#: ../src/readelf.c:1968
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr " №№ Знач. Роз. Тип Зв’яз Вид. Інд Назва\n"
+
+#: ../src/readelf.c:1970
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr " №№ Знач. Роз. Тип Зв’яз Вид. Інд Назва\n"
+
+#: ../src/readelf.c:1990
+#, 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:2078
+#, c-format
+msgid "bad dynamic symbol"
+msgstr "помилковий динамічний символ"
+
+#: ../src/readelf.c:2160
+msgid "none"
+msgstr "немає"
+
+#: ../src/readelf.c:2177
+msgid "| <unknown>"
+msgstr "| <невідомо>"
+
+#: ../src/readelf.c:2202
+#, c-format
+msgid ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+"\n"
+"Розділ потреби у версіях [%2u] «%s», що містить %d запис:\n"
+" Адр.: %#0*<PRIx64> Зміщ.: %#08<PRIx64> Посилання на розділ: [%2u] «%s»\n"
+msgstr[1] ""
+"\n"
+"Розділ потреби у версіях [%2u] «%s», що містить %d записи:\n"
+" Адр.: %#0*<PRIx64> Зміщ.: %#08<PRIx64> Посилання на розділ: [%2u] «%s»\n"
+msgstr[2] ""
+"\n"
+"Розділ потреби у версіях [%2u] «%s», що містить %d записів:\n"
+" Адр.: %#0*<PRIx64> Зміщ.: %#08<PRIx64> Посилання на розділ: [%2u] «%s»\n"
+
+#: ../src/readelf.c:2225
+#, c-format
+msgid " %#06x: Version: %hu File: %s Cnt: %hu\n"
+msgstr " %#06x: Версія: %hu Файл: %s Кть: %hu\n"
+
+#: ../src/readelf.c:2238
+#, c-format
+msgid " %#06x: Name: %s Flags: %s Version: %hu\n"
+msgstr " %#06x: Назва: %s Прап: %s Версія: %hu\n"
+
+#: ../src/readelf.c:2269
+#, c-format
+msgid ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+"\n"
+"Розділ визначення версії [%2u] «%s», що містить %d запис:\n"
+" Адр.: %#0*<PRIx64> Зміщ.: %#08<PRIx64> Посилання на розділ: [%2u] «%s»\n"
+msgstr[1] ""
+"\n"
+"Розділ визначення версії [%2u] «%s», що містить %d записи:\n"
+" Адр.: %#0*<PRIx64> Зміщ.: %#08<PRIx64> Посилання на розділ: [%2u] «%s»\n"
+msgstr[2] ""
+"\n"
+"Розділ визначення версії [%2u] «%s», що містить %d записів:\n"
+" Адр.: %#0*<PRIx64> Зміщ.: %#08<PRIx64> Посилання на розділ: [%2u] «%s»\n"
+
+#: ../src/readelf.c:2299
+#, 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:2314
+#, c-format
+msgid " %#06x: Parent %d: %s\n"
+msgstr " %#06x: батьківський %d: %s\n"
+
+#: ../src/readelf.c:2546
+#, c-format
+msgid ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgid_plural ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgstr[0] ""
+"\n"
+"Розділ символів версій [%2u] «%s», що містить %d запис:\n"
+" Адр.: %#0*<PRIx64> Зміщ.: %#08<PRIx64> Посилання на розділ: [%2u] «%s»"
+msgstr[1] ""
+"\n"
+"Розділ символів версій [%2u] «%s», що містить %d записи:\n"
+" Адр.: %#0*<PRIx64> Зміщ.: %#08<PRIx64> Посилання на розділ: [%2u] «%s»"
+msgstr[2] ""
+"\n"
+"Розділ символів версій [%2u] «%s», що містить %d записів:\n"
+" Адр.: %#0*<PRIx64> Зміщ.: %#08<PRIx64> Посилання на розділ: [%2u] «%s»"
+
+#: ../src/readelf.c:2576
+msgid " 0 *local* "
+msgstr " 0 *локальний* "
+
+#: ../src/readelf.c:2581
+msgid " 1 *global* "
+msgstr " 1 *загальний* "
+
+#: ../src/readelf.c:2612
+#, c-format
+msgid ""
+"\n"
+"Histogram 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"
+msgid_plural ""
+"\n"
+"Histogram for bucket list length in section [%2u] '%s' (total of %d "
+"buckets):\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+"\n"
+"Гістограма довжин списків блоків у розділі [%2u] «%s» (загальні дані за %d "
+"блоком):\n"
+" Адр.: %#0*<PRIx64> Зміщ.: %#08<PRIx64> Посилання на розділ: [%2u] «%s»\n"
+msgstr[1] ""
+"\n"
+"Гістограма довжин списків блоків у розділі [%2u] «%s» (загальні дані за %d "
+"блоками):\n"
+" Адр.: %#0*<PRIx64> Зміщ.: %#08<PRIx64> Посилання на розділ: [%2u] «%s»\n"
+msgstr[2] ""
+"\n"
+"Гістограма довжин списків блоків у розділі [%2u] «%s» (загальні дані за %d "
+"блоками):\n"
+" Адр.: %#0*<PRIx64> Зміщ.: %#08<PRIx64> Посилання на розділ: [%2u] «%s»\n"
+
+#: ../src/readelf.c:2636
+#, no-c-format
+msgid " Length Number % of total Coverage\n"
+msgstr " Довжина Номер % від загал. Покриття\n"
+
+#: ../src/readelf.c:2638
+#, c-format
+msgid " 0 %6<PRIu32> %5.1f%%\n"
+msgstr " 0 %6<PRIu32> %5.1f%%\n"
+
+#: ../src/readelf.c:2645
+#, c-format
+msgid "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
+msgstr "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
+
+#: ../src/readelf.c:2658
+#, c-format
+msgid ""
+" Average number of tests: successful lookup: %f\n"
+" unsuccessful lookup: %f\n"
+msgstr ""
+" Середня кількість тестів: успішний пошук: %f\n"
+" неуспішний пошук: %f\n"
+
+#: ../src/readelf.c:2676 ../src/readelf.c:2718 ../src/readelf.c:2759
+#, c-format
+msgid "cannot get data for section %d: %s"
+msgstr "не вдалося отримати дані для розділу %d: %s"
+
+#: ../src/readelf.c:2813
+#, c-format
+msgid ""
+" Symbol Bias: %u\n"
+" Bitmask Size: %zu bytes %<PRIuFAST32>%% bits set 2nd hash shift: %u\n"
+msgstr ""
+" Відхилення символу: %u\n"
+" Розмір бітової маски: %zu байтів %<PRIuFAST32>%% встановлених бітів зсув "
+"2-го хешу: %u\n"
+
+#: ../src/readelf.c:2887
+#, c-format
+msgid ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+"\n"
+"Розділ списку бібліотек [%2zu] «%s» за зміщенням %#0<PRIx64> містить %d "
+"запис:\n"
+msgstr[1] ""
+"\n"
+"Розділ списку бібліотек [%2zu] «%s» за зміщенням %#0<PRIx64> містить %d "
+"записи:\n"
+msgstr[2] ""
+"\n"
+"Розділ списку бібліотек [%2zu] «%s» за зміщенням %#0<PRIx64> містить %d "
+"записів:\n"
+
+#: ../src/readelf.c:2901
+msgid ""
+" Library Time Stamp Checksum Version "
+"Flags"
+msgstr ""
+" Бібліотека Часовий штамп Версія суми "
+"Прапорці"
+
+#: ../src/readelf.c:2951
+#, c-format
+msgid ""
+"\n"
+"Object attributes section [%2zu] '%s' of %<PRIu64> bytes at offset %"
+"#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"Розділ атрибутів об’єктів [%2zu] «%s» з %<PRIu64> байтів за зміщенням %"
+"#0<PRIx64>:\n"
+
+#: ../src/readelf.c:2967
+msgid " Owner Size\n"
+msgstr " Власник Розмір\n"
+
+#: ../src/readelf.c:2993
+#, c-format
+msgid " %-13s %4<PRIu32>\n"
+msgstr " %-13s %4<PRIu32>\n"
+
+#: ../src/readelf.c:3025
+#, c-format
+msgid " %-4u %12<PRIu32>\n"
+msgstr " %-4u %12<PRIu32>\n"
+
+#. Tag_File
+#: ../src/readelf.c:3030
+#, c-format
+msgid " File: %11<PRIu32>\n"
+msgstr " Файл: %11<PRIu32>\n"
+
+#: ../src/readelf.c:3065
+#, c-format
+msgid " %s: %<PRId64>, %s\n"
+msgstr " %s: %<PRId64>, %s\n"
+
+#: ../src/readelf.c:3068
+#, c-format
+msgid " %s: %<PRId64>\n"
+msgstr " %s: %<PRId64>\n"
+
+#: ../src/readelf.c:3071
+#, c-format
+msgid " %s: %s\n"
+msgstr " %s: %s\n"
+
+#: ../src/readelf.c:3078
+#, c-format
+msgid " %u: %<PRId64>\n"
+msgstr " %u: %<PRId64>\n"
+
+#: ../src/readelf.c:3081
+#, c-format
+msgid " %u: %s\n"
+msgstr " %u: %s\n"
+
+#: ../src/readelf.c:3117
+#, c-format
+msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr "%s+%#<PRIx64> <%s+%#<PRIx64>>"
+
+#: ../src/readelf.c:3120
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
+
+#: ../src/readelf.c:3125
+#, c-format
+msgid "%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr "%#<PRIx64> <%s+%#<PRIx64>>"
+
+#: ../src/readelf.c:3128
+#, c-format
+msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr "%#0*<PRIx64> <%s+%#<PRIx64>>"
+
+#: ../src/readelf.c:3134
+#, c-format
+msgid "%s+%#<PRIx64> <%s>"
+msgstr "%s+%#<PRIx64> <%s>"
+
+#: ../src/readelf.c:3137
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s>"
+msgstr "%s+%#0*<PRIx64> <%s>"
+
+#: ../src/readelf.c:3141
+#, c-format
+msgid "%#<PRIx64> <%s>"
+msgstr "%#<PRIx64> <%s>"
+
+#: ../src/readelf.c:3144
+#, c-format
+msgid "%#0*<PRIx64> <%s>"
+msgstr "%#0*<PRIx64> <%s>"
+
+#: ../src/readelf.c:3149
+#, c-format
+msgid "%s+%#<PRIx64>"
+msgstr "%s+%#<PRIx64>"
+
+#: ../src/readelf.c:3152
+#, c-format
+msgid "%s+%#0*<PRIx64>"
+msgstr "%s+%#0*<PRIx64>"
+
+#: ../src/readelf.c:3260
+#, c-format
+msgid "unknown tag %hx"
+msgstr "невідомий теґ %hx"
+
+#: ../src/readelf.c:3262
+#, c-format
+msgid "unknown user tag %hx"
+msgstr "невідомий теґ користувача %hx"
+
+#: ../src/readelf.c:3480
+#, c-format
+msgid "unknown attribute %hx"
+msgstr "невідомий атрибут %hx"
+
+#: ../src/readelf.c:3483
+#, c-format
+msgid "unknown user attribute %hx"
+msgstr "невідомий атрибут користувача %hx"
+
+#: ../src/readelf.c:3529
+#, c-format
+msgid "unknown form %<PRIx64>"
+msgstr "невідома форма %<PRIx64>"
+
+#: ../src/readelf.c:3763
+msgid "empty block"
+msgstr "порожній блок"
+
+#: ../src/readelf.c:3766
+#, c-format
+msgid "%zu byte block:"
+msgstr "%zu-байтовий блок:"
+
+#: ../src/readelf.c:4175
+#, c-format
+msgid "%*s[%4<PRIuMAX>] %s <TRUNCATED>\n"
+msgstr "%*s[%4<PRIuMAX>] %s <ОБРІЗАНО>\n"
+
+#: ../src/readelf.c:4188
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [ Code]\n"
+msgstr ""
+"\n"
+"Розділ DWARF [%2zu] «%s» зі зміщенням %#<PRIx64>:\n"
+" [ Код]\n"
+
+#: ../src/readelf.c:4195
+#, c-format
+msgid ""
+"\n"
+"Abbreviation section at offset %<PRIu64>:\n"
+msgstr ""
+"\n"
+"Розділ скорочень за зміщенням %<PRIu64>:\n"
+
+#: ../src/readelf.c:4208
+#, c-format
+msgid " *** error while reading abbreviation: %s\n"
+msgstr " *** помилка під час читання скорочення: %s\n"
+
+#: ../src/readelf.c:4224
+#, c-format
+msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
+msgstr " [%5u] зміщення: %<PRId64>, дочірній: %s, мітка: %s\n"
+
+#: ../src/readelf.c:4227
+msgid "yes"
+msgstr "так"
+
+#: ../src/readelf.c:4227
+msgid "no"
+msgstr "ні"
+
+#: ../src/readelf.c:4263
+#, c-format
+msgid "cannot get .debug_aranges content: %s"
+msgstr "не вдалося отримати дані get .debug_aranges: %s"
+
+#: ../src/readelf.c:4268
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entries:\n"
+msgstr[0] ""
+"\n"
+"Розділ DWARF [%2zu] «%s» за зміщенням %#<PRIx64> містить %zu запис:\n"
+msgstr[1] ""
+"\n"
+"Розділ DWARF [%2zu] «%s» за зміщенням %#<PRIx64> містить %zu записи:\n"
+msgstr[2] ""
+"\n"
+"Розділ DWARF [%2zu] «%s» за зміщенням %#<PRIx64> містить %zu записів:\n"
+
+#: ../src/readelf.c:4298
+#, c-format
+msgid " [%*zu] ???\n"
+msgstr " [%*zu] ???\n"
+
+#: ../src/readelf.c:4300
+#, 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:4319
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr "не вдалося отримати дані .debug_ranges: %s"
+
+#: ../src/readelf.c:4324 ../src/readelf.c:4810 ../src/readelf.c:5452
+#: ../src/readelf.c:5897 ../src/readelf.c:5992 ../src/readelf.c:6164
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+"\n"
+"Розділ DWARF [%2zu] «%s» зі зміщенням %#<PRIx64>:\n"
+
+#: ../src/readelf.c:4338 ../src/readelf.c:5911
+#, c-format
+msgid " [%6tx] <INVALID DATA>\n"
+msgstr " [%6tx] <НЕКОРЕКТНІ ДАНІ>\n"
+
+#: ../src/readelf.c:4360 ../src/readelf.c:5933
+#, c-format
+msgid " [%6tx] base address %s\n"
+msgstr " [%6tx] базова адреса %s\n"
+
+#. We have an address range entry.
+#. First address range entry in a list.
+#: ../src/readelf.c:4371
+#, c-format
+msgid " [%6tx] %s..%s\n"
+msgstr " [%6tx] %s..%s\n"
+
+#: ../src/readelf.c:4373
+#, c-format
+msgid " %s..%s\n"
+msgstr " %s..%s\n"
+
+#: ../src/readelf.c:4799 ../src/readelf.c:6230 ../src/readelf.c:6332
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr "не вдалося отримати дані %s: %s"
+
+#: ../src/readelf.c:4806
+#, c-format
+msgid ""
+"\n"
+"Call frame information section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+"\n"
+"Розділ відомостей щодо вікна викликів [%2zu] «%s» за зміщенням %#<PRIx64>:\n"
+
+#: ../src/readelf.c:4833 ../src/readelf.c:5486
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr "некоректні дані у розділі [%zu] «%s»"
+
+#: ../src/readelf.c:4855
+#, c-format
+msgid ""
+"\n"
+" [%6tx] Zero terminator\n"
+msgstr ""
+"\n"
+" [%6tx] нульовий переривач\n"
+
+#: ../src/readelf.c:4924
+#, c-format
+msgid "invalid augmentation length"
+msgstr "некоректна довжина збільшення"
+
+#: ../src/readelf.c:4936
+msgid "FDE address encoding: "
+msgstr "Кодування адреси FDE: "
+
+#: ../src/readelf.c:4942
+msgid "LSDA pointer encoding: "
+msgstr "Кодування вказівника LSDA: "
+
+#: ../src/readelf.c:5034
+#, c-format
+msgid " (offset: %#<PRIx64>)"
+msgstr " (зміщення: %#<PRIx64>)"
+
+#: ../src/readelf.c:5041
+#, c-format
+msgid " (end offset: %#<PRIx64>)"
+msgstr " (зміщення від кінця: %#<PRIx64>)"
+
+#: ../src/readelf.c:5068
+#, c-format
+msgid " %-26sLSDA pointer: %#<PRIx64>\n"
+msgstr " %-26sвказівник LSDA: %#<PRIx64>\n"
+
+#: ../src/readelf.c:5114
+#, c-format
+msgid "cannot get attribute code: %s"
+msgstr "не вдалося отримати код атрибута: %s"
+
+#: ../src/readelf.c:5122
+#, c-format
+msgid "cannot get attribute form: %s"
+msgstr "не вдалося отримати форму атрибута: %s"
+
+#: ../src/readelf.c:5135
+#, c-format
+msgid "cannot get attribute value: %s"
+msgstr "не вдалося отримати значення атрибута: %s"
+
+#: ../src/readelf.c:5331
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [Offset]\n"
+msgstr ""
+"\n"
+"Розділ DWARF [%2zu] «%s» за зміщенням %#<PRIx64>:\n"
+" [Зміщення]\n"
+
+#: ../src/readelf.c:5356
+#, c-format
+msgid ""
+" Compilation unit at offset %<PRIu64>:\n"
+" Version: %<PRIu16>, Abbreviation section offset: %<PRIu64>, Address size: %"
+"<PRIu8>, Offset size: %<PRIu8>\n"
+msgstr ""
+" Модуль компіляції за зміщенням %<PRIu64>:\n"
+" Версія: %<PRIu16>, Зміщення розділу скорочень: %<PRIu64>, Адреса: %<PRIu8>, "
+"Зміщення: %<PRIu8>\n"
+
+#: ../src/readelf.c:5374
+#, c-format
+msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
+msgstr "не вдалося отримати DIE за зміщенням %<PRIu64> у розділі «%s»: %s"
+
+#: ../src/readelf.c:5385
+#, c-format
+msgid "cannot get DIE offset: %s"
+msgstr "не вдалося отримати зміщення DIE: %s"
+
+#: ../src/readelf.c:5393
+#, c-format
+msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
+msgstr "не вдалося отримати мітку DIE за зміщенням %<PRIu64> у розділі «%s»: %s"
+
+#: ../src/readelf.c:5422
+#, c-format
+msgid "cannot get next DIE: %s\n"
+msgstr "не вдалося визначити наступний DIE: %s\n"
+
+#: ../src/readelf.c:5429
+#, c-format
+msgid "cannot get next DIE: %s"
+msgstr "не вдалося визначити наступний DIE: %s"
+
+#: ../src/readelf.c:5464
+#, c-format
+msgid "cannot get line data section data: %s"
+msgstr "не вдалося отримати дані розділу лінійних даних: %s"
+
+#: ../src/readelf.c:5477
+#, c-format
+msgid ""
+"\n"
+"Table at offset %Zu:\n"
+msgstr ""
+"\n"
+"Таблиця за зміщенням %Zu:\n"
+
+#. Print what we got so far.
+#: ../src/readelf.c:5529
+#, c-format
+msgid ""
+"\n"
+" Length: %<PRIu64>\n"
+" DWARF version: %<PRIuFAST16>\n"
+" Prologue length: %<PRIu64>\n"
+" Minimum instruction length: %<PRIuFAST8>\n"
+" Initial value if '%s': %<PRIuFAST8>\n"
+" Line base: %<PRIdFAST8>\n"
+" Line range: %<PRIuFAST8>\n"
+" Opcode base: %<PRIuFAST8>\n"
+"\n"
+"Opcodes:\n"
+msgstr ""
+"\n"
+" Довжина: %<PRIu64>\n"
+" Версія DWARF: %<PRIuFAST16>\n"
+" Довжина вступу: %<PRIu64>\n"
+" Мінімальна довж. інстр.: %<PRIuFAST8>\n"
+" Поч. знач., якщо «%s»: %<PRIuFAST8>\n"
+" Основа рядків: %<PRIdFAST8>\n"
+" Діапазон рядків: %<PRIuFAST8>\n"
+" Основа кодів операцій: %<PRIuFAST8>\n"
+"\n"
+"Коди операцій:\n"
+
+#: ../src/readelf.c:5548
+#, c-format
+msgid "invalid data at offset %tu in section [%zu] '%s'"
+msgstr "некоректні дані зі зміщенням %tu у розділі [%zu] «%s»"
+
+#: ../src/readelf.c:5563
+#, c-format
+msgid " [%*<PRIuFAST8>] %hhu argument\n"
+msgid_plural " [%*<PRIuFAST8>] %hhu arguments\n"
+msgstr[0] " [%*<PRIuFAST8>] %hhu аргумент\n"
+msgstr[1] " [%*<PRIuFAST8>] %hhu аргументи\n"
+msgstr[2] " [%*<PRIuFAST8>] %hhu аргументів\n"
+
+#: ../src/readelf.c:5571
+msgid ""
+"\n"
+"Directory table:"
+msgstr ""
+"\n"
+"Таблиця каталогу:"
+
+#: ../src/readelf.c:5587
+msgid ""
+"\n"
+"File name table:\n"
+" Entry Dir Time Size Name"
+msgstr ""
+"\n"
+"Таблиця назв файлів:\n"
+" Запис Кат Час Розмір Назва"
+
+#: ../src/readelf.c:5616
+msgid ""
+"\n"
+"Line number statements:"
+msgstr ""
+"\n"
+"Оператори номерів рядків:"
+
+#: ../src/readelf.c:5677
+#, c-format
+msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
+msgstr " спеціальний код операції %u: адреса+%u = %s, рядок%+d = %zu\n"
+
+#: ../src/readelf.c:5697
+#, c-format
+msgid " extended opcode %u: "
+msgstr " розширений код операції %u: "
+
+#: ../src/readelf.c:5702
+msgid "end of sequence"
+msgstr "кінець послідовності"
+
+#: ../src/readelf.c:5717
+#, c-format
+msgid "set address to %s\n"
+msgstr "встановити адресу у значення %s\n"
+
+#: ../src/readelf.c:5738
+#, c-format
+msgid "define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
+msgstr ""
+"визначення нового файла: dir=%u, mtime=%<PRIu64>, довжина=%<PRIu64>, назва=%"
+"s\n"
+
+#. Unknown, ignore it.
+#: ../src/readelf.c:5747
+msgid "unknown opcode"
+msgstr "невідомий код операції"
+
+#. Takes no argument.
+#: ../src/readelf.c:5759
+msgid " copy"
+msgstr " копія"
+
+#: ../src/readelf.c:5769
+#, c-format
+msgid "advance address by %u to %s\n"
+msgstr "збільшення адреси на %u до %s\n"
+
+#: ../src/readelf.c:5780
+#, c-format
+msgid " advance line by constant %d to %<PRId64>\n"
+msgstr " просувати рядок на сталу %d до %<PRId64>\n"
+
+#: ../src/readelf.c:5788
+#, c-format
+msgid " set file to %<PRIu64>\n"
+msgstr " встановити файл у %<PRIu64>\n"
+
+#: ../src/readelf.c:5798
+#, c-format
+msgid " set column to %<PRIu64>\n"
+msgstr " встановити значення стовпчика %<PRIu64>\n"
+
+#: ../src/readelf.c:5805
+#, c-format
+msgid " set '%s' to %<PRIuFAST8>\n"
+msgstr " встановити «%s» у %<PRIuFAST8>\n"
+
+#. Takes no argument.
+#: ../src/readelf.c:5811
+msgid " set basic block flag"
+msgstr " встановити прапорець базового блоку"
+
+#: ../src/readelf.c:5821
+#, c-format
+msgid "advance address by constant %u to %s\n"
+msgstr "збільшити адресу на сталу величину %u до %s\n"
+
+#: ../src/readelf.c:5837
+#, c-format
+msgid "advance address by fixed value %u to %s\n"
+msgstr "збільшити адресу на фіксовану величину %u до %s\n"
+
+#. Takes no argument.
+#: ../src/readelf.c:5846
+msgid " set prologue end flag"
+msgstr " встановити прапорець кінця вступу"
+
+#. Takes no argument.
+#: ../src/readelf.c:5851
+msgid " set epilogue begin flag"
+msgstr " встановити прапорець початку епілогу"
+
+#. This is a new opcode the generator but not we know about.
+#. Read the parameters associated with it but then discard
+#. everything. Read all the parameters for this opcode.
+#: ../src/readelf.c:5860
+#, c-format
+msgid " unknown opcode with %<PRIu8> parameter:"
+msgid_plural " unknown opcode with %<PRIu8> parameters:"
+msgstr[0] " невідомий код операції з %<PRIu8> параметром:"
+msgstr[1] " невідомий код операції з %<PRIu8> параметрами:"
+msgstr[2] " невідомий код операції з %<PRIu8> параметрами:"
+
+#: ../src/readelf.c:5892
+#, c-format
+msgid "cannot get .debug_loc content: %s"
+msgstr "не вдалося отримати вміст .debug_loc: %s"
+
+#. First entry in a list.
+#: ../src/readelf.c:5947
+#, c-format
+msgid " [%6tx] %s..%s"
+msgstr " [%6tx] %s..%s"
+
+#: ../src/readelf.c:5949
+#, c-format
+msgid " %s..%s"
+msgstr " %s..%s"
+
+#: ../src/readelf.c:6002
+#, c-format
+msgid "cannot get macro information section data: %s"
+msgstr "не вдалося отримати дані розділу відомостей щодо макросів: %s"
+
+#: ../src/readelf.c:6081
+#, c-format
+msgid "%*s*** non-terminated string at end of section"
+msgstr "%*s*** незавершений рядок наприкінці розділу"
+
+#: ../src/readelf.c:6149
+#, 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:6188
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" %*s String\n"
+msgstr ""
+"\n"
+"Розділ DWARF [%2zu] «%s» зі зміщенням %#<PRIx64>:\n"
+" %*s Рядок\n"
+
+#: ../src/readelf.c:6202
+#, c-format
+msgid " *** error while reading strings: %s\n"
+msgstr " *** помилка під час читання рядків: %s\n"
+
+#: ../src/readelf.c:6222
+#, c-format
+msgid ""
+"\n"
+"Call frame search table section [%2zu] '.eh_frame_hdr':\n"
+msgstr ""
+"\n"
+"Розділ таблиці пошуку вікон виклику [%2zu] '.eh_frame_hdr':\n"
+
+#: ../src/readelf.c:6324
+#, c-format
+msgid ""
+"\n"
+"Exception handling table section [%2zu] '.gcc_except_table':\n"
+msgstr ""
+"\n"
+"Розділ таблиці обробки виключень [%2zu] '.gcc_except_table':\n"
+
+#: ../src/readelf.c:6347
+#, c-format
+msgid " LPStart encoding: %#x "
+msgstr " Кодування LPStart: %#x "
+
+#: ../src/readelf.c:6359
+#, c-format
+msgid " TType encoding: %#x "
+msgstr " Кодування TType: %#x "
+
+#: ../src/readelf.c:6373
+#, c-format
+msgid " Call site encoding: %#x "
+msgstr " Кодування місця виклику:%#x "
+
+#: ../src/readelf.c:6386
+msgid ""
+"\n"
+" Call site table:"
+msgstr ""
+"\n"
+" Таблиця місця виклику:"
+
+#: ../src/readelf.c:6400
+#, c-format
+msgid ""
+" [%4u] Call site start: %#<PRIx64>\n"
+" Call site length: %<PRIu64>\n"
+" Landing pad: %#<PRIx64>\n"
+" Action: %u\n"
+msgstr ""
+" [%4u] Поч. місця виклику: %#<PRIx64>\n"
+" Довж. місця виклику: %<PRIu64>\n"
+" Місце застосування: %#<PRIx64>\n"
+" Дія: %u\n"
+
+#: ../src/readelf.c:6460
+#, c-format
+msgid "invalid TType encoding"
+msgstr "некоректне кодування TType"
+
+#: ../src/readelf.c:6484
+#, c-format
+msgid "cannot get debug context descriptor: %s"
+msgstr "не вдалося отримати дескриптор контексту зневаджування: %s"
+
+#: ../src/readelf.c:6620 ../src/readelf.c:7221
+#, c-format
+msgid "cannot convert core note data: %s"
+msgstr "не вдалося перетворити дані запису ядра: %s"
+
+#: ../src/readelf.c:6961
+#, c-format
+msgid ""
+"\n"
+"%*s... <repeats %u more times> ..."
+msgstr ""
+"\n"
+"%*s... <повторюється %u разів> ..."
+
+#: ../src/readelf.c:7320
+msgid " Owner Data size Type\n"
+msgstr " Власник Розм. даних Тип\n"
+
+#: ../src/readelf.c:7338
+#, c-format
+msgid " %-13.*s %9<PRId32> %s\n"
+msgstr " %-13.*s %9<PRId32> %s\n"
+
+#: ../src/readelf.c:7372
+#, c-format
+msgid "cannot get content of note section: %s"
+msgstr "не вдалося отримати вміст розділу записів: %s"
+
+#: ../src/readelf.c:7399
+#, c-format
+msgid ""
+"\n"
+"Note section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"Розділ записів (note) [%2zu] «%s» з %<PRIu64> байтів за зміщенням %"
+"#0<PRIx64>:\n"
+
+#: ../src/readelf.c:7422
+#, c-format
+msgid ""
+"\n"
+"Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"Сегмент записів з %<PRIu64> байтів за зміщенням %#0<PRIx64>:\n"
+
+#: ../src/readelf.c:7468
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no data to dump.\n"
+msgstr ""
+"\n"
+"У розділі [%Zu] «%s» не міститься даних для створення дампу.\n"
+
+#: ../src/readelf.c:7474 ../src/readelf.c:7497
+#, c-format
+msgid "cannot get data for section [%Zu] '%s': %s"
+msgstr "не вдалося отримати дані для розділу [%Zu] «%s»: %s"
+
+#: ../src/readelf.c:7478
+#, c-format
+msgid ""
+"\n"
+"Hex dump of section [%Zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"Шіст. дамп розділу [%Zu] «%s», %<PRIu64> байтів за зміщенням %#0<PRIx64>:\n"
+
+#: ../src/readelf.c:7491
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no strings to dump.\n"
+msgstr ""
+"\n"
+"У розділі [%Zu] «%s» не міститься рядків для створення дампу.\n"
+
+#: ../src/readelf.c:7501
+#, c-format
+msgid ""
+"\n"
+"String section [%Zu] '%s' contains %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+"\n"
+"Розділ рядків [%Zu] «%s» містить %<PRIu64> байтів за зміщенням %#0<PRIx64>:\n"
+
+#: ../src/readelf.c:7549
+#, c-format
+msgid ""
+"\n"
+"section [%lu] does not exist"
+msgstr ""
+"\n"
+"розділу [%lu] не існує"
+
+#: ../src/readelf.c:7576
+#, c-format
+msgid ""
+"\n"
+"section '%s' does not exist"
+msgstr ""
+"\n"
+"розділу «%s» не існує"
+
+#: ../src/readelf.c:7637
+#, c-format
+msgid "cannot get symbol index of archive '%s': %s"
+msgstr "не вдалося отримати покажчик символів архіву «%s»: %s"
+
+#: ../src/readelf.c:7640
+#, c-format
+msgid ""
+"\n"
+"Archive '%s' has no symbol index\n"
+msgstr ""
+"\n"
+"У архіві «%s» немає покажчика символів\n"
+
+#: ../src/readelf.c:7644
+#, c-format
+msgid ""
+"\n"
+"Index of archive '%s' has %Zu entries:\n"
+msgstr ""
+"\n"
+"Покажчик архіву «%s» містить %Zu записів:\n"
+
+#: ../src/readelf.c:7662
+#, c-format
+msgid "cannot extract member at offset %Zu in '%s': %s"
+msgstr "не вдалося видобути елемент за зміщенням %Zu у «%s»: %s"
+
+#: ../src/readelf.c:7667
+#, c-format
+msgid "Archive member '%s' contains:\n"
+msgstr "Елемент архіву «%s» містить:\n"
+
+#: ../src/size.c:68
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd' or `sysv'. The default "
+"is `bsd'"
+msgstr ""
+"Використовувати формат виводу ФОРМАТ. ФОРМАТом може бути «bsd» або «sysv». "
+"Типовим є значення «bsd»"
+
+#: ../src/size.c:70
+msgid "Same as `--format=sysv'"
+msgstr "Те саме, що і «--format=sysv»"
+
+#: ../src/size.c:71
+msgid "Same as `--format=bsd'"
+msgstr "Те саме, що і «--format=bsd»"
+
+#: ../src/size.c:74
+msgid "Same as `--radix=10'"
+msgstr "Те саме, що і «--radix=10»"
+
+#: ../src/size.c:75
+msgid "Same as `--radix=8'"
+msgstr "Те саме, що і «--radix=8»"
+
+#: ../src/size.c:76
+msgid "Same as `--radix=16'"
+msgstr "Те саме, що і «--radix=16»"
+
+#: ../src/size.c:78
+msgid "Similar to `--format=sysv' output but in one line"
+msgstr "Вивід даних у форматі, подібному до «--format=sysv», але у один рядок"
+
+#: ../src/size.c:82
+msgid "Print size and permission flags for loadable segments"
+msgstr ""
+"Вивести розмір і прапорці прав доступу для придатних до завантаження "
+"сегментів"
+
+#: ../src/size.c:83
+msgid "Display the total sizes (bsd only)"
+msgstr "Показувати загальні розміри (лише bsd)"
+
+#. Short description of program.
+#: ../src/size.c:88
+msgid "List section sizes of FILEs (a.out by default)."
+msgstr "Показати розміри розділів ФАЙЛів (типово a.out)."
+
+#: ../src/size.c:269
+#, c-format
+msgid "Invalid format: %s"
+msgstr "Некоректний формат: %s"
+
+#: ../src/size.c:280
+#, c-format
+msgid "Invalid radix: %s"
+msgstr "Некоректна основа числення: %s"
+
+#: ../src/size.c:339
+#, c-format
+msgid "%s: file format not recognized"
+msgstr "%s: не вдалося розпізнати формат файла"
+
+#: ../src/size.c:446 ../src/size.c:589
+#, c-format
+msgid " (ex %s)"
+msgstr " (прикл. %s)"
+
+#: ../src/size.c:614
+msgid "(TOTALS)\n"
+msgstr "(ЗАГАЛОМ)\n"
+
+#: ../src/strings.c:70
+msgid "Output Selection:"
+msgstr "Вибір виводу:"
+
+#: ../src/strings.c:71
+msgid "Scan entire file, not only loaded sections"
+msgstr "Шукати у всьому файлі, а не лише у завантажених розділах"
+
+#: ../src/strings.c:73
+msgid "Only NUL-terminated sequences of MIN-LEN characters or more are printed"
+msgstr ""
+"Буде виведено лише послідовності з не менше, ніж MIN-LEN символів, що "
+"завершуються на NUL"
+
+#: ../src/strings.c:74
+msgid ""
+"Select character size and endianess: s = 7-bit, S = 8-bit, {b,l} = 16-bit, "
+"{B,L} = 32-bit"
+msgstr ""
+"Визначення розмірності та порядку бітів символів: s = 7-бітові, S = 8-"
+"бітові, {b,l} = 16-бітові, {B,L} = 32-бітові"
+
+#: ../src/strings.c:78
+msgid "Print name of the file before each string."
+msgstr "Виводити назву файла перед кожним рядком."
+
+#: ../src/strings.c:80
+msgid "Print location of the string in base 8, 10, or 16 respectively."
+msgstr "Виводити адресу рядка за основами 8, 10 та 16, відповідно."
+
+#: ../src/strings.c:81
+msgid "Alias for --radix=o"
+msgstr "Замінник --radix=o"
+
+#. Short description of program.
+#: ../src/strings.c:88
+msgid "Print the strings of printable characters in files."
+msgstr "Вивести рядки файлів з символів, придатних для друку."
+
+#: ../src/strings.c:268 ../src/strings.c:303
+#, c-format
+msgid "invalid value '%s' for %s parameter"
+msgstr "некоректне значення «%s» параметра %s"
+
+#: ../src/strings.c:314
+#, c-format
+msgid "invalid minimum length of matched string size"
+msgstr "некоректна мінімальна довжина розмірності рядка для порівняння"
+
+#: ../src/strings.c:601
+#, c-format
+msgid "lseek64 failed"
+msgstr "помилка lseek64"
+
+#: ../src/strings.c:616 ../src/strings.c:680
+#, c-format
+msgid "re-mmap failed"
+msgstr "помилка повторного використання mmap"
+
+#: ../src/strings.c:653
+#, c-format
+msgid "mprotect failed"
+msgstr "помилка mprotect"
+
+#: ../src/strip.c:74
+msgid "Place stripped output into FILE"
+msgstr "Вивести дані після вилучення до ФАЙЛа"
+
+#: ../src/strip.c:75
+msgid "Extract the removed sections into FILE"
+msgstr "Видобути вилучені розділи до ФАЙЛа"
+
+#: ../src/strip.c:76
+msgid "Embed name FILE instead of -f argument"
+msgstr "Вбудувати назву ФАЙЛа замість аргументу -f"
+
+#: ../src/strip.c:80
+msgid "Remove all debugging symbols"
+msgstr "Вилучити всі символи зневаджування"
+
+#: ../src/strip.c:84
+msgid "Copy modified/access timestamps to the output"
+msgstr "Скопіювати часові позначки зміни/доступу до виведених даних"
+
+#: ../src/strip.c:86
+msgid "Remove .comment section"
+msgstr "Вилучити розділ .comment"
+
+#: ../src/strip.c:89
+msgid "Relax a few rules to handle slightly broken ELF files"
+msgstr "Знехтувати декількома правилами для обробки трохи пошкоджених файлів ELF"
+
+#. Short description of program.
+#: ../src/strip.c:94
+msgid "Discard symbols from object files."
+msgstr "Відкинути символи з об’єктних файлів"
+
+#: ../src/strip.c:186
+#, c-format
+msgid "Only one input file allowed together with '-o' and '-f'"
+msgstr "Разом з «-o» або «-f» можна використовувати лише один файл вхідних даних"
+
+#: ../src/strip.c:222
+#, c-format
+msgid "-f option specified twice"
+msgstr "параметр -f вказано двічі"
+
+#: ../src/strip.c:231
+#, c-format
+msgid "-F option specified twice"
+msgstr "параметр -F вказано двічі"
+
+#: ../src/strip.c:240 ../src/unstrip.c:125
+#, c-format
+msgid "-o option specified twice"
+msgstr "параметр -o вказано двічі"
+
+#: ../src/strip.c:260
+#, c-format
+msgid "-R option supports only .comment section"
+msgstr "Для параметра -R передбачено підтримку лише розділу .comment"
+
+#: ../src/strip.c:298 ../src/strip.c:322
+#, c-format
+msgid "cannot stat input file '%s'"
+msgstr "не вдалося отримати дані з вхідного файла «%s» за допомогою stat"
+
+#: ../src/strip.c:312
+#, c-format
+msgid "while opening '%s'"
+msgstr "під час спроби відкриття «%s»"
+
+#: ../src/strip.c:350
+#, c-format
+msgid "%s: cannot use -o or -f when stripping archive"
+msgstr ""
+"%s: не можна використовувати -o або -f під час вилучення додаткового вмісту "
+"архіву"
+
+#: ../src/strip.c:448
+#, c-format
+msgid "cannot open EBL backend"
+msgstr "не вдалося відкрити канал сервера EBL"
+
+#: ../src/strip.c:498 ../src/strip.c:522
+#, c-format
+msgid "cannot create new file '%s': %s"
+msgstr "не вдалося створити файл «%s»: %s"
+
+#: ../src/strip.c:582
+#, c-format
+msgid "illformed file '%s'"
+msgstr "помилкове форматування файла «%s»"
+
+#: ../src/strip.c:869 ../src/strip.c:956
+#, c-format
+msgid "while generating output file: %s"
+msgstr "під час спроби створення файла з виведеними даними: %s"
+
+#: ../src/strip.c:929 ../src/strip.c:1668
+#, c-format
+msgid "%s: error while creating ELF header: %s"
+msgstr "%s: помилка під час створення заголовка ELF: %s"
+
+#: ../src/strip.c:943
+#, c-format
+msgid "while preparing output for '%s'"
+msgstr "під час приготування виведених даних для «%s»"
+
+#: ../src/strip.c:994 ../src/strip.c:1050
+#, c-format
+msgid "while create section header section: %s"
+msgstr "під час створення розділу заголовка розділу: %s"
+
+#: ../src/strip.c:1000
+#, c-format
+msgid "cannot allocate section data: %s"
+msgstr "не вдалося розмістити дані розділу: %s"
+
+#: ../src/strip.c:1059
+#, c-format
+msgid "while create section header string table: %s"
+msgstr "під час створення таблиці рядків заголовка розділу: %s"
+
+#: ../src/strip.c:1593 ../src/strip.c:1690
+#, c-format
+msgid "while writing '%s': %s"
+msgstr "під час запису «%s»: %s"
+
+#: ../src/strip.c:1604
+#, c-format
+msgid "while creating '%s'"
+msgstr "під час спроби створення «%s»"
+
+#: ../src/strip.c:1616
+#, c-format
+msgid "while computing checksum for debug information"
+msgstr "під час обчислення контрольної суми для діагностичних даних"
+
+#: ../src/strip.c:1676
+#, c-format
+msgid "%s: error while reading the file: %s"
+msgstr "%s: помилка під час читання файла: %s"
+
+#: ../src/strip.c:1722 ../src/strip.c:1729
+#, c-format
+msgid "error while finishing '%s': %s"
+msgstr "помилка під час завершення «%s»: %s"
+
+#: ../src/strip.c:1752 ../src/strip.c:1809
+#, c-format
+msgid "cannot set access and modification date of '%s'"
+msgstr "не вдалося встановити права доступу та дату зміни «%s»"
+
+#: ../src/unstrip.c:78
+msgid "Match MODULE against file names, not module names"
+msgstr "Встановити відповідність МОДУЛЯ назвам файлів, а не назвам модулів names"
+
+#: ../src/unstrip.c:79
+msgid "Silently skip unfindable files"
+msgstr "Пропустити незнайдені файли без додаткових повідомлень"
+
+#: ../src/unstrip.c:82
+msgid "Place output into FILE"
+msgstr "Вивести дані у ФАЙЛ"
+
+#: ../src/unstrip.c:84
+msgid "Create multiple output files under DIRECTORY"
+msgstr "Створити декілька файлів виведених даних у КАТАЛОЗІ"
+
+#: ../src/unstrip.c:85
+msgid "Use module rather than file names"
+msgstr "Використовувати назви модулів, а не файлів"
+
+#: ../src/unstrip.c:87
+msgid "Create output for modules that have no separate debug information"
+msgstr "Вивести дані для модулів, які не містять окремих діагностичних відомостей"
+
+#: ../src/unstrip.c:90
+msgid "Apply relocations to section contents in ET_REL files"
+msgstr "Застосувати переміщення до вмісту розділів у файлах ET_REL"
+
+#: ../src/unstrip.c:92
+msgid "Only list module and file names, build IDs"
+msgstr "Вивести лише список назв модулів, файлів, побудувати ідентифікатори"
+
+#: ../src/unstrip.c:134
+#, c-format
+msgid "-d option specified twice"
+msgstr "параметр -d вказано двічі"
+
+#: ../src/unstrip.c:166
+#, c-format
+msgid "only one of -o or -d allowed"
+msgstr "можна використовувати лише один з параметрів: -o або -d"
+
+#: ../src/unstrip.c:175
+#, c-format
+msgid "-n cannot be used with explicit files or -o or -d"
+msgstr ""
+"-n не можна використовувати з файлами, заданими явно, або параметрами -o і -d"
+
+#: ../src/unstrip.c:190
+#, c-format
+msgid "output directory '%s'"
+msgstr "каталог виведення даних «%s»"
+
+#: ../src/unstrip.c:199
+#, c-format
+msgid "exactly two file arguments are required"
+msgstr "як аргументи має бути вказано точно два файла"
+
+#: ../src/unstrip.c:205
+#, c-format
+msgid "-m, -a, -R, and -i options not allowed with explicit files"
+msgstr ""
+"для файлів, заданих явно, не можна використовувати параметри -m, -a, -R і -i"
+
+#: ../src/unstrip.c:218
+#, c-format
+msgid "-o or -d is required when using implicit files"
+msgstr ""
+"якщо використовуються файли, задані неявно, слід додавати параметр -o або -d"
+
+#: ../src/unstrip.c:254
+#, c-format
+msgid "cannot create ELF header: %s"
+msgstr "не вдалося створити заголовок ELF: %s"
+
+#: ../src/unstrip.c:259
+#, c-format
+msgid "cannot copy ELF header: %s"
+msgstr "не вдалося скопіювати заголовок ELF: %s"
+
+#: ../src/unstrip.c:264 ../src/unstrip.c:1817
+#, c-format
+msgid "cannot create program headers: %s"
+msgstr "не вдалося створити заголовки програми: %s"
+
+#: ../src/unstrip.c:270
+#, c-format
+msgid "cannot copy program header: %s"
+msgstr "не вдалося скопіювати заголовок програми: %s"
+
+#: ../src/unstrip.c:280
+#, c-format
+msgid "cannot copy section header: %s"
+msgstr "не вдалося скопіювати заголовок розділу: %s"
+
+#: ../src/unstrip.c:283 ../src/unstrip.c:1505
+#, c-format
+msgid "cannot get section data: %s"
+msgstr "не вдалося отримати дані розділу: %s"
+
+#: ../src/unstrip.c:285 ../src/unstrip.c:1507
+#, c-format
+msgid "cannot copy section data: %s"
+msgstr "не вдалося скопіювати дані розділу: %s"
+
+#: ../src/unstrip.c:309
+#, c-format
+msgid "cannot create directory '%s'"
+msgstr "не вдалося створити каталог «%s»"
+
+#: ../src/unstrip.c:349 ../src/unstrip.c:763 ../src/unstrip.c:1540
+#, c-format
+msgid "cannot get symbol table entry: %s"
+msgstr "не вдалося отримати запис таблиці символів: %s"
+
+#: ../src/unstrip.c:365 ../src/unstrip.c:580 ../src/unstrip.c:601
+#: ../src/unstrip.c:613 ../src/unstrip.c:1561 ../src/unstrip.c:1691
+#: ../src/unstrip.c:1715
+#, c-format
+msgid "cannot update symbol table: %s"
+msgstr "не вдалося оновити таблицю символів: %s"
+
+#: ../src/unstrip.c:382 ../src/unstrip.c:432 ../src/unstrip.c:562
+#: ../src/unstrip.c:1209 ../src/unstrip.c:1525 ../src/unstrip.c:1720
+#: ../src/unstrip.c:1791
+#, c-format
+msgid "cannot update section header: %s"
+msgstr "не вдалося оновити заголовок розділу: %s"
+
+#: ../src/unstrip.c:408 ../src/unstrip.c:419
+#, c-format
+msgid "cannot update relocation: %s"
+msgstr "не вдалося оновити переміщення: %s"
+
+#: ../src/unstrip.c:507
+#, c-format
+msgid "cannot get symbol version: %s"
+msgstr "не вдалося отримати версію символу: %s"
+
+#: ../src/unstrip.c:519
+#, c-format
+msgid "unexpected section type in [%Zu] with sh_link to symtab"
+msgstr "неочікуваний тип розділу у [%Zu] з посиланням sh_link на symtab"
+
+#: ../src/unstrip.c:769
+#, c-format
+msgid "invalid string offset in symbol [%Zu]"
+msgstr "некоректне зміщення рядка у символі [%Zu]"
+
+#: ../src/unstrip.c:911 ../src/unstrip.c:1248
+#, c-format
+msgid "cannot read section [%Zu] name: %s"
+msgstr "не вдалося прочитати назву розділу [%Zu]: %s"
+
+#: ../src/unstrip.c:952 ../src/unstrip.c:971 ../src/unstrip.c:1004
+#, c-format
+msgid "cannot read '.gnu.prelink_undo' section: %s"
+msgstr "не вдалося прочитати розділ «.gnu.prelink_undo»: %s"
+
+#: ../src/unstrip.c:992
+#, c-format
+msgid "invalid contents in '%s' section"
+msgstr "некоректний вміст розділу «%s»"
+
+#: ../src/unstrip.c:1047 ../src/unstrip.c:1370
+#, c-format
+msgid "cannot find matching section for [%Zu] '%s'"
+msgstr "не вдалося знайти відповідний розділ для [%Zu] «%s»"
+
+#: ../src/unstrip.c:1171 ../src/unstrip.c:1186 ../src/unstrip.c:1451
+#, c-format
+msgid "cannot add section name to string table: %s"
+msgstr "не вдалося додати назву розділу до таблиці рядків: %s"
+
+#: ../src/unstrip.c:1195
+#, c-format
+msgid "cannot update section header string table data: %s"
+msgstr "не вдалося оновити дані заголовка розділу у таблиці рядків: %s"
+
+#: ../src/unstrip.c:1223 ../src/unstrip.c:1227
+#, c-format
+msgid "cannot get section header string table section index: %s"
+msgstr "не вдалося визначити індекс розділу заголовка розділу у таблиці рядків: %s"
+
+#: ../src/unstrip.c:1231 ../src/unstrip.c:1235 ../src/unstrip.c:1466
+#, c-format
+msgid "cannot get section count: %s"
+msgstr "не вдалося отримати кількість розділів: %s"
+
+#: ../src/unstrip.c:1293 ../src/unstrip.c:1385
+#, c-format
+msgid "cannot read section header string table: %s"
+msgstr "не вдалося прочитати таблицю рядків заголовка розділу: %s"
+
+#: ../src/unstrip.c:1445
+#, c-format
+msgid "cannot add new section: %s"
+msgstr "не вдалося додати новий розділ: %s"
+
+#: ../src/unstrip.c:1548
+#, c-format
+msgid "symbol [%Zu] has invalid section index"
+msgstr "символ [%Zu] має некоректний індекс розділу"
+
+#: ../src/unstrip.c:1800
+#, c-format
+msgid "cannot get ELF header: %s"
+msgstr "не вдалося отримати заголовок ELF: %s"
+
+#: ../src/unstrip.c:1827
+#, c-format
+msgid "cannot update program header: %s"
+msgstr "не вдалося оновити заголовок програми: %s"
+
+#: ../src/unstrip.c:1832 ../src/unstrip.c:1911
+#, c-format
+msgid "cannot write output file: %s"
+msgstr "не вдалося записати файл виведених даних: %s"
+
+#: ../src/unstrip.c:1880
+#, c-format
+msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+"Дані DWARF не скориговано відповідно до відхилення перед компонуванням; "
+"спробуйте виправити це командою prelink -u"
+
+#: ../src/unstrip.c:1883
+#, c-format
+msgid "DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+"Дані DWARF у «%s» не скориговано відповідно до відхилення перед "
+"компонуванням; спробуйте виправити це командою prelink -u"
+
+#: ../src/unstrip.c:1902 ../src/unstrip.c:1942 ../src/unstrip.c:1954
+#: ../src/unstrip.c:2034
+#, c-format
+msgid "cannot create ELF descriptor: %s"
+msgstr "не вдалося створити дескриптор ELF: %s"
+
+#: ../src/unstrip.c:1960
+#, c-format
+msgid "'%s' and '%s' do not seem to match"
+msgstr "«%s» і «%s» не відповідають одне одному"
+
+#: ../src/unstrip.c:1991
+#, c-format
+msgid "cannot find stripped file for module '%s': %s"
+msgstr "не вдалося знайти очищений файл для модуля «%s»: %s"
+
+#: ../src/unstrip.c:1995
+#, c-format
+msgid "cannot open stripped file '%s' for module '%s': %s"
+msgstr "не вдалося відкрити очищений файл «%s» для модуля «%s»: %s"
+
+#: ../src/unstrip.c:2010
+#, c-format
+msgid "cannot find debug file for module '%s': %s"
+msgstr "не вдалося знайти файл діагностичних даних для модуля «%s»: %s"
+
+#: ../src/unstrip.c:2014
+#, c-format
+msgid "cannot open debug file '%s' for module '%s': %s"
+msgstr "не вдалося відкрити файл діагностичних даних «%s» для модуля «%s»: %s"
+
+#: ../src/unstrip.c:2027
+#, c-format
+msgid "module '%s' file '%s' is not stripped"
+msgstr "у модулі «%s» файл «%s» не очищено strip"
+
+#: ../src/unstrip.c:2058
+#, c-format
+msgid "cannot cache section addresses for module '%s': %s"
+msgstr "не вдалося кешувати адреси розділів для модуля «%s»: %s"
+
+#: ../src/unstrip.c:2191
+#, c-format
+msgid "no matching modules found"
+msgstr "відповідних модулів не виявлено"
+
+#: ../src/unstrip.c:2200
+#, c-format
+msgid "matched more than one module"
+msgstr "встановлено відповідність декількох модулів"
+
+#: ../src/unstrip.c:2247
+msgid ""
+"STRIPPED-FILE DEBUG-FILE\n"
+"[MODULE...]"
+msgstr ""
+"ОЧИЩЕНИЙ-ФАЙЛ ФАЙЛ-DEBUG\n"
+"[МОДУЛЬ...]"
+
+#: ../src/unstrip.c:2248
+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"
+"\n"
+"MODULE arguments give file name patterns matching modules to process.\n"
+"With -f these match the file name of the main (stripped) file (slashes are "
+"never special), otherwise they match the simple module names. With no "
+"arguments, process all modules found.\n"
+"\n"
+"Multiple modules are written to files under OUTPUT-DIRECTORY, creating "
+"subdirectories as needed. With -m these files have simple module names, "
+"otherwise they have the name of the main file complete with directory "
+"underneath OUTPUT-DIRECTORY.\n"
+"\n"
+"With -n no files are written, but one line to standard output for each "
+"module:\n"
+"\tSTART+SIZE BUILDID FILE DEBUGFILE MODULENAME\n"
+"START and SIZE are hexadecimal giving the address bounds of the module. "
+"BUILDID is hexadecimal for the build ID bits, or - if no ID is known; the "
+"hexadecimal may be followed by @0xADDR giving the address where the ID "
+"resides if that is known. FILE is the file name found for the module, or - "
+"if none was found, or . if an ELF image is available but not from any named "
+"file. DEBUGFILE is the separate debuginfo file name, or - if no debuginfo "
+"was found, or . if FILE contains the debug information."
+msgstr ""
+"Комбінувати очищені файли з окремими даними щодо символів та діагностичними "
+"даними.\vЗа використання першої форми команди, результати буде виведено до "
+"ФАЙЛА-DEBUG, якщо не файл виведених даних не вказано параметром -o.\n"
+"\n"
+"За допомогою аргументів МОДУЛЬ можна вказати шаблони назв файлів модулів, "
+"які слід обробити.\n"
+"З -f ці назви модулів відповідатимуть назві основного (очищеного strip) "
+"файла (похилі риски не є спеціальними символами), якщо ж -f не вказано, "
+"назви вважатимуться простими назвами модулів. Якщо аргументів не буде "
+"вказано, програма обробить всі знайдені модулі.\n"
+"\n"
+"Вказані модулі буде записано до файлів у КАТАЛОЗІ-ВИВОДУ, зі створенням, за "
+"потреби, підкаталогів. З параметром -m файли виведених даних "
+"створюватимуться за назвами модулів, якщо ж цього параметра вказано не буде, "
+"програма створюватиме файл з назвою основного файла у основному КАТАЛОЗІ-"
+"ВИВОДУ.\n"
+"\n"
+"Якщо буде вказано параметр -n, дані до файлів не виводитимуться, програма "
+"виведе для кожного модуля до стандартного виводу такі дані:\n"
+"\tПОЧАТОК+РОЗМІР ІДЕНТИФІКАТОР-ЗБИРАННЯ ФАЙЛ ФАЙЛ-DEBUG НАЗВА-МОДУЛЯ\n"
+"ПОЧАТОК і РОЗМІР буде виведено як шістнадцяткові числа у межах адресного "
+"простору модуля. ІДЕНТИФІКАТОР-ЗБИРАННЯ — це шістнадцяткове число, що "
+"відповідає бітам ідентифікатора збирання, або «-», якщо ідентифікатор "
+"невідомий; за шістнадцятковим числом може слідувати @0xАДРЕСА, яка вказує "
+"місце розташування ідентифікатора, якщо воно відоме. ФАЙЛ відповідає назві "
+"файла, знайденого для модуля, або «-», якщо файл не знайдено, і «.», якщо "
+"вдалося знайти образ ELF, але без жодного файла з назвою. ФАЙЛ-DEBUG — назва "
+"окремого файла діагностичних даних або «-», якщо файла діагностичних даних не "
+"вдалося знайти, і «.», якщо ФАЙЛ сам містить діагностичні дані."
+
diff --git a/po/zh_CN.po b/po/zh_CN.po
new file mode 100644
index 00000000..47515ae5
--- /dev/null
+++ b/po/zh_CN.po
@@ -0,0 +1,5666 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: http://bugzilla.redhat.com/\n"
+"POT-Creation-Date: 2010-04-21 07:41-0700\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"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: lib/xmalloc.c:51 lib/xmalloc.c:65 lib/xmalloc.c:79 src/readelf.c:2822
+#: src/readelf.c:3161 src/unstrip.c:2087 src/unstrip.c:2295
+#, c-format
+msgid "memory exhausted"
+msgstr ""
+
+#: libasm/asm_error.c:62 libdw/dwarf_error.c:79 libdwfl/libdwflP.h:70
+#: libelf/elf_error.c:81
+msgid "no error"
+msgstr ""
+
+#: libasm/asm_error.c:63 libdw/dwarf_error.c:88 libdwfl/libdwflP.h:72
+#: libelf/elf_error.c:112
+msgid "out of memory"
+msgstr ""
+
+#: libasm/asm_error.c:64 src/ldgeneric.c:2687
+#, c-format
+msgid "cannot create output file"
+msgstr ""
+
+#: libasm/asm_error.c:65
+msgid "invalid parameter"
+msgstr ""
+
+#: libasm/asm_error.c:66
+msgid "cannot change mode of output file"
+msgstr ""
+
+#: libasm/asm_error.c:67 src/ldgeneric.c:7001
+#, c-format
+msgid "cannot rename output file"
+msgstr ""
+
+#: libasm/asm_error.c:68
+msgid "duplicate symbol"
+msgstr ""
+
+#: libasm/asm_error.c:69
+msgid "invalid section type for operation"
+msgstr ""
+
+#: libasm/asm_error.c:70
+msgid "error during output of data"
+msgstr ""
+
+#: libasm/asm_error.c:71
+msgid "no backend support available"
+msgstr ""
+
+#: libasm/asm_error.c:81 libdw/dwarf_error.c:80 libdwfl/libdwflP.h:71
+#: libelf/elf_error.c:84
+msgid "unknown error"
+msgstr ""
+
+#: libdw/dwarf_error.c:81
+msgid "invalid access"
+msgstr ""
+
+#: libdw/dwarf_error.c:82
+msgid "no regular file"
+msgstr ""
+
+#: libdw/dwarf_error.c:83
+msgid "I/O error"
+msgstr ""
+
+#: libdw/dwarf_error.c:84
+msgid "invalid ELF file"
+msgstr ""
+
+#: libdw/dwarf_error.c:85
+msgid "no DWARF information"
+msgstr ""
+
+#: libdw/dwarf_error.c:86
+msgid "no ELF file"
+msgstr ""
+
+#: libdw/dwarf_error.c:87
+msgid "cannot get ELF header"
+msgstr ""
+
+#: libdw/dwarf_error.c:89
+msgid "not implemented"
+msgstr ""
+
+#: libdw/dwarf_error.c:90 libelf/elf_error.c:128 libelf/elf_error.c:176
+msgid "invalid command"
+msgstr ""
+
+#: libdw/dwarf_error.c:91
+msgid "invalid version"
+msgstr ""
+
+#: libdw/dwarf_error.c:92
+msgid "invalid file"
+msgstr ""
+
+#: libdw/dwarf_error.c:93
+msgid "no entries found"
+msgstr ""
+
+#: libdw/dwarf_error.c:94
+msgid "invalid DWARF"
+msgstr ""
+
+#: libdw/dwarf_error.c:95
+msgid "no string data"
+msgstr ""
+
+#: libdw/dwarf_error.c:96
+msgid "no address value"
+msgstr ""
+
+#: libdw/dwarf_error.c:97
+msgid "no constant value"
+msgstr ""
+
+#: libdw/dwarf_error.c:98
+msgid "no reference value"
+msgstr ""
+
+#: libdw/dwarf_error.c:99
+msgid "invalid reference value"
+msgstr ""
+
+#: libdw/dwarf_error.c:100
+msgid ".debug_line section missing"
+msgstr ""
+
+#: libdw/dwarf_error.c:101
+msgid "invalid .debug_line section"
+msgstr ""
+
+#: libdw/dwarf_error.c:102
+msgid "debug information too big"
+msgstr ""
+
+#: libdw/dwarf_error.c:103
+msgid "invalid DWARF version"
+msgstr ""
+
+#: libdw/dwarf_error.c:104
+msgid "invalid directory index"
+msgstr ""
+
+#: libdw/dwarf_error.c:105 libdwfl/libdwflP.h:91
+msgid "address out of range"
+msgstr ""
+
+#: libdw/dwarf_error.c:106
+msgid "no location list value"
+msgstr ""
+
+#: libdw/dwarf_error.c:107
+msgid "no block data"
+msgstr ""
+
+#: libdw/dwarf_error.c:108
+msgid "invalid line index"
+msgstr ""
+
+#: libdw/dwarf_error.c:109
+msgid "invalid address range index"
+msgstr ""
+
+#: libdw/dwarf_error.c:110 libdwfl/libdwflP.h:92
+msgid "no matching address range"
+msgstr ""
+
+#: libdw/dwarf_error.c:111
+msgid "no flag value"
+msgstr ""
+
+#: libdw/dwarf_error.c:112 libelf/elf_error.c:253
+msgid "invalid offset"
+msgstr ""
+
+#: libdw/dwarf_error.c:113
+msgid ".debug_ranges section missing"
+msgstr ""
+
+#: libdw/dwarf_error.c:114
+msgid "invalid CFI section"
+msgstr ""
+
+#: libdwfl/argp-std.c:67 src/unstrip.c:2237
+msgid "Input selection options:"
+msgstr ""
+
+#: libdwfl/argp-std.c:68
+msgid "Find addresses in FILE"
+msgstr ""
+
+#: libdwfl/argp-std.c:70
+msgid "Find addresses from signatures found in COREFILE"
+msgstr ""
+
+#: libdwfl/argp-std.c:72
+msgid "Find addresses in files mapped into process PID"
+msgstr ""
+
+#: libdwfl/argp-std.c:74
+msgid ""
+"Find addresses in files mapped as read from FILE in Linux /proc/PID/maps "
+"format"
+msgstr ""
+
+#: libdwfl/argp-std.c:76
+msgid "Find addresses in the running kernel"
+msgstr ""
+
+#: libdwfl/argp-std.c:78
+msgid "Kernel with all modules"
+msgstr ""
+
+#: libdwfl/argp-std.c:80
+msgid "Search path for separate debuginfo files"
+msgstr ""
+
+#: libdwfl/argp-std.c:163
+msgid "only one of -e, -p, -k, -K, or --core allowed"
+msgstr ""
+
+#: libdwfl/argp-std.c:223
+#, c-format
+msgid "cannot read ELF core file: %s"
+msgstr ""
+
+#: libdwfl/argp-std.c:241
+msgid "No modules recognized in core file"
+msgstr ""
+
+#: libdwfl/argp-std.c:253
+msgid "cannot load kernel symbols"
+msgstr ""
+
+#: libdwfl/argp-std.c:257
+msgid "cannot find kernel modules"
+msgstr ""
+
+#: libdwfl/argp-std.c:271
+msgid "cannot find kernel or modules"
+msgstr ""
+
+#: libdwfl/libdwflP.h:73
+msgid "See errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:74
+msgid "See elf_errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:75
+msgid "See dwarf_errno"
+msgstr ""
+
+#: libdwfl/libdwflP.h:76
+msgid "See ebl_errno (XXX missing)"
+msgstr ""
+
+#: libdwfl/libdwflP.h:77
+msgid "gzip decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:78
+msgid "bzip2 decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:79
+msgid "LZMA decompression failed"
+msgstr ""
+
+#: libdwfl/libdwflP.h:80
+msgid "no support library found for machine"
+msgstr ""
+
+#: libdwfl/libdwflP.h:81
+msgid "Callbacks missing for ET_REL file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:82
+msgid "Unsupported relocation type"
+msgstr ""
+
+#: libdwfl/libdwflP.h:83
+msgid "r_offset is bogus"
+msgstr ""
+
+#: libdwfl/libdwflP.h:84 libelf/elf_error.c:132 libelf/elf_error.c:192
+msgid "offset out of range"
+msgstr ""
+
+#: libdwfl/libdwflP.h:85
+msgid "relocation refers to undefined symbol"
+msgstr ""
+
+#: libdwfl/libdwflP.h:86
+msgid "Callback returned failure"
+msgstr ""
+
+#: libdwfl/libdwflP.h:87
+msgid "No DWARF information found"
+msgstr ""
+
+#: libdwfl/libdwflP.h:88
+msgid "No symbol table found"
+msgstr ""
+
+#: libdwfl/libdwflP.h:89
+msgid "No ELF program headers"
+msgstr ""
+
+#: libdwfl/libdwflP.h:90
+msgid "address range overlaps an existing module"
+msgstr ""
+
+#: libdwfl/libdwflP.h:93
+msgid "image truncated"
+msgstr ""
+
+#: libdwfl/libdwflP.h:94
+msgid "ELF file opened"
+msgstr ""
+
+#: libdwfl/libdwflP.h:95
+msgid "not a valid ELF file"
+msgstr ""
+
+#: libdwfl/libdwflP.h:96
+msgid "cannot handle DWARF type description"
+msgstr ""
+
+#: libebl/eblbackendname.c:63
+msgid "No backend"
+msgstr ""
+
+#: libebl/eblcorenotetypename.c:107 libebl/eblobjecttypename.c:78
+#: libebl/eblobjnotetypename.c:86 libebl/eblosabiname.c:98
+#: libebl/eblsectionname.c:110 libebl/eblsectiontypename.c:140
+#: libebl/eblsegmenttypename.c:104
+msgid "<unknown>"
+msgstr ""
+
+#: libebl/ebldynamictagname.c:126
+#, c-format
+msgid "<unknown>: %#<PRIx64>"
+msgstr ""
+
+#: libebl/eblobjnote.c:76
+#, c-format
+msgid " Build ID: "
+msgstr ""
+
+#: libebl/eblobjnote.c:87
+#, c-format
+msgid " Linker version: %.*s\n"
+msgstr ""
+
+#: libebl/eblobjnote.c:136
+#, c-format
+msgid " OS: %s, ABI: "
+msgstr ""
+
+#: libebl/eblosabiname.c:95
+msgid "Stand alone"
+msgstr ""
+
+#: libebl/eblsymbolbindingname.c:92 libebl/eblsymboltypename.c:98
+#, c-format
+msgid "<unknown>: %d"
+msgstr ""
+
+#: libelf/elf_error.c:88
+msgid "unknown version"
+msgstr ""
+
+#: libelf/elf_error.c:92
+msgid "unknown type"
+msgstr ""
+
+#: libelf/elf_error.c:96
+msgid "invalid `Elf' handle"
+msgstr ""
+
+#: libelf/elf_error.c:100
+msgid "invalid size of source operand"
+msgstr ""
+
+#: libelf/elf_error.c:104
+msgid "invalid size of destination operand"
+msgstr ""
+
+#: libelf/elf_error.c:108 src/readelf.c:4779
+#, c-format
+msgid "invalid encoding"
+msgstr ""
+
+#: libelf/elf_error.c:116
+msgid "invalid file descriptor"
+msgstr ""
+
+#: libelf/elf_error.c:120
+msgid "invalid operation"
+msgstr ""
+
+#: libelf/elf_error.c:124
+msgid "ELF version not set"
+msgstr ""
+
+#: libelf/elf_error.c:136
+msgid "invalid fmag field in archive header"
+msgstr ""
+
+#: libelf/elf_error.c:140
+msgid "invalid archive file"
+msgstr ""
+
+#: libelf/elf_error.c:144
+msgid "descriptor is not for an archive"
+msgstr ""
+
+#: libelf/elf_error.c:148
+msgid "no index available"
+msgstr ""
+
+#: libelf/elf_error.c:152
+msgid "cannot read data from file"
+msgstr ""
+
+#: libelf/elf_error.c:156
+msgid "cannot write data to file"
+msgstr ""
+
+#: libelf/elf_error.c:160
+msgid "invalid binary class"
+msgstr ""
+
+#: libelf/elf_error.c:164
+msgid "invalid section index"
+msgstr ""
+
+#: libelf/elf_error.c:168
+msgid "invalid operand"
+msgstr ""
+
+#: libelf/elf_error.c:172
+msgid "invalid section"
+msgstr ""
+
+#: libelf/elf_error.c:180
+msgid "executable header not created first"
+msgstr ""
+
+#: libelf/elf_error.c:184
+msgid "file descriptor disabled"
+msgstr ""
+
+#: libelf/elf_error.c:188
+msgid "archive/member file descriptor mismatch"
+msgstr ""
+
+#: libelf/elf_error.c:196
+msgid "cannot manipulate null section"
+msgstr ""
+
+#: libelf/elf_error.c:200
+msgid "data/scn mismatch"
+msgstr ""
+
+#: libelf/elf_error.c:204
+msgid "invalid section header"
+msgstr ""
+
+#: libelf/elf_error.c:208 src/readelf.c:6242 src/readelf.c:6343
+#, c-format
+msgid "invalid data"
+msgstr ""
+
+#: libelf/elf_error.c:212
+msgid "unknown data encoding"
+msgstr ""
+
+#: libelf/elf_error.c:216
+msgid "section `sh_size' too small for data"
+msgstr ""
+
+#: libelf/elf_error.c:220
+msgid "invalid section alignment"
+msgstr ""
+
+#: libelf/elf_error.c:224
+msgid "invalid section entry size"
+msgstr ""
+
+#: libelf/elf_error.c:228
+msgid "update() for write on read-only file"
+msgstr ""
+
+#: libelf/elf_error.c:232
+msgid "no such file"
+msgstr ""
+
+#: libelf/elf_error.c:236
+msgid "only relocatable files can contain section groups"
+msgstr ""
+
+#: libelf/elf_error.c:241
+msgid ""
+"program header only allowed in executables, shared objects, and core files"
+msgstr ""
+
+#: libelf/elf_error.c:248
+msgid "file has no program header"
+msgstr ""
+
+#: src/addr2line.c:66
+msgid "Output selection options:"
+msgstr ""
+
+#: src/addr2line.c:67
+msgid "Show only base names of source files"
+msgstr ""
+
+#: src/addr2line.c:69
+msgid "Show absolute file names using compilation directory"
+msgstr ""
+
+#: src/addr2line.c:70
+msgid "Also show function names"
+msgstr ""
+
+#: src/addr2line.c:71
+msgid "Also show symbol or section names"
+msgstr ""
+
+#: src/addr2line.c:73
+msgid "Treat addresses as offsets relative to NAME section."
+msgstr ""
+
+#: src/addr2line.c:75 src/elfcmp.c:75 src/findtextrel.c:75 src/nm.c:103
+#: src/strings.c:83
+msgid "Miscellaneous:"
+msgstr ""
+
+#: src/addr2line.c:84
+msgid ""
+"Locate source files and line information for ADDRs (in a.out by default)."
+msgstr ""
+
+#: src/addr2line.c:88
+msgid "[ADDR...]"
+msgstr ""
+
+#: src/addr2line.c:185 src/ar.c:289 src/elfcmp.c:555 src/elflint.c:239
+#: src/findtextrel.c:170 src/ld.c:957 src/nm.c:253 src/objdump.c:181
+#: src/ranlib.c:136 src/readelf.c:449 src/size.c:219 src/strings.c:227
+#: src/strip.c:204 src/unstrip.c:234
+#, c-format
+msgid ""
+"Copyright (C) %s Red Hat, Inc.\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+
+#: src/addr2line.c:190 src/ar.c:294 src/elfcmp.c:560 src/elflint.c:244
+#: src/findtextrel.c:175 src/ld.c:962 src/nm.c:258 src/objdump.c:186
+#: src/ranlib.c:141 src/readelf.c:454 src/size.c:224 src/strings.c:232
+#: src/strip.c:209 src/unstrip.c:239
+#, c-format
+msgid "Written by %s.\n"
+msgstr ""
+
+#: src/addr2line.c:405
+#, c-format
+msgid "Section syntax requires exactly one module"
+msgstr ""
+
+#: src/addr2line.c:428
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside section '%s'"
+msgstr ""
+
+#: src/addr2line.c:461
+#, c-format
+msgid "cannot find symbol '%s'"
+msgstr ""
+
+#: src/addr2line.c:466
+#, c-format
+msgid "offset %#<PRIxMAX> lies outside contents of '%s'"
+msgstr ""
+
+#: src/ar.c:76
+msgid "Commands:"
+msgstr ""
+
+#: src/ar.c:77
+msgid "Delete files from archive."
+msgstr ""
+
+#: src/ar.c:78
+msgid "Move files in archive."
+msgstr ""
+
+#: src/ar.c:79
+msgid "Print files in archive."
+msgstr ""
+
+#: src/ar.c:80
+msgid "Quick append files to archive."
+msgstr ""
+
+#: src/ar.c:82
+msgid "Replace existing or insert new file into archive."
+msgstr ""
+
+#: src/ar.c:83
+msgid "Display content of archive."
+msgstr ""
+
+#: src/ar.c:84
+msgid "Extract files from archive."
+msgstr ""
+
+#: src/ar.c:86
+msgid "Command Modifiers:"
+msgstr ""
+
+#: src/ar.c:87
+msgid "Preserve original dates."
+msgstr ""
+
+#: src/ar.c:88
+msgid "Use instance [COUNT] of name."
+msgstr ""
+
+#: src/ar.c:90
+msgid "Do not replace existing files with extracted files."
+msgstr ""
+
+#: src/ar.c:91
+msgid "Allow filename to be truncated if necessary."
+msgstr ""
+
+#: src/ar.c:93
+msgid "Provide verbose output."
+msgstr ""
+
+#: src/ar.c:94
+msgid "Force regeneration of symbol table."
+msgstr ""
+
+#: src/ar.c:95
+msgid "Insert file after [MEMBER]."
+msgstr ""
+
+#: src/ar.c:96
+msgid "Insert file before [MEMBER]."
+msgstr ""
+
+#: src/ar.c:97
+msgid "Same as -b."
+msgstr ""
+
+#: src/ar.c:98
+msgid "Suppress message when library has to be created."
+msgstr ""
+
+#: src/ar.c:100
+msgid "Use full path for file matching."
+msgstr ""
+
+#: src/ar.c:101
+msgid "Update only older files in archive."
+msgstr ""
+
+#: src/ar.c:107
+msgid "Create, modify, and extract from archives."
+msgstr ""
+
+#: src/ar.c:110
+msgid "[MEMBER] [COUNT] ARCHIVE [FILE...]"
+msgstr ""
+
+#: src/ar.c:192
+#, c-format
+msgid "'a', 'b', and 'i' are only allowed with the 'm' and 'r' options"
+msgstr ""
+
+#: src/ar.c:197
+#, c-format
+msgid "MEMBER parameter required for 'a', 'b', and 'i' modifiers"
+msgstr ""
+
+#: src/ar.c:213
+#, c-format
+msgid "'N' is only meaningful with the 'x' and 'd' options"
+msgstr ""
+
+#: src/ar.c:218
+#, c-format
+msgid "COUNT parameter required"
+msgstr ""
+
+#: src/ar.c:230
+#, c-format
+msgid "invalid COUNT parameter %s"
+msgstr ""
+
+#: src/ar.c:237
+#, c-format
+msgid "'%c' is only meaningful with the 'x' option"
+msgstr ""
+
+#: src/ar.c:243
+#, c-format
+msgid "archive name required"
+msgstr ""
+
+#: src/ar.c:314
+#, c-format
+msgid "More than one operation specified"
+msgstr ""
+
+#: src/ar.c:404
+#, c-format
+msgid "cannot open archive '%s'"
+msgstr ""
+
+#: src/ar.c:414
+#, c-format
+msgid "cannot open archive '%s': %s"
+msgstr ""
+
+#: src/ar.c:418
+#, c-format
+msgid "%s: not an archive file"
+msgstr ""
+
+#: src/ar.c:422
+#, c-format
+msgid "cannot stat archive '%s'"
+msgstr ""
+
+#: src/ar.c:434
+#, c-format
+msgid "no entry %s in archive\n"
+msgstr ""
+
+#: src/ar.c:487 src/ar.c:929 src/ar.c:1129
+#, c-format
+msgid "cannot create hash table"
+msgstr ""
+
+#: src/ar.c:494 src/ar.c:936 src/ar.c:1138
+#, c-format
+msgid "cannot insert into hash table"
+msgstr ""
+
+#: src/ar.c:502 src/ranlib.c:176
+#, c-format
+msgid "cannot stat '%s'"
+msgstr ""
+
+#: src/ar.c:598
+#, c-format
+msgid "cannot read content of %s: %s"
+msgstr ""
+
+#: src/ar.c:641
+#, c-format
+msgid "cannot open %.*s"
+msgstr ""
+
+#: src/ar.c:663
+#, c-format
+msgid "failed to write %s"
+msgstr ""
+
+#: src/ar.c:675
+#, c-format
+msgid "cannot change mode of %s"
+msgstr ""
+
+#: src/ar.c:691
+#, c-format
+msgid "cannot change modification time of %s"
+msgstr ""
+
+#: src/ar.c:737
+#, c-format
+msgid "cannot rename temporary file to %.*s"
+msgstr ""
+
+#: src/ar.c:773 src/ar.c:1021 src/ar.c:1419 src/ranlib.c:250
+#, c-format
+msgid "cannot create new file"
+msgstr ""
+
+#: src/ar.c:1220
+#, c-format
+msgid "position member %s not found"
+msgstr ""
+
+#: src/ar.c:1230
+#, c-format
+msgid "%s: no entry %s in archive!\n"
+msgstr ""
+
+#: src/ar.c:1259 src/ldgeneric.c:519 src/objdump.c:257
+#, c-format
+msgid "cannot open %s"
+msgstr ""
+
+#: src/ar.c:1264
+#, c-format
+msgid "cannot stat %s"
+msgstr ""
+
+#: src/ar.c:1270
+#, c-format
+msgid "%s is no regular file"
+msgstr ""
+
+#: src/ar.c:1283
+#, c-format
+msgid "cannot get ELF descriptor for %s: %s\n"
+msgstr ""
+
+#: src/ar.c:1302
+#, c-format
+msgid "cannot read %s: %s"
+msgstr ""
+
+#: src/arlib.c:215
+#, c-format
+msgid "the archive '%s' is too large"
+msgstr ""
+
+#: src/arlib.c:228
+#, c-format
+msgid "cannot read ELF header of %s(%s): %s"
+msgstr ""
+
+#: src/elfcmp.c:69
+msgid "Control options:"
+msgstr ""
+
+#: src/elfcmp.c:70
+msgid ""
+"Control treatment of gaps in loadable segments [ignore|match] (default: "
+"ignore)"
+msgstr ""
+
+#: src/elfcmp.c:72
+msgid "Ignore permutation of buckets in SHT_HASH section"
+msgstr ""
+
+#: src/elfcmp.c:73
+msgid "Output nothing; yield exit status only"
+msgstr ""
+
+#: src/elfcmp.c:80
+msgid "Compare relevant parts of two ELF files for equality."
+msgstr ""
+
+#: src/elfcmp.c:84
+msgid "FILE1 FILE2"
+msgstr ""
+
+#: src/elfcmp.c:140
+msgid "Invalid number of parameters.\n"
+msgstr ""
+
+#: src/elfcmp.c:168 src/elfcmp.c:173
+#, c-format
+msgid "cannot get ELF header of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:190
+#, c-format
+msgid "%s %s diff: ELF header"
+msgstr ""
+
+#: src/elfcmp.c:198 src/elfcmp.c:201
+#, c-format
+msgid "cannot get section count of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:206
+#, c-format
+msgid "%s %s diff: section count"
+msgstr ""
+
+#: src/elfcmp.c:214 src/elfcmp.c:217
+#, c-format
+msgid "cannot get program header count of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:222
+#, c-format
+msgid "%s %s diff: program header count"
+msgstr ""
+
+#: src/elfcmp.c:281
+#, c-format
+msgid "%s %s differ: section header"
+msgstr ""
+
+#: src/elfcmp.c:309 src/elfcmp.c:315
+#, c-format
+msgid "cannot get content of section %zu in '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:331 src/elfcmp.c:337
+#, c-format
+msgid "cannot get symbol in '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:358
+#, c-format
+msgid "%s %s differ: symbol table [%zu]"
+msgstr ""
+
+#: src/elfcmp.c:361
+#, c-format
+msgid "%s %s differ: symbol table [%zu,%zu]"
+msgstr ""
+
+#: src/elfcmp.c:409
+#, c-format
+msgid "%s %s differ: section [%zu] '%s' content"
+msgstr ""
+
+#: src/elfcmp.c:413
+#, c-format
+msgid "%s %s differ: section [%zu,%zu] '%s' content"
+msgstr ""
+
+#: src/elfcmp.c:429
+#, c-format
+msgid "%s %s differ: unequal amount of important sections"
+msgstr ""
+
+#: src/elfcmp.c:463 src/elfcmp.c:468
+#, c-format
+msgid "cannot load data of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:487 src/elfcmp.c:493
+#, c-format
+msgid "cannot get program header entry %d of '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:499
+#, c-format
+msgid "%s %s differ: program header %d"
+msgstr ""
+
+#: src/elfcmp.c:524
+#, c-format
+msgid "%s %s differ: gap"
+msgstr ""
+
+#: src/elfcmp.c:583
+#, c-format
+msgid "Invalid value '%s' for --gaps parameter."
+msgstr ""
+
+#: src/elfcmp.c:607 src/findtextrel.c:229 src/ldgeneric.c:1767
+#: src/ldgeneric.c:4257 src/nm.c:363 src/ranlib.c:169 src/size.c:301
+#: src/strings.c:183 src/strip.c:433 src/strip.c:468 src/unstrip.c:1900
+#: src/unstrip.c:1929
+#, c-format
+msgid "cannot open '%s'"
+msgstr ""
+
+#: src/elfcmp.c:611 src/findtextrel.c:236 src/ranlib.c:186
+#, c-format
+msgid "cannot create ELF descriptor for '%s': %s"
+msgstr ""
+
+#: src/elfcmp.c:616
+#, c-format
+msgid "cannot create EBL descriptor for '%s'"
+msgstr ""
+
+#: src/elfcmp.c:634
+#, c-format
+msgid "cannot get section header of section %zu: %s"
+msgstr ""
+
+#: src/elfcmp.c:644
+#, c-format
+msgid "cannot get content of section %zu: %s"
+msgstr ""
+
+#: src/elfcmp.c:654 src/elfcmp.c:668
+#, c-format
+msgid "cannot get relocation: %s"
+msgstr ""
+
+#: src/elflint.c:72
+msgid "Be extremely strict, flag level 2 features."
+msgstr ""
+
+#: src/elflint.c:73
+msgid "Do not print anything if successful"
+msgstr ""
+
+#: src/elflint.c:74
+msgid "Binary is a separate debuginfo file"
+msgstr ""
+
+#: src/elflint.c:76
+msgid ""
+"Binary has been created with GNU ld and is therefore known to be broken in "
+"certain ways"
+msgstr ""
+
+#: src/elflint.c:82
+msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
+msgstr ""
+
+#: src/elflint.c:86 src/readelf.c:118
+msgid "FILE..."
+msgstr ""
+
+#: src/elflint.c:159 src/readelf.c:272
+#, c-format
+msgid "cannot open input file"
+msgstr ""
+
+#: src/elflint.c:166
+#, c-format
+msgid "cannot generate Elf descriptor: %s\n"
+msgstr ""
+
+#: src/elflint.c:185
+#, c-format
+msgid "error while closing Elf descriptor: %s\n"
+msgstr ""
+
+#: src/elflint.c:189
+msgid "No errors"
+msgstr ""
+
+#: src/elflint.c:223 src/readelf.c:425
+msgid "Missing file name.\n"
+msgstr ""
+
+#: src/elflint.c:302
+#, c-format
+msgid " error while freeing sub-ELF descriptor: %s\n"
+msgstr ""
+
+#: src/elflint.c:310
+#, c-format
+msgid "Not an ELF file - it has the wrong magic bytes at the start\n"
+msgstr ""
+
+#: src/elflint.c:370
+#, c-format
+msgid "e_ident[%d] == %d is no known class\n"
+msgstr ""
+
+#: src/elflint.c:375
+#, c-format
+msgid "e_ident[%d] == %d is no known data encoding\n"
+msgstr ""
+
+#: src/elflint.c:379
+#, c-format
+msgid "unknown ELF header version number e_ident[%d] == %d\n"
+msgstr ""
+
+#: src/elflint.c:385
+#, c-format
+msgid "unsupported OS ABI e_ident[%d] == '%s'\n"
+msgstr ""
+
+#: src/elflint.c:391
+#, c-format
+msgid "unsupport ABI version e_ident[%d] == %d\n"
+msgstr ""
+
+#: src/elflint.c:396
+#, c-format
+msgid "e_ident[%zu] is not zero\n"
+msgstr ""
+
+#: src/elflint.c:401
+#, c-format
+msgid "unknown object file type %d\n"
+msgstr ""
+
+#: src/elflint.c:408
+#, c-format
+msgid "unknown machine type %d\n"
+msgstr ""
+
+#: src/elflint.c:412
+#, c-format
+msgid "unknown object file version\n"
+msgstr ""
+
+#: src/elflint.c:418
+#, c-format
+msgid "invalid program header offset\n"
+msgstr ""
+
+#: src/elflint.c:420
+#, c-format
+msgid "executables and DSOs cannot have zero program header offset\n"
+msgstr ""
+
+#: src/elflint.c:424
+#, c-format
+msgid "invalid number of program header entries\n"
+msgstr ""
+
+#: src/elflint.c:432
+#, c-format
+msgid "invalid section header table offset\n"
+msgstr ""
+
+#: src/elflint.c:435
+#, c-format
+msgid "section header table must be present\n"
+msgstr ""
+
+#: src/elflint.c:449
+#, c-format
+msgid "invalid number of section header table entries\n"
+msgstr ""
+
+#: src/elflint.c:466
+#, c-format
+msgid "invalid section header index\n"
+msgstr ""
+
+#: src/elflint.c:480
+#, c-format
+msgid "invalid number of program header table entries\n"
+msgstr ""
+
+#: src/elflint.c:489
+#, c-format
+msgid "invalid machine flags: %s\n"
+msgstr ""
+
+#: src/elflint.c:496 src/elflint.c:513
+#, c-format
+msgid "invalid ELF header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:499 src/elflint.c:516
+#, c-format
+msgid "invalid program header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:502 src/elflint.c:519
+#, c-format
+msgid "invalid program header position or size\n"
+msgstr ""
+
+#: src/elflint.c:505 src/elflint.c:522
+#, c-format
+msgid "invalid section header size: %hd\n"
+msgstr ""
+
+#: src/elflint.c:508 src/elflint.c:525
+#, c-format
+msgid "invalid section header position or size\n"
+msgstr ""
+
+#: src/elflint.c:569
+#, c-format
+msgid ""
+"section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
+"group\n"
+msgstr ""
+
+#: src/elflint.c:573
+#, c-format
+msgid ""
+"section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
+msgstr ""
+
+#: src/elflint.c:589 src/elflint.c:1432 src/elflint.c:1482 src/elflint.c:1591
+#: src/elflint.c:2185 src/elflint.c:2699 src/elflint.c:2860 src/elflint.c:2990
+#: src/elflint.c:3162 src/elflint.c:4062
+#, c-format
+msgid "section [%2d] '%s': cannot get section data\n"
+msgstr ""
+
+#: src/elflint.c:602 src/elflint.c:1598
+#, 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:625
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol table cannot have more than one extended index "
+"section\n"
+msgstr ""
+
+#: src/elflint.c:636
+#, c-format
+msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
+msgstr ""
+
+#: src/elflint.c:645
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
+msgstr ""
+
+#: src/elflint.c:650 src/elflint.c:653 src/elflint.c:656 src/elflint.c:659
+#: src/elflint.c:662 src/elflint.c:665
+#, c-format
+msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
+msgstr ""
+
+#: src/elflint.c:668
+#, c-format
+msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
+msgstr ""
+
+#: src/elflint.c:678
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:687
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
+msgstr ""
+
+#: src/elflint.c:700
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: too large section index but no extended "
+"section index section\n"
+msgstr ""
+
+#: src/elflint.c:706
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
+"st_shndx (%<PRIu32>)\n"
+msgstr ""
+
+#: src/elflint.c:718
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
+msgstr ""
+
+#: src/elflint.c:726
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown type\n"
+msgstr ""
+
+#: src/elflint.c:732
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
+msgstr ""
+
+#: src/elflint.c:737
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
+msgstr ""
+
+#: src/elflint.c:745
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
+msgstr ""
+
+#: src/elflint.c:749
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
+msgstr ""
+
+#: src/elflint.c:753
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
+msgstr ""
+
+#: src/elflint.c:785
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:791 src/elflint.c:816 src/elflint.c:859
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu does not fit completely in referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:800
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
+"SHF_TLS flag set\n"
+msgstr ""
+
+#: src/elflint.c:810 src/elflint.c:852
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
+"[%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:837
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
+msgstr ""
+
+#: src/elflint.c:845
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:872
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+
+#: src/elflint.c:879
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
+"sh_info\n"
+msgstr ""
+
+#: src/elflint.c:886
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
+msgstr ""
+
+#: src/elflint.c:936
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section [%"
+"2d]\n"
+msgstr ""
+
+#: src/elflint.c:943
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:959
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %#<PRIx64> does not "
+"match %s section address %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:966
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size %<PRIu64> does not "
+"match %s section size %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:974
+#, c-format
+msgid ""
+"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
+"section\n"
+msgstr ""
+
+#: src/elflint.c:990
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC_ symbol value %#<PRIx64> does not match dynamic "
+"segment address %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:997
+#, c-format
+msgid ""
+"section [%2d] '%s': _DYNAMIC symbol size %<PRIu64> does not match dynamic "
+"segment size %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:1010
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
+"default visibility\n"
+msgstr ""
+
+#: src/elflint.c:1014
+#, c-format
+msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
+msgstr ""
+
+#: src/elflint.c:1059
+#, c-format
+msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
+msgstr ""
+
+#: src/elflint.c:1068 src/elflint.c:1120
+#, c-format
+msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
+msgstr ""
+
+#: src/elflint.c:1093 src/elflint.c:1145
+#, c-format
+msgid ""
+"section [%2d] '%s': relative relocations after index %d as specified by "
+"DT_RELCOUNT\n"
+msgstr ""
+
+#: src/elflint.c:1099 src/elflint.c:1151
+#, c-format
+msgid ""
+"section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
+"specified %d relative relocations\n"
+msgstr ""
+
+#: src/elflint.c:1111
+#, c-format
+msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
+msgstr ""
+
+#: src/elflint.c:1193
+#, c-format
+msgid "section [%2d] '%s': invalid destination section index\n"
+msgstr ""
+
+#: src/elflint.c:1206
+#, c-format
+msgid "section [%2d] '%s': invalid destination section type\n"
+msgstr ""
+
+#: src/elflint.c:1214
+#, c-format
+msgid "section [%2d] '%s': sh_info should be zero\n"
+msgstr ""
+
+#: src/elflint.c:1221
+#, c-format
+msgid "section [%2d] '%s': no relocations for merge-able sections possible\n"
+msgstr ""
+
+#: src/elflint.c:1228
+#, c-format
+msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
+msgstr ""
+
+#: src/elflint.c:1288
+#, c-format
+msgid "text relocation flag set but there is no read-only segment\n"
+msgstr ""
+
+#: src/elflint.c:1315
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid type\n"
+msgstr ""
+
+#: src/elflint.c:1323
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: relocation type invalid for the file "
+"type\n"
+msgstr ""
+
+#: src/elflint.c:1331
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
+msgstr ""
+
+#: src/elflint.c:1349
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
+"be used with %s\n"
+msgstr ""
+
+#: src/elflint.c:1366
+#, c-format
+msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:1381
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: copy relocation against symbol of type %"
+"s\n"
+msgstr ""
+
+#: src/elflint.c:1402
+#, c-format
+msgid ""
+"section [%2d] '%s': relocation %zu: read-only section modified but text "
+"relocation flag not set\n"
+msgstr ""
+
+#: src/elflint.c:1417
+#, c-format
+msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
+msgstr ""
+
+#: src/elflint.c:1456 src/elflint.c:1506
+#, c-format
+msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:1586
+#, c-format
+msgid "more than one dynamic section present\n"
+msgstr ""
+
+#: src/elflint.c:1604
+#, c-format
+msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
+msgstr ""
+
+#: src/elflint.c:1609 src/elflint.c:1901
+#, c-format
+msgid "section [%2d] '%s': sh_info not zero\n"
+msgstr ""
+
+#: src/elflint.c:1619
+#, c-format
+msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:1627
+#, c-format
+msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
+msgstr ""
+
+#: src/elflint.c:1634
+#, c-format
+msgid "section [%2d] '%s': entry %zu: unknown tag\n"
+msgstr ""
+
+#: src/elflint.c:1645
+#, c-format
+msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
+msgstr ""
+
+#: src/elflint.c:1655
+#, c-format
+msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
+msgstr ""
+
+#: src/elflint.c:1673
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
+msgstr ""
+
+#: src/elflint.c:1695
+#, 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:1738
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:1753
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %zu: %s value must be valid offset in section [%"
+"2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:1773 src/elflint.c:1801
+#, c-format
+msgid "section [%2d] '%s': contains %s entry but not %s\n"
+msgstr ""
+
+#: src/elflint.c:1785
+#, c-format
+msgid "section [%2d] '%s': mandatory tag %s not present\n"
+msgstr ""
+
+#: src/elflint.c:1794
+#, c-format
+msgid "section [%2d] '%s': no hash section present\n"
+msgstr ""
+
+#: src/elflint.c:1809 src/elflint.c:1816
+#, c-format
+msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
+msgstr ""
+
+#: src/elflint.c:1826 src/elflint.c:1830
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
+msgstr ""
+
+#: src/elflint.c:1836
+#, c-format
+msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
+msgstr ""
+
+#: src/elflint.c:1847 src/elflint.c:1851 src/elflint.c:1855 src/elflint.c:1859
+#, c-format
+msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
+msgstr ""
+
+#: src/elflint.c:1871
+#, c-format
+msgid ""
+"section [%2d] '%s': only relocatable files can have extended section index\n"
+msgstr ""
+
+#: src/elflint.c:1881
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index section not for symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1886
+#, c-format
+msgid "cannot get data for symbol section\n"
+msgstr ""
+
+#: src/elflint.c:1889
+#, c-format
+msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
+msgstr ""
+
+#: src/elflint.c:1896
+#, c-format
+msgid "section [%2d] '%s': extended index table too small for symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1911
+#, c-format
+msgid ""
+"section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
+"same symbol table\n"
+msgstr ""
+
+#: src/elflint.c:1922
+#, c-format
+msgid "symbol 0 should have zero extended section index\n"
+msgstr ""
+
+#: src/elflint.c:1934
+#, c-format
+msgid "cannot get data for symbol %zu\n"
+msgstr ""
+
+#: src/elflint.c:1939
+#, c-format
+msgid "extended section index is %<PRIu32> but symbol index is not XINDEX\n"
+msgstr ""
+
+#: src/elflint.c:1955 src/elflint.c:1996
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
+msgstr ""
+
+#: src/elflint.c:1967 src/elflint.c:2008
+#, c-format
+msgid "section [%2d] '%s': chain array too large\n"
+msgstr ""
+
+#: src/elflint.c:1976 src/elflint.c:2017
+#, c-format
+msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:1982
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2023
+#, c-format
+msgid "section [%2d] '%s': hash chain reference %<PRIu64> out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2038
+#, c-format
+msgid "section [%2d] '%s': bitmask size not power of 2: %u\n"
+msgstr ""
+
+#: src/elflint.c:2049
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table section is too small (is %ld, expected at "
+"least%ld)\n"
+msgstr ""
+
+#: src/elflint.c:2057
+#, c-format
+msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
+msgstr ""
+
+#: src/elflint.c:2089
+#, c-format
+msgid ""
+"section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
+msgstr ""
+
+#: src/elflint.c:2110
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
+"undefined\n"
+msgstr ""
+
+#: src/elflint.c:2121
+#, c-format
+msgid ""
+"section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
+msgstr ""
+
+#: src/elflint.c:2152
+#, c-format
+msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2157
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
+msgstr ""
+
+#: src/elflint.c:2163
+#, c-format
+msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
+msgstr ""
+
+#: src/elflint.c:2176
+#, c-format
+msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
+msgstr ""
+
+#: src/elflint.c:2194
+#, c-format
+msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
+msgstr ""
+
+#: src/elflint.c:2202
+#, c-format
+msgid "section [%2d] '%s': hash table entry size incorrect\n"
+msgstr ""
+
+#: src/elflint.c:2207
+#, c-format
+msgid "section [%2d] '%s': not marked to be allocated\n"
+msgstr ""
+
+#: src/elflint.c:2212
+#, c-format
+msgid ""
+"section [%2d] '%s': hash table has not even room for initial administrative "
+"entries\n"
+msgstr ""
+
+#: src/elflint.c:2260
+#, c-format
+msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
+msgstr ""
+
+#: src/elflint.c:2338 src/elflint.c:2342
+#, c-format
+msgid "section [%2zu] '%s': reference to symbol index 0\n"
+msgstr ""
+
+#: src/elflint.c:2349
+#, 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:2361
+#, 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:2377
+#, c-format
+msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
+msgstr ""
+
+#: src/elflint.c:2397
+#, c-format
+msgid ""
+"section [%2d] '%s': section groups only allowed in relocatable object files\n"
+msgstr ""
+
+#: src/elflint.c:2408
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol table: %s\n"
+msgstr ""
+
+#: src/elflint.c:2413
+#, c-format
+msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
+msgstr ""
+
+#: src/elflint.c:2419
+#, c-format
+msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
+msgstr ""
+
+#: src/elflint.c:2424
+#, c-format
+msgid "section [%2d] '%s': sh_flags not zero\n"
+msgstr ""
+
+#: src/elflint.c:2431
+#, c-format
+msgid "section [%2d] '%s': cannot get symbol for signature\n"
+msgstr ""
+
+#: src/elflint.c:2436
+#, c-format
+msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
+msgstr ""
+
+#: src/elflint.c:2442
+#, c-format
+msgid "section [%2d] '%s': sh_flags not set correctly\n"
+msgstr ""
+
+#: src/elflint.c:2448
+#, c-format
+msgid "section [%2d] '%s': cannot get data: %s\n"
+msgstr ""
+
+#: src/elflint.c:2457
+#, c-format
+msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
+msgstr ""
+
+#: src/elflint.c:2462
+#, c-format
+msgid "section [%2d] '%s': section group without flags word\n"
+msgstr ""
+
+#: src/elflint.c:2468
+#, c-format
+msgid "section [%2d] '%s': section group without member\n"
+msgstr ""
+
+#: src/elflint.c:2472
+#, c-format
+msgid "section [%2d] '%s': section group with only one member\n"
+msgstr ""
+
+#: src/elflint.c:2483
+#, c-format
+msgid "section [%2d] '%s': unknown section group flags\n"
+msgstr ""
+
+#: src/elflint.c:2495
+#, c-format
+msgid "section [%2d] '%s': section index %Zu out of range\n"
+msgstr ""
+
+#: src/elflint.c:2504
+#, c-format
+msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
+msgstr ""
+
+#: src/elflint.c:2511
+#, c-format
+msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
+msgstr ""
+
+#: src/elflint.c:2517
+#, c-format
+msgid ""
+"section [%2d] '%s': element %Zu references section [%2d] '%s' without "
+"SHF_GROUP flag set\n"
+msgstr ""
+
+#: src/elflint.c:2524
+#, c-format
+msgid "section [%2d] '%s' is contained in more than one section group\n"
+msgstr ""
+
+#: src/elflint.c:2713
+#, 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:2724
+#, c-format
+msgid ""
+"section [%2d] '%s' has different number of entries than symbol table [%2d] '%"
+"s'\n"
+msgstr ""
+
+#: src/elflint.c:2740
+#, c-format
+msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
+msgstr ""
+
+#: src/elflint.c:2756
+#, c-format
+msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
+msgstr ""
+
+#: src/elflint.c:2764
+#, c-format
+msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
+msgstr ""
+
+#: src/elflint.c:2778
+#, c-format
+msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
+msgstr ""
+
+#: src/elflint.c:2783
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %d: version index %d is for defined version\n"
+msgstr ""
+
+#: src/elflint.c:2793
+#, c-format
+msgid ""
+"section [%2d] '%s': symbol %d: version index %d is for requested version\n"
+msgstr ""
+
+#: src/elflint.c:2845
+#, c-format
+msgid "more than one version reference section present\n"
+msgstr ""
+
+#: src/elflint.c:2853 src/elflint.c:2982
+#, c-format
+msgid "section [%2d] '%s': sh_link does not link to string table\n"
+msgstr ""
+
+#: src/elflint.c:2876 src/elflint.c:3034
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong version %d\n"
+msgstr ""
+
+#: src/elflint.c:2882 src/elflint.c:3040
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:2890
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid file reference\n"
+msgstr ""
+
+#: src/elflint.c:2898
+#, c-format
+msgid "section [%2d] '%s': entry %d references unknown dependency\n"
+msgstr ""
+
+#: src/elflint.c:2910
+#, c-format
+msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
+msgstr ""
+
+#: src/elflint.c:2917
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
+"reference\n"
+msgstr ""
+
+#: src/elflint.c:2924
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: %"
+"#x, expected %#x\n"
+msgstr ""
+
+#: src/elflint.c:2934
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
+"name '%s'\n"
+msgstr ""
+
+#: src/elflint.c:2945
+#, c-format
+msgid ""
+"section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
+msgstr ""
+
+#: src/elflint.c:2961 src/elflint.c:3119
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
+msgstr ""
+
+#: src/elflint.c:2974
+#, c-format
+msgid "more than one version definition section present\n"
+msgstr ""
+
+#: src/elflint.c:3019
+#, c-format
+msgid "section [%2d] '%s': more than one BASE definition\n"
+msgstr ""
+
+#: src/elflint.c:3023
+#, c-format
+msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
+msgstr ""
+
+#: src/elflint.c:3029
+#, c-format
+msgid "section [%2d] '%s': entry %d has unknown flag\n"
+msgstr ""
+
+#: src/elflint.c:3053
+#, c-format
+msgid "section [%2d] '%s': entry %d has invalid name reference\n"
+msgstr ""
+
+#: src/elflint.c:3060
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
+msgstr ""
+
+#: src/elflint.c:3069
+#, c-format
+msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
+msgstr ""
+
+#: src/elflint.c:3088
+#, c-format
+msgid ""
+"section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:3103
+#, c-format
+msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
+msgstr ""
+
+#: src/elflint.c:3125
+#, c-format
+msgid "section [%2d] '%s': no BASE definition\n"
+msgstr ""
+
+#: src/elflint.c:3141
+#, c-format
+msgid "section [%2d] '%s': unknown parent version '%s'\n"
+msgstr ""
+
+#: src/elflint.c:3154
+#, c-format
+msgid "section [%2d] '%s': empty object attributes section\n"
+msgstr ""
+
+#: src/elflint.c:3175
+#, c-format
+msgid "section [%2d] '%s': unrecognized attribute format\n"
+msgstr ""
+
+#: src/elflint.c:3191
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: zero length field in attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3200
+#, c-format
+msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3212
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
+msgstr ""
+
+#: src/elflint.c:3229
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
+msgstr ""
+
+#: src/elflint.c:3238
+#, c-format
+msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3247
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
+msgstr ""
+
+#: src/elflint.c:3260
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
+msgstr ""
+
+#: src/elflint.c:3271
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
+msgstr ""
+
+#: src/elflint.c:3289
+#, c-format
+msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
+msgstr ""
+
+#: src/elflint.c:3300
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
+msgstr ""
+
+#: src/elflint.c:3313
+#, c-format
+msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
+msgstr ""
+
+#: src/elflint.c:3317
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: unrecognized %s attribute value %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:3327
+#, c-format
+msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
+msgstr ""
+
+#: src/elflint.c:3333
+#, c-format
+msgid ""
+"section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
+msgstr ""
+
+#: src/elflint.c:3422
+#, c-format
+msgid "cannot get section header of zeroth section\n"
+msgstr ""
+
+#: src/elflint.c:3426
+#, c-format
+msgid "zeroth section has nonzero name\n"
+msgstr ""
+
+#: src/elflint.c:3428
+#, c-format
+msgid "zeroth section has nonzero type\n"
+msgstr ""
+
+#: src/elflint.c:3430
+#, c-format
+msgid "zeroth section has nonzero flags\n"
+msgstr ""
+
+#: src/elflint.c:3432
+#, c-format
+msgid "zeroth section has nonzero address\n"
+msgstr ""
+
+#: src/elflint.c:3434
+#, c-format
+msgid "zeroth section has nonzero offset\n"
+msgstr ""
+
+#: src/elflint.c:3436
+#, c-format
+msgid "zeroth section has nonzero align value\n"
+msgstr ""
+
+#: src/elflint.c:3438
+#, c-format
+msgid "zeroth section has nonzero entry size value\n"
+msgstr ""
+
+#: src/elflint.c:3441
+#, c-format
+msgid ""
+"zeroth section has nonzero size value while ELF header has nonzero shnum "
+"value\n"
+msgstr ""
+
+#: src/elflint.c:3445
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in shstrndx\n"
+msgstr ""
+
+#: src/elflint.c:3449
+#, c-format
+msgid ""
+"zeroth section has nonzero link value while ELF header does not signal "
+"overflow in phnum\n"
+msgstr ""
+
+#: src/elflint.c:3466
+#, c-format
+msgid "cannot get section header for section [%2zu] '%s': %s\n"
+msgstr ""
+
+#: src/elflint.c:3475
+#, c-format
+msgid "section [%2zu]: invalid name\n"
+msgstr ""
+
+#: src/elflint.c:3502
+#, c-format
+msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3518
+#, c-format
+msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3535
+#, c-format
+msgid ""
+"section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
+msgstr ""
+
+#: src/elflint.c:3553
+#, c-format
+msgid "section [%2zu] '%s' present in object file\n"
+msgstr ""
+
+#: src/elflint.c:3559 src/elflint.c:3591
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
+msgstr ""
+
+#: src/elflint.c:3564 src/elflint.c:3596
+#, c-format
+msgid ""
+"section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
+"segments\n"
+msgstr ""
+
+#: src/elflint.c:3572
+#, c-format
+msgid ""
+"section [%2zu] '%s' is extension section index table in non-object file\n"
+msgstr ""
+
+#: src/elflint.c:3615
+#, c-format
+msgid "section [%2zu] '%s': size not multiple of entry size\n"
+msgstr ""
+
+#: src/elflint.c:3620
+#, c-format
+msgid "cannot get section header\n"
+msgstr ""
+
+#: src/elflint.c:3630
+#, c-format
+msgid "section [%2zu] '%s' has unsupported type %d\n"
+msgstr ""
+
+#: src/elflint.c:3644
+#, c-format
+msgid ""
+"section [%2zu] '%s' contains invalid processor-specific flag(s) %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:3651
+#, c-format
+msgid "section [%2zu] '%s' contains unknown flag(s) %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:3659
+#, c-format
+msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
+msgstr ""
+
+#: src/elflint.c:3667
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in link value\n"
+msgstr ""
+
+#: src/elflint.c:3672
+#, c-format
+msgid "section [%2zu] '%s': invalid section reference in info value\n"
+msgstr ""
+
+#: src/elflint.c:3679
+#, c-format
+msgid "section [%2zu] '%s': strings flag set without merge flag\n"
+msgstr ""
+
+#: src/elflint.c:3684
+#, c-format
+msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
+msgstr ""
+
+#: src/elflint.c:3702
+#, c-format
+msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
+msgstr ""
+
+#: src/elflint.c:3711
+#, c-format
+msgid "section [%2zu] '%s' is both executable and writable\n"
+msgstr ""
+
+#: src/elflint.c:3738
+#, c-format
+msgid ""
+"section [%2zu] '%s' not fully contained in segment of program header entry %"
+"d\n"
+msgstr ""
+
+#: src/elflint.c:3746
+#, 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:3755
+#, 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:3766
+#, c-format
+msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
+msgstr ""
+
+#: src/elflint.c:3776
+#, c-format
+msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
+msgstr ""
+
+#: src/elflint.c:3786
+#, c-format
+msgid ""
+"section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:3792
+#, 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:3800
+#, c-format
+msgid ""
+"section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
+msgstr ""
+
+#: src/elflint.c:3851
+#, c-format
+msgid "more than one version symbol table present\n"
+msgstr ""
+
+#: src/elflint.c:3874
+#, c-format
+msgid "INTERP program header entry but no .interp section\n"
+msgstr ""
+
+#: src/elflint.c:3885
+#, c-format
+msgid ""
+"loadable segment [%u] is executable but contains no executable sections\n"
+msgstr ""
+
+#: src/elflint.c:3891
+#, c-format
+msgid "loadable segment [%u] is writable but contains no writable sections\n"
+msgstr ""
+
+#: src/elflint.c:3902
+#, c-format
+msgid ""
+"no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
+"exist\n"
+msgstr ""
+
+#: src/elflint.c:3915
+#, c-format
+msgid "duplicate version index %d\n"
+msgstr ""
+
+#: src/elflint.c:3929
+#, c-format
+msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
+msgstr ""
+
+#: src/elflint.c:3978
+#, c-format
+msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %<PRIu64>\n"
+msgstr ""
+
+#: src/elflint.c:3982
+#, c-format
+msgid ""
+"section [%2d] '%s': unknown core file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4005
+#, c-format
+msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4009
+#, c-format
+msgid ""
+"section [%2d] '%s': unknown object file note type %<PRIu32> at offset %Zu\n"
+msgstr ""
+
+#: src/elflint.c:4026
+#, c-format
+msgid "phdr[%d]: no note entries defined for the type of file\n"
+msgstr ""
+
+#: src/elflint.c:4045
+#, c-format
+msgid "phdr[%d]: cannot get content of note section: %s\n"
+msgstr ""
+
+#: src/elflint.c:4048
+#, c-format
+msgid "phdr[%d]: extra %<PRIu64> bytes after last note\n"
+msgstr ""
+
+#: src/elflint.c:4069
+#, c-format
+msgid "section [%2d] '%s': no note entries defined for the type of file\n"
+msgstr ""
+
+#: src/elflint.c:4076
+#, c-format
+msgid "section [%2d] '%s': cannot get content of note section\n"
+msgstr ""
+
+#: src/elflint.c:4079
+#, c-format
+msgid "section [%2d] '%s': extra %<PRIu64> bytes after last note\n"
+msgstr ""
+
+#: src/elflint.c:4097
+#, c-format
+msgid ""
+"only executables, shared objects, and core files can have program headers\n"
+msgstr ""
+
+#: src/elflint.c:4112
+#, c-format
+msgid "cannot get program header entry %d: %s\n"
+msgstr ""
+
+#: src/elflint.c:4121
+#, c-format
+msgid "program header entry %d: unknown program header entry type %#<PRIx64>\n"
+msgstr ""
+
+#: src/elflint.c:4132
+#, c-format
+msgid "more than one INTERP entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4140
+#, c-format
+msgid "more than one TLS entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4147
+#, c-format
+msgid "static executable cannot have dynamic sections\n"
+msgstr ""
+
+#: src/elflint.c:4161
+#, c-format
+msgid "dynamic section reference in program header has wrong offset\n"
+msgstr ""
+
+#: src/elflint.c:4164
+#, c-format
+msgid "dynamic section size mismatch in program and section header\n"
+msgstr ""
+
+#: src/elflint.c:4174
+#, c-format
+msgid "more than one GNU_RELRO entry in program header\n"
+msgstr ""
+
+#: src/elflint.c:4195
+#, c-format
+msgid "loadable segment GNU_RELRO applies to is not writable\n"
+msgstr ""
+
+#: src/elflint.c:4198
+#, c-format
+msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
+msgstr ""
+
+#: src/elflint.c:4206 src/elflint.c:4229
+#, c-format
+msgid "%s segment not contained in a loaded segment\n"
+msgstr ""
+
+#: src/elflint.c:4235
+#, c-format
+msgid "program header offset in ELF header and PHDR entry do not match"
+msgstr ""
+
+#: src/elflint.c:4259
+#, c-format
+msgid "call frame search table reference in program header has wrong offset\n"
+msgstr ""
+
+#: src/elflint.c:4262
+#, c-format
+msgid "call frame search table size mismatch in program and section header\n"
+msgstr ""
+
+#: src/elflint.c:4275
+#, c-format
+msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
+msgstr ""
+
+#: src/elflint.c:4283
+#, c-format
+msgid "call frame search table must be allocated\n"
+msgstr ""
+
+#: src/elflint.c:4286
+#, c-format
+msgid "section [%2zu] '%s' must be allocated\n"
+msgstr ""
+
+#: src/elflint.c:4290
+#, c-format
+msgid "call frame search table must not be writable\n"
+msgstr ""
+
+#: src/elflint.c:4293
+#, c-format
+msgid "section [%2zu] '%s' must not be writable\n"
+msgstr ""
+
+#: src/elflint.c:4298
+#, c-format
+msgid "call frame search table must not be executable\n"
+msgstr ""
+
+#: src/elflint.c:4301
+#, c-format
+msgid "section [%2zu] '%s' must not be executable\n"
+msgstr ""
+
+#: src/elflint.c:4312
+#, c-format
+msgid "program header entry %d: file size greater than memory size\n"
+msgstr ""
+
+#: src/elflint.c:4319
+#, c-format
+msgid "program header entry %d: alignment not a power of 2\n"
+msgstr ""
+
+#: src/elflint.c:4322
+#, c-format
+msgid ""
+"program header entry %d: file offset and virtual address not module of "
+"alignment\n"
+msgstr ""
+
+#: src/elflint.c:4335
+#, 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:4369
+#, c-format
+msgid "cannot read ELF header: %s\n"
+msgstr ""
+
+#: src/elflint.c:4395
+#, c-format
+msgid "text relocation flag set but not needed\n"
+msgstr ""
+
+#: src/findtextrel.c:70
+msgid "Input Selection:"
+msgstr ""
+
+#: src/findtextrel.c:71
+msgid "Prepend PATH to all file names"
+msgstr ""
+
+#: src/findtextrel.c:73
+msgid "Use PATH as root of debuginfo hierarchy"
+msgstr ""
+
+#: src/findtextrel.c:80
+msgid "Locate source of text relocations in FILEs (a.out by default)."
+msgstr ""
+
+#: src/findtextrel.c:84 src/nm.c:111 src/objdump.c:80 src/size.c:92
+#: src/strings.c:92 src/strip.c:97
+msgid "[FILE...]"
+msgstr ""
+
+#: src/findtextrel.c:246
+#, c-format
+msgid "cannot get ELF header '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:257
+#, c-format
+msgid "'%s' is not a DSO or PIE"
+msgstr ""
+
+#: src/findtextrel.c:274
+#, c-format
+msgid "getting get section header of section %zu: %s"
+msgstr ""
+
+#: src/findtextrel.c:292
+#, c-format
+msgid "cannot read dynamic section: %s"
+msgstr ""
+
+#: src/findtextrel.c:307
+#, c-format
+msgid "no text relocations reported in '%s'"
+msgstr ""
+
+#: src/findtextrel.c:319
+#, c-format
+msgid "while reading ELF file"
+msgstr ""
+
+#: src/findtextrel.c:328 src/findtextrel.c:345
+#, c-format
+msgid "cannot get program header index at offset %d: %s"
+msgstr ""
+
+#: src/findtextrel.c:397
+#, c-format
+msgid "cannot get section header of section %Zu: %s"
+msgstr ""
+
+#: src/findtextrel.c:409
+#, c-format
+msgid "cannot get symbol table section %zu in '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:429 src/findtextrel.c:452
+#, c-format
+msgid "cannot get relocation at index %d in section %zu in '%s': %s"
+msgstr ""
+
+#: src/findtextrel.c:517
+#, c-format
+msgid "%s not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:570
+#, c-format
+msgid ""
+"the file containing the function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:577 src/findtextrel.c:597
+#, c-format
+msgid ""
+"the file containing the function '%s' might not be compiled with -fpic/-"
+"fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:585
+#, c-format
+msgid ""
+"either the file containing the function '%s' or the file containing the "
+"function '%s' is not compiled with -fpic/-fPIC\n"
+msgstr ""
+
+#: src/findtextrel.c:605
+#, c-format
+msgid ""
+"a relocation modifies memory at offset %llu in a write-protected segment\n"
+msgstr ""
+
+#: src/i386_ld.c:210
+#, c-format
+msgid "cannot allocate PLT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:232
+#, c-format
+msgid "cannot allocate PLTREL section: %s"
+msgstr ""
+
+#: src/i386_ld.c:253
+#, c-format
+msgid "cannot allocate GOT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:274
+#, c-format
+msgid "cannot allocate GOTPLT section: %s"
+msgstr ""
+
+#: src/i386_ld.c:661
+#, c-format
+msgid "initial-executable TLS relocation cannot be used "
+msgstr ""
+
+#: src/ld.c:87
+msgid "Input File Control:"
+msgstr ""
+
+#: src/ld.c:89
+msgid "Include whole archives in the output from now on."
+msgstr ""
+
+#: src/ld.c:91
+msgid "Stop including the whole archives in the output."
+msgstr ""
+
+#: src/ld.c:92 src/ld.c:106 src/ld.c:184
+msgid "FILE"
+msgstr ""
+
+#: src/ld.c:93
+msgid "Start a group."
+msgstr ""
+
+#: src/ld.c:94
+msgid "End a group."
+msgstr ""
+
+#: src/ld.c:95
+msgid "PATH"
+msgstr ""
+
+#: src/ld.c:96
+msgid "Add PATH to list of directories files are searched in."
+msgstr ""
+
+#: src/ld.c:98
+msgid "Only set DT_NEEDED for following dynamic libs if actually used"
+msgstr ""
+
+#: src/ld.c:100
+msgid "Always set DT_NEEDED for following dynamic libs"
+msgstr ""
+
+#: src/ld.c:102
+msgid "Ignore LD_LIBRARY_PATH environment variable."
+msgstr ""
+
+#: src/ld.c:105
+msgid "Output File Control:"
+msgstr ""
+
+#: src/ld.c:106
+msgid "Place output in FILE."
+msgstr ""
+
+#: src/ld.c:109
+msgid "Object is marked to not use default search path at runtime."
+msgstr ""
+
+#: src/ld.c:111
+msgid "Same as --whole-archive."
+msgstr ""
+
+#: src/ld.c:112
+msgid ""
+"Default rules of extracting from archive; weak references are not enough."
+msgstr ""
+
+#: src/ld.c:116
+msgid "Weak references cause extraction from archive."
+msgstr ""
+
+#: src/ld.c:118
+msgid "Allow multiple definitions; first is used."
+msgstr ""
+
+#: src/ld.c:120
+msgid "Disallow/allow undefined symbols in DSOs."
+msgstr ""
+
+#: src/ld.c:123
+msgid "Object requires immediate handling of $ORIGIN."
+msgstr ""
+
+#: src/ld.c:125
+msgid "Relocation will not be processed lazily."
+msgstr ""
+
+#: src/ld.c:127
+msgid "Object cannot be unloaded at runtime."
+msgstr ""
+
+#: src/ld.c:129
+msgid "Mark object to be initialized first."
+msgstr ""
+
+#: src/ld.c:131
+msgid "Enable/disable lazy-loading flag for following dependencies."
+msgstr ""
+
+#: src/ld.c:133
+msgid "Mark object as not loadable with 'dlopen'."
+msgstr ""
+
+#: src/ld.c:135
+msgid "Ignore/record dependencies on unused DSOs."
+msgstr ""
+
+#: src/ld.c:137
+msgid "Generated DSO will be a system library."
+msgstr ""
+
+#: src/ld.c:138
+msgid "ADDRESS"
+msgstr ""
+
+#: src/ld.c:138
+msgid "Set entry point address."
+msgstr ""
+
+#: src/ld.c:141
+msgid "Do not link against shared libraries."
+msgstr ""
+
+#: src/ld.c:144
+msgid "Prefer linking against shared libraries."
+msgstr ""
+
+#: src/ld.c:145
+msgid "Export all dynamic symbols."
+msgstr ""
+
+#: src/ld.c:146
+msgid "Strip all symbols."
+msgstr ""
+
+#: src/ld.c:147
+msgid "Strip debugging symbols."
+msgstr ""
+
+#: src/ld.c:149
+msgid "Assume pagesize for the target system to be SIZE."
+msgstr ""
+
+#: src/ld.c:151
+msgid "Set runtime DSO search path."
+msgstr ""
+
+#: src/ld.c:154
+msgid "Set link time DSO search path."
+msgstr ""
+
+#: src/ld.c:155
+msgid "Generate dynamic shared object."
+msgstr ""
+
+#: src/ld.c:156
+msgid "Generate relocatable object."
+msgstr ""
+
+#: src/ld.c:159
+msgid "Causes symbol not assigned to a version be reduced to local."
+msgstr ""
+
+#: src/ld.c:160
+msgid "Remove unused sections."
+msgstr ""
+
+#: src/ld.c:163
+msgid "Don't remove unused sections."
+msgstr ""
+
+#: src/ld.c:164
+msgid "Set soname of shared object."
+msgstr ""
+
+#: src/ld.c:165
+msgid "Set the dynamic linker name."
+msgstr ""
+
+#: src/ld.c:168
+msgid "Add/suppress addition indentifying link-editor to .comment section."
+msgstr ""
+
+#: src/ld.c:171
+msgid "Create .eh_frame_hdr section"
+msgstr ""
+
+#: src/ld.c:173
+msgid "Set hash style to sysv, gnu or both."
+msgstr ""
+
+#: src/ld.c:175
+msgid "Generate build ID note (md5, sha1 (default), uuid)."
+msgstr ""
+
+#: src/ld.c:177
+msgid "Linker Operation Control:"
+msgstr ""
+
+#: src/ld.c:178
+msgid "Verbose messages."
+msgstr ""
+
+#: src/ld.c:179
+msgid "Trace file opens."
+msgstr ""
+
+#: src/ld.c:181
+msgid "Trade speed for less memory usage"
+msgstr ""
+
+#: src/ld.c:182
+msgid "LEVEL"
+msgstr ""
+
+#: src/ld.c:183
+msgid "Set optimization level to LEVEL."
+msgstr ""
+
+#: src/ld.c:184
+msgid "Use linker script in FILE."
+msgstr ""
+
+#: src/ld.c:187
+msgid "Select to get parser debug information"
+msgstr ""
+
+#: src/ld.c:190
+msgid "Read version information from FILE."
+msgstr ""
+
+#: src/ld.c:191
+msgid "Set emulation to NAME."
+msgstr ""
+
+#: src/ld.c:197
+msgid "Combine object and archive files."
+msgstr ""
+
+#: src/ld.c:200
+msgid "[FILE]..."
+msgstr ""
+
+#: src/ld.c:333
+#, c-format
+msgid "At least one input file needed"
+msgstr ""
+
+#: src/ld.c:349
+#, c-format
+msgid "error while preparing linking"
+msgstr ""
+
+#: src/ld.c:356
+#, c-format
+msgid "cannot open linker script '%s'"
+msgstr ""
+
+#: src/ld.c:397
+#, c-format
+msgid "-( without matching -)"
+msgstr ""
+
+#: src/ld.c:572 src/ld.c:610
+#, c-format
+msgid "only one option of -G and -r is allowed"
+msgstr ""
+
+#: src/ld.c:594
+#, c-format
+msgid "more than one '-m' parameter"
+msgstr ""
+
+#: src/ld.c:604 src/ld.c:1013
+#, c-format
+msgid "unknown option `-%c %s'"
+msgstr ""
+
+#: src/ld.c:646
+#, c-format
+msgid "invalid page size value '%s': ignored"
+msgstr ""
+
+#: src/ld.c:687
+#, c-format
+msgid "invalid hash style '%s'"
+msgstr ""
+
+#: src/ld.c:697
+#, c-format
+msgid "invalid build-ID style '%s'"
+msgstr ""
+
+#: src/ld.c:785
+#, c-format
+msgid "More than one output file name given."
+msgstr ""
+
+#: src/ld.c:802
+#, c-format
+msgid "Invalid optimization level `%s'"
+msgstr ""
+
+#: src/ld.c:850
+#, c-format
+msgid "nested -( -) groups are not allowed"
+msgstr ""
+
+#: src/ld.c:869
+#, c-format
+msgid "-) without matching -("
+msgstr ""
+
+#: src/ld.c:1046
+#, c-format
+msgid "unknown option '-%c %s'"
+msgstr ""
+
+#: src/ld.c:1150
+#, c-format
+msgid "could not find input file to determine output file format"
+msgstr ""
+
+#: src/ld.c:1152
+#, c-format
+msgid "try again with an appropriate '-m' parameter"
+msgstr ""
+
+#: src/ld.c:1446
+#, c-format
+msgid "cannot read version script '%s'"
+msgstr ""
+
+#: src/ld.c:1512 src/ld.c:1551
+#, c-format
+msgid "duplicate definition of '%s' in linker script"
+msgstr ""
+
+#: src/ldgeneric.c:209 src/ldgeneric.c:5151
+#, c-format
+msgid "cannot create string table"
+msgstr ""
+
+#: src/ldgeneric.c:255
+#, c-format
+msgid "cannot load ld backend library '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:265
+#, c-format
+msgid "cannot find init function in ld backend library '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:310
+#, c-format
+msgid "%s listed more than once as input"
+msgstr ""
+
+#: src/ldgeneric.c:424
+#, c-format
+msgid "%s (for -l%s)\n"
+msgstr ""
+
+#: src/ldgeneric.c:425
+#, c-format
+msgid "%s (for DT_NEEDED %s)\n"
+msgstr ""
+
+#: src/ldgeneric.c:573
+#, c-format
+msgid "Warning: type of `%s' changed from %s in %s to %s in %s"
+msgstr ""
+
+#: src/ldgeneric.c:586
+#, c-format
+msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
+msgstr ""
+
+#: src/ldgeneric.c:661 src/ldgeneric.c:1122 src/readelf.c:629 src/strip.c:543
+#, c-format
+msgid "cannot determine number of sections: %s"
+msgstr ""
+
+#: src/ldgeneric.c:677
+#, c-format
+msgid "(%s+%#<PRIx64>): multiple definition of %s `%s'\n"
+msgstr ""
+
+#: src/ldgeneric.c:700
+#, c-format
+msgid "(%s+%#<PRIx64>): first defined here\n"
+msgstr ""
+
+#: src/ldgeneric.c:819
+#, c-format
+msgid "%s: cannot get section group data: %s"
+msgstr ""
+
+#: src/ldgeneric.c:840
+#, c-format
+msgid "%s: section '%s' with group flag set does not belong to any group"
+msgstr ""
+
+#: src/ldgeneric.c:885
+#, c-format
+msgid "%s: section [%2d] '%s' is not in the correct section group"
+msgstr ""
+
+#: src/ldgeneric.c:1156 src/ldgeneric.c:1413 src/ldgeneric.c:1422
+#: src/ldgeneric.c:1481 src/ldgeneric.c:1490 src/ldgeneric.c:1753
+#: src/ldgeneric.c:2005
+#, c-format
+msgid "%s: invalid ELF file (%s:%d)\n"
+msgstr ""
+
+#: src/ldgeneric.c:1250
+#, c-format
+msgid "%s: only files of type ET_REL might contain section groups"
+msgstr ""
+
+#: src/ldgeneric.c:1302
+#, c-format
+msgid "%s: cannot determine signature of section group [%2zd] '%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:1314
+#, c-format
+msgid "%s: cannot get content of section group [%2zd] '%s': %s'"
+msgstr ""
+
+#: src/ldgeneric.c:1328
+#, c-format
+msgid ""
+"%s: group member %zu of section group [%2zd] '%s' has too high index: %"
+"<PRIu32>"
+msgstr ""
+
+#: src/ldgeneric.c:1350
+#, c-format
+msgid "%s: section '%s' has unknown type: %d"
+msgstr ""
+
+#: src/ldgeneric.c:1729
+#, c-format
+msgid "cannot get descriptor for ELF file (%s:%d): %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:1899
+#, c-format
+msgid "cannot read archive `%s': %s"
+msgstr ""
+
+#: src/ldgeneric.c:2020
+#, c-format
+msgid "file of type %s cannot be linked in\n"
+msgstr ""
+
+#: src/ldgeneric.c:2032
+#, c-format
+msgid "%s: input file incompatible with ELF machine type %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:2044
+#, c-format
+msgid "%s: cannot get section header string table index: %s\n"
+msgstr ""
+
+#: src/ldgeneric.c:2073
+#, c-format
+msgid "cannot use DSO '%s' when generating relocatable object file"
+msgstr ""
+
+#: src/ldgeneric.c:2158
+#, c-format
+msgid "input file '%s' ignored"
+msgstr ""
+
+#: src/ldgeneric.c:2372
+#, c-format
+msgid "undefined symbol `%s' in %s"
+msgstr ""
+
+#: src/ldgeneric.c:2702
+#, c-format
+msgid "cannot create ELF descriptor for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:2709
+#, c-format
+msgid "could not create ELF header for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:3224 src/ldgeneric.c:3294 src/ldgeneric.c:3330
+#: src/ldgeneric.c:4457 src/ldgeneric.c:4506 src/ldgeneric.c:4538
+#: src/ldgeneric.c:4773 src/ldgeneric.c:4828 src/ldgeneric.c:5075
+#: src/ldgeneric.c:5131 src/ldgeneric.c:5600 src/ldgeneric.c:5612
+#, c-format
+msgid "cannot create section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:3444
+#, c-format
+msgid "address computation expression contains variable '%s'"
+msgstr ""
+
+#: src/ldgeneric.c:3489
+#, c-format
+msgid ""
+"argument '%<PRIuMAX>' of ALIGN in address computation expression is no power "
+"of two"
+msgstr ""
+
+#: src/ldgeneric.c:3684
+#, c-format
+msgid "cannot find entry symbol '%s': defaulting to %#0*<PRIx64>"
+msgstr ""
+
+#: src/ldgeneric.c:3690
+#, c-format
+msgid "no entry symbol specified: defaulting to %#0*<PRIx64>"
+msgstr ""
+
+#: src/ldgeneric.c:3920
+#, c-format
+msgid "cannot create GNU hash table section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4071
+#, c-format
+msgid "cannot create hash table section for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4114
+#, c-format
+msgid "cannot create build ID section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4191
+#, c-format
+msgid "cannot convert section data to file format: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4200
+#, c-format
+msgid "cannot convert section data to memory format: %s"
+msgstr ""
+
+#: src/ldgeneric.c:4261
+#, c-format
+msgid "cannot read enough data for UUID"
+msgstr ""
+
+#: src/ldgeneric.c:4358 src/ldgeneric.c:4379 src/ldgeneric.c:4408
+#: src/ldgeneric.c:6062
+#, c-format
+msgid "cannot create symbol table for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5300 src/ldgeneric.c:5852
+#, c-format
+msgid "section index too large in dynamic symbol table"
+msgstr ""
+
+#: src/ldgeneric.c:5745
+#, c-format
+msgid "cannot create versioning section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5818
+#, c-format
+msgid "cannot create dynamic symbol table for output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:5994
+#, c-format
+msgid "cannot create versioning data: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6094 src/ldgeneric.c:6107 src/ldgeneric.c:6171
+#: src/ldgeneric.c:6179
+#, c-format
+msgid "cannot create section header string section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6101
+#, c-format
+msgid "cannot create section header string section"
+msgstr ""
+
+#: src/ldgeneric.c:6259
+#, c-format
+msgid "cannot create program header: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6267
+#, c-format
+msgid "while determining file layout: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6388
+#, c-format
+msgid "internal error: non-nobits section follows nobits section"
+msgstr ""
+
+#: src/ldgeneric.c:6925
+#, c-format
+msgid "cannot get header of 0th section: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6941 src/unstrip.c:1808
+#, c-format
+msgid "cannot update ELF header: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6972
+#, c-format
+msgid "linker backend didn't specify function to relocate section"
+msgstr ""
+
+#: src/ldgeneric.c:6984
+#, c-format
+msgid "while writing output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6989
+#, c-format
+msgid "while finishing output file: %s"
+msgstr ""
+
+#: src/ldgeneric.c:6995
+#, c-format
+msgid "cannot stat output file"
+msgstr ""
+
+#: src/ldgeneric.c:7011
+#, c-format
+msgid "WARNING: temporary output file overwritten before linking finished"
+msgstr ""
+
+#: src/ldgeneric.c:7064 src/ldgeneric.c:7075 src/ldgeneric.c:7086
+#: src/ldgeneric.c:7097 src/ldgeneric.c:7116 src/ldgeneric.c:7129
+#: src/ldgeneric.c:7141
+#, c-format
+msgid "no machine specific '%s' implementation"
+msgstr ""
+
+#: src/ldscript.y:178
+msgid "mode for segment invalid\n"
+msgstr ""
+
+#: src/ldscript.y:465
+#, c-format
+msgid "while reading version script '%s': %s at line %d"
+msgstr ""
+
+#: src/ldscript.y:466
+#, c-format
+msgid "while reading linker script '%s': %s at line %d"
+msgstr ""
+
+#: src/ldscript.y:745
+#, c-format
+msgid "symbol '%s' is declared both local and global for unnamed version"
+msgstr ""
+
+#: src/ldscript.y:747
+#, c-format
+msgid "symbol '%s' is declared both local and global for version '%s'"
+msgstr ""
+
+#: src/ldscript.y:767 src/ldscript.y:774
+#, c-format
+msgid "default visibility set as local and global"
+msgstr ""
+
+#: src/nm.c:74 src/strip.c:73
+msgid "Output selection:"
+msgstr ""
+
+#: src/nm.c:75
+msgid "Display debugger-only symbols"
+msgstr ""
+
+#: src/nm.c:76
+msgid "Display only defined symbols"
+msgstr ""
+
+#: src/nm.c:79
+msgid "Display dynamic symbols instead of normal symbols"
+msgstr ""
+
+#: src/nm.c:80
+msgid "Display only external symbols"
+msgstr ""
+
+#: src/nm.c:81
+msgid "Display only undefined symbols"
+msgstr ""
+
+#: src/nm.c:83
+msgid "Include index for symbols from archive members"
+msgstr ""
+
+#: src/nm.c:85 src/size.c:66
+msgid "Output format:"
+msgstr ""
+
+#: src/nm.c:87
+msgid "Print name of the input file before every symbol"
+msgstr ""
+
+#: src/nm.c:90
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd', `sysv' or `posix'. The "
+"default is `sysv'"
+msgstr ""
+
+#: src/nm.c:92
+msgid "Same as --format=bsd"
+msgstr ""
+
+#: src/nm.c:93
+msgid "Same as --format=posix"
+msgstr ""
+
+#: src/nm.c:94 src/size.c:72
+msgid "Use RADIX for printing symbol values"
+msgstr ""
+
+#: src/nm.c:95
+msgid "Mark weak symbols"
+msgstr ""
+
+#: src/nm.c:96
+msgid "Print size of defined symbols"
+msgstr ""
+
+#: src/nm.c:98 src/size.c:80 src/strip.c:78 src/unstrip.c:81
+msgid "Output options:"
+msgstr ""
+
+#: src/nm.c:99
+msgid "Sort symbols numerically by address"
+msgstr ""
+
+#: src/nm.c:101
+msgid "Do not sort the symbols"
+msgstr ""
+
+#: src/nm.c:102
+msgid "Reverse the sense of the sort"
+msgstr ""
+
+#: src/nm.c:108
+msgid "List symbols from FILEs (a.out by default)."
+msgstr ""
+
+#: src/nm.c:136 src/objdump.c:105 src/size.c:117 src/strip.c:121
+#, c-format
+msgid "%s: INTERNAL ERROR %d (%s-%s): %s"
+msgstr ""
+
+#: src/nm.c:380 src/nm.c:392 src/size.c:317 src/size.c:326 src/size.c:337
+#: src/strip.c:1816
+#, c-format
+msgid "while closing '%s'"
+msgstr ""
+
+#: src/nm.c:402 src/objdump.c:296 src/strip.c:359
+#, c-format
+msgid "%s: File format not recognized"
+msgstr ""
+
+#: src/nm.c:442
+msgid ""
+"\n"
+"Archive index:"
+msgstr ""
+
+#: src/nm.c:451
+#, c-format
+msgid "invalid offset %zu for symbol %s"
+msgstr ""
+
+#: src/nm.c:456
+#, c-format
+msgid "%s in %s\n"
+msgstr ""
+
+#: src/nm.c:464
+#, c-format
+msgid "cannot reset archive offset to beginning"
+msgstr ""
+
+#: src/nm.c:488 src/objdump.c:344
+#, c-format
+msgid "%s%s%s: file format not recognized"
+msgstr ""
+
+#: src/nm.c:700
+#, c-format
+msgid "cannot create search tree"
+msgstr ""
+
+#: src/nm.c:740 src/nm.c:1002 src/objdump.c:744 src/readelf.c:885
+#: src/readelf.c:1028 src/readelf.c:1169 src/readelf.c:1351 src/readelf.c:1549
+#: src/readelf.c:1735 src/readelf.c:1945 src/readelf.c:2199 src/readelf.c:2265
+#: src/readelf.c:2343 src/readelf.c:2841 src/readelf.c:2877 src/readelf.c:2939
+#: src/readelf.c:6493 src/readelf.c:7387 src/readelf.c:7534 src/readelf.c:7604
+#: src/size.c:425 src/size.c:499 src/strip.c:483
+#, c-format
+msgid "cannot get section header string table index"
+msgstr ""
+
+#: src/nm.c:766
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s:\n"
+"\n"
+msgstr ""
+
+#: src/nm.c:768
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Symbols from %s[%s]:\n"
+"\n"
+msgstr ""
+
+#: src/nm.c:771
+#, c-format
+msgid ""
+"%*s%-*s %-*s Class Type %-*s %*s Section\n"
+"\n"
+msgstr ""
+
+#: src/nm.c:1012
+#, c-format
+msgid "%s: entry size in section `%s' is not what we expect"
+msgstr ""
+
+#: src/nm.c:1016
+#, c-format
+msgid "%s: size of section `%s' is not multiple of entry size"
+msgstr ""
+
+#: src/nm.c:1255
+#, c-format
+msgid "%s%s%s%s: Invalid operation"
+msgstr ""
+
+#: src/nm.c:1312
+#, c-format
+msgid "%s%s%s: no symbols"
+msgstr ""
+
+#: src/objdump.c:61
+msgid "Mode selection:"
+msgstr ""
+
+#: src/objdump.c:62
+msgid "Display relocation information."
+msgstr ""
+
+#: src/objdump.c:64
+msgid "Display the full contents of all sections requested"
+msgstr ""
+
+#: src/objdump.c:66
+msgid "Display assembler code of executable sections"
+msgstr ""
+
+#: src/objdump.c:68
+msgid "Output option selection:"
+msgstr ""
+
+#: src/objdump.c:70
+msgid "Only display information for section NAME."
+msgstr ""
+
+#: src/objdump.c:76
+msgid "Show information from FILEs (a.out by default)."
+msgstr ""
+
+#: src/objdump.c:236 src/readelf.c:430
+msgid "No operation specified.\n"
+msgstr ""
+
+#: src/objdump.c:274 src/objdump.c:286
+#, c-format
+msgid "while close `%s'"
+msgstr ""
+
+#: src/objdump.c:379 src/readelf.c:1644 src/readelf.c:1818
+msgid "INVALID SYMBOL"
+msgstr ""
+
+#: src/objdump.c:394 src/readelf.c:1675 src/readelf.c:1851
+msgid "INVALID SECTION"
+msgstr ""
+
+#: src/objdump.c:510
+#, c-format
+msgid ""
+"\n"
+"RELOCATION RECORDS FOR [%s]:\n"
+"%-*s TYPE VALUE\n"
+msgstr ""
+
+#: src/objdump.c:513
+msgid "OFFSET"
+msgstr ""
+
+#: src/objdump.c:576
+#, c-format
+msgid "Contents of section %s:\n"
+msgstr ""
+
+#: src/objdump.c:676
+#, c-format
+msgid "cannot disassemble"
+msgstr ""
+
+#: src/ranlib.c:74
+msgid "Generate an index to speed access to archives."
+msgstr ""
+
+#: src/ranlib.c:77
+msgid "ARCHIVE"
+msgstr ""
+
+#: src/ranlib.c:116
+#, c-format
+msgid "Archive name required"
+msgstr ""
+
+#: src/ranlib.c:194
+#, c-format
+msgid "'%s' is no archive"
+msgstr ""
+
+#: src/ranlib.c:229
+#, c-format
+msgid "error while freeing sub-ELF descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:73
+msgid "ELF output selection:"
+msgstr ""
+
+#: src/readelf.c:75
+msgid "All these plus -p .strtab -p .dynstr -p .comment"
+msgstr ""
+
+#: src/readelf.c:76
+msgid "Display the dynamic segment"
+msgstr ""
+
+#: src/readelf.c:77
+msgid "Display the ELF file header"
+msgstr ""
+
+#: src/readelf.c:79
+msgid "Display histogram of bucket list lengths"
+msgstr ""
+
+#: src/readelf.c:80
+msgid "Display the program headers"
+msgstr ""
+
+#: src/readelf.c:82
+msgid "Display relocations"
+msgstr ""
+
+#: src/readelf.c:83
+msgid "Display the sections' headers"
+msgstr ""
+
+#: src/readelf.c:85
+msgid "Display the symbol table"
+msgstr ""
+
+#: src/readelf.c:86
+msgid "Display versioning information"
+msgstr ""
+
+#: src/readelf.c:87
+msgid "Display the ELF notes"
+msgstr ""
+
+#: src/readelf.c:89
+msgid "Display architecture specific information, if any"
+msgstr ""
+
+#: src/readelf.c:91
+msgid "Display sections for exception handling"
+msgstr ""
+
+#: src/readelf.c:93
+msgid "Additional output selection:"
+msgstr ""
+
+#: src/readelf.c:95
+msgid ""
+"Display DWARF section content. SECTION can be one of abbrev, aranges, "
+"frame, info, loc, line, ranges, pubnames, str, macinfo, or exception"
+msgstr ""
+
+#: src/readelf.c:99
+msgid "Dump the uninterpreted contents of SECTION, by number or name"
+msgstr ""
+
+#: src/readelf.c:101
+msgid "Print string contents of sections"
+msgstr ""
+
+#: src/readelf.c:104
+msgid "Display the symbol index of an archive"
+msgstr ""
+
+#: src/readelf.c:106
+msgid "Output control:"
+msgstr ""
+
+#: src/readelf.c:108
+msgid "Do not find symbol names for addresses in DWARF data"
+msgstr ""
+
+#: src/readelf.c:114
+msgid "Print information from ELF file in human-readable form."
+msgstr ""
+
+#: src/readelf.c:401
+#, c-format
+msgid "Unknown DWARF debug section `%s'.\n"
+msgstr ""
+
+#: src/readelf.c:465
+#, c-format
+msgid "cannot generate Elf descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:477
+#, c-format
+msgid "'%s' is not an archive, cannot print archive index"
+msgstr ""
+
+#: src/readelf.c:482
+#, c-format
+msgid "error while closing Elf descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:574
+#, c-format
+msgid "cannot stat input file"
+msgstr ""
+
+#: src/readelf.c:576
+#, c-format
+msgid "input file is empty"
+msgstr ""
+
+#: src/readelf.c:578
+#, c-format
+msgid "failed reading '%s': %s"
+msgstr ""
+
+#: src/readelf.c:614
+#, c-format
+msgid "cannot read ELF header: %s"
+msgstr ""
+
+#: src/readelf.c:622
+#, c-format
+msgid "cannot create EBL handle"
+msgstr ""
+
+#: src/readelf.c:635
+#, c-format
+msgid "cannot determine number of program headers: %s"
+msgstr ""
+
+#: src/readelf.c:721
+msgid "NONE (None)"
+msgstr ""
+
+#: src/readelf.c:722
+msgid "REL (Relocatable file)"
+msgstr ""
+
+#: src/readelf.c:723
+msgid "EXEC (Executable file)"
+msgstr ""
+
+#: src/readelf.c:724
+msgid "DYN (Shared object file)"
+msgstr ""
+
+#: src/readelf.c:725
+msgid "CORE (Core file)"
+msgstr ""
+
+#: src/readelf.c:730
+#, c-format
+msgid "OS Specific: (%x)\n"
+msgstr ""
+
+#: src/readelf.c:732
+#, c-format
+msgid "Processor Specific: (%x)\n"
+msgstr ""
+
+#: src/readelf.c:742
+msgid ""
+"ELF Header:\n"
+" Magic: "
+msgstr ""
+
+#: src/readelf.c:746
+#, c-format
+msgid ""
+"\n"
+" Class: %s\n"
+msgstr ""
+
+#: src/readelf.c:751
+#, c-format
+msgid " Data: %s\n"
+msgstr ""
+
+#: src/readelf.c:757
+#, c-format
+msgid " Ident Version: %hhd %s\n"
+msgstr ""
+
+#: src/readelf.c:759 src/readelf.c:776
+msgid "(current)"
+msgstr ""
+
+#: src/readelf.c:763
+#, c-format
+msgid " OS/ABI: %s\n"
+msgstr ""
+
+#: src/readelf.c:766
+#, c-format
+msgid " ABI Version: %hhd\n"
+msgstr ""
+
+#: src/readelf.c:769
+msgid " Type: "
+msgstr ""
+
+#: src/readelf.c:772
+#, c-format
+msgid " Machine: %s\n"
+msgstr ""
+
+#: src/readelf.c:774
+#, c-format
+msgid " Version: %d %s\n"
+msgstr ""
+
+#: src/readelf.c:778
+#, c-format
+msgid " Entry point address: %#<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:781
+#, c-format
+msgid " Start of program headers: %<PRId64> %s\n"
+msgstr ""
+
+#: src/readelf.c:782 src/readelf.c:785
+msgid "(bytes into file)"
+msgstr ""
+
+#: src/readelf.c:784
+#, c-format
+msgid " Start of section headers: %<PRId64> %s\n"
+msgstr ""
+
+#: src/readelf.c:787
+#, c-format
+msgid " Flags: %s\n"
+msgstr ""
+
+#: src/readelf.c:790
+#, c-format
+msgid " Size of this header: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:791 src/readelf.c:794 src/readelf.c:811
+msgid "(bytes)"
+msgstr ""
+
+#: src/readelf.c:793
+#, c-format
+msgid " Size of program header entries: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:796
+#, c-format
+msgid " Number of program headers entries: %<PRId16>"
+msgstr ""
+
+#: src/readelf.c:803
+#, c-format
+msgid " (%<PRIu32> in [0].sh_info)"
+msgstr ""
+
+#: src/readelf.c:806 src/readelf.c:823 src/readelf.c:837
+msgid " ([0] not available)"
+msgstr ""
+
+#: src/readelf.c:810
+#, c-format
+msgid " Size of section header entries: %<PRId16> %s\n"
+msgstr ""
+
+#: src/readelf.c:813
+#, c-format
+msgid " Number of section headers entries: %<PRId16>"
+msgstr ""
+
+#: src/readelf.c:820
+#, c-format
+msgid " (%<PRIu32> in [0].sh_size)"
+msgstr ""
+
+#: src/readelf.c:833
+#, c-format
+msgid " (%<PRIu32> in [0].sh_link)"
+msgstr ""
+
+#: src/readelf.c:841
+#, c-format
+msgid ""
+" Section header string table index: XINDEX%s\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:845
+#, c-format
+msgid ""
+" Section header string table index: %<PRId16>\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:877
+#, c-format
+msgid ""
+"There are %d section headers, starting at offset %#<PRIx64>:\n"
+"\n"
+msgstr ""
+
+#: src/readelf.c:887
+msgid "Section Headers:"
+msgstr ""
+
+#: src/readelf.c:890
+msgid ""
+"[Nr] Name Type Addr Off Size ES Flags Lk "
+"Inf Al"
+msgstr ""
+
+#: src/readelf.c:892
+msgid ""
+"[Nr] Name Type Addr Off Size ES "
+"Flags Lk Inf Al"
+msgstr ""
+
+#: src/readelf.c:899 src/readelf.c:1052
+#, c-format
+msgid "cannot get section: %s"
+msgstr ""
+
+#: src/readelf.c:906 src/readelf.c:1060 src/readelf.c:7554 src/unstrip.c:353
+#: src/unstrip.c:377 src/unstrip.c:427 src/unstrip.c:536 src/unstrip.c:553
+#: src/unstrip.c:591 src/unstrip.c:789 src/unstrip.c:1057 src/unstrip.c:1244
+#: src/unstrip.c:1305 src/unstrip.c:1427 src/unstrip.c:1480 src/unstrip.c:1588
+#: src/unstrip.c:1778
+#, c-format
+msgid "cannot get section header: %s"
+msgstr ""
+
+#: src/readelf.c:964
+msgid "Program Headers:"
+msgstr ""
+
+#: src/readelf.c:966
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align"
+msgstr ""
+
+#: src/readelf.c:969
+msgid ""
+" Type Offset VirtAddr PhysAddr FileSiz "
+"MemSiz Flg Align"
+msgstr ""
+
+#: src/readelf.c:1009
+#, c-format
+msgid "\t[Requesting program interpreter: %s]\n"
+msgstr ""
+
+#: src/readelf.c:1030
+msgid ""
+"\n"
+" Section to Segment mapping:\n"
+" Segment Sections..."
+msgstr ""
+
+#: src/readelf.c:1041 src/unstrip.c:1824 src/unstrip.c:1863 src/unstrip.c:1870
+#, c-format
+msgid "cannot get program header: %s"
+msgstr ""
+
+#: src/readelf.c:1175
+#, c-format
+msgid ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1180
+#, c-format
+msgid ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1188
+msgid "<INVALID SYMBOL>"
+msgstr ""
+
+#: src/readelf.c:1202
+msgid "<INVALID SECTION>"
+msgstr ""
+
+#: src/readelf.c:1353
+#, c-format
+msgid ""
+"\n"
+"Dynamic segment contains %lu entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Dynamic segment contains %lu entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1365
+msgid " Type Value\n"
+msgstr ""
+
+#: src/readelf.c:1389
+#, c-format
+msgid "Shared library: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1394
+#, c-format
+msgid "Library soname: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1399
+#, c-format
+msgid "Library rpath: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1404
+#, c-format
+msgid "Library runpath: [%s]\n"
+msgstr ""
+
+#: src/readelf.c:1424
+#, c-format
+msgid "%<PRId64> (bytes)\n"
+msgstr ""
+
+#: src/readelf.c:1534 src/readelf.c:1720
+#, c-format
+msgid ""
+"\n"
+"Invalid symbol table at offset %#0<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:1552 src/readelf.c:1737
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0<PRIx64> "
+"contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1567
+#, c-format
+msgid ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Relocation section [%2u] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1577
+msgid " Offset Type Value Name\n"
+msgstr ""
+
+#: src/readelf.c:1579
+msgid " Offset Type Value Name\n"
+msgstr ""
+
+#: src/readelf.c:1632 src/readelf.c:1643 src/readelf.c:1656 src/readelf.c:1674
+#: src/readelf.c:1686 src/readelf.c:1805 src/readelf.c:1817 src/readelf.c:1831
+#: src/readelf.c:1850 src/readelf.c:1863
+msgid "<INVALID RELOC>"
+msgstr ""
+
+#: src/readelf.c:1749
+msgid " Offset Type Value Addend Name\n"
+msgstr ""
+
+#: src/readelf.c:1751
+msgid " Offset Type Value Addend Name\n"
+msgstr ""
+
+#: src/readelf.c:1952
+#, c-format
+msgid ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entry:\n"
+msgid_plural ""
+"\n"
+"Symbol table [%2u] '%s' contains %u entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:1958
+#, 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:1968
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr ""
+
+#: src/readelf.c:1970
+msgid " Num: Value Size Type Bind Vis Ndx Name\n"
+msgstr ""
+
+#: src/readelf.c:1990
+#, c-format
+msgid "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
+msgstr ""
+
+#: src/readelf.c:2078
+#, c-format
+msgid "bad dynamic symbol"
+msgstr ""
+
+#: src/readelf.c:2160
+msgid "none"
+msgstr ""
+
+#: src/readelf.c:2177
+msgid "| <unknown>"
+msgstr ""
+
+#: src/readelf.c:2202
+#, c-format
+msgid ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version needs section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2225
+#, c-format
+msgid " %#06x: Version: %hu File: %s Cnt: %hu\n"
+msgstr ""
+
+#: src/readelf.c:2238
+#, c-format
+msgid " %#06x: Name: %s Flags: %s Version: %hu\n"
+msgstr ""
+
+#: src/readelf.c:2269
+#, c-format
+msgid ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgid_plural ""
+"\n"
+"Version definition section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2299
+#, c-format
+msgid " %#06x: Version: %hd Flags: %s Index: %hd Cnt: %hd Name: %s\n"
+msgstr ""
+
+#: src/readelf.c:2314
+#, c-format
+msgid " %#06x: Parent %d: %s\n"
+msgstr ""
+
+#: src/readelf.c:2546
+#, c-format
+msgid ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgid_plural ""
+"\n"
+"Version symbols section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2576
+msgid " 0 *local* "
+msgstr ""
+
+#: src/readelf.c:2581
+msgid " 1 *global* "
+msgstr ""
+
+#: src/readelf.c:2612
+#, c-format
+msgid ""
+"\n"
+"Histogram 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"
+msgid_plural ""
+"\n"
+"Histogram for bucket list length in section [%2u] '%s' (total of %d "
+"buckets):\n"
+" Addr: %#0*<PRIx64> Offset: %#08<PRIx64> Link to section: [%2u] '%s'\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2636
+#, no-c-format
+msgid " Length Number % of total Coverage\n"
+msgstr ""
+
+#: src/readelf.c:2638
+#, c-format
+msgid " 0 %6<PRIu32> %5.1f%%\n"
+msgstr ""
+
+#: src/readelf.c:2645
+#, c-format
+msgid "%7d %6<PRIu32> %5.1f%% %5.1f%%\n"
+msgstr ""
+
+#: src/readelf.c:2658
+#, c-format
+msgid ""
+" Average number of tests: successful lookup: %f\n"
+" unsuccessful lookup: %f\n"
+msgstr ""
+
+#: src/readelf.c:2676 src/readelf.c:2718 src/readelf.c:2759
+#, c-format
+msgid "cannot get data for section %d: %s"
+msgstr ""
+
+#: src/readelf.c:2813
+#, c-format
+msgid ""
+" Symbol Bias: %u\n"
+" Bitmask Size: %zu bytes %<PRIuFAST32>%% bits set 2nd hash shift: %u\n"
+msgstr ""
+
+#: src/readelf.c:2887
+#, c-format
+msgid ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entry:\n"
+msgid_plural ""
+"\n"
+"Library list section [%2zu] '%s' at offset %#0<PRIx64> contains %d entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:2901
+msgid ""
+" Library Time Stamp Checksum Version "
+"Flags"
+msgstr ""
+
+#: src/readelf.c:2951
+#, c-format
+msgid ""
+"\n"
+"Object attributes section [%2zu] '%s' of %<PRIu64> bytes at offset %"
+"#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:2967
+msgid " Owner Size\n"
+msgstr ""
+
+#: src/readelf.c:2993
+#, c-format
+msgid " %-13s %4<PRIu32>\n"
+msgstr ""
+
+#: src/readelf.c:3025
+#, c-format
+msgid " %-4u %12<PRIu32>\n"
+msgstr ""
+
+#: src/readelf.c:3030
+#, c-format
+msgid " File: %11<PRIu32>\n"
+msgstr ""
+
+#: src/readelf.c:3065
+#, c-format
+msgid " %s: %<PRId64>, %s\n"
+msgstr ""
+
+#: src/readelf.c:3068
+#, c-format
+msgid " %s: %<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:3071
+#, c-format
+msgid " %s: %s\n"
+msgstr ""
+
+#: src/readelf.c:3078
+#, c-format
+msgid " %u: %<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:3081
+#, c-format
+msgid " %u: %s\n"
+msgstr ""
+
+#: src/readelf.c:3117
+#, c-format
+msgid "%s+%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3120
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3125
+#, c-format
+msgid "%#<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3128
+#, c-format
+msgid "%#0*<PRIx64> <%s+%#<PRIx64>>"
+msgstr ""
+
+#: src/readelf.c:3134
+#, c-format
+msgid "%s+%#<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3137
+#, c-format
+msgid "%s+%#0*<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3141
+#, c-format
+msgid "%#<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3144
+#, c-format
+msgid "%#0*<PRIx64> <%s>"
+msgstr ""
+
+#: src/readelf.c:3149
+#, c-format
+msgid "%s+%#<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3152
+#, c-format
+msgid "%s+%#0*<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3260
+#, c-format
+msgid "unknown tag %hx"
+msgstr ""
+
+#: src/readelf.c:3262
+#, c-format
+msgid "unknown user tag %hx"
+msgstr ""
+
+#: src/readelf.c:3480
+#, c-format
+msgid "unknown attribute %hx"
+msgstr ""
+
+#: src/readelf.c:3483
+#, c-format
+msgid "unknown user attribute %hx"
+msgstr ""
+
+#: src/readelf.c:3529
+#, c-format
+msgid "unknown form %<PRIx64>"
+msgstr ""
+
+#: src/readelf.c:3763
+msgid "empty block"
+msgstr ""
+
+#: src/readelf.c:3766
+#, c-format
+msgid "%zu byte block:"
+msgstr ""
+
+#: src/readelf.c:4175
+#, c-format
+msgid "%*s[%4<PRIuMAX>] %s <TRUNCATED>\n"
+msgstr ""
+
+#: src/readelf.c:4188
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [ Code]\n"
+msgstr ""
+
+#: src/readelf.c:4195
+#, c-format
+msgid ""
+"\n"
+"Abbreviation section at offset %<PRIu64>:\n"
+msgstr ""
+
+#: src/readelf.c:4208
+#, c-format
+msgid " *** error while reading abbreviation: %s\n"
+msgstr ""
+
+#: src/readelf.c:4224
+#, c-format
+msgid " [%5u] offset: %<PRId64>, children: %s, tag: %s\n"
+msgstr ""
+
+#: src/readelf.c:4227
+msgid "yes"
+msgstr ""
+
+#: src/readelf.c:4227
+msgid "no"
+msgstr ""
+
+#: src/readelf.c:4263
+#, c-format
+msgid "cannot get .debug_aranges content: %s"
+msgstr ""
+
+#: src/readelf.c:4268
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entry:\n"
+msgid_plural ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64> contains %zu entries:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:4298
+#, c-format
+msgid " [%*zu] ???\n"
+msgstr ""
+
+#: src/readelf.c:4300
+#, c-format
+msgid ""
+" [%*zu] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %6<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:4319
+#, c-format
+msgid "cannot get .debug_ranges content: %s"
+msgstr ""
+
+#: src/readelf.c:4324 src/readelf.c:4810 src/readelf.c:5452 src/readelf.c:5897
+#: src/readelf.c:5992 src/readelf.c:6164
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:4338 src/readelf.c:5911
+#, c-format
+msgid " [%6tx] <INVALID DATA>\n"
+msgstr ""
+
+#: src/readelf.c:4360 src/readelf.c:5933
+#, c-format
+msgid " [%6tx] base address %s\n"
+msgstr ""
+
+#: src/readelf.c:4371
+#, c-format
+msgid " [%6tx] %s..%s\n"
+msgstr ""
+
+#: src/readelf.c:4373
+#, c-format
+msgid " %s..%s\n"
+msgstr ""
+
+#: src/readelf.c:4799 src/readelf.c:6230 src/readelf.c:6332
+#, c-format
+msgid "cannot get %s content: %s"
+msgstr ""
+
+#: src/readelf.c:4806
+#, c-format
+msgid ""
+"\n"
+"Call frame information section [%2zu] '%s' at offset %#<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:4833 src/readelf.c:5486
+#, c-format
+msgid "invalid data in section [%zu] '%s'"
+msgstr ""
+
+#: src/readelf.c:4855
+#, c-format
+msgid ""
+"\n"
+" [%6tx] Zero terminator\n"
+msgstr ""
+
+#: src/readelf.c:4924
+#, c-format
+msgid "invalid augmentation length"
+msgstr ""
+
+#: src/readelf.c:4936
+msgid "FDE address encoding: "
+msgstr ""
+
+#: src/readelf.c:4942
+msgid "LSDA pointer encoding: "
+msgstr ""
+
+#: src/readelf.c:5034
+#, c-format
+msgid " (offset: %#<PRIx64>)"
+msgstr ""
+
+#: src/readelf.c:5041
+#, c-format
+msgid " (end offset: %#<PRIx64>)"
+msgstr ""
+
+#: src/readelf.c:5068
+#, c-format
+msgid " %-26sLSDA pointer: %#<PRIx64>\n"
+msgstr ""
+
+#: src/readelf.c:5114
+#, c-format
+msgid "cannot get attribute code: %s"
+msgstr ""
+
+#: src/readelf.c:5122
+#, c-format
+msgid "cannot get attribute form: %s"
+msgstr ""
+
+#: src/readelf.c:5135
+#, c-format
+msgid "cannot get attribute value: %s"
+msgstr ""
+
+#: src/readelf.c:5331
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" [Offset]\n"
+msgstr ""
+
+#: src/readelf.c:5356
+#, c-format
+msgid ""
+" Compilation unit at offset %<PRIu64>:\n"
+" Version: %<PRIu16>, Abbreviation section offset: %<PRIu64>, Address size: %"
+"<PRIu8>, Offset size: %<PRIu8>\n"
+msgstr ""
+
+#: src/readelf.c:5374
+#, c-format
+msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
+msgstr ""
+
+#: src/readelf.c:5385
+#, c-format
+msgid "cannot get DIE offset: %s"
+msgstr ""
+
+#: src/readelf.c:5393
+#, c-format
+msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
+msgstr ""
+
+#: src/readelf.c:5422
+#, c-format
+msgid "cannot get next DIE: %s\n"
+msgstr ""
+
+#: src/readelf.c:5429
+#, c-format
+msgid "cannot get next DIE: %s"
+msgstr ""
+
+#: src/readelf.c:5464
+#, c-format
+msgid "cannot get line data section data: %s"
+msgstr ""
+
+#: src/readelf.c:5477
+#, c-format
+msgid ""
+"\n"
+"Table at offset %Zu:\n"
+msgstr ""
+
+#: src/readelf.c:5529
+#, c-format
+msgid ""
+"\n"
+" Length: %<PRIu64>\n"
+" DWARF version: %<PRIuFAST16>\n"
+" Prologue length: %<PRIu64>\n"
+" Minimum instruction length: %<PRIuFAST8>\n"
+" Initial value if '%s': %<PRIuFAST8>\n"
+" Line base: %<PRIdFAST8>\n"
+" Line range: %<PRIuFAST8>\n"
+" Opcode base: %<PRIuFAST8>\n"
+"\n"
+"Opcodes:\n"
+msgstr ""
+
+#: src/readelf.c:5548
+#, c-format
+msgid "invalid data at offset %tu in section [%zu] '%s'"
+msgstr ""
+
+#: src/readelf.c:5563
+#, c-format
+msgid " [%*<PRIuFAST8>] %hhu argument\n"
+msgid_plural " [%*<PRIuFAST8>] %hhu arguments\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:5571
+msgid ""
+"\n"
+"Directory table:"
+msgstr ""
+
+#: src/readelf.c:5587
+msgid ""
+"\n"
+"File name table:\n"
+" Entry Dir Time Size Name"
+msgstr ""
+
+#: src/readelf.c:5616
+msgid ""
+"\n"
+"Line number statements:"
+msgstr ""
+
+#: src/readelf.c:5677
+#, c-format
+msgid " special opcode %u: address+%u = %s, line%+d = %zu\n"
+msgstr ""
+
+#: src/readelf.c:5697
+#, c-format
+msgid " extended opcode %u: "
+msgstr ""
+
+#: src/readelf.c:5702
+msgid "end of sequence"
+msgstr ""
+
+#: src/readelf.c:5717
+#, c-format
+msgid "set address to %s\n"
+msgstr ""
+
+#: src/readelf.c:5738
+#, c-format
+msgid "define new file: dir=%u, mtime=%<PRIu64>, length=%<PRIu64>, name=%s\n"
+msgstr ""
+
+#: src/readelf.c:5747
+msgid "unknown opcode"
+msgstr ""
+
+#: src/readelf.c:5759
+msgid " copy"
+msgstr ""
+
+#: src/readelf.c:5769
+#, c-format
+msgid "advance address by %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5780
+#, c-format
+msgid " advance line by constant %d to %<PRId64>\n"
+msgstr ""
+
+#: src/readelf.c:5788
+#, c-format
+msgid " set file to %<PRIu64>\n"
+msgstr ""
+
+#: src/readelf.c:5798
+#, c-format
+msgid " set column to %<PRIu64>\n"
+msgstr ""
+
+#: src/readelf.c:5805
+#, c-format
+msgid " set '%s' to %<PRIuFAST8>\n"
+msgstr ""
+
+#: src/readelf.c:5811
+msgid " set basic block flag"
+msgstr ""
+
+#: src/readelf.c:5821
+#, c-format
+msgid "advance address by constant %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5837
+#, c-format
+msgid "advance address by fixed value %u to %s\n"
+msgstr ""
+
+#: src/readelf.c:5846
+msgid " set prologue end flag"
+msgstr ""
+
+#: src/readelf.c:5851
+msgid " set epilogue begin flag"
+msgstr ""
+
+#: src/readelf.c:5860
+#, c-format
+msgid " unknown opcode with %<PRIu8> parameter:"
+msgid_plural " unknown opcode with %<PRIu8> parameters:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/readelf.c:5892
+#, c-format
+msgid "cannot get .debug_loc content: %s"
+msgstr ""
+
+#: src/readelf.c:5947
+#, c-format
+msgid " [%6tx] %s..%s"
+msgstr ""
+
+#: src/readelf.c:5949
+#, c-format
+msgid " %s..%s"
+msgstr ""
+
+#: src/readelf.c:6002
+#, c-format
+msgid "cannot get macro information section data: %s"
+msgstr ""
+
+#: src/readelf.c:6081
+#, c-format
+msgid "%*s*** non-terminated string at end of section"
+msgstr ""
+
+#: src/readelf.c:6149
+#, c-format
+msgid " [%5d] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
+msgstr ""
+
+#: src/readelf.c:6188
+#, c-format
+msgid ""
+"\n"
+"DWARF section [%2zu] '%s' at offset %#<PRIx64>:\n"
+" %*s String\n"
+msgstr ""
+
+#: src/readelf.c:6202
+#, c-format
+msgid " *** error while reading strings: %s\n"
+msgstr ""
+
+#: src/readelf.c:6222
+#, c-format
+msgid ""
+"\n"
+"Call frame search table section [%2zu] '.eh_frame_hdr':\n"
+msgstr ""
+
+#: src/readelf.c:6324
+#, c-format
+msgid ""
+"\n"
+"Exception handling table section [%2zu] '.gcc_except_table':\n"
+msgstr ""
+
+#: src/readelf.c:6347
+#, c-format
+msgid " LPStart encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6359
+#, c-format
+msgid " TType encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6373
+#, c-format
+msgid " Call site encoding: %#x "
+msgstr ""
+
+#: src/readelf.c:6386
+msgid ""
+"\n"
+" Call site table:"
+msgstr ""
+
+#: src/readelf.c:6400
+#, c-format
+msgid ""
+" [%4u] Call site start: %#<PRIx64>\n"
+" Call site length: %<PRIu64>\n"
+" Landing pad: %#<PRIx64>\n"
+" Action: %u\n"
+msgstr ""
+
+#: src/readelf.c:6460
+#, c-format
+msgid "invalid TType encoding"
+msgstr ""
+
+#: src/readelf.c:6484
+#, c-format
+msgid "cannot get debug context descriptor: %s"
+msgstr ""
+
+#: src/readelf.c:6620 src/readelf.c:7221
+#, c-format
+msgid "cannot convert core note data: %s"
+msgstr ""
+
+#: src/readelf.c:6961
+#, c-format
+msgid ""
+"\n"
+"%*s... <repeats %u more times> ..."
+msgstr ""
+
+#: src/readelf.c:7320
+msgid " Owner Data size Type\n"
+msgstr ""
+
+#: src/readelf.c:7338
+#, c-format
+msgid " %-13.*s %9<PRId32> %s\n"
+msgstr ""
+
+#: src/readelf.c:7372
+#, c-format
+msgid "cannot get content of note section: %s"
+msgstr ""
+
+#: src/readelf.c:7399
+#, c-format
+msgid ""
+"\n"
+"Note section [%2zu] '%s' of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7422
+#, c-format
+msgid ""
+"\n"
+"Note segment of %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7468
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no data to dump.\n"
+msgstr ""
+
+#: src/readelf.c:7474 src/readelf.c:7497
+#, c-format
+msgid "cannot get data for section [%Zu] '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7478
+#, c-format
+msgid ""
+"\n"
+"Hex dump of section [%Zu] '%s', %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7491
+#, c-format
+msgid ""
+"\n"
+"Section [%Zu] '%s' has no strings to dump.\n"
+msgstr ""
+
+#: src/readelf.c:7501
+#, c-format
+msgid ""
+"\n"
+"String section [%Zu] '%s' contains %<PRIu64> bytes at offset %#0<PRIx64>:\n"
+msgstr ""
+
+#: src/readelf.c:7549
+#, c-format
+msgid ""
+"\n"
+"section [%lu] does not exist"
+msgstr ""
+
+#: src/readelf.c:7576
+#, c-format
+msgid ""
+"\n"
+"section '%s' does not exist"
+msgstr ""
+
+#: src/readelf.c:7637
+#, c-format
+msgid "cannot get symbol index of archive '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7640
+#, c-format
+msgid ""
+"\n"
+"Archive '%s' has no symbol index\n"
+msgstr ""
+
+#: src/readelf.c:7644
+#, c-format
+msgid ""
+"\n"
+"Index of archive '%s' has %Zu entries:\n"
+msgstr ""
+
+#: src/readelf.c:7662
+#, c-format
+msgid "cannot extract member at offset %Zu in '%s': %s"
+msgstr ""
+
+#: src/readelf.c:7667
+#, c-format
+msgid "Archive member '%s' contains:\n"
+msgstr ""
+
+#: src/size.c:68
+msgid ""
+"Use the output format FORMAT. FORMAT can be `bsd' or `sysv'. The default "
+"is `bsd'"
+msgstr ""
+
+#: src/size.c:70
+msgid "Same as `--format=sysv'"
+msgstr ""
+
+#: src/size.c:71
+msgid "Same as `--format=bsd'"
+msgstr ""
+
+#: src/size.c:74
+msgid "Same as `--radix=10'"
+msgstr ""
+
+#: src/size.c:75
+msgid "Same as `--radix=8'"
+msgstr ""
+
+#: src/size.c:76
+msgid "Same as `--radix=16'"
+msgstr ""
+
+#: src/size.c:78
+msgid "Similar to `--format=sysv' output but in one line"
+msgstr ""
+
+#: src/size.c:82
+msgid "Print size and permission flags for loadable segments"
+msgstr ""
+
+#: src/size.c:83
+msgid "Display the total sizes (bsd only)"
+msgstr ""
+
+#: src/size.c:88
+msgid "List section sizes of FILEs (a.out by default)."
+msgstr ""
+
+#: src/size.c:269
+#, c-format
+msgid "Invalid format: %s"
+msgstr ""
+
+#: src/size.c:280
+#, c-format
+msgid "Invalid radix: %s"
+msgstr ""
+
+#: src/size.c:339
+#, c-format
+msgid "%s: file format not recognized"
+msgstr ""
+
+#: src/size.c:446 src/size.c:589
+#, c-format
+msgid " (ex %s)"
+msgstr ""
+
+#: src/size.c:614
+msgid "(TOTALS)\n"
+msgstr ""
+
+#: src/strings.c:70
+msgid "Output Selection:"
+msgstr ""
+
+#: src/strings.c:71
+msgid "Scan entire file, not only loaded sections"
+msgstr ""
+
+#: src/strings.c:73
+msgid "Only NUL-terminated sequences of MIN-LEN characters or more are printed"
+msgstr ""
+
+#: src/strings.c:74
+msgid ""
+"Select character size and endianess: s = 7-bit, S = 8-bit, {b,l} = 16-bit, "
+"{B,L} = 32-bit"
+msgstr ""
+
+#: src/strings.c:78
+msgid "Print name of the file before each string."
+msgstr ""
+
+#: src/strings.c:80
+msgid "Print location of the string in base 8, 10, or 16 respectively."
+msgstr ""
+
+#: src/strings.c:81
+msgid "Alias for --radix=o"
+msgstr ""
+
+#: src/strings.c:88
+msgid "Print the strings of printable characters in files."
+msgstr ""
+
+#: src/strings.c:268 src/strings.c:303
+#, c-format
+msgid "invalid value '%s' for %s parameter"
+msgstr ""
+
+#: src/strings.c:314
+#, c-format
+msgid "invalid minimum length of matched string size"
+msgstr ""
+
+#: src/strings.c:601
+#, c-format
+msgid "lseek64 failed"
+msgstr ""
+
+#: src/strings.c:616 src/strings.c:680
+#, c-format
+msgid "re-mmap failed"
+msgstr ""
+
+#: src/strings.c:653
+#, c-format
+msgid "mprotect failed"
+msgstr ""
+
+#: src/strip.c:74
+msgid "Place stripped output into FILE"
+msgstr ""
+
+#: src/strip.c:75
+msgid "Extract the removed sections into FILE"
+msgstr ""
+
+#: src/strip.c:76
+msgid "Embed name FILE instead of -f argument"
+msgstr ""
+
+#: src/strip.c:80
+msgid "Remove all debugging symbols"
+msgstr ""
+
+#: src/strip.c:84
+msgid "Copy modified/access timestamps to the output"
+msgstr ""
+
+#: src/strip.c:86
+msgid "Remove .comment section"
+msgstr ""
+
+#: src/strip.c:89
+msgid "Relax a few rules to handle slightly broken ELF files"
+msgstr ""
+
+#: src/strip.c:94
+msgid "Discard symbols from object files."
+msgstr ""
+
+#: src/strip.c:186
+#, c-format
+msgid "Only one input file allowed together with '-o' and '-f'"
+msgstr ""
+
+#: src/strip.c:222
+#, c-format
+msgid "-f option specified twice"
+msgstr ""
+
+#: src/strip.c:231
+#, c-format
+msgid "-F option specified twice"
+msgstr ""
+
+#: src/strip.c:240 src/unstrip.c:125
+#, c-format
+msgid "-o option specified twice"
+msgstr ""
+
+#: src/strip.c:260
+#, c-format
+msgid "-R option supports only .comment section"
+msgstr ""
+
+#: src/strip.c:298 src/strip.c:322
+#, c-format
+msgid "cannot stat input file '%s'"
+msgstr ""
+
+#: src/strip.c:312
+#, c-format
+msgid "while opening '%s'"
+msgstr ""
+
+#: src/strip.c:350
+#, c-format
+msgid "%s: cannot use -o or -f when stripping archive"
+msgstr ""
+
+#: src/strip.c:448
+#, c-format
+msgid "cannot open EBL backend"
+msgstr ""
+
+#: src/strip.c:498 src/strip.c:522
+#, c-format
+msgid "cannot create new file '%s': %s"
+msgstr ""
+
+#: src/strip.c:582
+#, c-format
+msgid "illformed file '%s'"
+msgstr ""
+
+#: src/strip.c:869 src/strip.c:956
+#, c-format
+msgid "while generating output file: %s"
+msgstr ""
+
+#: src/strip.c:929 src/strip.c:1668
+#, c-format
+msgid "%s: error while creating ELF header: %s"
+msgstr ""
+
+#: src/strip.c:943
+#, c-format
+msgid "while preparing output for '%s'"
+msgstr ""
+
+#: src/strip.c:994 src/strip.c:1050
+#, c-format
+msgid "while create section header section: %s"
+msgstr ""
+
+#: src/strip.c:1000
+#, c-format
+msgid "cannot allocate section data: %s"
+msgstr ""
+
+#: src/strip.c:1059
+#, c-format
+msgid "while create section header string table: %s"
+msgstr ""
+
+#: src/strip.c:1593 src/strip.c:1690
+#, c-format
+msgid "while writing '%s': %s"
+msgstr ""
+
+#: src/strip.c:1604
+#, c-format
+msgid "while creating '%s'"
+msgstr ""
+
+#: src/strip.c:1616
+#, c-format
+msgid "while computing checksum for debug information"
+msgstr ""
+
+#: src/strip.c:1676
+#, c-format
+msgid "%s: error while reading the file: %s"
+msgstr ""
+
+#: src/strip.c:1722 src/strip.c:1729
+#, c-format
+msgid "error while finishing '%s': %s"
+msgstr ""
+
+#: src/strip.c:1752 src/strip.c:1809
+#, c-format
+msgid "cannot set access and modification date of '%s'"
+msgstr ""
+
+#: src/unstrip.c:78
+msgid "Match MODULE against file names, not module names"
+msgstr ""
+
+#: src/unstrip.c:79
+msgid "Silently skip unfindable files"
+msgstr ""
+
+#: src/unstrip.c:82
+msgid "Place output into FILE"
+msgstr ""
+
+#: src/unstrip.c:84
+msgid "Create multiple output files under DIRECTORY"
+msgstr ""
+
+#: src/unstrip.c:85
+msgid "Use module rather than file names"
+msgstr ""
+
+#: src/unstrip.c:87
+msgid "Create output for modules that have no separate debug information"
+msgstr ""
+
+#: src/unstrip.c:90
+msgid "Apply relocations to section contents in ET_REL files"
+msgstr ""
+
+#: src/unstrip.c:92
+msgid "Only list module and file names, build IDs"
+msgstr ""
+
+#: src/unstrip.c:134
+#, c-format
+msgid "-d option specified twice"
+msgstr ""
+
+#: src/unstrip.c:166
+#, c-format
+msgid "only one of -o or -d allowed"
+msgstr ""
+
+#: src/unstrip.c:175
+#, c-format
+msgid "-n cannot be used with explicit files or -o or -d"
+msgstr ""
+
+#: src/unstrip.c:190
+#, c-format
+msgid "output directory '%s'"
+msgstr ""
+
+#: src/unstrip.c:199
+#, c-format
+msgid "exactly two file arguments are required"
+msgstr ""
+
+#: src/unstrip.c:205
+#, c-format
+msgid "-m, -a, -R, and -i options not allowed with explicit files"
+msgstr ""
+
+#: src/unstrip.c:218
+#, c-format
+msgid "-o or -d is required when using implicit files"
+msgstr ""
+
+#: src/unstrip.c:254
+#, c-format
+msgid "cannot create ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:259
+#, c-format
+msgid "cannot copy ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:264 src/unstrip.c:1817
+#, c-format
+msgid "cannot create program headers: %s"
+msgstr ""
+
+#: src/unstrip.c:270
+#, c-format
+msgid "cannot copy program header: %s"
+msgstr ""
+
+#: src/unstrip.c:280
+#, c-format
+msgid "cannot copy section header: %s"
+msgstr ""
+
+#: src/unstrip.c:283 src/unstrip.c:1505
+#, c-format
+msgid "cannot get section data: %s"
+msgstr ""
+
+#: src/unstrip.c:285 src/unstrip.c:1507
+#, c-format
+msgid "cannot copy section data: %s"
+msgstr ""
+
+#: src/unstrip.c:309
+#, c-format
+msgid "cannot create directory '%s'"
+msgstr ""
+
+#: src/unstrip.c:349 src/unstrip.c:763 src/unstrip.c:1540
+#, c-format
+msgid "cannot get symbol table entry: %s"
+msgstr ""
+
+#: src/unstrip.c:365 src/unstrip.c:580 src/unstrip.c:601 src/unstrip.c:613
+#: src/unstrip.c:1561 src/unstrip.c:1691 src/unstrip.c:1715
+#, c-format
+msgid "cannot update symbol table: %s"
+msgstr ""
+
+#: src/unstrip.c:382 src/unstrip.c:432 src/unstrip.c:562 src/unstrip.c:1209
+#: src/unstrip.c:1525 src/unstrip.c:1720 src/unstrip.c:1791
+#, c-format
+msgid "cannot update section header: %s"
+msgstr ""
+
+#: src/unstrip.c:408 src/unstrip.c:419
+#, c-format
+msgid "cannot update relocation: %s"
+msgstr ""
+
+#: src/unstrip.c:507
+#, c-format
+msgid "cannot get symbol version: %s"
+msgstr ""
+
+#: src/unstrip.c:519
+#, c-format
+msgid "unexpected section type in [%Zu] with sh_link to symtab"
+msgstr ""
+
+#: src/unstrip.c:769
+#, c-format
+msgid "invalid string offset in symbol [%Zu]"
+msgstr ""
+
+#: src/unstrip.c:911 src/unstrip.c:1248
+#, c-format
+msgid "cannot read section [%Zu] name: %s"
+msgstr ""
+
+#: src/unstrip.c:952 src/unstrip.c:971 src/unstrip.c:1004
+#, c-format
+msgid "cannot read '.gnu.prelink_undo' section: %s"
+msgstr ""
+
+#: src/unstrip.c:992
+#, c-format
+msgid "invalid contents in '%s' section"
+msgstr ""
+
+#: src/unstrip.c:1047 src/unstrip.c:1370
+#, c-format
+msgid "cannot find matching section for [%Zu] '%s'"
+msgstr ""
+
+#: src/unstrip.c:1171 src/unstrip.c:1186 src/unstrip.c:1451
+#, c-format
+msgid "cannot add section name to string table: %s"
+msgstr ""
+
+#: src/unstrip.c:1195
+#, c-format
+msgid "cannot update section header string table data: %s"
+msgstr ""
+
+#: src/unstrip.c:1223 src/unstrip.c:1227
+#, c-format
+msgid "cannot get section header string table section index: %s"
+msgstr ""
+
+#: src/unstrip.c:1231 src/unstrip.c:1235 src/unstrip.c:1466
+#, c-format
+msgid "cannot get section count: %s"
+msgstr ""
+
+#: src/unstrip.c:1293 src/unstrip.c:1385
+#, c-format
+msgid "cannot read section header string table: %s"
+msgstr ""
+
+#: src/unstrip.c:1445
+#, c-format
+msgid "cannot add new section: %s"
+msgstr ""
+
+#: src/unstrip.c:1548
+#, c-format
+msgid "symbol [%Zu] has invalid section index"
+msgstr ""
+
+#: src/unstrip.c:1800
+#, c-format
+msgid "cannot get ELF header: %s"
+msgstr ""
+
+#: src/unstrip.c:1827
+#, c-format
+msgid "cannot update program header: %s"
+msgstr ""
+
+#: src/unstrip.c:1832 src/unstrip.c:1911
+#, c-format
+msgid "cannot write output file: %s"
+msgstr ""
+
+#: src/unstrip.c:1880
+#, c-format
+msgid "DWARF data not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+
+#: src/unstrip.c:1883
+#, c-format
+msgid ""
+"DWARF data in '%s' not adjusted for prelinking bias; consider prelink -u"
+msgstr ""
+
+#: src/unstrip.c:1902 src/unstrip.c:1942 src/unstrip.c:1954 src/unstrip.c:2034
+#, c-format
+msgid "cannot create ELF descriptor: %s"
+msgstr ""
+
+#: src/unstrip.c:1960
+#, c-format
+msgid "'%s' and '%s' do not seem to match"
+msgstr ""
+
+#: src/unstrip.c:1991
+#, c-format
+msgid "cannot find stripped file for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:1995
+#, c-format
+msgid "cannot open stripped file '%s' for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2010
+#, c-format
+msgid "cannot find debug file for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2014
+#, c-format
+msgid "cannot open debug file '%s' for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2027
+#, c-format
+msgid "module '%s' file '%s' is not stripped"
+msgstr ""
+
+#: src/unstrip.c:2058
+#, c-format
+msgid "cannot cache section addresses for module '%s': %s"
+msgstr ""
+
+#: src/unstrip.c:2191
+#, c-format
+msgid "no matching modules found"
+msgstr ""
+
+#: src/unstrip.c:2200
+#, c-format
+msgid "matched more than one module"
+msgstr ""
+
+#: src/unstrip.c:2247
+msgid ""
+"STRIPPED-FILE DEBUG-FILE\n"
+"[MODULE...]"
+msgstr ""
+
+#: src/unstrip.c:2248
+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"
+"\n"
+"MODULE arguments give file name patterns matching modules to process.\n"
+"With -f these match the file name of the main (stripped) file (slashes are "
+"never special), otherwise they match the simple module names. With no "
+"arguments, process all modules found.\n"
+"\n"
+"Multiple modules are written to files under OUTPUT-DIRECTORY, creating "
+"subdirectories as needed. With -m these files have simple module names, "
+"otherwise they have the name of the main file complete with directory "
+"underneath OUTPUT-DIRECTORY.\n"
+"\n"
+"With -n no files are written, but one line to standard output for each "
+"module:\n"
+"\tSTART+SIZE BUILDID FILE DEBUGFILE MODULENAME\n"
+"START and SIZE are hexadecimal giving the address bounds of the module. "
+"BUILDID is hexadecimal for the build ID bits, or - if no ID is known; the "
+"hexadecimal may be followed by @0xADDR giving the address where the ID "
+"resides if that is known. FILE is the file name found for the module, or - "
+"if none was found, or . if an ELF image is available but not from any named "
+"file. DEBUGFILE is the separate debuginfo file name, or - if no debuginfo "
+"was found, or . if FILE contains the debug information."
+msgstr ""
diff --git a/src/ChangeLog b/src/ChangeLog
index df4305c2..4e48b34f 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,688 @@
+2010-05-19 Roland McGrath <roland@redhat.com>
+
+ * addr2line.c (find_symbol): Short-circuit on empty name.
+ (handle_address): Handle SYMBOL with no +OFFSET.
+
+2010-05-08 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (print_ops): Take new arg OFFSET_SIZE.
+ Use that for DW_OP_call_ref, not ADDRSIZE.
+ (print_cfa_program): Update caller.
+ (struct attrcb_args): Add offset_size field.
+ (attr_callback): Use it for print_ops call.
+ (print_debug_info_section): Initialize it.
+
+2010-04-14 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (handle_core_item): Fix bitmask printing.
+
+2010-04-06 Roland McGrath <roland@redhat.com>
+
+ * ld.c (options): Fix some typos in messages.
+ * elflint.c (check_scn_group, check_group): Likewise.
+ * ldscript.y (add_id_list): Likewise.
+ * readelf.c (print_hash_info): Add xgettext:no-c-format magic comment
+ before translated string containing a literal %.
+
+2010-02-26 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (process_file): Don't leak an fd in failure case.
+
+2010-02-15 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am: Use config/eu.am for common stuff.
+
+ * readelf.c (print_debug_frame_section): Add a cast to avoid sign
+ mismatch in comparison.
+
+2010-02-02 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (print_encoding_base): Handle DW_EH_PE_absptr (zero).
+ (read_encoded): Likewise.
+ (print_debug_frame_section): Check for bogus augmentation length.
+ For P augmentation, use read_encoded, print the encoding description,
+ and use hex for unsigned values.
+
+2010-01-15 Roland McGrath <roland@redhat.com>
+
+ * ar.c: Include <sys/stat.h>.
+ * elflint.c: Likewise.
+ * readelf.c: Likewise.
+ * strip.c: Likewise.
+ * unstrip.c: Likewise
+
+2010-01-07 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (print_ehdr): Handle PN_XNUM.
+ (phnum): New static variable.
+ (process_elf_file): Set it with elf_getphdrnum.
+ (print_phdr): Use phnum instead of EHDR->e_phnum.
+ (print_dynamic, handle_notes): Likewise.
+ (handle_relocs_rel, handle_relocs_rela): Likewise.
+
+ * elfcmp.c (main): Use elf_getshdrnum and elf_getphdrnum.
+
+ * elflint.c (phnum): New static variable.
+ (check_elf_header): Set it, handling PN_XNUM.
+ Use that in place of EHDR->e_phnum throughout.
+ (check_symtab, check_reloc_shdr, check_dynamic): Likewise.
+ (unknown_dependency_p, check_sections, check_program_header): Likewise.
+
+2010-01-05 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (dwarf_attr_string): Match DW_AT_GNU_vector and
+ DW_AT_GNU_template_name.
+
+2010-01-04 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (handle_notes_data): Grab NT_AUXV only for name "CORE".
+ (handle_core_note): Pass NHDR and NAME to ebl_core_note.
+ (handle_core_item): Handle .format of '\n' as \n-separated strings.
+
+ * readelf.c (implicit_debug_sections): New variable.
+ (parse_opt): Set it instead of print_debug_sections for -a.
+ OR them together for print_debug check.
+ (print_debug): OR them together for section check.
+
+ * readelf.c (options): Repartition into set implied by -a and others.
+ Correct -a text to match reality.
+
+ * readelf.c (struct section_argument): Add bool member 'implicit'.
+ (parse_opt): Set it for -a cases, clear it for -x args.
+ (for_each_section_argument): Don't complain about a missing section by
+ name if it's implicit.
+
+2009-11-16 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (print_string_section): Punt SHT_NOBITS like empty
+ sections, just as dump_data_section already does.
+
+2009-09-21 Ulrich Drepper <drepper@redhat.com>
+
+ * elflint.c (special_sections): Allow MERGE and STRINGS flags to be
+ set for .comment section.
+ Patch by Mark Wielaard <mjw@redhat.com>.
+
+2009-09-08 Roland McGrath <roland@redhat.com>
+
+ * ar.c (main): Fix typo in message format.
+
+2009-08-21 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (attr_callback): Use print_block only when we don't use
+ print_ops.
+
+2009-08-14 Roland McGrath <roland@redhat.com>
+
+ * ar.c (do_oper_extract): Use pathconf instead of statfs.
+
+2009-08-01 Ulrich Drepper <drepper@redhat.com>
+
+ * debugpred.h: Add two most const.
+
+2009-07-26 Mark Wielaard <mjw@redhat.com>
+
+ * elflint.c (check_note_data): Recognize NT_GNU_GOLD_VERSION.
+
+2009-07-25 Mark Wielaard <mjw@redhat.com>
+
+ * Makefile.am (addr2line_LDADD): Add $(libelf).
+
+2009-07-24 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (print_block): New function.
+ (print_ops): Use it.
+ (attr_callback): Use it for DW_FORM_block* forms.
+
+2009-07-20 Mark Wielaard <mjw@redhat.com>
+
+ * readelf.c (print_ops): Add handling of DW_OP_implicit_value
+ and DW_OP_stack_value.
+
+2009-07-14 Ulrich Drepper <drepper@redhat.com>
+
+ * elflint.c (check_elf_header): Allow Linux ABI.
+ (check_symtab): Handle STB_GNU_UNIQUE.
+
+2009-07-08 Mark Wielaard <mjw@redhat.com>
+
+ * readelf.c (attr_callback): Handle DW_Form constants for
+ DW_AT_data_member_location.
+
+2009-07-06 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (register_info): New function. Handle unknown register #s.
+ (print_cfa_program): Use it.
+ (handle_core_register, handle_core_registers): Likewise.
+
+2009-06-28 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (print_address_names): New static variable.
+ (options, parse_opt): Grok -N/--numeric-addresses to clear it.
+ (format_dwarf_addr): Don't look up name if !print_address_names.
+
+2009-06-13 Ulrich Drepper <drepper@redhat.com>
+
+ * ldgeneric.c: Don't use deprecated libelf functions.
+ * nm.c: Likewise.
+ * objdump.c: Likewise.
+ * readelf.c: Likewise.
+ * size.c: Likewise.
+ * strip.c: Likewise.
+ * unstrip.c: Likewise.
+ * ld.h: Fix up comment.
+
+2009-06-01 Ulrich Drepper <drepper@redhat.com>
+
+ * readelf.c (print_relocs): Expect ELF header argument and pass on
+ to handle_relocs_rel* functions. Adjust caller.
+ (handle_relocs_rel): Add ELF header argument. Add special case for
+ the IRELATIVE relocations in statically linked executables.
+ (handle_relocs_rela): Likewise.
+
+2009-04-29 Ulrich Drepper <drepper@redhat.com>
+
+ * elflint.c (check_symtab): Add tests of st_other field.
+
+2009-04-23 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile [BUILD_STATIC] (libdw): Add $(zip_LIBS).
+
+2009-04-20 Roland McGrath <roland@redhat.com>
+
+ * addr2line.c (print_dwarf_function): Honor -s and -A for file names
+ of inline call sites.
+
+ * addr2line.c (just_section): New variable.
+ (adjust_to_section): New function, broken out of ...
+ (handle_address): ... here.
+ (options, parse_opt): Add -j/--section=NAME to set it.
+
+2009-04-15 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (print_debug_frame_section): Check for DW_CIE_ID_64 in
+ 64-bit format header, DW_CIE_ID_32 in 32-bit format header.
+
+2009-04-14 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (print_attributes): Treat SHT_ARM_ATTRIBUTES on EM_ARM
+ like SHT_GNU_ATTRIBUTES.
+
+ * readelf.c (handle_core_registers): Fix error message.
+
+ * strip.c (handle_elf: check_preserved): Don't note any change when
+ .debug_data is already filled from a previous pass.
+
+2009-02-05 Ulrich Drepper <drepper@redhat.com>
+
+ * objdump.c (show_relocs_x): Minor cleanups.
+
+ * readelf.c (print_cfa_program): Correct a few labels.
+ Print first DW_CFA_expression and DW_CFA_val_expression parameter
+ as register.
+
+2009-02-01 Ulrich Drepper <drepper@redhat.com>
+
+ * objdump.c (show_relocs_rel, show_relocs_rela): Split common parts
+ into ...
+ (show_relocs_x): ...here. New function.
+ (show_relocs): Better spacing in output.
+
+ * objdump.c (show_relocs_rela): Show offsets as signed values.
+
+ * ar.c (main): Fix recognition of invalid modes for a, b, i modifiers.
+ Improve some error messages.
+ Use program_invocation_short_name instead of AR macro.
+ * Makefile.am (CFLAGS_ar): Remove.
+ * elflint.c (parse_opt): ARGP_HELP_EXIT_ERR does nothing for argp_help.
+ * objdump.c (parse_opt): Likewise.
+ * readelf.c (parse_opt): Likewise.
+
+2009-01-27 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (print_ops): Notice short length, don't overrun buffer
+ (still need to fix LEB128).
+
+ * readelf.c (print_ops): Fix DW_OP_call[24] decoding.
+
+ * readelf.c (print_ops): Print (empty)\n when LEN == 0.
+
+2009-01-24 Ulrich Drepper <drepper@redhat.com>
+
+ * readelf.c (print_debug_frame_section): Fix computation of vma_base
+ for PC-relative mode.
+
+2009-01-23 Ulrich Drepper <drepper@redhat.com>
+
+ * size.c (process_file): When handling archive, close file descriptor
+ here. For unknown file format also close file descriptor.
+ (handle_ar): Don't close file descriptor here.
+
+ * readelf.c (parse_opt): Move code to add to dump_data_sections and
+ string_sections list in local function add_dump_section. Adjust 'x'
+ key handling. For 'a' key add .strtab, .dynstr, and .comment section
+ to string_sections list.
+
+2009-01-22 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (print_phdr): Don't print section mapping when no sections.
+
+ * Makefile.am (AM_CFLAGS): Pass -Wno-format for *_no_Wformat.
+
+ * readelf.c (print_debug_frame_section): Initialize IS_SIGNED to false
+ and reset it only for the 'true' cases.
+
+ * Makefile.am (addr2line_no_Wformat): New variable.
+
+ * readelf.c (print_debug_frame_section): Use t instead of j formats
+ for ptrdiff_t OFFSET.
+
+2009-01-21 Ulrich Drepper <drepper@redhat.com>
+
+ * elflint.c (check_program_header): Fix typo in .eh_frame_hdr section
+ test. Handle debuginfo files.
+ (check_exception_data): First sanity test.
+
+2009-01-17 Ulrich Drepper <drepper@redhat.com>
+
+ * readelf.c (print_debug_exception_table): Show target of ar_disp
+ field.
+
+ * elflint.c (check_program_header): Add most consistency checks for
+ PT_GNU_EH_FRAME entry.
+
+ * addr2line.c: Use ARGP_PROGRAM_VERSION_HOOK_DEF and
+ ARGP_PROGRAM_BUG_ADDRESS_DEF.
+ * ar.c: Likewise.
+ * elfcmp.c: Likewise.
+ * elflint.c: Likewise.
+ * findtextrel.c: Likewise.
+ * ld.c: Likewise.
+ * nm.c: Likewise.
+ * objdump.c: Likewise.
+ * ranlib.c: Likewise.
+ * readelf.c: Likewise.
+
+ * size.c: Likewise.
+ * strings.c: Likewise.
+ * strip.c: Likewise.
+ * unstrip.c: Likewise.
+
+2009-01-16 Ulrich Drepper <drepper@redhat.com>
+
+ * elflint.c (check_program_header): Check that PT_GNU_EH_FRAME entry
+ matches .eh_frame_hdr section, if it is available. Also check that
+ the segment is allocated, not writable, not executable.
+
+ * readelf.c: Add -e option. Dump exception and unwind related
+ sections. Add -e to -a.
+ (print_encoding_base): Handle DW_EH_PE_omit.
+ (print_debug_exception_table): Beginning of support.
+ (print_debug): Hook up print_debug_exception_table for
+ .gcc_except_table sections.
+
+ * readelf.c (print_debug_frame_section): Some fixes for last change.
+
+2009-01-15 Ulrich Drepper <drepper@redhat.com>
+
+ * readelf.c (print_encoding): Now a toplevel function.
+ (print_relinfo): Likewise.
+ (print_encoding_base): Broken out of print_debug_frame_section.
+ (print_debug_frame_section): Print different header for .eh_frame
+ sections. Fix recognition of matching CIEs in .debug_frame sections.
+ Print absolute offset for PC-relative FDE locations. Don't print
+ table header for FDEs if the table is empty.
+ (read_encoded): New function.
+ (print_debug_frame_hdr_section): New function.
+ (print_debug): Hook up print_debug_frame_hdr_section for .eh_frame_hdr
+ sections.
+
+ * readelf.c (handle_relocs_rel): Print section number.
+ (print_debug_abbrev_section): Likewise.
+ (print_debug_aranges_section): Likewise.
+ (print_debug_ranges_section): Likewise.
+ (print_debug_info_section): Likewise.
+ (print_debug_line_section): Likewise.
+ (print_debug_loc_section): Likewise.
+ (print_debug_macinfo_section): Likewise.
+ (print_debug_pubnames_section): Likewise.
+ (print_debug_str_section): Likewise.
+
+2009-01-10 Ulrich Drepper <drepper@redhat.com>
+
+ * strings.c (read_block): Fix typo in error message string.
+
+2009-01-07 Ulrich Drepper <drepper@redhat.com>
+
+ * ld.c (ld_new_searchdir): Fix adding to search path list.
+
+2009-01-06 Ulrich Drepper <drepper@redhat.com>
+
+ * readelf.c: Implement call frame debug section dumping.
+
+2009-01-05 Roland McGrath <roland@redhat.com>
+
+ * elfcmp.c: Exit with status 2 for errors (like cmp, diff, grep).
+ Status 1 (aka EXIT_FAILURE) is only for completed OK but not equal.
+
+2009-01-01 Ulrich Drepper <drepper@redhat.com>
+
+ * addr2line.c: Update copyright year.
+ * ar.c: Likewise.
+ * elfcmp.c: Likewise.
+ * elflint.c: Likewise.
+ * findtextrel.c: Likewise.
+ * ld.c: Likewise.
+ * nm.c: Likewise.
+ * objdump.c: Likewise.
+ * ranlib.c: Likewise.
+ * readelf.c: Likewise.
+ * size.c: Likewise.
+ * strings.c: Likewise.
+ * strip.c: Likewise.
+ * unstrip.c: Likewise.
+
+2008-12-11 Roland McGrath <roland@redhat.com>
+
+ * nm.c (sym_name): New function.
+ (show_symbols_sysv): Use it in place of elf_strptr.
+ (show_symbols_bsd, show_symbols_posix): Likewise.
+ Fixes RHBZ#476136.
+
+ * nm.c (show_symbols_sysv): Use an alloca'd backup section name when
+ elf_strptr fails.
+
+2008-12-02 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (count_dwflmod, process_file): Don't presume encoding of
+ nonzero OFFSET argument to dwfl_getmodules.
+
+2008-08-07 Roland McGrath <roland@redhat.com>
+
+ * addr2line.c (main): Pass string to handle_address.
+ (see_one_module): New function, subroutine of handle_address.
+ (find_symbol): Likewise.
+ (handle_address): Take string argument rather than address.
+ Convert plain number, or handle strings like "(section)+offset"
+ or "symbol+offset".
+
+2008-08-01 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (handle_core_item): Handle 'B' type for 1-origin bitset.
+ For 'b' and 'B', print <x-y,z> or ~<x,y-z> rather than 1/0 string.
+
+ * readelf.c (convert): Take new argument SIZE.
+ (handle_core_register, handle_core_item): Update callers.
+ (handle_core_item): Take new arg REPEATED_SIZE.
+ (handle_core_items): Special case for a singleton item,
+ let handle_core_item handle repeats if it wants to.
+
+ * readelf.c (handle_core_items): Give abridged output
+ for identical groups repeated more than twice.
+
+2008-07-04 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (handle_core_items): Handle ELF_T_ADDR.
+
+2008-04-10 Roland McGrath <roland@redhat.com>
+
+ * strip.c (handle_elf): Don't keep sections that kept symbol tables
+ refer to. Instead, just be sure to preserve the original symbol
+ table in the debug file so those symbols go with their sections and
+ can be elided from the stripped version of the symbol table.
+
+ * strip.c (handle_elf): When a discarded section kept in the debug
+ file refers to a nondiscard section via sh_link/sh_info, preserve
+ that nondiscarded section unmodified in the debug file as well.
+ Skip adjustment of discarded sections symbol table references when
+ that symbol table is copied in this way.
+
+ * elflint.c (check_symtab): Don't crash from missing symbol names
+ after diagnosing bogus strtab.
+
+ * strip.c (handle_elf): Cosmetic cleanup in special section contents
+ adjustment for symtab changes.
+
+2008-03-31 Roland McGrath <roland@redhat.com>
+
+ * elflint.c (check_sections): Add checks on SHF_EXECINSTR sections:
+ must be SHT_PROGBITS, must not be SHF_WRITE. Let backend hook
+ excuse a special section.
+
+2008-03-27 Roland McGrath <roland@redhat.com>
+
+ * elflint.c (check_sections): Check that executability and writability
+ of sections is reflected in segment p_flags.
+
+2008-03-26 Roland McGrath <roland@redhat.com>
+
+ * elflint.c (check_program_header): Accept PT_GNU_RELRO p_flags
+ that matches its PT_LOAD's p_flags &~ PF_W. On sparc, PF_X really
+ is valid in RELRO.
+
+2008-02-29 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (print_attributes): Add a cast.
+ * elflint.c (check_attributes): Likewise.
+
+ * unaligned.h (add_8ubyte_unaligned): Cast PTR argument for parity
+ with [UNALIGNED_ACCESS_CLASS == BYTE_ORDER] definition.
+ (add_4ubyte_unaligned, add_2ubyte_unaligned): Likewise.
+
+2008-02-03 Ulrich Drepper <drepper@redhat.com>
+
+ * i386_ld.c (elf_i386_count_relocations): Implement R_386_TLS_GD
+ when linked into executable.
+ (elf_i386_create_relocations): Likewise.
+
+2008-02-20 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (print_attributes): New function.
+ (process_elf_file): Call it under -A.
+
+ * elflint.c (check_attributes): Implement it for real.
+
+2008-02-19 Roland McGrath <roland@redhat.com>
+
+ * elflint.c (special_sections): Handle .gnu.attributes section.
+ (check_sections): Likewise.
+ (check_attributes): New function.
+
+2008-02-10 Roland McGrath <roland@redhat.com>
+
+ * elfcmp.c (main): Ignore sh_offset differences in non-SHF_ALLOC
+ sections and ET_REL files.
+
+2008-02-02 Ulrich Drepper <drepper@redhat.com>
+
+ * elf32-i386.script: Add .eh_frame_hdr, .tdata, and .tbss sections.
+ * i386_ld.c (elf_i386_count_relocations): Handle R_386_TLS_LDO_32
+ and R_386_TLS_LE.
+ (elf_i386_create_relocations): Likewise.
+ * ld.h (struct ld_state): Add need_tls, tls_start, and tls_tcb
+ elements.
+ * ldgeneric.c (add_section): If TLS section is used, set need_tls flag.
+ (ld_generic_create_outfile): Add PT_TLS entry to program header.
+ Fix generation of PT_GNU_STACK entry.
+
+2008-02-01 Ulrich Drepper <drepper@redhat.com>
+
+ * ld.c (replace_args): Prevent loop over replacements if the parameter
+ is only two characters long.
+
+ * ld.c: Recognize sha1 argument for --build-id parameter.
+ * ldgeneric.c (create_build_id_section): Handle sha1.
+ (compute_hash_sum): New function. Broken out of compute_build_id.
+ Take hash function and context as parameters.
+ (compute_build_id): Use compute_hash_sum for md5 and the new sha1
+ implementation.
+
+2008-01-31 Ulrich Drepper <drepper@redhat.com>
+
+ * elf32-i386.script: Add .note.ABI-tag and .note.gnu.build-id sections.
+ * ld.c: Recognize --build-id command line parameter.
+ * ld.h: Define scn_dot_note_gnu_build_id.
+ (struct ld_state): Add build_id and buildidscnidx elements.
+ * ldgeneric.c: Implement --build-id command line parameter.
+ * ldlex.l (ID): Recognize - as valid character after the first one.
+
+2008-01-29 Ulrich Drepper <drepper@redhat.com>
+
+ * ld.c (replace_args): New function.
+ (main): Use it to rewrite old-style parameters.
+
+ * elf32-i386.script: Add .gnu.hash section.
+ * ldgeneric.c (optimal_bucket_size): A tiny bit more efficient.
+ (fillin_special_symbol): Initialize st_size.
+ (sortfct_hashval): New function.
+ (create_gnu_hash): New function.
+ (create_hash): New function.
+ (ld_generic_create_outfile): Use the new functions to create the
+ hash tables.
+
+ * elflint.c (check_gnu_hash): Fix index value printed in error message.
+
+2008-01-24 Ulrich Drepper <drepper@redhat.com>
+
+ * elflint.c (check_group): Check that signature symbol for section
+ group is not an empty string.
+ * ldgeneric.c: Remove magic assignment of indeces in the dynsym
+ section. Start implementation of --hash-style.
+ * i386_ld.c: Likewise.
+ * ld.c: Recognize --hash-style.
+ * ld.h (struct scninfo): Add comdat_group.
+ Add additional parameter to finalize_plt callback.
+
+2008-01-22 Ulrich Drepper <drepper@redhat.com>
+
+ * ld.h (struct callbacks): Add initialize_gotplt.
+ (struct scnhead): Add scn_dot_gotplt.
+ (struct ld_state): Add gotpltscnidx.
+ * i386_ld.c (elf_i386_initialize_plt): Minor optimization.
+ (elf_i386_initialize_pltrel): Likewise.
+ (elf_i386_initialize_got): There is now a separate .got.plt, so
+ don't do the PLT-related work here. Initialize d_type.
+ (elf_i386_initialize_gotplt): New function.
+ (elf_i386_plt0): Use ud2a after indirect jump.
+ (elf_i386_pic_plt0_entry): Likewise.
+ (elf_i386_finalize_plt): Reference now .got.plt.
+ (elf_i386_count_relocations): For GOT entries which need no relocation
+ don't bump nrel_got.
+ (elf_i386_create_relocations): Also get .got.plt. Rewrite R-386_GOT32
+ handling for split .got/.got.plt.
+ (elf_i386_ld_init): Initialize callbacks.initialize_gotplt.
+ * elf32-i386.script: Sort sections for security. There are no .got
+ input sections. Add .got.plt.
+ * ldgeneric.c (ld_generic_generate_sections): Add .got.plt section.
+ (ld_generic_create_outfile): Initialize .got.plt section.
+ Use .got.plt address for _GLOBAL_OFFSET_TABLE_ symbol and DT_PLTGOT.
+
+2008-01-19 Ulrich Drepper <drepper@redhat.com>
+
+ * i386_ld.c (elf_i386_count_relocations): PLT relocations for undefined
+ symbols are not carried over into statically linked output files.
+ Add dummy entries for more TLS relocations.
+
+ * ld.c (options): Add long names for -( and -).
+
+ * ldgeneric.c (check_definition): For newly found definitions don't
+ mark section as used if symbol is absolute.
+ (extract_from_archive): Only assign archive sequence number the first
+ time the archive is handled. Update ld_state.last_archive_used
+ if any symbol was used. Remove nround variable.
+ (file_process2): When using symbol from an archive, update
+ ld_state.group_start_archive, ld_state.archives, and
+ ld_state.tailarchives.
+ (ld_generic_file_process): If group is not handled anymore, after
+ freeing ELF handles for the archives, clear ld_state.archives and
+ *nextp. Fix wrong logic in recognizing first iteration of group
+ loop. When clearing flags, also clear ld_state.group_start_archive.
+
+2008-01-11 Ulrich Drepper <drepper@redhat.com>
+
+ * objdump.c (show_disasm): Adjust disassembler format string for
+ removal of %e.
+
+2008-01-04 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (handle_core_items): Take new arg DESCSZ; if nonzero,
+ a size greater than the items cover means multiple sets of items.
+ (handle_core_note): Update caller.
+
+2008-01-04 Roland McGrath <roland@redhat.com>
+
+ * strip.c (handle_elf): Move SHDRIDX defn to silence gcc warning.
+
+2008-01-03 Roland McGrath <roland@redhat.com>
+
+ * ld.h (linked_from_dso_p): Use __attribute__ ((__gnu_inline__)).
+
+ * elflint.c (check_dynamic): Remove duplicate initializer.
+
+2008-01-02 Ulrich Drepper <drepper@redhat.com>
+
+ * addr2line.c: Update copyright year.
+ * ar.c: Likewise.
+ * elfcmp.c: Likewise.
+ * elflint.c: Likewise.
+ * findtextrel.c: Likewise.
+ * ld.c: Likewise.
+ * nm.c: Likewise.
+ * objdump.c: Likewise.
+ * ranlib.c: Likewise.
+ * readelf.c: Likewise.
+ * size.c: Likewise.
+ * strings.c: Likewise.
+ * strip.c: Likewise.
+ * unstrip.c: Likewise.
+
+2007-12-30 Ulrich Drepper <drepper@redhat.com>
+
+ * objdump (show_disasm): Use %e after third parameter.
+
+2007-12-21 Ulrich Drepper <drepper@redhat.com>
+
+ * strip.c: Fix wrong parenthesis in a few branch predictions.
+ * strings.c: Likewise.
+
+2007-12-20 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am (DEFS): Add DEBUGPRED.
+ * addr2line.c: Include debugpred.h.
+ * ar.c: Likewise.
+ * elfcmp.c: Likewise.
+ * elflint.c: Likewise.
+ * findtextrel.c: Likewise.
+ * nm.c: Likewise.
+ * objdump.c: Likewise.
+ * ranlib.c: Likewise.
+ * readelf.c: Likewise.
+ * size.c: Likewise.
+ * strings.c: Likewise.
+ * strip.c: Likewise.
+ * unstrip.c: Likewise.
+ * debugpred.h: New file.
+
+ * readelf.c (handle_relocs_rel): Use elf_scnshndx.
+ (handle_relocs_rela): Likewise.
+
+ * readelf.c: Add lots of likely/unlikely.
+
+ * elflint.c: Minor cleanups.
+
+2007-11-19 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (print_ops): Handle all bad op codes gracefully.
+ Print their numbers instead of just ???.
+
+2007-11-09 Roland McGrath <roland@redhat.com>
+
+ * readelf.c (attr_callback): Handle DW_AT_data_location.
+ Handle block forms to mean a DWARF expression for DW_AT_allocated,
+ DW_AT_associated, DW_AT_bit_size, DW_AT_bit_offset, DW_AT_bit_stride,
+ DW_AT_byte_size, DW_AT_byte_stride, DW_AT_count, DW_AT_lower_bound,
+ DW_AT_upper_bound.
+
2007-10-20 Roland McGrath <roland@redhat.com>
* unstrip.c (options): Update -R description.
diff --git a/src/Makefile.am b/src/Makefile.am
index 138be5a3..afd3bd3a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to create Makefile.in
##
-## Copyright (C) 1996-2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
+## Copyright (C) 1996-2010 Red Hat, Inc.
## This file is part of Red Hat elfutils.
##
## Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -24,24 +24,17 @@
## Network licensing program, please visit www.openinventionnetwork.com
## <http://www.openinventionnetwork.com>.
##
-DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H $(YYDEBUG) \
- -DSRCDIR=\"$(shell cd $(srcdir);pwd)\" -DOBJDIR=\"$(shell pwd)\"
-if MUDFLAP
-AM_CFLAGS = -fmudflap
-else
-AM_CFLAGS =
-endif
-AM_CFLAGS += -Wall -Wshadow -std=gnu99 $(native_ld_cflags) \
- $(if $($(*F)_no_Werror),,-Werror) \
- $(if $($(*F)_no_Wunused),,-Wunused -Wextra) \
- $(if $($(*F)_no_Wformat),,-Wformat=2) $(CFLAGS_$(*F))
-
-INCLUDES = -I$(srcdir) -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
- -I$(srcdir)/../libdw -I$(srcdir)/../libdwfl \
- -I$(srcdir)/../lib -I..
+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_LDFLAGS = -Wl,-rpath-link,../libelf:../libdw
+no_mudflap.os = -fmudflap
+
YACC = @YACC@ -d
AM_YFLAGS = -pld
AM_LFLAGS = -Pld -olex.yy.c
@@ -70,8 +63,6 @@ noinst_LIBRARIES += libdummy.a
libdummy_a_SOURCES = i386_ld.c
endif
-textrel_check = if readelf -d $@ | fgrep -q TEXTREL; then exit 1; fi
-
ld_SOURCES = ld.c ldgeneric.c ldlex.l ldscript.y symbolhash.c sectionhash.c \
versionhash.c
@@ -81,21 +72,20 @@ libar_a_SOURCES = arlib.c arlib2.c
noinst_HEADERS = ld.h symbolhash.h sectionhash.h versionhash.h \
ldscript.h xelf.h unaligned.h
-EXTRA_DIST = elf32-i386.script libld_elf_i386.map $(ld_modules) arlib.h
+EXTRA_DIST = elf32-i386.script libld_elf_i386.map $(ld_modules) arlib.h \
+ debugpred.h
ld_modules = i386_ld.c
bin_SCRIPTS = make-debug-archive
EXTRA_DIST += make-debug-archive.in
-CLEANFILES = make-debug-archive
-
-if MUDFLAP
-libmudflap = -lmudflap
-endif
+CLEANFILES += make-debug-archive
if BUILD_STATIC
-libdw = ../libdw/libdw.a $(libelf) $(libebl) -ldl
+libasm = ../libasm/libasm.a
+libdw = ../libdw/libdw.a $(zip_LIBS) $(libelf) $(libebl) -ldl
libelf = ../libelf/libelf.a
else
+libasm = ../libasm/libasm.so
libdw = ../libdw/libdw.so
libelf = ../libelf/libelf.so
endif
@@ -105,6 +95,7 @@ libeu = ../lib/libeu.a
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
@@ -120,13 +111,12 @@ endif
ld_LDFLAGS = -rdynamic
elflint_LDADD = $(libebl) $(libelf) $(libeu) $(libmudflap) -ldl
findtextrel_LDADD = $(libdw) $(libelf) $(libmudflap)
-addr2line_LDADD = $(libdw) $(libmudflap)
+addr2line_LDADD = $(libdw) $(libelf) $(libmudflap)
elfcmp_LDADD = $(libebl) $(libelf) $(libmudflap) -ldl
-objdump_LDADD = $(libebl) $(libelf) $(libeu) $(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)
-CFLAGS_ar = -DAR=\"$(shell echo ar|sed '$(transform)')\"
unstrip_LDADD = $(libebl) $(libelf) $(libdw) $(libeu) $(libmudflap) -ldl
ldlex.o: ldscript.c
@@ -148,16 +138,6 @@ libld_elf_i386.so: libld_elf_i386_pic.a libld_elf_i386.map
$(textrel_check)
endif
-
-%.os: %.c %.o
- if $(filter-out -fmudflap,$(COMPILE)) -c -o $@ -fpic -DPIC -DSHARED \
- -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
- `test -f '$<' || echo '$(srcdir)/'`$<; \
- then cat "$(DEPDIR)/$*.Tpo" >> "$(DEPDIR)/$*.Po"; \
- rm -f "$(DEPDIR)/$*.Tpo"; \
- else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
- fi
-
# Special rule to make it possible to define libld_elf_a_SOURCES as we do.
# Otherwise make would complain.
.deps/none_ld.Po: none_ld.os
@@ -180,7 +160,7 @@ installcheck-binPROGRAMS: $(bin_PROGRAMS)
done; \
done; rm -f c$${pid}_.???; exit $$bad
-CLEANFILES += none_ld.os $(ld_modules:.c=.os) *.gcno *.gcda *.gconv
+CLEANFILES += none_ld.os $(ld_modules:.c=.os) *.gconv
MAINTAINERCLEANFILES = ldlex.c ldscript.c ldscript.h
diff --git a/src/addr2line.c b/src/addr2line.c
index 394d0655..48f017bb 100644
--- a/src/addr2line.c
+++ b/src/addr2line.c
@@ -1,5 +1,5 @@
/* Locate source files and line information for given addresses
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2005.
@@ -46,13 +46,15 @@
#include <string.h>
#include <unistd.h>
+#include <system.h>
+
/* Name and version of program. */
static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
+ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
/* Bug report address. */
-const char *argp_program_bug_address = PACKAGE_BUGREPORT;
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
/* Values for the parameters which have no short form. */
@@ -67,6 +69,8 @@ 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 },
+ { "section", 'j', "NAME", 0,
+ N_("Treat addresses as offsets relative to NAME section."), 0 },
{ NULL, 0, NULL, 0, N_("Miscellaneous:"), 0 },
/* Unsupported options. */
@@ -96,7 +100,7 @@ static const struct argp argp =
/* Handle ADDR. */
-static void handle_address (GElf_Addr addr, Dwfl *dwfl);
+static int handle_address (const char *addr, Dwfl *dwfl);
/* True if only base names of files should be shown. */
@@ -111,6 +115,9 @@ static bool show_functions;
/* True if ELF symbol or section info should be shown. */
static bool show_symbols;
+/* If non-null, take address parameters as relative to named section. */
+static const char *just_section;
+
int
main (int argc, char *argv[])
@@ -154,12 +161,7 @@ main (int argc, char *argv[])
if (getline (&buf, &len, stdin) < 0)
break;
- char *endp;
- uintmax_t addr = strtoumax (buf, &endp, 0);
- if (endp != buf)
- handle_address (addr, dwfl);
- else
- result = 1;
+ result = handle_address (buf, dwfl);
}
free (buf);
@@ -167,14 +169,7 @@ main (int argc, char *argv[])
else
{
do
- {
- char *endp;
- uintmax_t addr = strtoumax (argv[remaining], &endp, 0);
- if (endp != argv[remaining])
- handle_address (addr, dwfl);
- else
- result = 1;
- }
+ result = handle_address (argv[remaining], dwfl);
while (++remaining < argc);
}
@@ -191,15 +186,14 @@ print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
Copyright (C) %s Red Hat, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2009");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
/* Handle program arguments. */
static error_t
-parse_opt (int key, char *arg __attribute__ ((unused)),
- struct argp_state *state)
+parse_opt (int key, char *arg, struct argp_state *state)
{
switch (key)
{
@@ -229,6 +223,10 @@ parse_opt (int key, char *arg __attribute__ ((unused)),
show_symbols = true;
break;
+ case 'j':
+ just_section = arg;
+ break;
+
default:
return ARGP_ERR_UNKNOWN;
}
@@ -286,15 +284,35 @@ print_dwarf_function (Dwfl_Module *mod, Dwarf_Addr addr)
DW_AT_call_column,
&attr_mem), &val) == 0)
colno = val;
- if (lineno == 0)
+
+ const char *comp_dir = "";
+ const char *comp_dir_sep = "";
+
+ if (file == NULL)
+ file = "???";
+ else if (only_basenames)
+ file = basename (file);
+ else if (use_comp_dir && file[0] != '/')
{
- if (file != NULL)
- printf (" from %s", file);
+ const char *const *dirs;
+ size_t ndirs;
+ if (dwarf_getsrcdirs (files, &dirs, &ndirs) == 0
+ && dirs[0] != NULL)
+ {
+ comp_dir = dirs[0];
+ comp_dir_sep = "/";
+ }
}
+
+ if (lineno == 0)
+ printf (" from %s%s%s",
+ comp_dir, comp_dir_sep, file);
else if (colno == 0)
- printf (" at %s:%u", file, lineno);
+ printf (" at %s%s%s:%u",
+ comp_dir, comp_dir_sep, file, lineno);
else
- printf (" at %s:%u:%u", file, lineno, colno);
+ printf (" at %s%s%s:%u:%u",
+ comp_dir, comp_dir_sep, file, lineno, colno);
}
}
printf (" in ");
@@ -328,9 +346,148 @@ print_addrsym (Dwfl_Module *mod, GElf_Addr addr)
printf ("%s+%#" PRIx64 "\n", name, addr - s.st_value);
}
-static void
-handle_address (GElf_Addr addr, Dwfl *dwfl)
+static int
+see_one_module (Dwfl_Module *mod,
+ void **userdata __attribute__ ((unused)),
+ const char *name __attribute__ ((unused)),
+ Dwarf_Addr start __attribute__ ((unused)),
+ void *arg)
+{
+ Dwfl_Module **result = arg;
+ if (*result != NULL)
+ return DWARF_CB_ABORT;
+ *result = mod;
+ return DWARF_CB_OK;
+}
+
+static int
+find_symbol (Dwfl_Module *mod,
+ void **userdata __attribute__ ((unused)),
+ const char *name __attribute__ ((unused)),
+ Dwarf_Addr start __attribute__ ((unused)),
+ void *arg)
+{
+ const char *looking_for = ((void **) arg)[0];
+ GElf_Sym *symbol = ((void **) arg)[1];
+
+ int n = dwfl_module_getsymtab (mod);
+ for (int i = 1; i < n; ++i)
+ {
+ const char *symbol_name = dwfl_module_getsym (mod, i, symbol, NULL);
+ if (symbol_name == NULL || symbol_name[0] == '\0')
+ continue;
+ switch (GELF_ST_TYPE (symbol->st_info))
+ {
+ case STT_SECTION:
+ case STT_FILE:
+ case STT_TLS:
+ break;
+ default:
+ if (!strcmp (symbol_name, looking_for))
+ {
+ ((void **) arg)[0] = NULL;
+ return DWARF_CB_ABORT;
+ }
+ }
+ }
+
+ return DWARF_CB_OK;
+}
+
+static bool
+adjust_to_section (const char *name, uintmax_t *addr, Dwfl *dwfl)
{
+ /* It was (section)+offset. This makes sense if there is
+ only one module to look in for a section. */
+ Dwfl_Module *mod = NULL;
+ if (dwfl_getmodules (dwfl, &see_one_module, &mod, 0) != 0
+ || mod == NULL)
+ error (EXIT_FAILURE, 0, gettext ("Section syntax requires"
+ " exactly one module"));
+
+ int nscn = dwfl_module_relocations (mod);
+ for (int i = 0; i < nscn; ++i)
+ {
+ GElf_Word shndx;
+ const char *scn = dwfl_module_relocation_info (mod, i, &shndx);
+ if (unlikely (scn == NULL))
+ break;
+ if (!strcmp (scn, name))
+ {
+ /* Found the section. */
+ GElf_Shdr shdr_mem;
+ GElf_Addr shdr_bias;
+ GElf_Shdr *shdr = gelf_getshdr
+ (elf_getscn (dwfl_module_getelf (mod, &shdr_bias), shndx),
+ &shdr_mem);
+ if (unlikely (shdr == NULL))
+ break;
+
+ if (*addr >= shdr->sh_size)
+ error (0, 0,
+ gettext ("offset %#" PRIxMAX " lies outside"
+ " section '%s'"),
+ *addr, scn);
+
+ *addr += shdr->sh_addr + shdr_bias;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+static int
+handle_address (const char *string, Dwfl *dwfl)
+{
+ char *endp;
+ uintmax_t addr = strtoumax (string, &endp, 0);
+ if (endp == string)
+ {
+ bool parsed = false;
+ int i, j;
+ char *name = NULL;
+ if (sscanf (string, "(%m[^)])%" PRIiMAX "%n", &name, &addr, &i) == 2
+ && string[i] == '\0')
+ parsed = adjust_to_section (name, &addr, dwfl);
+ switch (sscanf (string, "%m[^-+]%n%" PRIiMAX "%n", &name, &i, &addr, &j))
+ {
+ default:
+ break;
+ case 1:
+ addr = 0;
+ j = i;
+ case 2:
+ if (string[j] != '\0')
+ break;
+
+ /* It was symbol[+offset]. */
+ GElf_Sym sym;
+ void *arg[2] = { name, &sym };
+ (void) dwfl_getmodules (dwfl, &find_symbol, arg, 0);
+ if (arg[0] != NULL)
+ error (0, 0, gettext ("cannot find symbol '%s'"), name);
+ else
+ {
+ if (sym.st_size != 0 && addr >= sym.st_size)
+ error (0, 0,
+ gettext ("offset %#" PRIxMAX " lies outside"
+ " contents of '%s'"),
+ addr, name);
+ addr += sym.st_value;
+ parsed = true;
+ }
+ break;
+ }
+
+ free (name);
+ if (!parsed)
+ return 1;
+ }
+ else if (just_section != NULL
+ && !adjust_to_section (just_section, &addr, dwfl))
+ return 1;
+
Dwfl_Module *mod = dwfl_addrmodule (dwfl, addr);
if (show_functions)
@@ -372,4 +529,9 @@ handle_address (GElf_Addr addr, Dwfl *dwfl)
}
else
puts ("??:0");
+
+ return 0;
}
+
+
+#include "debugpred.h"
diff --git a/src/ar.c b/src/ar.c
index a9102a55..149d116d 100644
--- a/src/ar.c
+++ b/src/ar.c
@@ -1,5 +1,5 @@
/* Create, modify, and extract from archives.
- Copyright (C) 2005, 2007 Red Hat, Inc.
+ Copyright (C) 2005-2010 Red Hat, Inc.
Written by Ulrich Drepper <drepper@redhat.com>, 2005.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -45,7 +45,7 @@
#include <time.h>
#include <unistd.h>
#include <sys/mman.h>
-#include <sys/statfs.h>
+#include <sys/stat.h>
#include <sys/time.h>
#include <system.h>
@@ -55,7 +55,8 @@
/* Name and version of program. */
static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
+ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
+
/* Prototypes for local functions. */
static int do_oper_extract (int oper, const char *arfname, char **argv,
int argc, long int instance);
@@ -66,7 +67,7 @@ static int do_oper_insert (int oper, const char *arfname, char **argv,
/* Bug report address. */
-const char *argp_program_bug_address = PACKAGE_BUGREPORT;
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
/* Definitions of arguments for argp functions. */
@@ -187,14 +188,16 @@ main (int argc, char *argv[])
if (ipos != ipos_none)
{
/* Only valid for certain operations. */
- if (operation == oper_extract && operation == oper_delete)
+ if (operation != oper_move && operation != oper_replace)
error (1, 0, gettext ("\
'a', 'b', and 'i' are only allowed with the 'm' and 'r' options"));
if (remaining == argc)
{
- error (0, 0, gettext ("MEMBER parameter required"));
- argp_help (&argp, stderr, ARGP_HELP_SEE, AR);
+ error (0, 0, gettext ("\
+MEMBER parameter required for 'a', 'b', and 'i' modifiers"));
+ argp_help (&argp, stderr, ARGP_HELP_USAGE | ARGP_HELP_SEE,
+ program_invocation_short_name);
exit (EXIT_FAILURE);
}
@@ -213,7 +216,8 @@ main (int argc, char *argv[])
if (remaining == argc)
{
error (0, 0, gettext ("COUNT parameter required"));
- argp_help (&argp, stderr, ARGP_HELP_SEE, AR);
+ argp_help (&argp, stderr, ARGP_HELP_SEE,
+ program_invocation_short_name);
exit (EXIT_FAILURE);
}
@@ -230,14 +234,14 @@ main (int argc, char *argv[])
if ((dont_replace_existing || allow_truncate_fname)
&& unlikely (operation != oper_extract))
- error (1, 0, gettext ("'%' is only meaningful with the 'x' option"),
+ error (1, 0, gettext ("'%c' is only meaningful with the 'x' option"),
dont_replace_existing ? 'C' : 'T');
/* There must at least be one more parameter specifying the archive. */
if (remaining == argc)
{
- error (0, 0, gettext ("Archive name required"));
- argp_help (&argp, stderr, ARGP_HELP_SEE, AR);
+ error (0, 0, gettext ("archive name required"));
+ argp_help (&argp, stderr, ARGP_HELP_SEE, program_invocation_short_name);
exit (EXIT_FAILURE);
}
@@ -286,7 +290,7 @@ print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
Copyright (C) %s Red Hat, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2009");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
@@ -308,7 +312,8 @@ parse_opt (int key, char *arg __attribute__ ((unused)),
if (operation != oper_none)
{
error (0, 0, gettext ("More than one operation specified"));
- argp_help (&argp, stderr, ARGP_HELP_SEE, AR);
+ argp_help (&argp, stderr, ARGP_HELP_SEE,
+ program_invocation_short_name);
exit (EXIT_FAILURE);
}
@@ -454,8 +459,21 @@ do_oper_extract (int oper, const char *arfname, char **argv, int argc,
bool found[argc];
memset (found, '\0', sizeof (found));
- struct statfs f;
- f.f_namelen = 0;
+ size_t name_max = 0;
+ inline bool should_truncate_fname (void)
+ {
+ if (errno == ENAMETOOLONG && allow_truncate_fname)
+ {
+ if (name_max == 0)
+ {
+ long int len = pathconf (".", _PC_NAME_MAX);
+ if (len > 0)
+ name_max = len;
+ }
+ return name_max != 0;
+ }
+ return false;
+ }
off_t index_off = -1;
size_t index_size = 0;
@@ -606,15 +624,14 @@ do_oper_extract (int oper, const char *arfname, char **argv, int argc,
{
int printlen = INT_MAX;
- if (errno == ENAMETOOLONG && allow_truncate_fname
- && (f.f_namelen != 0 || statfs (".", &f) == 0))
+ if (should_truncate_fname ())
{
/* Try to truncate the name. First find out by how
much. */
- printlen = f.f_namelen;
- char truncfname[f.f_namelen + 1];
+ printlen = name_max;
+ char truncfname[name_max + 1];
*((char *) mempcpy (truncfname, arhdr->ar_name,
- f.f_namelen)) = '\0';
+ name_max)) = '\0';
xfd = open (truncfname, flags, 0600);
}
@@ -696,15 +713,14 @@ do_oper_extract (int oper, const char *arfname, char **argv, int argc,
{
int printlen = INT_MAX;
- if (errno == ENAMETOOLONG && allow_truncate_fname
- && (f.f_namelen != 0 || statfs (".", &f) == 0))
+ if (should_truncate_fname ())
{
/* Try to truncate the name. First find out by how
much. */
- printlen = f.f_namelen;
- char truncfname[f.f_namelen + 1];
+ printlen = name_max;
+ char truncfname[name_max + 1];
*((char *) mempcpy (truncfname, arhdr->ar_name,
- f.f_namelen)) = '\0';
+ name_max)) = '\0';
if (dont_replace_existing)
{
@@ -1097,7 +1113,8 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
if (fd == -1)
{
if (!suppress_create_msg)
- fprintf (stderr, "%s: creating %s\n", AR, arfname);
+ fprintf (stderr, "%s: creating %s\n",
+ program_invocation_short_name, arfname);
goto no_old;
}
@@ -1211,7 +1228,7 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
if (found[cnt] == NULL)
{
fprintf (stderr, gettext ("%s: no entry %s in archive!\n"),
- AR, argv[cnt]);
+ program_invocation_short_name, argv[cnt]);
status = 1;
}
@@ -1513,3 +1530,6 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
return status;
}
+
+
+#include "debugpred.h"
diff --git a/src/debugpred.h b/src/debugpred.h
new file mode 100644
index 00000000..41d46796
--- /dev/null
+++ b/src/debugpred.h
@@ -0,0 +1,53 @@
+/* Support to debug branch prediction.
+ Copyright (C) 2007 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2007.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#include <stdio.h>
+
+#if DEBUGPRED
+extern const unsigned long int __start_predict_data;
+extern const unsigned long int __stop_predict_data;
+extern const unsigned long int __start_predict_line;
+extern const char *const __start_predict_file;
+
+static void
+__attribute__ ((destructor))
+predprint (void)
+{
+ const unsigned long int *s = &__start_predict_data;
+ const unsigned long int *e = &__stop_predict_data;
+ const unsigned long int *sl = &__start_predict_line;
+ const char *const *sf = &__start_predict_file;
+ while (s < e)
+ {
+ if (s[0] != 0 || s[1] != 0)
+ printf ("%s:%lu: wrong=%lu, correct=%lu%s\n", *sf, *sl, s[0], s[1],
+ s[0] > s[1] ? " <==== WARNING" : "");
+ ++sl;
+ ++sf;
+ s += 2;
+ }
+}
+#endif
diff --git a/src/elf32-i386.script b/src/elf32-i386.script
index d62333ac..a6cfffa1 100644
--- a/src/elf32-i386.script
+++ b/src/elf32-i386.script
@@ -18,7 +18,10 @@ SEGMENT [RX]
#endif
.interp;
+ .note.ABI-tag;
+ .note.gnu.build-id;
.hash;
+ .gnu.hash;
.dynsym;
.dynstr;
.gnu.version;
@@ -47,6 +50,7 @@ SEGMENT [RX]
*(.gnu.linkonce.r.*)
}
.rodata1;
+ .eh_frame_hdr;
. = ALIGN(32 / 8);
PROVIDE (__preinit_array_start = .);
.preinit_array
@@ -85,18 +89,24 @@ SEGMENT [RW]
/* Adjust the address for the data segment. We want to adjust up to
the same address within the page on the next page up. */
. = ALIGN(PAGESIZE) + (. & (PAGESIZE - 1));
- .data
- {
- *(.data)
- *(.data.*)
- *(.gnu.linkonce.d.*)
- }
- .data1;
.eh_frame
{
KEEP (*(.eh_frame))
}
.gcc_except_table;
+ .tdata
+ {
+ *(.tdata)
+ *(.tdata.*)
+ *(.gnu.linkone.td.*)
+ }
+ .tbss
+ {
+ *(.tbss)
+ *(.tbss.*)
+ *(.gnu.linkone.tb.*)
+ *(.tcommon)
+ }
.ctors
{
/* gcc uses crtbegin.o to find the start of
@@ -125,15 +135,19 @@ SEGMENT [RW]
KEEP (*(.dtors))
}
.jcr;
- .got
+ .dynamic;
+ .got;
+ .got.plt;
+ .data
{
- *(.got.plt)
- *(.got)
+ *(.data)
+ *(.data.*)
+ *(.gnu.linkonce.d.*)
}
- .dynamic;
/* We want the small data sections together, so single-instruction offsets
can access them all, and initialized data all before uninitialized, so
we can shorten the on-disk segment size. */
+ .data1;
.sdata
{
*(.sdata)
diff --git a/src/elfcmp.c b/src/elfcmp.c
index bcc2d4bf..71a80092 100644
--- a/src/elfcmp.c
+++ b/src/elfcmp.c
@@ -1,5 +1,5 @@
/* Compare relevant content of two ELF files.
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2005.
@@ -41,6 +41,7 @@
#include <string.h>
#include <unistd.h>
+#include <system.h>
#include "../libelf/elf-knowledge.h"
#include "../libebl/libeblP.h"
@@ -53,10 +54,10 @@ static int regioncompare (const void *p1, const void *p2);
/* Name and version of program. */
static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
+ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
/* Bug report address. */
-const char *argp_program_bug_address = PACKAGE_BUGREPORT;
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
/* Values for the parameters which have no short form. */
#define OPT_GAPS 0x100
@@ -164,12 +165,12 @@ main (int argc, char *argv[])
GElf_Ehdr ehdr1_mem;
GElf_Ehdr *ehdr1 = gelf_getehdr (elf1, &ehdr1_mem);
if (ehdr1 == NULL)
- error (EXIT_FAILURE, 0, gettext ("cannot get ELF header of '%s': %s"),
+ error (2, 0, gettext ("cannot get ELF header of '%s': %s"),
fname1, elf_errmsg (-1));
GElf_Ehdr ehdr2_mem;
GElf_Ehdr *ehdr2 = gelf_getehdr (elf2, &ehdr2_mem);
if (ehdr2 == NULL)
- error (EXIT_FAILURE, 0, gettext ("cannot get ELF header of '%s': %s"),
+ error (2, 0, gettext ("cannot get ELF header of '%s': %s"),
fname2, elf_errmsg (-1));
/* Compare the ELF headers. */
@@ -191,6 +192,39 @@ main (int argc, char *argv[])
goto out;
}
+ size_t shnum1;
+ size_t shnum2;
+ if (unlikely (elf_getshdrnum (elf1, &shnum1) != 0))
+ error (2, 0, gettext ("cannot get section count of '%s': %s"),
+ fname1, elf_errmsg (-1));
+ if (unlikely (elf_getshdrnum (elf2, &shnum2) != 0))
+ error (2, 0, gettext ("cannot get section count of '%s': %s"),
+ fname2, elf_errmsg (-1));
+ if (unlikely (shnum1 != shnum2))
+ {
+ if (! quiet)
+ error (0, 0, gettext ("%s %s diff: section count"), fname1, fname2);
+ result = 1;
+ goto out;
+ }
+
+ size_t phnum1;
+ size_t phnum2;
+ if (unlikely (elf_getphdrnum (elf1, &phnum1) != 0))
+ error (2, 0, gettext ("cannot get program header count of '%s': %s"),
+ fname1, elf_errmsg (-1));
+ if (unlikely (elf_getphdrnum (elf2, &phnum2) != 0))
+ error (2, 0, gettext ("cannot get program header count of '%s': %s"),
+ fname2, elf_errmsg (-1));
+ if (unlikely (phnum1 != phnum2))
+ {
+ if (! quiet)
+ error (0, 0, gettext ("%s %s diff: program header count"),
+ fname1, fname2);
+ result = 1;
+ goto out;
+ }
+
/* Iterate over all sections. We expect the sections in the two
files to match exactly. */
Elf_Scn *scn1 = NULL;
@@ -259,7 +293,9 @@ main (int argc, char *argv[])
// XXX Any flags which should be ignored?
|| shdr1->sh_flags != shdr2->sh_flags
|| shdr1->sh_addr != shdr2->sh_addr
- || shdr1->sh_offset != shdr2->sh_offset
+ || (shdr1->sh_offset != shdr2->sh_offset
+ && (shdr1->sh_flags & SHF_ALLOC)
+ && ehdr1->e_type != ET_REL)
|| shdr1->sh_size != shdr2->sh_size
|| shdr1->sh_link != shdr2->sh_link
|| shdr1->sh_info != shdr2->sh_info
@@ -269,13 +305,13 @@ main (int argc, char *argv[])
Elf_Data *data1 = elf_getdata (scn1, NULL);
if (data1 == NULL)
- error (EXIT_FAILURE, 0,
+ error (2, 0,
gettext ("cannot get content of section %zu in '%s': %s"),
elf_ndxscn (scn1), fname1, elf_errmsg (-1));
Elf_Data *data2 = elf_getdata (scn2, NULL);
if (data2 == NULL)
- error (EXIT_FAILURE, 0,
+ error (2, 0,
gettext ("cannot get content of section %zu in '%s': %s"),
elf_ndxscn (scn2), fname2, elf_errmsg (-1));
@@ -291,13 +327,13 @@ main (int argc, char *argv[])
GElf_Sym sym1_mem;
GElf_Sym *sym1 = gelf_getsym (data1, ndx, &sym1_mem);
if (sym1 == NULL)
- error (EXIT_FAILURE, 0,
+ error (2, 0,
gettext ("cannot get symbol in '%s': %s"),
fname1, elf_errmsg (-1));
GElf_Sym sym2_mem;
GElf_Sym *sym2 = gelf_getsym (data2, ndx, &sym2_mem);
if (sym2 == NULL)
- error (EXIT_FAILURE, 0,
+ error (2, 0,
gettext ("cannot get symbol in '%s': %s"),
fname2, elf_errmsg (-1));
@@ -407,7 +443,7 @@ main (int argc, char *argv[])
ehdr_region.next = &phdr_region;
phdr_region.from = ehdr1->e_phoff;
- phdr_region.to = ehdr1->e_phoff + ehdr1->e_phnum * ehdr1->e_phentsize;
+ phdr_region.to = ehdr1->e_phoff + phnum1 * ehdr1->e_phentsize;
phdr_region.next = regions;
regions = &ehdr_region;
@@ -424,12 +460,12 @@ main (int argc, char *argv[])
{
raw1 = elf_rawfile (elf1, &size1);
if (raw1 == NULL )
- error (EXIT_FAILURE, 0, gettext ("cannot load data of '%s': %s"),
+ error (2, 0, gettext ("cannot load data of '%s': %s"),
fname1, elf_errmsg (-1));
raw2 = elf_rawfile (elf2, &size2);
if (raw2 == NULL )
- error (EXIT_FAILURE, 0, gettext ("cannot load data of '%s': %s"),
+ error (2, 0, gettext ("cannot load data of '%s': %s"),
fname2, elf_errmsg (-1));
for (size_t cnt = 0; cnt < nregions; ++cnt)
@@ -442,18 +478,18 @@ main (int argc, char *argv[])
}
/* Compare the program header tables. */
- for (int ndx = 0; ndx < ehdr1->e_phnum; ++ndx)
+ for (unsigned int ndx = 0; ndx < phnum1; ++ndx)
{
GElf_Phdr phdr1_mem;
GElf_Phdr *phdr1 = gelf_getphdr (elf1, ndx, &phdr1_mem);
if (ehdr1 == NULL)
- error (EXIT_FAILURE, 0,
+ error (2, 0,
gettext ("cannot get program header entry %d of '%s': %s"),
ndx, fname1, elf_errmsg (-1));
GElf_Phdr phdr2_mem;
GElf_Phdr *phdr2 = gelf_getphdr (elf2, ndx, &phdr2_mem);
if (ehdr2 == NULL)
- error (EXIT_FAILURE, 0,
+ error (2, 0,
gettext ("cannot get program header entry %d of '%s': %s"),
ndx, fname2, elf_errmsg (-1));
@@ -520,7 +556,7 @@ print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
Copyright (C) %s Red Hat, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2009");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
@@ -568,15 +604,15 @@ open_file (const char *fname, int *fdp, Ebl **eblp)
{
int fd = open (fname, O_RDONLY);
if (unlikely (fd == -1))
- error (EXIT_FAILURE, errno, gettext ("cannot open '%s'"), fname);
+ error (2, errno, gettext ("cannot open '%s'"), fname);
Elf *elf = elf_begin (fd, ELF_C_READ_MMAP, NULL);
if (elf == NULL)
- error (EXIT_FAILURE, 0,
+ error (2, 0,
gettext ("cannot create ELF descriptor for '%s': %s"),
fname, elf_errmsg (-1));
Ebl *ebl = ebl_openbackend (elf);
if (ebl == NULL)
- error (EXIT_FAILURE, 0,
+ error (2, 0,
gettext ("cannot create EBL descriptor for '%s'"), fname);
*fdp = fd;
@@ -594,7 +630,7 @@ search_for_copy_reloc (Ebl *ebl, size_t scnndx, int symndx)
GElf_Shdr shdr_mem;
GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
if (shdr == NULL)
- error (EXIT_FAILURE, 0,
+ error (2, 0,
gettext ("cannot get section header of section %zu: %s"),
elf_ndxscn (scn), elf_errmsg (-1));
@@ -604,7 +640,7 @@ search_for_copy_reloc (Ebl *ebl, size_t scnndx, int symndx)
Elf_Data *data = elf_getdata (scn, NULL);
if (data == NULL)
- error (EXIT_FAILURE, 0,
+ error (2, 0,
gettext ("cannot get content of section %zu: %s"),
elf_ndxscn (scn), elf_errmsg (-1));
@@ -615,7 +651,7 @@ search_for_copy_reloc (Ebl *ebl, size_t scnndx, int symndx)
GElf_Rel rel_mem;
GElf_Rel *rel = gelf_getrel (data, ndx, &rel_mem);
if (rel == NULL)
- error (EXIT_FAILURE, 0, gettext ("cannot get relocation: %s"),
+ error (2, 0, gettext ("cannot get relocation: %s"),
elf_errmsg (-1));
if ((int) GELF_R_SYM (rel->r_info) == symndx
@@ -629,7 +665,7 @@ search_for_copy_reloc (Ebl *ebl, size_t scnndx, int symndx)
GElf_Rela rela_mem;
GElf_Rela *rela = gelf_getrela (data, ndx, &rela_mem);
if (rela == NULL)
- error (EXIT_FAILURE, 0, gettext ("cannot get relocation: %s"),
+ error (2, 0, gettext ("cannot get relocation: %s"),
elf_errmsg (-1));
if ((int) GELF_R_SYM (rela->r_info) == symndx
@@ -744,3 +780,6 @@ hash_content_equivalent (size_t entsize, Elf_Data *data1, Elf_Data *data2)
return false;
}
+
+
+#include "debugpred.h"
diff --git a/src/elflint.c b/src/elflint.c
index 3ddf670f..afe8bee6 100644
--- a/src/elflint.c
+++ b/src/elflint.c
@@ -1,5 +1,5 @@
/* Pedantic checking of ELF files compliance with gABI/psABI spec.
- Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2001-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -42,19 +42,25 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <sys/stat.h>
#include <sys/param.h>
#include <elf-knowledge.h>
#include <system.h>
+#include "../libelf/libelfP.h"
+#include "../libelf/common.h"
#include "../libebl/libeblP.h"
+#include "../libdw/libdwP.h"
+#include "../libdwfl/libdwflP.h"
+#include "../libdw/memory-access.h"
/* Name and version of program. */
static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
+ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
/* Bug report address. */
-const char *argp_program_bug_address = PACKAGE_BUGREPORT;
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
#define ARGP_strict 300
#define ARGP_gnuld 301
@@ -62,7 +68,6 @@ const char *argp_program_bug_address = PACKAGE_BUGREPORT;
/* Definitions of arguments for argp functions. */
static const struct argp_option options[] =
{
-
{ "strict", ARGP_strict, NULL, 0,
N_("Be extremely strict, flag level 2 features."), 0 },
{ "quiet", 'q', NULL, 0, N_("Do not print anything if successful"), 0 },
@@ -216,9 +221,8 @@ parse_opt (int key, char *arg __attribute__ ((unused)),
case ARGP_KEY_NO_ARGS:
fputs (gettext ("Missing file name.\n"), stderr);
- argp_help (&argp, stderr, ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR,
- program_invocation_short_name);
- exit (1);
+ argp_help (&argp, stderr, ARGP_HELP_SEE, program_invocation_short_name);
+ exit (EXIT_FAILURE);
default:
return ARGP_ERR_UNKNOWN;
@@ -236,7 +240,7 @@ print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
Copyright (C) %s Red Hat, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2009");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
@@ -340,8 +344,9 @@ static const int valid_e_machine[] =
(sizeof (valid_e_machine) / sizeof (valid_e_machine[0]))
-/* Number of sections. */
+/* Numbers of sections and program headers. */
static unsigned int shnum;
+static unsigned int phnum;
static void
@@ -374,8 +379,9 @@ check_elf_header (Ebl *ebl, GElf_Ehdr *ehdr, size_t size)
ERROR (gettext ("unknown ELF header version number e_ident[%d] == %d\n"),
EI_VERSION, ehdr->e_ident[EI_VERSION]);
- /* We currently don't handle any OS ABIs. */
- if (ehdr->e_ident[EI_OSABI] != ELFOSABI_NONE)
+ /* We currently don't handle any OS ABIs other than Linux. */
+ if (ehdr->e_ident[EI_OSABI] != ELFOSABI_NONE
+ && ehdr->e_ident[EI_OSABI] != ELFOSABI_LINUX)
ERROR (gettext ("unsupported OS ABI e_ident[%d] == '%s'\n"),
EI_OSABI,
ebl_osabi_name (ebl, ehdr->e_ident[EI_OSABI], buf, sizeof (buf)));
@@ -460,6 +466,24 @@ invalid number of section header table entries\n"));
ERROR (gettext ("invalid section header index\n"));
}
+ phnum = ehdr->e_phnum;
+ if (ehdr->e_phnum == PN_XNUM)
+ {
+ /* Get the header of the zeroth section. The sh_info field
+ might contain the phnum count. */
+ GElf_Shdr shdr_mem;
+ GElf_Shdr *shdr = gelf_getshdr (elf_getscn (ebl->elf, 0), &shdr_mem);
+ if (shdr != NULL)
+ {
+ /* The error will be reported later. */
+ if (shdr->sh_info < PN_XNUM)
+ ERROR (gettext ("\
+invalid number of program header table entries\n"));
+ else
+ phnum = shdr->sh_info;
+ }
+ }
+
/* Check the e_flags field. */
if (!ebl_machine_flag_check (ebl, ehdr->e_flags))
ERROR (gettext ("invalid machine flags: %s\n"),
@@ -474,13 +498,13 @@ invalid number of section header table entries\n"));
if (ehdr->e_phentsize != 0 && ehdr->e_phentsize != sizeof (Elf32_Phdr))
ERROR (gettext ("invalid program header size: %hd\n"),
ehdr->e_phentsize);
- else if (ehdr->e_phoff + ehdr->e_phnum * ehdr->e_phentsize > size)
+ else if (ehdr->e_phoff + phnum * ehdr->e_phentsize > size)
ERROR (gettext ("invalid program header position or size\n"));
if (ehdr->e_shentsize != 0 && ehdr->e_shentsize != sizeof (Elf32_Shdr))
ERROR (gettext ("invalid section header size: %hd\n"),
ehdr->e_shentsize);
- else if (ehdr->e_shoff + ehdr->e_shnum * ehdr->e_shentsize > size)
+ else if (ehdr->e_shoff + shnum * ehdr->e_shentsize > size)
ERROR (gettext ("invalid section header position or size\n"));
}
else if (gelf_getclass (ebl->elf) == ELFCLASS64)
@@ -491,7 +515,7 @@ invalid number of section header table entries\n"));
if (ehdr->e_phentsize != 0 && ehdr->e_phentsize != sizeof (Elf64_Phdr))
ERROR (gettext ("invalid program header size: %hd\n"),
ehdr->e_phentsize);
- else if (ehdr->e_phoff + ehdr->e_phnum * ehdr->e_phentsize > size)
+ else if (ehdr->e_phoff + phnum * ehdr->e_phentsize > size)
ERROR (gettext ("invalid program header position or size\n"));
if (ehdr->e_shentsize != 0 && ehdr->e_shentsize != sizeof (Elf64_Shdr))
@@ -547,7 +571,7 @@ section [%2d] '%s': section with SHF_GROUP flag set not part of a section group\
idx, section_name (ebl, idx));
else
ERROR (gettext ("\
-section [%2d] '%s': section group [%2zu] '%s' does not preceed group member\n"),
+section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"),
idx, section_name (ebl, idx),
cnt, section_name (ebl, cnt));
}
@@ -574,16 +598,18 @@ check_symtab (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
return;
if (strshdr->sh_type != SHT_STRTAB)
- ERROR (gettext ("section [%2d] '%s': referenced as string table for section [%2d] '%s' but type is not SHT_STRTAB\n"),
- shdr->sh_link, section_name (ebl, shdr->sh_link),
- idx, section_name (ebl, idx));
+ {
+ ERROR (gettext ("section [%2d] '%s': referenced as string table for section [%2d] '%s' but type is not SHT_STRTAB\n"),
+ shdr->sh_link, section_name (ebl, shdr->sh_link),
+ idx, section_name (ebl, idx));
+ strshdr = NULL;
+ }
/* Search for an extended section index table section. */
- size_t cnt;
Elf_Data *xndxdata = NULL;
Elf32_Word xndxscnidx = 0;
bool found_xndx = false;
- for (cnt = 1; cnt < shnum; ++cnt)
+ for (size_t cnt = 1; cnt < shnum; ++cnt)
if (cnt != (size_t) idx)
{
Elf_Scn *xndxscn = elf_getscn (ebl->elf, cnt);
@@ -608,8 +634,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))
ERROR (gettext ("\
-section [%2zu] '%s': entry size is does not match ElfXX_Sym\n"),
- cnt, section_name (ebl, cnt));
+section [%2u] '%s': entry size is does not match ElfXX_Sym\n"),
+ idx, section_name (ebl, idx));
/* Test the zeroth entry. */
GElf_Sym sym_mem;
@@ -644,7 +670,7 @@ section [%2d] '%s': XINDEX for zeroth entry not zero\n"),
xndxscnidx, section_name (ebl, xndxscnidx));
}
- for (cnt = 1; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
+ for (size_t cnt = 1; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
{
sym = gelf_getsymshndx (data, xndxdata, cnt, &sym_mem, &xndx);
if (sym == NULL)
@@ -655,7 +681,9 @@ section [%2d] '%s': XINDEX for zeroth entry not zero\n"),
}
const char *name = NULL;
- if (sym->st_name >= strshdr->sh_size)
+ if (strshdr == NULL)
+ name = "";
+ else if (sym->st_name >= strshdr->sh_size)
ERROR (gettext ("\
section [%2d] '%s': symbol %zu: invalid name value\n"),
idx, section_name (ebl, idx), cnt);
@@ -698,10 +726,17 @@ section [%2d] '%s': symbol %zu: invalid section index\n"),
ERROR (gettext ("section [%2d] '%s': symbol %zu: unknown type\n"),
idx, section_name (ebl, idx), cnt);
- if (GELF_ST_BIND (sym->st_info) >= STB_NUM)
+ if (GELF_ST_BIND (sym->st_info) >= STB_NUM
+ && !ebl_symbol_binding_name (ebl, GELF_ST_BIND (sym->st_info), NULL,
+ 0))
ERROR (gettext ("\
section [%2d] '%s': symbol %zu: unknown symbol binding\n"),
idx, section_name (ebl, idx), cnt);
+ if (GELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE
+ && GELF_ST_TYPE (sym->st_info) != STT_OBJECT)
+ ERROR (gettext ("\
+section [%2d] '%s': symbol %zu: unique symbol not of object type\n"),
+ idx, section_name (ebl, idx), cnt);
if (xndx == SHN_COMMON)
{
@@ -770,7 +805,7 @@ section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have SHF_
if (ehdr->e_type == ET_REL)
{
/* For object files the symbol value must fall
- into the section. */
+ into the section. */
if (sym->st_value > destshdr->sh_size)
ERROR (gettext ("\
section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section [%2d] '%s'\n"),
@@ -787,16 +822,16 @@ section [%2d] '%s': symbol %zu does not fit completely in referenced section [%2
{
GElf_Phdr phdr_mem;
GElf_Phdr *phdr = NULL;
- int pcnt;
+ unsigned int pcnt;
- for (pcnt = 0; pcnt < ehdr->e_phnum; ++pcnt)
+ for (pcnt = 0; pcnt < phnum; ++pcnt)
{
phdr = gelf_getphdr (ebl->elf, pcnt, &phdr_mem);
if (phdr != NULL && phdr->p_type == PT_TLS)
break;
}
- if (pcnt == ehdr->e_phnum)
+ if (pcnt == phnum)
{
if (no_pt_tls++ == 0)
ERROR (gettext ("\
@@ -944,7 +979,7 @@ section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got section\n"
/* Check that address and size match the dynamic section.
We locate the dynamic section via the program header
entry. */
- for (int pcnt = 0; pcnt < ehdr->e_phnum; ++pcnt)
+ for (unsigned int pcnt = 0; pcnt < phnum; ++pcnt)
{
GElf_Phdr phdr_mem;
GElf_Phdr *phdr = gelf_getphdr (ebl->elf, pcnt, &phdr_mem);
@@ -969,6 +1004,17 @@ section [%2d] '%s': _DYNAMIC symbol size %" PRIu64 " does not match dynamic segm
}
}
}
+
+ if (GELF_ST_VISIBILITY (sym->st_other) != STV_DEFAULT
+ && shdr->sh_type == SHT_DYNSYM)
+ ERROR (gettext ("\
+section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-default visibility\n"),
+ idx, section_name (ebl, idx), cnt);
+ if ((sym->st_other ^ GELF_ST_VISIBILITY (sym->st_other)) != 0)
+ ERROR (gettext ("\
+section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"),
+ idx, section_name (ebl, idx), cnt);
+
}
}
@@ -1190,7 +1236,7 @@ section [%2d] '%s': section entry size does not match ElfXX_Rel\n"),
the loaded segments are and b) which are read-only. This will
also allow us to determine whether the same reloc section is
modifying loaded and not loaded segments. */
- for (int i = 0; i < ehdr->e_phnum; ++i)
+ for (unsigned int i = 0; i < phnum; ++i)
{
GElf_Phdr phdr_mem;
GElf_Phdr *phdr = gelf_getphdr (ebl->elf, i, &phdr_mem);
@@ -1508,7 +1554,6 @@ check_dynamic (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
[DT_JMPREL] = { [DT_PLTRELSZ] = true, [DT_PLTREL] = true },
[DT_RUNPATH] = { [DT_STRTAB] = true },
[DT_PLTREL] = { [DT_JMPREL] = true },
- [DT_PLTRELSZ] = { [DT_JMPREL] = true }
};
bool has_dt[DT_NUM];
bool has_val_dt[DT_VALNUM];
@@ -1678,7 +1723,7 @@ section [%2d] '%s': entry %zu: pointer does not match address of section [%2d] '
case DT_VERNEED:
case DT_VERSYM:
check_addr:
- for (n = 0; n < ehdr->e_phnum; ++n)
+ for (n = 0; n < phnum; ++n)
{
GElf_Phdr phdr_mem;
GElf_Phdr *phdr = gelf_getphdr (ebl->elf, n, &phdr_mem);
@@ -1687,7 +1732,7 @@ section [%2d] '%s': entry %zu: pointer does not match address of section [%2d] '
&& phdr->p_vaddr + phdr->p_memsz > dyn->d_un.d_ptr)
break;
}
- if (unlikely (n >= ehdr->e_phnum))
+ if (unlikely (n >= phnum))
{
char buf[50];
ERROR (gettext ("\
@@ -2064,7 +2109,8 @@ section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"),
&& GELF_ST_TYPE (sym->st_info) != STT_FUNC)
ERROR (gettext ("\
section [%2d] '%s': symbol %u referenced in chain for bucket %zu is undefined\n"),
- idx, section_name (ebl, idx), symidx, cnt / 2 - 1);
+ idx, section_name (ebl, idx), symidx,
+ cnt - (4 + bitmask_words));
const char *symname = elf_strptr (ebl->elf, symshdr->sh_link,
sym->st_name);
@@ -2074,7 +2120,8 @@ section [%2d] '%s': symbol %u referenced in chain for bucket %zu is undefined\n"
if ((hval & ~1u) != (chainhash & ~1u))
ERROR (gettext ("\
section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"),
- idx, section_name (ebl, idx), symidx, cnt / 2 - 1);
+ idx, section_name (ebl, idx), symidx,
+ cnt - (4 + bitmask_words));
/* Set the bits in the bitmask. */
size_t maskidx = (hval / classbits) & bitmask_idxmask;
@@ -2104,12 +2151,12 @@ section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"),
if (symidx - symbias >= maxidx)
ERROR (gettext ("\
section [%2d] '%s': hash chain for bucket %zu out of bounds\n"),
- idx, section_name (ebl, idx), cnt / 2 - 1);
+ idx, section_name (ebl, idx), cnt - (4 + bitmask_words));
else if (symshdr != NULL
&& symidx > symshdr->sh_size / symshdr->sh_entsize)
ERROR (gettext ("\
section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"),
- idx, section_name (ebl, idx), cnt / 2 - 1);
+ idx, section_name (ebl, idx), cnt - (4 + bitmask_words));
}
if (memcmp (collected.p32, bitmask.p32, bitmask_words * sizeof (Elf32_Word)))
@@ -2354,9 +2401,9 @@ section [%2d] '%s': section groups only allowed in relocatable object files\n"),
}
/* Check that sh_link is an index of a symbol table. */
+ Elf_Scn *symscn = elf_getscn (ebl->elf, shdr->sh_link);
GElf_Shdr symshdr_mem;
- GElf_Shdr *symshdr = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
- &symshdr_mem);
+ GElf_Shdr *symshdr = gelf_getshdr (symscn, &symshdr_mem);
if (symshdr == NULL)
ERROR (gettext ("section [%2d] '%s': cannot get symbol table: %s\n"),
idx, section_name (ebl, idx), elf_errmsg (-1));
@@ -2377,6 +2424,19 @@ section [%2d] '%s': invalid symbol index in sh_info\n"),
ERROR (gettext ("section [%2d] '%s': sh_flags not zero\n"),
idx, section_name (ebl, idx));
+ GElf_Sym sym_data;
+ GElf_Sym *sym = gelf_getsym (elf_getdata (symscn, NULL), shdr->sh_info,
+ &sym_data);
+ if (sym == NULL)
+ ERROR (gettext ("\
+section [%2d] '%s': cannot get symbol for signature\n"),
+ idx, section_name (ebl, idx));
+ else if (strcmp (elf_strptr (ebl->elf, symshdr->sh_link, sym->st_name),
+ "") == 0)
+ ERROR (gettext ("\
+section [%2d] '%s': signature symbol cannot be empty string\n"),
+ idx, section_name (ebl, idx));
+
if (be_strict
&& shdr->sh_entsize != elf32_fsize (ELF_T_WORD, 1, EV_CURRENT))
ERROR (gettext ("section [%2d] '%s': sh_flags not set correctly\n"),
@@ -2740,18 +2800,18 @@ section [%2d] '%s': symbol %d: version index %d is for requested version\n"),
static int
-unknown_dependency_p (Elf *elf, GElf_Ehdr *ehdr, const char *fname)
+unknown_dependency_p (Elf *elf, const char *fname)
{
GElf_Phdr phdr_mem;
GElf_Phdr *phdr = NULL;
- int i;
- for (i = 0; i < ehdr->e_phnum; ++i)
+ unsigned int i;
+ for (i = 0; i < phnum; ++i)
if ((phdr = gelf_getphdr (elf, i, &phdr_mem)) != NULL
&& phdr->p_type == PT_DYNAMIC)
break;
- if (i == ehdr->e_phnum)
+ if (i == phnum)
return 1;
assert (phdr != NULL);
Elf_Scn *scn = gelf_offscn (elf, phdr->p_offset);
@@ -2779,7 +2839,7 @@ unknown_dependency_p (Elf *elf, GElf_Ehdr *ehdr, const char *fname)
static unsigned int nverneed;
static void
-check_verneed (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
+check_verneed (Ebl *ebl, GElf_Shdr *shdr, int idx)
{
if (++nverneed == 2)
ERROR (gettext ("more than one version reference section present\n"));
@@ -2834,7 +2894,7 @@ section [%2d] '%s': entry %d has invalid file reference\n"),
}
/* Check that there is a DT_NEEDED entry for the referenced library. */
- if (unknown_dependency_p (ebl->elf, ehdr, libname))
+ if (unknown_dependency_p (ebl->elf, libname))
ERROR (gettext ("\
section [%2d] '%s': entry %d references unknown dependency\n"),
idx, section_name (ebl, idx), cnt);
@@ -3086,6 +3146,194 @@ section [%2d] '%s': unknown parent version '%s'\n"),
}
}
+static void
+check_attributes (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
+{
+ if (shdr->sh_size == 0)
+ {
+ ERROR (gettext ("section [%2d] '%s': empty object attributes section\n"),
+ idx, section_name (ebl, idx));
+ return;
+ }
+
+ Elf_Data *data = elf_rawdata (elf_getscn (ebl->elf, idx), NULL);
+ if (data == NULL || data->d_size == 0)
+ {
+ ERROR (gettext ("section [%2d] '%s': cannot get section data\n"),
+ idx, section_name (ebl, idx));
+ return;
+ }
+
+ inline size_t pos (const unsigned char *p)
+ {
+ return p - (const unsigned char *) data->d_buf;
+ }
+
+ const unsigned char *p = data->d_buf;
+ if (*p++ != 'A')
+ {
+ ERROR (gettext ("section [%2d] '%s': unrecognized attribute format\n"),
+ idx, section_name (ebl, idx));
+ return;
+ }
+
+ inline size_t left (void)
+ {
+ return (const unsigned char *) data->d_buf + data->d_size - p;
+ }
+
+ while (left () >= 4)
+ {
+ uint32_t len;
+ memcpy (&len, p, sizeof len);
+
+ if (len == 0)
+ ERROR (gettext ("\
+section [%2d] '%s': offset %zu: zero length field in attribute section\n"),
+ idx, section_name (ebl, idx), pos (p));
+
+ if (MY_ELFDATA != ehdr->e_ident[EI_DATA])
+ CONVERT (len);
+
+ if (len > left ())
+ {
+ ERROR (gettext ("\
+section [%2d] '%s': offset %zu: invalid length in attribute section\n"),
+ idx, section_name (ebl, idx), pos (p));
+ break;
+ }
+
+ const unsigned char *name = p + sizeof len;
+ p += len;
+
+ unsigned const char *q = memchr (name, '\0', len);
+ if (q == NULL)
+ {
+ ERROR (gettext ("\
+section [%2d] '%s': offset %zu: unterminated vendor name string\n"),
+ idx, section_name (ebl, idx), pos (p));
+ continue;
+ }
+ ++q;
+
+ if (q - name == sizeof "gnu" && !memcmp (name, "gnu", sizeof "gnu"))
+ while (q < p)
+ {
+ unsigned const char *chunk = q;
+
+ unsigned int subsection_tag;
+ get_uleb128 (subsection_tag, q);
+
+ if (q >= p)
+ {
+ ERROR (gettext ("\
+section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"),
+ idx, section_name (ebl, idx), pos (chunk));
+ break;
+ }
+
+ uint32_t subsection_len;
+ if (p - q < (ptrdiff_t) sizeof subsection_len)
+ {
+ ERROR (gettext ("\
+section [%2d] '%s': offset %zu: truncated attribute section\n"),
+ idx, section_name (ebl, idx), pos (q));
+ break;
+ }
+
+ memcpy (&subsection_len, q, sizeof subsection_len);
+ if (subsection_len == 0)
+ {
+ ERROR (gettext ("\
+section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"),
+ idx, section_name (ebl, idx), pos (q));
+
+ q += sizeof subsection_len;
+ continue;
+ }
+
+ if (MY_ELFDATA != ehdr->e_ident[EI_DATA])
+ CONVERT (subsection_len);
+
+ if (p - chunk < (ptrdiff_t) subsection_len)
+ {
+ ERROR (gettext ("\
+section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"),
+ idx, section_name (ebl, idx), pos (q));
+ break;
+ }
+
+ const unsigned char *subsection_end = chunk + subsection_len;
+ chunk = q;
+ q = subsection_end;
+
+ if (subsection_tag != 1) /* Tag_File */
+ ERROR (gettext ("\
+section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"),
+ idx, section_name (ebl, idx), pos (chunk), subsection_tag);
+ else
+ {
+ chunk += sizeof subsection_len;
+ while (chunk < q)
+ {
+ unsigned int tag;
+ get_uleb128 (tag, chunk);
+
+ uint64_t value = 0;
+ const unsigned char *r = chunk;
+ if (tag == 32 || (tag & 1) == 0)
+ {
+ get_uleb128 (value, r);
+ if (r > q)
+ {
+ ERROR (gettext ("\
+section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"),
+ idx, section_name (ebl, idx), pos (chunk));
+ break;
+ }
+ }
+ if (tag == 32 || (tag & 1) != 0)
+ {
+ r = memchr (r, '\0', q - r);
+ if (r == NULL)
+ {
+ ERROR (gettext ("\
+section [%2d] '%s': offset %zu: unterminated string in attribute\n"),
+ idx, section_name (ebl, idx), pos (chunk));
+ break;
+ }
+ ++r;
+ }
+
+ const char *tag_name = NULL;
+ const char *value_name = NULL;
+ if (!ebl_check_object_attribute (ebl, (const char *) name,
+ tag, value,
+ &tag_name, &value_name))
+ ERROR (gettext ("\
+section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"),
+ idx, section_name (ebl, idx), pos (chunk), tag);
+ else if ((tag & 1) == 0 && value_name == NULL)
+ ERROR (gettext ("\
+section [%2d] '%s': offset %zu: unrecognized %s attribute value %" PRIu64 "\n"),
+ idx, section_name (ebl, idx), pos (chunk),
+ tag_name, value);
+
+ chunk = r;
+ }
+ }
+ }
+ else
+ ERROR (gettext ("\
+section [%2d] '%s': offset %zu: vendor '%s' unknown\n"),
+ idx, section_name (ebl, idx), pos (p), name);
+ }
+
+ if (left () != 0)
+ ERROR (gettext ("\
+section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"),
+ idx, section_name (ebl, idx), pos (p));
+}
static bool has_loadable_segment;
static bool has_interp_segment;
@@ -3102,7 +3350,7 @@ static const struct
{
/* See figure 4-14 in the gABI. */
{ ".bss", 5, SHT_NOBITS, exact, SHF_ALLOC | SHF_WRITE, 0 },
- { ".comment", 8, SHT_PROGBITS, exact, 0, 0 },
+ { ".comment", 8, SHT_PROGBITS, atleast, 0, SHF_MERGE | SHF_STRINGS },
{ ".data", 6, SHT_PROGBITS, exact, SHF_ALLOC | SHF_WRITE, 0 },
{ ".data1", 7, SHT_PROGBITS, exact, SHF_ALLOC | SHF_WRITE, 0 },
{ ".debug_str", 11, SHT_PROGBITS, exact_or_gnuld, SHF_MERGE | SHF_STRINGS, 0 },
@@ -3137,7 +3385,8 @@ static const struct
/* The following are GNU extensions. */
{ ".gnu.version", 13, SHT_GNU_versym, exact, SHF_ALLOC, 0 },
{ ".gnu.version_d", 15, SHT_GNU_verdef, exact, SHF_ALLOC, 0 },
- { ".gnu.version_r", 15, SHT_GNU_verneed, exact, SHF_ALLOC, 0 }
+ { ".gnu.version_r", 15, SHT_GNU_verneed, exact, SHF_ALLOC, 0 },
+ { ".gnu.attributes", 16, SHT_GNU_ATTRIBUTES, exact, 0, 0 },
};
#define nspecial_sections \
(sizeof (special_sections) / sizeof (special_sections[0]))
@@ -3147,6 +3396,13 @@ static const struct
&& !memcmp (special_sections[idx].name, string, \
sizeof string - (prefix ? 1 : 0)))
+
+/* Indeces of some sections we need later. */
+static size_t eh_frame_hdr_scnndx;
+static size_t eh_frame_scnndx;
+static size_t gcc_except_table_scnndx;
+
+
static void
check_sections (Ebl *ebl, GElf_Ehdr *ehdr)
{
@@ -3176,8 +3432,6 @@ check_sections (Ebl *ebl, GElf_Ehdr *ehdr)
ERROR (gettext ("zeroth section has nonzero address\n"));
if (shdr->sh_offset != 0)
ERROR (gettext ("zeroth section has nonzero offset\n"));
- if (shdr->sh_info != 0)
- ERROR (gettext ("zeroth section has nonzero info field\n"));
if (shdr->sh_addralign != 0)
ERROR (gettext ("zeroth section has nonzero align value\n"));
if (shdr->sh_entsize != 0)
@@ -3190,8 +3444,14 @@ zeroth section has nonzero size value while ELF header has nonzero shnum value\n
if (shdr->sh_link != 0 && ehdr->e_shstrndx != SHN_XINDEX)
ERROR (gettext ("\
zeroth section has nonzero link value while ELF header does not signal overflow in shstrndx\n"));
+
+ if (shdr->sh_info != 0 && ehdr->e_phnum != PN_XNUM)
+ ERROR (gettext ("\
+zeroth section has nonzero link value while ELF header does not signal overflow in phnum\n"));
}
+ int *segment_flags = xcalloc (phnum, sizeof segment_flags[0]);
+
bool dot_interp_section = false;
size_t hash_idx = 0;
@@ -3341,6 +3601,14 @@ section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable segments\n
break;
}
+
+ /* Remember a few special sections for later. */
+ if (strcmp (scnname, ".eh_frame_hdr") == 0)
+ eh_frame_hdr_scnndx = cnt;
+ else if (strcmp (scnname, ".eh_frame") == 0)
+ eh_frame_scnndx = cnt;
+ else if (strcmp (scnname, ".gcc_except_table") == 0)
+ gcc_except_table_scnndx = cnt;
}
if (shdr->sh_entsize != 0 && shdr->sh_size % shdr->sh_entsize)
@@ -3352,6 +3620,7 @@ section [%2zu] '%s': size not multiple of entry size\n"),
ERROR (gettext ("cannot get section header\n"));
if (shdr->sh_type >= SHT_NUM
+ && shdr->sh_type != SHT_GNU_ATTRIBUTES
&& shdr->sh_type != SHT_GNU_LIBLIST
&& shdr->sh_type != SHT_CHECKSUM
&& shdr->sh_type != SHT_GNU_verdef
@@ -3419,15 +3688,40 @@ section [%2zu] '%s': merge flag set but entry size is zero\n"),
if (shdr->sh_flags & SHF_GROUP)
check_scn_group (ebl, cnt);
+ if (shdr->sh_flags & SHF_EXECINSTR)
+ {
+ switch (shdr->sh_type)
+ {
+ case SHT_PROGBITS:
+ break;
+
+ case SHT_NOBITS:
+ if (is_debuginfo)
+ break;
+ default:
+ ERROR (gettext ("\
+section [%2zu] '%s' has unexpected type %d for an executable section\n"),
+ cnt, section_name (ebl, cnt), shdr->sh_type);
+ break;
+ }
+
+ if ((shdr->sh_flags & SHF_WRITE)
+ && !ebl_check_special_section (ebl, cnt, shdr,
+ section_name (ebl, cnt)))
+ ERROR (gettext ("\
+section [%2zu] '%s' is both executable and writable\n"),
+ cnt, section_name (ebl, cnt));
+ }
+
if (ehdr->e_type != ET_REL && (shdr->sh_flags & SHF_ALLOC) != 0)
{
/* Make sure the section is contained in a loaded segment
and that the initialization part matches NOBITS sections. */
- int pcnt;
+ unsigned int pcnt;
GElf_Phdr phdr_mem;
GElf_Phdr *phdr;
- for (pcnt = 0; pcnt < ehdr->e_phnum; ++pcnt)
+ for (pcnt = 0; pcnt < phnum; ++pcnt)
if ((phdr = gelf_getphdr (ebl->elf, pcnt, &phdr_mem)) != NULL
&& ((phdr->p_type == PT_LOAD
&& (shdr->sh_flags & SHF_TLS) == 0)
@@ -3463,10 +3757,32 @@ section [%2zu] '%s' has not type NOBITS but is not read from the file in segment
cnt, section_name (ebl, cnt), pcnt);
}
+ if (shdr->sh_type != SHT_NOBITS)
+ {
+ if ((shdr->sh_flags & SHF_EXECINSTR) != 0)
+ {
+ segment_flags[pcnt] |= PF_X;
+ if ((phdr->p_flags & PF_X) == 0)
+ ERROR (gettext ("\
+section [%2zu] '%s' is executable in nonexecutable segment %d\n"),
+ cnt, section_name (ebl, cnt), pcnt);
+ }
+
+ if ((shdr->sh_flags & SHF_WRITE) != 0)
+ {
+ segment_flags[pcnt] |= PF_W;
+ if (0 /* XXX vdso images have this */
+ && (phdr->p_flags & PF_W) == 0)
+ ERROR (gettext ("\
+section [%2zu] '%s' is writable in unwritable segment %d\n"),
+ cnt, section_name (ebl, cnt), pcnt);
+ }
+ }
+
break;
}
- if (pcnt == ehdr->e_phnum)
+ if (pcnt == phnum)
ERROR (gettext ("\
section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"),
cnt, section_name (ebl, cnt));
@@ -3537,13 +3853,17 @@ section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"),
break;
case SHT_GNU_verneed:
- check_verneed (ebl, ehdr, shdr, cnt);
+ check_verneed (ebl, shdr, cnt);
break;
case SHT_GNU_verdef:
check_verdef (ebl, shdr, cnt);
break;
+ case SHT_GNU_ATTRIBUTES:
+ check_attributes (ebl, ehdr, shdr, cnt);
+ break;
+
default:
/* Nothing. */
break;
@@ -3553,6 +3873,29 @@ section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"),
if (has_interp_segment && !dot_interp_section)
ERROR (gettext ("INTERP program header entry but no .interp section\n"));
+ if (!is_debuginfo)
+ for (unsigned int pcnt = 0; pcnt < phnum; ++pcnt)
+ {
+ GElf_Phdr phdr_mem;
+ GElf_Phdr *phdr = gelf_getphdr (ebl->elf, pcnt, &phdr_mem);
+ if (phdr != NULL && (phdr->p_type == PT_LOAD || phdr->p_type == PT_TLS))
+ {
+ if ((phdr->p_flags & PF_X) != 0
+ && (segment_flags[pcnt] & PF_X) == 0)
+ ERROR (gettext ("\
+loadable segment [%u] is executable but contains no executable sections\n"),
+ pcnt);
+
+ if ((phdr->p_flags & PF_W) != 0
+ && (segment_flags[pcnt] & PF_W) == 0)
+ ERROR (gettext ("\
+loadable segment [%u] is writable but contains no writable sections\n"),
+ pcnt);
+ }
+ }
+
+ free (segment_flags);
+
if (version_namelist != NULL)
{
if (versym_scnndx == 0)
@@ -3648,6 +3991,7 @@ section [%2d] '%s': unknown core file note type %" PRIu32
case NT_GNU_ABI_TAG:
case NT_GNU_HWCAP:
case NT_GNU_BUILD_ID:
+ case NT_GNU_GOLD_VERSION:
break;
case 0:
@@ -3673,6 +4017,7 @@ section [%2d] '%s': unknown object file note type %" PRIu32
return last_offset;
}
+
static void
check_note (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Phdr *phdr, int cnt)
{
@@ -3704,6 +4049,7 @@ phdr[%d]: no note entries defined for the type of file\n"),
cnt, phdr->p_filesz - notes_size);
}
+
static void
check_note_section (Ebl *ebl, GElf_Ehdr *ehdr, GElf_Shdr *shdr, int idx)
{
@@ -3735,6 +4081,11 @@ section [%2d] '%s': no note entries defined for the type of file\n"),
idx, section_name (ebl, idx), shdr->sh_size - notes_size);
}
+
+/* Index of the PT_GNU_EH_FRAME program eader entry. */
+static int pt_gnu_eh_frame_pndx;
+
+
static void
check_program_header (Ebl *ebl, GElf_Ehdr *ehdr)
{
@@ -3750,7 +4101,7 @@ only executables, shared objects, and core files can have program headers\n"));
int num_pt_tls = 0;
int num_pt_relro = 0;
- for (int cnt = 0; cnt < ehdr->e_phnum; ++cnt)
+ for (unsigned int cnt = 0; cnt < phnum; ++cnt)
{
GElf_Phdr phdr_mem;
GElf_Phdr *phdr;
@@ -3825,8 +4176,8 @@ more than one GNU_RELRO entry in program header\n"));
else
{
/* Check that the region is in a writable segment. */
- int inner;
- for (inner = 0; inner < ehdr->e_phnum; ++inner)
+ unsigned int inner;
+ for (inner = 0; inner < phnum; ++inner)
{
GElf_Phdr phdr2_mem;
GElf_Phdr *phdr2;
@@ -3843,14 +4194,15 @@ more than one GNU_RELRO entry in program header\n"));
if ((phdr2->p_flags & PF_W) == 0)
ERROR (gettext ("\
loadable segment GNU_RELRO applies to is not writable\n"));
- if ((phdr2->p_flags & PF_X) != 0)
+ if ((phdr2->p_flags & ~PF_W) != (phdr->p_flags & ~PF_W))
ERROR (gettext ("\
-loadable segment GNU_RELRO applies to is executable\n"));
+loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"),
+ cnt, inner);
break;
}
}
- if (inner >= ehdr->e_phnum)
+ if (inner >= phnum)
ERROR (gettext ("\
%s segment not contained in a loaded segment\n"), "GNU_RELRO");
}
@@ -3858,8 +4210,8 @@ loadable segment GNU_RELRO applies to is executable\n"));
else if (phdr->p_type == PT_PHDR)
{
/* Check that the region is in a writable segment. */
- int inner;
- for (inner = 0; inner < ehdr->e_phnum; ++inner)
+ unsigned int inner;
+ for (inner = 0; inner < phnum; ++inner)
{
GElf_Phdr phdr2_mem;
GElf_Phdr *phdr2;
@@ -3873,7 +4225,7 @@ loadable segment GNU_RELRO applies to is executable\n"));
break;
}
- if (inner >= ehdr->e_phnum)
+ if (inner >= phnum)
ERROR (gettext ("\
%s segment not contained in a loaded segment\n"), "PHDR");
@@ -3883,6 +4235,77 @@ loadable segment GNU_RELRO applies to is executable\n"));
ERROR (gettext ("\
program header offset in ELF header and PHDR entry do not match"));
}
+ else if (phdr->p_type == PT_GNU_EH_FRAME)
+ {
+ /* If there is an .eh_frame_hdr section it must be
+ referenced by this program header entry. */
+ Elf_Scn *scn = NULL;
+ GElf_Shdr shdr_mem;
+ GElf_Shdr *shdr = NULL;
+ bool any = false;
+ while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
+ {
+ any = true;
+ shdr = gelf_getshdr (scn, &shdr_mem);
+ if (shdr != NULL
+ && shdr->sh_type == (is_debuginfo
+ ? SHT_NOBITS : SHT_PROGBITS)
+ && ! strcmp (".eh_frame_hdr",
+ elf_strptr (ebl->elf, shstrndx, shdr->sh_name)))
+ {
+ if (! is_debuginfo)
+ {
+ if (phdr->p_offset != shdr->sh_offset)
+ ERROR (gettext ("\
+call frame search table reference in program header has wrong offset\n"));
+ if (phdr->p_memsz != shdr->sh_size)
+ ERROR (gettext ("\
+call frame search table size mismatch in program and section header\n"));
+ }
+ break;
+ }
+ }
+
+ if (scn == NULL)
+ {
+ /* If there is no section header table we don't
+ complain. But if there is one there should be an
+ entry for .eh_frame_hdr. */
+ if (any)
+ ERROR (gettext ("\
+PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"));
+ }
+ else
+ {
+ /* The section must be allocated and not be writable and
+ executable. */
+ if ((phdr->p_flags & PF_R) == 0)
+ ERROR (gettext ("\
+call frame search table must be allocated\n"));
+ else if (shdr != NULL && (shdr->sh_flags & SHF_ALLOC) == 0)
+ ERROR (gettext ("\
+section [%2zu] '%s' must be allocated\n"), elf_ndxscn (scn), ".eh_frame_hdr");
+
+ if ((phdr->p_flags & PF_W) != 0)
+ ERROR (gettext ("\
+call frame search table must not be writable\n"));
+ else if (shdr != NULL && (shdr->sh_flags & SHF_WRITE) != 0)
+ ERROR (gettext ("\
+section [%2zu] '%s' must not be writable\n"),
+ elf_ndxscn (scn), ".eh_frame_hdr");
+
+ if ((phdr->p_flags & PF_X) != 0)
+ ERROR (gettext ("\
+call frame search table must not be executable\n"));
+ else if (shdr != NULL && (shdr->sh_flags & SHF_EXECINSTR) != 0)
+ ERROR (gettext ("\
+section [%2zu] '%s' must not be executable\n"),
+ elf_ndxscn (scn), ".eh_frame_hdr");
+ }
+
+ /* Remember which entry this is. */
+ pt_gnu_eh_frame_pndx = cnt;
+ }
if (phdr->p_filesz > phdr->p_memsz
&& (phdr->p_memsz != 0 || phdr->p_type != PT_NOTE))
@@ -3903,6 +4326,17 @@ program header entry %d: file offset and virtual address not module of alignment
}
+static void
+check_exception_data (Ebl *ebl __attribute__ ((unused)),
+ GElf_Ehdr *ehdr __attribute__ ((unused)))
+{
+ if ((ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN)
+ && pt_gnu_eh_frame_pndx == 0 && eh_frame_hdr_scnndx != 0)
+ ERROR (gettext ("executable/DSO with .eh_frame_hdr section does not have "
+ "a PT_GNU_EH_FRAME program header entry"));
+}
+
+
/* Process one file. */
static void
process_elf_file (Elf *elf, const char *prefix, const char *suffix,
@@ -3951,6 +4385,11 @@ process_elf_file (Elf *elf, const char *prefix, const char *suffix,
headers at all. */
check_sections (ebl, ehdr);
+ /* Check the exception handling data, if it exists. */
+ if (pt_gnu_eh_frame_pndx != 0 || eh_frame_hdr_scnndx != 0
+ || eh_frame_scnndx != 0 || gcc_except_table_scnndx != 0)
+ check_exception_data (ebl, ehdr);
+
/* Report if no relocation section needed the text relocation flag. */
if (textrel && !needed_textrel)
ERROR (gettext ("text relocation flag set but not needed\n"));
@@ -3958,3 +4397,6 @@ process_elf_file (Elf *elf, const char *prefix, const char *suffix,
/* Free the resources. */
ebl_closebackend (ebl);
}
+
+
+#include "debugpred.h"
diff --git a/src/findtextrel.c b/src/findtextrel.c
index d055f34e..9d10982f 100644
--- a/src/findtextrel.c
+++ b/src/findtextrel.c
@@ -1,5 +1,5 @@
/* Locate source files or functions which caused text relocations.
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005, 2006, 2007, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2005.
@@ -44,6 +44,8 @@
#include <string.h>
#include <unistd.h>
+#include <system.h>
+
struct segments
{
@@ -54,10 +56,10 @@ struct segments
/* Name and version of program. */
static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
+ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
/* Bug report address. */
-const char *argp_program_bug_address = PACKAGE_BUGREPORT;
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
/* Values for the parameters which have no short form. */
#define OPT_DEBUGINFO 0x100
@@ -169,7 +171,7 @@ print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
Copyright (C) %s Red Hat, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2009");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
@@ -606,3 +608,6 @@ a relocation modifies memory at offset %llu in a write-protected segment\n"),
break;
}
}
+
+
+#include "debugpred.h"
diff --git a/src/i386_ld.c b/src/i386_ld.c
index c79804cd..2702ef85 100644
--- a/src/i386_ld.c
+++ b/src/i386_ld.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc.
+/* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -214,8 +214,9 @@ elf_i386_initialize_plt (struct ld_state *statep, Elf_Scn *scn)
relocation routines) and one for each function we call in a DSO. */
data->d_size = (1 + statep->nplt) * PLT_ENTRY_SIZE;
data->d_buf = xcalloc (1, data->d_size);
- data->d_align = 8;
+ assert (data->d_type == ELF_T_BYTE);
data->d_off = 0;
+ data->d_align = 8;
statep->nplt_used = 1;
}
@@ -232,9 +233,10 @@ elf_i386_initialize_pltrel (struct ld_state *statep, Elf_Scn *scn)
elf_errmsg (-1));
/* One relocation per PLT entry. */
- data->d_size = statep->nplt * sizeof (Elf32_Rel);
- data->d_buf = xcalloc (1, data->d_size);
+ size_t size = statep->nplt * sizeof (Elf32_Rel);
+ data->d_buf = xcalloc (1, size);
data->d_type = ELF_T_REL;
+ data->d_size = size;
data->d_align = 4;
data->d_off = 0;
}
@@ -243,26 +245,45 @@ elf_i386_initialize_pltrel (struct ld_state *statep, Elf_Scn *scn)
static void
elf_i386_initialize_got (struct ld_state *statep, Elf_Scn *scn)
{
- Elf_Data *data;
-
- /* If we have no .plt we don't need the special entries we normally
- create for it. The other contents is created later. */
- if (statep->ngot + statep->nplt == 0)
- return;
+ /* If we come here we better need a GOT. */
+ assert (statep->ngot != 0);
- data = elf_newdata (scn);
+ Elf_Data *data = elf_newdata (scn);
if (data == NULL)
error (EXIT_FAILURE, 0, gettext ("cannot allocate GOT section: %s"),
elf_errmsg (-1));
- /* We construct the .got section in pieces. Here we only add the data
+ /* Just a single word per GOT entry is needed. */
+ size_t size = statep->ngot * sizeof (Elf32_Addr);
+ data->d_buf = xcalloc (1, size);
+ data->d_size = size;
+ data->d_type = ELF_T_WORD;
+ data->d_off = 0;
+ data->d_align = sizeof (Elf32_Addr);
+}
+
+
+static void
+elf_i386_initialize_gotplt (struct ld_state *statep, Elf_Scn *scn)
+{
+ /* If we come here we better need a PLT. */
+ assert (statep->nplt != 0);
+
+ Elf_Data *data = elf_newdata (scn);
+ if (data == NULL)
+ error (EXIT_FAILURE, 0, gettext ("cannot allocate GOTPLT section: %s"),
+ elf_errmsg (-1));
+
+ /* We construct the .got.plt section in pieces. Here we only add the data
structures which are used by the PLT. This includes three reserved
entries at the beginning (the first will contain a pointer to the
.dynamic section), and one word for each PLT entry. */
- data->d_size = (3 + statep->ngot + statep->nplt) * sizeof (Elf32_Addr);
- data->d_buf = xcalloc (1, data->d_size);
- data->d_align = sizeof (Elf32_Addr);
+ size_t size = (3 + statep->nplt) * sizeof (Elf32_Addr);
+ data->d_buf = xcalloc (1, size);
+ data->d_type = ELF_T_WORD;
+ data->d_size = size;
data->d_off = 0;
+ data->d_align = sizeof (Elf32_Addr);
}
@@ -274,7 +295,8 @@ static const unsigned char elf_i386_plt0_entry[PLT_ENTRY_SIZE] =
0, 0, 0, 0, /* replaced with address of .got + 4. */
0xff, 0x25, /* jmp indirect */
0, 0, 0, 0, /* replaced with address of .got + 8. */
- 0, 0, 0, 0 /* pad out to 16 bytes. */
+ 0x0f, 0x0b, /* ud2a, to prevent further decoding. */
+ 0, 0 /* pad out to 16 bytes. */
};
/* Type describing the first PLT entry in non-PIC. */
@@ -295,7 +317,8 @@ static const unsigned char elf_i386_pic_plt0_entry[PLT_ENTRY_SIZE] =
{
0xff, 0xb3, 4, 0, 0, 0, /* pushl 4(%ebx) */
0xff, 0xa3, 8, 0, 0, 0, /* jmp *8(%ebx) */
- 0, 0, 0, 0 /* pad out to 16 bytes. */
+ 0x0f, 0x0b, /* ud2a, to prevent further decoding. */
+ 0, 0 /* pad out to 16 bytes. */
};
/* Contents of all but the first PLT entry in executable. */
@@ -337,46 +360,47 @@ struct plt_entry
static void
elf_i386_finalize_plt (struct ld_state *statep, size_t nsym,
- size_t nsym_dyn __attribute__ ((unused)))
+ size_t nsym_local, struct symbol **ndxtosym)
{
+ if (unlikely (statep->nplt + statep->ngot == 0))
+ /* Nothing to be done. */
+ return;
+
Elf_Scn *scn;
XElf_Shdr_vardef (shdr);
Elf_Data *data;
- Elf_Data *symdata = NULL;
- Elf_Data *dynsymdata;
- size_t cnt;
const bool build_dso = statep->file_type == dso_file_type;
- if (unlikely (statep->nplt + statep->ngot == 0))
- /* Nothing to be done. */
- return;
-
- /* Get the address of the got section. */
- scn = elf_getscn (statep->outelf, statep->gotscnidx);
+ /* Get the address of the .got.plt section. */
+ scn = elf_getscn (statep->outelf, statep->gotpltscnidx);
xelf_getshdr (scn, shdr);
data = elf_getdata (scn, NULL);
assert (shdr != NULL && data != NULL);
+ /* The address points to the .got.plt section, not the .got section. */
Elf32_Addr gotaddr = shdr->sh_addr;
- /* Now create the initial values for the .got section. The first
- word contains the address of the .dynamic section. */
+ /* Now create the initial values for the .got.plt section. The
+ first word contains the address of the .dynamic section. The
+ second and third entry are left empty for use by the dynamic
+ linker. The following entries are pointers to the instructions
+ following the initial jmp instruction in the corresponding PLT
+ entry. */
xelf_getshdr (elf_getscn (statep->outelf, statep->dynamicscnidx), shdr);
assert (shdr != NULL);
((Elf32_Word *) data->d_buf)[0] = shdr->sh_addr;
- /* The second and third entry are left empty for use by the dynamic
- linker. The following entries are pointers to the instructions
- following the initial jmp instruction in the corresponding PLT
- entry. Since the first PLT entry is special the first used one
- has the index 1. */
+ /* The PLT contains code which a user of a function jumps to. The first
+ PLT entry is special, so the first used one has the index 1. */
scn = elf_getscn (statep->outelf, statep->pltscnidx);
- xelf_getshdr (scn, shdr);
- assert (shdr != NULL);
+ XElf_Shdr_vardef (pltshdr);
+ xelf_getshdr (scn, pltshdr);
+ assert (pltshdr != NULL);
- dynsymdata = elf_getdata (elf_getscn (statep->outelf, statep->dynsymscnidx),
- NULL);
+ Elf_Data *dynsymdata = elf_getdata (elf_getscn (statep->outelf,
+ statep->dynsymscnidx), NULL);
assert (dynsymdata != NULL);
+ Elf_Data *symdata = NULL;
if (statep->symscnidx != 0)
{
symdata = elf_getdata (elf_getscn (statep->outelf, statep->symscnidx),
@@ -384,48 +408,40 @@ elf_i386_finalize_plt (struct ld_state *statep, size_t nsym,
assert (symdata != NULL);
}
- for (cnt = 0; cnt < statep->nplt; ++cnt)
- {
- assert ((4 + cnt) * sizeof (Elf32_Word) <= data->d_size);
-
- /* Address in the PLT. */
- Elf32_Addr pltentryaddr = shdr->sh_addr + (1 + cnt) * PLT_ENTRY_SIZE;
-
- /* Point the GOT entry at the PLT entry, after the initial jmp. */
- ((Elf32_Word *) data->d_buf)[3 + cnt] = pltentryaddr + 6;
-
-
- /* If the symbol is defined, adjust the address. */
- if (((Elf32_Sym *) dynsymdata->d_buf)[1 + cnt].st_shndx != SHN_UNDEF)
- {
- /* The value of the symbol is the address of the corresponding PLT
- entry. Store the address, also for the normal symbol table if
- this is necessary. */
- ((Elf32_Sym *) dynsymdata->d_buf)[1 + cnt].st_value = pltentryaddr;
-
- if (symdata != NULL)
- ((Elf32_Sym *) symdata->d_buf)[nsym - statep->nplt + cnt].st_value
- = pltentryaddr;
- }
- }
-
/* Create the .plt section. */
scn = elf_getscn (statep->outelf, statep->pltscnidx);
- data = elf_getdata (scn, NULL);
- assert (data != NULL);
+ Elf_Data *pltdata = elf_getdata (scn, NULL);
+ assert (pltdata != NULL);
+
+ /* Also create the .rel.plt section data. It simply means relocations
+ addressing the corresponding entry in the .got.plt section. The
+ section name is misleading. */
+ scn = elf_getscn (statep->outelf, statep->pltrelscnidx);
+ xelf_getshdr (scn, shdr);
+ Elf_Data *reldata = elf_getdata (scn, NULL);
+ assert (shdr != NULL && reldata != NULL);
+
+ /* Update the sh_link to point to the section being modified. We
+ point it here (correctly) to the .got.plt section. Some linkers
+ (e.g., the GNU binutils linker) point to the .plt section. This
+ is wrong since the .plt section isn't modified even though the
+ name .rel.plt suggests that this is correct. */
+ shdr->sh_link = statep->dynsymscnidx;
+ shdr->sh_info = statep->gotpltscnidx;
+ (void) xelf_update_shdr (scn, shdr);
- /* Create the first entry. */
- assert (data->d_size >= PLT_ENTRY_SIZE);
+ /* Create the first entry of the .plt section. */
+ assert (pltdata->d_size >= PLT_ENTRY_SIZE);
if (build_dso)
/* Copy the entry. It's complete, no relocation needed. */
- memcpy (data->d_buf, elf_i386_pic_plt0_entry, PLT_ENTRY_SIZE);
+ memcpy (pltdata->d_buf, elf_i386_pic_plt0_entry, PLT_ENTRY_SIZE);
else
{
/* Copy the skeleton. */
- memcpy (data->d_buf, elf_i386_plt0_entry, PLT_ENTRY_SIZE);
+ memcpy (pltdata->d_buf, elf_i386_plt0_entry, PLT_ENTRY_SIZE);
/* And fill in the addresses. */
- struct plt0_entry *addr = (struct plt0_entry *) data->d_buf;
+ struct plt0_entry *addr = (struct plt0_entry *) pltdata->d_buf;
addr->gotp4_addr = target_bswap_32 (gotaddr + 4);
addr->gotp8_addr = target_bswap_32 (gotaddr + 8);
}
@@ -437,54 +453,68 @@ elf_i386_finalize_plt (struct ld_state *statep, size_t nsym,
const unsigned char *plt_template
= build_dso ? elf_i386_pic_plt_entry : elf_i386_plt_entry;
- for (cnt = 0; cnt < statep->nplt; ++cnt)
+ for (size_t idx = nsym_local; idx < nsym; ++idx)
{
- struct plt_entry *addr;
+ struct symbol *symbol = ndxtosym[idx];
+ if (symbol == NULL || symbol->type != STT_FUNC
+ || ndxtosym[idx]->outdynsymidx == 0
+ // XXX is the following test correct?
+ || ! ndxtosym[idx]->in_dso)
+ continue;
+
+ size_t pltidx = symbol->merge.value;
+
+ assert (pltidx > 0);
+ assert ((3 + pltidx) * sizeof (Elf32_Word) <= data->d_size);
+
+ /* Address in the PLT. */
+ Elf32_Addr pltentryaddr = (pltshdr->sh_addr + pltidx * PLT_ENTRY_SIZE);
+
+ /* Point the GOT entry at the PLT entry, after the initial jmp. */
+ ((Elf32_Word *) data->d_buf)[2 + pltidx] = pltentryaddr + 6;
+
+ /* If the symbol is defined, adjust the address. */
+ if (((Elf32_Sym *) dynsymdata->d_buf)[ndxtosym[idx]->outdynsymidx].st_shndx != SHN_UNDEF)
+ {
+ /* The value of the symbol is the address of the corresponding PLT
+ entry. Store the address, also for the normal symbol table if
+ this is necessary. */
+ ((Elf32_Sym *) dynsymdata->d_buf)[pltidx].st_value = pltentryaddr;
- /* Copy the template. */
- assert (data->d_size >= (2 + cnt) * PLT_ENTRY_SIZE);
- addr = (struct plt_entry *) ((char *) data->d_buf
- + (1 + cnt) * PLT_ENTRY_SIZE);
+ if (symdata != NULL)
+ {
+ assert(nsym - statep->nplt + (pltidx - 1) == idx);
+ ((Elf32_Sym *) symdata->d_buf)[nsym - statep->nplt
+ + (pltidx - 1)].st_value
+ = pltentryaddr;
+ }
+ }
+
+ /* Copy the PLT entry template. */
+ assert (pltdata->d_size >= (1 + pltidx) * PLT_ENTRY_SIZE);
+ struct plt_entry *addr = (struct plt_entry *) ((char *) pltdata->d_buf
+ + (pltidx
+ * PLT_ENTRY_SIZE));
memcpy (addr, plt_template, PLT_ENTRY_SIZE);
/* And once more, fill in the addresses. First the address of
this symbol in .got. */
addr->offset_got = target_bswap_32 (gotaddr_off
- + (3 + cnt) * sizeof (Elf32_Addr));
+ + (2 + pltidx) * sizeof (Elf32_Addr));
/* Offset into relocation table. */
- addr->push_imm = target_bswap_32 (cnt * sizeof (Elf32_Rel));
+ addr->push_imm = target_bswap_32 ((pltidx - 1) * sizeof (Elf32_Rel));
/* Offset to start of .plt. */
- addr->plt0_offset = target_bswap_32 (-(2 + cnt) * PLT_ENTRY_SIZE);
- }
+ addr->plt0_offset = target_bswap_32 (-(1 + pltidx) * PLT_ENTRY_SIZE);
- /* Create the .rel.plt section data. It simply means relocations
- addressing the corresponding entry in the .got section. The
- section name is misleading. */
- scn = elf_getscn (statep->outelf, statep->pltrelscnidx);
- xelf_getshdr (scn, shdr);
- data = elf_getdata (scn, NULL);
- assert (shdr != NULL && data != NULL);
- /* Update the sh_link to point to the section being modified. We
- point it here (correctly) to the .got section. Some linkers
- (e.g., the GNU binutils linker) point to the .plt section. This
- is wrong since the .plt section isn't modified even though the
- name .rel.plt suggests that this is correct. */
- shdr->sh_link = statep->dynsymscnidx;
- shdr->sh_info = statep->gotscnidx;
- (void) xelf_update_shdr (scn, shdr);
-
- for (cnt = 0; cnt < statep->nplt; ++cnt)
- {
XElf_Rel_vardef (rel);
-
- assert ((1 + cnt) * sizeof (Elf32_Rel) <= data->d_size);
- xelf_getrel_ptr (data, cnt, rel);
- rel->r_offset = gotaddr + (3 + cnt) * sizeof (Elf32_Addr);
+ assert (pltidx * sizeof (Elf32_Rel) <= reldata->d_size);
+ xelf_getrel_ptr (reldata, pltidx - 1, rel);
+ rel->r_offset = gotaddr + (2 + pltidx) * sizeof (Elf32_Addr);
/* The symbol table entries for the functions from DSOs are at
- the end of the symbol table. */
- rel->r_info = XELF_R_INFO (1 + cnt, R_386_JMP_SLOT);
- (void) xelf_update_rel (data, cnt, rel);
+ the beginning of the symbol table. */
+ rel->r_info = XELF_R_INFO (ndxtosym[idx]->outdynsymidx, R_386_JMP_SLOT);
+ (void) xelf_update_rel (reldata, pltidx - 1, rel);
}
}
@@ -533,13 +563,16 @@ elf_i386_count_relocations (struct ld_state *statep, struct scninfo *scninfo)
{
case R_386_GOT32:
if (! scninfo->fileinfo->symref[r_sym]->defined
- || scninfo->fileinfo->symref[r_sym]->in_dso)
- relsize += sizeof (Elf32_Rel);
+ || scninfo->fileinfo->symref[r_sym]->in_dso
+ || statep->file_type == dso_file_type)
+ {
+ relsize += sizeof (Elf32_Rel);
+ ++statep->nrel_got;
+ }
- /* This relocation is not emitted in the output file but
- requires a GOT entry. */
+ /* Even if this relocation is not emitted in the output
+ file it requires a GOT entry. */
++statep->ngot;
- ++statep->nrel_got;
/* FALLTHROUGH */
@@ -592,10 +625,9 @@ elf_i386_count_relocations (struct ld_state *statep, struct scninfo *scninfo)
If the symbol is not defined and we are not creating
a statically linked binary, then we need in any case
a PLT entry. */
- if (! scninfo->fileinfo->symref[r_sym]->defined)
+ if (! scninfo->fileinfo->symref[r_sym]->defined
+ && !statep->statically)
{
- assert (!statep->statically);
-
sym = scninfo->fileinfo->symref[r_sym];
sym->type = STT_FUNC;
sym->in_dso = 1;
@@ -614,7 +646,36 @@ elf_i386_count_relocations (struct ld_state *statep, struct scninfo *scninfo)
}
break;
+ case R_386_TLS_LDO_32:
+ if (statep->file_type != executable_file_type)
+ abort ();
+ /* We do not need a relocation in the output file. */
+ break;
+
+ case R_386_TLS_LE:
+ /* We never need a relocation in the output file. */
+ break;
+
+ case R_386_TLS_IE:
+ if (statep->file_type == dso_file_type)
+ error (EXIT_FAILURE, 0, gettext ("initial-executable TLS relocation cannot be used "));
+ if (!scninfo->fileinfo->symref[r_sym]->defined
+ || scninfo->fileinfo->symref[r_sym]->in_dso)
+ {
+ abort ();
+ }
+ break;
+
case R_386_TLS_GD:
+ if (statep->file_type != executable_file_type
+ || !scninfo->fileinfo->symref[r_sym]->defined
+ || scninfo->fileinfo->symref[r_sym]->in_dso)
+ {
+ abort ();
+ }
+ break;
+
+ case R_386_TLS_GOTIE:
case R_386_TLS_LDM:
case R_386_TLS_GD_32:
case R_386_TLS_GD_PUSH:
@@ -624,7 +685,6 @@ elf_i386_count_relocations (struct ld_state *statep, struct scninfo *scninfo)
case R_386_TLS_LDM_PUSH:
case R_386_TLS_LDM_CALL:
case R_386_TLS_LDM_POP:
- case R_386_TLS_LDO_32:
case R_386_TLS_IE_32:
case R_386_TLS_LE_32:
/* XXX */
@@ -666,15 +726,25 @@ elf_i386_create_relocations (struct ld_state *statep,
Elf32_Addr pltaddr = shdr->sh_addr;
Elf_Scn *gotscn = elf_getscn (statep->outelf, statep->gotscnidx);
- shdr = elf32_getshdr (gotscn);
+ // XXX Adjust the address, if necessary, for relro
+ Elf_Data *gotdata = NULL;
+ if (statep->need_got)
+ {
+ gotdata = elf_getdata (gotscn, NULL);
+ assert (gotdata != NULL);
+ }
+
+ Elf_Scn *gotpltscn = elf_getscn (statep->outelf, statep->gotpltscnidx);
+ shdr = elf32_getshdr (gotpltscn);
assert (shdr != NULL);
Elf32_Addr gotaddr = shdr->sh_addr;
Elf_Scn *reldynscn = elf_getscn (statep->outelf, statep->reldynscnidx);
Elf_Data *reldyndata = elf_getdata (reldynscn, NULL);
+ assert (reldyndata != NULL);
size_t nreldyn = 0;
-#define ngot_used (3 + statep->nplt + nreldyn)
+ size_t ngotconst = statep->nrel_got;
struct scninfo *first = statep->rellist->next;
struct scninfo *runp = first;
@@ -684,7 +754,7 @@ elf_i386_create_relocations (struct ld_state *statep,
Elf_Data *reldata = elf_getdata (runp->scn, NULL);
int nrels = rshdr->sh_size / rshdr->sh_entsize;
- /* We will need the following vlaues a couple of times. Help
+ /* We will need the following values a couple of times. Help
the compiler and improve readability. */
struct symbol **symref = runp->fileinfo->symref;
struct scninfo *scninfo = runp->fileinfo->scninfo;
@@ -718,7 +788,7 @@ elf_i386_create_relocations (struct ld_state *statep,
XElf_Sym_vardef (sym);
xelf_getsym (symdata, idx, sym);
- /* The value just depends on the position of the referenced
+ /* The value only depends on the position of the referenced
section in the output file and the addend. */
value = scninfo[sym->st_shndx].offset + sym->st_value;
}
@@ -728,22 +798,20 @@ elf_i386_create_relocations (struct ld_state *statep,
/* Symbol in ignored COMDAT group section. */
continue;
+ value = symref[idx]->merge.value;
if (symref[idx]->in_dso)
{
- /* MERGE.VALUE contains the PLT index. We have to
- add 1 since there is this one special PLT entry
- at the beginning. */
- assert (symref[idx]->merge.value != 0
- || symref[idx]->type != STT_FUNC);
- value = pltaddr + symref[idx]->merge.value * PLT_ENTRY_SIZE;
+ /* MERGE.VALUE contains the PLT index. If this is not for
+ a function the actual value will be computed later. */
+ assert (value != 0 || symref[idx]->type != STT_FUNC);
+ value = pltaddr + value * PLT_ENTRY_SIZE;
}
- else
- value = symref[idx]->merge.value;
}
/* Address of the relocated memory in the data buffer. */
- void *relloc = (char *) data->d_buf + rel->r_offset;
+ unsigned char *relloc = (unsigned char *) data->d_buf + rel->r_offset;
+ uint32_t thisgotidx;
switch (XELF_R_TYPE (rel->r_info))
{
/* These three cases can be handled together since the
@@ -779,6 +847,7 @@ elf_i386_create_relocations (struct ld_state *statep,
= XELF_R_INFO (symref[idx]->outdynsymidx, R_386_COPY);
(void) xelf_update_rel (reldyndata, nreldyn, rel2);
++nreldyn;
+ assert (nreldyn <= statep->nrel_got);
/* Update the symbol table record for the new
address. */
@@ -831,6 +900,7 @@ elf_i386_create_relocations (struct ld_state *statep,
= XELF_R_INFO (symref[idx]->outdynsymidx, R_386_32);
(void) xelf_update_rel (reldyndata, nreldyn, rel2);
++nreldyn;
+ assert (nreldyn <= statep->nrel_got);
value = 0;
}
@@ -838,31 +908,142 @@ elf_i386_create_relocations (struct ld_state *statep,
break;
case R_386_GOT32:
- store_4ubyte_unaligned (relloc, ngot_used * sizeof (Elf32_Addr));
+ if (! symref[idx]->defined || symref[idx]->in_dso)
+ {
+ thisgotidx = nreldyn++;
+ assert (thisgotidx < statep->nrel_got);
- /* Add a relocation to initialize the GOT entry. */
+ /* Add a relocation to initialize the GOT entry. */
#if NATIVE_ELF != 0
- xelf_getrel_ptr (reldyndata, nreldyn, rel2);
+ xelf_getrel_ptr (reldyndata, thisgotidx, rel2);
#else
- rel2 = &rel_mem;
+ rel2 = &rel_mem;
#endif
- rel2->r_offset = gotaddr + ngot_used * sizeof (Elf32_Addr);
- rel2->r_info
- = XELF_R_INFO (symref[idx]->outdynsymidx, R_386_GLOB_DAT);
- (void) xelf_update_rel (reldyndata, nreldyn, rel2);
- ++nreldyn;
+ rel2->r_offset = gotaddr + ((thisgotidx - statep->ngot)
+ * sizeof (Elf32_Addr));
+ rel2->r_info
+ = XELF_R_INFO (symref[idx]->outdynsymidx, R_386_GLOB_DAT);
+ (void) xelf_update_rel (reldyndata, thisgotidx, rel2);
+ }
+ else if (statep->file_type != dso_file_type)
+ {
+ thisgotidx = ngotconst++;
+ assert (thisgotidx < statep->ngot);
+
+ /* We have to use a GOT since the generated code
+ requires it but we know the address and therefore
+ do not need a relocation. */
+ ((uint32_t *) gotdata->d_buf)[thisgotidx] = value;
+ }
+ else
+ {
+ thisgotidx = nreldyn++;
+ assert (thisgotidx < statep->nrel_got);
+
+ // XXX generate a relative relocation.
+ abort ();
+ }
+
+ store_4ubyte_unaligned (relloc,
+ (thisgotidx - statep->ngot)
+ * sizeof (Elf32_Addr));
break;
case R_386_GOTOFF:
add_4ubyte_unaligned (relloc, value - gotaddr);
break;
+ case R_386_TLS_LE:
+ value = symref[idx]->merge.value - ld_state.tls_tcb;
+ store_4ubyte_unaligned (relloc, value);
+ break;
+
+ case R_386_TLS_IE:
+ if (symref[idx]->defined && !symref[idx]->in_dso)
+ {
+ /* The symbol is defined in the executable.
+ Perform the IE->LE optimization.
+ There are multiple versions, though.
+
+ First version: mov ADDR,REG. */
+ if (relloc[-2] == 0x8b
+ && ((relloc[-1] & 0xc7) == 0x05))
+ {
+ relloc[-2] = 0xc7;
+ relloc[-1] = 0xc0 | ((relloc[-1] >> 3) & 7);
+ store_4ubyte_unaligned (relloc, (symref[idx]->merge.value
+ - ld_state.tls_tcb));
+ }
+ else
+ {
+ abort ();
+ }
+ }
+ else
+ {
+ abort ();
+ }
+ break;
+
+ case R_386_TLS_LDO_32:
+ value = symref[idx]->merge.value - ld_state.tls_start;
+ store_4ubyte_unaligned (relloc, value);
+ break;
+
+ case R_386_TLS_GD:
+ if (ld_state.file_type == executable_file_type)
+ {
+ if (symref[idx]->defined && !symref[idx]->in_dso)
+ {
+ /* The symbol is defined in the executable.
+ Perform the GD->LE optimization. */
+ static const char gd_to_le[] =
+ {
+ /* mov %gs:0x0,%eax */
+ 0x65, 0xa1, 0x00, 0x00, 0x00, 0x00,
+ /* sub $OFFSET,%eax */
+ 0x81, 0xe8
+ };
+#ifndef NDEBUG
+ static const char gd_text[] =
+ {
+ /* lea 0x0(,%ebx,1),%eax */
+ 0x8d, 0x04, 0x1d, 0x00, 0x00, 0x00, 0x00,
+ /* call ___tls_get_addr */
+ 0xe8
+ };
+ assert (memcmp (relloc - 3, gd_text, sizeof (gd_text))
+ == 0);
+#endif
+ relloc = mempcpy (relloc - 3, gd_to_le,
+ sizeof (gd_to_le));
+ value = ld_state.tls_tcb- symref[idx]->merge.value;
+ store_4ubyte_unaligned (relloc, value);
+
+ /* We have to skip over the next relocation which is
+ the matching R_i386_PLT32 for __tls_get_addr. */
+ ++cnt;
+#ifndef NDEBUG
+ assert (cnt < nrels);
+ XElf_Off old_offset = rel->r_offset;
+ xelf_getrel (reldata, cnt, rel);
+ assert (rel != NULL);
+ assert (XELF_R_TYPE (rel->r_info) == R_386_PLT32);
+ idx = XELF_R_SYM (rel->r_info);
+ assert (strcmp (symref[idx]->name, "___tls_get_addr")
+ == 0);
+ assert (old_offset + 5 == rel->r_offset);
+#endif
+
+ break;
+ }
+ }
+ abort ();
+ break;
+
case R_386_32PLT:
case R_386_TLS_TPOFF:
- case R_386_TLS_IE:
case R_386_TLS_GOTIE:
- case R_386_TLS_LE:
- case R_386_TLS_GD:
case R_386_TLS_LDM:
case R_386_16:
case R_386_PC16:
@@ -876,11 +1057,9 @@ elf_i386_create_relocations (struct ld_state *statep,
case R_386_TLS_LDM_PUSH:
case R_386_TLS_LDM_CALL:
case R_386_TLS_LDM_POP:
- case R_386_TLS_LDO_32:
case R_386_TLS_IE_32:
case R_386_TLS_LE_32:
// XXX For now fall through
- printf("ignored relocation %d\n", (int) XELF_R_TYPE (rel->r_info));
break;
case R_386_NONE:
@@ -917,6 +1096,7 @@ elf_i386_ld_init (struct ld_state *statep)
statep->callbacks.initialize_pltrel = elf_i386_initialize_pltrel;
statep->callbacks.initialize_got = elf_i386_initialize_got;
+ statep->callbacks.initialize_gotplt = elf_i386_initialize_gotplt;
statep->callbacks.finalize_plt = elf_i386_finalize_plt;
diff --git a/src/ld.c b/src/ld.c
index 24fb2f96..932496e1 100644
--- a/src/ld.c
+++ b/src/ld.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
+/* Copyright (C) 2001-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -48,10 +48,10 @@
/* Name and version of program. */
static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
+ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
/* Bug report address. */
-const char *argp_program_bug_address = PACKAGE_BUGREPORT;
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
/* Values for the various options. */
@@ -73,6 +73,8 @@ enum
ARGP_as_needed,
ARGP_no_as_needed,
ARGP_eh_frame_hdr,
+ ARGP_hash_style,
+ ARGP_build_id,
#if YYDEBUG
ARGP_yydebug,
#endif
@@ -86,10 +88,10 @@ static const struct argp_option options[] =
{ "whole-archive", ARGP_whole_archive, NULL, 0,
N_("Include whole archives in the output from now on."), 0 },
{ "no-whole-archive", ARGP_no_whole_archive, NULL, 0,
- N_("Stop including the whole arhives in the output."), 0 },
+ N_("Stop including the whole archives in the output."), 0 },
{ NULL, 'l', N_("FILE"), OPTION_HIDDEN, NULL, 0 },
- { NULL, '(', NULL, 0, N_("Start a group."), 0 },
- { NULL, ')', NULL, 0, N_("End a group."), 0 },
+ { "start-group", '(', NULL, 0, N_("Start a group."), 0 },
+ { "end-group", ')', NULL, 0, N_("End a group."), 0 },
{ NULL, 'L', N_("PATH"), 0,
N_("Add PATH to list of directories files are searched in."), 0 },
{ "as-needed", ARGP_as_needed, NULL, 0,
@@ -163,10 +165,14 @@ Default rules of extracting from archive; weak references are not enough."),
{ "dynamic-linker", 'I', "NAME", 0, N_("Set the dynamic linker name."), 0 },
{ NULL, 'Q', "YN", OPTION_HIDDEN, NULL, 0 },
{ "-Q y | n", 'Q', NULL, OPTION_DOC,
- N_("Add/suppress addition indentifying link-editor to .comment section"),
+ N_("Add/suppress addition indentifying link-editor to .comment section."),
0 },
{ "eh-frame-hdr", ARGP_eh_frame_hdr, NULL, 0,
N_("Create .eh_frame_hdr section"), 0 },
+ { "hash-style", ARGP_hash_style, "STYLE", 0,
+ N_("Set hash style to sysv, gnu or both."), 0 },
+ { "build-id", ARGP_build_id, "STYLE", OPTION_ARG_OPTIONAL,
+ N_("Generate build ID note (md5, sha1 (default), uuid)."), 0 },
{ NULL, 0, NULL, 0, N_("Linker Operation Control:"), 0 },
{ "verbose", 'v', NULL, 0, N_("Verbose messages."), 0 },
@@ -194,6 +200,7 @@ static const char doc[] = N_("Combine object and archive files.");
static const char args_doc[] = N_("[FILE]...");
/* Prototype for option handler. */
+static void replace_args (int argc, char *argv[]);
static error_t parse_opt_1st (int key, char *arg, struct argp_state *state);
static error_t parse_opt_2nd (int key, char *arg, struct argp_state *state);
@@ -313,6 +320,9 @@ main (int argc, char *argv[])
#define obstack_chunk_free free
obstack_init (&ld_state.smem);
+ /* Recognize old-style parameters for compatibility. */
+ replace_args (argc, argv);
+
/* One quick pass over the parameters which allows us to scan for options
with global effect which influence the rest of the processing. */
argp_parse (&argp_1st, argc, argv, ARGP_IN_ORDER, &remaining, NULL);
@@ -328,6 +338,11 @@ main (int argc, char *argv[])
/* Determine which ELF backend to use. */
determine_output_format ();
+ /* If no hash style was specific default to the oldand slow SysV
+ method. */
+ if (unlikely (ld_state.hash_style == hash_style_none))
+ ld_state.hash_style = hash_style_sysv;
+
/* Prepare state. */
err = ld_prepare_state (emulation);
if (err != 0)
@@ -482,6 +497,56 @@ main (int argc, char *argv[])
}
+static void
+replace_args (int argc, char *argv[])
+{
+ static const struct
+ {
+ const char *from;
+ const char *to;
+ } args[] =
+ {
+ { "-export-dynamic", "--export-dynamic" },
+ { "-dynamic-linker", "--dynamic-linker" },
+ { "-static", "--static" },
+ };
+ const size_t nargs = sizeof (args) / sizeof (args[0]);
+
+ for (int i = 1; i < argc; ++i)
+ if (argv[i][0] == '-' && islower (argv[i][1]) && argv[i][2] != '\0')
+ for (size_t j = 0; j < nargs; ++j)
+ if (strcmp (argv[i], args[j].from) == 0)
+ {
+ argv[i] = (char *) args[j].to;
+ break;
+ }
+}
+
+
+static int
+valid_hexarg (const char *arg)
+{
+ if (strncasecmp (arg, "0x", 2) != 0)
+ return 0;
+
+ arg += 2;
+ do
+ {
+ if (isxdigit (arg[0]) && isxdigit (arg[1]))
+ {
+ arg += 2;
+ if (arg[0] == '-' || arg[0] == ':')
+ ++arg;
+ }
+ else
+ return 0;
+ }
+ while (*arg != '\0');
+
+ return 1;
+}
+
+
/* Quick scan of the parameter list for options with global effect. */
static error_t
parse_opt_1st (int key, char *arg,
@@ -611,6 +676,29 @@ parse_opt_1st (int key, char *arg,
ld_state.eh_frame_hdr = true;
break;
+ case ARGP_hash_style:
+ if (strcmp (arg, "gnu") == 0)
+ ld_state.hash_style = hash_style_gnu;
+ else if (strcmp (arg, "both") == 0)
+ ld_state.hash_style = hash_style_gnu | hash_style_sysv;
+ else if (strcmp (arg, "sysv") == 0)
+ ld_state.hash_style = hash_style_sysv;
+ else
+ error (EXIT_FAILURE, 0, gettext ("invalid hash style '%s'"), arg);
+ break;
+
+ case ARGP_build_id:
+ if (arg == NULL)
+ ld_state.build_id = "sha1";
+ else if (strcmp (arg, "uuid") != 0
+ && strcmp (arg, "md5") != 0
+ && strcmp (arg, "sha1") != 0
+ && !valid_hexarg (arg))
+ error (EXIT_FAILURE, 0, gettext ("invalid build-ID style '%s'"), arg);
+ else
+ ld_state.build_id = arg;
+ break;
+
case 's':
if (arg == NULL)
{
@@ -870,7 +958,7 @@ print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
Copyright (C) %s Red Hat, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2009");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
@@ -1095,11 +1183,12 @@ ld_new_searchdir (const char *dir)
/* Enqueue the file. */
if (ld_state.tailpaths == NULL)
- ld_state.paths = ld_state.tailpaths = newpath;
+ ld_state.paths = ld_state.tailpaths = newpath->next = newpath;
else
{
ld_state.tailpaths->next = newpath;
ld_state.tailpaths = newpath;
+ newpath->next = ld_state.paths;
}
}
@@ -1525,3 +1614,6 @@ create_special_section_symbol (struct symbol **symp, const char *name)
++ld_state.nsymtab;
}
+
+
+#include "debugpred.h"
diff --git a/src/ld.h b/src/ld.h
index 59633e65..72d5b27b 100644
--- a/src/ld.h
+++ b/src/ld.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2002, 2003, 2005, 2006 Red Hat, Inc.
+/* Copyright (C) 2001, 2002, 2003, 2005, 2006, 2008, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -146,7 +146,7 @@ struct usedfiles
separate field and not the e_shstrndx field in the ELF header
since in case of a file with more than 64000 sections the index
might be stored in the section header of section zero. The
- elf_getshstrndx() function can find the value but it is too
+ elf_getshdrstrndx() function can find the value but it is too
costly to repeat this call over and over. */
size_t shstrndx;
@@ -176,11 +176,14 @@ struct usedfiles
bool used;
/* True if section is an unused COMDAT section. */
bool unused_comdat;
+ /* True if this is a COMDAT group section. */
+ bool comdat_group;
/* Section group number. This is the index of the SHT_GROUP section. */
Elf32_Word grpid;
/* Pointer back to the containing file information structure. */
struct usedfiles *fileinfo;
- /* List of symbols in this section (set only for merge-able sections). */
+ /* List of symbols in this section (set only for merge-able sections
+ and group sections). */
struct symbol *symbols;
/* Size of relocations in this section. Only used for relocation
sections. */
@@ -397,15 +400,21 @@ struct callbacks
DL_CALL_FCT ((state)->callbacks.initialize_pltrel, (state, scn))
/* Finalize the .plt section the what belongs to them. */
- void (*finalize_plt) (struct ld_state *, size_t, size_t);
-#define FINALIZE_PLT(state, nsym, nsym_dyn) \
- DL_CALL_FCT ((state)->callbacks.finalize_plt, (state, nsym, nsym_dyn))
+ void (*finalize_plt) (struct ld_state *, size_t, size_t, struct symbol **);
+#define FINALIZE_PLT(state, nsym, nsym_dyn, ndxtosym) \
+ DL_CALL_FCT ((state)->callbacks.finalize_plt, (state, nsym, nsym_dyn, \
+ ndxtosym))
/* Create the data structures for the .got section and initialize it. */
void (*initialize_got) (struct ld_state *, Elf_Scn *scn);
#define INITIALIZE_GOT(state, scn) \
DL_CALL_FCT ((state)->callbacks.initialize_got, (state, scn))
+ /* Create the data structures for the .got.plt section and initialize it. */
+ void (*initialize_gotplt) (struct ld_state *, Elf_Scn *scn);
+#define INITIALIZE_GOTPLT(state, scn) \
+ DL_CALL_FCT ((state)->callbacks.initialize_gotplt, (state, scn))
+
/* Return the tag corresponding to the native relocation type for
the platform. */
int (*rel_type) (struct ld_state *);
@@ -670,15 +679,18 @@ struct scnhead
scn_normal, /* Section from the input file(s). */
scn_dot_interp, /* Generated .interp section. */
scn_dot_got, /* Generated .got section. */
+ scn_dot_gotplt, /* Generated .got.plt section. */
scn_dot_dynrel, /* Generated .rel.dyn section. */
scn_dot_dynamic, /* Generated .dynamic section. */
scn_dot_dynsym, /* Generated .dynsym section. */
scn_dot_dynstr, /* Generated .dynstr section. */
scn_dot_hash, /* Generated .hash section. */
+ scn_dot_gnu_hash, /* Generated .gnu.hash section. */
scn_dot_plt, /* Generated .plt section. */
scn_dot_pltrel, /* Generated .rel.plt section. */
scn_dot_version, /* Generated .gnu.version section. */
- scn_dot_version_r /* Generated .gnu.version_r section. */
+ scn_dot_version_r, /* Generated .gnu.version_r section. */
+ scn_dot_note_gnu_build_id /* Generated .note.gnu.build-id section. */
} kind;
/* True is the section is used in the output. */
@@ -925,8 +937,9 @@ struct ld_state
Elf32_Word dynsymscnidx;
/* Dynamic symbol string table section. */
Elf32_Word dynstrscnidx;
- /* Dynamic symbol hash table. */
+ /* Dynamic symbol hash tables. */
size_t hashscnidx;
+ size_t gnuhashscnidx;
/* Procedure linkage table section. */
Elf32_Word pltscnidx;
@@ -937,6 +950,8 @@ struct ld_state
/* Global offset table section. */
Elf32_Word gotscnidx;
+ /* And the part of the PLT. */
+ Elf32_Word gotpltscnidx;
/* This section will hole all non-PLT relocations. */
Elf32_Word reldynscnidx;
@@ -952,6 +967,11 @@ struct ld_state
/* Index of next version. */
int nextveridx;
+ /* TLS segment. */
+ bool need_tls;
+ XElf_Addr tls_start;
+ XElf_Addr tls_tcb;
+
/* Hash table for version symbol strings. Only strings without
special characters are hashed here. */
ld_version_str_tab version_str_tab;
@@ -1014,11 +1034,26 @@ struct ld_state
/* True if an .eh_frame_hdr section should be generated. */
bool eh_frame_hdr;
+ /* What hash style to generate. */
+ enum
+ {
+ hash_style_none = 0,
+ hash_style_sysv = 1,
+#define GENERATE_SYSV_HASH ((ld_state.hash_style & hash_style_sysv) != 0)
+ hash_style_gnu = 2
+#define GENERATE_GNU_HASH ((ld_state.hash_style & hash_style_gnu) != 0)
+ }
+ hash_style;
+
/* True if in executables all global symbols should be exported in
the dynamic symbol table. */
bool export_all_dynamic;
+ /* Build-ID style. NULL is none. */
+ const char *build_id;
+ Elf32_Word buildidscnidx;
+
/* If DSO is generated, this is the SONAME. */
const char *soname;
@@ -1087,6 +1122,9 @@ extern bool dynamically_linked_p (void);
/* Checked whether the symbol is undefined and referenced from a DSO. */
extern bool linked_from_dso_p (struct scninfo *scninfo, size_t symidx);
+#ifdef __GNUC_STDC_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
extern inline bool
linked_from_dso_p (struct scninfo *scninfo, size_t symidx)
{
diff --git a/src/ldgeneric.c b/src/ldgeneric.c
index cb184abf..b2ea2f90 100644
--- a/src/ldgeneric.c
+++ b/src/ldgeneric.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc.
+/* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -28,6 +28,7 @@
#endif
#include <assert.h>
+#include <ctype.h>
#include <dlfcn.h>
#include <errno.h>
#include <error.h>
@@ -44,9 +45,12 @@
#include <sys/param.h>
#include <sys/stat.h>
-#include <system.h>
+#include <elf-knowledge.h>
#include "ld.h"
#include "list.h"
+#include <md5.h>
+#include <sha1.h>
+#include <system.h>
/* Header of .eh_frame_hdr section. */
@@ -88,8 +92,11 @@ static void ld_generic_initialize_plt (struct ld_state *statep, Elf_Scn *scn);
static void ld_generic_initialize_pltrel (struct ld_state *statep,
Elf_Scn *scn);
static void ld_generic_initialize_got (struct ld_state *statep, Elf_Scn *scn);
+static void ld_generic_initialize_gotplt (struct ld_state *statep,
+ Elf_Scn *scn);
static void ld_generic_finalize_plt (struct ld_state *statep, size_t nsym,
- size_t nsym_dyn);
+ size_t nsym_dyn,
+ struct symbol **ndxtosymp);
static int ld_generic_rel_type (struct ld_state *statep);
static void ld_generic_count_relocations (struct ld_state *statep,
struct scninfo *scninfo);
@@ -220,6 +227,7 @@ ld_prepare_state (const char *emulation)
ld_state.callbacks.initialize_plt = ld_generic_initialize_plt;
ld_state.callbacks.initialize_pltrel = ld_generic_initialize_pltrel;
ld_state.callbacks.initialize_got = ld_generic_initialize_got;
+ ld_state.callbacks.initialize_gotplt = ld_generic_initialize_gotplt;
ld_state.callbacks.finalize_plt = ld_generic_finalize_plt;
ld_state.callbacks.rel_type = ld_generic_rel_type;
ld_state.callbacks.count_relocations = ld_generic_count_relocations;
@@ -514,6 +522,38 @@ open_along_path (struct usedfiles *fileinfo)
}
+static int
+matching_group_comdat_scn (const XElf_Sym *sym, size_t shndx,
+ struct usedfiles *fileinfo, struct symbol *oldp)
+{
+ if ((shndx >= SHN_LORESERVE && shndx <= SHN_HIRESERVE)
+ || (oldp->scndx >= SHN_LORESERVE && oldp->scndx <= SHN_HIRESERVE))
+ /* Cannot be a group COMDAT section. */
+ return 0;
+
+ size_t newgrpid = fileinfo->scninfo[shndx].grpid;
+ size_t oldgrpid = oldp->file->scninfo[oldp->scndx].grpid;
+ if (newgrpid == 0 || oldgrpid == 0)
+ return 0;
+
+ assert (SCNINFO_SHDR (fileinfo->scninfo[newgrpid].shdr).sh_type
+ == SHT_GROUP);
+ assert (SCNINFO_SHDR (oldp->file->scninfo[oldgrpid].shdr).sh_type
+ == SHT_GROUP);
+
+ if (! fileinfo->scninfo[newgrpid].comdat_group
+ || ! oldp->file->scninfo[oldgrpid].comdat_group)
+ return 0;
+
+ if (strcmp (fileinfo->scninfo[newgrpid].symbols->name,
+ oldp->file->scninfo[oldgrpid].symbols->name) != 0)
+ return 0;
+
+ /* This is a matching, duplicate COMDAT group section. Ignore it. */
+ return 1;
+}
+
+
static void
check_type_and_size (const XElf_Sym *sym, struct usedfiles *fileinfo,
struct symbol *oldp)
@@ -551,7 +591,7 @@ Warning: size of `%s' changed from %" PRIu64 " in %s to %" PRIu64 " in %s"),
static int
-check_definition (const XElf_Sym *sym, size_t symidx,
+check_definition (const XElf_Sym *sym, size_t shndx, size_t symidx,
struct usedfiles *fileinfo, struct symbol *oldp)
{
int result = 0;
@@ -559,9 +599,9 @@ check_definition (const XElf_Sym *sym, size_t symidx,
bool new_in_dso = FILEINFO_EHDR (fileinfo->ehdr).e_type == ET_DYN;
bool use_new_def = false;
- if (sym->st_shndx != SHN_UNDEF
+ if (shndx != SHN_UNDEF
&& (! oldp->defined
- || (sym->st_shndx != SHN_COMMON && oldp->common && ! new_in_dso)
+ || (shndx != SHN_COMMON && oldp->common && ! new_in_dso)
|| (old_in_dso && ! new_in_dso)))
{
/* We found a definition for a previously undefined symbol or a
@@ -591,10 +631,17 @@ check_definition (const XElf_Sym *sym, size_t symidx,
/* Use the values of the definition from now on. */
use_new_def = true;
}
- else if (sym->st_shndx != SHN_UNDEF
+ else if (shndx != SHN_UNDEF
+ && oldp->defined
+ && matching_group_comdat_scn (sym, shndx, fileinfo, oldp))
+ /* The duplicate symbol is in a group COMDAT section with the same
+ signature as the one containing the original definition.
+ Just ignore the second definition. */
+ /* nothing */;
+ else if (shndx != SHN_UNDEF
&& unlikely (! oldp->common)
&& oldp->defined
- && sym->st_shndx != SHN_COMMON
+ && shndx != SHN_COMMON
/* Multiple definitions are no fatal errors if the -z muldefs flag
is used. We don't warn about the multiple definition unless we
are told to be verbose. */
@@ -607,24 +654,22 @@ check_definition (const XElf_Sym *sym, size_t symidx,
struct usedfiles *oldfile;
const char *scnname;
Elf32_Word xndx;
- size_t shndx;
size_t shnum;
- if (elf_getshnum (fileinfo->elf, &shnum) < 0)
+ if (elf_getshdrnum (fileinfo->elf, &shnum) < 0)
error (EXIT_FAILURE, 0,
gettext ("cannot determine number of sections: %s"),
elf_errmsg (-1));
/* XXX Use only ebl_section_name. */
- if (sym->st_shndx < SHN_LORESERVE // || sym->st_shndx > SHN_HIRESERVE
- && sym->st_shndx < shnum)
+ if (shndx < SHN_LORESERVE || (shndx > SHN_HIRESERVE && shndx < shnum))
scnname = elf_strptr (fileinfo->elf,
fileinfo->shstrndx,
- SCNINFO_SHDR (fileinfo->scninfo[sym->st_shndx].shdr).sh_name);
+ SCNINFO_SHDR (fileinfo->scninfo[shndx].shdr).sh_name);
else
// XXX extended section
- scnname = ebl_section_name (ld_state.ebl, sym->st_shndx, 0,
- buf, sizeof (buf), NULL, shnum);
+ scnname = ebl_section_name (ld_state.ebl, shndx, 0, buf, sizeof (buf),
+ NULL, shnum);
/* XXX Print source file and line number. */
print_file_name (stderr, fileinfo, 1, 0);
@@ -639,23 +684,16 @@ check_definition (const XElf_Sym *sym, size_t symidx,
oldfile = oldp->file;
xelf_getsymshndx (oldfile->symtabdata, oldfile->xndxdata, oldp->symidx,
oldsym, xndx);
- if (oldsym == NULL)
- /* This should never happen since the same call
- succeeded before. */
- abort ();
-
- shndx = oldsym->st_shndx;
- if (unlikely (oldsym->st_shndx == SHN_XINDEX))
- shndx = xndx;
+ assert (oldsym != NULL);
/* XXX Use only ebl_section_name. */
- if (shndx < SHN_LORESERVE || shndx > SHN_HIRESERVE)
+ if (oldp->scndx < SHN_LORESERVE || oldp->scndx > SHN_HIRESERVE)
scnname = elf_strptr (oldfile->elf,
oldfile->shstrndx,
SCNINFO_SHDR (oldfile->scninfo[shndx].shdr).sh_name);
else
- scnname = ebl_section_name (ld_state.ebl, oldsym->st_shndx, shndx, buf,
- sizeof (buf), NULL, shnum);
+ scnname = ebl_section_name (ld_state.ebl, oldp->scndx, oldp->scndx,
+ buf, sizeof (buf), NULL, shnum);
/* XXX Print source file and line number. */
print_file_name (stderr, oldfile, 1, 0);
@@ -666,7 +704,7 @@ check_definition (const XElf_Sym *sym, size_t symidx,
result = 1;
}
else if (old_in_dso && fileinfo->file_type == relocatable_file_type
- && sym->st_shndx != SHN_UNDEF)
+ && shndx != SHN_UNDEF)
/* We use the definition from a normal relocatable file over the
definition in a DSO. This is what the dynamic linker would
do, too. */
@@ -685,7 +723,7 @@ check_definition (const XElf_Sym *sym, size_t symidx,
oldp->on_dsolist = 1;
}
- else if (oldp->common && sym->st_shndx == SHN_COMMON)
+ else if (oldp->common && shndx == SHN_COMMON)
{
/* The symbol size is the largest of all common definitions. */
oldp->size = MAX (oldp->size, sym->st_size);
@@ -714,23 +752,23 @@ check_definition (const XElf_Sym *sym, size_t symidx,
oldp->size = sym->st_size;
oldp->type = XELF_ST_TYPE (sym->st_info);
oldp->symidx = symidx;
- oldp->scndx = sym->st_shndx;
+ oldp->scndx = shndx;
//oldp->symscndx = THESYMSCNDX must be passed;
oldp->file = fileinfo;
oldp->defined = 1;
oldp->in_dso = new_in_dso;
- oldp->common = sym->st_shndx == SHN_COMMON;
+ oldp->common = shndx == SHN_COMMON;
if (likely (fileinfo->file_type == relocatable_file_type))
{
/* If the definition comes from a DSO we pertain the weak flag
and it's indicating whether the reference is weak or not. */
oldp->weak = XELF_ST_BIND (sym->st_info) == STB_WEAK;
- if (sym->st_shndx != SHN_COMMON)
+ // XXX Really exclude SHN_ABS?
+ if (shndx != SHN_COMMON && shndx != SHN_ABS)
{
struct scninfo *ignore;
- mark_section_used (&fileinfo->scninfo[sym->st_shndx],
- sym->st_shndx, &ignore);
+ mark_section_used (&fileinfo->scninfo[shndx], shndx, &ignore);
}
}
@@ -749,7 +787,7 @@ check_definition (const XElf_Sym *sym, size_t symidx,
oldp->on_dsolist = 1;
}
- else if (sym->st_shndx == SHN_COMMON)
+ else if (shndx == SHN_COMMON)
{
/* Store the alignment. */
oldp->merge.value = sym->st_value;
@@ -843,14 +881,12 @@ mark_section_group (struct usedfiles *fileinfo, Elf32_Word shndx,
Elf32_Word idx = grpref[--cnt];
XElf_Shdr *shdr = &SCNINFO_SHDR (fileinfo->scninfo[idx].shdr);
- if (fileinfo->scninfo[idx].grpid != 0)
+ if (fileinfo->scninfo[idx].grpid != grpscn->grpid)
error (EXIT_FAILURE, 0, gettext ("\
-%s: section [%2d] '%s' is in more than one section group"),
+%s: section [%2d] '%s' is not in the correct section group"),
fileinfo->fname, (int) idx,
elf_strptr (fileinfo->elf, fileinfo->shstrndx, shdr->sh_name));
- fileinfo->scninfo[idx].grpid = grpscn->grpid;
-
if (ld_state.strip == strip_none
/* If we are stripping, remove debug sections. */
|| (!ebl_debugscn_p (ld_state.ebl,
@@ -1049,6 +1085,9 @@ add_section (struct usedfiles *fileinfo, struct scninfo *scninfo)
queued->segment_nr = ~0;
queued->last = scninfo->next = scninfo;
+ /* Check whether we need a TLS segment. */
+ ld_state.need_tls |= (shdr->sh_flags & SHF_TLS) != 0;
+
/* Add to the hash table and possibly overwrite existing value. */
ld_section_tab_insert (&ld_state.section_tab, hval, queued);
}
@@ -1069,6 +1108,7 @@ add_relocatable_file (struct usedfiles *fileinfo, GElf_Word secttype)
size_t nsymbols = 0;
size_t nlocalsymbols = 0;
bool has_merge_sections = false;
+ bool has_tls_symbols = false;
/* Unless we have different information we assume the code needs
an executable stack. */
enum execstack execstack = execstack_true;
@@ -1077,7 +1117,7 @@ add_relocatable_file (struct usedfiles *fileinfo, GElf_Word secttype)
assert (fileinfo->elf != NULL);
/* Allocate memory for the sections. */
- if (unlikely (elf_getshnum (fileinfo->elf, &scncnt) < 0))
+ if (unlikely (elf_getshdrnum (fileinfo->elf, &scncnt) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot determine number of sections: %s"),
elf_errmsg (-1));
@@ -1125,6 +1165,7 @@ add_relocatable_file (struct usedfiles *fileinfo, GElf_Word secttype)
/* Check whether this section is marked as merge-able. */
has_merge_sections |= (shdr->sh_flags & SHF_MERGE) != 0;
+ has_tls_symbols |= (shdr->sh_flags & SHF_TLS) != 0;
/* Get the ELF section header and data. */
/* Make the file structure available. */
@@ -1222,6 +1263,7 @@ add_relocatable_file (struct usedfiles *fileinfo, GElf_Word secttype)
symscn = elf_getscn (fileinfo->elf, shdr->sh_link);
xelf_getshdr (symscn, symshdr);
symdata = elf_getdata (symscn, NULL);
+
if (symshdr != NULL)
{
XElf_Sym_vardef (sym);
@@ -1233,9 +1275,26 @@ add_relocatable_file (struct usedfiles *fileinfo, GElf_Word secttype)
{
struct symbol *symbol = fileinfo->scninfo[cnt].symbols;
- symbol->name = elf_strptr (fileinfo->elf, symshdr->sh_link,
- sym->st_name);
- symbol->symidx = shdr->sh_info;
+#ifndef NO_HACKS
+ if (XELF_ST_TYPE (sym->st_info) == STT_SECTION)
+ {
+ XElf_Shdr_vardef (buggyshdr);
+ xelf_getshdr (elf_getscn (fileinfo->elf, sym->st_shndx),
+ buggyshdr);
+
+ symbol->name = elf_strptr (fileinfo->elf,
+ FILEINFO_EHDR (fileinfo->ehdr).e_shstrndx,
+ buggyshdr->sh_name);
+ symbol->symidx = -1;
+ }
+ else
+#endif
+ {
+ symbol->name = elf_strptr (fileinfo->elf,
+ symshdr->sh_link,
+ sym->st_name);
+ symbol->symidx = shdr->sh_info;
+ }
symbol->file = fileinfo;
}
}
@@ -1248,6 +1307,35 @@ add_relocatable_file (struct usedfiles *fileinfo, GElf_Word secttype)
shdr->sh_name),
elf_errmsg (-1));
+
+ /* For all the sections which are part of this group, add
+ the reference. */
+ if (data == NULL)
+ error (EXIT_FAILURE, 0, gettext ("\
+%s: cannot get content of section group [%2zd] '%s': %s'"),
+ fileinfo->fname, elf_ndxscn (fileinfo->scninfo[cnt].scn),
+ elf_strptr (fileinfo->elf, fileinfo->shstrndx,
+ shdr->sh_name),
+ elf_errmsg (-1));
+
+ Elf32_Word *grpdata = (Elf32_Word *) data->d_buf;
+ if (grpdata[0] & GRP_COMDAT)
+ fileinfo->scninfo[cnt].comdat_group = true;
+ for (size_t inner = 1; inner < data->d_size / sizeof (Elf32_Word);
+ ++inner)
+ {
+ if (grpdata[inner] >= scncnt)
+ error (EXIT_FAILURE, 0, gettext ("\
+%s: group member %zu of section group [%2zd] '%s' has too high index: %" PRIu32),
+ fileinfo->fname,
+ inner, elf_ndxscn (fileinfo->scninfo[cnt].scn),
+ elf_strptr (fileinfo->elf, fileinfo->shstrndx,
+ shdr->sh_name),
+ grpdata[inner]);
+
+ fileinfo->scninfo[grpdata[inner]].grpid = cnt;
+ }
+
/* The 'used' flag is used to indicate when the information
in the section group is used to mark all other sections
as used. So it must not be true yet. */
@@ -1279,7 +1367,7 @@ add_relocatable_file (struct usedfiles *fileinfo, GElf_Word secttype)
|| shdr->sh_type == SHT_FINI_ARRAY
|| shdr->sh_type == SHT_PREINIT_ARRAY))
{
- /* Check whether the check needs to be executable. */
+ /* Check whether the section needs to be executable. */
if (shdr->sh_type == SHT_PROGBITS
&& (shdr->sh_flags & SHF_EXECINSTR) == 0
&& strcmp (elf_strptr (fileinfo->elf, fileinfo->shstrndx,
@@ -1306,7 +1394,7 @@ add_relocatable_file (struct usedfiles *fileinfo, GElf_Word secttype)
/* In case this file contains merge-able sections we have to
locate the symbols which are in these sections. */
fileinfo->has_merge_sections = has_merge_sections;
- if (likely (has_merge_sections))
+ if (likely (has_merge_sections || has_tls_symbols))
{
fileinfo->symref = (struct symbol **)
obstack_calloc (&ld_state.smem,
@@ -1338,8 +1426,9 @@ add_relocatable_file (struct usedfiles *fileinfo, GElf_Word secttype)
if (XELF_ST_TYPE (sym->st_info) != STT_SECTION
&& (shndx < SHN_LORESERVE || shndx > SHN_HIRESERVE)
- && (SCNINFO_SHDR (fileinfo->scninfo[shndx].shdr).sh_flags
- & SHF_MERGE))
+ && ((SCNINFO_SHDR (fileinfo->scninfo[shndx].shdr).sh_flags
+ & SHF_MERGE)
+ || XELF_ST_TYPE (sym->st_info) == STT_TLS))
{
/* Create a symbol record for this symbol and add it
to the list for this section. */
@@ -1351,6 +1440,7 @@ add_relocatable_file (struct usedfiles *fileinfo, GElf_Word secttype)
newp->symidx = cnt;
newp->scndx = shndx;
newp->file = fileinfo;
+ newp->defined = 1;
fileinfo->symref[cnt] = newp;
if (fileinfo->scninfo[shndx].symbols == NULL)
@@ -1412,8 +1502,8 @@ add_relocatable_file (struct usedfiles *fileinfo, GElf_Word secttype)
/* The symbol is not used. */
continue;
- /* If the DSO uses symbols determine whether this is the default
- version. Otherwise we'll ignore the symbol. */
+ /* If the DSO uses symbol versions determine whether this is
+ the default version. Otherwise we'll ignore the symbol. */
if (versymdata != NULL)
{
XElf_Versym versym;
@@ -1511,7 +1601,8 @@ add_relocatable_file (struct usedfiles *fileinfo, GElf_Word secttype)
else if (hval == 6672457 && strcmp (newp->name, "_fini") == 0)
ld_state.fini_symbol = newp;
}
- else if (unlikely (check_definition (sym, cnt, fileinfo, oldp) != 0))
+ else if (unlikely (check_definition (sym, shndx, cnt, fileinfo, oldp)
+ != 0))
/* A fatal error (multiple definition of a symbol)
occurred, no need to continue. */
return 1;
@@ -1528,7 +1619,7 @@ add_relocatable_file (struct usedfiles *fileinfo, GElf_Word secttype)
#ifndef NDEBUG
size_t shnum;
- assert (elf_getshnum (fileinfo->elf, &shnum) == 0);
+ assert (elf_getshdrnum (fileinfo->elf, &shnum) == 0);
assert (shndx < shnum);
#endif
@@ -1785,15 +1876,16 @@ extract_from_archive (struct usedfiles *fileinfo)
static int archive_seq;
int res = 0;
- /* This is an archive we are not using completely. Give it a
- unique number. */
- fileinfo->archive_seq = ++archive_seq;
+ if (fileinfo->archive_seq == 0)
+ /* This is an archive we are not using completely. Give it a
+ unique number. */
+ fileinfo->archive_seq = ++archive_seq;
/* If there are no unresolved symbols don't do anything. */
+ assert (ld_state.extract_rule == defaultextract
+ || ld_state.extract_rule == weakextract);
if ((likely (ld_state.extract_rule == defaultextract)
- && ld_state.nunresolved_nonweak == 0)
- || (unlikely (ld_state.extract_rule == weakextract)
- && ld_state.nunresolved == 0))
+ ? ld_state.nunresolved_nonweak : ld_state.nunresolved) == 0)
return 0;
Elf_Arsym *syms;
@@ -1818,7 +1910,6 @@ extract_from_archive (struct usedfiles *fileinfo)
the first definition. */
// XXX Is this a compatible behavior?
bool any_used;
- int nround = 0;
do
{
any_used = false;
@@ -1876,7 +1967,7 @@ extract_from_archive (struct usedfiles *fileinfo)
}
}
- if (++nround == 1)
+ if (any_used)
{
/* This is an archive therefore it must have a number. */
assert (fileinfo->archive_seq != 0);
@@ -1947,7 +2038,7 @@ file_process2 (struct usedfiles *fileinfo)
}
/* Determine the section header string table section index. */
- if (unlikely (elf_getshstrndx (fileinfo->elf, &fileinfo->shstrndx)
+ if (unlikely (elf_getshdrstrndx (fileinfo->elf, &fileinfo->shstrndx)
< 0))
{
fprintf (stderr, gettext ("\
@@ -2069,9 +2160,22 @@ cannot use DSO '%s' when generating relocatable object file"),
res = 0;
}
else
- /* Extract only the members from the archive which are
- currently referenced by unresolved symbols. */
- res = extract_from_archive (fileinfo);
+ {
+ if (ld_state.group_start_requested
+ && ld_state.group_start_archive == NULL)
+ ld_state.group_start_archive = fileinfo;
+
+ if (ld_state.archives == NULL)
+ ld_state.archives = fileinfo;
+
+ if (ld_state.tailarchives != NULL)
+ ld_state.tailarchives->next = fileinfo;
+ ld_state.tailarchives = fileinfo;
+
+ /* Extract only the members from the archive which are
+ currently referenced by unresolved symbols. */
+ res = extract_from_archive (fileinfo);
+ }
}
else
/* This should never happen, we know about no other types. */
@@ -2127,7 +2231,7 @@ ld_generic_file_process (int fd, struct usedfiles *fileinfo,
/* We found the file. Now test whether it is a file type we can
handle.
- XXX Do we have to have the ability to start from a given
+ XXX Do we need to have the ability to start from a given
position in the search path again to look for another file if
the one found has not the right type? */
res = open_elf (fileinfo, elf_begin (fileinfo->fd,
@@ -2170,19 +2274,24 @@ ld_generic_file_process (int fd, struct usedfiles *fileinfo,
runp = runp->next;
}
while (runp != fileinfo->next);
+
+ /* Do not do this again. */
+ ld_state.archives = NULL;
+
+ /* Do not move on to the next archive. */
+ *nextp = fileinfo->next = NULL;
}
}
else if (unlikely (fileinfo->group_end))
{
- /* This is the end of a group. We possibly of to go back.
+ /* This is the end of a group. We possibly have to go back.
Determine which file we would go back to and see whether it
makes sense. If there has not been an archive we don't have
to do anything. */
- if (!ld_state.group_start_requested)
+ if (ld_state.group_start_requested)
{
if (ld_state.group_start_archive != ld_state.tailarchives)
- /* The loop would include more than one archive, add the
- pointer. */
+ /* The loop includes more than one archive, add the pointer. */
{
*nextp = ld_state.tailarchives->group_backref =
ld_state.group_start_archive;
@@ -2201,6 +2310,7 @@ ld_generic_file_process (int fd, struct usedfiles *fileinfo,
/* Clear the flags. */
ld_state.group_start_requested = false;
+ ld_state.group_start_archive = NULL;
fileinfo->group_end = false;
}
@@ -2333,6 +2443,11 @@ ld_generic_generate_sections (struct ld_state *statep)
/* The relocation section type. */
int rel_type = REL_TYPE (&ld_state) == DT_REL ? SHT_REL : SHT_RELA;
+ /* When requested, every output file will have a build ID section. */
+ if (statep->build_id != NULL)
+ new_generated_scn (scn_dot_note_gnu_build_id, ".note.gnu.build-id",
+ SHT_NOTE, SHF_ALLOC, 0, 4);
+
/* When building dynamically linked object we have to include a
section containing a string describing the interpreter. This
should be at the very beginning of the file together with the
@@ -2372,8 +2487,13 @@ ld_generic_generate_sections (struct ld_state *statep)
0, 1);
/* And a hashing table. */
// XXX For Linux/Alpha we need other sizes unless they change...
- new_generated_scn (scn_dot_hash, ".hash", SHT_HASH, SHF_ALLOC,
- sizeof (Elf32_Word), sizeof (Elf32_Word));
+ if (GENERATE_SYSV_HASH)
+ new_generated_scn (scn_dot_hash, ".hash", SHT_HASH, SHF_ALLOC,
+ sizeof (Elf32_Word), sizeof (Elf32_Word));
+ if (GENERATE_GNU_HASH)
+ new_generated_scn (scn_dot_gnu_hash, ".gnu.hash", SHT_GNU_HASH,
+ SHF_ALLOC, sizeof (Elf32_Word),
+ sizeof (Elf32_Word));
/* Create the section associated with the PLT if necessary. */
if (ld_state.nplt > 0)
@@ -2394,8 +2514,11 @@ ld_generic_generate_sections (struct ld_state *statep)
: xelf_fsize (ld_state.outelf, ELF_T_RELA, 1),
xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1));
- /* This means we will also need the .got section. */
- ld_state.need_got = true;
+ /* XXX We might need a function which returns the section flags. */
+ new_generated_scn (scn_dot_gotplt, ".got.plt", SHT_PROGBITS,
+ SHF_ALLOC | SHF_WRITE,
+ xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1),
+ xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1));
/* Mark all used DSOs as used. Determine whether any referenced
object uses symbol versioning. */
@@ -3427,7 +3550,8 @@ optimal_bucket_size (Elf32_Word *hashcodes, size_t maxcnt, int optlevel)
memset (counts, '\0', (maxcnt + 1) * sizeof (uint32_t));
/* Determine how often each hash bucket is used. */
- for (inner = 0; inner < maxcnt; ++inner)
+ assert (hashcodes[0] == 0);
+ for (inner = 1; inner < maxcnt; ++inner)
++lengths[hashcodes[inner] % size];
/* Determine the lengths. */
@@ -3488,6 +3612,17 @@ optimal_bucket_size (Elf32_Word *hashcodes, size_t maxcnt, int optlevel)
}
+static void
+optimal_gnu_hash_size (Elf32_Word *hashcodes, size_t maxcnt, int optlevel,
+ size_t *bitmask_nwords, size_t *shift, size_t *nbuckets)
+{
+ // XXX Implement something real
+ *bitmask_nwords = 256;
+ *shift = 6;
+ *nbuckets = 3 * maxcnt / 2;
+}
+
+
static XElf_Addr
find_entry_point (void)
{
@@ -3585,6 +3720,8 @@ fillin_special_symbol (struct symbol *symst, size_t scnidx, size_t nsym,
sym->st_shndx = scnidx;
/* We want the beginning of the section. */
sym->st_value = 0;
+ // XXX What size?
+ sym->st_size = 0;
/* Determine the size of the section. */
if (scnidx != SHN_ABS)
@@ -3722,6 +3859,435 @@ create_verneed_data (XElf_Off offset, Elf_Data *verneeddata,
}
+/* Callback for qsort to sort dynamic string table. */
+static Elf32_Word *global_hashcodes;
+static size_t global_nbuckets;
+static int
+sortfct_hashval (const void *p1, const void *p2)
+{
+ size_t idx1 = *(size_t *) p1;
+ size_t idx2 = *(size_t *) p2;
+
+ int def1 = ndxtosym[idx1]->defined && !ndxtosym[idx1]->in_dso;
+ int def2 = ndxtosym[idx2]->defined && !ndxtosym[idx2]->in_dso;
+
+ if (! def1 && def2)
+ return -1;
+ if (def1 && !def2)
+ return 1;
+ if (! def1)
+ return 0;
+
+ Elf32_Word hval1 = (global_hashcodes[ndxtosym[idx1]->outdynsymidx]
+ % global_nbuckets);
+ Elf32_Word hval2 = (global_hashcodes[ndxtosym[idx2]->outdynsymidx]
+ % global_nbuckets);
+
+ if (hval1 < hval2)
+ return -1;
+ if (hval1 > hval2)
+ return 1;
+ return 0;
+}
+
+
+/* Sort the dynamic symbol table. The GNU hash table lookup assumes
+ that all symbols with the same hash value module the bucket table
+ size follow one another. This avoids the extra hash chain table.
+ There is no need (and no way) to perform this operation if we do
+ not use the new hash table format. */
+static void
+create_gnu_hash (size_t nsym_local, size_t nsym, size_t nsym_dyn,
+ Elf32_Word *gnuhashcodes)
+{
+ size_t gnu_bitmask_nwords = 0;
+ size_t gnu_shift = 0;
+ size_t gnu_nbuckets = 0;
+ Elf32_Word *gnu_bitmask = NULL;
+ Elf32_Word *gnu_buckets = NULL;
+ Elf32_Word *gnu_chain = NULL;
+ XElf_Shdr_vardef (shdr);
+
+ /* Determine the "optimal" bucket size. */
+ optimal_gnu_hash_size (gnuhashcodes, nsym_dyn, ld_state.optlevel,
+ &gnu_bitmask_nwords, &gnu_shift, &gnu_nbuckets);
+
+ /* Create the .gnu.hash section data structures. */
+ Elf_Scn *hashscn = elf_getscn (ld_state.outelf, ld_state.gnuhashscnidx);
+ xelf_getshdr (hashscn, shdr);
+ Elf_Data *hashdata = elf_newdata (hashscn);
+ if (shdr == NULL || hashdata == NULL)
+ error (EXIT_FAILURE, 0, gettext ("\
+cannot create GNU hash table section for output file: %s"),
+ elf_errmsg (-1));
+
+ shdr->sh_link = ld_state.dynsymscnidx;
+ (void) xelf_update_shdr (hashscn, shdr);
+
+ hashdata->d_size = (xelf_fsize (ld_state.outelf, ELF_T_ADDR,
+ gnu_bitmask_nwords)
+ + (4 + gnu_nbuckets + nsym_dyn) * sizeof (Elf32_Word));
+ hashdata->d_buf = xcalloc (1, hashdata->d_size);
+ hashdata->d_align = sizeof (Elf32_Word);
+ hashdata->d_type = ELF_T_WORD;
+ hashdata->d_off = 0;
+
+ ((Elf32_Word *) hashdata->d_buf)[0] = gnu_nbuckets;
+ ((Elf32_Word *) hashdata->d_buf)[2] = gnu_bitmask_nwords;
+ ((Elf32_Word *) hashdata->d_buf)[3] = gnu_shift;
+ gnu_bitmask = &((Elf32_Word *) hashdata->d_buf)[4];
+ gnu_buckets = &gnu_bitmask[xelf_fsize (ld_state.outelf, ELF_T_ADDR,
+ gnu_bitmask_nwords)
+ / sizeof (*gnu_buckets)];
+ gnu_chain = &gnu_buckets[gnu_nbuckets];
+#ifndef NDEBUG
+ void *endp = &gnu_chain[nsym_dyn];
+#endif
+ assert (endp == (void *) ((char *) hashdata->d_buf + hashdata->d_size));
+
+
+ size_t *remap = xmalloc (nsym_dyn * sizeof (size_t));
+#ifndef NDEBUG
+ size_t nsym_dyn_cnt = 1;
+#endif
+ for (size_t cnt = nsym_local; cnt < nsym; ++cnt)
+ if (symstrent[cnt] != NULL)
+ {
+ assert (ndxtosym[cnt]->outdynsymidx > 0);
+ assert (ndxtosym[cnt]->outdynsymidx < nsym_dyn);
+ remap[ndxtosym[cnt]->outdynsymidx] = cnt;
+#ifndef NDEBUG
+ ++nsym_dyn_cnt;
+#endif
+ }
+ assert (nsym_dyn_cnt == nsym_dyn);
+
+ // XXX Until we can rely on qsort_r use global variables.
+ global_hashcodes = gnuhashcodes;
+ global_nbuckets = gnu_nbuckets;
+ qsort (remap + 1, nsym_dyn - 1, sizeof (size_t), sortfct_hashval);
+
+ bool bm32 = (xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1)
+ == sizeof (Elf32_Word));
+
+ size_t first_defined = 0;
+ Elf64_Word bitmask_idxbits = gnu_bitmask_nwords - 1;
+ Elf32_Word last_bucket = 0;
+ for (size_t cnt = 1; cnt < nsym_dyn; ++cnt)
+ {
+ if (first_defined == 0)
+ {
+ if (! ndxtosym[remap[cnt]]->defined
+ || ndxtosym[remap[cnt]]->in_dso)
+ goto next;
+
+ ((Elf32_Word *) hashdata->d_buf)[1] = first_defined = cnt;
+ }
+
+ Elf32_Word hval = gnuhashcodes[ndxtosym[remap[cnt]]->outdynsymidx];
+
+ if (bm32)
+ {
+ Elf32_Word *bsw = &gnu_bitmask[(hval / 32) & bitmask_idxbits];
+ assert ((void *) gnu_bitmask <= (void *) bsw);
+ assert ((void *) bsw < (void *) gnu_buckets);
+ *bsw |= 1 << (hval & 31);
+ *bsw |= 1 << ((hval >> gnu_shift) & 31);
+ }
+ else
+ {
+ Elf64_Word *bsw = &((Elf64_Word *) gnu_bitmask)[(hval / 64)
+ & bitmask_idxbits];
+ assert ((void *) gnu_bitmask <= (void *) bsw);
+ assert ((void *) bsw < (void *) gnu_buckets);
+ *bsw |= 1 << (hval & 63);
+ *bsw |= 1 << ((hval >> gnu_shift) & 63);
+ }
+
+ size_t this_bucket = hval % gnu_nbuckets;
+ if (cnt == first_defined || this_bucket != last_bucket)
+ {
+ if (cnt != first_defined)
+ {
+ /* Terminate the previous chain. */
+ assert ((void *) &gnu_chain[cnt - first_defined - 1] < endp);
+ gnu_chain[cnt - first_defined - 1] |= 1;
+ }
+
+ assert (this_bucket < gnu_nbuckets);
+ gnu_buckets[this_bucket] = cnt;
+ last_bucket = this_bucket;
+ }
+
+ assert (cnt >= first_defined);
+ assert (cnt - first_defined < nsym_dyn);
+ gnu_chain[cnt - first_defined] = hval & ~1u;
+
+ next:
+ ndxtosym[remap[cnt]]->outdynsymidx = cnt;
+ }
+
+ /* Terminate the last chain. */
+ if (first_defined != 0)
+ {
+ assert (nsym_dyn > first_defined);
+ assert (nsym_dyn - first_defined - 1 < nsym_dyn);
+ gnu_chain[nsym_dyn - first_defined - 1] |= 1;
+
+ hashdata->d_size -= first_defined * sizeof (Elf32_Word);
+ }
+ else
+ /* We do not need any hash table. */
+ // XXX
+ do { } while (0);
+
+ free (remap);
+}
+
+
+/* Create the SysV-style hash table. */
+static void
+create_hash (size_t nsym_local, size_t nsym, size_t nsym_dyn,
+ Elf32_Word *hashcodes)
+{
+ size_t nbucket = 0;
+ Elf32_Word *bucket = NULL;
+ Elf32_Word *chain = NULL;
+ XElf_Shdr_vardef (shdr);
+
+ /* Determine the "optimal" bucket size. If we also generate the
+ new-style hash function there is no need to waste effort and
+ space on the old one which should not be used. Make it as small
+ as possible. */
+ if (GENERATE_GNU_HASH)
+ nbucket = 1;
+ else
+ nbucket = optimal_bucket_size (hashcodes, nsym_dyn, ld_state.optlevel);
+ /* Create the .hash section data structures. */
+ Elf_Scn *hashscn = elf_getscn (ld_state.outelf, ld_state.hashscnidx);
+ xelf_getshdr (hashscn, shdr);
+ Elf_Data *hashdata = elf_newdata (hashscn);
+ if (shdr == NULL || hashdata == NULL)
+ error (EXIT_FAILURE, 0, gettext ("\
+cannot create hash table section for output file: %s"),
+ elf_errmsg (-1));
+
+ shdr->sh_link = ld_state.dynsymscnidx;
+ (void) xelf_update_shdr (hashscn, shdr);
+
+ hashdata->d_size = (2 + nsym_dyn + nbucket) * sizeof (Elf32_Word);
+ hashdata->d_buf = xcalloc (1, hashdata->d_size);
+ hashdata->d_align = sizeof (Elf32_Word);
+ hashdata->d_type = ELF_T_WORD;
+ hashdata->d_off = 0;
+
+ ((Elf32_Word *) hashdata->d_buf)[0] = nbucket;
+ ((Elf32_Word *) hashdata->d_buf)[1] = nsym_dyn;
+ bucket = &((Elf32_Word *) hashdata->d_buf)[2];
+ chain = &((Elf32_Word *) hashdata->d_buf)[2 + nbucket];
+
+ for (size_t cnt = nsym_local; cnt < nsym; ++cnt)
+ if (symstrent[cnt] != NULL)
+ {
+ size_t dynidx = ndxtosym[cnt]->outdynsymidx;
+ size_t hashidx = hashcodes[dynidx] % nbucket;
+ if (bucket[hashidx] == 0)
+ bucket[hashidx] = dynidx;
+ else
+ {
+ hashidx = bucket[hashidx];
+ while (chain[hashidx] != 0)
+ hashidx = chain[hashidx];
+
+ chain[hashidx] = dynidx;
+ }
+ }
+}
+
+
+static void
+create_build_id_section (Elf_Scn *scn)
+{
+ /* We know how large the section will be so we can create it now. */
+ Elf_Data *d = elf_newdata (scn);
+ if (d == NULL)
+ error (EXIT_FAILURE, 0, gettext ("cannot create build ID section: %s"),
+ elf_errmsg (-1));
+
+ d->d_type = ELF_T_BYTE;
+ d->d_version = EV_CURRENT;
+
+ /* The note section header. */
+ assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr));
+ d->d_size = sizeof (GElf_Nhdr);
+ /* The string is four bytes long. */
+ d->d_size += sizeof (ELF_NOTE_GNU);
+ assert (d->d_size % 4 == 0);
+
+ if (strcmp (ld_state.build_id, "md5") == 0
+ || strcmp (ld_state.build_id, "uuid") == 0)
+ d->d_size += 16;
+ else if (strcmp (ld_state.build_id, "sha1") == 0)
+ d->d_size += 20;
+ else
+ {
+ assert (ld_state.build_id[0] == '0' && ld_state.build_id[1] == 'x');
+ /* Use an upper limit of the possible number of bytes generated
+ from the string. */
+ d->d_size += strlen (ld_state.build_id) / 2;
+ }
+
+ d->d_buf = xcalloc (d->d_size, 1);
+ d->d_off = 0;
+ d->d_align = 0;
+}
+
+
+static void
+compute_hash_sum (void (*hashfct) (const void *, size_t, void *), void *ctx)
+{
+ /* The call cannot fail. */
+ size_t shstrndx;
+ (void) elf_getshdrstrndx (ld_state.outelf, &shstrndx);
+
+ const char *ident = elf_getident (ld_state.outelf, NULL);
+ bool same_byte_order = ((ident[EI_DATA] == ELFDATA2LSB
+ && __BYTE_ORDER == __LITTLE_ENDIAN)
+ || (ident[EI_DATA] == ELFDATA2MSB
+ && __BYTE_ORDER == __BIG_ENDIAN));
+
+ /* Iterate over all sections to find those which are not strippable. */
+ Elf_Scn *scn = NULL;
+ while ((scn = elf_nextscn (ld_state.outelf, scn)) != NULL)
+ {
+ /* Get the section header. */
+ GElf_Shdr shdr_mem;
+ GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+ assert (shdr != NULL);
+
+ if (SECTION_STRIP_P (shdr, elf_strptr (ld_state.outelf, shstrndx,
+ shdr->sh_name), true))
+ /* The section can be stripped. Don't use it. */
+ continue;
+
+ /* Do not look at NOBITS sections. */
+ if (shdr->sh_type == SHT_NOBITS)
+ continue;
+
+ /* Iterate through the list of data blocks. */
+ Elf_Data *data = NULL;
+ while ((data = INTUSE(elf_getdata) (scn, data)) != NULL)
+ /* If the file byte order is the same as the host byte order
+ process the buffer directly. If the data is just a stream
+ of bytes which the library will not convert we can use it
+ as well. */
+ if (likely (same_byte_order) || data->d_type == ELF_T_BYTE)
+ hashfct (data->d_buf, data->d_size, ctx);
+ else
+ {
+ /* Convert the data to file byte order. */
+ if (gelf_xlatetof (ld_state.outelf, data, data, ident[EI_DATA])
+ == NULL)
+ error (EXIT_FAILURE, 0, gettext ("\
+cannot convert section data to file format: %s"),
+ elf_errmsg (-1));
+
+ hashfct (data->d_buf, data->d_size, ctx);
+
+ /* And convert it back. */
+ if (gelf_xlatetom (ld_state.outelf, data, data, ident[EI_DATA])
+ == NULL)
+ error (EXIT_FAILURE, 0, gettext ("\
+cannot convert section data to memory format: %s"),
+ elf_errmsg (-1));
+ }
+ }
+}
+
+
+/* Iterate over the sections */
+static void
+compute_build_id (void)
+{
+ Elf_Data *d = elf_getdata (elf_getscn (ld_state.outelf,
+ ld_state.buildidscnidx), NULL);
+ assert (d != NULL);
+
+ GElf_Nhdr *hdr = d->d_buf;
+ hdr->n_namesz = sizeof (ELF_NOTE_GNU);
+ hdr->n_type = NT_GNU_BUILD_ID;
+ char *dp = mempcpy (hdr + 1, ELF_NOTE_GNU, sizeof (ELF_NOTE_GNU));
+
+ if (strcmp (ld_state.build_id, "sha1") == 0)
+ {
+ /* Compute the SHA1 sum of various parts of the generated file.
+ We compute the hash sum over the external representation. */
+ struct sha1_ctx ctx;
+ sha1_init_ctx (&ctx);
+
+ /* Compute the hash sum by running over all sections. */
+ compute_hash_sum ((void (*) (const void *, size_t, void *)) sha1_process_bytes,
+ &ctx);
+
+ /* We are done computing the checksum. */
+ (void) sha1_finish_ctx (&ctx, dp);
+
+ hdr->n_descsz = SHA1_DIGEST_SIZE;
+ }
+ else if (strcmp (ld_state.build_id, "md5") == 0)
+ {
+ /* Compute the MD5 sum of various parts of the generated file.
+ We compute the hash sum over the external representation. */
+ struct md5_ctx ctx;
+ md5_init_ctx (&ctx);
+
+ /* Compute the hash sum by running over all sections. */
+ compute_hash_sum ((void (*) (const void *, size_t, void *)) md5_process_bytes,
+ &ctx);
+
+ /* We are done computing the checksum. */
+ (void) md5_finish_ctx (&ctx, dp);
+
+ hdr->n_descsz = MD5_DIGEST_SIZE;
+ }
+ else if (strcmp (ld_state.build_id, "uuid") == 0)
+ {
+ int fd = open ("/dev/urandom", O_RDONLY);
+ if (fd == -1)
+ error (EXIT_FAILURE, errno, gettext ("cannot open '%s'"),
+ "/dev/urandom");
+
+ if (TEMP_FAILURE_RETRY (read (fd, dp, 16)) != 16)
+ error (EXIT_FAILURE, 0, gettext ("cannot read enough data for UUID"));
+
+ close (fd);
+
+ hdr->n_descsz = 16;
+ }
+ else
+ {
+ const char *cp = ld_state.build_id + 2;
+
+ /* The form of the string has been verified before so here we can
+ simplify the scanning. */
+ do
+ {
+ if (isxdigit (cp[0]))
+ {
+ char ch1 = tolower (cp[0]);
+ char ch2 = tolower (cp[1]);
+
+ *dp++ = (((isdigit (ch1) ? ch1 - '0' : ch1 - 'a' + 10) << 4)
+ | (isdigit (ch2) ? ch2 - '0' : ch2 - 'a' + 10));
+ }
+ else
+ ++cp;
+ }
+ while (*cp != '\0');
+ }
+}
+
+
/* Create the output file.
For relocatable files what basically has to happen is that all
@@ -3775,6 +4341,7 @@ ld_generic_create_outfile (struct ld_state *statep)
Elf_Data *dynsymdata = NULL;
Elf_Data *dynstrdata = NULL;
Elf32_Word *hashcodes = NULL;
+ Elf32_Word *gnuhashcodes = NULL;
size_t nsym_dyn_allocated = 0;
Elf_Scn *versymscn = NULL;
Elf_Data *versymdata = NULL;
@@ -3918,6 +4485,17 @@ ld_generic_create_outfile (struct ld_state *statep)
continue;
}
+ if (unlikely (head->kind == scn_dot_gotplt))
+ {
+ /* Remember the index of this section. */
+ ld_state.gotpltscnidx = elf_ndxscn (scn);
+
+ /* Give the backend the change to initialize the section. */
+ INITIALIZE_GOTPLT (&ld_state, scn);
+
+ continue;
+ }
+
if (unlikely (head->kind == scn_dot_dynrel))
{
Elf_Data *outdata;
@@ -4060,6 +4638,14 @@ ld_generic_create_outfile (struct ld_state *statep)
continue;
}
+ if (unlikely (head->kind == scn_dot_gnu_hash))
+ {
+ /* Remember the index of this section. */
+ ld_state.gnuhashscnidx = elf_ndxscn (scn);
+
+ continue;
+ }
+
if (unlikely (head->kind == scn_dot_plt))
{
/* Remember the index of this section. */
@@ -4098,6 +4684,16 @@ ld_generic_create_outfile (struct ld_state *statep)
continue;
}
+ if (unlikely (head->kind == scn_dot_note_gnu_build_id))
+ {
+ /* Remember the index of this section. */
+ ld_state.buildidscnidx = elf_ndxscn (scn);
+
+ create_build_id_section (scn);
+
+ continue;
+ }
+
/* If we come here we must be handling a normal section. */
assert (head->kind == scn_normal);
@@ -4572,7 +5168,8 @@ ld_generic_create_outfile (struct ld_state *statep)
if (ld_state.got_symbol != NULL)
{
assert (nsym < nsym_allocated);
- fillin_special_symbol (ld_state.got_symbol, ld_state.gotscnidx,
+ // XXX Fix so that it works even if no PLT is needed.
+ fillin_special_symbol (ld_state.got_symbol, ld_state.gotpltscnidx,
nsym++, symdata, strtab);
}
@@ -4873,6 +5470,10 @@ section index too large in dynamic symbol table"));
if (reduce_symbol_p (sym, symstrent[cnt]))
{
+ // XXX Check whether this is correct...
+ assert (ndxtosym[cnt]->outdynsymidx != 0);
+ ndxtosym[cnt]->outdynsymidx = 0;
+
sym->st_info = XELF_ST_INFO (STB_LOCAL,
XELF_ST_TYPE (sym->st_info));
(void) xelf_update_sym (symdata, cnt, sym);
@@ -5190,7 +5791,7 @@ section index too large in dynamic symbol table"));
gelf_getversym (symp->file->versymdata, symp->symidx,
&versym);
- (void) gelf_update_versym (versymdata, nsym_dyn,
+ (void) gelf_update_versym (versymdata, symp->outdynsymidx,
&symp->file->verdefused[versym]);
}
}
@@ -5229,16 +5830,16 @@ cannot create dynamic symbol table for output file: %s"),
/* We need one more array which contains the hash codes of the
symbol names. */
- hashcodes = (Elf32_Word *) xcalloc (nsym_dyn_allocated,
+ hashcodes = (Elf32_Word *) xcalloc (__builtin_popcount ((int) ld_state.hash_style)
+ * nsym_dyn_allocated,
sizeof (Elf32_Word));
+ gnuhashcodes = hashcodes;
+ if (GENERATE_SYSV_HASH)
+ gnuhashcodes += nsym_dyn_allocated;
/* We have and empty entry at the beginning. */
nsym_dyn = 1;
- /* We don't mix PLT symbols and others. */
- size_t plt_idx = 1;
- size_t obj_idx = 1 + ld_state.nplt;
-
/* Populate the table. */
for (cnt = nsym_local; cnt < nsym; ++cnt)
{
@@ -5270,20 +5871,43 @@ section index too large in dynamic symbol table"));
continue;
}
- size_t idx;
- if (ndxtosym[cnt]->in_dso && ndxtosym[cnt]->type == STT_FUNC)
- {
- idx = plt_idx++;
- assert (idx < 1 + ld_state.nplt);
- }
- else
- {
- idx = obj_idx++;
- assert (idx < nsym_dyn_allocated);
- }
+ /* Store the index of the symbol in the dynamic symbol
+ table. This is a preliminary value in case we use the
+ GNU-style hash table. */
+ ndxtosym[cnt]->outdynsymidx = nsym_dyn;
+
+ /* Create a new string table entry. */
+ const char *str = ndxtosym[cnt]->name;
+ symstrent[cnt] = ebl_strtabadd (dynstrtab, str, 0);
+ if (GENERATE_SYSV_HASH)
+ hashcodes[nsym_dyn] = elf_hash (str);
+ if (GENERATE_GNU_HASH)
+ gnuhashcodes[nsym_dyn] = elf_gnu_hash (str);
+ ++nsym_dyn;
+ }
+
+ if (ld_state.file_type != relocatable_file_type)
+ {
+ /* Finalize the dynamic string table. */
+ ebl_strtabfinalize (dynstrtab, dynstrdata);
+
+ assert (ld_state.hashscnidx != 0 || ld_state.gnuhashscnidx != 0);
+
+ /* Create the GNU-style hash table. */
+ if (GENERATE_GNU_HASH)
+ create_gnu_hash (nsym_local, nsym, nsym_dyn, gnuhashcodes);
+
+ /* Create the SysV-style hash table. This has to happen
+ after the GNU-style table is created since
+ CREATE-GNU-HASH might reorder the dynamic symbol table. */
+ if (GENERATE_SYSV_HASH)
+ create_hash (nsym_local, nsym, nsym_dyn, hashcodes);
+ }
/* Add the version information. */
- if (versymdata != NULL)
+ if (versymdata != NULL)
+ for (cnt = nsym_local; cnt < nsym; ++cnt)
+ if (symstrent[cnt] != NULL)
{
struct symbol *symp = ndxtosym[cnt];
@@ -5296,29 +5920,17 @@ section index too large in dynamic symbol table"));
gelf_getversym (symp->file->versymdata, symp->symidx,
&versym);
- (void) gelf_update_versym (versymdata, idx,
+ (void) gelf_update_versym (versymdata, symp->outdynsymidx,
&symp->file->verdefused[versym]);
}
else
{
/* XXX Add support for version definitions. */
GElf_Versym global = VER_NDX_GLOBAL;
- (void) gelf_update_versym (versymdata, idx, &global);
+ (void) gelf_update_versym (versymdata, nsym_dyn, &global);
}
}
- /* Store the index of the symbol in the dynamic symbol table. */
- ndxtosym[cnt]->outdynsymidx = idx;
-
- /* Create a new string table entry. */
- const char *str = ndxtosym[cnt]->name;
- symstrent[cnt] = ebl_strtabadd (dynstrtab, str, 0);
- hashcodes[idx] = elf_hash (str);
- ++nsym_dyn;
- }
- assert (nsym_dyn == obj_idx);
- assert (ld_state.nplt + 1 == plt_idx);
-
/* Update the information about the symbol section. */
if (versymdata != NULL)
{
@@ -5339,46 +5951,6 @@ section index too large in dynamic symbol table"));
if (ld_state.file_type != relocatable_file_type)
{
- size_t nbucket;
- Elf32_Word *bucket;
- Elf32_Word *chain;
- size_t nchain;
- Elf_Scn *hashscn;
- Elf_Data *hashdata;
-
- /* Finalize the dynamic string table. */
- ebl_strtabfinalize (dynstrtab, dynstrdata);
-
- /* Determine the "optimal" bucket size. */
- nbucket = optimal_bucket_size (hashcodes, nsym_dyn, ld_state.optlevel);
-
- /* Create the .hash section data structures. */
- assert (ld_state.hashscnidx != 0);
- hashscn = elf_getscn (ld_state.outelf, ld_state.hashscnidx);
- xelf_getshdr (hashscn, shdr);
- hashdata = elf_newdata (hashscn);
- if (shdr == NULL || hashdata == NULL)
- error (EXIT_FAILURE, 0, gettext ("\
-cannot create hash table section for output file: %s"),
- elf_errmsg (-1));
-
- shdr->sh_link = ld_state.dynsymscnidx;
- (void) xelf_update_shdr (hashscn, shdr);
-
- hashdata->d_size = (2 + nsym_dyn + nbucket) * sizeof (Elf32_Word);
- hashdata->d_buf = xcalloc (1, hashdata->d_size);
- hashdata->d_align = sizeof (Elf32_Word);
- hashdata->d_type = ELF_T_WORD;
- hashdata->d_off = 0;
-
- ((Elf32_Word *) hashdata->d_buf)[0] = nbucket;
- ((Elf32_Word *) hashdata->d_buf)[1] = nsym_dyn;
- bucket = &((Elf32_Word *) hashdata->d_buf)[2];
- chain = &((Elf32_Word *) hashdata->d_buf)[2 + nbucket];
-
- /* Haven't yet filled in any chain value. */
- nchain = 0;
-
/* Now put the names in. */
for (cnt = nsym_local; cnt < nsym; ++cnt)
if (symstrent[cnt] != NULL)
@@ -5399,27 +5971,10 @@ cannot create hash table section for output file: %s"),
sym->st_name = ebl_strtaboffset (symstrent[cnt]);
(void) xelf_update_sym (dynsymdata, dynidx, sym);
-
- /* Add to the hash table. */
- size_t hashidx = hashcodes[dynidx] % nbucket;
- if (bucket[hashidx] == 0)
- bucket[hashidx] = dynidx;
- else
- {
- hashidx = bucket[hashidx];
- while (chain[hashidx] != 0)
- hashidx = chain[hashidx];
-
- chain[hashidx] = dynidx;
- }
}
free (hashcodes);
- /* We don't need the map from the symbol table index to the symbol
- structure anymore. */
- free (ndxtosym);
-
/* Create the required version section. */
if (ld_state.verneedscnidx != 0)
{
@@ -5492,10 +6047,6 @@ cannot create hash table section for output file: %s"),
/* Write the updated info back. */
(void) xelf_update_shdr (dynsymscn, shdr);
}
- else
- /* We don't need the map from the symbol table index to the symbol
- structure anymore. */
- free (ndxtosym);
/* We don't need the string table anymore. */
free (symstrent);
@@ -5665,13 +6216,6 @@ cannot create hash table section for output file: %s"),
if (ld_state.file_type != relocatable_file_type)
{
- size_t nphdr;
- XElf_Addr addr;
- struct output_segment *segment;
- Elf_Scn *scn;
- Elf32_Word nsec;
- XElf_Phdr_vardef (phdr);
-
/* Every executable needs a program header. The number of entries
varies. One exists for each segment. Each SHT_NOTE section gets
one, too. For dynamically linked executables we have to create
@@ -5679,12 +6223,12 @@ cannot create hash table section for output file: %s"),
section. First count the number of segments.
XXX Determine whether the segment is non-empty. */
- nphdr = 0;
+ size_t nphdr = 0;
/* We always add a PT_GNU_stack entry. */
++nphdr;
- segment = ld_state.output_segments;
+ struct output_segment *segment = ld_state.output_segments;
while (segment != NULL)
{
++nphdr;
@@ -5705,7 +6249,12 @@ cannot create hash table section for output file: %s"),
nphdr += 2;
}
+ /* If we need a TLS segment we need an entry for that. */
+ if (ld_state.need_tls)
+ ++nphdr;
+
/* Create the program header structure. */
+ XElf_Phdr_vardef (phdr);
if (xelf_newphdr (ld_state.outelf, nphdr) == 0)
error (EXIT_FAILURE, 0, gettext ("cannot create program header: %s"),
elf_errmsg (-1));
@@ -5721,14 +6270,20 @@ cannot create hash table section for output file: %s"),
/* Now determine the memory addresses of all the sections and
segments. */
- nsec = 0;
- scn = elf_getscn (ld_state.outelf, ld_state.allsections[nsec]->scnidx);
+ Elf32_Word nsec = 0;
+ Elf_Scn *scn = elf_getscn (ld_state.outelf,
+ ld_state.allsections[nsec]->scnidx);
xelf_getshdr (scn, shdr);
assert (shdr != NULL);
/* The address we start with is the offset of the first (not
zeroth) section. */
- addr = shdr->sh_offset;
+ XElf_Addr addr = shdr->sh_offset;
+ XElf_Addr tls_offset = 0;
+ XElf_Addr tls_start = ~((XElf_Addr) 0);
+ XElf_Addr tls_end = 0;
+ XElf_Off tls_filesize = 0;
+ XElf_Addr tls_align = 0;
/* The index of the first loadable segment. */
nphdr = 0;
@@ -5748,15 +6303,13 @@ cannot create hash table section for output file: %s"),
XElf_Off nobits_size = 0;
XElf_Off memsize = 0;
- /* the minimum alignment is a page size. */
+ /* The minimum alignment is a page size. */
segment->align = ld_state.pagesize;
for (orule = segment->output_rules; orule != NULL;
orule = orule->next)
if (orule->tag == output_section)
{
- XElf_Off oldoff;
-
/* See whether this output rule corresponds to the next
section. Yes, this is a pointer comparison. */
if (ld_state.allsections[nsec]->name
@@ -5786,6 +6339,22 @@ cannot create hash table section for output file: %s"),
/* Remember the address. */
ld_state.allsections[nsec]->addr = addr;
+
+ /* Handle TLS sections. */
+ if (unlikely (shdr->sh_flags & SHF_TLS))
+ {
+ if (tls_start > addr)
+ {
+ tls_start = addr;
+ tls_offset = shdr->sh_offset;
+ }
+ if (tls_end < addr + shdr->sh_size)
+ tls_end = addr + shdr->sh_size;
+ if (shdr->sh_type != SHT_NOBITS)
+ tls_filesize += shdr->sh_size;
+ if (shdr->sh_addralign > tls_align)
+ tls_align = shdr->sh_addralign;
+ }
}
if (first_section)
@@ -5808,12 +6377,19 @@ cannot create hash table section for output file: %s"),
first_section = false;
}
- memsize = shdr->sh_offset - segment->offset + shdr->sh_size;
- if (nobits_size != 0 && shdr->sh_type != SHT_NOTE)
- error (EXIT_FAILURE, 0, gettext ("\
-internal error: nobits section follows nobits section"));
- if (shdr->sh_type == SHT_NOBITS)
- nobits_size += shdr->sh_size;
+ /* NOBITS TLS sections are not laid out in address space
+ along with the other sections. */
+ if (shdr->sh_type != SHT_NOBITS
+ || (shdr->sh_flags & SHF_TLS) == 0)
+ {
+ memsize = (shdr->sh_offset - segment->offset
+ + shdr->sh_size);
+ if (nobits_size != 0 && shdr->sh_type != SHT_NOTE)
+ error (EXIT_FAILURE, 0, gettext ("\
+internal error: non-nobits section follows nobits section"));
+ if (shdr->sh_type == SHT_NOBITS)
+ nobits_size += shdr->sh_size;
+ }
/* Determine the new address which is computed using
the difference of the offsets on the sections. Note
@@ -5821,7 +6397,7 @@ internal error: nobits section follows nobits section"));
other in the section header table are also
consecutive in the file. This is true here because
libelf constructs files this way. */
- oldoff = shdr->sh_offset;
+ XElf_Off oldoff = shdr->sh_offset;
if (++nsec >= ld_state.nallsections)
break;
@@ -5896,6 +6472,25 @@ internal error: nobits section follows nobits section"));
xelf_getehdr (ld_state.outelf, ehdr);
assert (ehdr != NULL);
+ /* Add the TLS information. */
+ if (ld_state.need_tls)
+ {
+ xelf_getphdr_ptr (ld_state.outelf, nphdr, phdr);
+ phdr->p_type = PT_TLS;
+ phdr->p_offset = tls_offset;
+ phdr->p_vaddr = tls_start;
+ phdr->p_paddr = tls_start;
+ phdr->p_filesz = tls_filesize;
+ phdr->p_memsz = tls_end - tls_start;
+ phdr->p_flags = PF_R;
+ phdr->p_align = tls_align;
+ ld_state.tls_tcb = tls_end;
+ ld_state.tls_start = tls_start;
+
+ (void) xelf_update_phdr (ld_state.outelf, nphdr, phdr);
+ ++nphdr;
+ }
+
/* Add the stack information. */
xelf_getphdr_ptr (ld_state.outelf, nphdr, phdr);
phdr->p_type = PT_GNU_STACK;
@@ -5904,8 +6499,9 @@ internal error: nobits section follows nobits section"));
phdr->p_paddr = 0;
phdr->p_filesz = 0;
phdr->p_memsz = 0;
- phdr->p_flags = ld_state.execstack == execstack_true ? PF_X : 0;
- phdr->p_align = 0;
+ phdr->p_flags = (PF_R | PF_W
+ | (ld_state.execstack == execstack_true ? PF_X : 0));
+ phdr->p_align = xelf_fsize (ld_state.outelf, ELF_T_ADDR, 1);
(void) xelf_update_phdr (ld_state.outelf, nphdr, phdr);
++nphdr;
@@ -5958,7 +6554,6 @@ internal error: nobits section follows nobits section"));
}
}
-
/* Now is a good time to determine the values of all the symbols
we encountered. */
// XXX This loop is very inefficient. The hash tab iterator also
@@ -6169,8 +6764,9 @@ internal error: nobits section follows nobits section"));
/* Add the entries related to the .plt. */
if (ld_state.nplt > 0)
{
- xelf_getshdr (elf_getscn (ld_state.outelf, ld_state.gotscnidx),
- shdr);
+ // XXX Make this work if there is no PLT
+ xelf_getshdr (elf_getscn (ld_state.outelf,
+ ld_state.gotpltscnidx), shdr);
assert (shdr != NULL);
new_dynamic_entry (dyndata, ld_state.ndynamic_filled++,
// XXX This should probably be machine
@@ -6350,8 +6946,18 @@ internal error: nobits section follows nobits section"));
free (ld_state.dblindirect);
- /* Finalize the .plt section the what belongs to them. */
- FINALIZE_PLT (statep, nsym, nsym_dyn);
+ /* Finalize the .plt section and what else belongs to it. */
+ FINALIZE_PLT (statep, nsym, nsym_local, ndxtosym);
+
+
+ /* Finally, if we have to compute the build ID. */
+ if (ld_state.build_id != NULL)
+ compute_build_id ();
+
+
+ /* We don't need the map from the symbol table index to the symbol
+ structure anymore. */
+ free (ndxtosym);
return 0;
}
@@ -6483,7 +7089,19 @@ ld_generic_initialize_got (struct ld_state *statep, Elf_Scn *scn)
static void
-ld_generic_finalize_plt (struct ld_state *statep, size_t nsym, size_t nsym_dyn)
+ld_generic_initialize_gotplt (struct ld_state *statep, Elf_Scn *scn)
+{
+ /* This cannot be implemented generally. There should have been a
+ machine dependent implementation and we should never have arrived
+ here. */
+ error (EXIT_FAILURE, 0, gettext ("no machine specific '%s' implementation"),
+ "initialize_gotplt");
+}
+
+
+static void
+ld_generic_finalize_plt (struct ld_state *statep, size_t nsym, size_t nsym_dyn,
+ struct symbol **ndxtosymp)
{
/* By default we assume that nothing has to be done. */
}
diff --git a/src/ldlex.l b/src/ldlex.l
index 17d5be78..eb15c7be 100644
--- a/src/ldlex.l
+++ b/src/ldlex.l
@@ -1,5 +1,5 @@
%{
-/* Copyright (C) 2001, 2002, 2003, 2004, 2005 Red Hat, Inc.
+/* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -79,7 +79,7 @@ static int handle_ifdef (void);
static void invalid_char (int ch);
%}
-ID [a-zA-Z0-9_.*?]+
+ID [a-zA-Z0-9_.*?][a-zA-Z0-9_.*?-]*
FILENAMECHAR1 [a-zA-Z0-9_/.\\~]
FILENAMECHAR [^][{}[:space:]():;]+
HEX 0[xX][0-9a-fA-F]+[kKmM]?
diff --git a/src/ldscript.y b/src/ldscript.y
index 252f9d4b..85174c7a 100644
--- a/src/ldscript.y
+++ b/src/ldscript.y
@@ -1,6 +1,6 @@
%{
/* Parser for linker scripts.
- Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc.
+ Copyright (C) 2001-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -743,9 +743,9 @@ add_id_list (const char *versionname, struct id_list *runp, _Bool local)
if (defp != NULL && defp->u.s.local != local)
error (EXIT_FAILURE, 0, versionname[0] == '\0'
? gettext ("\
-symbol '%s' in declared both local and global for unnamed version")
+symbol '%s' is declared both local and global for unnamed version")
: gettext ("\
-symbol '%s' in declared both local and global for version '%s'"),
+symbol '%s' is declared both local and global for version '%s'"),
runp->id, versionname);
}
else
diff --git a/src/nm.c b/src/nm.c
index 48f08aca..01519a5a 100644
--- 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, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2000-2008, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2000.
@@ -58,10 +58,10 @@
/* Name and version of program. */
static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
+ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
/* Bug report address. */
-const char *argp_program_bug_address = PACKAGE_BUGREPORT;
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
/* Values for the parameters which have no short form. */
@@ -254,7 +254,7 @@ print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
Copyright (C) %s Red Hat, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2009");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
@@ -703,6 +703,18 @@ get_local_names (Dwarf *dbg)
}
}
+/* Do elf_strptr, but return a backup string and never NULL. */
+static const char *
+sym_name (Elf *elf, GElf_Word strndx, GElf_Word st_name, char buf[], size_t n)
+{
+ const char *symstr = elf_strptr (elf, strndx, st_name);
+ if (symstr == NULL)
+ {
+ snprintf (buf, n, "[invalid st_name %#" PRIx32 "]", st_name);
+ symstr = buf;
+ }
+ return symstr;
+}
/* Show symbols in SysV format. */
static void
@@ -712,7 +724,7 @@ show_symbols_sysv (Ebl *ebl, GElf_Word strndx,
int longest_where)
{
size_t shnum;
- if (elf_getshnum (ebl->elf, &shnum) < 0)
+ if (elf_getshdrnum (ebl->elf, &shnum) < 0)
INTERNAL_ERROR (fullname);
bool scnnames_malloced = shnum * sizeof (const char *) > 128 * 1024;
@@ -723,7 +735,7 @@ show_symbols_sysv (Ebl *ebl, GElf_Word strndx,
scnnames = (const char **) alloca (sizeof (const char *) * shnum);
/* Get the section header string table index. */
size_t shstrndx;
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0)
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -736,9 +748,15 @@ show_symbols_sysv (Ebl *ebl, GElf_Word strndx,
assert (elf_ndxscn (scn) == cnt++);
- scnnames[elf_ndxscn (scn)]
- = elf_strptr (ebl->elf, shstrndx,
- gelf_getshdr (scn, &shdr_mem)->sh_name);
+ 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 "]",
+ gelf_getshdr (scn, &shdr_mem)->sh_name);
+ }
+ scnnames[elf_ndxscn (scn)] = name;
}
int digits = length_map[gelf_getclass (ebl->elf) - 1][radix];
@@ -772,8 +790,10 @@ show_symbols_sysv (Ebl *ebl, GElf_Word strndx,
/* Iterate over all symbols. */
for (cnt = 0; cnt < nsyms; ++cnt)
{
- const char *symstr = elf_strptr (ebl->elf, strndx,
- syms[cnt].sym.st_name);
+ char symstrbuf[50];
+ const char *symstr = sym_name (ebl->elf, strndx, syms[cnt].sym.st_name,
+ symstrbuf, sizeof symstrbuf);
+
char symbindbuf[50];
char symtypebuf[50];
char secnamebuf[1024];
@@ -850,7 +870,9 @@ show_symbols_bsd (Elf *elf, GElf_Word strndx,
/* Iterate over all symbols. */
for (size_t cnt = 0; cnt < nsyms; ++cnt)
{
- const char *symstr = elf_strptr (elf, strndx, syms[cnt].sym.st_name);
+ char symstrbuf[50];
+ const char *symstr = sym_name (elf, strndx, syms[cnt].sym.st_name,
+ symstrbuf, sizeof symstrbuf);
/* Printing entries with a zero-length name makes the output
not very well parseable. Since these entries don't carry
@@ -872,7 +894,7 @@ show_symbols_bsd (Elf *elf, GElf_Word strndx,
? (GELF_ST_BIND (syms[cnt].sym.st_info) == STB_WEAK
? "*" : " ")
: "",
- elf_strptr (elf, strndx, syms[cnt].sym.st_name));
+ symstr);
else
printf (print_size ? sfmtstrs[radix] : fmtstrs[radix],
digits, syms[cnt].sym.st_value,
@@ -881,7 +903,7 @@ show_symbols_bsd (Elf *elf, GElf_Word strndx,
? (GELF_ST_BIND (syms[cnt].sym.st_info) == STB_WEAK
? "*" : " ")
: "",
- elf_strptr (elf, strndx, syms[cnt].sym.st_name),
+ symstr,
digits, (uint64_t) syms[cnt].sym.st_size);
}
}
@@ -907,7 +929,9 @@ show_symbols_posix (Elf *elf, GElf_Word strndx, const char *prefix,
/* Iterate over all symbols. */
for (size_t cnt = 0; cnt < nsyms; ++cnt)
{
- const char *symstr = elf_strptr (elf, strndx, syms[cnt].sym.st_name);
+ char symstrbuf[50];
+ const char *symstr = sym_name (elf, strndx, syms[cnt].sym.st_name,
+ symstrbuf, sizeof symstrbuf);
/* Printing entries with a zero-length name makes the output
not very well parseable. Since these entries don't carry
@@ -973,7 +997,7 @@ show_symbols (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, Elf_Scn *xndxscn,
{
/* Get the section header string table index. */
size_t shstrndx;
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0)
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -1056,6 +1080,8 @@ show_symbols (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, Elf_Scn *xndxscn,
{
const char *symstr = elf_strptr (ebl->elf, shdr->sh_link,
sym->st_name);
+ if (symstr == NULL)
+ continue;
longest_name = MAX ((size_t) longest_name, strlen (symstr));
@@ -1294,3 +1320,6 @@ handle_elf (Elf *elf, const char *prefix, const char *fname,
return result;
}
+
+
+#include "debugpred.h"
diff --git a/src/objdump.c b/src/objdump.c
index 13a36c62..1234c794 100644
--- a/src/objdump.c
+++ b/src/objdump.c
@@ -1,5 +1,5 @@
/* Print information from ELF file in human-readable form.
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005, 2006, 2007, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2005.
@@ -49,10 +49,10 @@
/* Name and version of program. */
static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
+ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
/* Bug report address. */
-const char *argp_program_bug_address = PACKAGE_BUGREPORT;
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
/* Definitions of arguments for argp functions. */
@@ -182,7 +182,7 @@ print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
Copyright (C) %s Red Hat, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "20089");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
@@ -234,9 +234,9 @@ parse_opt (int key, char *arg,
if (! any_control_option)
{
fputs (gettext ("No operation specified.\n"), stderr);
- argp_help (&argp, stderr, ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR,
+ argp_help (&argp, stderr, ARGP_HELP_SEE,
program_invocation_short_name);
- exit (1);
+ exit (EXIT_FAILURE);
}
default:
@@ -358,11 +358,66 @@ handle_ar (int fd, Elf *elf, const char *prefix, const char *fname,
static void
+show_relocs_x (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *symdata,
+ Elf_Data *xndxdata, size_t symstrndx, size_t shstrndx,
+ GElf_Addr r_offset, GElf_Xword r_info, GElf_Sxword r_addend)
+{
+ int elfclass = gelf_getclass (ebl->elf);
+ char buf[128];
+
+ printf ("%0*" PRIx64 " %-20s ",
+ elfclass == ELFCLASS32 ? 8 : 16, r_offset,
+ ebl_reloc_type_name (ebl, GELF_R_TYPE (r_info), buf, sizeof (buf)));
+
+ Elf32_Word xndx;
+ GElf_Sym symmem;
+ GElf_Sym *sym = gelf_getsymshndx (symdata, xndxdata, GELF_R_SYM (r_info),
+ &symmem, &xndx);
+
+ if (sym == NULL)
+ printf ("<%s %ld>",
+ gettext ("INVALID SYMBOL"), (long int) GELF_R_SYM (r_info));
+ else if (GELF_ST_TYPE (sym->st_info) != STT_SECTION)
+ printf ("%s",
+ elf_strptr (ebl->elf, symstrndx, sym->st_name));
+ else
+ {
+ GElf_Shdr destshdr_mem;
+ GElf_Shdr *destshdr;
+ destshdr = gelf_getshdr (elf_getscn (ebl->elf,
+ sym->st_shndx == SHN_XINDEX
+ ? xndx : sym->st_shndx),
+ &destshdr_mem);
+
+ if (shdr == NULL)
+ printf ("<%s %ld>",
+ gettext ("INVALID SECTION"),
+ (long int) (sym->st_shndx == SHN_XINDEX
+ ? xndx : sym->st_shndx));
+ else
+ printf ("%s",
+ elf_strptr (ebl->elf, shstrndx, destshdr->sh_name));
+ }
+
+ if (r_addend != 0)
+ {
+ char sign = '+';
+ if (r_addend < 0)
+ {
+ sign = '-';
+ r_addend = -r_addend;
+ }
+ printf ("%c%#" PRIx64, sign, r_addend);
+ }
+ putchar ('\n');
+}
+
+
+static void
show_relocs_rel (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *data,
Elf_Data *symdata, Elf_Data *xndxdata, size_t symstrndx,
size_t shstrndx)
{
- int elfclass = gelf_getclass (ebl->elf);
int nentries = shdr->sh_size / shdr->sh_entsize;
for (int cnt = 0; cnt < nentries; ++cnt)
@@ -372,60 +427,8 @@ show_relocs_rel (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *data,
rel = gelf_getrel (data, cnt, &relmem);
if (rel != NULL)
- {
- char buf[128];
- GElf_Sym symmem;
- GElf_Sym *sym;
- Elf32_Word xndx;
-
- sym = gelf_getsymshndx (symdata, xndxdata, GELF_R_SYM (rel->r_info),
- &symmem, &xndx);
- if (sym == NULL)
- printf ("%0*" PRIx64 " %-20s <%s %ld>\n",
- elfclass == ELFCLASS32 ? 8 : 16, rel->r_offset,
- ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
- ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
- buf, sizeof (buf))
- : gettext ("<INVALID RELOC>"),
- gettext ("INVALID SYMBOL"),
- (long int) GELF_R_SYM (rel->r_info));
- else if (GELF_ST_TYPE (sym->st_info) != STT_SECTION)
- printf ("%0*" PRIx64 " %-20s %s\n",
- elfclass == ELFCLASS32 ? 8 : 16, rel->r_offset,
- ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
- ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
- buf, sizeof (buf))
- : gettext ("<INVALID RELOC>"),
- elf_strptr (ebl->elf, symstrndx, sym->st_name));
- else
- {
- GElf_Shdr destshdr_mem;
- GElf_Shdr *destshdr;
- destshdr = gelf_getshdr (elf_getscn (ebl->elf,
- sym->st_shndx == SHN_XINDEX
- ? xndx : sym->st_shndx),
- &destshdr_mem);
-
- if (shdr == NULL)
- printf ("%0*" PRIx64 " %-20s <%s %ld>\n",
- elfclass == ELFCLASS32 ? 8 : 16, rel->r_offset,
- ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
- ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
- buf, sizeof (buf))
- : gettext ("<INVALID RELOC>"),
- gettext ("INVALID SECTION"),
- (long int) (sym->st_shndx == SHN_XINDEX
- ? xndx : sym->st_shndx));
- else
- printf ("%0*" PRIx64 " %-20s %s\n",
- elfclass == ELFCLASS32 ? 8 : 16, rel->r_offset,
- ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
- ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
- buf, sizeof (buf))
- : gettext ("<INVALID RELOC>"),
- elf_strptr (ebl->elf, shstrndx, destshdr->sh_name));
- }
- }
+ show_relocs_x (ebl, shdr, symdata, xndxdata, symstrndx, shstrndx,
+ rel->r_offset, rel->r_info, 0);
}
}
@@ -435,7 +438,6 @@ show_relocs_rela (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *data,
Elf_Data *symdata, Elf_Data *xndxdata, size_t symstrndx,
size_t shstrndx)
{
- int elfclass = gelf_getclass (ebl->elf);
int nentries = shdr->sh_size / shdr->sh_entsize;
for (int cnt = 0; cnt < nentries; ++cnt)
@@ -445,64 +447,8 @@ show_relocs_rela (Ebl *ebl, GElf_Shdr *shdr, Elf_Data *data,
rel = gelf_getrela (data, cnt, &relmem);
if (rel != NULL)
- {
- char buf[128];
- GElf_Sym symmem;
- GElf_Sym *sym;
- Elf32_Word xndx;
-
- sym = gelf_getsymshndx (symdata, xndxdata, GELF_R_SYM (rel->r_info),
- &symmem, &xndx);
- if (sym == NULL)
- printf ("%0*" PRIx64 " %-20s <%s %ld>",
- elfclass == ELFCLASS32 ? 8 : 16, rel->r_offset,
- ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
- ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
- buf, sizeof (buf))
- : gettext ("<INVALID RELOC>"),
- gettext ("INVALID SYMBOL"),
- (long int) GELF_R_SYM (rel->r_info));
- else if (GELF_ST_TYPE (sym->st_info) != STT_SECTION)
- printf ("%0*" PRIx64 " %-20s %s",
- elfclass == ELFCLASS32 ? 8 : 16, rel->r_offset,
- ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
- ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
- buf, sizeof (buf))
- : gettext ("<INVALID RELOC>"),
- elf_strptr (ebl->elf, symstrndx, sym->st_name));
- else
- {
- GElf_Shdr destshdr_mem;
- GElf_Shdr *destshdr;
- destshdr = gelf_getshdr (elf_getscn (ebl->elf,
- sym->st_shndx == SHN_XINDEX
- ? xndx : sym->st_shndx),
- &destshdr_mem);
-
- if (shdr == NULL)
- printf ("%0*" PRIx64 " %-20s <%s %ld>",
- elfclass == ELFCLASS32 ? 8 : 16, rel->r_offset,
- ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
- ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
- buf, sizeof (buf))
- : gettext ("<INVALID RELOC>"),
- gettext ("INVALID SECTION"),
- (long int) (sym->st_shndx == SHN_XINDEX
- ? xndx : sym->st_shndx));
- else
- printf ("%0*" PRIx64 " %-20s %s",
- elfclass == ELFCLASS32 ? 8 : 16, rel->r_offset,
- ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
- ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
- buf, sizeof (buf))
- : gettext ("<INVALID RELOC>"),
- elf_strptr (ebl->elf, shstrndx, destshdr->sh_name));
- }
-
- if (rel->r_addend != 0)
- printf ("+%#" PRIx64, rel->r_addend);
- putchar ('\n');
- }
+ show_relocs_x (ebl, shdr, symdata, xndxdata, symstrndx, shstrndx,
+ rel->r_offset, rel->r_info, rel->r_addend);
}
}
@@ -561,7 +507,7 @@ show_relocs (Ebl *ebl, const char *fname, uint32_t shstrndx)
shdr->sh_info),
&destshdr_mem);
- printf (gettext ("RELOCATION RECORDS FOR [%s]:\n"
+ printf (gettext ("\nRELOCATION RECORDS FOR [%s]:\n"
"%-*s TYPE VALUE\n"),
elf_strptr (ebl->elf, shstrndx, destshdr->sh_name),
elfclass == ELFCLASS32 ? 8 : 16, gettext ("OFFSET"));
@@ -601,11 +547,11 @@ show_relocs (Ebl *ebl, const char *fname, uint32_t shstrndx)
else
show_relocs_rela (ebl, shdr, data, symdata, xndxdata,
symshdr->sh_link, shstrndx);
+
+ putchar ('\n');
}
}
- fputs_unlocked ("\n\n", stdout);
-
return 0;
}
@@ -681,12 +627,87 @@ show_full_content (Ebl *ebl, const char *fname, uint32_t shstrndx)
}
+struct disasm_info
+{
+ GElf_Addr addr;
+ const uint8_t *cur;
+ const uint8_t *last_end;
+};
+
+
+// XXX This is not the preferred output for all architectures. Needs
+// XXX customization, too.
static int
-show_disasm (Ebl *ebl __attribute__ ((unused)),
- const char *fname __attribute__ ((unused)),
- uint32_t shstrndx __attribute__ ((unused)))
+disasm_output (char *buf, size_t buflen, void *arg)
{
- /// XXX For now nothing.
+ struct disasm_info *info = (struct disasm_info *) arg;
+
+ printf ("%8" PRIx64 ": ", (uint64_t) info->addr);
+ size_t cnt;
+ for (cnt = 0; cnt < (size_t) MIN (info->cur - info->last_end, 8); ++cnt)
+ printf (" %02" PRIx8, info->last_end[cnt]);
+ printf ("%*s %.*s\n",
+ (int) (8 - cnt) * 3 + 1, "", (int) buflen, buf);
+
+ info->addr += cnt;
+
+ /* We limit the number of bytes printed before the mnemonic to 8.
+ Print the rest on a separate, following line. */
+ if (info->cur - info->last_end > 8)
+ {
+ printf ("%8" PRIx64 ": ", (uint64_t) info->addr);
+ for (; cnt < (size_t) (info->cur - info->last_end); ++cnt)
+ printf (" %02" PRIx8, info->last_end[cnt]);
+ putchar_unlocked ('\n');
+ info->addr += info->cur - info->last_end - 8;
+ }
+
+ info->last_end = info->cur;
+
+ return 0;
+}
+
+
+static int
+show_disasm (Ebl *ebl, const char *fname, uint32_t shstrndx)
+{
+ DisasmCtx_t *ctx = disasm_begin (ebl, ebl->elf, NULL /* XXX TODO */);
+ if (ctx == NULL)
+ error (EXIT_FAILURE, 0, gettext ("cannot disassemble"));
+
+ Elf_Scn *scn = NULL;
+ while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
+ {
+ GElf_Shdr shdr_mem;
+ GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+
+ if (shdr == NULL)
+ INTERNAL_ERROR (fname);
+
+ if (shdr->sh_type == SHT_PROGBITS && shdr->sh_size > 0
+ && (shdr->sh_flags & SHF_EXECINSTR) != 0)
+ {
+ if (! section_match (ebl->elf, elf_ndxscn (scn), shdr, shstrndx))
+ continue;
+
+ Elf_Data *data = elf_getdata (scn, NULL);
+ if (data == NULL)
+ continue;
+
+ printf ("Disassembly of section %s:\n\n",
+ elf_strptr (ebl->elf, shstrndx, shdr->sh_name));
+
+ struct disasm_info info;
+ info.addr = shdr->sh_addr;
+ info.last_end = info.cur = data->d_buf;
+
+ disasm_cb (ctx, &info.cur, info.cur + data->d_size, info.addr,
+ "%7m %.1o,%.2o,%.3o%34a %l", disasm_output, &info,
+ NULL /* XXX */);
+ }
+ }
+
+ (void) disasm_end (ctx);
return 0;
}
@@ -700,7 +721,7 @@ handle_elf (Elf *elf, const char *prefix, const char *fname,
/* Get the backend for this object file type. */
Ebl *ebl = ebl_openbackend (elf);
- printf (gettext ("%s: elf%d-%s\n\n"),
+ printf ("%s: elf%d-%s\n\n",
fname, gelf_getclass (elf) == ELFCLASS32 ? 32 : 64,
ebl_backend_name (ebl));
@@ -718,7 +739,7 @@ handle_elf (Elf *elf, const char *prefix, const char *fname,
/* Get the section header string table index. */
size_t shstrndx;
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0)
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -735,3 +756,6 @@ handle_elf (Elf *elf, const char *prefix, const char *fname,
return result;
}
+
+
+#include "debugpred.h"
diff --git a/src/ranlib.c b/src/ranlib.c
index fa01daf5..e92dc89b 100644
--- a/src/ranlib.c
+++ b/src/ranlib.c
@@ -1,5 +1,5 @@
/* Generate an index to speed access to archives.
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005, 2006, 2007, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2005.
@@ -58,10 +58,10 @@ static int handle_file (const char *fname);
/* Name and version of program. */
static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
+ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
/* Bug report address. */
-const char *argp_program_bug_address = PACKAGE_BUGREPORT;
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
/* Definitions of arguments for argp functions. */
@@ -137,7 +137,7 @@ print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
Copyright (C) %s Red Hat, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2009");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
@@ -304,3 +304,6 @@ handle_file (const char *fname)
return status;
}
+
+
+#include "debugpred.h"
diff --git a/src/readelf.c b/src/readelf.c
index 2197d840..243337a3 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -1,5 +1,5 @@
/* Print information from ELF file in human-readable form.
- Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007 Red Hat, Inc.
+ Copyright (C) 1999-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 1999.
@@ -49,9 +49,11 @@
#include <time.h>
#include <unistd.h>
#include <sys/param.h>
+#include <sys/stat.h>
#include <system.h>
#include "../libelf/libelfP.h"
+#include "../libelf/common.h"
#include "../libebl/libeblP.h"
#include "../libdw/libdwP.h"
#include "../libdwfl/libdwflP.h"
@@ -60,16 +62,17 @@
/* Name and version of program. */
static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
+ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
/* Bug report address. */
-const char *argp_program_bug_address = PACKAGE_BUGREPORT;
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
/* Definitions of arguments for argp functions. */
static const struct argp_option options[] =
{
- { NULL, 0, NULL, 0, N_("Output selection:"), 0 },
- { "all", 'a', NULL, 0, N_("Equivalent to: -h -l"), 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 },
{ "dynamic", 'd', NULL, 0, N_("Display the dynamic segment"), 0 },
{ "file-header", 'h', NULL, 0, N_("Display the ELF file header"), 0 },
{ "histogram", 'I', NULL, 0,
@@ -77,17 +80,21 @@ static const struct argp_option options[] =
{ "program-headers", 'l', NULL, 0, N_("Display the program headers"), 0 },
{ "segments", 'l', NULL, OPTION_ALIAS | OPTION_HIDDEN, NULL, 0 },
{ "relocs", 'r', NULL, 0, N_("Display relocations"), 0 },
- { "section-headers", 'S', NULL, 0, N_("Display the sections' header"), 0 },
+ { "section-headers", 'S', NULL, 0, N_("Display the sections' headers"), 0 },
{ "sections", 'S', NULL, OPTION_ALIAS | OPTION_HIDDEN, NULL, 0 },
{ "symbols", 's', NULL, 0, N_("Display the symbol table"), 0 },
{ "version-info", 'V', NULL, 0, N_("Display versioning information"), 0 },
+ { "notes", 'n', NULL, 0, N_("Display the ELF notes"), 0 },
+ { "arch-specific", 'A', NULL, 0,
+ N_("Display architecture specific information, if any"), 0 },
+ { "exception", 'e', NULL, 0,
+ N_("Display sections for exception handling"), 0 },
+
+ { 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, info, loc, line, ranges, pubnames, str, or macinfo."),
- 0 },
- { "notes", 'n', NULL, 0, N_("Display the core notes"), 0 },
- { "arch-specific", 'A', NULL, 0,
- N_("Display architecture specific information (if any)"), 0 },
+ "aranges, frame, info, loc, line, ranges, pubnames, str, macinfo, "
+ "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,
@@ -97,6 +104,8 @@ static const struct argp_option options[] =
N_("Display the symbol index of an archive"), 0 },
{ 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 },
{ NULL, 0, NULL, 0, NULL, 0 }
};
@@ -162,24 +171,28 @@ static bool print_archive_index;
/* True if any of the control options except print_archive_index is set. */
static bool any_control_option;
+/* True if we should print addresses from DWARF in symbolic form. */
+static bool print_address_names = true;
+
/* Select printing of debugging sections. */
static enum section_e
{
- section_abbrev = 1, /* .debug_abbrev */
- section_aranges = 2, /* .debug_aranges */
- section_frame = 4, /* .debug_frame or .eh_frame */
- section_info = 8, /* .debug_info */
- section_line = 16, /* .debug_line */
- section_loc = 32, /* .debug_loc */
- section_pubnames = 64,/* .debug_pubnames */
- section_str = 128, /* .debug_str */
- section_macinfo = 256,/* .debug_macinfo */
- section_ranges = 512, /* .debug_ranges */
+ section_abbrev = 1, /* .debug_abbrev */
+ section_aranges = 2, /* .debug_aranges */
+ section_frame = 4, /* .debug_frame or .eh_frame & al. */
+ section_info = 8, /* .debug_info */
+ section_line = 16, /* .debug_line */
+ section_loc = 32, /* .debug_loc */
+ section_pubnames = 64, /* .debug_pubnames */
+ section_str = 128, /* .debug_str */
+ section_macinfo = 256, /* .debug_macinfo */
+ section_ranges = 512, /* .debug_ranges */
+ section_exception = 1024, /* .eh_frame & al. */
section_all = (section_abbrev | section_aranges | section_frame
| section_info | section_line | section_loc
| section_pubnames | section_str | section_macinfo
- | section_ranges)
-} print_debug_sections;
+ | section_ranges | section_exception)
+} print_debug_sections, implicit_debug_sections;
/* Select hex dumping of sections. */
static struct section_argument *dump_data_sections;
@@ -193,10 +206,12 @@ struct section_argument
{
struct section_argument *next;
const char *arg;
+ bool implicit;
};
-/* Number of sections in the file. */
+/* Numbers of sections and program headers in the file. */
static size_t shnum;
+static size_t phnum;
/* Declarations of local functions. */
@@ -206,10 +221,12 @@ static void print_ehdr (Ebl *ebl, GElf_Ehdr *ehdr);
static void print_shdr (Ebl *ebl, GElf_Ehdr *ehdr);
static void print_phdr (Ebl *ebl, GElf_Ehdr *ehdr);
static void print_scngrp (Ebl *ebl);
-static void print_dynamic (Ebl *ebl, GElf_Ehdr *ehdr);
-static void print_relocs (Ebl *ebl);
-static void handle_relocs_rel (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr);
-static void handle_relocs_rela (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr);
+static void print_dynamic (Ebl *ebl);
+static void print_relocs (Ebl *ebl, GElf_Ehdr *ehdr);
+static void handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn,
+ GElf_Shdr *shdr);
+static void handle_relocs_rela (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn,
+ GElf_Shdr *shdr);
static void print_symtab (Ebl *ebl, int type);
static void handle_symtab (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr);
static void print_verinfo (Ebl *ebl);
@@ -221,6 +238,7 @@ static void print_debug (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr);
static void handle_hash (Ebl *ebl);
static void handle_notes (Ebl *ebl, GElf_Ehdr *ehdr);
static void print_liblist (Ebl *ebl);
+static void print_attributes (Ebl *ebl, const GElf_Ehdr *ehdr);
static void dump_data (Ebl *ebl);
static void dump_strings (Ebl *ebl);
static void print_strings (Ebl *ebl);
@@ -270,6 +288,18 @@ static error_t
parse_opt (int key, char *arg,
struct argp_state *state __attribute__ ((unused)))
{
+ void add_dump_section (const char *name, bool implicit)
+ {
+ struct section_argument *a = xmalloc (sizeof *a);
+ a->arg = name;
+ a->next = NULL;
+ a->implicit = implicit;
+ struct section_argument ***tailp
+ = key == 'x' ? &dump_data_sections_tail : &string_sections_tail;
+ **tailp = a;
+ *tailp = &a->next;
+ }
+
switch (key)
{
case 'a':
@@ -284,6 +314,10 @@ parse_opt (int key, char *arg,
print_histogram = true;
print_arch = true;
print_notes = true;
+ implicit_debug_sections |= section_exception;
+ add_dump_section (".strtab", true);
+ add_dump_section (".dynstr", true);
+ add_dump_section (".comment", true);
any_control_option = true;
break;
case 'A':
@@ -294,6 +328,10 @@ parse_opt (int key, char *arg,
print_dynamic_table = true;
any_control_option = true;
break;
+ case 'e':
+ print_debug_sections |= section_exception;
+ any_control_option = true;
+ break;
case 'g':
print_section_groups = true;
any_control_option = true;
@@ -342,7 +380,7 @@ parse_opt (int key, char *arg,
print_debug_sections |= section_aranges;
else if (strcmp (arg, "ranges") == 0)
print_debug_sections |= section_ranges;
- else if (strcmp (arg, "frame") == 0)
+ else if (strcmp (arg, "frame") == 0 || strcmp (arg, "frames") == 0)
print_debug_sections |= section_frame;
else if (strcmp (arg, "info") == 0)
print_debug_sections |= section_info;
@@ -356,6 +394,8 @@ parse_opt (int key, char *arg,
print_debug_sections |= section_str;
else if (strcmp (arg, "macinfo") == 0)
print_debug_sections |= section_macinfo;
+ else if (strcmp (arg, "exception") == 0)
+ print_debug_sections |= section_exception;
else
{
fprintf (stderr, gettext ("Unknown DWARF debug section `%s'.\n"),
@@ -375,17 +415,12 @@ parse_opt (int key, char *arg,
}
/* Fall through. */
case 'x':
- {
- struct section_argument *a = xmalloc (sizeof *a);
- a->arg = arg;
- a->next = NULL;
- struct section_argument ***tailp
- = key == 'x' ? &dump_data_sections_tail : &string_sections_tail;
- **tailp = a;
- *tailp = &a->next;
- }
+ add_dump_section (arg, false);
any_control_option = true;
break;
+ case 'N':
+ print_address_names = false;
+ break;
case ARGP_KEY_NO_ARGS:
fputs (gettext ("Missing file name.\n"), stderr);
goto do_argp_help;
@@ -394,9 +429,9 @@ parse_opt (int key, char *arg,
{
fputs (gettext ("No operation specified.\n"), stderr);
do_argp_help:
- argp_help (&argp, stderr, ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR,
+ argp_help (&argp, stderr, ARGP_HELP_SEE,
program_invocation_short_name);
- exit (1);
+ exit (EXIT_FAILURE);
}
break;
default:
@@ -415,7 +450,7 @@ print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
Copyright (C) %s Red Hat, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2009");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
@@ -457,8 +492,10 @@ count_dwflmod (Dwfl_Module *dwflmod __attribute__ ((unused)),
Dwarf_Addr base __attribute__ ((unused)),
void *arg)
{
- *(bool *) arg = false;
- return DWARF_CB_ABORT;
+ if (*(bool *) arg)
+ return DWARF_CB_ABORT;
+ *(bool *) arg = true;
+ return DWARF_CB_OK;
}
struct process_dwflmod_args
@@ -533,21 +570,25 @@ process_file (int fd, const char *fname, bool only_one)
if (dwfl_report_offline (dwfl, fname, fname, dwfl_fd) == NULL)
{
struct stat64 st;
- if (fstat64 (fd, &st) != 0)
+ if (fstat64 (dwfl_fd, &st) != 0)
error (0, errno, gettext ("cannot stat input file"));
- else if (st.st_size == 0)
+ else if (unlikely (st.st_size == 0))
error (0, 0, gettext ("input file is empty"));
else
error (0, 0, gettext ("failed reading '%s': %s"),
fname, dwfl_errmsg (-1));
+ close (dwfl_fd); /* Consumed on success, not on failure. */
}
else
{
dwfl_report_end (dwfl, NULL, NULL);
if (only_one)
- /* Clear ONLY_ONE if we have multiple modules, from an archive. */
- dwfl_getmodules (dwfl, &count_dwflmod, &only_one, 1);
+ {
+ /* Clear ONLY_ONE if we have multiple modules, from an archive. */
+ bool seen = false;
+ only_one = dwfl_getmodules (dwfl, &count_dwflmod, &seen, 0) == 0;
+ }
/* Process the one or more modules gleaned from this file. */
struct process_dwflmod_args a = { .fd = fd, .only_one = only_one };
@@ -575,7 +616,7 @@ process_elf_file (Dwfl_Module *dwflmod, int fd)
}
Ebl *ebl = ebl_openbackend (elf);
- if (ebl == NULL)
+ if (unlikely (ebl == NULL))
{
ebl_error:
error (0, errno, gettext ("cannot create EBL handle"));
@@ -583,11 +624,17 @@ process_elf_file (Dwfl_Module *dwflmod, int fd)
}
/* Determine the number of sections. */
- if (elf_getshnum (ebl->elf, &shnum) < 0)
+ if (unlikely (elf_getshdrnum (ebl->elf, &shnum) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot determine number of sections: %s"),
elf_errmsg (-1));
+ /* Determine the number of phdrs. */
+ if (unlikely (elf_getphdrnum (ebl->elf, &phnum) < 0))
+ error (EXIT_FAILURE, 0,
+ gettext ("cannot determine number of program headers: %s"),
+ elf_errmsg (-1));
+
/* For an ET_REL file, libdwfl has adjusted the in-core shdrs
and may have applied relocation to some sections.
So we need to get a fresh Elf handle on the file to display those. */
@@ -601,8 +648,8 @@ process_elf_file (Dwfl_Module *dwflmod, int fd)
if (ehdr->e_type == ET_REL && print_unrelocated)
{
/* Read the file afresh. */
- pure_elf = elf_begin (fd, ELF_C_READ_MMAP, NULL);
off64_t aroff = elf_getaroff (elf);
+ pure_elf = elf_begin (fd, ELF_C_READ_MMAP, NULL);
if (aroff > 0)
{
/* Archive member. */
@@ -627,9 +674,9 @@ process_elf_file (Dwfl_Module *dwflmod, int fd)
if (print_section_groups)
print_scngrp (ebl);
if (print_dynamic_table)
- print_dynamic (ebl, ehdr);
+ print_dynamic (ebl);
if (print_relocations)
- print_relocs (pure_ebl);
+ print_relocs (pure_ebl, ehdr);
if (print_histogram)
handle_hash (ebl);
if (print_symbol_table)
@@ -640,11 +687,13 @@ process_elf_file (Dwfl_Module *dwflmod, int fd)
print_symtab (ebl, SHT_SYMTAB);
if (print_arch)
print_liblist (ebl);
+ if (print_arch)
+ print_attributes (ebl, ehdr);
if (dump_data_sections != NULL)
dump_data (pure_ebl);
if (string_sections != NULL)
dump_strings (ebl);
- if (print_debug_sections != 0)
+ if ((print_debug_sections | implicit_debug_sections) != 0)
print_debug (dwflmod, ebl, ehdr);
if (print_notes)
handle_notes (pure_ebl, ehdr);
@@ -665,7 +714,7 @@ process_elf_file (Dwfl_Module *dwflmod, int fd)
static void
print_file_type (unsigned short int e_type)
{
- if (e_type <= ET_CORE)
+ if (likely (e_type <= ET_CORE))
{
static const char *const knowntypes[] =
{
@@ -744,8 +793,19 @@ print_ehdr (Ebl *ebl, GElf_Ehdr *ehdr)
printf (gettext (" Size of program header entries: %" PRId16 " %s\n"),
ehdr->e_phentsize, gettext ("(bytes)"));
- printf (gettext (" Number of program headers entries: %" PRId16 "\n"),
+ printf (gettext (" Number of program headers entries: %" PRId16),
ehdr->e_phnum);
+ if (ehdr->e_phnum == PN_XNUM)
+ {
+ GElf_Shdr shdr_mem;
+ GElf_Shdr *shdr = gelf_getshdr (elf_getscn (ebl->elf, 0), &shdr_mem);
+ if (shdr != NULL)
+ printf (gettext (" (%" PRIu32 " in [0].sh_info)"),
+ (uint32_t) shdr->sh_info);
+ else
+ fputs_unlocked (gettext (" ([0] not available)"), stdout);
+ }
+ fputc_unlocked ('\n', stdout);
printf (gettext (" Size of section header entries: %" PRId16 " %s\n"),
ehdr->e_shentsize, gettext ("(bytes)"));
@@ -764,7 +824,7 @@ print_ehdr (Ebl *ebl, GElf_Ehdr *ehdr)
}
fputc_unlocked ('\n', stdout);
- if (ehdr->e_shstrndx == SHN_XINDEX)
+ if (unlikely (ehdr->e_shstrndx == SHN_XINDEX))
{
GElf_Shdr shdr_mem;
GElf_Shdr *shdr = gelf_getshdr (elf_getscn (ebl->elf, 0), &shdr_mem);
@@ -820,7 +880,7 @@ There are %d section headers, starting at offset %#" PRIx64 ":\n\
ehdr->e_shnum, ehdr->e_shoff);
/* Get the section header string table index. */
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -835,14 +895,14 @@ There are %d section headers, starting at offset %#" PRIx64 ":\n\
{
Elf_Scn *scn = elf_getscn (ebl->elf, cnt);
- if (scn == NULL)
+ if (unlikely (scn == NULL))
error (EXIT_FAILURE, 0, gettext ("cannot get section: %s"),
elf_errmsg (-1));
/* Get the section header. */
GElf_Shdr shdr_mem;
GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
- if (shdr == NULL)
+ if (unlikely (shdr == NULL))
error (EXIT_FAILURE, 0, gettext ("cannot get section header: %s"),
elf_errmsg (-1));
@@ -913,14 +973,14 @@ print_phdr (Ebl *ebl, GElf_Ehdr *ehdr)
bool has_relro = false;
GElf_Addr relro_from = 0;
GElf_Addr relro_to = 0;
- for (size_t cnt = 0; cnt < ehdr->e_phnum; ++cnt)
+ for (size_t cnt = 0; cnt < phnum; ++cnt)
{
char buf[128];
GElf_Phdr mem;
GElf_Phdr *phdr = gelf_getphdr (ebl->elf, cnt, &mem);
/* If for some reason the header cannot be returned show this. */
- if (phdr == NULL)
+ if (unlikely (phdr == NULL))
{
puts (" ???");
continue;
@@ -957,15 +1017,19 @@ print_phdr (Ebl *ebl, GElf_Ehdr *ehdr)
}
}
+ if (ehdr->e_shnum == 0)
+ /* No sections in the file. Punt. */
+ return;
+
/* Get the section header string table index. */
size_t shstrndx;
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
puts (gettext ("\n Section to Segment mapping:\n Segment Sections..."));
- for (size_t cnt = 0; cnt < ehdr->e_phnum; ++cnt)
+ for (size_t cnt = 0; cnt < phnum; ++cnt)
{
/* Print the segment number. */
printf (" %2.2zu ", cnt);
@@ -973,7 +1037,7 @@ print_phdr (Ebl *ebl, GElf_Ehdr *ehdr)
GElf_Phdr phdr_mem;
GElf_Phdr *phdr = gelf_getphdr (ebl->elf, cnt, &phdr_mem);
/* This must not happen. */
- if (phdr == NULL)
+ if (unlikely (phdr == NULL))
error (EXIT_FAILURE, 0, gettext ("cannot get program header: %s"),
elf_errmsg (-1));
@@ -984,14 +1048,14 @@ print_phdr (Ebl *ebl, GElf_Ehdr *ehdr)
{
Elf_Scn *scn = elf_getscn (ebl->elf, inner);
/* This should not happen. */
- if (scn == NULL)
+ if (unlikely (scn == NULL))
error (EXIT_FAILURE, 0, gettext ("cannot get section: %s"),
elf_errmsg (-1));
/* Get the section header. */
GElf_Shdr shdr_mem;
GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
- if (shdr == NULL)
+ if (unlikely (shdr == NULL))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header: %s"),
elf_errmsg (-1));
@@ -1035,7 +1099,7 @@ print_phdr (Ebl *ebl, GElf_Ehdr *ehdr)
/* Determine the segment this section is part of. */
size_t cnt2;
GElf_Phdr *phdr2 = NULL;
- for (cnt2 = 0; cnt2 < ehdr->e_phnum; ++cnt2)
+ for (cnt2 = 0; cnt2 < phnum; ++cnt2)
{
GElf_Phdr phdr2_mem;
phdr2 = gelf_getphdr (ebl->elf, cnt2, &phdr2_mem);
@@ -1047,7 +1111,7 @@ print_phdr (Ebl *ebl, GElf_Ehdr *ehdr)
break;
}
- if (cnt2 < ehdr->e_phnum)
+ if (cnt2 < phnum)
{
if ((phdr2->p_flags & PF_W) == 0 && !in_ro)
{
@@ -1100,7 +1164,7 @@ handle_scngrp (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
/* Get the section header string table index. */
size_t shstrndx;
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -1282,7 +1346,7 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
return;
/* Get the section header string table index. */
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -1398,9 +1462,9 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
/* Print the dynamic segment. */
static void
-print_dynamic (Ebl *ebl, GElf_Ehdr *ehdr)
+print_dynamic (Ebl *ebl)
{
- for (int i = 0; i < ehdr->e_phnum; ++i)
+ for (size_t i = 0; i < phnum; ++i)
{
GElf_Phdr phdr_mem;
GElf_Phdr *phdr = gelf_getphdr (ebl->elf, i, &phdr_mem);
@@ -1420,7 +1484,7 @@ print_dynamic (Ebl *ebl, GElf_Ehdr *ehdr)
/* Print relocations. */
static void
-print_relocs (Ebl *ebl)
+print_relocs (Ebl *ebl, GElf_Ehdr *ehdr)
{
/* Find all relocation sections and handle them. */
Elf_Scn *scn = NULL;
@@ -1431,12 +1495,12 @@ print_relocs (Ebl *ebl)
GElf_Shdr shdr_mem;
GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
- if (shdr != NULL)
+ if (likely (shdr != NULL))
{
if (shdr->sh_type == SHT_REL)
- handle_relocs_rel (ebl, scn, shdr);
+ handle_relocs_rel (ebl, ehdr, scn, shdr);
else if (shdr->sh_type == SHT_RELA)
- handle_relocs_rela (ebl, scn, shdr);
+ handle_relocs_rela (ebl, ehdr, scn, shdr);
}
}
}
@@ -1444,7 +1508,7 @@ print_relocs (Ebl *ebl)
/* Handle a relocation section. */
static void
-handle_relocs_rel (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
+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;
@@ -1465,7 +1529,7 @@ handle_relocs_rel (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
GElf_Shdr *destshdr = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_info),
&destshdr_mem);
- if (symshdr == NULL || symdata == NULL || destshdr == NULL)
+ if (unlikely (symshdr == NULL || symdata == NULL || destshdr == NULL))
{
printf (gettext ("\nInvalid symbol table at offset %#0" PRIx64 "\n"),
shdr->sh_offset);
@@ -1473,34 +1537,24 @@ handle_relocs_rel (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
}
/* Search for the optional extended section index table. */
- Elf_Scn *xndxscn = NULL;
Elf_Data *xndxdata = NULL;
- while ((xndxscn = elf_nextscn (ebl->elf, xndxscn)) != NULL)
- {
- GElf_Shdr xndxshdr_mem;
- GElf_Shdr *xndxshdr = gelf_getshdr (xndxscn, &xndxshdr_mem);
- if (xndxshdr != NULL && xndxshdr->sh_type == SHT_SYMTAB_SHNDX
- && xndxshdr->sh_link == elf_ndxscn (symscn))
- {
- /* Found it. */
- xndxdata = elf_getdata (xndxscn, NULL);
- break;
- }
- }
+ int xndxscnidx = elf_scnshndx (scn);
+ if (unlikely (xndxscnidx > 0))
+ xndxdata = elf_getdata (elf_getscn (ebl->elf, xndxscnidx), NULL);
/* Get the section header string table index. */
size_t shstrndx;
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
if (shdr->sh_info != 0)
printf (ngettext ("\
-\nRelocation section [%2u] '%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 entry:\n",
"\
-\nRelocation section [%2u] '%s' for section [%2u] '%s' at offset %#0" PRIx64 " contains %d entries:\n",
+\nRelocation section [%2zu] '%s' for section [%2u] '%s' at offset %#0" PRIx64 " contains %d entries:\n",
nentries),
- (unsigned int) elf_ndxscn (scn),
+ elf_ndxscn (scn),
elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
(unsigned int) shdr->sh_info,
elf_strptr (ebl->elf, shstrndx, destshdr->sh_name),
@@ -1526,11 +1580,12 @@ handle_relocs_rel (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
Offset Type Value Name\n"),
stdout);
+ int is_statically_linked = 0;
for (int cnt = 0; cnt < nentries; ++cnt)
{
GElf_Rel relmem;
GElf_Rel *rel = gelf_getrel (data, cnt, &relmem);
- if (rel != NULL)
+ if (likely (rel != NULL))
{
char buf[128];
GElf_Sym symmem;
@@ -1538,21 +1593,62 @@ handle_relocs_rel (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
GElf_Sym *sym = gelf_getsymshndx (symdata, xndxdata,
GELF_R_SYM (rel->r_info),
&symmem, &xndx);
- if (sym == NULL)
- printf (" %#0*" PRIx64 " %-20s <%s %ld>\n",
- class == ELFCLASS32 ? 10 : 18, rel->r_offset,
- ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
- /* Avoid the leading R_ which isn't carrying any
- information. */
- ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
- buf, sizeof (buf)) + 2
- : gettext ("<INVALID RELOC>"),
- gettext ("INVALID SYMBOL"),
- (long int) GELF_R_SYM (rel->r_info));
+ if (unlikely (sym == NULL))
+ {
+ /* As a special case we have to handle relocations in static
+ executables. This only happens for IRELATIVE relocations
+ (so far). There is no symbol table. */
+ if (is_statically_linked == 0)
+ {
+ /* Find the program header and look for a PT_INTERP entry. */
+ is_statically_linked = -1;
+ if (ehdr->e_type == ET_EXEC)
+ {
+ is_statically_linked = 1;
+
+ for (size_t inner = 0; inner < phnum; ++inner)
+ {
+ GElf_Phdr phdr_mem;
+ GElf_Phdr *phdr = gelf_getphdr (ebl->elf, inner,
+ &phdr_mem);
+ if (phdr != NULL && phdr->p_type == PT_INTERP)
+ {
+ is_statically_linked = -1;
+ break;
+ }
+ }
+ }
+ }
+
+ if (is_statically_linked > 0 && shdr->sh_link == 0)
+ printf ("\
+ %#0*" PRIx64 " %-20s %*s %s\n",
+ class == ELFCLASS32 ? 10 : 18, rel->r_offset,
+ ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
+ /* Avoid the leading R_ which isn't carrying any
+ information. */
+ ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
+ buf, sizeof (buf)) + 2
+ : gettext ("<INVALID RELOC>"),
+ class == ELFCLASS32 ? 10 : 18, "",
+ elf_strptr (ebl->elf, shstrndx, destshdr->sh_name));
+ else
+ printf (" %#0*" PRIx64 " %-20s <%s %ld>\n",
+ class == ELFCLASS32 ? 10 : 18, rel->r_offset,
+ ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
+ /* Avoid the leading R_ which isn't carrying any
+ information. */
+ ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
+ buf, sizeof (buf)) + 2
+ : gettext ("<INVALID RELOC>"),
+ gettext ("INVALID SYMBOL"),
+ (long int) GELF_R_SYM (rel->r_info));
+ }
else if (GELF_ST_TYPE (sym->st_info) != STT_SECTION)
printf (" %#0*" PRIx64 " %-20s %#0*" PRIx64 " %s\n",
class == ELFCLASS32 ? 10 : 18, rel->r_offset,
- ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
+ likely (ebl_reloc_type_check (ebl,
+ GELF_R_TYPE (rel->r_info)))
/* Avoid the leading R_ which isn't carrying any
information. */
? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
@@ -1567,7 +1663,7 @@ handle_relocs_rel (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
? xndx : sym->st_shndx),
&destshdr_mem);
- if (destshdr == NULL)
+ if (unlikely (destshdr == NULL))
printf (" %#0*" PRIx64 " %-20s <%s %ld>\n",
class == ELFCLASS32 ? 10 : 18, rel->r_offset,
ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
@@ -1598,7 +1694,7 @@ handle_relocs_rel (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
/* Handle a relocation section. */
static void
-handle_relocs_rela (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
+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;
@@ -1619,7 +1715,7 @@ handle_relocs_rela (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
GElf_Shdr *destshdr = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_info),
&destshdr_mem);
- if (symshdr == NULL || symdata == NULL || destshdr == NULL)
+ if (unlikely (symshdr == NULL || symdata == NULL || destshdr == NULL))
{
printf (gettext ("\nInvalid symbol table at offset %#0" PRIx64 "\n"),
shdr->sh_offset);
@@ -1628,23 +1724,13 @@ handle_relocs_rela (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
/* Search for the optional extended section index table. */
Elf_Data *xndxdata = NULL;
- Elf_Scn *xndxscn = NULL;
- while ((xndxscn = elf_nextscn (ebl->elf, xndxscn)) != NULL)
- {
- GElf_Shdr xndxshdr_mem;
- GElf_Shdr *xndxshdr = gelf_getshdr (xndxscn, &xndxshdr_mem);
- if (xndxshdr != NULL && xndxshdr->sh_type == SHT_SYMTAB_SHNDX
- && xndxshdr->sh_link == elf_ndxscn (symscn))
- {
- /* Found it. */
- xndxdata = elf_getdata (xndxscn, NULL);
- break;
- }
- }
+ int xndxscnidx = elf_scnshndx (scn);
+ if (unlikely (xndxscnidx > 0))
+ xndxdata = elf_getdata (elf_getscn (ebl->elf, xndxscnidx), NULL);
/* Get the section header string table index. */
size_t shstrndx;
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -1666,11 +1752,12 @@ handle_relocs_rela (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
Offset Type Value Addend Name\n"),
stdout);
+ int is_statically_linked = 0;
for (int cnt = 0; cnt < nentries; ++cnt)
{
GElf_Rela relmem;
GElf_Rela *rel = gelf_getrela (data, cnt, &relmem);
- if (rel != NULL)
+ if (likely (rel != NULL))
{
char buf[64];
GElf_Sym symmem;
@@ -1679,22 +1766,64 @@ handle_relocs_rela (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
GELF_R_SYM (rel->r_info),
&symmem, &xndx);
- if (sym == NULL)
- printf (" %#0*" PRIx64 " %-15s <%s %ld>\n",
- class == ELFCLASS32 ? 10 : 18, rel->r_offset,
- ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
- /* Avoid the leading R_ which isn't carrying any
- information. */
- ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
- buf, sizeof (buf)) + 2
- : gettext ("<INVALID RELOC>"),
- gettext ("INVALID SYMBOL"),
- (long int) GELF_R_SYM (rel->r_info));
+ if (unlikely (sym == NULL))
+ {
+ /* As a special case we have to handle relocations in static
+ executables. This only happens for IRELATIVE relocations
+ (so far). There is no symbol table. */
+ if (is_statically_linked == 0)
+ {
+ /* Find the program header and look for a PT_INTERP entry. */
+ is_statically_linked = -1;
+ if (ehdr->e_type == ET_EXEC)
+ {
+ is_statically_linked = 1;
+
+ for (size_t inner = 0; inner < phnum; ++inner)
+ {
+ GElf_Phdr phdr_mem;
+ GElf_Phdr *phdr = gelf_getphdr (ebl->elf, inner,
+ &phdr_mem);
+ if (phdr != NULL && phdr->p_type == PT_INTERP)
+ {
+ is_statically_linked = -1;
+ break;
+ }
+ }
+ }
+ }
+
+ if (is_statically_linked > 0 && shdr->sh_link == 0)
+ printf ("\
+ %#0*" PRIx64 " %-15s %*s %#6" PRIx64 " %s\n",
+ class == ELFCLASS32 ? 10 : 18, rel->r_offset,
+ ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
+ /* Avoid the leading R_ which isn't carrying any
+ information. */
+ ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
+ buf, sizeof (buf)) + 2
+ : gettext ("<INVALID RELOC>"),
+ class == ELFCLASS32 ? 10 : 18, "",
+ rel->r_addend,
+ elf_strptr (ebl->elf, shstrndx, destshdr->sh_name));
+ else
+ printf (" %#0*" PRIx64 " %-15s <%s %ld>\n",
+ class == ELFCLASS32 ? 10 : 18, rel->r_offset,
+ ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
+ /* Avoid the leading R_ which isn't carrying any
+ information. */
+ ? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
+ buf, sizeof (buf)) + 2
+ : gettext ("<INVALID RELOC>"),
+ gettext ("INVALID SYMBOL"),
+ (long int) GELF_R_SYM (rel->r_info));
+ }
else if (GELF_ST_TYPE (sym->st_info) != STT_SECTION)
printf ("\
%#0*" PRIx64 " %-15s %#0*" PRIx64 " %+6" PRId64 " %s\n",
class == ELFCLASS32 ? 10 : 18, rel->r_offset,
- ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
+ likely (ebl_reloc_type_check (ebl,
+ GELF_R_TYPE (rel->r_info)))
/* Avoid the leading R_ which isn't carrying any
information. */
? ebl_reloc_type_name (ebl, GELF_R_TYPE (rel->r_info),
@@ -1710,7 +1839,7 @@ handle_relocs_rela (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
? xndx : sym->st_shndx),
&destshdr_mem);
- if (shdr == NULL)
+ if (unlikely (shdr == NULL))
printf (" %#0*" PRIx64 " %-15s <%s %ld>\n",
class == ELFCLASS32 ? 10 : 18, rel->r_offset,
ebl_reloc_type_check (ebl, GELF_R_TYPE (rel->r_info))
@@ -1784,7 +1913,7 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
GElf_Shdr runshdr_mem;
GElf_Shdr *runshdr = gelf_getshdr (runscn, &runshdr_mem);
- if (runshdr != NULL)
+ if (likely (runshdr != NULL))
{
if (runshdr->sh_type == SHT_GNU_versym
&& runshdr->sh_link == elf_ndxscn (scn))
@@ -1811,7 +1940,7 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
/* Get the section header string table index. */
size_t shstrndx;
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -1851,11 +1980,11 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
GElf_Sym sym_mem;
GElf_Sym *sym = gelf_getsymshndx (data, xndx_data, cnt, &sym_mem, &xndx);
- if (sym == NULL)
+ if (unlikely (sym == NULL))
continue;
/* Determine the real section index. */
- if (sym->st_shndx != SHN_XINDEX)
+ if (likely (sym->st_shndx != SHN_XINDEX))
xndx = sym->st_shndx;
printf (gettext ("\
@@ -1945,7 +2074,7 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
(unsigned int) vernaux->vna_other);
check_def = 0;
}
- else if (! is_nobits)
+ else if (unlikely (! is_nobits))
error (0, 0, gettext ("bad dynamic symbol"));
else
check_def = 1;
@@ -2008,7 +2137,7 @@ print_verinfo (Ebl *ebl)
GElf_Shdr shdr_mem;
GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
- if (shdr != NULL)
+ if (likely (shdr != NULL))
{
if (shdr->sh_type == SHT_GNU_verneed)
handle_verneed (ebl, scn, shdr);
@@ -2043,7 +2172,7 @@ get_ver_flags (unsigned int flags)
endp = stpcpy (endp, "WEAK ");
}
- if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK))
+ if (unlikely (flags & ~(VER_FLG_BASE | VER_FLG_WEAK)))
{
strncpy (endp, gettext ("| <unknown>"), buf + sizeof (buf) - endp);
buf[sizeof (buf) - 1] = '\0';
@@ -2065,7 +2194,7 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
/* Get the section header string table index. */
size_t shstrndx;
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -2090,7 +2219,7 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
/* Get the data at the next offset. */
GElf_Verneed needmem;
GElf_Verneed *need = gelf_getverneed (data, offset, &needmem);
- if (need == NULL)
+ if (unlikely (need == NULL))
break;
printf (gettext (" %#06x: Version: %hu File: %s Cnt: %hu\n"),
@@ -2103,7 +2232,7 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
{
GElf_Vernaux auxmem;
GElf_Vernaux *aux = gelf_getvernaux (data, auxoffset, &auxmem);
- if (aux == NULL)
+ if (unlikely (aux == NULL))
break;
printf (gettext (" %#06x: Name: %s Flags: %s Version: %hu\n"),
@@ -2131,7 +2260,7 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
/* Get the section header string table index. */
size_t shstrndx;
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -2158,13 +2287,13 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
/* Get the data at the next offset. */
GElf_Verdef defmem;
GElf_Verdef *def = gelf_getverdef (data, offset, &defmem);
- if (def == NULL)
+ if (unlikely (def == NULL))
break;
unsigned int auxoffset = offset + def->vd_aux;
GElf_Verdaux auxmem;
GElf_Verdaux *aux = gelf_getverdaux (data, auxoffset, &auxmem);
- if (aux == NULL)
+ if (unlikely (aux == NULL))
break;
printf (gettext ("\
@@ -2179,7 +2308,7 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
for (int cnt2 = 1; cnt2 < def->vd_cnt; ++cnt2)
{
aux = gelf_getverdaux (data, auxoffset, &auxmem);
- if (aux == NULL)
+ if (unlikely (aux == NULL))
break;
printf (gettext (" %#06x: Parent %d: %s\n"),
@@ -2209,7 +2338,7 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
/* Get the section header string table index. */
size_t shstrndx;
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -2224,7 +2353,7 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
GElf_Shdr vershdr_mem;
GElf_Shdr *vershdr = gelf_getshdr (verscn, &vershdr_mem);
- if (vershdr != NULL)
+ if (likely (vershdr != NULL))
{
if (vershdr->sh_type == SHT_GNU_verdef)
defscn = verscn;
@@ -2249,11 +2378,11 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
GElf_Shdr *defshdr;
defdata = elf_getdata (defscn, NULL);
- if (defdata == NULL)
+ if (unlikely (defdata == NULL))
return;
defshdr = gelf_getshdr (defscn, &defshdrmem);
- if (defshdr == NULL)
+ if (unlikely (defshdr == NULL))
return;
for (unsigned int cnt = 0; cnt < defshdr->sh_info; ++cnt)
@@ -2263,7 +2392,7 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
/* Get the data at the next offset. */
def = gelf_getverdef (defdata, offset, &defmem);
- if (def == NULL)
+ if (unlikely (def == NULL))
break;
nvername = MAX (nvername, (size_t) (def->vd_ndx & 0x7fff));
@@ -2279,11 +2408,11 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
GElf_Shdr *needshdr;
needdata = elf_getdata (needscn, NULL);
- if (needdata == NULL)
+ if (unlikely (needdata == NULL))
return;
needshdr = gelf_getshdr (needscn, &needshdrmem);
- if (needshdr == NULL)
+ if (unlikely (needshdr == NULL))
return;
for (unsigned int cnt = 0; cnt < needshdr->sh_info; ++cnt)
@@ -2295,7 +2424,7 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
/* Get the data at the next offset. */
need = gelf_getverneed (needdata, offset, &needmem);
- if (need == NULL)
+ if (unlikely (need == NULL))
break;
/* Run through the auxiliary entries. */
@@ -2306,7 +2435,7 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
GElf_Vernaux *aux;
aux = gelf_getvernaux (needdata, auxoffset, &auxmem);
- if (aux == NULL)
+ if (unlikely (aux == NULL))
break;
nvername = MAX (nvername,
@@ -2337,11 +2466,11 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
GElf_Shdr *defshdr;
defdata = elf_getdata (defscn, NULL);
- if (defdata == NULL)
+ if (unlikely (defdata == NULL))
return;
defshdr = gelf_getshdr (defscn, &defshdrmem);
- if (defshdr == NULL)
+ if (unlikely (defshdr == NULL))
return;
for (unsigned int cnt = 0; cnt < defshdr->sh_info; ++cnt)
@@ -2354,7 +2483,7 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
GElf_Verdaux *aux = gelf_getverdaux (defdata,
offset + def->vd_aux,
&auxmem);
- if (def == NULL || aux == NULL)
+ if (unlikely (def == NULL || aux == NULL))
break;
vername[def->vd_ndx & 0x7fff]
@@ -2371,7 +2500,7 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
Elf_Data *needdata = elf_getdata (needscn, NULL);
GElf_Shdr needshdrmem;
GElf_Shdr *needshdr = gelf_getshdr (needscn, &needshdrmem);
- if (needdata == NULL || needshdr == NULL)
+ if (unlikely (needdata == NULL || needshdr == NULL))
return;
for (unsigned int cnt = 0; cnt < needshdr->sh_info; ++cnt)
@@ -2380,7 +2509,7 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
GElf_Verneed needmem;
GElf_Verneed *need = gelf_getverneed (needdata, offset,
&needmem);
- if (need == NULL)
+ if (unlikely (need == NULL))
break;
/* Run through the auxiliary entries. */
@@ -2390,7 +2519,7 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
GElf_Vernaux auxmem;
GElf_Vernaux *aux = gelf_getvernaux (needdata, auxoffset,
&auxmem);
- if (aux == NULL)
+ if (unlikely (aux == NULL))
break;
vername[aux->vna_other & 0x7fff]
@@ -2499,10 +2628,11 @@ print_hash_info (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, size_t shstrndx,
if (extrastr != NULL)
fputs (extrastr, stdout);
- if (nbucket > 0)
+ if (likely (nbucket > 0))
{
uint64_t success = 0;
+ /* xgettext:no-c-format */
fputs_unlocked (gettext ("\
Length Number % of total Coverage\n"), stdout);
printf (gettext (" 0 %6" PRIu32 " %5.1f%%\n"),
@@ -2541,7 +2671,7 @@ static void
handle_sysv_hash (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, size_t shstrndx)
{
Elf_Data *data = elf_getdata (scn, NULL);
- if (data == NULL)
+ if (unlikely (data == NULL))
{
error (0, 0, gettext ("cannot get data for section %d: %s"),
(int) elf_ndxscn (scn), elf_errmsg (-1));
@@ -2583,7 +2713,7 @@ static void
handle_sysv_hash64 (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, size_t shstrndx)
{
Elf_Data *data = elf_getdata (scn, NULL);
- if (data == NULL)
+ if (unlikely (data == NULL))
{
error (0, 0, gettext ("cannot get data for section %d: %s"),
(int) elf_ndxscn (scn), elf_errmsg (-1));
@@ -2624,7 +2754,7 @@ static void
handle_gnu_hash (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, size_t shstrndx)
{
Elf_Data *data = elf_getdata (scn, NULL);
- if (data == NULL)
+ if (unlikely (data == NULL))
{
error (0, 0, gettext ("cannot get data for section %d: %s"),
(int) elf_ndxscn (scn), elf_errmsg (-1));
@@ -2680,13 +2810,15 @@ handle_gnu_hash (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr, size_t shstrndx)
}
char *str;
- if (asprintf (&str, gettext ("\
+ if (unlikely (asprintf (&str, gettext ("\
Symbol Bias: %u\n\
Bitmask Size: %zu bytes %" PRIuFAST32 "%% bits set 2nd hash shift: %u\n"),
- (unsigned int) symbias, bitmask_words * sizeof (Elf32_Word),
- ((nbits * 100 + 50)
- / (uint_fast32_t) (bitmask_words * sizeof (Elf32_Word) * 8)),
- (unsigned int) shift) == -1)
+ (unsigned int) symbias,
+ bitmask_words * sizeof (Elf32_Word),
+ ((nbits * 100 + 50)
+ / (uint_fast32_t) (bitmask_words
+ * sizeof (Elf32_Word) * 8)),
+ (unsigned int) shift) == -1))
error (EXIT_FAILURE, 0, gettext ("memory exhausted"));
print_hash_info (ebl, scn, shdr, shstrndx, maxlength, nbucket, nsyms,
@@ -2704,7 +2836,7 @@ handle_hash (Ebl *ebl)
{
/* Get the section header string table index. */
size_t shstrndx;
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -2715,7 +2847,7 @@ handle_hash (Ebl *ebl)
GElf_Shdr shdr_mem;
GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
- if (shdr != NULL)
+ if (likely (shdr != NULL))
{
if (shdr->sh_type == SHT_HASH)
{
@@ -2740,7 +2872,7 @@ print_liblist (Ebl *ebl)
/* Get the section header string table index. */
size_t shstrndx;
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -2773,12 +2905,12 @@ print_liblist (Ebl *ebl)
{
GElf_Lib lib_mem;
GElf_Lib *lib = gelf_getlib (data, cnt, &lib_mem);
- if (lib == NULL)
+ if (unlikely (lib == NULL))
continue;
time_t t = (time_t) lib->l_time_stamp;
struct tm *tm = gmtime (&t);
- if (tm == NULL)
+ if (unlikely (tm == NULL))
continue;
printf (" [%2d] %-29s %04u-%02u-%02uT%02u:%02u:%02u %08x %-7u %u\n",
@@ -2793,6 +2925,169 @@ print_liblist (Ebl *ebl)
}
}
+static void
+print_attributes (Ebl *ebl, const GElf_Ehdr *ehdr)
+{
+ /* Find the object attributes sections. For this we have to search
+ through the section table. */
+ Elf_Scn *scn = NULL;
+
+ /* Get the section header string table index. */
+ size_t shstrndx;
+ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
+ error (EXIT_FAILURE, 0,
+ gettext ("cannot get section header string table index"));
+
+ while ((scn = elf_nextscn (ebl->elf, scn)) != NULL)
+ {
+ GElf_Shdr shdr_mem;
+ GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+
+ if (shdr == NULL || (shdr->sh_type != SHT_GNU_ATTRIBUTES
+ && (shdr->sh_type != SHT_ARM_ATTRIBUTES
+ || ehdr->e_machine != EM_ARM)))
+ continue;
+
+ printf (gettext ("\
+\nObject attributes section [%2zu] '%s' of %" PRIu64
+ " bytes at offset %#0" PRIx64 ":\n"),
+ elf_ndxscn (scn),
+ elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
+ shdr->sh_size, shdr->sh_offset);
+
+ Elf_Data *data = elf_rawdata (scn, NULL);
+ if (data == NULL)
+ return;
+
+ const unsigned char *p = data->d_buf;
+
+ if (unlikely (*p++ != 'A'))
+ return;
+
+ fputs_unlocked (gettext (" Owner Size\n"), stdout);
+
+ inline size_t left (void)
+ {
+ return (const unsigned char *) data->d_buf + data->d_size - p;
+ }
+
+ while (left () >= 4)
+ {
+ uint32_t len;
+ memcpy (&len, p, sizeof len);
+
+ if (MY_ELFDATA != ehdr->e_ident[EI_DATA])
+ CONVERT (len);
+
+ if (unlikely (len > left ()))
+ break;
+
+ const unsigned char *name = p + sizeof len;
+ p += len;
+
+ unsigned const char *q = memchr (name, '\0', len);
+ if (unlikely (q == NULL))
+ continue;
+ ++q;
+
+ printf (gettext (" %-13s %4" PRIu32 "\n"), name, len);
+
+ if (shdr->sh_type != SHT_GNU_ATTRIBUTES
+ || (q - name == sizeof "gnu"
+ && !memcmp (name, "gnu", sizeof "gnu")))
+ while (q < p)
+ {
+ const unsigned char *const sub = q;
+
+ unsigned int subsection_tag;
+ get_uleb128 (subsection_tag, q);
+ if (unlikely (q >= p))
+ break;
+
+ uint32_t subsection_len;
+ if (unlikely (p - sub < (ptrdiff_t) sizeof subsection_len))
+ break;
+
+ memcpy (&subsection_len, q, sizeof subsection_len);
+
+ if (MY_ELFDATA != ehdr->e_ident[EI_DATA])
+ CONVERT (subsection_len);
+
+ if (unlikely (p - sub < (ptrdiff_t) subsection_len))
+ break;
+
+ const unsigned char *r = q + sizeof subsection_len;
+ q = sub + subsection_len;
+
+ switch (subsection_tag)
+ {
+ default:
+ printf (gettext (" %-4u %12" PRIu32 "\n"),
+ subsection_tag, subsection_len);
+ break;
+
+ case 1: /* Tag_File */
+ printf (gettext (" File: %11" PRIu32 "\n"),
+ subsection_len);
+
+ while (r < q)
+ {
+ unsigned int tag;
+ get_uleb128 (tag, r);
+ if (unlikely (r >= q))
+ break;
+
+ uint64_t value = 0;
+ const char *string = NULL;
+ if (tag == 32 || (tag & 1) == 0)
+ {
+ get_uleb128 (value, r);
+ if (r > q)
+ break;
+ }
+ if (tag == 32 || (tag & 1) != 0)
+ {
+ r = memchr (r, '\0', q - r);
+ if (r == NULL)
+ break;
+ ++r;
+ }
+
+ const char *tag_name = NULL;
+ const char *value_name = NULL;
+ ebl_check_object_attribute (ebl, (const char *) name,
+ tag, value,
+ &tag_name, &value_name);
+
+ if (tag_name != NULL)
+ {
+ if (tag == 32)
+ printf (gettext (" %s: %" PRId64 ", %s\n"),
+ tag_name, value, string);
+ else if (string == NULL && value_name == NULL)
+ printf (gettext (" %s: %" PRId64 "\n"),
+ tag_name, value);
+ else
+ printf (gettext (" %s: %s\n"),
+ tag_name, string ?: value_name);
+ }
+ else
+ {
+ assert (tag != 32);
+ if (string == NULL)
+ printf (gettext (" %u: %" PRId64 "\n"),
+ tag, value);
+ else
+ printf (gettext (" %u: %s\n"),
+ tag, string);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
static char *
format_dwarf_addr (Dwfl_Module *dwflmod,
@@ -2800,7 +3095,8 @@ format_dwarf_addr (Dwfl_Module *dwflmod,
{
/* See if there is a name we can give for this address. */
GElf_Sym sym;
- const char *name = dwfl_module_addrsym (dwflmod, address, &sym, NULL);
+ const char *name = print_address_names
+ ? dwfl_module_addrsym (dwflmod, address, &sym, NULL) : NULL;
if (name != NULL)
sym.st_value = address - sym.st_value;
@@ -2936,10 +3232,10 @@ dwarf_tag_string (unsigned int tag)
static char buf[40];
const char *result = NULL;
- if (tag < nknown_tags)
+ if (likely (tag < nknown_tags))
result = known_tags[tag];
- if (result == NULL)
+ if (unlikely (result == NULL))
/* There are a few known extensions. */
switch (tag)
{
@@ -3072,10 +3368,10 @@ dwarf_attr_string (unsigned int attrnum)
static char buf[40];
const char *result = NULL;
- if (attrnum < nknown_attrs)
+ if (likely (attrnum < nknown_attrs))
result = known_attrs[attrnum];
- if (result == NULL)
+ if (unlikely (result == NULL))
/* There are a few known extensions. */
switch (attrnum)
{
@@ -3171,6 +3467,14 @@ dwarf_attr_string (unsigned int attrnum)
result = "body_end";
break;
+ case DW_AT_GNU_vector:
+ result = "GNU_vector";
+ break;
+
+ case DW_AT_GNU_template_name:
+ result = "GNU_template_name";
+ break;
+
default:
if (attrnum < DW_AT_lo_user)
snprintf (buf, sizeof buf, gettext ("unknown attribute %hx"),
@@ -3218,10 +3522,10 @@ dwarf_form_string (unsigned int form)
static char buf[40];
const char *result = NULL;
- if (form < nknown_forms)
+ if (likely (form < nknown_forms))
result = known_forms[form];
- if (result == NULL)
+ if (unlikely (result == NULL))
snprintf (buf, sizeof buf, gettext ("unknown form %" PRIx64),
(uint64_t) form);
@@ -3255,7 +3559,7 @@ dwarf_lang_string (unsigned int lang)
[DW_LANG_D] = "D",
};
- if (lang < sizeof (known) / sizeof (known[0]))
+ if (likely (lang < sizeof (known) / sizeof (known[0])))
return known[lang];
else if (lang == DW_LANG_Mips_Assembler)
/* This language tag is used for assembler in general. */
@@ -3283,7 +3587,7 @@ dwarf_inline_string (unsigned int code)
[DW_INL_declared_inlined] = "declared_inlined"
};
- if (code < sizeof (known) / sizeof (known[0]))
+ if (likely (code < sizeof (known) / sizeof (known[0])))
return known[code];
return "???";
@@ -3313,7 +3617,7 @@ dwarf_encoding_string (unsigned int code)
[DW_ATE_decimal_float] = "decimal_float",
};
- if (code < sizeof (known) / sizeof (known[0]))
+ if (likely (code < sizeof (known) / sizeof (known[0])))
return known[code];
if (code >= DW_ATE_lo_user && code <= DW_ATE_hi_user)
@@ -3337,7 +3641,7 @@ dwarf_access_string (unsigned int code)
[DW_ACCESS_private] = "private"
};
- if (code < sizeof (known) / sizeof (known[0]))
+ if (likely (code < sizeof (known) / sizeof (known[0])))
return known[code];
return "???";
@@ -3354,7 +3658,7 @@ dwarf_visibility_string (unsigned int code)
[DW_VIS_qualified] = "qualified"
};
- if (code < sizeof (known) / sizeof (known[0]))
+ if (likely (code < sizeof (known) / sizeof (known[0])))
return known[code];
return "???";
@@ -3371,7 +3675,7 @@ dwarf_virtuality_string (unsigned int code)
[DW_VIRTUALITY_pure_virtual] = "pure_virtual"
};
- if (code < sizeof (known) / sizeof (known[0]))
+ if (likely (code < sizeof (known) / sizeof (known[0])))
return known[code];
return "???";
@@ -3389,7 +3693,7 @@ dwarf_identifier_case_string (unsigned int code)
[DW_ID_case_insensitive] = "insensitive"
};
- if (code < sizeof (known) / sizeof (known[0]))
+ if (likely (code < sizeof (known) / sizeof (known[0])))
return known[code];
return "???";
@@ -3406,7 +3710,7 @@ dwarf_calling_convention_string (unsigned int code)
[DW_CC_nocall] = "nocall",
};
- if (code < sizeof (known) / sizeof (known[0]))
+ if (likely (code < sizeof (known) / sizeof (known[0])))
return known[code];
if (code >= DW_CC_lo_user && code <= DW_CC_hi_user)
@@ -3429,7 +3733,7 @@ dwarf_ordering_string (unsigned int code)
[DW_ORD_col_major] = "col_major"
};
- if (code < sizeof (known) / sizeof (known[0]))
+ if (likely (code < sizeof (known) / sizeof (known[0])))
return known[code];
return "???";
@@ -3445,7 +3749,7 @@ dwarf_discr_list_string (unsigned int code)
[DW_DSC_range] = "range"
};
- if (code < sizeof (known) / sizeof (known[0]))
+ if (likely (code < sizeof (known) / sizeof (known[0])))
return known[code];
return "???";
@@ -3453,8 +3757,25 @@ dwarf_discr_list_string (unsigned int code)
static void
+print_block (size_t n, const void *block)
+{
+ if (n == 0)
+ puts (_("empty block"));
+ else
+ {
+ printf (_("%zu byte block:"), n);
+ const unsigned char *data = block;
+ do
+ printf (" %02x", *data++);
+ while (--n > 0);
+ putchar ('\n');
+ }
+}
+
+static void
print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
- unsigned int addrsize, Dwarf_Word len, const unsigned char *data)
+ unsigned int addrsize, unsigned int offset_size,
+ Dwarf_Word len, const unsigned char *data)
{
static const char *const known[] =
{
@@ -3610,19 +3931,29 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
[DW_OP_form_tls_address] = "form_tls_address",
[DW_OP_call_frame_cfa] = "call_frame_cfa",
[DW_OP_bit_piece] = "bit_piece",
+ [DW_OP_implicit_value] = "implicit_value",
+ [DW_OP_stack_value] = "stack_value",
};
+ if (len == 0)
+ {
+ printf ("%*s(empty)\n", indent, "");
+ return;
+ }
+
+#define NEED(n) if (len < n) goto invalid;
+
Dwarf_Word offset = 0;
while (len-- > 0)
{
- size_t op = *data++;
+ uint_fast8_t op = *data++;
switch (op)
{
- case DW_OP_call_ref:
case DW_OP_addr:;
/* Address operand. */
Dwarf_Word addr;
+ NEED (addrsize);
if (addrsize == 4)
addr = read_4ubyte_unaligned (dbg, data);
else
@@ -3633,91 +3964,119 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
data += addrsize;
len -= addrsize;
- if (op == DW_OP_addr)
+ char *a = format_dwarf_addr (dwflmod, 0, addr);
+ printf ("%*s[%4" PRIuMAX "] %s %s\n",
+ indent, "", (uintmax_t) offset, known[op], a);
+ free (a);
+
+ offset += 1 + addrsize;
+ break;
+
+ case DW_OP_call_ref:
+ /* Offset operand. */
+ NEED (offset_size);
+ if (offset_size == 4)
+ addr = read_4ubyte_unaligned (dbg, data);
+ else
{
- char *a = format_dwarf_addr (dwflmod, 0, addr);
- printf ("%*s[%4" PRIuMAX "] %s %s\n",
- indent, "", (uintmax_t) offset,
- known[op] ?: "???", a);
- free (a);
+ assert (offset_size == 8);
+ addr = read_8ubyte_unaligned (dbg, data);
}
- else
- printf ("%*s[%4" PRIuMAX "] %s %#" PRIxMAX "\n",
- indent, "", (uintmax_t) offset,
- known[op] ?: "???", (uintmax_t) addr);
- offset += 1 + addrsize;
+ data += offset_size;
+ len -= offset_size;
+
+ printf ("%*s[%4" PRIuMAX "] %s %#" PRIxMAX "\n",
+ indent, "", (uintmax_t) offset,
+ known[op], (uintmax_t) addr);
+ offset += 1 + offset_size;
break;
case DW_OP_deref_size:
case DW_OP_xderef_size:
case DW_OP_pick:
case DW_OP_const1u:
+ // XXX value might be modified by relocation
+ NEED (1);
printf ("%*s[%4" PRIuMAX "] %s %" PRIu8 "\n",
indent, "", (uintmax_t) offset,
- known[op] ?: "???", *((uint8_t *) data));
+ known[op], *((uint8_t *) data));
++data;
--len;
offset += 2;
break;
case DW_OP_const2u:
+ NEED (2);
+ // XXX value might be modified by relocation
printf ("%*s[%4" PRIuMAX "] %s %" PRIu16 "\n",
indent, "", (uintmax_t) offset,
- known[op] ?: "???", read_2ubyte_unaligned (dbg, data));
+ known[op], read_2ubyte_unaligned (dbg, data));
len -= 2;
data += 2;
offset += 3;
break;
case DW_OP_const4u:
+ NEED (4);
+ // XXX value might be modified by relocation
printf ("%*s[%4" PRIuMAX "] %s %" PRIu32 "\n",
indent, "", (uintmax_t) offset,
- known[op] ?: "???", read_4ubyte_unaligned (dbg, data));
+ known[op], read_4ubyte_unaligned (dbg, data));
len -= 4;
data += 4;
offset += 5;
break;
case DW_OP_const8u:
+ NEED (8);
+ // XXX value might be modified by relocation
printf ("%*s[%4" PRIuMAX "] %s %" PRIu64 "\n",
indent, "", (uintmax_t) offset,
- known[op] ?: "???", read_8ubyte_unaligned (dbg, data));
+ known[op], read_8ubyte_unaligned (dbg, data));
len -= 8;
data += 8;
offset += 9;
break;
case DW_OP_const1s:
+ NEED (1);
+ // XXX value might be modified by relocation
printf ("%*s[%4" PRIuMAX "] %s %" PRId8 "\n",
indent, "", (uintmax_t) offset,
- known[op] ?: "???", *((int8_t *) data));
+ known[op], *((int8_t *) data));
++data;
--len;
offset += 2;
break;
case DW_OP_const2s:
+ NEED (2);
+ // XXX value might be modified by relocation
printf ("%*s[%4" PRIuMAX "] %s %" PRId16 "\n",
indent, "", (uintmax_t) offset,
- known[op] ?: "???", read_2sbyte_unaligned (dbg, data));
+ known[op], read_2sbyte_unaligned (dbg, data));
len -= 2;
data += 2;
offset += 3;
break;
case DW_OP_const4s:
+ NEED (4);
+ // XXX value might be modified by relocation
printf ("%*s[%4" PRIuMAX "] %s %" PRId32 "\n",
indent, "", (uintmax_t) offset,
- known[op] ?: "???", read_4sbyte_unaligned (dbg, data));
+ known[op], read_4sbyte_unaligned (dbg, data));
len -= 4;
data += 4;
offset += 5;
break;
case DW_OP_const8s:
+ NEED (8);
+ // XXX value might be modified by relocation
printf ("%*s[%4" PRIuMAX "] %s %" PRId64 "\n",
indent, "", (uintmax_t) offset,
- known[op] ?: "???", read_8sbyte_unaligned (dbg, data));
+ known[op], read_8sbyte_unaligned (dbg, data));
len -= 8;
data += 8;
offset += 9;
@@ -3729,10 +4088,9 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
case DW_OP_constu:;
const unsigned char *start = data;
unsigned int uleb;
- get_uleb128 (uleb, data);
+ get_uleb128 (uleb, data); /* XXX check overrun */
printf ("%*s[%4" PRIuMAX "] %s %u\n",
- indent, "", (uintmax_t) offset,
- known[op] ?: "???", uleb);
+ indent, "", (uintmax_t) offset, known[op], uleb);
len -= data - start;
offset += 1 + (data - start);
break;
@@ -3740,11 +4098,10 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
case DW_OP_bit_piece:
start = data;
unsigned int uleb2;
- get_uleb128 (uleb, data);
- get_uleb128 (uleb2, data);
+ get_uleb128 (uleb, data); /* XXX check overrun */
+ get_uleb128 (uleb2, data); /* XXX check overrun */
printf ("%*s[%4" PRIuMAX "] %s %u, %u\n",
- indent, "", (uintmax_t) offset,
- known[op] ?: "???", uleb, uleb2);
+ indent, "", (uintmax_t) offset, known[op], uleb, uleb2);
len -= data - start;
offset += 1 + (data - start);
break;
@@ -3754,48 +4111,83 @@ print_ops (Dwfl_Module *dwflmod, Dwarf *dbg, int indent, int indentrest,
case DW_OP_consts:
start = data;
unsigned int sleb;
- get_sleb128 (sleb, data);
+ get_sleb128 (sleb, data); /* XXX check overrun */
printf ("%*s[%4" PRIuMAX "] %s %d\n",
- indent, "", (uintmax_t) offset,
- known[op] ?: "???", sleb);
+ indent, "", (uintmax_t) offset, known[op], sleb);
len -= data - start;
offset += 1 + (data - start);
break;
case DW_OP_bregx:
start = data;
- get_uleb128 (uleb, data);
- get_sleb128 (sleb, data);
+ get_uleb128 (uleb, data); /* XXX check overrun */
+ get_sleb128 (sleb, data); /* XXX check overrun */
printf ("%*s[%4" PRIuMAX "] %s %u %d\n",
- indent, "", (uintmax_t) offset,
- known[op] ?: "???", uleb, sleb);
+ indent, "", (uintmax_t) offset, known[op], uleb, sleb);
len -= data - start;
offset += 1 + (data - start);
break;
case DW_OP_call2:
+ NEED (2);
+ printf ("%*s[%4" PRIuMAX "] %s %" PRIu16 "\n",
+ indent, "", (uintmax_t) offset, known[op],
+ read_2ubyte_unaligned (dbg, data));
+ len -= 2;
+ offset += 3;
+ break;
+
case DW_OP_call4:
+ NEED (4);
+ printf ("%*s[%4" PRIuMAX "] %s %" PRIu32 "\n",
+ indent, "", (uintmax_t) offset, known[op],
+ read_4ubyte_unaligned (dbg, data));
+ len -= 4;
+ offset += 5;
+ break;
+
case DW_OP_skip:
case DW_OP_bra:
+ NEED (2);
printf ("%*s[%4" PRIuMAX "] %s %" PRIuMAX "\n",
- indent, "", (uintmax_t) offset,
- known[op] ?: "???",
+ indent, "", (uintmax_t) offset, known[op],
(uintmax_t) (offset + read_2sbyte_unaligned (dbg, data)));
len -= 2;
data += 2;
offset += 3;
break;
+ case DW_OP_implicit_value:
+ start = data;
+ get_uleb128 (uleb, data); /* XXX check overrun */
+ printf ("%*s[%4" PRIuMAX "] %s: ",
+ indent, "", (uintmax_t) offset, known[op]);
+ NEED (uleb);
+ print_block (uleb, data);
+ data += uleb;
+ len -= data - start;
+ offset += 1 + (data - start);
+ break;
+
default:
/* No Operand. */
- printf ("%*s[%4" PRIuMAX "] %s\n",
- indent, "", (uintmax_t) offset,
- known[op] ?: "???");
+ if (op < sizeof known / sizeof known[0] && known[op] != NULL)
+ printf ("%*s[%4" PRIuMAX "] %s\n",
+ indent, "", (uintmax_t) offset, known[op]);
+ else
+ printf ("%*s[%4" PRIuMAX "] %#x\n",
+ indent, "", (uintmax_t) offset, op);
++offset;
break;
}
indent = indentrest;
+ continue;
+
+ invalid:
+ printf (gettext ("%*s[%4" PRIuMAX "] %s <TRUNCATED>\n"),
+ indent, "", (uintmax_t) offset, known[op]);
+ break;
}
}
@@ -3804,12 +4196,11 @@ static void
print_debug_abbrev_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
Ebl *ebl __attribute__ ((unused)),
GElf_Ehdr *ehdr __attribute__ ((unused)),
- Elf_Scn *scn __attribute__ ((unused)),
- GElf_Shdr *shdr, Dwarf *dbg)
+ Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
{
- printf (gettext ("\nDWARF section '%s' at offset %#" PRIx64 ":\n"
+ printf (gettext ("\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"
" [ Code]\n"),
- ".debug_abbrev", (uint64_t) shdr->sh_offset);
+ elf_ndxscn (scn), ".debug_abbrev", (uint64_t) shdr->sh_offset);
Dwarf_Off offset = 0;
while (offset < shdr->sh_size)
@@ -3825,7 +4216,7 @@ print_debug_abbrev_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
int res = dwarf_offabbrev (dbg, offset, &length, &abbrev);
if (res != 0)
{
- if (res < 0)
+ if (unlikely (res < 0))
{
printf (gettext ("\
*** error while reading abbreviation: %s\n"),
@@ -3875,13 +4266,12 @@ print_debug_abbrev_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
static void
print_debug_aranges_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
Ebl *ebl __attribute__ ((unused)),
- GElf_Ehdr *ehdr __attribute__ ((unused)),
- Elf_Scn *scn __attribute__ ((unused)),
+ GElf_Ehdr *ehdr, Elf_Scn *scn,
GElf_Shdr *shdr, Dwarf *dbg)
{
Dwarf_Aranges *aranges;
size_t cnt;
- if (dwarf_getaranges (dbg, &aranges, &cnt) != 0)
+ if (unlikely (dwarf_getaranges (dbg, &aranges, &cnt) != 0))
{
error (0, 0, gettext ("cannot get .debug_aranges content: %s"),
dwarf_errmsg (-1));
@@ -3889,11 +4279,11 @@ print_debug_aranges_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
}
printf (ngettext ("\
-\nDWARF section '%s' at offset %#" PRIx64 " contains %zu entry:\n",
+\nDWARF section [%2zu] '%s' at offset %#" PRIx64 " contains %zu entry:\n",
"\
-\nDWARF section '%s' at offset %#" PRIx64 " contains %zu entries:\n",
+\nDWARF section [%2zu] '%s' at offset %#" PRIx64 " contains %zu entries:\n",
cnt),
- ".debug_aranges", (uint64_t) shdr->sh_offset, cnt);
+ elf_ndxscn (scn), ".debug_aranges", (uint64_t) shdr->sh_offset, cnt);
/* Compute floor(log16(cnt)). */
size_t tmp = cnt;
@@ -3907,7 +4297,7 @@ print_debug_aranges_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
for (size_t n = 0; n < cnt; ++n)
{
Dwarf_Arange *runp = dwarf_onearange (aranges, n);
- if (runp == NULL)
+ if (unlikely (runp == NULL))
{
printf ("cannot get arange %zu: %s\n", n, dwarf_errmsg (-1));
return;
@@ -3917,7 +4307,7 @@ print_debug_aranges_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
Dwarf_Word length;
Dwarf_Off offset;
- if (dwarf_getarangeinfo (runp, &start, &length, &offset) != 0)
+ if (unlikely (dwarf_getarangeinfo (runp, &start, &length, &offset) != 0))
printf (gettext (" [%*zu] ???\n"), digits, n);
else
printf (gettext (" [%*zu] start: %0#*" PRIx64
@@ -3937,7 +4327,7 @@ print_debug_ranges_section (Dwfl_Module *dwflmod,
{
Elf_Data *data = elf_rawdata (scn, NULL);
- if (data == NULL)
+ if (unlikely (data == NULL))
{
error (0, 0, gettext ("cannot get .debug_ranges content: %s"),
elf_errmsg (-1));
@@ -3945,8 +4335,8 @@ print_debug_ranges_section (Dwfl_Module *dwflmod,
}
printf (gettext ("\
-\nDWARF section '%s' at offset %#" PRIx64 ":\n"),
- ".debug_ranges", (uint64_t) shdr->sh_offset);
+\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
+ elf_ndxscn (scn), ".debug_ranges", (uint64_t) shdr->sh_offset);
size_t address_size = ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 4 : 8;
@@ -3956,7 +4346,7 @@ print_debug_ranges_section (Dwfl_Module *dwflmod,
{
ptrdiff_t offset = readp - (unsigned char *) data->d_buf;
- if (data->d_size - offset < address_size * 2)
+ if (unlikely (data->d_size - offset < address_size * 2))
{
printf (gettext (" [%6tx] <INVALID DATA>\n"), offset);
break;
@@ -4002,15 +4392,716 @@ print_debug_ranges_section (Dwfl_Module *dwflmod,
}
}
+#define REGNAMESZ 16
+static const char *
+register_info (Ebl *ebl, unsigned int regno, const Ebl_Register_Location *loc,
+ char name[REGNAMESZ], int *bits, int *type)
+{
+ const char *set;
+ const char *pfx;
+ int ignore;
+ ssize_t n = ebl_register_info (ebl, regno, name, REGNAMESZ, &pfx, &set,
+ bits ?: &ignore, type ?: &ignore);
+ if (n <= 0)
+ {
+ snprintf (name, sizeof name, "reg%u", loc->regno);
+ if (bits != NULL)
+ *bits = loc->bits;
+ if (type != NULL)
+ *type = DW_ATE_unsigned;
+ set = "??? unrecognized";
+ }
+ else
+ {
+ if (bits != NULL && *bits <= 0)
+ *bits = loc->bits;
+ if (type != NULL && *type == DW_ATE_void)
+ *type = DW_ATE_unsigned;
+
+ }
+ return set;
+}
+
+static void
+print_cfa_program (const unsigned char *readp, const unsigned char *const endp,
+ Dwarf_Word vma_base, unsigned int code_align,
+ int data_align, unsigned int ptr_size, Dwfl_Module *dwflmod,
+ Ebl *ebl, Dwarf *dbg)
+{
+ char regnamebuf[REGNAMESZ];
+ const char *regname (unsigned int regno)
+ {
+ register_info (ebl, regno, NULL, regnamebuf, NULL, NULL);
+ return regnamebuf;
+ }
+
+ puts ("\n Program:");
+ Dwarf_Word pc = vma_base;
+ while (readp < endp)
+ {
+ unsigned int opcode = *readp++;
+
+ if (opcode < DW_CFA_advance_loc)
+ /* Extended opcode. */
+ switch (opcode)
+ {
+ uint64_t op1;
+ int64_t sop1;
+ uint64_t op2;
+ int64_t sop2;
+
+ case DW_CFA_nop:
+ puts (" nop");
+ break;
+ case DW_CFA_set_loc:
+ // XXX overflow check
+ get_uleb128 (op1, readp);
+ op1 += vma_base;
+ printf (" set_loc %" PRIu64 "\n", op1 * code_align);
+ break;
+ case DW_CFA_advance_loc1:
+ printf (" advance_loc1 %u to %#" PRIx64 "\n",
+ *readp, pc += *readp * code_align);
+ ++readp;
+ break;
+ case DW_CFA_advance_loc2:
+ op1 = read_2ubyte_unaligned_inc (dbg, readp);
+ printf (" advance_loc2 %" PRIu64 " to %#" PRIx64 "\n",
+ op1, pc += op1 * code_align);
+ break;
+ case DW_CFA_advance_loc4:
+ op1 = read_4ubyte_unaligned_inc (dbg, readp);
+ printf (" advance_loc4 %" PRIu64 " to %#" PRIx64 "\n",
+ op1, pc += op1 * code_align);
+ break;
+ case DW_CFA_offset_extended:
+ // XXX overflow check
+ get_uleb128 (op1, readp);
+ get_uleb128 (op2, readp);
+ printf (" offset_extended r%" PRIu64 " (%s) at cfa%+" PRId64
+ "\n",
+ op1, regname (op1), op2 * data_align);
+ break;
+ case DW_CFA_restore_extended:
+ // XXX overflow check
+ get_uleb128 (op1, readp);
+ printf (" restore_extended r%" PRIu64 " (%s)\n",
+ op1, regname (op1));
+ break;
+ case DW_CFA_undefined:
+ // XXX overflow check
+ get_uleb128 (op1, readp);
+ printf (" undefined r%" PRIu64 " (%s)\n", op1, regname (op1));
+ break;
+ case DW_CFA_same_value:
+ // XXX overflow check
+ get_uleb128 (op1, readp);
+ printf (" same_value r%" PRIu64 " (%s)\n", op1, regname (op1));
+ break;
+ case DW_CFA_register:
+ // XXX overflow check
+ get_uleb128 (op1, readp);
+ get_uleb128 (op2, readp);
+ printf (" register r%" PRIu64 " (%s) in r%" PRIu64 " (%s)\n",
+ op1, regname (op1), op2, regname (op2));
+ break;
+ case DW_CFA_remember_state:
+ puts (" remember_state");
+ break;
+ case DW_CFA_restore_state:
+ puts (" restore_state");
+ break;
+ case DW_CFA_def_cfa:
+ // XXX overflow check
+ get_uleb128 (op1, readp);
+ get_uleb128 (op2, readp);
+ printf (" def_cfa r%" PRIu64 " (%s) at offset %" PRIu64 "\n",
+ op1, regname (op1), op2);
+ break;
+ case DW_CFA_def_cfa_register:
+ // XXX overflow check
+ get_uleb128 (op1, readp);
+ printf (" def_cfa_register r%" PRIu64 " (%s)\n",
+ op1, regname (op1));
+ break;
+ case DW_CFA_def_cfa_offset:
+ // XXX overflow check
+ get_uleb128 (op1, readp);
+ printf (" def_cfa_offset %" PRIu64 "\n", op1);
+ break;
+ case DW_CFA_def_cfa_expression:
+ // 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, ptr_size, 0, op1, readp);
+ readp += op1;
+ break;
+ case DW_CFA_expression:
+ // XXX overflow check
+ get_uleb128 (op1, readp);
+ get_uleb128 (op2, readp); /* Length of DW_FORM_block. */
+ printf (" expression r%" PRIu64 " (%s) \n",
+ op1, regname (op1));
+ print_ops (dwflmod, dbg, 10, 10, ptr_size, 0, op2, readp);
+ readp += op2;
+ break;
+ case DW_CFA_offset_extended_sf:
+ // XXX overflow check
+ get_uleb128 (op1, readp);
+ get_sleb128 (sop2, readp);
+ printf (" offset_extended_sf r%" PRIu64 " (%s) at cfa%+"
+ PRId64 "\n",
+ op1, regname (op1), sop2 * data_align);
+ break;
+ case DW_CFA_def_cfa_sf:
+ // XXX overflow check
+ get_uleb128 (op1, readp);
+ get_sleb128 (sop2, readp);
+ printf (" def_cfa_sf r%" PRIu64 " (%s) at offset %" PRId64 "\n",
+ op1, regname (op1), sop2 * data_align);
+ break;
+ case DW_CFA_def_cfa_offset_sf:
+ // XXX overflow check
+ get_sleb128 (sop1, readp);
+ printf (" def_cfa_offset_sf %" PRId64 "\n", sop1 * data_align);
+ break;
+ case DW_CFA_val_offset:
+ // XXX overflow check
+ get_uleb128 (op1, readp);
+ get_uleb128 (op2, readp);
+ printf (" val_offset %" PRIu64 " at offset %" PRIu64 "\n",
+ op1, op2 * data_align);
+ break;
+ case DW_CFA_val_offset_sf:
+ // XXX overflow check
+ get_uleb128 (op1, readp);
+ get_sleb128 (sop2, readp);
+ printf (" val_offset_sf %" PRIu64 " at offset %" PRId64 "\n",
+ op1, sop2 * data_align);
+ break;
+ case DW_CFA_val_expression:
+ // XXX overflow check
+ get_uleb128 (op1, readp);
+ 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, ptr_size, 0, op2, readp);
+ readp += op2;
+ break;
+ case DW_CFA_MIPS_advance_loc8:
+ op1 = read_8ubyte_unaligned_inc (dbg, readp);
+ printf (" MIPS_advance_loc8 %" PRIu64 " to %#" PRIx64 "\n",
+ op1, pc += op1 * code_align);
+ break;
+ case DW_CFA_GNU_window_save:
+ puts (" GNU_window_save");
+ break;
+ case DW_CFA_GNU_args_size:
+ // XXX overflow check
+ get_uleb128 (op1, readp);
+ printf (" args_size %" PRIu64 "\n", op1);
+ break;
+ default:
+ printf (" ??? (%u)\n", opcode);
+ break;
+ }
+ else if (opcode < DW_CFA_offset)
+ printf (" advance_loc %u to %#" PRIx64 "\n",
+ opcode & 0x3f, pc += (opcode & 0x3f) * code_align);
+ else if (opcode < DW_CFA_restore)
+ {
+ unsigned int offset;
+ // XXX overflow check
+ get_uleb128 (offset, readp);
+ printf (" offset r%u (%s) at cfa%+d\n",
+ opcode & 0x3f, regname (opcode & 0x3f), offset * data_align);
+ }
+ else
+ printf (" restore r%u (%s)\n",
+ opcode & 0x3f, regname (opcode & 0x3f));
+ }
+}
+
+
+static unsigned int
+encoded_ptr_size (int encoding, unsigned int ptr_size)
+{
+ switch (encoding & 7)
+ {
+ case 2:
+ return 2;
+ case 3:
+ return 4;
+ case 4:
+ return 8;
+ default:
+ return ptr_size;
+ }
+}
+
+
+static unsigned int
+print_encoding (unsigned int val)
+{
+ switch (val & 0xf)
+ {
+ case DW_EH_PE_absptr:
+ fputs ("absptr", stdout);
+ break;
+ case DW_EH_PE_uleb128:
+ fputs ("uleb128", stdout);
+ break;
+ case DW_EH_PE_udata2:
+ fputs ("udata2", stdout);
+ break;
+ case DW_EH_PE_udata4:
+ fputs ("udata4", stdout);
+ break;
+ case DW_EH_PE_udata8:
+ fputs ("udata8", stdout);
+ break;
+ case DW_EH_PE_sleb128:
+ fputs ("sleb128", stdout);
+ break;
+ case DW_EH_PE_sdata2:
+ fputs ("sdata2", stdout);
+ break;
+ case DW_EH_PE_sdata4:
+ fputs ("sdata4", stdout);
+ break;
+ case DW_EH_PE_sdata8:
+ fputs ("sdata8", stdout);
+ break;
+ default:
+ /* We did not use any of the bits after all. */
+ return val;
+ }
+
+ return val & ~0xf;
+}
+
+
+static unsigned int
+print_relinfo (unsigned int val)
+{
+ switch (val & 0x70)
+ {
+ case DW_EH_PE_pcrel:
+ fputs ("pcrel", stdout);
+ break;
+ case DW_EH_PE_textrel:
+ fputs ("textrel", stdout);
+ break;
+ case DW_EH_PE_datarel:
+ fputs ("datarel", stdout);
+ break;
+ case DW_EH_PE_funcrel:
+ fputs ("funcrel", stdout);
+ break;
+ case DW_EH_PE_aligned:
+ fputs ("aligned", stdout);
+ break;
+ default:
+ return val;
+ }
+
+ return val & ~0x70;
+}
+
+
+static void
+print_encoding_base (const char *pfx, unsigned int fde_encoding)
+{
+ printf ("(%s", pfx);
+
+ if (fde_encoding == DW_EH_PE_omit)
+ puts ("omit)");
+ else
+ {
+ unsigned int w = fde_encoding;
+
+ w = print_encoding (w);
+
+ if (w & 0x70)
+ {
+ if (w != fde_encoding)
+ fputc_unlocked (' ', stdout);
+
+ w = print_relinfo (w);
+ }
+
+ if (w != 0)
+ printf ("%s%x", w != fde_encoding ? " " : "", w);
+
+ puts (")");
+ }
+}
+
+
+static const unsigned char *
+read_encoded (unsigned int encoding, const unsigned char *readp,
+ const unsigned char *const endp, uint64_t *res, Dwarf *dbg)
+{
+ if ((encoding & 0xf) == DW_EH_PE_absptr)
+ encoding = gelf_getclass (dbg->elf) == ELFCLASS32
+ ? DW_EH_PE_udata4 : DW_EH_PE_udata8;
+
+ switch (encoding & 0xf)
+ {
+ case DW_EH_PE_uleb128:
+ // XXX buffer overrun check
+ get_uleb128 (*res, readp);
+ break;
+ case DW_EH_PE_sleb128:
+ // XXX buffer overrun check
+ get_sleb128 (*res, readp);
+ break;
+ case DW_EH_PE_udata2:
+ if (readp + 2 > endp)
+ goto invalid;
+ *res = read_2ubyte_unaligned_inc (dbg, readp);
+ break;
+ case DW_EH_PE_udata4:
+ if (readp + 4 > endp)
+ goto invalid;
+ *res = read_4ubyte_unaligned_inc (dbg, readp);
+ break;
+ case DW_EH_PE_udata8:
+ if (readp + 8 > endp)
+ goto invalid;
+ *res = read_8ubyte_unaligned_inc (dbg, readp);
+ break;
+ case DW_EH_PE_sdata2:
+ if (readp + 2 > endp)
+ goto invalid;
+ *res = read_2sbyte_unaligned_inc (dbg, readp);
+ break;
+ case DW_EH_PE_sdata4:
+ if (readp + 4 > endp)
+ goto invalid;
+ *res = read_4sbyte_unaligned_inc (dbg, readp);
+ break;
+ case DW_EH_PE_sdata8:
+ if (readp + 8 > endp)
+ goto invalid;
+ *res = read_8sbyte_unaligned_inc (dbg, readp);
+ break;
+ default:
+ invalid:
+ error (1, 0,
+ gettext ("invalid encoding"));
+ }
+
+ return readp;
+}
+
static void
-print_debug_frame_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
- Ebl *ebl __attribute__ ((unused)),
- GElf_Ehdr *ehdr __attribute__ ((unused)),
- Elf_Scn *scn __attribute__ ((unused)),
- GElf_Shdr *shdr __attribute__ ((unused)),
- Dwarf *dbg __attribute__ ((unused)))
+print_debug_frame_section (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr,
+ Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
{
+ size_t shstrndx;
+ /* We know this call will succeed since it did in the caller. */
+ (void) elf_getshdrstrndx (ebl->elf, &shstrndx);
+ const char *scnname = elf_strptr (ebl->elf, shstrndx, shdr->sh_name);
+
+ Elf_Data *data = elf_rawdata (scn, NULL);
+
+ if (unlikely (data == NULL))
+ {
+ error (0, 0, gettext ("cannot get %s content: %s"),
+ scnname, elf_errmsg (-1));
+ return;
+ }
+ bool is_eh_frame = strcmp (scnname, ".eh_frame") == 0;
+
+ if (is_eh_frame)
+ printf (gettext ("\
+\nCall frame information section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
+ elf_ndxscn (scn), scnname, (uint64_t) shdr->sh_offset);
+ else
+ printf (gettext ("\
+\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
+ elf_ndxscn (scn), scnname, (uint64_t) shdr->sh_offset);
+
+ struct cieinfo
+ {
+ ptrdiff_t cie_offset;
+ const char *augmentation;
+ unsigned int code_alignment_factor;
+ unsigned int data_alignment_factor;
+ unsigned int fde_encoding;
+ unsigned int lsda_encoding;
+ struct cieinfo *next;
+ } *cies = NULL;
+
+ const unsigned char *readp = data->d_buf;
+ const unsigned char *const dataend = ((unsigned char *) data->d_buf
+ + data->d_size);
+ while (readp < dataend)
+ {
+ if (unlikely (readp + 4 > dataend))
+ {
+ invalid_data:
+ error (0, 0, gettext ("invalid data in section [%zu] '%s'"),
+ elf_ndxscn (scn), scnname);
+ return;
+ }
+
+ /* At the beginning there must be a CIE. There can be multiple,
+ hence we test tis in a loop. */
+ ptrdiff_t offset = readp - (unsigned char *) data->d_buf;
+
+ Dwarf_Word unit_length = read_4ubyte_unaligned_inc (dbg, readp);
+ unsigned int length = 4;
+ if (unlikely (unit_length == 0xffffffff))
+ {
+ if (unlikely (readp + 8 > dataend))
+ goto invalid_data;
+
+ unit_length = read_8ubyte_unaligned_inc (dbg, readp);
+ length = 8;
+ }
+
+ if (unlikely (unit_length == 0))
+ {
+ printf (gettext ("\n [%6tx] Zero terminator\n"), offset);
+ continue;
+ }
+
+ unsigned int ptr_size = ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 4 : 8;
+
+ ptrdiff_t start = readp - (unsigned char *) data->d_buf;
+ const unsigned char *const cieend = readp + unit_length;
+ if (unlikely (cieend > dataend || readp + 8 > dataend))
+ goto invalid_data;
+
+ Dwarf_Off cie_id;
+ if (length == 4)
+ {
+ cie_id = read_4ubyte_unaligned_inc (dbg, readp);
+ if (!is_eh_frame && cie_id == DW_CIE_ID_32)
+ cie_id = DW_CIE_ID_64;
+ }
+ else
+ cie_id = read_8ubyte_unaligned_inc (dbg, readp);
+
+ unsigned int code_alignment_factor;
+ int data_alignment_factor;
+ unsigned int fde_encoding = 0;
+ unsigned int lsda_encoding = 0;
+ Dwarf_Word initial_location = 0;
+ Dwarf_Word vma_base = 0;
+
+ if (cie_id == (is_eh_frame ? 0 : DW_CIE_ID_64))
+ {
+ uint_fast8_t version = *readp++;
+ const char *const augmentation = (const char *) readp;
+ readp = memchr (readp, '\0', cieend - readp);
+ if (unlikely (readp == NULL))
+ goto invalid_data;
+ ++readp;
+ // XXX Check overflow
+ get_uleb128 (code_alignment_factor, readp);
+ // XXX Check overflow
+ get_sleb128 (data_alignment_factor, readp);
+
+ /* In some variant for unwind data there is another field. */
+ if (strcmp (augmentation, "eh") == 0)
+ readp += ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 4 : 8;
+
+ unsigned int return_address_register;
+ if (unlikely (version == 1))
+ return_address_register = *readp++;
+ else
+ // XXX Check overflow
+ get_uleb128 (return_address_register, readp);
+
+ printf ("\n [%6tx] CIE length=%" PRIu64 "\n"
+ " CIE_id: %" PRIu64 "\n"
+ " version: %u\n"
+ " augmentation: \"%s\"\n"
+ " code_alignment_factor: %u\n"
+ " data_alignment_factor: %d\n"
+ " return_address_register: %u\n",
+ offset, (uint64_t) unit_length, (uint64_t) cie_id,
+ version, augmentation, code_alignment_factor,
+ data_alignment_factor, return_address_register);
+
+ if (augmentation[0] == 'z')
+ {
+ unsigned int augmentationlen;
+ get_uleb128 (augmentationlen, readp);
+
+ if (augmentationlen > (size_t) (dataend - readp))
+ error (1, 0, gettext ("invalid augmentation length"));
+
+ const char *hdr = "Augmentation data:";
+ const char *cp = augmentation + 1;
+ while (*cp != '\0')
+ {
+ printf (" %-26s%#x ", hdr, *readp);
+ hdr = "";
+
+ if (*cp == 'R')
+ {
+ fde_encoding = *readp++;
+ print_encoding_base (gettext ("FDE address encoding: "),
+ fde_encoding);
+ }
+ else if (*cp == 'L')
+ {
+ lsda_encoding = *readp++;
+ print_encoding_base (gettext ("LSDA pointer encoding: "),
+ lsda_encoding);
+ }
+ else if (*cp == 'P')
+ {
+ /* Personality. This field usually has a relocation
+ attached pointing to __gcc_personality_v0. */
+ const unsigned char *startp = readp;
+ unsigned int encoding = *readp++;
+ uint64_t val = 0;
+ readp = read_encoded (encoding, readp,
+ readp - 1 + augmentationlen,
+ &val, dbg);
+
+ while (++startp < readp)
+ printf ("%#x ", *startp);
+
+ putchar ('(');
+ print_encoding (encoding);
+ putchar (' ');
+ switch (encoding & 0xf)
+ {
+ case DW_EH_PE_sleb128:
+ case DW_EH_PE_sdata2:
+ case DW_EH_PE_sdata4:
+ printf ("%" PRId64 ")\n", val);
+ break;
+ default:
+ printf ("%#" PRIx64 ")\n", val);
+ break;
+ }
+ }
+ else
+ printf ("(%x)\n", *readp++);
+
+ ++cp;
+ }
+ }
+
+ struct cieinfo *newp = alloca (sizeof (*newp));
+ newp->cie_offset = offset;
+ newp->augmentation = augmentation;
+ newp->fde_encoding = fde_encoding;
+ newp->lsda_encoding = lsda_encoding;
+ newp->code_alignment_factor = code_alignment_factor;
+ newp->data_alignment_factor = data_alignment_factor;
+ newp->next = cies;
+ cies = newp;
+ }
+ else
+ {
+ struct cieinfo *cie = cies;
+ while (cie != NULL)
+ if (is_eh_frame
+ ? start - (ptrdiff_t) cie_id == cie->cie_offset
+ : (ptrdiff_t) cie_id == cie->cie_offset)
+ break;
+ else
+ cie = cie->next;
+ if (unlikely (cie == NULL))
+ {
+ puts ("invalid CIE reference in FDE");
+ return;
+ }
+
+ /* Initialize from CIE data. */
+ fde_encoding = cie->fde_encoding;
+ lsda_encoding = cie->lsda_encoding;
+ ptr_size = encoded_ptr_size (fde_encoding, ptr_size);
+ code_alignment_factor = cie->code_alignment_factor;
+ data_alignment_factor = cie->data_alignment_factor;
+
+ const unsigned char *base = readp;
+ // XXX There are sometimes relocations for this value
+ initial_location = read_ubyte_unaligned_inc (ptr_size, dbg, readp);
+ Dwarf_Word address_range
+ = read_ubyte_unaligned_inc (ptr_size, dbg, readp);
+
+ printf ("\n [%6tx] FDE length=%" PRIu64 " cie=[%6tx]\n"
+ " CIE_pointer: %" PRIu64 "\n"
+ " initial_location: %#" PRIx64,
+ offset, (uint64_t) unit_length,
+ cie->cie_offset, (uint64_t) cie_id,
+ (uint64_t) initial_location);
+ if ((fde_encoding & 0x70) == DW_EH_PE_pcrel)
+ {
+ vma_base = (((uint64_t) shdr->sh_offset
+ + (base - (const unsigned char *) data->d_buf)
+ + (uint64_t) initial_location)
+ & (ptr_size == 4
+ ? UINT64_C (0xffffffff)
+ : UINT64_C (0xffffffffffffffff)));
+ printf (gettext (" (offset: %#" PRIx64 ")"),
+ (uint64_t) vma_base);
+ }
+
+ printf ("\n address_range: %#" PRIx64,
+ (uint64_t) address_range);
+ if ((fde_encoding & 0x70) == DW_EH_PE_pcrel)
+ printf (gettext (" (end offset: %#" PRIx64 ")"),
+ ((uint64_t) vma_base + (uint64_t) address_range)
+ & (ptr_size == 4
+ ? UINT64_C (0xffffffff)
+ : UINT64_C (0xffffffffffffffff)));
+ putchar ('\n');
+
+ if (cie->augmentation[0] == 'z')
+ {
+ unsigned int augmentationlen;
+ get_uleb128 (augmentationlen, readp);
+
+ if (augmentationlen > 0)
+ {
+ const char *hdr = "Augmentation data:";
+ const char *cp = cie->augmentation + 1;
+ unsigned int u = 0;
+ while (*cp != '\0')
+ {
+ if (*cp == 'L')
+ {
+ uint64_t lsda_pointer;
+ const unsigned char *p
+ = read_encoded (lsda_encoding, &readp[u],
+ &readp[augmentationlen],
+ &lsda_pointer, dbg);
+ u = p - readp;
+ printf (gettext ("\
+ %-26sLSDA pointer: %#" PRIx64 "\n"),
+ hdr, lsda_pointer);
+ hdr = "";
+ }
+ ++cp;
+ }
+
+ while (u < augmentationlen)
+ {
+ printf (" %-26s%#x\n", hdr, readp[u++]);
+ hdr = "";
+ }
+ }
+
+ readp += augmentationlen;
+ }
+ }
+
+ /* Handle the initialization instructions. */
+ print_cfa_program (readp, cieend, vma_base, code_alignment_factor,
+ data_alignment_factor, ptr_size, dwflmod, ebl, dbg);
+ readp = cieend;
+ }
}
@@ -4020,6 +5111,7 @@ struct attrcb_args
Dwarf *dbg;
int level;
unsigned int addrsize;
+ unsigned int offset_size;
Dwarf_Off cu_offset;
};
@@ -4103,8 +5195,20 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
const char *valuestr = NULL;
switch (attr)
{
- case DW_AT_location:
+ /* This case can take either a constant or a loclistptr. */
case DW_AT_data_member_location:
+ if (form != DW_FORM_data4 && form != DW_FORM_data8)
+ {
+ printf (" %*s%-20s %" PRIxMAX "\n",
+ (int) (level * 2), "", dwarf_attr_string (attr),
+ (uintmax_t) num);
+ return DWARF_CB_OK;
+ }
+ /* else fallthrough */
+
+ /* These cases always take a loclistptr and no constant. */
+ case DW_AT_location:
+ case DW_AT_data_location:
case DW_AT_vtable_elem_location:
case DW_AT_string_length:
case DW_AT_use_location:
@@ -4185,13 +5289,13 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
if (unlikely (dwarf_formblock (attrp, &block) != 0))
goto attrval_out;
- printf (" %*s%-20s %" PRIxMAX " byte block\n",
- (int) (level * 2), "", dwarf_attr_string (attr),
- (uintmax_t) block.length);
+ printf (" %*s%-20s ",
+ (int) (level * 2), "", dwarf_attr_string (attr));
switch (attr)
{
case DW_AT_location:
+ case DW_AT_data_location:
case DW_AT_data_member_location:
case DW_AT_vtable_elem_location:
case DW_AT_string_length:
@@ -4199,9 +5303,24 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
case DW_AT_frame_base:
case DW_AT_return_addr:
case DW_AT_static_link:
+ case DW_AT_allocated:
+ case DW_AT_associated:
+ case DW_AT_bit_size:
+ case DW_AT_bit_offset:
+ case DW_AT_bit_stride:
+ case DW_AT_byte_size:
+ case DW_AT_byte_stride:
+ case DW_AT_count:
+ case DW_AT_lower_bound:
+ case DW_AT_upper_bound:
print_ops (cbargs->dwflmod, cbargs->dbg,
12 + level * 2, 12 + level * 2,
- cbargs->addrsize, block.length, block.data);
+ cbargs->addrsize, cbargs->offset_size,
+ block.length, block.data);
+ break;
+
+ default:
+ print_block (block.length, block.data);
break;
}
break;
@@ -4221,12 +5340,12 @@ static void
print_debug_info_section (Dwfl_Module *dwflmod,
Ebl *ebl __attribute__ ((unused)),
GElf_Ehdr *ehdr __attribute__ ((unused)),
- Elf_Scn *scn __attribute__ ((unused)),
+ Elf_Scn *scn,
GElf_Shdr *shdr, Dwarf *dbg)
{
printf (gettext ("\
-\nDWARF section '%s' at offset %#" PRIx64 ":\n [Offset]\n"),
- ".debug_info", (uint64_t) shdr->sh_offset);
+\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n [Offset]\n"),
+ elf_ndxscn (scn), ".debug_info", (uint64_t) shdr->sh_offset);
/* If the section is empty we don't have to do anything. */
if (shdr->sh_size == 0)
@@ -4255,11 +5374,14 @@ print_debug_info_section (Dwfl_Module *dwflmod,
(uint64_t) offset, /*version*/2, abbroffset, addrsize, offsize);
- struct attrcb_args args;
- args.dwflmod = dwflmod;
- args.dbg = dbg;
- args.addrsize = addrsize;
- args.cu_offset = offset;
+ struct attrcb_args args =
+ {
+ .dwflmod = dwflmod,
+ .dbg = dbg,
+ .addrsize = addrsize,
+ .offset_size = offsize,
+ .cu_offset = offset
+ };
offset += cuhl;
@@ -4276,7 +5398,7 @@ print_debug_info_section (Dwfl_Module *dwflmod,
do
{
offset = dwarf_dieoffset (&dies[level]);
- if (offset == ~0ul)
+ if (unlikely (offset == ~0ul))
{
error (0, 0, gettext ("cannot get DIE offset: %s"),
dwarf_errmsg (-1));
@@ -4284,7 +5406,7 @@ print_debug_info_section (Dwfl_Module *dwflmod,
}
int tag = dwarf_tag (&dies[level]);
- if (tag == DW_TAG_invalid)
+ if (unlikely (tag == DW_TAG_invalid))
{
error (0, 0, gettext ("cannot get tag of DIE at offset %" PRIu64
" in section '%s': %s"),
@@ -4313,7 +5435,7 @@ print_debug_info_section (Dwfl_Module *dwflmod,
if (level-- == 0)
break;
- if (res == -1)
+ if (unlikely (res == -1))
{
error (0, 0, gettext ("cannot get next DIE: %s\n"),
dwarf_errmsg (-1));
@@ -4346,8 +5468,8 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl,
Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
{
printf (gettext ("\
-\nDWARF section '%s' at offset %#" PRIx64 ":\n"),
- ".debug_line", (uint64_t) shdr->sh_offset);
+\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
+ elf_ndxscn (scn), ".debug_line", (uint64_t) shdr->sh_offset);
if (shdr->sh_size == 0)
return;
@@ -4355,7 +5477,7 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl,
/* 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);
- if (data == NULL || data->d_buf == NULL)
+ if (unlikely (data == NULL || data->d_buf == NULL))
{
error (0, 0, gettext ("cannot get line data section data: %s"),
elf_errmsg (-1));
@@ -4468,7 +5590,7 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl,
while (*linep != 0)
{
unsigned char *endp = memchr (linep, '\0', lineendp - linep);
- if (endp == NULL)
+ if (unlikely (endp == NULL))
goto invalid_unit;
printf (" %s\n", (char *) linep);
@@ -4487,7 +5609,7 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl,
/* First comes the file name. */
char *fname = (char *) linep;
unsigned char *endp = memchr (fname, '\0', lineendp - linep);
- if (endp == NULL)
+ if (unlikely (endp == NULL))
goto invalid_unit;
linep = endp + 1;
@@ -4620,7 +5742,7 @@ print_debug_line_section (Dwfl_Module *dwflmod, Ebl *ebl,
char *fname = (char *) linep;
unsigned char *endp = memchr (linep, '\0',
lineendp - linep);
- if (endp == NULL)
+ if (unlikely (endp == NULL))
goto invalid_unit;
linep = endp + 1;
@@ -4778,15 +5900,12 @@ advance address by fixed value %u to %s\n"),
static void
print_debug_loc_section (Dwfl_Module *dwflmod,
- Ebl *ebl __attribute__ ((unused)),
- GElf_Ehdr *ehdr __attribute__ ((unused)),
- Elf_Scn *scn __attribute__ ((unused)),
- GElf_Shdr *shdr,
- Dwarf *dbg __attribute__ ((unused)))
+ Ebl *ebl __attribute__ ((unused)), GElf_Ehdr *ehdr,
+ Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
{
Elf_Data *data = elf_rawdata (scn, NULL);
- if (data == NULL)
+ if (unlikely (data == NULL))
{
error (0, 0, gettext ("cannot get .debug_loc content: %s"),
elf_errmsg (-1));
@@ -4794,18 +5913,22 @@ print_debug_loc_section (Dwfl_Module *dwflmod,
}
printf (gettext ("\
-\nDWARF section '%s' at offset %#" PRIx64 ":\n"),
- ".debug_loc", (uint64_t) shdr->sh_offset);
+\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
+ elf_ndxscn (scn), ".debug_loc", (uint64_t) shdr->sh_offset);
size_t address_size = ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 4 : 8;
+ /* XXX This is wrong! We can only know the right size given the CU that
+ points to this location list. */
+ size_t offset_size = 4;
+
bool first = true;
unsigned char *readp = data->d_buf;
while (readp < (unsigned char *) data->d_buf + data->d_size)
{
ptrdiff_t offset = readp - (unsigned char *) data->d_buf;
- if (data->d_size - offset < address_size * 2)
+ if (unlikely (data->d_size - offset < address_size * 2))
{
printf (gettext (" [%6tx] <INVALID DATA>\n"), offset);
break;
@@ -4851,7 +5974,7 @@ print_debug_loc_section (Dwfl_Module *dwflmod,
free (e);
print_ops (dwflmod, dbg, 1, 18 + (address_size * 4),
- address_size, len, readp);
+ address_size, offset_size, len, readp);
first = false;
readp += len;
@@ -4889,14 +6012,14 @@ print_debug_macinfo_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
{
printf (gettext ("\
-\nDWARF section '%s' at offset %#" PRIx64 ":\n"),
- ".debug_macinfo", (uint64_t) shdr->sh_offset);
+\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
+ elf_ndxscn (scn), ".debug_macinfo", (uint64_t) shdr->sh_offset);
putc_unlocked ('\n', stdout);
/* 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);
- if (data == NULL || data->d_buf == NULL)
+ if (unlikely (data == NULL || data->d_buf == NULL))
{
error (0, 0, gettext ("cannot get macro information section data: %s"),
elf_errmsg (-1));
@@ -4975,7 +6098,7 @@ print_debug_macinfo_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
get_uleb128 (u128, readp);
endp = memchr (readp, '\0', readendp - readp);
- if (endp == NULL)
+ if (unlikely (endp == NULL))
{
printf (gettext ("\
%*s*** non-terminated string at end of section"),
@@ -5030,7 +6153,7 @@ print_debug_macinfo_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
default:
// XXX gcc seems to generate files with a trailing zero.
- if (opcode != 0 || readp != readendp)
+ if (unlikely (opcode != 0 || readp != readendp))
printf ("%*s*** invalid opcode %u\n", level, "", opcode);
break;
}
@@ -5058,11 +6181,10 @@ static void
print_debug_pubnames_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
Ebl *ebl __attribute__ ((unused)),
GElf_Ehdr *ehdr __attribute__ ((unused)),
- Elf_Scn *scn __attribute__ ((unused)),
- GElf_Shdr *shdr, Dwarf *dbg)
+ Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
{
- printf (gettext ("\nDWARF section '%s' at offset %#" PRIx64 ":\n"),
- ".debug_pubnames", (uint64_t) shdr->sh_offset);
+ printf (gettext ("\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"),
+ elf_ndxscn (scn), ".debug_pubnames", (uint64_t) shdr->sh_offset);
int n = 0;
(void) dwarf_getpubnames (dbg, print_pubnames, &n, 0);
@@ -5073,8 +6195,7 @@ static void
print_debug_str_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
Ebl *ebl __attribute__ ((unused)),
GElf_Ehdr *ehdr __attribute__ ((unused)),
- Elf_Scn *scn __attribute__ ((unused)),
- GElf_Shdr *shdr, Dwarf *dbg)
+ Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
{
/* Compute floor(log16(shdr->sh_size)). */
GElf_Addr tmp = shdr->sh_size;
@@ -5086,8 +6207,9 @@ print_debug_str_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
}
digits = MAX (4, digits);
- printf (gettext ("\nDWARF section '%s' at offset %#" PRIx64 ":\n"
+ printf (gettext ("\nDWARF section [%2zu] '%s' at offset %#" PRIx64 ":\n"
" %*s String\n"),
+ elf_ndxscn (scn),
".debug_str", (uint64_t) shdr->sh_offset,
/* TRANS: the debugstr| prefix makes the string unique. */
digits + 2, sgettext ("debugstr|Offset"));
@@ -5097,7 +6219,7 @@ print_debug_str_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
{
size_t len;
const char *str = dwarf_getstring (dbg, offset, &len);
- if (str == NULL)
+ if (unlikely (str == NULL))
{
printf (gettext (" *** error while reading strings: %s\n"),
dwarf_errmsg (-1));
@@ -5110,6 +6232,268 @@ print_debug_str_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
}
}
+
+/* Print the content of the call frame search table section
+ '.eh_frame_hdr'. */
+static void
+print_debug_frame_hdr_section (Dwfl_Module *dwflmod __attribute__ ((unused)),
+ Ebl *ebl __attribute__ ((unused)),
+ GElf_Ehdr *ehdr __attribute__ ((unused)),
+ Elf_Scn *scn, GElf_Shdr *shdr, Dwarf *dbg)
+{
+ printf (gettext ("\
+\nCall frame search table section [%2zu] '.eh_frame_hdr':\n"),
+ elf_ndxscn (scn));
+
+ Elf_Data *data = elf_rawdata (scn, NULL);
+
+ if (unlikely (data == NULL))
+ {
+ error (0, 0, gettext ("cannot get %s content: %s"),
+ ".eh_frame_hdr", elf_errmsg (-1));
+ return;
+ }
+
+ const unsigned char *readp = data->d_buf;
+ const unsigned char *const dataend = ((unsigned char *) data->d_buf
+ + data->d_size);
+
+ if (unlikely (readp + 4 > dataend))
+ {
+ invalid_data:
+ error (0, 0, gettext ("invalid data"));
+ return;
+ }
+
+ unsigned int version = *readp++;
+ unsigned int eh_frame_ptr_enc = *readp++;
+ unsigned int fde_count_enc = *readp++;
+ unsigned int table_enc = *readp++;
+
+ printf (" version: %u\n"
+ " eh_frame_ptr_enc: %#x ",
+ version, eh_frame_ptr_enc);
+ print_encoding_base ("", eh_frame_ptr_enc);
+ printf (" fde_count_enc: %#x ", fde_count_enc);
+ print_encoding_base ("", fde_count_enc);
+ printf (" table_enc: %#x ", table_enc);
+ print_encoding_base ("", table_enc);
+
+ uint64_t eh_frame_ptr = 0;
+ if (eh_frame_ptr_enc != DW_EH_PE_omit)
+ {
+ readp = read_encoded (eh_frame_ptr_enc, readp, dataend, &eh_frame_ptr,
+ dbg);
+ if (unlikely (readp == NULL))
+ goto invalid_data;
+
+ printf (" eh_frame_ptr: %#" PRIx64, eh_frame_ptr);
+ if ((eh_frame_ptr_enc & 0x70) == DW_EH_PE_pcrel)
+ printf (" (offset: %#" PRIx64 ")",
+ /* +4 because of the 4 byte header of the section. */
+ (uint64_t) shdr->sh_offset + 4 + eh_frame_ptr);
+
+ putchar_unlocked ('\n');
+ }
+
+ uint64_t fde_count = 0;
+ if (fde_count_enc != DW_EH_PE_omit)
+ {
+ readp = read_encoded (fde_count_enc, readp, dataend, &fde_count, dbg);
+ if (unlikely (readp == NULL))
+ goto invalid_data;
+
+ printf (" fde_count: %" PRIu64 "\n", fde_count);
+ }
+
+ if (fde_count == 0 || table_enc == DW_EH_PE_omit)
+ return;
+
+ puts (" Table:");
+
+ /* Optimize for the most common case. */
+ if (table_enc == (DW_EH_PE_datarel | DW_EH_PE_sdata4))
+ while (fde_count > 0 && readp + 8 <= dataend)
+ {
+ int32_t initial_location = read_4sbyte_unaligned_inc (dbg, readp);
+ uint64_t initial_offset = ((uint64_t) shdr->sh_offset
+ + (int64_t) initial_location);
+ int32_t address = read_4sbyte_unaligned_inc (dbg, readp);
+ // XXX Possibly print symbol name or section offset for initial_offset
+ printf (" %#" PRIx32 " (offset: %#6" PRIx64 ") -> %#" PRIx32
+ " fde=[%6" PRIx64 "]\n",
+ initial_location, initial_offset,
+ address, address - (eh_frame_ptr + 4));
+ }
+ else
+ while (0 && readp < dataend)
+ {
+
+ }
+}
+
+
+/* Print the content of the exception handling table section
+ '.eh_frame_hdr'. */
+static void
+print_debug_exception_table (Dwfl_Module *dwflmod __attribute__ ((unused)),
+ Ebl *ebl __attribute__ ((unused)),
+ GElf_Ehdr *ehdr __attribute__ ((unused)),
+ Elf_Scn *scn,
+ GElf_Shdr *shdr __attribute__ ((unused)),
+ Dwarf *dbg __attribute__ ((unused)))
+{
+ printf (gettext ("\
+\nException handling table section [%2zu] '.gcc_except_table':\n"),
+ elf_ndxscn (scn));
+
+ Elf_Data *data = elf_rawdata (scn, NULL);
+
+ if (unlikely (data == NULL))
+ {
+ error (0, 0, gettext ("cannot get %s content: %s"),
+ ".gcc_except_table", elf_errmsg (-1));
+ return;
+ }
+
+ const unsigned char *readp = data->d_buf;
+ const unsigned char *const dataend = readp + data->d_size;
+
+ if (unlikely (readp + 1 > dataend))
+ {
+ invalid_data:
+ error (0, 0, gettext ("invalid data"));
+ return;
+ }
+ unsigned int lpstart_encoding = *readp++;
+ printf (gettext (" LPStart encoding: %#x "), lpstart_encoding);
+ print_encoding_base ("", lpstart_encoding);
+ if (lpstart_encoding != DW_EH_PE_omit)
+ {
+ uint64_t lpstart;
+ readp = read_encoded (lpstart_encoding, readp, dataend, &lpstart, dbg);
+ printf (" LPStart: %#" PRIx64 "\n", lpstart);
+ }
+
+ if (unlikely (readp + 1 > dataend))
+ goto invalid_data;
+ unsigned int ttype_encoding = *readp++;
+ printf (gettext (" TType encoding: %#x "), ttype_encoding);
+ print_encoding_base ("", ttype_encoding);
+ const unsigned char *ttype_base = NULL;
+ if (ttype_encoding != DW_EH_PE_omit)
+ {
+ unsigned int ttype_base_offset;
+ get_uleb128 (ttype_base_offset, readp);
+ printf (" TType base offset: %#x\n", ttype_base_offset);
+ ttype_base = readp + ttype_base_offset;
+ }
+
+ if (unlikely (readp + 1 > dataend))
+ goto invalid_data;
+ unsigned int call_site_encoding = *readp++;
+ printf (gettext (" Call site encoding: %#x "), call_site_encoding);
+ print_encoding_base ("", call_site_encoding);
+ unsigned int call_site_table_len;
+ get_uleb128 (call_site_table_len, readp);
+
+ const unsigned char *const action_table = readp + call_site_table_len;
+ if (unlikely (action_table > dataend))
+ goto invalid_data;
+ unsigned int u = 0;
+ unsigned int max_action = 0;
+ while (readp < action_table)
+ {
+ if (u == 0)
+ puts (gettext ("\n Call site table:"));
+
+ uint64_t call_site_start;
+ readp = read_encoded (call_site_encoding, readp, dataend,
+ &call_site_start, dbg);
+ uint64_t call_site_length;
+ readp = read_encoded (call_site_encoding, readp, dataend,
+ &call_site_length, dbg);
+ uint64_t landing_pad;
+ readp = read_encoded (call_site_encoding, readp, dataend,
+ &landing_pad, dbg);
+ unsigned int action;
+ get_uleb128 (action, readp);
+ max_action = MAX (action, max_action);
+ printf (gettext (" [%4u] Call site start: %#" PRIx64 "\n"
+ " Call site length: %" PRIu64 "\n"
+ " Landing pad: %#" PRIx64 "\n"
+ " Action: %u\n"),
+ u++, call_site_start, call_site_length, landing_pad, action);
+ }
+ assert (readp == action_table);
+
+ unsigned int max_ar_filter = 0;
+ if (max_action > 0)
+ {
+ puts ("\n Action table:");
+
+ const unsigned char *const action_table_end
+ = action_table + max_action + 1;
+
+ u = 0;
+ do
+ {
+ int ar_filter;
+ get_sleb128 (ar_filter, readp);
+ if (ar_filter > 0 && (unsigned int) ar_filter > max_ar_filter)
+ max_ar_filter = ar_filter;
+ int ar_disp;
+ get_sleb128 (ar_disp, readp);
+
+ printf (" [%4u] ar_filter: % d\n"
+ " ar_disp: % -5d",
+ u, ar_filter, ar_disp);
+ if (abs (ar_disp) & 1)
+ printf (" -> [%4u]\n", u + (ar_disp + 1) / 2);
+ else if (ar_disp != 0)
+ puts (" -> ???");
+ else
+ putchar_unlocked ('\n');
+ ++u;
+ }
+ while (readp < action_table_end);
+ }
+
+ if (max_ar_filter > 0)
+ {
+ puts ("\n TType table:");
+
+ // XXX Not *4, size of encoding;
+ switch (ttype_encoding & 7)
+ {
+ case DW_EH_PE_udata2:
+ case DW_EH_PE_sdata2:
+ readp = ttype_base - max_ar_filter * 2;
+ break;
+ case DW_EH_PE_udata4:
+ case DW_EH_PE_sdata4:
+ readp = ttype_base - max_ar_filter * 4;
+ break;
+ case DW_EH_PE_udata8:
+ case DW_EH_PE_sdata8:
+ readp = ttype_base - max_ar_filter * 8;
+ break;
+ default:
+ error (1, 0, gettext ("invalid TType encoding"));
+ }
+
+ do
+ {
+ uint64_t ttype;
+ readp = read_encoded (ttype_encoding, readp, ttype_base, &ttype,
+ dbg);
+ printf (" [%4u] %#" PRIx64 "\n", max_ar_filter--, ttype);
+ }
+ while (readp < ttype_base);
+ }
+}
+
+
static void
print_debug (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr)
{
@@ -5118,14 +6502,15 @@ print_debug (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr)
Dwarf *dbg = dwfl_module_getdwarf (dwflmod, &dwbias);
if (dbg == NULL)
{
- error (0, 0, gettext ("cannot get debug context descriptor: %s"),
- dwfl_errmsg (-1));
+ if (print_debug_sections != 0)
+ error (0, 0, gettext ("cannot get debug context descriptor: %s"),
+ dwfl_errmsg (-1));
return;
}
/* Get the section header string table index. */
size_t shstrndx;
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -5158,7 +6543,12 @@ print_debug (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr)
NEW_SECTION (str),
NEW_SECTION (macinfo),
NEW_SECTION (ranges),
- { ".eh_frame", section_frame, print_debug_frame_section }
+ { ".eh_frame", section_frame | section_exception,
+ print_debug_frame_section },
+ { ".eh_frame_hdr", section_frame | section_exception,
+ print_debug_frame_hdr_section },
+ { ".gcc_except_table", section_frame | section_exception,
+ print_debug_exception_table }
};
const int ndebug_sections = (sizeof (debug_sections)
/ sizeof (debug_sections[0]));
@@ -5169,7 +6559,8 @@ print_debug (Dwfl_Module *dwflmod, Ebl *ebl, GElf_Ehdr *ehdr)
for (n = 0; n < ndebug_sections; ++n)
if (strcmp (name, debug_sections[n].name) == 0)
{
- if (print_debug_sections & debug_sections[n].bitmask)
+ if ((print_debug_sections | implicit_debug_sections)
+ & debug_sections[n].bitmask)
debug_sections[n].fp (dwflmod, ebl, ehdr, scn, shdr, dbg);
break;
}
@@ -5226,13 +6617,13 @@ print_core_item (unsigned int colno, char sep, unsigned int wrap,
static const void *
convert (Elf *core, Elf_Type type, uint_fast16_t count,
- void *value, const void *data)
+ void *value, const void *data, size_t size)
{
Elf_Data valuedata =
{
.d_type = type,
.d_buf = value,
- .d_size = gelf_fsize (core, type, count, EV_CURRENT),
+ .d_size = size ?: gelf_fsize (core, type, count, EV_CURRENT),
.d_version = EV_CURRENT,
};
Elf_Data indata =
@@ -5257,7 +6648,7 @@ typedef uint8_t GElf_Byte;
static unsigned int
handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc,
- unsigned int colno)
+ unsigned int colno, size_t *repeated_size)
{
uint_fast16_t count = item->count ?: 1;
@@ -5273,13 +6664,33 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc,
union { TYPES; } value;
#undef DO_TYPE
- desc = convert (core, item->type, count, &value, desc + item->offset);
+ void *data = &value;
+ size_t size = gelf_fsize (core, item->type, count, EV_CURRENT);
+ size_t convsize = size;
+ if (repeated_size != NULL)
+ {
+ if (*repeated_size > size && (item->format == 'b' || item->format == 'B'))
+ {
+ data = alloca (*repeated_size);
+ count *= *repeated_size / size;
+ convsize = count * size;
+ *repeated_size -= convsize;
+ }
+ else if (item->count != 0 || item->format != '\n')
+ *repeated_size -= size;
+ }
+
+ convert (core, item->type, count, data, desc + item->offset, convsize);
+
+ Elf_Type type = item->type;
+ if (type == ELF_T_ADDR)
+ type = gelf_getclass (core) == ELFCLASS32 ? ELF_T_WORD : ELF_T_XWORD;
switch (item->format)
{
case 'd':
assert (count == 1);
- switch (item->type)
+ switch (type)
{
#define DO_TYPE(NAME, Name, hex, dec, max) \
case ELF_T_##NAME: \
@@ -5295,7 +6706,7 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc,
case 'x':
assert (count == 1);
- switch (item->type)
+ switch (type)
{
#define DO_TYPE(NAME, Name, hex, dec, max) \
case ELF_T_##NAME: \
@@ -5310,30 +6721,68 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc,
break;
case 'b':
- assert (count == 1);
- Dwarf_Word bits = 0;
- Dwarf_Word bit = 0;
- switch (item->type)
- {
-#define DO_TYPE(NAME, Name, hex, dec, max) \
- case ELF_T_##NAME: \
- bits = value.Name[0]; \
- bit = (Dwarf_Word) 1 << ((sizeof value.Name[0] * 8) - 1); \
- break
- TYPES;
-#undef DO_TYPE
- default:
- abort ();
- }
- char printed[sizeof (Dwarf_Word) * 8 + 1];
- int i = 0;
- while (bit != 0)
- {
- printed[i++] = (bits & bit) ? '1' : '0';
- bit >>= 1;
- }
- colno = print_core_item (colno, ',', ITEM_WRAP_COLUMN, 0, item->name,
- sizeof printed - 1, "%.*s", i, printed);
+ case 'B':
+ assert (size % sizeof (unsigned int) == 0);
+ unsigned int nbits = count * size * 8;
+ unsigned int pop = 0;
+ for (const unsigned int *i = data; (void *) i < data + count * size; ++i)
+ pop += __builtin_popcount (*i);
+ bool negate = pop > nbits / 2;
+ const unsigned int bias = item->format == 'b';
+
+ {
+ char printed[(negate ? nbits - pop : pop) * 16];
+ char *p = printed;
+ *p = '\0';
+
+ if (BYTE_ORDER != LITTLE_ENDIAN && size > sizeof (unsigned int))
+ {
+ assert (size == sizeof (unsigned int) * 2);
+ for (unsigned int *i = data;
+ (void *) i < data + count * size; i += 2)
+ {
+ unsigned int w = i[1];
+ i[1] = i[0];
+ i[0] = w;
+ }
+ }
+
+ unsigned int lastbit = 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)
+ ++run;
+ else
+ {
+ if (lastbit == 0)
+ p += sprintf (p, "%u", bit - bias);
+ else if (run == 0)
+ p += sprintf (p, ",%u", bit - bias);
+ else
+ p += sprintf (p, "-%u,%u", lastbit - bias, bit - bias);
+ run = 0;
+ }
+
+ lastbit = bit;
+ }
+ }
+ if (lastbit > 0 && lastbit + 1 != nbits)
+ p += sprintf (p, "-%u", nbits - bias);
+
+ colno = print_core_item (colno, ',', ITEM_WRAP_COLUMN, 0, item->name,
+ 4 + nbits * 4,
+ negate ? "~<%s>" : "<%s>", printed);
+ }
break;
case 'T':
@@ -5342,7 +6791,7 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc,
Dwarf_Word sec;
Dwarf_Word usec;
size_t maxfmt = 7;
- switch (item->type)
+ switch (type)
{
#define DO_TYPE(NAME, Name, hex, dec, max) \
case ELF_T_##NAME: \
@@ -5386,6 +6835,33 @@ handle_core_item (Elf *core, const Ebl_Core_Item *item, const void *desc,
count, "%.*s", (int) count, value.Byte);
break;
+ case '\n':
+ /* This is a list of strings separated by '\n'. */
+ assert (item->count == 0);
+ assert (repeated_size != NULL);
+ assert (item->name == NULL);
+ if (unlikely (item->offset >= *repeated_size))
+ break;
+
+ const char *s = desc + item->offset;
+ size = *repeated_size - item->offset;
+ *repeated_size = 0;
+ while (size > 0)
+ {
+ const char *eol = memchr (s, '\n', size);
+ int len = size;
+ if (eol != NULL)
+ len = eol - s;
+ printf ("%*s%.*s\n", ITEM_INDENT, "", len, s);
+ if (eol == NULL)
+ break;
+ size -= eol + 1 - s;
+ s = eol + 1;
+ }
+
+ colno = ITEM_WRAP_COLUMN;
+ break;
+
default:
error (0, 0, "XXX not handling format '%c' for %s",
item->format, item->name);
@@ -5427,7 +6903,7 @@ compare_core_item_groups (const void *a, const void *b)
}
static unsigned int
-handle_core_items (Elf *core, const void *desc,
+handle_core_items (Elf *core, const void *desc, size_t descsz,
const Ebl_Core_Item *items, size_t nitems)
{
if (nitems == 0)
@@ -5451,18 +6927,65 @@ handle_core_items (Elf *core, const void *desc,
/* Write out all the groups. */
unsigned int colno = 0;
- for (size_t i = 0; i < ngroups; ++i)
+
+ const void *last = desc;
+ if (nitems == 1)
{
- for (const Ebl_Core_Item **item = groups[i];
- (item < &sorted_items[nitems]
- && ((*item)->group == groups[i][0]->group
- || !strcmp ((*item)->group, groups[i][0]->group)));
- ++item)
- colno = handle_core_item (core, *item, desc, colno);
+ 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;
+ }
- /* Force a line break at the end of the group. */
- colno = ITEM_WRAP_COLUMN;
+ do
+ {
+ for (size_t i = 0; i < ngroups; ++i)
+ {
+ for (const Ebl_Core_Item **item = groups[i];
+ (item < &sorted_items[nitems]
+ && ((*item)->group == groups[i][0]->group
+ || !strcmp ((*item)->group, groups[i][0]->group)));
+ ++item)
+ colno = handle_core_item (core, *item, desc, colno, NULL);
+
+ /* Force a line break at the end of the group. */
+ colno = ITEM_WRAP_COLUMN;
+ }
+
+ if (descsz == 0)
+ break;
+
+ /* This set of items consumed a certain amount of the note's data.
+ If there is more data there, we have another unit of the same size.
+ Loop to print that out too. */
+ const Ebl_Core_Item *item = &items[nitems - 1];
+ size_t eltsz = item->offset + gelf_fsize (core, item->type,
+ item->count ?: 1, EV_CURRENT);
+
+ int reps = -1;
+ do
+ {
+ ++reps;
+ desc += eltsz;
+ descsz -= eltsz;
+ }
+ while (descsz >= eltsz && !memcmp (desc, last, eltsz));
+
+ if (reps == 1)
+ {
+ /* For just one repeat, print it unabridged twice. */
+ desc -= eltsz;
+ descsz += eltsz;
+ }
+ else if (reps > 1)
+ printf (gettext ("\n%*s... <repeats %u more times> ..."),
+ ITEM_INDENT, "", reps);
+
+ last = desc;
}
+ while (descsz > 0);
return colno;
}
@@ -5490,17 +7013,10 @@ handle_core_register (Ebl *ebl, Elf *core, int maxregname,
for (int reg = regloc->regno; reg < regloc->regno + regloc->count; ++reg)
{
- const char *pfx;
- const char *set;
- char name[16];
+ char name[REGNAMESZ];
int bits;
int type;
- ssize_t n = ebl_register_info (ebl, reg, name, sizeof name,
- &pfx, &set, &bits, &type);
- if (n <= 0)
- error (EXIT_FAILURE, 0,
- gettext ("unable to handle register number %d"),
- regloc->regno);
+ register_info (ebl, reg, regloc, name, &bits, &type);
#define TYPES \
BITS (8, BYTE, "%4" PRId8, "0x%.2" PRIx8, 4); \
@@ -5522,7 +7038,7 @@ handle_core_register (Ebl *ebl, Elf *core, int maxregname,
{
#define BITS(bits, xtype, sfmt, ufmt, max) \
case bits: \
- desc = convert (core, ELF_T_##xtype, 1, &value, desc); \
+ desc = convert (core, ELF_T_##xtype, 1, &value, desc, 0); \
if (type == DW_ATE_signed) \
colno = print_core_item (colno, ' ', REGISTER_WRAP_COLUMN, \
maxregname, name, \
@@ -5537,7 +7053,7 @@ handle_core_register (Ebl *ebl, Elf *core, int maxregname,
case 128:
assert (type == DW_ATE_unsigned);
- desc = convert (core, ELF_T_XWORD, 2, &value, desc);
+ 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,
maxregname, name,
@@ -5588,10 +7104,10 @@ struct register_info
{
const Ebl_Register_Location *regloc;
const char *set;
- char name[16];
- Dwarf_Half regno;
- uint8_t bits;
- uint8_t type;
+ char name[REGNAMESZ];
+ int regno;
+ int bits;
+ int type;
};
static int
@@ -5645,8 +7161,12 @@ handle_core_registers (Ebl *ebl, Elf *core, const void *desc,
ssize_t maxnreg = ebl_register_info (ebl, 0, NULL, 0, NULL, NULL, NULL, NULL);
if (maxnreg <= 0)
- error (EXIT_FAILURE, 0,
- gettext ("cannot register info: %s"), elf_errmsg (-1));
+ {
+ for (size_t i = 0; i < nregloc; ++i)
+ if (maxnreg < reglocs[i].regno + reglocs[i].count)
+ maxnreg = reglocs[i].regno + reglocs[i].count;
+ assert (maxnreg > 0);
+ }
struct register_info regs[maxnreg];
memset (regs, 0, sizeof regs);
@@ -5662,20 +7182,10 @@ handle_core_registers (Ebl *ebl, Elf *core, const void *desc,
if (reg > maxreg)
maxreg = reg;
struct register_info *info = &regs[reg];
-
- const char *pfx;
- int bits;
- int type;
- ssize_t n = ebl_register_info (ebl, reg, info->name, sizeof info->name,
- &pfx, &info->set, &bits, &type);
- if (n <= 0)
- error (EXIT_FAILURE, 0,
- gettext ("cannot register info: %s"), elf_errmsg (-1));
-
info->regloc = &reglocs[i];
info->regno = reg;
- info->bits = bits;
- info->type = type;
+ info->set = register_info (ebl, reg, &reglocs[i],
+ info->name, &info->bits, &info->type);
}
qsort (regs, maxreg + 1, sizeof regs[0], &compare_registers);
@@ -5796,7 +7306,8 @@ handle_auxv_note (Ebl *ebl, Elf *core, GElf_Word descsz, GElf_Off desc_pos)
}
static void
-handle_core_note (Ebl *ebl, const GElf_Nhdr *nhdr, const void *desc)
+handle_core_note (Ebl *ebl, const GElf_Nhdr *nhdr,
+ const char *name, const void *desc)
{
GElf_Word regs_offset;
size_t nregloc;
@@ -5804,11 +7315,17 @@ handle_core_note (Ebl *ebl, const GElf_Nhdr *nhdr, const void *desc)
size_t nitems;
const Ebl_Core_Item *items;
- if (! ebl_core_note (ebl, nhdr->n_type, nhdr->n_descsz,
+ if (! ebl_core_note (ebl, nhdr, name,
&regs_offset, &nregloc, &reglocs, &nitems, &items))
return;
- unsigned int colno = handle_core_items (ebl->elf, desc, items, nitems);
+ /* Pass 0 for DESCSZ when there are registers in the note,
+ so that the ITEMS array does not describe the whole thing.
+ For non-register notes, the actual descsz might be a multiple
+ of the unit size, not just exactly the unit size. */
+ unsigned int colno = handle_core_items (ebl->elf, desc,
+ nregloc == 0 ? nhdr->n_descsz : 0,
+ items, nitems);
if (colno != 0)
putchar_unlocked ('\n');
@@ -5855,11 +7372,14 @@ handle_notes_data (Ebl *ebl, const GElf_Ehdr *ehdr,
{
if (ehdr->e_type == ET_CORE)
{
- if (nhdr.n_type == NT_AUXV)
+ if (nhdr.n_type == NT_AUXV
+ && (nhdr.n_namesz == 4 /* Broken old Linux kernels. */
+ || (nhdr.n_namesz == 5 && name[4] == '\0'))
+ && !memcmp (name, "CORE", 4))
handle_auxv_note (ebl, ebl->elf, nhdr.n_descsz,
start + desc_offset);
else
- handle_core_note (ebl, &nhdr, desc);
+ handle_core_note (ebl, &nhdr, name, desc);
}
else
ebl_object_note (ebl, name, nhdr.n_type, nhdr.n_descsz, desc);
@@ -5884,7 +7404,7 @@ handle_notes (Ebl *ebl, GElf_Ehdr *ehdr)
{
/* Get the section header string table index. */
size_t shstrndx;
- if (elf_getshstrndx (ebl->elf, &shstrndx) < 0)
+ if (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0)
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -5912,7 +7432,7 @@ handle_notes (Ebl *ebl, GElf_Ehdr *ehdr)
/* We have to look through the program header to find the note
sections. There can be more than one. */
- for (size_t cnt = 0; cnt < ehdr->e_phnum; ++cnt)
+ for (size_t cnt = 0; cnt < phnum; ++cnt)
{
GElf_Phdr mem;
GElf_Phdr *phdr = gelf_getphdr (ebl->elf, cnt, &mem);
@@ -5989,36 +7509,38 @@ dump_data_section (Elf_Scn *scn, const GElf_Shdr *shdr, const char *name)
static void
print_string_section (Elf_Scn *scn, const GElf_Shdr *shdr, const char *name)
{
- if (shdr->sh_size == 0)
- printf (gettext ("\nSection [%Zu] '%s' is empty.\n"),
+ if (shdr->sh_size == 0 || shdr->sh_type == SHT_NOBITS)
+ printf (gettext ("\nSection [%Zu] '%s' has no strings to dump.\n"),
elf_ndxscn (scn), name);
-
- Elf_Data *data = elf_rawdata (scn, NULL);
- if (data == NULL)
- error (0, 0, gettext ("cannot get data for section [%Zu] '%s': %s"),
- elf_ndxscn (scn), name, elf_errmsg (-1));
else
{
- printf (gettext ("\nString section [%Zu] '%s' contains %" PRIu64
- " bytes at offset %#0" PRIx64 ":\n"),
- elf_ndxscn (scn), name,
- shdr->sh_size, shdr->sh_offset);
-
- const char *start = data->d_buf;
- const char *const limit = start + data->d_size;
- do
+ Elf_Data *data = elf_rawdata (scn, NULL);
+ if (data == NULL)
+ error (0, 0, gettext ("cannot get data for section [%Zu] '%s': %s"),
+ elf_ndxscn (scn), name, elf_errmsg (-1));
+ else
{
- const char *end = memchr (start, '\0', limit - start);
- const size_t pos = start - (const char *) data->d_buf;
- if (unlikely (end == NULL))
+ printf (gettext ("\nString section [%Zu] '%s' contains %" PRIu64
+ " bytes at offset %#0" PRIx64 ":\n"),
+ elf_ndxscn (scn), name,
+ shdr->sh_size, shdr->sh_offset);
+
+ const char *start = data->d_buf;
+ const char *const limit = start + data->d_size;
+ do
{
- printf (" [%6Zx]- %.*s\n",
- pos, (int) (limit - start), start);
- break;
- }
- printf (" [%6Zx] %s\n", pos, start);
- start = end + 1;
- } while (start < limit);
+ const char *end = memchr (start, '\0', limit - start);
+ const size_t pos = start - (const char *) data->d_buf;
+ if (unlikely (end == NULL))
+ {
+ printf (" [%6Zx]- %.*s\n",
+ pos, (int) (limit - start), start);
+ break;
+ }
+ printf (" [%6Zx] %s\n", pos, start);
+ start = end + 1;
+ } while (start < limit);
+ }
}
}
@@ -6029,7 +7551,7 @@ for_each_section_argument (Elf *elf, const struct section_argument *list,
{
/* Get the section header string table index. */
size_t shstrndx;
- if (elf_getshstrndx (elf, &shstrndx) < 0)
+ if (elf_getshdrstrndx (elf, &shstrndx) < 0)
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -6037,7 +7559,7 @@ for_each_section_argument (Elf *elf, const struct section_argument *list,
{
Elf_Scn *scn;
GElf_Shdr shdr_mem;
- const char *name;
+ const char *name = NULL;
char *endp = NULL;
unsigned long int shndx = strtoul (a->arg, &endp, 0);
@@ -6070,9 +7592,10 @@ for_each_section_argument (Elf *elf, const struct section_argument *list,
break;
}
- if (scn == NULL)
+ if (unlikely (scn == NULL))
{
- error (0, 0, gettext ("\nsection '%s' does not exist"), a->arg);
+ if (!a->implicit)
+ error (0, 0, gettext ("\nsection '%s' does not exist"), a->arg);
continue;
}
}
@@ -6098,7 +7621,7 @@ print_strings (Ebl *ebl)
{
/* Get the section header string table index. */
size_t shstrndx;
- if (unlikely (elf_getshstrndx (ebl->elf, &shstrndx) < 0))
+ if (unlikely (elf_getshdrstrndx (ebl->elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -6171,3 +7694,5 @@ dump_archive_index (Elf *elf, const char *fname)
printf ("\t%s\n", s->as_name);
}
}
+
+#include "debugpred.h"
diff --git a/src/size.c b/src/size.c
index da7b364c..d3dc1fe5 100644
--- a/src/size.c
+++ b/src/size.c
@@ -1,5 +1,5 @@
/* Print size information from ELF file.
- Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007,2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2000.
@@ -50,10 +50,10 @@
/* Name and version of program. */
static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
+ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
/* Bug report address. */
-const char *argp_program_bug_address = PACKAGE_BUGREPORT;
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
/* Values for the parameters which have no short form. */
@@ -220,7 +220,7 @@ print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
Copyright (C) %s Red Hat, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2009");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
@@ -319,13 +319,23 @@ process_file (const char *fname)
return 0;
}
else if (likely (elf_kind (elf) == ELF_K_AR))
- return handle_ar (fd, elf, NULL, fname);
+ {
+ int result = handle_ar (fd, elf, NULL, fname);
+
+ if (unlikely (close (fd) != 0))
+ error (EXIT_FAILURE, errno, gettext ("while closing '%s'"), fname);
+
+ return result;
+ }
/* We cannot handle this type. Close the descriptor anyway. */
if (unlikely (elf_end (elf) != 0))
INTERNAL_ERROR (fname);
}
+ if (unlikely (close (fd) != 0))
+ error (EXIT_FAILURE, errno, gettext ("while closing '%s'"), fname);
+
error (0, 0, gettext ("%s: file format not recognized"), fname);
return 1;
@@ -396,9 +406,6 @@ handle_ar (int fd, Elf *elf, const char *prefix, const char *fname)
if (unlikely (elf_end (elf) != 0))
INTERNAL_ERROR (fname);
- if (unlikely (close (fd) != 0))
- error (EXIT_FAILURE, errno, gettext ("while closing '%s'"), fname);
-
return result;
}
@@ -413,7 +420,7 @@ show_sysv (Elf *elf, const char *prefix, const char *fname,
/* Get the section header string table index. */
size_t shstrndx;
- if (unlikely (elf_getshstrndx (elf, &shstrndx) < 0))
+ if (unlikely (elf_getshdrstrndx (elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -487,7 +494,7 @@ show_sysv_one_line (Elf *elf)
{
/* Get the section header string table index. */
size_t shstrndx;
- if (unlikely (elf_getshstrndx (elf, &shstrndx) < 0))
+ if (unlikely (elf_getshdrstrndx (elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -685,3 +692,6 @@ handle_elf (Elf *elf, const char *prefix, const char *fname)
show_bsd (elf, prefix, fname, fullname);
}
}
+
+
+#include "debugpred.h"
diff --git a/src/strings.c b/src/strings.c
index e5507354..b69f2ad2 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -1,5 +1,5 @@
/* Print the strings of printable characters in files.
- Copyright (C) 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2005, 2006, 2007, 2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2005.
@@ -59,10 +59,10 @@ static int read_elf (Elf *elf, int fd, const char *fname, off64_t fdlen);
/* Name and version of program. */
static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
+ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
/* Bug report address. */
-const char *argp_program_bug_address = PACKAGE_BUGREPORT;
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
/* Definitions of arguments for argp functions. */
static const struct argp_option options[] =
@@ -228,7 +228,7 @@ print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
Copyright (C) %s Red Hat, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2009");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
@@ -422,13 +422,13 @@ process_chunk (const char *fname, const unsigned char *buf, off64_t to,
if (curlen >= min_len)
{
/* We found a match. */
- if (unlikely (fname != NULL))
+ if (likely (fname != NULL))
{
fputs_unlocked (fname, stdout);
fputs_unlocked (": ", stdout);
}
- if (unlikely (locfmt != NULL))
+ if (likely (locfmt != NULL))
printf (locfmt, (int64_t) to - len - (buf - start));
if (unlikely (*unprinted != NULL))
@@ -677,7 +677,7 @@ read_block (int fd, const char *fname, off64_t fdlen, off64_t from, off64_t to)
if (mmap64 (remap_base, read_now, PROT_READ,
MAP_PRIVATE | MAP_POPULATE | MAP_FIXED, fd, handled_to)
== MAP_FAILED)
- error (EXIT_FAILURE, errno, gettext ("re=mmap failed"));
+ error (EXIT_FAILURE, errno, gettext ("re-mmap failed"));
elfmap_off = handled_to;
process_chunk (fname, remap_base - to_keep,
@@ -739,3 +739,6 @@ read_elf (Elf *elf, int fd, const char *fname, off64_t fdlen)
return result;
}
+
+
+#include "debugpred.h"
diff --git a/src/strip.c b/src/strip.c
index e69e1a7f..7b2b889a 100644
--- a/src/strip.c
+++ b/src/strip.c
@@ -1,5 +1,5 @@
/* Discard section not used at runtime from object files.
- Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
+ Copyright (C) 2000-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2000.
@@ -46,6 +46,7 @@
#include <string.h>
#include <unistd.h>
#include <sys/param.h>
+#include <sys/stat.h>
#include <sys/time.h>
#include <elf-knowledge.h>
@@ -55,10 +56,10 @@
/* Name and version of program. */
static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
+ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
/* Bug report address. */
-const char *argp_program_bug_address = PACKAGE_BUGREPORT;
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
/* Values for the parameters which have no short form. */
@@ -204,7 +205,7 @@ print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
Copyright (C) %s Red Hat, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2009");
fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
}
@@ -383,12 +384,14 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
Elf *debugelf = NULL;
char *tmp_debug_fname = NULL;
int result = 0;
+ size_t shdridx = 0;
size_t shstrndx;
struct shdr_info
{
Elf_Scn *scn;
GElf_Shdr shdr;
Elf_Data *data;
+ Elf_Data *debug_data;
const char *name;
Elf32_Word idx; /* Index in new file. */
Elf32_Word old_sh_link; /* Original value of shdr.sh_link. */
@@ -435,7 +438,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
int debug_fd = -1;
/* Get the EBL handling. The -g option is currently the only reason
- we need EBL so dont open the backend unless necessary. */
+ we need EBL so don't open the backend unless necessary. */
Ebl *ebl = NULL;
if (remove_debug)
{
@@ -475,7 +478,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
INTERNAL_ERROR (fname);
/* Get the section header string table index. */
- if (unlikely (elf_getshstrndx (elf, &shstrndx) < 0))
+ if (unlikely (elf_getshdrstrndx (elf, &shstrndx) < 0))
error (EXIT_FAILURE, 0,
gettext ("cannot get section header string table index"));
@@ -535,7 +538,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
/* Number of sections. */
size_t shnum;
- if (unlikely (elf_getshnum (elf, &shnum) < 0))
+ if (unlikely (elf_getshdrnum (elf, &shnum) < 0))
{
error (0, 0, gettext ("cannot determine number of sections: %s"),
elf_errmsg (-1));
@@ -719,8 +722,10 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
/* The content of symbol tables we don't remove must not
reference any section which we do remove. Otherwise
we cannot remove the section. */
- if (shdr_info[cnt].shdr.sh_type == SHT_DYNSYM
- || shdr_info[cnt].shdr.sh_type == SHT_SYMTAB)
+ if (debug_fname != NULL
+ && shdr_info[cnt].debug_data == NULL
+ && (shdr_info[cnt].shdr.sh_type == SHT_DYNSYM
+ || shdr_info[cnt].shdr.sh_type == SHT_SYMTAB))
{
/* Make sure the data is loaded. */
if (shdr_info[cnt].data == NULL)
@@ -778,11 +783,10 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
scnidx = xndx;
if (shdr_info[scnidx].idx == 0)
- {
- /* Mark this section as used. */
- shdr_info[scnidx].idx = 1;
- changes |= scnidx < cnt;
- }
+ /* This symbol table has a real symbol in
+ a discarded section. So preserve the
+ original table in the debug file. */
+ shdr_info[cnt].debug_data = symdata;
}
}
@@ -818,6 +822,37 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
/* Mark the section as investigated. */
shdr_info[cnt].idx = 2;
}
+
+ if (debug_fname != NULL
+ && (shdr_info[cnt].idx == 0 || shdr_info[cnt].debug_data != NULL))
+ {
+ /* This section is being preserved in the debug file.
+ Sections it refers to must be preserved there too.
+
+ In this pass we mark sections to be preserved in both
+ files by setting the .debug_data pointer to the original
+ file's .data pointer. Below, we'll copy the section
+ contents. */
+
+ inline void check_preserved (size_t i)
+ {
+ if (i != 0 && shdr_info[i].idx != 0
+ && shdr_info[i].debug_data == NULL)
+ {
+ if (shdr_info[i].data == NULL)
+ shdr_info[i].data = elf_getdata (shdr_info[i].scn, NULL);
+ if (shdr_info[i].data == NULL)
+ INTERNAL_ERROR (fname);
+
+ shdr_info[i].debug_data = shdr_info[i].data;
+ changes |= i < cnt;
+ }
+ }
+
+ check_preserved (shdr_info[cnt].shdr.sh_link);
+ if (SH_INFO_LINK_P (&shdr_info[cnt].shdr))
+ check_preserved (shdr_info[cnt].shdr.sh_info);
+ }
}
}
while (changes);
@@ -835,6 +870,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
elf_errmsg (-1));
bool discard_section = (shdr_info[cnt].idx > 0
+ && shdr_info[cnt].debug_data == NULL
&& shdr_info[cnt].shdr.sh_type != SHT_NOTE
&& cnt != ehdr->e_shstrndx);
@@ -843,7 +879,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
if (discard_section)
debugshdr.sh_type = SHT_NOBITS;
- if (unlikely (gelf_update_shdr (scn, &debugshdr)) == 0)
+ if (unlikely (gelf_update_shdr (scn, &debugshdr) == 0))
/* There cannot be any overflows. */
INTERNAL_ERROR (fname);
@@ -865,6 +901,13 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
*debugdata = *shdr_info[cnt].data;
if (discard_section)
debugdata->d_buf = NULL;
+ else if (shdr_info[cnt].debug_data != NULL)
+ {
+ /* Copy the original data before it gets modified. */
+ shdr_info[cnt].debug_data = debugdata;
+ debugdata->d_buf = memcpy (xmalloc (debugdata->d_size),
+ debugdata->d_buf, debugdata->d_size);
+ }
}
/* Finish the ELF header. Fill in the fields not handled by
@@ -881,7 +924,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
debugehdr->e_flags = ehdr->e_flags;
debugehdr->e_shstrndx = ehdr->e_shstrndx;
- if (unlikely (gelf_update_ehdr (debugelf, debugehdr)) == 0)
+ if (unlikely (gelf_update_ehdr (debugelf, debugehdr) == 0))
{
error (0, 0, gettext ("%s: error while creating ELF header: %s"),
debug_fname, elf_errmsg (-1));
@@ -981,7 +1024,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
}
/* Index of the section header table in the shdr_info array. */
- size_t shdridx = cnt;
+ shdridx = cnt;
/* Add the section header string table section name. */
shdr_info[cnt].se = ebl_strtabadd (shst, ".shstrtab", 10);
@@ -1077,7 +1120,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
/* We know the size. */
shdr_info[cnt].shdr.sh_size = shdr_info[cnt].data->d_size;
- /* We have to adjust symtol tables. The st_shndx member might
+ /* We have to adjust symbol tables. The st_shndx member might
have to be updated. */
if (shdr_info[cnt].shdr.sh_type == SHT_DYNSYM
|| shdr_info[cnt].shdr.sh_type == SHT_SYMTAB)
@@ -1205,7 +1248,8 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
shdr_info[cnt].shdr.sh_info = destidx - 1;
}
}
- else
+ else if (debug_fname == NULL
+ || shdr_info[cnt].debug_data == NULL)
/* This is a section symbol for a section which has
been removed. */
assert (GELF_ST_TYPE (sym->st_info) == STT_SECTION);
@@ -1247,291 +1291,288 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
/* Adjust symbol references if symbol tables changed. */
if (any_symtab_changes)
- {
- /* Find all relocation sections which use this
- symbol table. */
- for (cnt = 1; cnt <= shdridx; ++cnt)
+ /* Find all relocation sections which use this symbol table. */
+ for (cnt = 1; cnt <= shdridx; ++cnt)
+ {
+ /* Update section headers when the data size has changed.
+ We also update the SHT_NOBITS section in the debug
+ file so that the section headers match in sh_size. */
+ inline void update_section_size (const Elf_Data *newdata)
{
- /* Update section headers when the data size has changed.
- We also update the SHT_NOBITS section in the debug
- file so that the section headers match in sh_size. */
- inline void update_section_size (const Elf_Data *newdata)
+ GElf_Shdr shdr_mem;
+ GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+ shdr->sh_size = newdata->d_size;
+ (void) gelf_update_shdr (scn, shdr);
+ if (debugelf != NULL)
{
- GElf_Shdr shdr_mem;
- GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
- shdr->sh_size = newdata->d_size;
- (void) gelf_update_shdr (scn, shdr);
- if (debugelf != NULL)
- {
- /* libelf will use d_size to set sh_size. */
- Elf_Data *debugdata = elf_getdata (elf_getscn (debugelf,
- cnt), NULL);
- debugdata->d_size = newdata->d_size;
- }
+ /* libelf will use d_size to set sh_size. */
+ Elf_Data *debugdata = elf_getdata (elf_getscn (debugelf,
+ cnt), NULL);
+ debugdata->d_size = newdata->d_size;
}
+ }
- if (shdr_info[cnt].idx == 0 && debug_fname == NULL)
- /* Ignore sections which are discarded. When we are saving a
- relocation section in a separate debug file, we must fix up
- the symbol table references. */
- continue;
+ if (shdr_info[cnt].idx == 0 && debug_fname == NULL)
+ /* Ignore sections which are discarded. When we are saving a
+ relocation section in a separate debug file, we must fix up
+ the symbol table references. */
+ continue;
- if (shdr_info[cnt].shdr.sh_type == SHT_REL
- || shdr_info[cnt].shdr.sh_type == SHT_RELA)
+ const Elf32_Word symtabidx = shdr_info[cnt].old_sh_link;
+ const Elf32_Word *const newsymidx = shdr_info[symtabidx].newsymidx;
+ switch (shdr_info[cnt].shdr.sh_type)
+ {
+ inline bool no_symtab_updates (void)
{
/* If the symbol table hasn't changed, do not do anything. */
- if (shdr_info[shdr_info[cnt].old_sh_link].newsymidx == NULL)
- continue;
-
- Elf32_Word *newsymidx
- = shdr_info[shdr_info[cnt].old_sh_link].newsymidx;
- Elf_Data *d = elf_getdata (shdr_info[cnt].idx == 0
- ? elf_getscn (debugelf, cnt)
- : elf_getscn (newelf,
- shdr_info[cnt].idx),
- NULL);
- assert (d != NULL);
- size_t nrels = (shdr_info[cnt].shdr.sh_size
- / shdr_info[cnt].shdr.sh_entsize);
-
- if (shdr_info[cnt].shdr.sh_type == SHT_REL)
- for (size_t relidx = 0; relidx < nrels; ++relidx)
- {
- GElf_Rel rel_mem;
- if (gelf_getrel (d, relidx, &rel_mem) == NULL)
- INTERNAL_ERROR (fname);
+ if (shdr_info[symtabidx].newsymidx == NULL)
+ return true;
- size_t symidx = GELF_R_SYM (rel_mem.r_info);
- if (newsymidx[symidx] != symidx)
- {
- rel_mem.r_info
- = GELF_R_INFO (newsymidx[symidx],
- GELF_R_TYPE (rel_mem.r_info));
+ /* If the symbol table is not discarded, but additionally
+ duplicated in the separate debug file and this section
+ is discarded, don't adjust anything. */
+ return (shdr_info[cnt].idx == 0
+ && shdr_info[symtabidx].debug_data != NULL);
+ }
- if (gelf_update_rel (d, relidx, &rel_mem) == 0)
- INTERNAL_ERROR (fname);
- }
- }
- else
- for (size_t relidx = 0; relidx < nrels; ++relidx)
- {
- GElf_Rela rel_mem;
- if (gelf_getrela (d, relidx, &rel_mem) == NULL)
- INTERNAL_ERROR (fname);
+ case SHT_REL:
+ case SHT_RELA:
+ if (no_symtab_updates ())
+ break;
- size_t symidx = GELF_R_SYM (rel_mem.r_info);
- if (newsymidx[symidx] != symidx)
- {
- rel_mem.r_info
- = GELF_R_INFO (newsymidx[symidx],
- GELF_R_TYPE (rel_mem.r_info));
+ Elf_Data *d = elf_getdata (shdr_info[cnt].idx == 0
+ ? elf_getscn (debugelf, cnt)
+ : elf_getscn (newelf,
+ shdr_info[cnt].idx),
+ NULL);
+ assert (d != NULL);
+ size_t nrels = (shdr_info[cnt].shdr.sh_size
+ / shdr_info[cnt].shdr.sh_entsize);
- if (gelf_update_rela (d, relidx, &rel_mem) == 0)
- INTERNAL_ERROR (fname);
- }
- }
- }
- else if (shdr_info[cnt].shdr.sh_type == SHT_HASH)
- {
- /* We have to recompute the hash table. */
- Elf32_Word symtabidx = shdr_info[cnt].old_sh_link;
+ if (shdr_info[cnt].shdr.sh_type == SHT_REL)
+ for (size_t relidx = 0; relidx < nrels; ++relidx)
+ {
+ GElf_Rel rel_mem;
+ if (gelf_getrel (d, relidx, &rel_mem) == NULL)
+ INTERNAL_ERROR (fname);
- /* We do not have to do anything if the symbol table was
- not changed. */
- if (shdr_info[symtabidx].newsymidx == NULL)
- continue;
+ size_t symidx = GELF_R_SYM (rel_mem.r_info);
+ if (newsymidx[symidx] != symidx)
+ {
+ rel_mem.r_info
+ = GELF_R_INFO (newsymidx[symidx],
+ GELF_R_TYPE (rel_mem.r_info));
- assert (shdr_info[cnt].idx > 0);
+ if (gelf_update_rel (d, relidx, &rel_mem) == 0)
+ INTERNAL_ERROR (fname);
+ }
+ }
+ else
+ for (size_t relidx = 0; relidx < nrels; ++relidx)
+ {
+ GElf_Rela rel_mem;
+ if (gelf_getrela (d, relidx, &rel_mem) == NULL)
+ INTERNAL_ERROR (fname);
- /* The hash section in the new file. */
- scn = elf_getscn (newelf, shdr_info[cnt].idx);
+ size_t symidx = GELF_R_SYM (rel_mem.r_info);
+ if (newsymidx[symidx] != symidx)
+ {
+ rel_mem.r_info
+ = GELF_R_INFO (newsymidx[symidx],
+ GELF_R_TYPE (rel_mem.r_info));
- /* The symbol table data. */
- Elf_Data *symd = elf_getdata (elf_getscn (newelf,
- shdr_info[symtabidx].idx),
- NULL);
- assert (symd != NULL);
+ if (gelf_update_rela (d, relidx, &rel_mem) == 0)
+ INTERNAL_ERROR (fname);
+ }
+ }
+ break;
- /* The hash table data. */
- Elf_Data *hashd = elf_getdata (scn, NULL);
- assert (hashd != NULL);
+ case SHT_HASH:
+ if (no_symtab_updates ())
+ break;
- if (shdr_info[cnt].shdr.sh_entsize == sizeof (Elf32_Word))
- {
- /* Sane arches first. */
- Elf32_Word *bucket = (Elf32_Word *) hashd->d_buf;
+ /* We have to recompute the hash table. */
- size_t strshndx = shdr_info[symtabidx].old_sh_link;
- size_t elsize = gelf_fsize (elf, ELF_T_SYM, 1,
- ehdr->e_version);
+ assert (shdr_info[cnt].idx > 0);
- /* Adjust the nchain value. The symbol table size
- changed. We keep the same size for the bucket array. */
- bucket[1] = symd->d_size / elsize;
- Elf32_Word nbucket = bucket[0];
- bucket += 2;
- Elf32_Word *chain = bucket + nbucket;
-
- /* New size of the section. */
- hashd->d_size = ((2 + symd->d_size / elsize + nbucket)
- * sizeof (Elf32_Word));
- update_section_size (hashd);
-
- /* Clear the arrays. */
- memset (bucket, '\0',
- (symd->d_size / elsize + nbucket)
- * sizeof (Elf32_Word));
-
- for (size_t inner = shdr_info[symtabidx].shdr.sh_info;
- inner < symd->d_size / elsize; ++inner)
- {
- GElf_Sym sym_mem;
- GElf_Sym *sym = gelf_getsym (symd, inner, &sym_mem);
- assert (sym != NULL);
+ /* The hash section in the new file. */
+ scn = elf_getscn (newelf, shdr_info[cnt].idx);
- const char *name = elf_strptr (elf, strshndx,
- sym->st_name);
- assert (name != NULL);
- size_t hidx = elf_hash (name) % nbucket;
+ /* The symbol table data. */
+ Elf_Data *symd = elf_getdata (elf_getscn (newelf,
+ shdr_info[symtabidx].idx),
+ NULL);
+ assert (symd != NULL);
- if (bucket[hidx] == 0)
- bucket[hidx] = inner;
- else
- {
- hidx = bucket[hidx];
+ /* The hash table data. */
+ Elf_Data *hashd = elf_getdata (scn, NULL);
+ assert (hashd != NULL);
- while (chain[hidx] != 0)
- hidx = chain[hidx];
+ if (shdr_info[cnt].shdr.sh_entsize == sizeof (Elf32_Word))
+ {
+ /* Sane arches first. */
+ Elf32_Word *bucket = (Elf32_Word *) hashd->d_buf;
- chain[hidx] = inner;
- }
- }
- }
- else
- {
- /* Alpha and S390 64-bit use 64-bit SHT_HASH entries. */
- assert (shdr_info[cnt].shdr.sh_entsize
- == sizeof (Elf64_Xword));
+ size_t strshndx = shdr_info[symtabidx].old_sh_link;
+ size_t elsize = gelf_fsize (elf, ELF_T_SYM, 1,
+ ehdr->e_version);
- Elf64_Xword *bucket = (Elf64_Xword *) hashd->d_buf;
+ /* Adjust the nchain value. The symbol table size
+ changed. We keep the same size for the bucket array. */
+ bucket[1] = symd->d_size / elsize;
+ Elf32_Word nbucket = bucket[0];
+ bucket += 2;
+ Elf32_Word *chain = bucket + nbucket;
+
+ /* New size of the section. */
+ hashd->d_size = ((2 + symd->d_size / elsize + nbucket)
+ * sizeof (Elf32_Word));
+ update_section_size (hashd);
+
+ /* Clear the arrays. */
+ memset (bucket, '\0',
+ (symd->d_size / elsize + nbucket)
+ * sizeof (Elf32_Word));
+
+ for (size_t inner = shdr_info[symtabidx].shdr.sh_info;
+ inner < symd->d_size / elsize; ++inner)
+ {
+ GElf_Sym sym_mem;
+ GElf_Sym *sym = gelf_getsym (symd, inner, &sym_mem);
+ assert (sym != NULL);
- size_t strshndx = shdr_info[symtabidx].old_sh_link;
- size_t elsize = gelf_fsize (elf, ELF_T_SYM, 1,
- ehdr->e_version);
+ const char *name = elf_strptr (elf, strshndx,
+ sym->st_name);
+ assert (name != NULL);
+ size_t hidx = elf_hash (name) % nbucket;
- /* Adjust the nchain value. The symbol table size
- changed. We keep the same size for the bucket array. */
- bucket[1] = symd->d_size / elsize;
- Elf64_Xword nbucket = bucket[0];
- bucket += 2;
- Elf64_Xword *chain = bucket + nbucket;
-
- /* New size of the section. */
- hashd->d_size = ((2 + symd->d_size / elsize + nbucket)
- * sizeof (Elf64_Xword));
- update_section_size (hashd);
-
- /* Clear the arrays. */
- memset (bucket, '\0',
- (symd->d_size / elsize + nbucket)
- * sizeof (Elf64_Xword));
-
- for (size_t inner = shdr_info[symtabidx].shdr.sh_info;
- inner < symd->d_size / elsize; ++inner)
- {
- GElf_Sym sym_mem;
- GElf_Sym *sym = gelf_getsym (symd, inner, &sym_mem);
- assert (sym != NULL);
+ if (bucket[hidx] == 0)
+ bucket[hidx] = inner;
+ else
+ {
+ hidx = bucket[hidx];
- const char *name = elf_strptr (elf, strshndx,
- sym->st_name);
- assert (name != NULL);
- size_t hidx = elf_hash (name) % nbucket;
+ while (chain[hidx] != 0)
+ hidx = chain[hidx];
- if (bucket[hidx] == 0)
- bucket[hidx] = inner;
- else
- {
- hidx = bucket[hidx];
+ chain[hidx] = inner;
+ }
+ }
+ }
+ else
+ {
+ /* Alpha and S390 64-bit use 64-bit SHT_HASH entries. */
+ assert (shdr_info[cnt].shdr.sh_entsize
+ == sizeof (Elf64_Xword));
- while (chain[hidx] != 0)
- hidx = chain[hidx];
+ Elf64_Xword *bucket = (Elf64_Xword *) hashd->d_buf;
- chain[hidx] = inner;
- }
- }
- }
- }
- else if (shdr_info[cnt].shdr.sh_type == SHT_GNU_versym)
- {
- /* If the symbol table changed we have to adjust the
- entries. */
- Elf32_Word symtabidx = shdr_info[cnt].old_sh_link;
+ size_t strshndx = shdr_info[symtabidx].old_sh_link;
+ size_t elsize = gelf_fsize (elf, ELF_T_SYM, 1,
+ ehdr->e_version);
- /* We do not have to do anything if the symbol table was
- not changed. */
- if (shdr_info[symtabidx].newsymidx == NULL)
- continue;
-
- assert (shdr_info[cnt].idx > 0);
-
- /* The symbol version section in the new file. */
- scn = elf_getscn (newelf, shdr_info[cnt].idx);
-
- /* The symbol table data. */
- Elf_Data *symd = elf_getdata (elf_getscn (newelf,
- shdr_info[symtabidx].idx),
- NULL);
- assert (symd != NULL);
-
- /* The version symbol data. */
- Elf_Data *verd = elf_getdata (scn, NULL);
- assert (verd != NULL);
-
- /* The symbol version array. */
- GElf_Half *verstab = (GElf_Half *) verd->d_buf;
-
- /* New indices of the symbols. */
- Elf32_Word *newsymidx = shdr_info[symtabidx].newsymidx;
-
- /* Walk through the list and */
- size_t elsize = gelf_fsize (elf, verd->d_type, 1,
- ehdr->e_version);
- for (size_t inner = 1; inner < verd->d_size / elsize; ++inner)
- if (newsymidx[inner] != 0)
- /* Overwriting the same array works since the
- reordering can only move entries to lower indices
- in the array. */
- verstab[newsymidx[inner]] = verstab[inner];
-
- /* New size of the section. */
- verd->d_size = gelf_fsize (newelf, verd->d_type,
- symd->d_size
- / gelf_fsize (elf, symd->d_type, 1,
- ehdr->e_version),
- ehdr->e_version);
- update_section_size (verd);
- }
- else if (shdr_info[cnt].shdr.sh_type == SHT_GROUP)
- {
- /* Check whether the associated symbol table changed. */
- if (shdr_info[shdr_info[cnt].old_sh_link].newsymidx != NULL)
- {
- /* Yes the symbol table changed. Update the section
- header of the section group. */
- scn = elf_getscn (newelf, shdr_info[cnt].idx);
- GElf_Shdr shdr_mem;
- GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
- assert (shdr != NULL);
+ /* Adjust the nchain value. The symbol table size
+ changed. We keep the same size for the bucket array. */
+ bucket[1] = symd->d_size / elsize;
+ Elf64_Xword nbucket = bucket[0];
+ bucket += 2;
+ Elf64_Xword *chain = bucket + nbucket;
+
+ /* New size of the section. */
+ hashd->d_size = ((2 + symd->d_size / elsize + nbucket)
+ * sizeof (Elf64_Xword));
+ update_section_size (hashd);
+
+ /* Clear the arrays. */
+ memset (bucket, '\0',
+ (symd->d_size / elsize + nbucket)
+ * sizeof (Elf64_Xword));
+
+ for (size_t inner = shdr_info[symtabidx].shdr.sh_info;
+ inner < symd->d_size / elsize; ++inner)
+ {
+ GElf_Sym sym_mem;
+ GElf_Sym *sym = gelf_getsym (symd, inner, &sym_mem);
+ assert (sym != NULL);
- size_t stabidx = shdr_info[cnt].old_sh_link;
- shdr->sh_info = shdr_info[stabidx].newsymidx[shdr->sh_info];
+ const char *name = elf_strptr (elf, strshndx,
+ sym->st_name);
+ assert (name != NULL);
+ size_t hidx = elf_hash (name) % nbucket;
- (void) gelf_update_shdr (scn, shdr);
- }
- }
- }
- }
+ if (bucket[hidx] == 0)
+ bucket[hidx] = inner;
+ else
+ {
+ hidx = bucket[hidx];
+
+ while (chain[hidx] != 0)
+ hidx = chain[hidx];
+
+ chain[hidx] = inner;
+ }
+ }
+ }
+ break;
+
+ case SHT_GNU_versym:
+ /* If the symbol table changed we have to adjust the entries. */
+ if (no_symtab_updates ())
+ break;
+
+ assert (shdr_info[cnt].idx > 0);
+
+ /* The symbol version section in the new file. */
+ scn = elf_getscn (newelf, shdr_info[cnt].idx);
+
+ /* The symbol table data. */
+ symd = elf_getdata (elf_getscn (newelf, shdr_info[symtabidx].idx),
+ NULL);
+ assert (symd != NULL);
+
+ /* The version symbol data. */
+ Elf_Data *verd = elf_getdata (scn, NULL);
+ assert (verd != NULL);
+
+ /* The symbol version array. */
+ GElf_Half *verstab = (GElf_Half *) verd->d_buf;
+
+ /* Walk through the list and */
+ size_t elsize = gelf_fsize (elf, verd->d_type, 1,
+ ehdr->e_version);
+ for (size_t inner = 1; inner < verd->d_size / elsize; ++inner)
+ if (newsymidx[inner] != 0)
+ /* Overwriting the same array works since the
+ reordering can only move entries to lower indices
+ in the array. */
+ verstab[newsymidx[inner]] = verstab[inner];
+
+ /* New size of the section. */
+ verd->d_size = gelf_fsize (newelf, verd->d_type,
+ symd->d_size
+ / gelf_fsize (elf, symd->d_type, 1,
+ ehdr->e_version),
+ ehdr->e_version);
+ update_section_size (verd);
+ break;
+
+ case SHT_GROUP:
+ if (no_symtab_updates ())
+ break;
+
+ /* Yes, the symbol table changed.
+ Update the section header of the section group. */
+ scn = elf_getscn (newelf, shdr_info[cnt].idx);
+ GElf_Shdr shdr_mem;
+ GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
+ assert (shdr != NULL);
+
+ shdr->sh_info = newsymidx[shdr->sh_info];
+
+ (void) gelf_update_shdr (scn, shdr);
+ break;
+ }
+ }
/* Now that we have done all adjustments to the data,
we can actually write out the debug file. */
@@ -1547,7 +1588,7 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
};
/* Finally write the file. */
- if (unlikely (elf_update (debugelf, ELF_C_WRITE)) == -1)
+ if (unlikely (elf_update (debugelf, ELF_C_WRITE) == -1))
{
error (0, 0, gettext ("while writing '%s': %s"),
debug_fname, elf_errmsg (-1));
@@ -1658,7 +1699,11 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
table indices. */
if (any_symtab_changes)
for (cnt = 1; cnt <= shdridx; ++cnt)
- free (shdr_info[cnt].newsymidx);
+ {
+ free (shdr_info[cnt].newsymidx);
+ if (shdr_info[cnt].debug_data != NULL)
+ free (shdr_info[cnt].debug_data->d_buf);
+ }
/* Free the memory. */
if ((shnum + 2) * sizeof (struct shdr_info) > MAX_STACK_ALLOC)
@@ -1772,3 +1817,6 @@ cannot set access and modification date of '%s'"), fname);
return result;
}
+
+
+#include "debugpred.h"
diff --git a/src/unaligned.h b/src/unaligned.h
index bf1e5299..ad7c55a5 100644
--- a/src/unaligned.h
+++ b/src/unaligned.h
@@ -1,5 +1,5 @@
/* Unaligned memory access functionality.
- Copyright (C) 2000, 2001, 2002, 2003 Red Hat, Inc.
+ Copyright (C) 2000, 2001, 2002, 2003, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -89,19 +89,19 @@ union u_8ubyte_unaligned
#else
# define add_2ubyte_unaligned(ptr, value) \
do { \
- union u_2ubyte_unaligned *_ptr = (ptr); \
+ union u_2ubyte_unaligned *_ptr = (void *) (ptr); \
uint16_t _val = bswap_16 (_ptr->u) + (value); \
_ptr->u = bswap_16 (_val); \
} while (0)
# define add_4ubyte_unaligned(ptr, value) \
do { \
- union u_4ubyte_unaligned *_ptr = (ptr); \
+ union u_4ubyte_unaligned *_ptr = (void *) (ptr); \
uint32_t _val = bswap_32 (_ptr->u) + (value); \
_ptr->u = bswap_32 (_val); \
} while (0)
# define add_8ubyte_unaligned(ptr, value) \
do { \
- union u_8ubyte_unaligned *_ptr = (ptr); \
+ union u_8ubyte_unaligned *_ptr = (void *) (ptr); \
uint64_t _val = bswap_64 (_ptr->u) + (value); \
_ptr->u = bswap_64 (_val); \
} while (0)
diff --git a/src/unstrip.c b/src/unstrip.c
index 2670835a..0984e6bc 100644
--- a/src/unstrip.c
+++ b/src/unstrip.c
@@ -1,5 +1,5 @@
/* Combine stripped files with separate symbols and debug information.
- Copyright (C) 2007 Red Hat, Inc.
+ Copyright (C) 2007-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Roland McGrath <roland@redhat.com>, 2007.
@@ -52,6 +52,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <sys/stat.h>
#include <gelf.h>
#include <libebl.h>
@@ -64,11 +65,10 @@
/* Name and version of program. */
static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *)
- = print_version;
+ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
/* Bug report address. */
-const char *argp_program_bug_address = PACKAGE_BUGREPORT;
+ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
/* Definitions of arguments for argp functions. */
static const struct argp_option options[] =
@@ -235,7 +235,7 @@ print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
Copyright (C) %s Red Hat, Inc.\n\
This is free software; see the source for copying conditions. There is NO\n\
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2007");
+"), "2009");
fprintf (stream, gettext ("Written by %s.\n"), "Roland McGrath");
}
@@ -1219,19 +1219,19 @@ copy_elided_sections (Elf *unstripped, Elf *stripped,
const GElf_Ehdr *stripped_ehdr, GElf_Addr bias)
{
size_t unstripped_shstrndx;
- ELF_CHECK (elf_getshstrndx (unstripped, &unstripped_shstrndx) == 0,
+ ELF_CHECK (elf_getshdrstrndx (unstripped, &unstripped_shstrndx) == 0,
_("cannot get section header string table section index: %s"));
size_t stripped_shstrndx;
- ELF_CHECK (elf_getshstrndx (stripped, &stripped_shstrndx) == 0,
+ ELF_CHECK (elf_getshdrstrndx (stripped, &stripped_shstrndx) == 0,
_("cannot get section header string table section index: %s"));
size_t unstripped_shnum;
- ELF_CHECK (elf_getshnum (unstripped, &unstripped_shnum) == 0,
+ ELF_CHECK (elf_getshdrnum (unstripped, &unstripped_shnum) == 0,
_("cannot get section count: %s"));
size_t stripped_shnum;
- ELF_CHECK (elf_getshnum (stripped, &stripped_shnum) == 0,
+ ELF_CHECK (elf_getshdrnum (stripped, &stripped_shnum) == 0,
_("cannot get section count: %s"));
/* Cache the stripped file's section details. */
@@ -1462,7 +1462,7 @@ copy_elided_sections (Elf *unstripped, Elf *stripped,
strtab);
/* Get the updated section count. */
- ELF_CHECK (elf_getshnum (unstripped, &unstripped_shnum) == 0,
+ ELF_CHECK (elf_getshdrnum (unstripped, &unstripped_shnum) == 0,
_("cannot get section count: %s"));
bool placed[unstripped_shnum - 1];
@@ -2312,3 +2312,6 @@ or - if no debuginfo was found, or . if FILE contains the debug information.\
return 0;
}
+
+
+#include "debugpred.h"
diff --git a/tests/ChangeLog b/tests/ChangeLog
index dc801f37..1a46dd8a 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,255 @@
+2010-04-22 Roland McGrath <roland@redhat.com>
+
+ * addrcfi.c (handle_cfi): Fix function name in error message.
+ Use dwarf_errmsg, not dwfl_errmsg, after dwarf_cfi_addrframe.
+
+2010-04-14 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am (EXTRA_DIST): Add run-test-flag-nobits.sh here too.
+
+2010-04-10 Ulrich Drepper <drepper@redhat.com>
+
+ * msg_tst.c: Adjust expected error message.
+
+2010-04-01 Petr Machata <pmachata@redhat.com>
+
+ * test-flag-nobits.c: New test.
+ * run-test-flag-nobits.sh: And its wrapper.
+ * Makefile.am (noinst_PROGRAMS, TESTS): Add them.
+ (test_flag_nobits_LDADD): New variable.
+
+2010-02-15 Roland McGrath <roland@redhat.com>
+
+ * Makefile.am: Use config/eu.am for common stuff.
+
+ * asm-tst9.c (main): Rename local to avoid shadowing another local.
+
+2009-07-22 Roland McGrath <roland@redhat.com>
+
+ * addrcfi.c: Update dwarf_frame_{cfa,register} calling convention.
+
+2009-07-08 Roland McGrath <roland@redhat.com>
+
+ * addrcfi.c: New file.
+ * Makefile.am (noinst_PROGRAMS): Add it.
+ (addrcfi_LDADD): New variable.
+
+2009-05-07 Petr Machata <pmachata@redhat.com>
+
+ * testfile51.bz2: New data file.
+ * dwarf-getmacros.c: New test core.
+ * run-dwarf-getmacros.sh: New test wrapper.
+ * Makefile.am (TESTS, EXTRA_DIST, noinst_PROGRAMS): Add them.
+ (dwarf_getmacros_LDADD): New variable.
+
+2009-04-23 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile [BUILD_STATIC] (libdw): Add $(zip_LIBS).
+ (rdwrmmap_LDADD): Add $(libmudflap).
+
+2009-04-21 Roland McGrath <roland@redhat.com>
+
+ * testfile50.bz2: New data file.
+ * Makefile.am (EXTRA_DIST): Add it.
+ * run-dwfl-addr-sect.sh: Add a case using it.
+
+2008-12-31 Ulrich Drepper <drepper@redhat.com>
+
+ * testfile44.S.bz2: Add tests for dppd, dpps, insertps, movntdqa,
+ mpsadbw, packusdw, pblendvb, pblendw, pcmpeqq, pcmpestri, pcmpestrm,
+ pcmpistri, pcmpistrm, pcmpgtq, phminposuw, pinsrb, pinsrd, pmaxsb,
+ pmaxsd, pmaxud, pmaxuw, pminsb, pminsd, pminud, pminuw, pmovsxbw,
+ pmovsxbd, pmovsxbq, pmovsxwd, pmovsxwq, pmovsxdq, pmovsxbw, pmovsxbd,
+ pmovsxbq, pmovsxwd, pmovsxwq, pmovsxdq, pmuldq, pmulld, popcnt, ptest,
+ roundss, roundps, roundpd, and roundsd.
+ * testfile45.S.bz2: Likewise.
+ * testfile44.expect.bz2: Adjust accordingly.
+ * testfile45.expect.bz2: Likewise.
+
+ * testfile44.S.bz2: Add tests for blendvpd and blendvps.
+ * testfile45.S.bz2: Likewise.
+ * testfile44.expect.bz2: Adjust accordingly.
+ * testfile45.expect.bz2: Likewise.
+
+2008-12-30 Ulrich Drepper <drepper@redhat.com>
+
+ * testfile44.S.bz2: Add tests for blendpd and blendps.
+ * testfile45.S.bz2: Likewise.
+ * testfile44.expect.bz2: Adjust accordingly.
+ * testfile45.expect.bz2: Likewise.
+
+2008-12-19 Ulrich Drepper <drepper@redhat.com>
+
+ * testfile44.S.bz2: Add tests for AMD 3DNOW.
+ * testfile45.S.bz2: Likewise.
+ * testfile44.expect.bz2: Adjust accordingly.
+ * testfile45.expect.bz2: Likewise.
+
+2008-11-26 Roland McGrath <roland@redhat.com>
+
+ * dwfl-bug-getmodules.c: New file.
+ * Makefile.am (noinst_PROGRAMS): Add it.
+ (dwfl_bug_getmodules_LDADD): New variable.
+
+2008-09-10 Roland McGrath <roland@redhat.com>
+
+ * test-subr.sh (LC_ALL): Export it set to "C".
+ * run-dwfl-addr-sect.sh: Don't do it here.
+ * run-strings-test.sh: Likewise.
+
+2008-08-21 Denys Vlasenko <dvlasenk@redhat.com>
+
+ * run-addrname-test.sh: Add a new case.
+ * testfile49.bz2: New data file.
+ * Makefile.am (EXTRA_DIST): Add it.
+
+2008-04-10 Roland McGrath <roland@redhat.com>
+
+ * testfile48.bz2, testfile48.bz2.debug: New data files.
+ * Makefile.am (EXTRA_DIST): Add them.
+ * run-strip-test8.sh: Use them.
+
+ * testfile16.bz2, testfile16.debug.bz2: Replace data files.
+
+ * run-strip-test.sh: Fail if stripped output has ".debug_*" sections.
+ * run-strip-test8.sh: New file.
+ * testfile47.bz2: New data file.
+ * Makefile.am (TESTS, EXTRA_DIST): Add them.
+
+2008-03-31 Roland McGrath <roland@redhat.com>
+
+ * run-early-offscn.sh: New file.
+ * early-offscn.c: New file.
+ * Makefile.am (noinst_PROGRAMS, TESTS, EXTRA_DIST): Add them.
+ (early_offscn_LDADD): New variable.
+
+2008-03-19 Roland McGrath <roland@redhat.com>
+
+ * run-addrname-test.sh: Add a new case.
+
+2008-02-22 Roland McGrath <roland@redhat.com>
+
+ * run-elflint-test.sh: Typo fix.
+
+2008-02-21 Roland McGrath <roland@redhat.com>
+
+ * run-disasm-x86.sh: Use uname instead of arch, keep tools required
+ for the build down to minimum.
+ * run-disasm-x86-64.sh: Likewise.
+
+2008-02-20 Roland McGrath <roland@redhat.com>
+
+ * testfile46.bz2: New data file.
+ * Makefile.am (EXTRA_DIST): Add it.
+ * run-elflint-test.sh: Test on it.
+
+2008-02-01 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am: Hook up sha1-tst.c.
+ * sha1-tst.c: New file.
+
+2008-01-21 Roland McGrath <roland@redhat.com>
+
+ * testfile45.S.bz2: Add tests for cltq, cqto.
+ * testfile45.expect.bz2: Adjust.
+
+2008-01-14 Ulrich Drepper <drepper@redhat.com>
+
+ * testfile45.S.bz2: Add more tests.
+ * testfile45.expect.bz2: Adjust.
+
+2008-01-11 Ulrich Drepper <drepper@redhat.com>
+
+ * testfile45.expect.bz2: Adjust for adding of address for %rip based
+ address mode.
+
+2008-01-10 Ulrich Drepper <drepper@redhat.com>
+
+ * testfile45.S.bz2: Add more tests.
+ * testfile45.expect.bz2: Adjust.
+
+2008-01-08 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am (TESTS): Add run-disasm-x86-64.sh.
+ (EXTRA): Add testfile45.S.bz2, testfile45.expect.bz2,
+ run-disasm-x86-64.sh.
+ * run-disasm-x86-64.sh: New file.
+ * testfile45.S.bz2: New file.
+ * testfile45.expect.bz2: New file.
+ * testfile44.S.bz2: New tests.
+ * testfile44.expect.bz2: Adjust.
+
+2008-01-04 Ulrich Drepper <drepper@redhat.com>
+
+ * testfile44.S.bz2: New tests.
+ * testfile44.expect.bz2: Adjust.
+
+2008-01-04 Roland McGrath <roland@redhat.com>
+
+ * dwfl-bug-fd-leak.c (main): Add a cast.
+
+2008-01-03 Ulrich Drepper <drepper@redhat.com>
+
+ * testfile44.S.bz2: New tests.
+ * testfile44.expect.bz2: Adjust.
+
+2008-01-01 Ulrich Drepper <drepper@redhat.com>
+
+ * line2addr.c: Use %m modifier instead of %a to appease gcc.
+
+2008-01-01 Ulrich Drepper <drepper@redhat.com>
+
+ * testfile44.S.bz2: New tests.
+ * testfile44.expect.bz2: Adjust.
+
+2007-12-31 Ulrich Drepper <drepper@redhat.com>
+
+ * testfile44.S.bz2: New tests.
+ * testfile44.expect.bz2: Adjust.
+
+2007-12-30 Ulrich Drepper <drepper@redhat.com>
+
+ * testfile44.S.bz2: New tests.
+ * testfile44.expect.bz2: Adjust.
+
+2007-12-29 Ulrich Drepper <drepper@redhat.com>
+
+ * testfile44.s.bz2: New tests.
+ * testfile44.expect.bz2: Adjust.
+
+2007-12-28 Ulrich Drepper <drepper@redhat.com>
+
+ * testfile44.S.bz2: New tests.
+ * testfile44.expect.bz2: Adjust.
+
+2007-12-27 Ulrich Drepper <drepper@redhat.com>
+
+ * testfile44.S.bz2: New tests.
+ * testfile44.expect.bz2: Adjust.
+
+2007-12-26 Ulrich Drepper <drepper@redhat.com>
+
+ * testfile44.S.bz2: New tests.
+ * testfile44.expect.bz2: Adjust
+
+2007-12-21 Ulrich Drepper <drepper@redhat.com>
+
+ * testfile44.S.bz2: More tests.
+ * testfile44.expect.bz2: Adjust appropriately.
+
+2007-12-19 Ulrich Drepper <drepper@redhat.com>
+
+ * Makefile.am (TESTS): Add run-disasm.sh.
+ (EXTRA_DIST): Add run-disasm.sh, testfile44.S.bz2, and
+ testfile44.expect.bz2.
+ * run-disasm.sh: New file.
+ * testfile44.S.bz2: New file.
+ * testfile44.expect.bz2: New file.
+
+2007-12-15 Roland McGrath <roland@redhat.com>
+
+ * run-allregs.sh: Change expected output for powerpc spefscr.
+
2007-08-04 Roland McGrath <roland@redhat.com>
* dwflmodtest.c (print_module_build_id): New function.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 339b1b97..af8cd0a8 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to create Makefile.in
##
-## Copyright (C) 1996-2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
+## Copyright (C) 1996-2010 Red Hat, Inc.
## This file is part of Red Hat elfutils.
##
## Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -24,26 +24,22 @@
## Network licensing program, please visit www.openinventionnetwork.com
## <http://www.openinventionnetwork.com>.
##
-DEFS = -DHAVE_CONFIG_H -D_GNU_SOURCE
+include $(top_srcdir)/config/eu.am
if MUDFLAP
-AM_CFLAGS = -Wall -Werror -Wextra -std=gnu99 -fmudflap\
- $(if $($(*F)_no_Wformat),-Wno-format,-Wformat=2)
BUILD_RPATH = \$$ORIGIN/../backends
else
-AM_CFLAGS = -Wall -Werror -Wextra -std=gnu99 \
- $(if $($(*F)_no_Wformat),-Wno-format,-Wformat=2)
BUILT_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 \
- -I$(top_srcdir)/libebl -I$(top_srcdir)/libelf \
- -I$(top_srcdir)/lib -I..
+INCLUDES += -I$(top_srcdir)/libasm -I$(top_srcdir)/libdw \
+ -I$(top_srcdir)/libdwfl \
+ -I$(top_srcdir)/libebl -I$(top_srcdir)/libelf \
+ -I$(top_srcdir)/lib -I..
AM_LDFLAGS += -Wl,-rpath-link,../libasm:../libdw:../libelf
-endif !STANDALONE
+endif
if TESTS_RPATH
AM_LDFLAGS += -Wl,-rpath,$(BUILT_RPATH)
@@ -59,8 +55,10 @@ noinst_PROGRAMS = arextract arsymtest newfile saridx scnnames sectiondump \
show-abbrev hash newscn ecp dwflmodtest \
find-prologues funcretval allregs rdwrmmap \
dwfl-bug-addr-overflow arls dwfl-bug-fd-leak \
- dwfl-addr-sect dwfl-bug-report coreregs
-# get-ciefde
+ dwfl-addr-sect dwfl-bug-report early-offscn \
+ dwfl-bug-getmodules dwarf-getmacros addrcfi \
+ coreregs \
+ test-flag-nobits
asm_TESTS = asm-tst1 asm-tst2 asm-tst3 asm-tst4 asm-tst5 \
asm-tst6 asm-tst7 asm-tst8 asm-tst9
@@ -71,7 +69,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \
run-show-abbrev.sh run-line2addr.sh hash \
newscn run-strip-test.sh run-strip-test2.sh \
run-strip-test3.sh run-strip-test4.sh run-strip-test5.sh \
- run-strip-test6.sh run-strip-test7.sh \
+ run-strip-test6.sh run-strip-test7.sh run-strip-test8.sh \
run-unstrip-test.sh run-unstrip-test2.sh \
run-ecp-test.sh run-ecp-test2.sh \
run-elflint-test.sh run-elflint-self.sh run-ranlib-test.sh \
@@ -83,12 +81,15 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \
run-native-test.sh run-bug1-test.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
+ run-dwfl-bug-offline-rel.sh run-dwfl-addr-sect.sh \
+ run-disasm-x86.sh run-disasm-x86-64.sh \
+ run-early-offscn.sh run-dwarf-getmacros.sh \
+ run-test-flag-nobits.sh
# run-show-ciefde.sh
if !STANDALONE
-noinst_PROGRAMS += msg_tst
-TESTS += msg_tst
+noinst_PROGRAMS += msg_tst sha1-tst
+TESTS += msg_tst sha1-tst
endif
if HAVE_LIBASM
@@ -108,13 +109,15 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
testfile13.bz2 run-strip-test3.sh run-allfcts.sh \
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-unstrip-test.sh run-unstrip-test2.sh \
+ run-strip-test7.sh run-strip-test8.sh \
+ run-unstrip-test.sh run-unstrip-test2.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-native-test.sh \
run-addrname-test.sh run-dwfl-bug-offline-rel.sh \
- run-dwfl-addr-sect.sh \
+ run-dwfl-addr-sect.sh run-early-offscn.sh \
+ run-dwarf-getmacros.sh run-test-flag-nobits.sh \
testfile15.bz2 testfile15.debug.bz2 \
testfile16.bz2 testfile16.debug.bz2 \
testfile17.bz2 testfile17.debug.bz2 \
@@ -133,7 +136,11 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
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 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
installed_TESTS_ENVIRONMENT = libdir=$(DESTDIR)$(libdir) \
bindir=$(DESTDIR)$(bindir) \
@@ -152,8 +159,7 @@ installcheck-local:
endif !STANDALONE
if MUDFLAP
-static_build=yes
-libmudflap = -lmudflap
+static_build = yes
endif
if STANDALONE
@@ -163,7 +169,7 @@ libasm = -lasm
libebl = -lebl
else !STANDALONE
if BUILD_STATIC
-libdw = ../libdw/libdw.a $(libelf) $(libebl) -ldl
+libdw = ../libdw/libdw.a $(zip_LIBS) $(libelf) $(libebl) -ldl
libelf = ../libelf/libelf.a
libasm = ../libasm/libasm.a
else
@@ -172,6 +178,7 @@ libelf = ../libelf/libelf.so
libasm = ../libasm/libasm.so
endif
libebl = ../libebl/libebl.a
+libeu = ../lib/libeu.a
endif !STANDALONE
arextract_LDADD = $(libelf) $(libmudflap)
@@ -185,6 +192,7 @@ 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)
@@ -215,15 +223,18 @@ 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)
+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
+sha1_tst_LDADD = $(libeu) $(libmudflap)
+dwarf_getmacros_LDADD = $(libdw) $(libmudflap)
+addrcfi_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl
coreregs_LDADD = $(libdw) $(libebl) $(libelf) $(libmudflap) -ldl
-
-CLEANFILES = xxx *.gcno *.gcda *gconv
+test_flag_nobits_LDADD = $(libelf) $(libmudflap)
if GCOV
check: check-am coverage
diff --git a/tests/addrcfi.c b/tests/addrcfi.c
new file mode 100644
index 00000000..4e042418
--- /dev/null
+++ b/tests/addrcfi.c
@@ -0,0 +1,207 @@
+/* Test program for CFI handling.
+ Copyright (C) 2009-2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#include <config.h>
+#include <assert.h>
+#include <inttypes.h>
+#include ELFUTILS_HEADER(dwfl)
+#include <dwarf.h>
+#include <argp.h>
+#include <stdio.h>
+#include <stdio_ext.h>
+#include <locale.h>
+#include <stdlib.h>
+#include <error.h>
+#include <string.h>
+
+
+static void
+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");
+ else
+ {
+ printf ("%s expression:", result == 0 ? "location" : "value");
+ for (size_t i = 0; i < nops; ++i)
+ {
+ printf (" %#x", ops[i].atom);
+ if (ops[i].number2 == 0)
+ {
+ if (ops[i].atom == DW_OP_addr)
+ printf ("(%#" PRIx64 ")", ops[i].number + bias);
+ else if (ops[i].number != 0)
+ printf ("(%" PRId64 ")", ops[i].number);
+ }
+ else
+ printf ("(%" PRId64 ",%" PRId64 ")",
+ ops[i].number, ops[i].number2);
+ }
+ puts ("");
+ }
+}
+
+struct stuff
+{
+ Dwarf_Frame *frame;
+ Dwarf_Addr bias;
+};
+
+static int
+print_register (void *arg,
+ int regno,
+ const char *setname,
+ const char *prefix,
+ const char *regname,
+ int bits __attribute__ ((unused)),
+ int type __attribute__ ((unused)))
+{
+ struct stuff *stuff = arg;
+
+ printf ("\t%s reg%u (%s%s): ", setname, regno, prefix, regname);
+
+ Dwarf_Op ops_mem[2];
+ Dwarf_Op *ops;
+ size_t nops;
+ int result = dwarf_frame_register (stuff->frame, regno, ops_mem, &ops, &nops);
+ print_detail (result, ops, nops, stuff->bias);
+
+ return DWARF_CB_OK;
+}
+
+static int
+handle_cfi (Dwfl *dwfl, const char *which, Dwarf_CFI *cfi,
+ GElf_Addr pc, struct stuff *stuff)
+{
+ 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));
+ return 1;
+ }
+
+ Dwarf_Addr start = pc;
+ Dwarf_Addr end = pc;
+ bool signalp;
+ int ra_regno = dwarf_frame_info (stuff->frame, &start, &end, &signalp);
+ if (ra_regno >= 0)
+ {
+ start += stuff->bias;
+ end += stuff->bias;
+ }
+
+ printf ("%s has %#" PRIx64 " => [%#" PRIx64 ", %#" PRIx64 "):\n",
+ which, pc, start, end);
+
+ if (ra_regno < 0)
+ printf ("\treturn address register unavailable (%s)\n",
+ dwarf_errmsg (0));
+ else
+ printf ("\treturn address in reg%u%s\n",
+ ra_regno, signalp ? " (signal frame)" : "");
+
+ Dwarf_Op *cfa_ops;
+ size_t cfa_nops;
+ result = dwarf_frame_cfa (stuff->frame, &cfa_ops, &cfa_nops);
+
+ printf ("\tCFA ");
+ print_detail (result, cfa_ops, cfa_nops, stuff->bias);
+
+ (void) dwfl_module_register_names (dwfl_addrmodule (dwfl, pc),
+ &print_register, stuff);
+
+ return 0;
+}
+
+static int
+handle_address (GElf_Addr pc, Dwfl *dwfl)
+{
+ Dwfl_Module *mod = dwfl_addrmodule (dwfl, pc);
+
+ struct stuff stuff;
+ return (handle_cfi (dwfl, ".eh_frame",
+ dwfl_module_eh_cfi (mod, &stuff.bias), pc, &stuff)
+ & handle_cfi (dwfl, ".debug_frame",
+ dwfl_module_dwarf_cfi (mod, &stuff.bias), pc, &stuff));
+}
+
+int
+main (int argc, char *argv[])
+{
+ int remaining;
+
+ /* Set locale. */
+ (void) setlocale (LC_ALL, "");
+
+ Dwfl *dwfl = NULL;
+ (void) argp_parse (dwfl_standard_argp (), argc, argv, 0, &remaining, &dwfl);
+ assert (dwfl != NULL);
+
+ int result = 0;
+
+ /* Now handle the addresses. In case none are given on the command
+ line, read from stdin. */
+ if (remaining == argc)
+ {
+ /* We use no threads here which can interfere with handling a stream. */
+ (void) __fsetlocking (stdin, FSETLOCKING_BYCALLER);
+
+ char *buf = NULL;
+ size_t len = 0;
+ while (!feof_unlocked (stdin))
+ {
+ if (getline (&buf, &len, stdin) < 0)
+ break;
+
+ char *endp;
+ uintmax_t addr = strtoumax (buf, &endp, 0);
+ if (endp != buf)
+ result |= handle_address (addr, dwfl);
+ else
+ result = 1;
+ }
+
+ free (buf);
+ }
+ else
+ {
+ do
+ {
+ char *endp;
+ uintmax_t addr = strtoumax (argv[remaining], &endp, 0);
+ if (endp != argv[remaining])
+ result |= handle_address (addr, dwfl);
+ else
+ result = 1;
+ }
+ while (++remaining < argc);
+ }
+
+ dwfl_end (dwfl);
+
+ return result;
+}
diff --git a/tests/asm-tst9.c b/tests/asm-tst9.c
index 1797e48c..ad252759 100644
--- a/tests/asm-tst9.c
+++ b/tests/asm-tst9.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2005 Red Hat, Inc.
+/* Copyright (C) 2002-2010 Red Hat, Inc.
This file is part of Red Hat elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 2002.
@@ -211,19 +211,19 @@ main (void)
for (cnt = 1; cnt < 3; ++cnt)
{
- Elf_Scn *scn;
+ Elf_Scn *escn;
GElf_Shdr shdr_mem;
GElf_Shdr *shdr;
- scn = elf_getscn (elf, cnt);
- if (scn == NULL)
+ escn = elf_getscn (elf, cnt);
+ if (escn == NULL)
{
printf ("cannot get section %Zd: %s\n", cnt, elf_errmsg (-1));
result = 1;
continue;
}
- shdr = gelf_getshdr (scn, &shdr_mem);
+ shdr = gelf_getshdr (escn, &shdr_mem);
if (shdr == NULL)
{
printf ("cannot get section header for section %Zd: %s\n",
@@ -303,7 +303,7 @@ main (void)
if (cnt == 1)
{
- Elf_Data *data = elf_getdata (scn, NULL);
+ Elf_Data *data = elf_getdata (escn, NULL);
if (data == NULL)
{
diff --git a/tests/dwarf-getmacros.c b/tests/dwarf-getmacros.c
new file mode 100644
index 00000000..5c380976
--- /dev/null
+++ b/tests/dwarf-getmacros.c
@@ -0,0 +1,64 @@
+/* Test program for dwfl_module_return_value_location.
+ Copyright (C) 2009 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#include <config.h>
+#include ELFUTILS_HEADER(dw)
+#include <dwarf.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+int
+main (int argc __attribute__ ((unused)), char *argv[])
+{
+ const char *name = argv[1];
+ ptrdiff_t cuoff = strtol (argv[2], NULL, 0);
+
+ int fd = open (name, O_RDONLY);
+ Dwarf *dbg = dwarf_begin (fd, DWARF_C_READ);
+
+ Dwarf_Die cudie_mem, *cudie = dwarf_offdie (dbg, cuoff, &cudie_mem);
+ int mac (Dwarf_Macro *macro, void *data __attribute__ ((unused)))
+ {
+ unsigned int opcode;
+ dwarf_macro_opcode (macro, &opcode);
+ if (opcode == DW_MACINFO_define)
+ {
+ const char *value;
+ dwarf_macro_param2 (macro, NULL, &value);
+ puts (value);
+ }
+ return DWARF_CB_ABORT;
+ }
+
+ ptrdiff_t off = 0;
+ while ((off = dwarf_getmacros (cudie, mac, NULL, off)) > 0)
+ ;
+
+ return 0;
+}
diff --git a/tests/dwfl-bug-fd-leak.c b/tests/dwfl-bug-fd-leak.c
index c75a79b6..37ff402e 100644
--- a/tests/dwfl-bug-fd-leak.c
+++ b/tests/dwfl-bug-fd-leak.c
@@ -1,5 +1,5 @@
/* Test program for libdwfl file decriptors leakage.
- Copyright (C) 2007 Red Hat, Inc.
+ Copyright (C) 2007, 2008 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -102,7 +102,7 @@ main (void)
for (int i = 0; i < 5000; ++i)
{
- Dwfl *dwfl = elfutils_open (getpid (), (Dwarf_Addr) main);
+ Dwfl *dwfl = elfutils_open (getpid (), (Dwarf_Addr) (uintptr_t) &main);
elfutils_close (dwfl);
}
diff --git a/tests/dwfl-bug-getmodules.c b/tests/dwfl-bug-getmodules.c
new file mode 100644
index 00000000..f7042c02
--- /dev/null
+++ b/tests/dwfl-bug-getmodules.c
@@ -0,0 +1,74 @@
+/* Test program for dwfl_getmodules bug.
+ Copyright (C) 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#include <config.h>
+#include ELFUTILS_HEADER(dwfl)
+
+#include <error.h>
+
+static const Dwfl_Callbacks callbacks =
+ {
+ .find_elf = dwfl_linux_proc_find_elf,
+ .find_debuginfo = dwfl_standard_find_debuginfo,
+ };
+
+static int
+iterate (Dwfl_Module *mod __attribute__ ((unused)),
+ void **userdata __attribute__ ((unused)),
+ const char *name __attribute__ ((unused)),
+ Dwarf_Addr base, void *arg)
+{
+ if (base != 0x2000)
+ return DWARF_CB_OK;
+
+ if (dwfl_addrmodule (arg, 0x2100) == NULL)
+ error (1, 0, "dwfl_addrmodule: %s", dwfl_errmsg (-1));
+
+ return DWARF_CB_ABORT;
+}
+
+int
+main (void)
+{
+ Dwfl *dwfl = dwfl_begin (&callbacks);
+
+ dwfl_report_module (dwfl, "m1", 0, 0x1000);
+ dwfl_report_module (dwfl, "m2", 0x2000, 0x3000);
+ dwfl_report_module (dwfl, "m3", 0x4000, 0x5000);
+
+ dwfl_report_end (dwfl, NULL, NULL);
+
+ ptrdiff_t offset = dwfl_getmodules (dwfl, &iterate, dwfl, 0);
+ if (offset <= 0)
+ error (1, 0, "dwfl_getmodules: %s", dwfl_errmsg (-1));
+
+ offset = dwfl_getmodules (dwfl, &iterate, NULL, offset);
+ if (offset != 0)
+ error (1, 0, "dwfl_getmodules (%d): %s", (int) offset, dwfl_errmsg (-1));
+
+ dwfl_end (dwfl);
+
+ return 0;
+}
diff --git a/tests/early-offscn.c b/tests/early-offscn.c
new file mode 100644
index 00000000..8778d506
--- /dev/null
+++ b/tests/early-offscn.c
@@ -0,0 +1,60 @@
+/* Copyright (C) 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <errno.h>
+#include <error.h>
+#include <fcntl.h>
+#include <gelf.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main (int argc, char *argv[])
+{
+ if (argc < 2)
+ error (1, 0, "Usage: %s FILE OFFSET", argv[0]);
+
+ /* Set the ELF version. */
+ elf_version (EV_CURRENT);
+
+ /* Open the archive. */
+ int fd = open (argv[1], O_RDONLY);
+ if (fd < 0)
+ error (1, errno, "cannot open '%s'", argv[1]);
+
+ Elf *elf = elf_begin (fd, ELF_C_READ, NULL);
+ if (elf == NULL)
+ error (2, 0, "elf_begin: %s", elf_errmsg (-1));
+
+ Elf_Scn *scn = gelf_offscn (elf, strtoull (argv[2], NULL, 0));
+ if (scn == NULL)
+ error (3, 0, "gelf_offscn: %s", elf_errmsg (-1));
+
+ elf_end (elf);
+ return 0;
+}
diff --git a/tests/line2addr.c b/tests/line2addr.c
index 1180062c..5630da3c 100644
--- a/tests/line2addr.c
+++ b/tests/line2addr.c
@@ -132,7 +132,7 @@ main (int argc, char *argv[])
{
struct args a = { .arg = argv[cnt] };
- switch (sscanf (a.arg, "%a[^:]:%d", &a.file, &a.line))
+ switch (sscanf (a.arg, "%m[^:]:%d", &a.file, &a.line))
{
default:
case 0:
diff --git a/tests/msg_tst.c b/tests/msg_tst.c
index db078533..f2390962 100644
--- a/tests/msg_tst.c
+++ b/tests/msg_tst.c
@@ -64,7 +64,7 @@ static struct
{ ELF_E_INVALID_COMMAND, "invalid command" },
{ ELF_E_WRONG_ORDER_EHDR, "executable header not created first" },
{ ELF_E_FD_DISABLED, "file descriptor disabled" },
- { ELF_E_FD_MISMATCH, "archive/member fildes mismatch" },
+ { ELF_E_FD_MISMATCH, "archive/member file descriptor mismatch" },
{ ELF_E_OFFSET_RANGE, "offset out of range" },
{ ELF_E_NOT_NUL_SECTION, "cannot manipulate null section" },
{ ELF_E_DATA_MISMATCH, "data/scn mismatch" },
diff --git a/tests/run-addrname-test.sh b/tests/run-addrname-test.sh
index ce47fe10..d525523d 100755
--- a/tests/run-addrname-test.sh
+++ b/tests/run-addrname-test.sh
@@ -1,5 +1,5 @@
#! /bin/sh
-# Copyright (C) 2007 Red Hat, Inc.
+# Copyright (C) 2007, 2008 Red Hat, Inc.
# This file is part of Red Hat elfutils.
#
# Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -25,7 +25,7 @@
. $srcdir/test-subr.sh
-testfiles testfile34 testfile38 testfile41
+testfiles testfile34 testfile38 testfile41 testfile49
testrun_compare ../src/addr2line -f -e testfile34 \
0x08048074 0x08048075 0x08048076 \
@@ -62,4 +62,161 @@ small_global_first_at_large_global+0x1
??:0
EOF
+testfiles testfile12 testfile14
+tempfiles testmaps
+
+cat > testmaps <<EOF
+00400000-00401000 r-xp 00000000 fd:01 4006812 `pwd`/testfile14
+00500000-00501000 rw-p 00000000 fd:01 4006812 `pwd`/testfile14
+01000000-01001000 r-xp 00000000 fd:01 1234567 `pwd`/testfile12
+01100000-01011000 rw-p 00000000 fd:01 1234567 `pwd`/testfile12
+2aaaaaaab000-2aaaaaaad000 rw-p 2aaaaaaab000 00:00 0
+2aaaaaae2000-2aaaaaae3000 rw-p 2aaaaaae2000 00:00 0
+7fff61068000-7fff6107d000 rw-p 7ffffffea000 00:00 0 [stack]
+7fff611fe000-7fff61200000 r-xp 7fff611fe000 00:00 0 [vdso]
+ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
+EOF
+
+testrun_compare ../src/addr2line -S -M testmaps 0x40047c 0x10009db <<\EOF
+caller+0x14
+/home/drepper/local/elfutils-build/20050425/v.c:11
+foo+0xb
+/home/drepper/local/elfutils-build/20030710/u.c:5
+EOF
+
+# .section .text
+# nop #0
+#sizeless_foo:
+# nop #1
+# nop #2
+#sized_bar:
+# nop #3
+# nop #4
+#sizeless_baz:
+# nop #5
+# nop #6
+# .size sized_bar, . - sized_bar
+# nop #7
+# nop #8
+#sizeless_x:
+# nop #9
+# .org 0x100
+# nop #0
+# .globl global_outer
+#global_outer:
+# nop #1
+# nop #2
+# .globl global_in_global
+#global_in_global:
+# nop #3
+# nop #4
+# .size global_in_global, . - global_in_global
+#local_in_global:
+# nop #5
+# nop #6
+# .size local_in_global, . - local_in_global
+# nop #7
+# nop #8
+#.Lsizeless1:
+# nop #9
+# nop #10
+# .size global_outer, . - global_outer
+# nop #11
+# .org 0x200
+# nop #0
+#local_outer:
+# nop #1
+# nop #2
+# .globl global_in_local
+#global_in_local:
+# nop #3
+# nop #4
+# .size global_in_local, . - global_in_local
+#local_in_local:
+# nop #5
+# nop #6
+# .size local_in_local, . - local_in_local
+# nop #7
+# nop #8
+#.Lsizeless2:
+# nop #9
+# nop #10
+# .size local_outer, . - local_outer
+# nop #11
+testrun_compare ../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 \
+ 0x200 0x201 0x202 0x203 0x204 0x205 \
+ 0x206 0x207 0x208 0x209 0x20a 0x20b <<\EOF
+(.text)+0
+??:0
+sizeless_foo
+??:0
+sizeless_foo+0x1
+??:0
+sized_bar
+??:0
+sized_bar+0x1
+??:0
+sized_bar+0x2
+??:0
+sized_bar+0x3
+??:0
+(.text)+0x7
+??:0
+(.text)+0x8
+??:0
+sizeless_x
+??:0
+sizeless_x+0xf7
+??:0
+global_outer
+??:0
+global_outer+0x1
+??:0
+global_in_global
+??:0
+global_in_global+0x1
+??:0
+global_outer+0x4
+??:0
+global_outer+0x5
+??:0
+global_outer+0x6
+??:0
+global_outer+0x7
+??:0
+global_outer+0x8
+??:0
+global_outer+0x9
+??:0
+(.text)+0x10b
+??:0
+(.text)+0x200
+??:0
+local_outer
+??:0
+local_outer+0x1
+??:0
+global_in_local
+??:0
+global_in_local+0x1
+??:0
+local_in_local
+??:0
+local_in_local+0x1
+??:0
+local_outer+0x6
+??:0
+local_outer+0x7
+??:0
+local_outer+0x8
+??:0
+local_outer+0x9
+??:0
+(.text)+0x20b
+??:0
+EOF
+
exit 0
diff --git a/tests/run-allregs.sh b/tests/run-allregs.sh
index 82d57409..7ebaa719 100755
--- a/tests/run-allregs.sh
+++ b/tests/run-allregs.sh
@@ -757,7 +757,6 @@ privileged registers:
609: spr509 (spr509), unsigned 32 bits
610: spr510 (spr510), unsigned 32 bits
611: spr511 (spr511), unsigned 32 bits
- 612: spr512 (spr512), unsigned 32 bits
613: spr513 (spr513), unsigned 32 bits
614: spr514 (spr514), unsigned 32 bits
615: spr515 (spr515), unsigned 32 bits
@@ -1148,6 +1147,7 @@ privileged registers:
vector registers:
67: vscr (vscr), unsigned 32 bits
356: vrsave (vrsave), unsigned 32 bits
+ 612: spefscr (spefscr), unsigned 32 bits
1124: vr0 (vr0), unsigned 128 bits
1125: vr1 (vr1), unsigned 128 bits
1126: vr2 (vr2), unsigned 128 bits
@@ -1780,7 +1780,6 @@ privileged registers:
609: spr509 (spr509), unsigned 64 bits
610: spr510 (spr510), unsigned 64 bits
611: spr511 (spr511), unsigned 64 bits
- 612: spr512 (spr512), unsigned 64 bits
613: spr513 (spr513), unsigned 64 bits
614: spr514 (spr514), unsigned 64 bits
615: spr515 (spr515), unsigned 64 bits
@@ -2171,6 +2170,7 @@ privileged registers:
vector registers:
67: vscr (vscr), unsigned 32 bits
356: vrsave (vrsave), unsigned 32 bits
+ 612: spefscr (spefscr), unsigned 32 bits
1124: vr0 (vr0), unsigned 128 bits
1125: vr1 (vr1), unsigned 128 bits
1126: vr2 (vr2), unsigned 128 bits
diff --git a/tests/run-disasm-x86-64.sh b/tests/run-disasm-x86-64.sh
new file mode 100755
index 00000000..01803c0a
--- /dev/null
+++ b/tests/run-disasm-x86-64.sh
@@ -0,0 +1,36 @@
+#! /bin/sh
+# Copyright (C) 2007, 2008 Red Hat, Inc.
+# This file is part of Red Hat elfutils.
+#
+# Red Hat elfutils 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; version 2 of the License.
+#
+# Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+#
+# Red Hat elfutils is an included package of the Open Invention Network.
+# An included package of the Open Invention Network is a package for which
+# Open Invention Network licensees cross-license their patents. No patent
+# license is granted, either expressly or impliedly, by designation as an
+# included package. Should you wish to participate in the Open Invention
+# Network licensing program, please visit www.openinventionnetwork.com
+# <http://www.openinventionnetwork.com>.
+
+. $srcdir/test-subr.sh
+
+# Run x86-64 test.
+case "`uname -m`" in
+ x86_64)
+ 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
+ ;;
+esac
diff --git a/tests/run-disasm-x86.sh b/tests/run-disasm-x86.sh
new file mode 100755
index 00000000..efd734c0
--- /dev/null
+++ b/tests/run-disasm-x86.sh
@@ -0,0 +1,36 @@
+#! /bin/sh
+# Copyright (C) 2007, 2008 Red Hat, Inc.
+# This file is part of Red Hat elfutils.
+#
+# Red Hat elfutils 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; version 2 of the License.
+#
+# Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+#
+# Red Hat elfutils is an included package of the Open Invention Network.
+# An included package of the Open Invention Network is a package for which
+# Open Invention Network licensees cross-license their patents. No patent
+# license is granted, either expressly or impliedly, by designation as an
+# included package. Should you wish to participate in the Open Invention
+# Network licensing program, please visit www.openinventionnetwork.com
+# <http://www.openinventionnetwork.com>.
+
+. $srcdir/test-subr.sh
+
+# Run x86 test.
+case "`uname -m`" in
+ x86_64 | i?86 )
+ 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
+ ;;
+esac
diff --git a/tests/run-dwarf-getmacros.sh b/tests/run-dwarf-getmacros.sh
new file mode 100755
index 00000000..d29c5349
--- /dev/null
+++ b/tests/run-dwarf-getmacros.sh
@@ -0,0 +1,296 @@
+#! /bin/sh
+# Copyright (C) 2009 Red Hat, Inc.
+# This file is part of Red Hat elfutils.
+#
+# Red Hat elfutils 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; version 2 of the License.
+#
+# Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+#
+# Red Hat elfutils is an included package of the Open Invention Network.
+# An included package of the Open Invention Network is a package for which
+# Open Invention Network licensees cross-license their patents. No patent
+# license is granted, either expressly or impliedly, by designation as an
+# included package. Should you wish to participate in the Open Invention
+# Network licensing program, please visit www.openinventionnetwork.com
+# <http://www.openinventionnetwork.com>.
+
+. $srcdir/test-subr.sh
+
+testfiles testfile51
+
+testrun_compare ./dwarf-getmacros testfile51 0xb <<\EOF
+__STDC__ 1
+__STDC_HOSTED__ 1
+__GNUC__ 4
+__GNUC_MINOR__ 3
+__GNUC_PATCHLEVEL__ 2
+__GNUC_RH_RELEASE__ 7
+__SIZE_TYPE__ long unsigned int
+__PTRDIFF_TYPE__ long int
+__WCHAR_TYPE__ int
+__WINT_TYPE__ unsigned int
+__INTMAX_TYPE__ long int
+__UINTMAX_TYPE__ long unsigned int
+__GXX_ABI_VERSION 1002
+__SCHAR_MAX__ 127
+__SHRT_MAX__ 32767
+__INT_MAX__ 2147483647
+__LONG_MAX__ 9223372036854775807L
+__LONG_LONG_MAX__ 9223372036854775807LL
+__WCHAR_MAX__ 2147483647
+__CHAR_BIT__ 8
+__INTMAX_MAX__ 9223372036854775807L
+__FLT_EVAL_METHOD__ 0
+__DEC_EVAL_METHOD__ 2
+__FLT_RADIX__ 2
+__FLT_MANT_DIG__ 24
+__FLT_DIG__ 6
+__FLT_MIN_EXP__ (-125)
+__FLT_MIN_10_EXP__ (-37)
+__FLT_MAX_EXP__ 128
+__FLT_MAX_10_EXP__ 38
+__FLT_MAX__ 3.40282347e+38F
+__FLT_MIN__ 1.17549435e-38F
+__FLT_EPSILON__ 1.19209290e-7F
+__FLT_DENORM_MIN__ 1.40129846e-45F
+__FLT_HAS_DENORM__ 1
+__FLT_HAS_INFINITY__ 1
+__FLT_HAS_QUIET_NAN__ 1
+__DBL_MANT_DIG__ 53
+__DBL_DIG__ 15
+__DBL_MIN_EXP__ (-1021)
+__DBL_MIN_10_EXP__ (-307)
+__DBL_MAX_EXP__ 1024
+__DBL_MAX_10_EXP__ 308
+__DBL_MAX__ 1.7976931348623157e+308
+__DBL_MIN__ 2.2250738585072014e-308
+__DBL_EPSILON__ 2.2204460492503131e-16
+__DBL_DENORM_MIN__ 4.9406564584124654e-324
+__DBL_HAS_DENORM__ 1
+__DBL_HAS_INFINITY__ 1
+__DBL_HAS_QUIET_NAN__ 1
+__LDBL_MANT_DIG__ 64
+__LDBL_DIG__ 18
+__LDBL_MIN_EXP__ (-16381)
+__LDBL_MIN_10_EXP__ (-4931)
+__LDBL_MAX_EXP__ 16384
+__LDBL_MAX_10_EXP__ 4932
+__DECIMAL_DIG__ 21
+__LDBL_MAX__ 1.18973149535723176502e+4932L
+__LDBL_MIN__ 3.36210314311209350626e-4932L
+__LDBL_EPSILON__ 1.08420217248550443401e-19L
+__LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
+__LDBL_HAS_DENORM__ 1
+__LDBL_HAS_INFINITY__ 1
+__LDBL_HAS_QUIET_NAN__ 1
+__DEC32_MANT_DIG__ 7
+__DEC32_MIN_EXP__ (-95)
+__DEC32_MAX_EXP__ 96
+__DEC32_MIN__ 1E-95DF
+__DEC32_MAX__ 9.999999E96DF
+__DEC32_EPSILON__ 1E-6DF
+__DEC32_DEN__ 0.000001E-95DF
+__DEC64_MANT_DIG__ 16
+__DEC64_MIN_EXP__ (-383)
+__DEC64_MAX_EXP__ 384
+__DEC64_MIN__ 1E-383DD
+__DEC64_MAX__ 9.999999999999999E384DD
+__DEC64_EPSILON__ 1E-15DD
+__DEC64_DEN__ 0.000000000000001E-383DD
+__DEC128_MANT_DIG__ 34
+__DEC128_MIN_EXP__ (-6143)
+__DEC128_MAX_EXP__ 6144
+__DEC128_MIN__ 1E-6143DL
+__DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
+__DEC128_EPSILON__ 1E-33DL
+__DEC128_DEN__ 0.000000000000000000000000000000001E-6143DL
+__REGISTER_PREFIX__
+__USER_LABEL_PREFIX__
+__VERSION__ "4.3.2 20081105 (Red Hat 4.3.2-7)"
+__GNUC_GNU_INLINE__ 1
+_LP64 1
+__LP64__ 1
+__NO_INLINE__ 1
+__FINITE_MATH_ONLY__ 0
+__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
+__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
+__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
+__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
+__SIZEOF_INT__ 4
+__SIZEOF_LONG__ 8
+__SIZEOF_LONG_LONG__ 8
+__SIZEOF_SHORT__ 2
+__SIZEOF_FLOAT__ 4
+__SIZEOF_DOUBLE__ 8
+__SIZEOF_LONG_DOUBLE__ 16
+__SIZEOF_SIZE_T__ 8
+__SIZEOF_WCHAR_T__ 4
+__SIZEOF_WINT_T__ 4
+__SIZEOF_PTRDIFF_T__ 8
+__SIZEOF_POINTER__ 8
+__amd64 1
+__amd64__ 1
+__x86_64 1
+__x86_64__ 1
+__k8 1
+__k8__ 1
+__MMX__ 1
+__SSE__ 1
+__SSE2__ 1
+__SSE_MATH__ 1
+__SSE2_MATH__ 1
+__gnu_linux__ 1
+__linux 1
+__linux__ 1
+linux 1
+__unix 1
+__unix__ 1
+unix 1
+__ELF__ 1
+__DECIMAL_BID_FORMAT__ 1
+macro1 ble
+EOF
+
+testrun_compare ./dwarf-getmacros testfile51 0x84 <<\EOF
+__STDC__ 1
+__STDC_HOSTED__ 1
+__GNUC__ 4
+__GNUC_MINOR__ 3
+__GNUC_PATCHLEVEL__ 2
+__GNUC_RH_RELEASE__ 7
+__SIZE_TYPE__ long unsigned int
+__PTRDIFF_TYPE__ long int
+__WCHAR_TYPE__ int
+__WINT_TYPE__ unsigned int
+__INTMAX_TYPE__ long int
+__UINTMAX_TYPE__ long unsigned int
+__GXX_ABI_VERSION 1002
+__SCHAR_MAX__ 127
+__SHRT_MAX__ 32767
+__INT_MAX__ 2147483647
+__LONG_MAX__ 9223372036854775807L
+__LONG_LONG_MAX__ 9223372036854775807LL
+__WCHAR_MAX__ 2147483647
+__CHAR_BIT__ 8
+__INTMAX_MAX__ 9223372036854775807L
+__FLT_EVAL_METHOD__ 0
+__DEC_EVAL_METHOD__ 2
+__FLT_RADIX__ 2
+__FLT_MANT_DIG__ 24
+__FLT_DIG__ 6
+__FLT_MIN_EXP__ (-125)
+__FLT_MIN_10_EXP__ (-37)
+__FLT_MAX_EXP__ 128
+__FLT_MAX_10_EXP__ 38
+__FLT_MAX__ 3.40282347e+38F
+__FLT_MIN__ 1.17549435e-38F
+__FLT_EPSILON__ 1.19209290e-7F
+__FLT_DENORM_MIN__ 1.40129846e-45F
+__FLT_HAS_DENORM__ 1
+__FLT_HAS_INFINITY__ 1
+__FLT_HAS_QUIET_NAN__ 1
+__DBL_MANT_DIG__ 53
+__DBL_DIG__ 15
+__DBL_MIN_EXP__ (-1021)
+__DBL_MIN_10_EXP__ (-307)
+__DBL_MAX_EXP__ 1024
+__DBL_MAX_10_EXP__ 308
+__DBL_MAX__ 1.7976931348623157e+308
+__DBL_MIN__ 2.2250738585072014e-308
+__DBL_EPSILON__ 2.2204460492503131e-16
+__DBL_DENORM_MIN__ 4.9406564584124654e-324
+__DBL_HAS_DENORM__ 1
+__DBL_HAS_INFINITY__ 1
+__DBL_HAS_QUIET_NAN__ 1
+__LDBL_MANT_DIG__ 64
+__LDBL_DIG__ 18
+__LDBL_MIN_EXP__ (-16381)
+__LDBL_MIN_10_EXP__ (-4931)
+__LDBL_MAX_EXP__ 16384
+__LDBL_MAX_10_EXP__ 4932
+__DECIMAL_DIG__ 21
+__LDBL_MAX__ 1.18973149535723176502e+4932L
+__LDBL_MIN__ 3.36210314311209350626e-4932L
+__LDBL_EPSILON__ 1.08420217248550443401e-19L
+__LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
+__LDBL_HAS_DENORM__ 1
+__LDBL_HAS_INFINITY__ 1
+__LDBL_HAS_QUIET_NAN__ 1
+__DEC32_MANT_DIG__ 7
+__DEC32_MIN_EXP__ (-95)
+__DEC32_MAX_EXP__ 96
+__DEC32_MIN__ 1E-95DF
+__DEC32_MAX__ 9.999999E96DF
+__DEC32_EPSILON__ 1E-6DF
+__DEC32_DEN__ 0.000001E-95DF
+__DEC64_MANT_DIG__ 16
+__DEC64_MIN_EXP__ (-383)
+__DEC64_MAX_EXP__ 384
+__DEC64_MIN__ 1E-383DD
+__DEC64_MAX__ 9.999999999999999E384DD
+__DEC64_EPSILON__ 1E-15DD
+__DEC64_DEN__ 0.000000000000001E-383DD
+__DEC128_MANT_DIG__ 34
+__DEC128_MIN_EXP__ (-6143)
+__DEC128_MAX_EXP__ 6144
+__DEC128_MIN__ 1E-6143DL
+__DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
+__DEC128_EPSILON__ 1E-33DL
+__DEC128_DEN__ 0.000000000000000000000000000000001E-6143DL
+__REGISTER_PREFIX__
+__USER_LABEL_PREFIX__
+__VERSION__ "4.3.2 20081105 (Red Hat 4.3.2-7)"
+__GNUC_GNU_INLINE__ 1
+_LP64 1
+__LP64__ 1
+__NO_INLINE__ 1
+__FINITE_MATH_ONLY__ 0
+__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
+__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
+__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
+__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
+__SIZEOF_INT__ 4
+__SIZEOF_LONG__ 8
+__SIZEOF_LONG_LONG__ 8
+__SIZEOF_SHORT__ 2
+__SIZEOF_FLOAT__ 4
+__SIZEOF_DOUBLE__ 8
+__SIZEOF_LONG_DOUBLE__ 16
+__SIZEOF_SIZE_T__ 8
+__SIZEOF_WCHAR_T__ 4
+__SIZEOF_WINT_T__ 4
+__SIZEOF_PTRDIFF_T__ 8
+__SIZEOF_POINTER__ 8
+__amd64 1
+__amd64__ 1
+__x86_64 1
+__x86_64__ 1
+__k8 1
+__k8__ 1
+__MMX__ 1
+__SSE__ 1
+__SSE2__ 1
+__SSE_MATH__ 1
+__SSE2_MATH__ 1
+__gnu_linux__ 1
+__linux 1
+__linux__ 1
+linux 1
+__unix 1
+__unix__ 1
+unix 1
+__ELF__ 1
+__DECIMAL_BID_FORMAT__ 1
+macro2 ble
+EOF
+
+exit 0
diff --git a/tests/run-dwfl-addr-sect.sh b/tests/run-dwfl-addr-sect.sh
index 69280f58..f33a6e42 100755
--- a/tests/run-dwfl-addr-sect.sh
+++ b/tests/run-dwfl-addr-sect.sh
@@ -1,5 +1,5 @@
#! /bin/sh
-# Copyright (C) 2007 Red Hat, Inc.
+# Copyright (C) 2007-2009 Red Hat, Inc.
# This file is part of Red Hat elfutils.
#
# Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -25,13 +25,16 @@
. $srcdir/test-subr.sh
-testfiles testfile43
+testfiles testfile43 testfile50
-export LC_ALL=C
testrun_compare ./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
+address 0x1 => module "" section 1 + 0x1
+EOF
+
exit 0
diff --git a/tests/run-early-offscn.sh b/tests/run-early-offscn.sh
new file mode 100755
index 00000000..70be2192
--- /dev/null
+++ b/tests/run-early-offscn.sh
@@ -0,0 +1,32 @@
+#! /bin/sh
+# Copyright (C) 2008 Red Hat, Inc.
+# This file is part of Red Hat elfutils.
+#
+# Red Hat elfutils 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; version 2 of the License.
+#
+# Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+#
+# Red Hat elfutils is an included package of the Open Invention Network.
+# An included package of the Open Invention Network is a package for which
+# Open Invention Network licensees cross-license their patents. No patent
+# license is granted, either expressly or impliedly, by designation as an
+# included package. Should you wish to participate in the Open Invention
+# Network licensing program, please visit www.openinventionnetwork.com
+# <http://www.openinventionnetwork.com>.
+
+. $srcdir/test-subr.sh
+
+testfiles testfile
+
+testrun ./early-offscn testfile 0x500
+
+exit 0
diff --git a/tests/run-elflint-test.sh b/tests/run-elflint-test.sh
index a0b93a25..e0e1c547 100755
--- a/tests/run-elflint-test.sh
+++ b/tests/run-elflint-test.sh
@@ -1,5 +1,5 @@
#! /bin/sh
-# Copyright (C) 2005, 2007 Red Hat, Inc.
+# Copyright (C) 2005, 2007, 2008 Red Hat, Inc.
# This file is part of Red Hat elfutils.
# Written by Ulrich Drepper <drepper@redhat.com>, 2005.
#
@@ -41,4 +41,7 @@ testrun ../src/elflint -q testfile33
testfiles testfile42
testrun ../src/elflint -q --gnu-ld testfile42
+testfiles testfile46
+testrun ../src/elflint -q testfile46
+
exit 0
diff --git a/tests/run-strings-test.sh b/tests/run-strings-test.sh
index cfd9d236..a5dac634 100755
--- a/tests/run-strings-test.sh
+++ b/tests/run-strings-test.sh
@@ -1,5 +1,5 @@
#! /bin/sh
-# Copyright (C) 2005, 2006 Red Hat, Inc.
+# Copyright (C) 2005, 2006, 2008 Red Hat, Inc.
# This file is part of Red Hat elfutils.
# Written by Ulrich Drepper <drepper@redhat.com>, 2005.
#
@@ -29,9 +29,6 @@
files="testfile `seq 2 9 | while read n; do echo testfile$n; done`"
testfiles $files
-LC_ALL=C
-export LC_ALL
-
testrun_compare ../src/strings -tx -f $files <<\EOF
testfile: f4 /lib/ld-linux.so.2
testfile: 1c9 __gmon_start__
diff --git a/tests/run-strip-test.sh b/tests/run-strip-test.sh
index 480101eb..e056f890 100755
--- a/tests/run-strip-test.sh
+++ b/tests/run-strip-test.sh
@@ -1,5 +1,5 @@
#! /bin/sh
-# Copyright (C) 1999, 2000, 2002, 2003, 2005, 2007 Red Hat, Inc.
+# Copyright (C) 1999, 2000, 2002, 2003, 2005, 2007, 2008 Red Hat, Inc.
# This file is part of Red Hat elfutils.
# Written by Ulrich Drepper <drepper@redhat.com>, 1999.
#
@@ -30,7 +30,8 @@ original=${original:-testfile11}
stripped=${stripped:-testfile7}
debugout=${debugfile:+-f testfile.debug.temp -F $debugfile}
-testfiles $original $stripped $debugfile
+testfiles $original
+test x$stripped = xtestfile.temp || testfiles $stripped $debugfile
tempfiles testfile.temp testfile.debug.temp testfile.unstrip
@@ -56,4 +57,8 @@ testrun ../src/unstrip -o testfile.unstrip testfile.temp testfile.debug.temp
testrun ../src/elfcmp --hash-inexact $original testfile.unstrip
}
+tempfiles testfile.sections
+testrun ../src/readelf -S testfile.temp > testfile.sections || status=$?
+fgrep ' .debug_' testfile.sections && status=1
+
exit $status
diff --git a/tests/run-strip-test8.sh b/tests/run-strip-test8.sh
new file mode 100755
index 00000000..fb9fa087
--- /dev/null
+++ b/tests/run-strip-test8.sh
@@ -0,0 +1,5 @@
+original=testfile47
+stripped=testfile48
+debugfile=testfile48.debug
+
+. $srcdir/run-strip-test.sh
diff --git a/tests/run-test-flag-nobits.sh b/tests/run-test-flag-nobits.sh
new file mode 100755
index 00000000..1fae6603
--- /dev/null
+++ b/tests/run-test-flag-nobits.sh
@@ -0,0 +1,30 @@
+#! /bin/sh
+# Copyright (C) 2010 Red Hat, Inc.
+# This file is part of Red Hat elfutils.
+#
+# Red Hat elfutils 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; version 2 of the License.
+#
+# Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+#
+# Red Hat elfutils is an included package of the Open Invention Network.
+# An included package of the Open Invention Network is a package for which
+# Open Invention Network licensees cross-license their patents. No patent
+# license is granted, either expressly or impliedly, by designation as an
+# included package. Should you wish to participate in the Open Invention
+# Network licensing program, please visit www.openinventionnetwork.com
+# <http://www.openinventionnetwork.com>.
+
+. $srcdir/test-subr.sh
+
+testfiles testfile
+
+testrun ./test-flag-nobits testfile
diff --git a/tests/sha1-tst.c b/tests/sha1-tst.c
new file mode 100644
index 00000000..9ff8141b
--- /dev/null
+++ b/tests/sha1-tst.c
@@ -0,0 +1,79 @@
+/* Copyright (C) 2008 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+ Written by Ulrich Drepper <drepper@redhat.com>, 2008.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <sha1.h>
+
+
+int
+main (void)
+{
+ char buf[1000];
+ int result = 0;
+
+ struct sha1_ctx ctx;
+ sha1_init_ctx (&ctx);
+ sha1_process_bytes ("abc", 3, &ctx);
+ sha1_finish_ctx (&ctx, buf);
+ static const char expected1[SHA1_DIGEST_SIZE] =
+ "\xa9\x99\x3e\x36\x47\x06\x81\x6a\xba\x3e"
+ "\x25\x71\x78\x50\xc2\x6c\x9c\xd0\xd8\x9d";
+ if (memcmp (buf, expected1, SHA1_DIGEST_SIZE) != 0)
+ {
+ puts ("test 1 failed");
+ result = 1;
+ }
+
+ sha1_init_ctx (&ctx);
+ sha1_process_bytes ("\
+abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56, &ctx);
+ sha1_finish_ctx (&ctx, buf);
+ static const char expected2[SHA1_DIGEST_SIZE] =
+ "\x84\x98\x3e\x44\x1c\x3b\xd2\x6e\xba\xae"
+ "\x4a\xa1\xf9\x51\x29\xe5\xe5\x46\x70\xf1";
+ if (memcmp (buf, expected2, SHA1_DIGEST_SIZE) != 0)
+ {
+ puts ("test 2 failed");
+ result = 1;
+ }
+
+ sha1_init_ctx (&ctx);
+ memset (buf, 'a', sizeof (buf));
+ for (int i = 0; i < 1000; ++i)
+ sha1_process_bytes (buf, sizeof (buf), &ctx);
+ sha1_finish_ctx (&ctx, buf);
+ static const char expected3[SHA1_DIGEST_SIZE] =
+ "\x34\xaa\x97\x3c\xd4\xc4\xda\xa4\xf6\x1e"
+ "\xeb\x2b\xdb\xad\x27\x31\x65\x34\x01\x6f";
+ if (memcmp (buf, expected3, SHA1_DIGEST_SIZE) != 0)
+ {
+ puts ("test 3 failed");
+ result = 1;
+ }
+
+ return result;
+}
diff --git a/tests/test-flag-nobits.c b/tests/test-flag-nobits.c
new file mode 100644
index 00000000..3a79da91
--- /dev/null
+++ b/tests/test-flag-nobits.c
@@ -0,0 +1,43 @@
+/* Copyright (C) 2010 Red Hat, Inc.
+ This file is part of Red Hat elfutils.
+
+ Red Hat elfutils 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; version 2 of the License.
+
+ Red Hat 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 Red Hat elfutils; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
+
+ Red Hat elfutils is an included package of the Open Invention Network.
+ An included package of the Open Invention Network is a package for which
+ Open Invention Network licensees cross-license their patents. No patent
+ license is granted, either expressly or impliedly, by designation as an
+ included package. Should you wish to participate in the Open Invention
+ Network licensing program, please visit www.openinventionnetwork.com
+ <http://www.openinventionnetwork.com>. */
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <gelf.h>
+
+int
+main (int argc, char **argv)
+{
+ if (argc != 2)
+ abort ();
+
+ elf_version (EV_CURRENT);
+
+ int fd = open64 (argv[1], O_RDONLY);
+ Elf *stripped = elf_begin (fd, ELF_C_READ, NULL);
+
+ Elf_Scn *scn = NULL;
+ while ((scn = elf_nextscn (stripped, scn)) != NULL)
+ elf_flagdata (elf_getdata (scn, NULL), ELF_C_SET, ELF_F_DIRTY);
+}
diff --git a/tests/test-subr.sh b/tests/test-subr.sh
index 7fda05a0..cb34b93b 100644
--- a/tests/test-subr.sh
+++ b/tests/test-subr.sh
@@ -1,5 +1,5 @@
#! /bin/sh
-# Copyright (C) 2005, 2007 Red Hat, Inc.
+# Copyright (C) 2005, 2007, 2008 Red Hat, Inc.
# This file is part of Red Hat elfutils.
#
# Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -30,6 +30,9 @@
set -e
+#LC_ALL=C
+#export LC_ALL
+
remove_files=
trap 'rm -f $remove_files' 0
diff --git a/tests/testfile16.bz2 b/tests/testfile16.bz2
index 909e2253..4d7160c0 100644
--- a/tests/testfile16.bz2
+++ b/tests/testfile16.bz2
Binary files differ
diff --git a/tests/testfile16.debug.bz2 b/tests/testfile16.debug.bz2
index 48d651fb..f02a9723 100644
--- a/tests/testfile16.debug.bz2
+++ b/tests/testfile16.debug.bz2
Binary files differ
diff --git a/tests/testfile44.S.bz2 b/tests/testfile44.S.bz2
new file mode 100644
index 00000000..4e874340
--- /dev/null
+++ b/tests/testfile44.S.bz2
Binary files differ
diff --git a/tests/testfile44.expect.bz2 b/tests/testfile44.expect.bz2
new file mode 100644
index 00000000..b3937b9c
--- /dev/null
+++ b/tests/testfile44.expect.bz2
Binary files differ
diff --git a/tests/testfile45.S.bz2 b/tests/testfile45.S.bz2
new file mode 100644
index 00000000..00e819e0
--- /dev/null
+++ b/tests/testfile45.S.bz2
Binary files differ
diff --git a/tests/testfile45.expect.bz2 b/tests/testfile45.expect.bz2
new file mode 100644
index 00000000..b8b33e9b
--- /dev/null
+++ b/tests/testfile45.expect.bz2
Binary files differ
diff --git a/tests/testfile46.bz2 b/tests/testfile46.bz2
new file mode 100644
index 00000000..db83b278
--- /dev/null
+++ b/tests/testfile46.bz2
Binary files differ
diff --git a/tests/testfile47.bz2 b/tests/testfile47.bz2
new file mode 100644
index 00000000..334bd6c4
--- /dev/null
+++ b/tests/testfile47.bz2
Binary files differ
diff --git a/tests/testfile48.bz2 b/tests/testfile48.bz2
new file mode 100644
index 00000000..da0d9dab
--- /dev/null
+++ b/tests/testfile48.bz2
Binary files differ
diff --git a/tests/testfile48.debug.bz2 b/tests/testfile48.debug.bz2
new file mode 100644
index 00000000..7b84c4ca
--- /dev/null
+++ b/tests/testfile48.debug.bz2
Binary files differ
diff --git a/tests/testfile49.bz2 b/tests/testfile49.bz2
new file mode 100644
index 00000000..8741a6b3
--- /dev/null
+++ b/tests/testfile49.bz2
Binary files differ
diff --git a/tests/testfile50.bz2 b/tests/testfile50.bz2
new file mode 100644
index 00000000..fce43321
--- /dev/null
+++ b/tests/testfile50.bz2
Binary files differ
diff --git a/tests/testfile51.bz2 b/tests/testfile51.bz2
new file mode 100755
index 00000000..5ff45c61
--- /dev/null
+++ b/tests/testfile51.bz2
Binary files differ