diff --git a/.github/workflows/sync-with-master.yml b/.github/workflows/sync-with-master.yml
new file mode 100644
index 000000000..a6a7a4473
--- /dev/null
+++ b/.github/workflows/sync-with-master.yml
@@ -0,0 +1,21 @@
+on:
+ push:
+ branches:
+ - master
+ schedule:
+ - cron: '0 0 * * *'
+
+jobs:
+ sync:
+ strategy:
+ matrix:
+ branch:
+ - 6.0/stage
+ runs-on: ubuntu-18.04
+ steps:
+ - uses: actions/checkout@v2
+ - uses: delphix/actions/sync-with-master@master
+ with:
+ branch-to-sync: ${{ matrix.branch }}
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitignore b/.gitignore
index aea926634..066854108 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@
/.mypy_cache
/build
/coverage.info
+/cscope.*
/dist
/docs/_build
/drgn.egg-info
diff --git a/.travis.yml b/.travis.yml
index e3da1b8d5..10bea5571 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,169 +1,27 @@
-# Generated by scripts/generate_travis_yml.py
-
dist: bionic
-jobs:
- include:
- - language: python
- python: 3.8
- addons:
- apt:
- packages:
- - libbz2-dev
- - liblzma-dev
- - zlib1g-dev
- install:
- script: python setup.py build -j "$(nproc)" test
- - language: python
- python: 3.7
- addons:
- apt:
- packages:
- - libbz2-dev
- - liblzma-dev
- - zlib1g-dev
- install:
- script: python setup.py build -j "$(nproc)" test
- - language: python
- python: 3.6
- addons:
- apt:
- packages:
- - libbz2-dev
- - liblzma-dev
- - zlib1g-dev
- install:
- script: python setup.py build -j "$(nproc)" test
- - name: "vmtest Linux 5.6"
- language: minimal
- env: KERNEL=5.6
- addons:
- apt:
- packages:
- - python3
- - python3-setuptools
- - qemu-kvm
- - rsync
- - zstd
- install: sudo adduser "$USER" kvm
- before_script:
- # The double sudo is necessary to pick up the new group membership.
- - sudo -E sudo -E -u "$USER" scripts/vmtest/run.sh -k "$KERNEL"'.*' -o -d ~ ~/root.img; exitstatus=$?
- # Exit status 0 is success, 1 is test failure (should fail in the script
- # step), anything else is an error (should fail here).
- - test $exitstatus -le 1
- script: test $exitstatus -eq 0
- - name: "vmtest Linux 5.5"
- language: minimal
- env: KERNEL=5.5
- addons:
- apt:
- packages:
- - python3
- - python3-setuptools
- - qemu-kvm
- - rsync
- - zstd
- install: sudo adduser "$USER" kvm
- before_script:
- # The double sudo is necessary to pick up the new group membership.
- - sudo -E sudo -E -u "$USER" scripts/vmtest/run.sh -k "$KERNEL"'.*' -o -d ~ ~/root.img; exitstatus=$?
- # Exit status 0 is success, 1 is test failure (should fail in the script
- # step), anything else is an error (should fail here).
- - test $exitstatus -le 1
- script: test $exitstatus -eq 0
- - name: "vmtest Linux 5.4"
- language: minimal
- env: KERNEL=5.4
- addons:
- apt:
- packages:
- - python3
- - python3-setuptools
- - qemu-kvm
- - rsync
- - zstd
- install: sudo adduser "$USER" kvm
- before_script:
- # The double sudo is necessary to pick up the new group membership.
- - sudo -E sudo -E -u "$USER" scripts/vmtest/run.sh -k "$KERNEL"'.*' -o -d ~ ~/root.img; exitstatus=$?
- # Exit status 0 is success, 1 is test failure (should fail in the script
- # step), anything else is an error (should fail here).
- - test $exitstatus -le 1
- script: test $exitstatus -eq 0
- - name: "vmtest Linux 4.19"
- language: minimal
- env: KERNEL=4.19
- addons:
- apt:
- packages:
- - python3
- - python3-setuptools
- - qemu-kvm
- - rsync
- - zstd
- install: sudo adduser "$USER" kvm
- before_script:
- # The double sudo is necessary to pick up the new group membership.
- - sudo -E sudo -E -u "$USER" scripts/vmtest/run.sh -k "$KERNEL"'.*' -o -d ~ ~/root.img; exitstatus=$?
- # Exit status 0 is success, 1 is test failure (should fail in the script
- # step), anything else is an error (should fail here).
- - test $exitstatus -le 1
- script: test $exitstatus -eq 0
- - name: "vmtest Linux 4.14"
- language: minimal
- env: KERNEL=4.14
- addons:
- apt:
- packages:
- - python3
- - python3-setuptools
- - qemu-kvm
- - rsync
- - zstd
- install: sudo adduser "$USER" kvm
- before_script:
- # The double sudo is necessary to pick up the new group membership.
- - sudo -E sudo -E -u "$USER" scripts/vmtest/run.sh -k "$KERNEL"'.*' -o -d ~ ~/root.img; exitstatus=$?
- # Exit status 0 is success, 1 is test failure (should fail in the script
- # step), anything else is an error (should fail here).
- - test $exitstatus -le 1
- script: test $exitstatus -eq 0
- - name: "vmtest Linux 4.9"
- language: minimal
- env: KERNEL=4.9
- addons:
- apt:
- packages:
- - python3
- - python3-setuptools
- - qemu-kvm
- - rsync
- - zstd
- install: sudo adduser "$USER" kvm
- before_script:
- # The double sudo is necessary to pick up the new group membership.
- - sudo -E sudo -E -u "$USER" scripts/vmtest/run.sh -k "$KERNEL"'.*' -o -d ~ ~/root.img; exitstatus=$?
- # Exit status 0 is success, 1 is test failure (should fail in the script
- # step), anything else is an error (should fail here).
- - test $exitstatus -le 1
- script: test $exitstatus -eq 0
- - name: "vmtest Linux 4.4"
- language: minimal
- env: KERNEL=4.4
- addons:
- apt:
- packages:
- - python3
- - python3-setuptools
- - qemu-kvm
- - rsync
- - zstd
- install: sudo adduser "$USER" kvm
- before_script:
- # The double sudo is necessary to pick up the new group membership.
- - sudo -E sudo -E -u "$USER" scripts/vmtest/run.sh -k "$KERNEL"'.*' -o -d ~ ~/root.img; exitstatus=$?
- # Exit status 0 is success, 1 is test failure (should fail in the script
- # step), anything else is an error (should fail here).
- - test $exitstatus -le 1
- script: test $exitstatus -eq 0
+language: python
+python:
+ - '3.8'
+ - '3.7'
+ - '3.6'
+install:
+ # Upstream defaults to world-read-writeable /dev/kvm. Debian/Ubuntu override
+ # this; see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=892945. We want
+ # the upstream default.
+ - sudo echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /lib/udev/rules.d/99-fix-kvm.rules > /dev/null
+ - sudo udevadm control --reload-rules
+ # On systemd >= 238 we can use udevadm trigger -w and remove udevadm settle.
+ - sudo udevadm trigger /dev/kvm
+ - sudo udevadm settle
+script: python setup.py test -K
+
+addons:
+ apt:
+ packages:
+ - busybox-static
+ - libbz2-dev
+ - liblzma-dev
+ - qemu-kvm
+ - zlib1g-dev
+ - zstd
diff --git a/MANIFEST.in b/MANIFEST.in
index 8c8aa64e9..8255679b9 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,3 +1,6 @@
recursive-include docs *.py *.rst
+recursive-include examples *.py
recursive-include tests *.py
-recursive-include scripts/vmtest *.py *.rst *.sh
+recursive-include tools *.py
+recursive-include vmtest *.c *.py *.rst
+include util.py vmtest/config
diff --git a/README.rst b/README.rst
index 9e5599259..3f6d8edc3 100644
--- a/README.rst
+++ b/README.rst
@@ -39,11 +39,12 @@ Although other debuggers like `GDB `_ have
scripting support, drgn aims to make scripting as natural as possible so that
debugging feels like coding. This makes it well-suited for introspecting the
complex, inter-connected state in large programs. It is also designed as a
-library that can be used for more purpose-built tools.
+library that can be used to build debugging and introspection tools; see the
+official `tools `_.
drgn was developed for debugging the Linux kernel (as an alternative to the
`crash `_ utility), but it can also debug
-userspace programs written in C. C++ support is planned.
+userspace programs written in C. C++ support is in progress.
.. end-introduction
diff --git a/_drgn.pyi b/_drgn.pyi
index 2f665ac11..0e1c69aa3 100644
--- a/_drgn.pyi
+++ b/_drgn.pyi
@@ -203,7 +203,7 @@ class Program:
...
def pointer_type(
self,
- type: Type,
+ type: Union[str, Type],
qualifiers: Optional[Qualifiers] = None,
*,
language: Optional[Language] = None,
@@ -236,6 +236,30 @@ class Program:
:raises ValueError: if *size* is negative
"""
...
+ def read_u8(self, address: int, physical: bool = False) -> int: ...
+ def read_u16(self, address: int, physical: bool = False) -> int: ...
+ def read_u32(self, address: int, physical: bool = False) -> int: ...
+ def read_u64(self, address: int, physical: bool = False) -> int: ...
+ def read_word(self, address: int, physical: bool = False) -> int:
+ """
+ Read an unsigned integer from the program's memory in the program's
+ byte order.
+
+ :meth:`read_u8()`, :meth:`read_u16()`, :meth:`read_u32()`, and
+ :meth:`read_u64()` read an 8-, 16-, 32-, or 64-bit unsigned integer,
+ respectively. :meth:`read_word()` reads a program word-sized unsigned
+ integer.
+
+ For signed integers, alternate byte order, or other formats, you can
+ use :meth:`read()` and :meth:`int.from_bytes()` or the :mod:`struct`
+ module.
+
+ :param address: Address of the integer.
+ :param physical: Whether *address* is a physical memory address; see
+ :meth:`read()`.
+ :raises FaultError: if the address is invalid; see :meth:`read()`
+ """
+ ...
def add_memory_segment(
self,
address: int,
@@ -665,7 +689,7 @@ class Object:
"""
Size in bits of this object if it is a bit field, ``None`` if it is not.
"""
- def __getattribute__(self, name: str) -> Any:
+ def __getattribute__(self, name: str) -> Object:
"""
Implement ``self.name``.
@@ -679,7 +703,7 @@ class Object:
:param name: Attribute name.
"""
...
- def __getitem__(self, idx: int) -> Object:
+ def __getitem__(self, idx: Union[int, Object]) -> Object:
"""
Implement ``self[idx]``. Get the array element at the given index.
@@ -961,7 +985,6 @@ def container_of(ptr: Object, type: Union[str, Type], member: str) -> Object:
:param ptr: The pointer.
:param type: The type of the containing object.
- :type type: str or Type
:param member: The name of the member in ``type``.
:raises TypeError: if the object is not a pointer or the type is not a
structure, union, or class type
@@ -1027,13 +1050,20 @@ class StackFrame:
pc: int
"""
- The return address at this stack frame, i.e., the value of the program
- counter when control returns to this frame.
+ The program counter at this stack frame.
+
+ For the innermost frame, this is typically the instruction that was being
+ executed when the stack trace was captured. For function calls, this is
+ generally the return address, i.e., the value of the program counter when
+ control returns to this frame.
"""
def symbol(self) -> Symbol:
"""
- Get the function symbol at this stack frame. This is equivalent to
- :meth:`prog.symbol(frame.pc) `.
+ Get the function symbol at this stack frame.
+
+ This may differ from :meth:`prog.symbol(frame.pc) `, as
+ for function calls, the program counter may be adjusted to the call
+ instruction instead of the return address.
"""
...
def register(self, reg: Union[str, int, Register]) -> int:
@@ -1603,3 +1633,14 @@ class OutOfBoundsError(Exception):
"""
...
+
+_with_libkdumpfile: bool
+
+def _linux_helper_read_vm(prog, pgtable, address, size): ...
+def _linux_helper_radix_tree_lookup(root, index): ...
+def _linux_helper_idr_find(idr, id): ...
+def _linux_helper_find_pid(ns, pid): ...
+def _linux_helper_pid_task(pid, pid_type): ...
+def _linux_helper_find_task(ns, pid): ...
+def _linux_helper_task_state_to_char(task): ...
+def _linux_helper_pgtable_l5_enabled(prog): ...
diff --git a/debian/rules b/debian/rules
index 641186e52..a0c591768 100755
--- a/debian/rules
+++ b/debian/rules
@@ -2,3 +2,17 @@
%:
dh $@ --with python3 --buildsystem=pybuild
+
+override_dh_auto_test:
+ #
+ # Don't run drgn's tests during the build step; The repo comes
+ # with its own testing that takes place elsewhere ->
+ # https://travis-ci.org/github/delphix/drgn/branches
+ #
+ # Ideally it wouldn't hurt having them run here too but due to
+ # drgn's testing setup, we'd have to override pybuild's default
+ # behavior. Since drgn is not a project that is owned by us,
+ # disabling tests here makes even more sense as we won't have
+ # to adjust the setup here every time a change in the test
+ # framework of drgn is applied upstream.
+ #
diff --git a/docs/advanced_usage.rst b/docs/advanced_usage.rst
index 64ef14875..bc09c6fe4 100644
--- a/docs/advanced_usage.rst
+++ b/docs/advanced_usage.rst
@@ -94,4 +94,4 @@ Some of drgn's behavior can be modified through environment variables:
``DRGN_USE_LIBKDUMPFILE_FOR_ELF``
Whether drgn should use libkdumpfile for ELF vmcores (0 or 1). The default
- is 1 if drgn was built with libkdumpfile support.
+ is 0. This functionality will be removed in the future.
diff --git a/docs/exts/drgndoc/format.py b/docs/exts/drgndoc/format.py
index f8121a33f..fb7e6fa2d 100644
--- a/docs/exts/drgndoc/format.py
+++ b/docs/exts/drgndoc/format.py
@@ -266,6 +266,9 @@ def _add_function_info(
node = resolved.node
if rst:
+ if node.docstring is None:
+ want_rtype = False
+
params_need_type = set()
params_have_type = set()
for line in lines:
diff --git a/docs/exts/drgndoc/parse.py b/docs/exts/drgndoc/parse.py
index 460d2307a..72436919f 100644
--- a/docs/exts/drgndoc/parse.py
+++ b/docs/exts/drgndoc/parse.py
@@ -3,6 +3,7 @@
import ast
import inspect
+import operator
import os.path
import stat
from typing import (
@@ -312,11 +313,11 @@ def parse_package(
attrs = cast(Dict[str, Node], result[1])
try:
- it = os.scandir(path)
+ entries = sorted(os.scandir(path), key=operator.attrgetter("name"))
except OSError as e:
handle_err(e)
else:
- for entry in it:
+ for entry in entries:
try:
is_dir = entry.is_dir()
is_file = entry.is_file()
diff --git a/docs/user_guide.rst b/docs/user_guide.rst
index 67c7c7f86..9bd9c8895 100644
--- a/docs/user_guide.rst
+++ b/docs/user_guide.rst
@@ -299,4 +299,5 @@ Next Steps
Refer to the :doc:`api_reference`. Look through the :doc:`helpers`. Browse
through the official `examples
-`_.
+`_ and `tools
+`_.
diff --git a/drgn/__init__.py b/drgn/__init__.py
index fb9bb53cc..7bf30ba2e 100644
--- a/drgn/__init__.py
+++ b/drgn/__init__.py
@@ -230,13 +230,13 @@ def task_state_to_char(task):
sys.argv.extend(args)
with _open_code(path) as f:
- code = pkgutil.read_code(f)
+ code = pkgutil.read_code(f) # type: ignore[attr-defined]
if code is None:
with _open_code(path) as f:
code = compile(f.read(), path, "exec")
module.__spec__ = None
module.__file__ = path
- module.__cached__ = None
+ module.__cached__ = None # type: ignore[attr-defined]
caller_globals = sys._getframe(1).f_globals
caller_special_globals = {
diff --git a/drgn/helpers/__init__.py b/drgn/helpers/__init__.py
index 075a67294..3321a868f 100644
--- a/drgn/helpers/__init__.py
+++ b/drgn/helpers/__init__.py
@@ -22,7 +22,8 @@
"""
import enum
-from typing import Container, Iterable
+import typing
+from typing import Container, Iterable, List, Tuple
from drgn import Type
@@ -98,20 +99,21 @@ def escape_ascii_string(
def enum_type_to_class(
type: Type, name: str, exclude: Container[str] = (), prefix: str = ""
-) -> enum.IntEnum:
+) -> typing.Type[enum.IntEnum]:
"""
Get an :class:`enum.IntEnum` class from an enumerated :class:`drgn.Type`.
:param type: The enumerated type to convert.
- :type type: :class:`drgn.Type`
:param name: The name of the ``IntEnum`` type to create.
:param exclude: Container (e.g., list or set) of enumerator names to
exclude from the created ``IntEnum``.
:param prefix: Prefix to strip from the beginning of enumerator names.
"""
+ if type.enumerators is None:
+ raise TypeError("enum type is incomplete")
enumerators = [
(name[len(prefix) :] if name.startswith(prefix) else name, value)
for (name, value) in type.enumerators
if name not in exclude
]
- return enum.IntEnum(name, enumerators)
+ return enum.IntEnum(name, enumerators) # type: ignore # python/mypy#4865
diff --git a/drgn/helpers/linux/__init__.py b/drgn/helpers/linux/__init__.py
index a0f611683..d8715ce93 100644
--- a/drgn/helpers/linux/__init__.py
+++ b/drgn/helpers/linux/__init__.py
@@ -35,8 +35,12 @@
__all__ = []
-for _module_info in pkgutil.iter_modules(__path__, prefix=__name__ + "."):
+for _module_info in pkgutil.iter_modules(
+ __path__, # type: ignore[name-defined] # python/mypy#1422
+ prefix=__name__ + ".",
+):
_submodule = importlib.import_module(_module_info.name)
- __all__.extend(_submodule.__all__)
- for _name in _submodule.__all__:
+ _submodule_all = getattr(_submodule, "__all__", ())
+ __all__.extend(_submodule_all)
+ for _name in _submodule_all:
globals()[_name] = getattr(_submodule, _name)
diff --git a/drgn/helpers/linux/kconfig.py b/drgn/helpers/linux/kconfig.py
index 14ddea786..406152297 100644
--- a/drgn/helpers/linux/kconfig.py
+++ b/drgn/helpers/linux/kconfig.py
@@ -52,15 +52,15 @@ def get_kconfig(prog) -> Mapping[str, str]:
size = len(kernel_config_data) - 17
data = prog.read(start, size)
- result = {}
+ kconfig = {}
for line in gzip.decompress(data).decode().splitlines():
if not line or line.startswith("#"):
continue
name, _, value = line.partition("=")
if value:
- result[name] = value
+ kconfig[name] = value
# Make result mapping 'immutable', so changes cannot propagate to the cache
- result = types.MappingProxyType(result)
+ result = types.MappingProxyType(kconfig)
prog.cache["kconfig_map"] = result
return result
diff --git a/drgn/helpers/linux/mm.py b/drgn/helpers/linux/mm.py
index 01512346b..78f64fc65 100644
--- a/drgn/helpers/linux/mm.py
+++ b/drgn/helpers/linux/mm.py
@@ -1,4 +1,4 @@
-# Copyright 2018-2019 - Omar Sandoval
+# Copyright 2018-2020 - Omar Sandoval
# SPDX-License-Identifier: GPL-3.0+
"""
@@ -10,36 +10,35 @@
implemented.
"""
+from typing import List
+
+from _drgn import _linux_helper_read_vm, _linux_helper_pgtable_l5_enabled
from drgn import Object, cast
__all__ = (
+ "access_process_vm",
+ "access_remote_vm",
+ "cmdline",
+ "environ",
"for_each_page",
"page_to_pfn",
"page_to_virt",
"pfn_to_page",
"pfn_to_virt",
+ "pgtable_l5_enabled",
"virt_to_page",
"virt_to_pfn",
)
-def _vmemmap(prog):
- try:
- # KASAN
- return cast("struct page *", prog["vmemmap_base"])
- except KeyError:
- # x86-64
- return Object(prog, "struct page *", value=0xFFFFEA0000000000)
-
+def pgtable_l5_enabled(prog):
+ """
+ .. c:function:: bool pgtable_l5_enabled(void)
-def _page_offset(prog):
- try:
- # KASAN
- return prog["page_offset_base"].value_()
- except KeyError:
- # x86-64
- return 0xFFFF880000000000
+ Return whether 5-level paging is enabled.
+ """
+ return _linux_helper_pgtable_l5_enabled(prog)
def for_each_page(prog):
@@ -48,7 +47,7 @@ def for_each_page(prog):
:return: Iterator of ``struct page *`` objects.
"""
- vmemmap = _vmemmap(prog)
+ vmemmap = prog["vmemmap"]
for i in range(prog["max_pfn"]):
yield vmemmap + i
@@ -59,7 +58,7 @@ def page_to_pfn(page):
Get the page frame number (PFN) of a page.
"""
- return cast("unsigned long", page - _vmemmap(page.prog_))
+ return cast("unsigned long", page - page.prog_["vmemmap"])
def pfn_to_page(prog_or_pfn, pfn=None):
@@ -74,7 +73,7 @@ def pfn_to_page(prog_or_pfn, pfn=None):
pfn = prog_or_pfn
else:
prog = prog_or_pfn
- return _vmemmap(prog) + pfn
+ return prog["vmemmap"] + pfn
def virt_to_pfn(prog_or_addr, addr=None):
@@ -90,7 +89,7 @@ def virt_to_pfn(prog_or_addr, addr=None):
addr = prog_or_addr.value_()
else:
prog = prog_or_addr
- return Object(prog, "unsigned long", value=(addr - _page_offset(prog)) >> 12)
+ return Object(prog, "unsigned long", value=(addr - prog["PAGE_OFFSET"]) >> 12)
def pfn_to_virt(prog_or_pfn, pfn=None):
@@ -106,7 +105,7 @@ def pfn_to_virt(prog_or_pfn, pfn=None):
pfn = prog_or_pfn.value_()
else:
prog = prog_or_pfn
- return Object(prog, "void *", value=(pfn << 12) + _page_offset(prog))
+ return Object(prog, "void *", value=(pfn << 12) + prog["PAGE_OFFSET"])
def page_to_virt(page):
@@ -127,3 +126,69 @@ def virt_to_page(prog_or_addr, addr=None):
an ``int``.
"""
return pfn_to_page(virt_to_pfn(prog_or_addr, addr))
+
+
+def access_process_vm(task, address, size) -> bytes:
+ """
+ .. c:function:: char *access_process_vm(struct task_struct *task, void *address, size_t size)
+
+ Read memory from a task's virtual address space.
+
+ >>> task = find_task(prog, 1490152)
+ >>> access_process_vm(task, 0x7f8a62b56da0, 12)
+ b'hello, world'
+ """
+ return _linux_helper_read_vm(task.prog_, task.mm.pgd, address, size)
+
+
+def access_remote_vm(mm, address, size) -> bytes:
+ """
+ .. c:function:: char *access_remote_vm(struct mm_struct *mm, void *address, size_t size)
+
+ Read memory from a virtual address space. This is similar to
+ :func:`access_process_vm()`, but it takes a ``struct mm_struct *`` instead
+ of a ``struct task_struct *``.
+
+ >>> task = find_task(prog, 1490152)
+ >>> access_remote_vm(task.mm, 0x7f8a62b56da0, 12)
+ b'hello, world'
+ """
+ return _linux_helper_read_vm(mm.prog_, mm.pgd, address, size)
+
+
+def cmdline(task) -> List[bytes]:
+ """
+ Get the list of command line arguments of a task.
+
+ >>> cmdline(find_task(prog, 1495216))
+ [b'vim', b'drgn/helpers/linux/mm.py']
+
+ .. code-block:: console
+
+ $ tr '\\0' ' ' < /proc/1495216/cmdline
+ vim drgn/helpers/linux/mm.py
+ """
+ mm = task.mm.read_()
+ arg_start = mm.arg_start.value_()
+ arg_end = mm.arg_end.value_()
+ return access_remote_vm(mm, arg_start, arg_end - arg_start).split(b"\0")[:-1]
+
+
+def environ(task) -> List[bytes]:
+ """
+ Get the list of environment variables of a task.
+
+ >>> environ(find_task(prog, 1497797))
+ [b'HOME=/root', b'PATH=/usr/local/sbin:/usr/local/bin:/usr/bin', b'LOGNAME=root']
+
+ .. code-block:: console
+
+ $ tr '\\0' '\\n' < /proc/1497797/environ
+ HOME=/root
+ PATH=/usr/local/sbin:/usr/local/bin:/usr/bin
+ LOGNAME=root
+ """
+ mm = task.mm.read_()
+ env_start = mm.env_start.value_()
+ env_end = mm.env_end.value_()
+ return access_remote_vm(mm, env_start, env_end - env_start).split(b"\0")[:-1]
diff --git a/drgn/internal/cli.py b/drgn/internal/cli.py
index 8766aa8f6..3c8fd9d07 100644
--- a/drgn/internal/cli.py
+++ b/drgn/internal/cli.py
@@ -153,13 +153,15 @@ def main() -> None:
readline.read_history_file(histfile)
except OSError as e:
if not isinstance(e, FileNotFoundError) and not args.quiet:
- print('could not read history:', str(e), file=sys.stderr)
+ print("could not read history:", str(e), file=sys.stderr)
+
def write_history_file():
try:
readline.write_history_file(histfile)
except OSError as e:
if not args.quiet:
- print('could not write history:', str(e), file=sys.stderr)
+ print("could not write history:", str(e), file=sys.stderr)
+
atexit.register(write_history_file)
readline.set_history_length(1000)
diff --git a/libdrgn/Makefile.am b/libdrgn/Makefile.am
index 83979cad8..0a86f2e28 100644
--- a/libdrgn/Makefile.am
+++ b/libdrgn/Makefile.am
@@ -60,6 +60,7 @@ libdrgnimpl_la_SOURCES = $(ARCH_INS:.c.in=.c) \
type.h \
type_index.c \
type_index.h \
+ util.h \
vector.c \
vector.h
@@ -73,10 +74,11 @@ libdrgnimpl_la_LIBADD += $(libkdumpfile_LIBS)
endif
arch_%.c: arch_%.c.in build-aux/gen_arch.awk build-aux/parse_arch.awk
- gawk -f $(word 3, $^) -f $(word 2, $^) $< > $@
+ $(AM_V_GEN)gawk -f $(word 3, $^) -f $(word 2, $^) $< > $@
drgn.h: configure.ac build-aux/gen_drgn_h.awk build-aux/parse_arch.awk $(ARCH_INS) drgn.h.in
- gawk -f $(word 2, $^) -f $(word 3, $^) -v version=@PACKAGE_VERSION@ \
+ $(AM_V_GEN)gawk -f $(word 2, $^) -f $(word 3, $^) \
+ -v version=@PACKAGE_VERSION@ \
$(wordlist 4, $(words $^), $^) > $@
elfutils_LIBS = elfutils/libdw/libdw.a elfutils/libelf/libelf.a -lz -llzma -lbz2
@@ -124,16 +126,16 @@ _drgn_la_CFLAGS += $(libkdumpfile_CFLAGS)
endif
python/constants.c: drgn.h build-aux/gen_constants.py
- $(PYTHON) $(word 2, $^) < $< > $@
+ $(AM_V_GEN)$(PYTHON) $(word 2, $^) < $< > $@
drgndoc_docstrings_deps = $(wildcard $(srcdir)/../docs/exts/drgndoc/*.py)
drgndoc_docstrings = PYTHONPATH="$(srcdir)/../docs/exts:$$PYTHONPATH" $(PYTHON) -m drgndoc.docstrings
python/docstrings.c: ../_drgn.pyi $(drgndoc_docstrings_deps)
- $(drgndoc_docstrings) -m _drgn:drgn $< > $@
+ $(AM_V_GEN)$(drgndoc_docstrings) -m _drgn:drgn $< > $@
python/docstrings.h: ../_drgn.pyi $(drgndoc_docstrings_deps)
- $(drgndoc_docstrings) -H -m _drgn:drgn $< > $@
+ $(AM_V_GEN)$(drgndoc_docstrings) -H -m _drgn:drgn $< > $@
EXTRA_DIST = $(ARCH_INS) build-aux/gen_arch.awk build-aux/gen_constants.py \
build-aux/gen_drgn_h.awk build-aux/parse_arch.awk
diff --git a/libdrgn/arch_x86_64.c.in b/libdrgn/arch_x86_64.c.in
index 5c85e882c..e0a41ddd1 100644
--- a/libdrgn/arch_x86_64.c.in
+++ b/libdrgn/arch_x86_64.c.in
@@ -1,9 +1,13 @@
%{
-// Copyright 2019 - Omar Sandoval
+// Copyright 2019-2020 - Omar Sandoval
// SPDX-License-Identifier: GPL-3.0+
+#include
+
#include "internal.h"
+#include "linux_kernel.h"
#include "platform.h"
+#include "program.h"
%}
x86-64
@@ -274,11 +278,223 @@ out:
return err;
}
+static struct drgn_error *
+linux_kernel_get_page_offset_x86_64(struct drgn_program *prog, uint64_t *ret)
+{
+ struct drgn_error *err;
+ struct drgn_object obj;
+ uint64_t pgd;
+
+ /*
+ * If KASLR is enabled, PAGE_OFFSET is easily available via
+ * page_offset_base.
+ */
+ drgn_object_init(&obj, prog);
+ err = drgn_program_find_object(prog, "page_offset_base", NULL,
+ DRGN_FIND_OBJECT_VARIABLE, &obj);
+ if (!err) {
+ err = drgn_object_read_unsigned(&obj, ret);
+ goto out;
+ }
+ if (err->code == DRGN_ERROR_LOOKUP)
+ drgn_error_destroy(err);
+ else
+ goto out;
+
+ /*
+ * If not, we determine it based on the kernel page table. Before Linux
+ * kernel commit d52888aa2753 ("x86/mm: Move LDT remap out of KASLR
+ * region on 5-level paging") (in v4.20), PAGE_OFFSET was pgd slot 272.
+ * After that, it is pgd slot 273, and slot 272 is empty (reserved for
+ * Local Descriptor Table mappings for userspace tasks).
+ */
+ err = drgn_program_read_u64(prog,
+ prog->vmcoreinfo.swapper_pg_dir + 272 * 8,
+ false, &pgd);
+ if (err)
+ goto out;
+ if (pgd) {
+ if (prog->vmcoreinfo.pgtable_l5_enabled)
+ *ret = UINT64_C(0xff10000000000000);
+ else
+ *ret = UINT64_C(0xffff880000000000);
+ } else {
+ if (prog->vmcoreinfo.pgtable_l5_enabled)
+ *ret = UINT64_C(0xff11000000000000);
+ else
+ *ret = UINT64_C(0xffff888000000000);
+ }
+
+out:
+ drgn_object_deinit(&obj);
+ return err;
+}
+
+static struct drgn_error *
+linux_kernel_get_vmemmap_x86_64(struct drgn_program *prog, uint64_t *ret)
+{
+
+ struct drgn_error *err;
+ struct drgn_object obj;
+
+ /* If KASLR is enabled, vmemmap is vmemmap_base. */
+ drgn_object_init(&obj, prog);
+ err = drgn_program_find_object(prog, "vmemmap_base", NULL,
+ DRGN_FIND_OBJECT_VARIABLE, &obj);
+ if (!err) {
+ err = drgn_object_read_unsigned(&obj, ret);
+ goto out;
+ }
+ if (err->code == DRGN_ERROR_LOOKUP) {
+ drgn_error_destroy(err);
+ err = NULL;
+ } else {
+ goto out;
+ }
+
+ /* Otherwise, it depends on whether we have 5-level page tables. */
+ if (prog->vmcoreinfo.pgtable_l5_enabled)
+ *ret = UINT64_C(0xffd4000000000000);
+ else
+ *ret = UINT64_C(0xffffea0000000000);
+
+out:
+ drgn_object_deinit(&obj);
+ return err;
+}
+
+static struct drgn_error *
+linux_kernel_live_direct_mapping_fallback_x86_64(struct drgn_program *prog,
+ uint64_t *address_ret,
+ uint64_t *size_ret)
+{
+ struct drgn_error *err;
+ unsigned long page_offset_base_address;
+
+ *size_ret = UINT64_C(1) << 46;
+ err = proc_kallsyms_symbol_addr("page_offset_base",
+ &page_offset_base_address);
+ if (!err) {
+ return drgn_program_read_word(prog, page_offset_base_address,
+ false, address_ret);
+ } else if (err == &drgn_not_found) {
+ /*
+ * This is only called for pre-4.11 kernels, so we can assume
+ * the old location.
+ */
+ *address_ret = UINT64_C(0xffff880000000000);
+ return NULL;
+ } else {
+ return err;
+ }
+}
+
+struct pgtable_iterator_x86_64 {
+ uint16_t index[5];
+ uint64_t table[5][512];
+};
+
+static void pgtable_iterator_arch_init_x86_64(void *buf)
+{
+ struct pgtable_iterator_x86_64 *arch = buf;
+ memset(arch->index, 0xff, sizeof(arch->index));
+ memset(arch->table, 0, sizeof(arch->table));
+}
+
+static struct drgn_error *
+linux_kernel_pgtable_iterator_next_x86_64(struct pgtable_iterator *it,
+ uint64_t *virt_addr_ret,
+ uint64_t *phys_addr_ret)
+{
+ static const int PAGE_SHIFT = 12;
+ static const int PGTABLE_SHIFT = 9;
+ static const int PGTABLE_MASK = (1 << PGTABLE_SHIFT) - 1;
+ static const uint64_t PRESENT = 0x1;
+ static const uint64_t PSE = 0x80; /* a.k.a. huge page */
+ static const uint64_t ADDRESS_MASK = UINT64_C(0xffffffffff000);
+ struct drgn_program *prog = it->prog;
+ struct pgtable_iterator_x86_64 *arch = (void *)it->arch;
+ struct drgn_error *err;
+ bool bswap = drgn_program_bswap(prog);
+ int levels = prog->vmcoreinfo.pgtable_l5_enabled ? 5 : 4, level;
+
+ /* Find the lowest level with cached entries. */
+ for (level = 0; level < levels; level++) {
+ if (arch->index[level] < ARRAY_SIZE(arch->table[level]))
+ break;
+ }
+ /* For every level below that, refill the cache/return pages. */
+ for (;; level--) {
+ uint64_t table;
+ bool table_physical;
+ uint16_t index;
+ if (level == levels) {
+ uint64_t start_non_canonical, end_non_canonical;
+ start_non_canonical = (UINT64_C(1) <<
+ (PAGE_SHIFT +
+ PGTABLE_SHIFT * levels - 1));
+ end_non_canonical = (UINT64_MAX <<
+ (PAGE_SHIFT +
+ PGTABLE_SHIFT * levels - 1));
+ if (it->virt_addr >= start_non_canonical &&
+ it->virt_addr < end_non_canonical) {
+ *virt_addr_ret = start_non_canonical;
+ *phys_addr_ret = UINT64_MAX;
+ it->virt_addr = end_non_canonical;
+ return NULL;
+ }
+ table = it->pgtable;
+ table_physical = false;
+ } else {
+ uint64_t entry = arch->table[level][arch->index[level]++];
+ if (bswap)
+ entry = bswap_64(entry);
+ table = entry & ADDRESS_MASK;
+ if (!(entry & PRESENT) || (entry & PSE) || level == 0) {
+ uint64_t mask = (UINT64_C(1) <<
+ (PAGE_SHIFT +
+ PGTABLE_SHIFT * level)) - 1;
+ *virt_addr_ret = it->virt_addr & ~mask;
+ if (entry & PRESENT)
+ *phys_addr_ret = table & ~mask;
+ else
+ *phys_addr_ret = UINT64_MAX;
+ it->virt_addr = (it->virt_addr | mask) + 1;
+ return NULL;
+ }
+ table_physical = true;
+ }
+ index = (it->virt_addr >>
+ (PAGE_SHIFT + PGTABLE_SHIFT * (level - 1))) & PGTABLE_MASK;
+ /*
+ * It's only marginally more expensive to read 4096 bytes than 8
+ * bytes, so we always read to the end of the table.
+ */
+ err = drgn_program_read_memory(prog,
+ &arch->table[level - 1][index],
+ table + 8 * index,
+ sizeof(arch->table[0]) - 8 * index,
+ table_physical);
+ if (err)
+ return err;
+ arch->index[level - 1] = index;
+ }
+}
+
const struct drgn_architecture_info arch_info_x86_64 = {
ARCHITECTURE_INFO,
.default_flags = (DRGN_PLATFORM_IS_64_BIT |
DRGN_PLATFORM_IS_LITTLE_ENDIAN),
.frame_registers = frame_registers_x86_64,
.num_frame_registers = ARRAY_SIZE(frame_registers_x86_64),
- .linux_kernel_set_initial_registers = linux_kernel_set_initial_registers_x86_64,
+ .linux_kernel_set_initial_registers =
+ linux_kernel_set_initial_registers_x86_64,
+ .linux_kernel_get_page_offset = linux_kernel_get_page_offset_x86_64,
+ .linux_kernel_get_vmemmap = linux_kernel_get_vmemmap_x86_64,
+ .linux_kernel_live_direct_mapping_fallback =
+ linux_kernel_live_direct_mapping_fallback_x86_64,
+ .pgtable_iterator_arch_size = sizeof(struct pgtable_iterator_x86_64),
+ .pgtable_iterator_arch_init = pgtable_iterator_arch_init_x86_64,
+ .linux_kernel_pgtable_iterator_next =
+ linux_kernel_pgtable_iterator_next_x86_64,
};
diff --git a/libdrgn/binary_search_tree.h b/libdrgn/binary_search_tree.h
index 0752337d9..09f261295 100644
--- a/libdrgn/binary_search_tree.h
+++ b/libdrgn/binary_search_tree.h
@@ -12,7 +12,7 @@
#ifndef DRGN_BINARY_SEARCH_TREE_H
#define DRGN_BINARY_SEARCH_TREE_H
-#include "internal.h"
+#include "util.h"
/**
* @ingroup Internals
diff --git a/libdrgn/configure.ac b/libdrgn/configure.ac
index 075ab3e7d..b4ed56c10 100644
--- a/libdrgn/configure.ac
+++ b/libdrgn/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT([drgn], [0.0.3],
+AC_INIT([drgn], [0.0.4],
[https://github.com/osandov/drgn/issues],,
[https://github.com/osandov/drgn])
@@ -7,6 +7,7 @@ AC_CONFIG_MACRO_DIR([m4])
AC_PROG_CC
AM_INIT_AUTOMAKE([-Wall -Wno-portability foreign subdir-objects])
+AM_SILENT_RULES([yes])
AM_PROG_AR
LT_INIT
diff --git a/libdrgn/drgn.h.in b/libdrgn/drgn.h.in
index c70a2c674..da0596139 100644
--- a/libdrgn/drgn.h.in
+++ b/libdrgn/drgn.h.in
@@ -446,15 +446,12 @@ struct drgn_type {
size_t num_members;
struct drgn_type *type;
};
+ union {
+ struct drgn_type_member *members;
+ struct drgn_type_enumerator *enumerators;
+ struct drgn_type_parameter *parameters;
+ };
} _private;
- /*
- * An array of struct drgn_type_member, struct drgn_type_enumerator, or
- * struct drgn_type_parameter may follow. We can't use flexible array
- * members for these because they are not allowed in a union or nested
- * structure; we can't use GCC's zero length array extension because
- * that triggers false positives in Clang's AddressSanitizer. Instead,
- * these are accessed internally with drgn_type_payload().
- */
};
/**
@@ -606,11 +603,6 @@ static inline const char *drgn_type_tag(struct drgn_type *type)
return type->_private.tag;
}
-static inline void *drgn_type_payload(struct drgn_type *type)
-{
- return (char *)type + sizeof(*type);
-}
-
/**
* Get whether a kind of type has members. This is true for structure, union,
* and class types.
@@ -633,7 +625,7 @@ static inline bool drgn_type_has_members(struct drgn_type *type)
static inline struct drgn_type_member *drgn_type_members(struct drgn_type *type)
{
assert(drgn_type_has_members(type));
- return drgn_type_payload(type);
+ return type->_private.members;
}
/**
* Get the number of members of a type. @ref drgn_type_has_members() must be
@@ -710,7 +702,7 @@ static inline struct drgn_type_enumerator *
drgn_type_enumerators(struct drgn_type *type)
{
assert(drgn_type_has_enumerators(type));
- return drgn_type_payload(type);
+ return type->_private.enumerators;
}
/**
* Get the number of enumerators of a type. @ref drgn_type_has_enumerators()
@@ -761,7 +753,7 @@ static inline bool drgn_type_has_parameters(struct drgn_type *type)
static inline struct drgn_type_parameter *drgn_type_parameters(struct drgn_type *type)
{
assert(drgn_type_has_parameters(type));
- return drgn_type_payload(type);
+ return type->_private.parameters;
}
/**
* Get the number of parameters of a type. @ref drgn_type_has_parameters() must
@@ -1277,6 +1269,26 @@ struct drgn_error *drgn_program_read_c_string(struct drgn_program *prog,
uint64_t address, bool physical,
size_t max_size, char **ret);
+struct drgn_error *drgn_program_read_u8(struct drgn_program *prog,
+ uint64_t address, bool physical,
+ uint8_t *ret);
+
+struct drgn_error *drgn_program_read_u16(struct drgn_program *prog,
+ uint64_t address, bool physical,
+ uint16_t *ret);
+
+struct drgn_error *drgn_program_read_u32(struct drgn_program *prog,
+ uint64_t address, bool physical,
+ uint32_t *ret);
+
+struct drgn_error *drgn_program_read_u64(struct drgn_program *prog,
+ uint64_t address, bool physical,
+ uint64_t *ret);
+
+struct drgn_error *drgn_program_read_word(struct drgn_program *prog,
+ uint64_t address, bool physical,
+ uint64_t *ret);
+
/**
* Find a type in a program by name.
*
diff --git a/libdrgn/dwarf_index.c b/libdrgn/dwarf_index.c
index 51715cdf8..9b0ba5502 100644
--- a/libdrgn/dwarf_index.c
+++ b/libdrgn/dwarf_index.c
@@ -1298,7 +1298,7 @@ static struct drgn_error *read_module_cus(struct drgn_dwarf_module *module,
module->state = DRGN_DWARF_MODULE_INDEXING;
return NULL;
}
- DRGN_UNREACHABLE();
+ UNREACHABLE();
}
static struct drgn_error *read_cus(struct drgn_dwarf_index *dindex,
@@ -1410,7 +1410,8 @@ static struct drgn_error *read_abbrev_decl(const char **ptr, const char *end,
break;
}
- if (should_index || tag == DW_TAG_compile_unit)
+ if (should_index || tag == DW_TAG_compile_unit ||
+ tag == DW_TAG_partial_unit)
die_flags = tag;
else
die_flags = 0;
@@ -1470,7 +1471,8 @@ static struct drgn_error *read_abbrev_decl(const char **ptr, const char *end,
break;
}
} else if (name == DW_AT_stmt_list &&
- tag == DW_TAG_compile_unit &&
+ (tag == DW_TAG_compile_unit ||
+ tag == DW_TAG_partial_unit) &&
cu->sections[SECTION_DEBUG_LINE]) {
switch (form) {
case DW_FORM_data4:
@@ -2100,7 +2102,7 @@ static struct drgn_error *index_cu(struct drgn_dwarf_index *dindex,
}
tag = die.flags & TAG_MASK;
- if (tag == DW_TAG_compile_unit) {
+ if (tag == DW_TAG_compile_unit || tag == DW_TAG_partial_unit) {
if (depth == 0 && die.stmt_list != SIZE_MAX &&
(err = read_file_name_table(dindex, cu,
die.stmt_list,
diff --git a/libdrgn/dwarf_index.h b/libdrgn/dwarf_index.h
index 52843795a..86e6bdc10 100644
--- a/libdrgn/dwarf_index.h
+++ b/libdrgn/dwarf_index.h
@@ -14,10 +14,19 @@
#include
#include
-#include
#include
#include
+#ifdef _OPENMP
+#include
+#else
+typedef struct {} omp_lock_t;
+#define omp_init_lock(lock) do {} while (0)
+#define omp_destroy_lock(lock) do {} while (0)
+#define omp_set_lock(lock) do {} while (0)
+#define omp_unset_lock(lock) do {} while (0)
+#endif
+
#include "drgn.h"
#include "hash_table.h"
#include "string_builder.h"
diff --git a/libdrgn/dwarf_info_cache.c b/libdrgn/dwarf_info_cache.c
index 1be3a80db..1a97a3ef1 100644
--- a/libdrgn/dwarf_info_cache.c
+++ b/libdrgn/dwarf_info_cache.c
@@ -16,6 +16,9 @@
DEFINE_HASH_TABLE_FUNCTIONS(dwarf_type_map, hash_pair_ptr_type,
hash_table_scalar_eq)
+DEFINE_VECTOR(drgn_type_member_vector, struct drgn_type_member)
+DEFINE_VECTOR(drgn_type_enumerator_vector, struct drgn_type_enumerator)
+DEFINE_VECTOR(drgn_type_parameter_vector, struct drgn_type_parameter)
struct drgn_type_from_dwarf_thunk {
struct drgn_type_thunk thunk;
@@ -24,43 +27,33 @@ struct drgn_type_from_dwarf_thunk {
bool can_be_incomplete_array;
};
-static bool drgn_type_realloc(struct drgn_type **type, size_t capacity,
- size_t element_size)
-{
- struct drgn_type *tmp;
- size_t size;
-
- if (__builtin_mul_overflow(capacity, element_size, &size) ||
- __builtin_add_overflow(size, sizeof(**type), &size))
- return false;
-
- tmp = realloc(*type, size);
- if (!tmp)
- return false;
-
- *type = tmp;
- return true;
-}
-
static void drgn_dwarf_type_free(struct drgn_dwarf_type *dwarf_type)
{
if (dwarf_type->should_free) {
struct drgn_type *type = dwarf_type->type;
if (drgn_type_has_members(type)) {
+ struct drgn_type_member *members;
size_t num_members, i;
+ members = drgn_type_members(type);
num_members = drgn_type_num_members(type);
for (i = 0; i < num_members; i++)
- drgn_type_member_deinit(type, i);
+ drgn_type_member_deinit(&members[i]);
+ free(members);
}
if (drgn_type_has_parameters(type)) {
+ struct drgn_type_parameter *parameters;
size_t num_parameters, i;
+ parameters = drgn_type_parameters(type);
num_parameters = drgn_type_num_parameters(type);
for (i = 0; i < num_parameters; i++)
- drgn_type_parameter_deinit(type, i);
+ drgn_type_parameter_deinit(¶meters[i]);
+ free(parameters);
}
+ if (drgn_type_has_enumerators(type))
+ free(drgn_type_enumerators(type));
free(type);
}
}
@@ -88,24 +81,6 @@ static int dwarf_flag(Dwarf_Die *die, unsigned int name, bool *ret)
return dwarf_formflag(attr, ret);
}
-/**
- * Deduce language which corresponds with the CU of the given DIE.
- *
- * @param[in] die Dwarf_Die used to retrieve the current language.
- * @param[out] ret Returned language.
- * @return @c NULL on success, non-@c NULL on error.
- */
-static struct drgn_error *
-drgn_language_from_die(Dwarf_Die *die, const struct drgn_language **ret)
-{
- Dwarf_Die cudie;
-
- if (dwarf_cu_info(die->cu, NULL, NULL, &cudie, NULL, NULL, NULL, NULL))
- return drgn_error_libdw();
- *ret = drgn_language_from_dw_lang(dwarf_srclang(&cudie));
- return NULL;
-}
-
/**
* Parse a type from a DWARF debugging information entry.
*
@@ -498,8 +473,9 @@ parse_member_offset(Dwarf_Die *die, struct drgn_lazy_type *member_type,
}
static struct drgn_error *parse_member(struct drgn_dwarf_info_cache *dicache,
- Dwarf_Die *die, struct drgn_type *type,
- size_t i, bool little_endian)
+ Dwarf_Die *die,
+ struct drgn_type_member *member,
+ bool little_endian)
{
struct drgn_error *err;
Dwarf_Attribute attr_mem;
@@ -545,7 +521,7 @@ static struct drgn_error *parse_member(struct drgn_dwarf_info_cache *dicache,
return err;
}
- drgn_type_member_init(type, i, member_type, name, bit_offset,
+ drgn_type_member_init(member, member_type, name, bit_offset,
bit_field_size);
return NULL;
}
@@ -559,6 +535,7 @@ drgn_compound_type_from_dwarf(struct drgn_dwarf_info_cache *dicache,
{
struct drgn_error *err;
struct drgn_type *type;
+ struct drgn_type_member_vector members;
const char *dw_tag_str;
uint64_t dw_tag;
Dwarf_Attribute attr_mem;
@@ -567,7 +544,6 @@ drgn_compound_type_from_dwarf(struct drgn_dwarf_info_cache *dicache,
bool declaration;
Dwarf_Die child;
int size;
- size_t num_members = 0, capacity = 0;
bool little_endian;
int r;
@@ -585,7 +561,7 @@ drgn_compound_type_from_dwarf(struct drgn_dwarf_info_cache *dicache,
dw_tag = DW_TAG_class_type;
break;
default:
- DRGN_UNREACHABLE();
+ UNREACHABLE();
}
attr = dwarf_attr_integrate(die, DW_AT_name, &attr_mem);
@@ -633,12 +609,14 @@ drgn_compound_type_from_dwarf(struct drgn_dwarf_info_cache *dicache,
drgn_class_type_init_incomplete(type, tag, lang);
break;
default:
- DRGN_UNREACHABLE();
+ UNREACHABLE();
}
*ret = type;
return NULL;
}
+ drgn_type_member_vector_init(&members);
+
size = dwarf_bytesize(die);
if (size == -1) {
err = drgn_error_format(DRGN_ERROR_OTHER,
@@ -651,23 +629,19 @@ drgn_compound_type_from_dwarf(struct drgn_dwarf_info_cache *dicache,
r = dwarf_child(die, &child);
while (r == 0) {
if (dwarf_tag(&child) == DW_TAG_member) {
- if (num_members >= capacity) {
- if (capacity == 0)
- capacity = 1;
- else
- capacity *= 2;
- if (!drgn_type_realloc(&type, capacity,
- sizeof(struct drgn_type_member))) {
- err = &drgn_enomem;
- goto err;
- }
- }
+ struct drgn_type_member *member;
- err = parse_member(dicache, &child, type, num_members,
+ member = drgn_type_member_vector_append_entry(&members);
+ if (!member) {
+ err = &drgn_enomem;
+ goto err;
+ }
+ err = parse_member(dicache, &child, member,
little_endian);
- if (err)
+ if (err) {
+ members.size--;
goto err;
- num_members++;
+ }
}
r = dwarf_siblingof(&child, &child);
}
@@ -676,29 +650,29 @@ drgn_compound_type_from_dwarf(struct drgn_dwarf_info_cache *dicache,
"libdw could not parse DIE children");
goto err;
}
- if (capacity != num_members) {
- /* We don't care if this fails. */
- drgn_type_realloc(&type, num_members,
- sizeof(struct drgn_type_member));
- }
+ drgn_type_member_vector_shrink_to_fit(&members);
if (kind == DRGN_TYPE_UNION) {
- drgn_union_type_init(type, tag, size, num_members, lang);
+ drgn_union_type_init(type, tag, size, members.data,
+ members.size, lang);
} else {
- if (kind == DRGN_TYPE_STRUCT)
- drgn_struct_type_init(type, tag, size, num_members, lang);
- else
- drgn_class_type_init(type, tag, size, num_members, lang);
+ if (kind == DRGN_TYPE_STRUCT) {
+ drgn_struct_type_init(type, tag, size, members.data,
+ members.size, lang);
+ } else {
+ drgn_class_type_init(type, tag, size, members.data,
+ members.size, lang);
+ }
/*
* Flexible array members are only allowed as the last member of
* a structure with more than one named member. We defaulted
* can_be_incomplete_array to false in parse_member(), so fix it
* up.
*/
- if (num_members > 1) {
+ if (members.size > 1) {
struct drgn_type_member *member;
- member = &drgn_type_members(type)[num_members - 1];
+ member = &drgn_type_members(type)[members.size - 1];
/*
* The type may have already been evaluated if it's a
* bit field. Arrays can't be bit fields, so it's okay
@@ -718,15 +692,16 @@ drgn_compound_type_from_dwarf(struct drgn_dwarf_info_cache *dicache,
return NULL;
err:
- while (num_members)
- drgn_type_member_deinit(type, --num_members);
+ for (size_t i = 0; i < members.size; i++)
+ drgn_type_member_deinit(&members.data[i]);
+ drgn_type_member_vector_deinit(&members);
free(type);
return err;
}
-static struct drgn_error *parse_enumerator(Dwarf_Die *die,
- struct drgn_type *type, size_t i,
- bool *is_signed)
+static struct drgn_error *
+parse_enumerator(Dwarf_Die *die, struct drgn_type_enumerator *enumerator,
+ bool *is_signed)
{
Dwarf_Attribute attr_mem;
Dwarf_Attribute *attr;
@@ -751,7 +726,8 @@ static struct drgn_error *parse_enumerator(Dwarf_Die *die,
r = dwarf_formsdata(attr, &svalue);
if (r == 0) {
- drgn_type_enumerator_init_signed(type, i, name, svalue);
+ drgn_type_enumerator_init_signed(enumerator, name,
+ svalue);
if (svalue < 0)
*is_signed = true;
}
@@ -760,7 +736,7 @@ static struct drgn_error *parse_enumerator(Dwarf_Die *die,
r = dwarf_formudata(attr, &uvalue);
if (r == 0) {
- drgn_type_enumerator_init_unsigned(type, i, name,
+ drgn_type_enumerator_init_unsigned(enumerator, name,
uvalue);
}
}
@@ -838,13 +814,13 @@ drgn_enum_type_from_dwarf(struct drgn_dwarf_info_cache *dicache, Dwarf_Die *die,
{
struct drgn_error *err;
struct drgn_type *type;
+ struct drgn_type_enumerator_vector enumerators;
struct drgn_type *compatible_type;
Dwarf_Attribute attr_mem;
Dwarf_Attribute *attr;
const char *tag;
bool declaration;
Dwarf_Die child;
- size_t num_enumerators = 0, capacity = 0;
bool is_signed = false;
int r;
@@ -885,29 +861,24 @@ drgn_enum_type_from_dwarf(struct drgn_dwarf_info_cache *dicache, Dwarf_Die *die,
return NULL;
}
+ drgn_type_enumerator_vector_init(&enumerators);
+
r = dwarf_child(die, &child);
while (r == 0) {
int tag;
tag = dwarf_tag(&child);
if (tag == DW_TAG_enumerator) {
- if (num_enumerators >= capacity) {
- if (capacity == 0)
- capacity = 1;
- else
- capacity *= 2;
- if (!drgn_type_realloc(&type, capacity,
- sizeof(struct drgn_type_enumerator))) {
- err = &drgn_enomem;
- goto err;
- }
- }
+ struct drgn_type_enumerator *enumerator;
- err = parse_enumerator(&child, type, num_enumerators,
- &is_signed);
+ enumerator = drgn_type_enumerator_vector_append_entry(&enumerators);
+ if (!enumerator) {
+ err = &drgn_enomem;
+ goto err;
+ }
+ err = parse_enumerator(&child, enumerator, &is_signed);
if (err)
goto err;
- num_enumerators++;
}
r = dwarf_siblingof(&child, &child);
}
@@ -916,11 +887,7 @@ drgn_enum_type_from_dwarf(struct drgn_dwarf_info_cache *dicache, Dwarf_Die *die,
"libdw could not parse DIE children");
goto err;
}
- if (capacity != num_enumerators) {
- /* We don't care if this fails. */
- drgn_type_realloc(&type, num_enumerators,
- sizeof(struct drgn_type_enumerator));
- }
+ drgn_type_enumerator_vector_shrink_to_fit(&enumerators);
r = dwarf_type(die, &child);
if (r == -1) {
@@ -947,11 +914,13 @@ drgn_enum_type_from_dwarf(struct drgn_dwarf_info_cache *dicache, Dwarf_Die *die,
}
}
- drgn_enum_type_init(type, tag, compatible_type, num_enumerators, lang);
+ drgn_enum_type_init(type, tag, compatible_type, enumerators.data,
+ enumerators.size, lang);
*ret = type;
return NULL;
err:
+ drgn_type_enumerator_vector_deinit(&enumerators);
free(type);
return err;
}
@@ -979,8 +948,10 @@ drgn_typedef_type_from_dwarf(struct drgn_dwarf_info_cache *dicache,
if (!type)
return &drgn_enomem;
- err = drgn_type_from_dwarf_child(dicache, die, lang, "DW_TAG_typedef",
- true, can_be_incomplete_array,
+ err = drgn_type_from_dwarf_child(dicache, die,
+ drgn_language_or_default(lang),
+ "DW_TAG_typedef", true,
+ can_be_incomplete_array,
is_incomplete_array_ret,
&aliased_type);
if (err) {
@@ -1001,7 +972,8 @@ drgn_pointer_type_from_dwarf(struct drgn_dwarf_info_cache *dicache,
struct drgn_error *err;
struct drgn_qualified_type referenced_type;
- err = drgn_type_from_dwarf_child(dicache, die, lang,
+ err = drgn_type_from_dwarf_child(dicache, die,
+ drgn_language_or_default(lang),
"DW_TAG_pointer_type", true, true,
NULL, &referenced_type);
if (err)
@@ -1103,7 +1075,8 @@ drgn_array_type_from_dwarf(struct drgn_dwarf_info_cache *dicache,
dimension->is_complete = false;
}
- err = drgn_type_from_dwarf_child(dicache, die, lang,
+ err = drgn_type_from_dwarf_child(dicache, die,
+ drgn_language_or_default(lang),
"DW_TAG_array_type", false, false,
NULL, &element_type);
if (err)
@@ -1143,7 +1116,7 @@ drgn_array_type_from_dwarf(struct drgn_dwarf_info_cache *dicache,
static struct drgn_error *
parse_formal_parameter(struct drgn_dwarf_info_cache *dicache, Dwarf_Die *die,
- struct drgn_type *type, size_t i)
+ struct drgn_type_parameter *parameter)
{
struct drgn_error *err;
Dwarf_Attribute attr_mem;
@@ -1168,7 +1141,7 @@ parse_formal_parameter(struct drgn_dwarf_info_cache *dicache, Dwarf_Die *die,
if (err)
return err;
- drgn_type_parameter_init(type, i, parameter_type, name);
+ drgn_type_parameter_init(parameter, parameter_type, name);
return NULL;
}
@@ -1180,9 +1153,9 @@ drgn_function_type_from_dwarf(struct drgn_dwarf_info_cache *dicache,
struct drgn_error *err;
const char *tag_name;
struct drgn_type *type;
+ struct drgn_type_parameter_vector parameters;
struct drgn_qualified_type return_type;
Dwarf_Die child;
- size_t num_parameters = 0, capacity = 0;
bool is_variadic = false;
int r;
@@ -1195,12 +1168,16 @@ drgn_function_type_from_dwarf(struct drgn_dwarf_info_cache *dicache,
if (!type)
return &drgn_enomem;
+ drgn_type_parameter_vector_init(¶meters);
+
r = dwarf_child(die, &child);
while (r == 0) {
int tag;
tag = dwarf_tag(&child);
if (tag == DW_TAG_formal_parameter) {
+ struct drgn_type_parameter *parameter;
+
if (is_variadic) {
err = drgn_error_format(DRGN_ERROR_OTHER,
"%s has DW_TAG_formal_parameter child after DW_TAG_unspecified_parameters child",
@@ -1208,23 +1185,16 @@ drgn_function_type_from_dwarf(struct drgn_dwarf_info_cache *dicache,
goto err;
}
- if (num_parameters >= capacity) {
- if (capacity == 0)
- capacity = 1;
- else
- capacity *= 2;
- if (!drgn_type_realloc(&type, capacity,
- sizeof(struct drgn_type_parameter))) {
- err = &drgn_enomem;
- goto err;
- }
+ parameter = drgn_type_parameter_vector_append_entry(¶meters);
+ if (!parameter) {
+ err = &drgn_enomem;
+ goto err;
}
-
- err = parse_formal_parameter(dicache, &child, type,
- num_parameters);
- if (err)
+ err = parse_formal_parameter(dicache, &child, parameter);
+ if (err) {
+ parameters.size--;
goto err;
- num_parameters++;
+ }
} else if (tag == DW_TAG_unspecified_parameters) {
if (is_variadic) {
err = drgn_error_format(DRGN_ERROR_OTHER,
@@ -1241,25 +1211,24 @@ drgn_function_type_from_dwarf(struct drgn_dwarf_info_cache *dicache,
"libdw could not parse DIE children");
goto err;
}
- if (capacity != num_parameters) {
- /* We don't care if this fails. */
- drgn_type_realloc(&type, num_parameters,
- sizeof(struct drgn_type_parameter));
- }
+ drgn_type_parameter_vector_shrink_to_fit(¶meters);
- err = drgn_type_from_dwarf_child(dicache, die, lang, tag_name, true,
- true, NULL, &return_type);
+ err = drgn_type_from_dwarf_child(dicache, die,
+ drgn_language_or_default(lang),
+ tag_name, true, true, NULL,
+ &return_type);
if (err)
goto err;
- drgn_function_type_init(type, return_type, num_parameters, is_variadic,
- lang);
+ drgn_function_type_init(type, return_type, parameters.data,
+ parameters.size, is_variadic, lang);
*ret = type;
return NULL;
err:
- while (num_parameters)
- drgn_type_parameter_deinit(type, --num_parameters);
+ for (size_t i = 0; i < parameters.size; i++)
+ drgn_type_parameter_deinit(¶meters.data[i]);
+ drgn_type_parameter_vector_deinit(¶meters);
free(type);
return err;
}
@@ -1313,28 +1282,32 @@ drgn_type_from_dwarf_internal(struct drgn_dwarf_info_cache *dicache,
* unqualified type.
*/
entry.value.should_free = false;
- err = drgn_type_from_dwarf_child(dicache, die, lang,
+ err = drgn_type_from_dwarf_child(dicache, die,
+ drgn_language_or_default(lang),
"DW_TAG_const_type", true,
true, NULL, ret);
ret->qualifiers |= DRGN_QUALIFIER_CONST;
break;
case DW_TAG_restrict_type:
entry.value.should_free = false;
- err = drgn_type_from_dwarf_child(dicache, die, lang,
+ err = drgn_type_from_dwarf_child(dicache, die,
+ drgn_language_or_default(lang),
"DW_TAG_restrict_type", true,
true, NULL, ret);
ret->qualifiers |= DRGN_QUALIFIER_RESTRICT;
break;
case DW_TAG_volatile_type:
entry.value.should_free = false;
- err = drgn_type_from_dwarf_child(dicache, die, lang,
+ err = drgn_type_from_dwarf_child(dicache, die,
+ drgn_language_or_default(lang),
"DW_TAG_volatile_type", true,
true, NULL, ret);
ret->qualifiers |= DRGN_QUALIFIER_VOLATILE;
break;
case DW_TAG_atomic_type:
entry.value.should_free = false;
- err = drgn_type_from_dwarf_child(dicache, die, lang,
+ err = drgn_type_from_dwarf_child(dicache, die,
+ drgn_language_or_default(lang),
"DW_TAG_atomic_type", true,
true, NULL, ret);
ret->qualifiers |= DRGN_QUALIFIER_ATOMIC;
@@ -1447,7 +1420,7 @@ struct drgn_error *drgn_dwarf_type_find(enum drgn_type_kind kind,
tag = DW_TAG_typedef;
break;
default:
- DRGN_UNREACHABLE();
+ UNREACHABLE();
}
drgn_dwarf_index_iterator_init(&it, &dicache->dindex, name, name_len,
@@ -1498,7 +1471,7 @@ drgn_object_from_dwarf_enumerator(struct drgn_dwarf_info_cache *dicache,
0);
}
}
- DRGN_UNREACHABLE();
+ UNREACHABLE();
}
static struct drgn_error *
@@ -1592,7 +1565,7 @@ drgn_dwarf_object_find(const char *name, size_t name_len, const char *filename,
return drgn_object_from_dwarf_variable(dicache, &die,
bias, name, ret);
default:
- DRGN_UNREACHABLE();
+ UNREACHABLE();
}
}
if (err && err->code != DRGN_ERROR_STOP)
diff --git a/libdrgn/elfutils/CONTRIBUTING b/libdrgn/elfutils/CONTRIBUTING
index e3d5a0f78..bb48975ba 100644
--- a/libdrgn/elfutils/CONTRIBUTING
+++ b/libdrgn/elfutils/CONTRIBUTING
@@ -8,7 +8,7 @@ elfutils-devel@sourceware.org.
https://sourceware.org/ml/elfutils-devel/
To subscribe send an email to elfutils-devel-subscribe@sourceware.org
-Or use the form at https://sourceware.org/lists.html#ml-requestor
+Or use the form at https://sourceware.org/mailman/listinfo/elfutils-devel
Please supply patches using git format-patch or using git send-email.
diff --git a/libdrgn/elfutils/ChangeLog b/libdrgn/elfutils/ChangeLog
index 96d61403e..854568e0b 100644
--- a/libdrgn/elfutils/ChangeLog
+++ b/libdrgn/elfutils/ChangeLog
@@ -1,3 +1,13 @@
+2020-03-30 Mark Wielaard
+
+ * configure.ac: Set version to 0.179.
+ * NEWS: Add 0.179 section.
+
+2020-03-25 Mark Wielaard
+
+ * README: Update mailinglist subscription info.
+ * CONTRIBUTING: Likewise.
+
2020-02-03 Frank Ch. Eigler
* configure.ac: Tolerate CXX= for debuginfod configuration.
diff --git a/libdrgn/elfutils/NEWS b/libdrgn/elfutils/NEWS
index c147ad3cf..d26dccec6 100644
--- a/libdrgn/elfutils/NEWS
+++ b/libdrgn/elfutils/NEWS
@@ -1,3 +1,38 @@
+Version 0.179
+
+debuginfod-client: When DEBUGINFOD_PROGRESS is set and the program doesn't
+ install its own debuginfod_progressfn_t show download
+ progress on stderr.
+ DEBUGINFOD_TIMEOUT is now defined as seconds to get at
+ least 100K, defaults to 90 seconds.
+ Default to $XDG_CACHE_HOME/debuginfod_client.
+ New functions debuginfod_set_user_data,
+ debuginfod_get_user_data, debuginfod_get_url and
+ debuginfod_add_http_header.
+ Support for file:// URLs.
+
+debuginfod: Uses libarchive directly for reading rpm archives.
+ Support for indexing .deb/.ddeb archives through dpkg-deb
+ or bsdtar.
+ Generic archive support through -Z EXT[=CMD]. Which can be
+ used for example for arch-linux pacman files by using
+ -Z '.tar.zst=zstdcat'.
+ Better logging using User-Agent and X-Forwarded-For headers.
+ More prometheus metrics.
+ Support for eliding dots or extraneous slashes in path names.
+
+debuginfod-find: Accept /path/names in place of buildid hex.
+
+libelf: Handle PN_XNUM in elf_getphdrnum before shdr 0 is cached
+ Ensure zlib resource cleanup on failure.
+
+libdwfl: dwfl_linux_kernel_find_elf and dwfl_linux_kernel_report_offline
+ now find and handle a compressed vmlinuz image.
+
+readelf, elflint: Handle PT_GNU_PROPERTY.
+
+translations: Updated Ukrainian translation.
+
Version 0.178
debuginfod: New server, client tool and library to index and fetch
diff --git a/libdrgn/elfutils/PATCHES b/libdrgn/elfutils/PATCHES
index 6ab2e8105..f7dbbb1ba 100644
--- a/libdrgn/elfutils/PATCHES
+++ b/libdrgn/elfutils/PATCHES
@@ -1,4 +1,4 @@
-commit ad6dd76bc9e4cbb6f0b608ebe3061be3b3bb7c77
+commit c26c6ddb435d87ceafdd8fb36fa99011119d6e3a
Author: Omar Sandoval
Date: Mon Oct 7 01:30:35 2019 -0700
@@ -9,23 +9,23 @@ Date: Mon Oct 7 01:30:35 2019 -0700
pieces are in place, add dwfl_frame_eval_expr to provide this feature.
diff --git a/libdw/libdw.map b/libdw/libdw.map
-index 66ec16106..b2df2ba72 100644
+index 5f5946cb1..b4fa63631 100644
--- a/libdw/libdw.map
+++ b/libdw/libdw.map
-@@ -377,4 +377,5 @@ ELFUTILS_0.179 {
+@@ -377,4 +377,5 @@ ELFUTILS_0.180 {
dwfl_frame_module;
dwfl_frame_dwarf_frame;
dwfl_frame_register;
+ dwfl_frame_eval_expr;
- } ELFUTILS_0.178;
+ } ELFUTILS_0.177;
diff --git a/libdwfl/frame_unwind.c b/libdwfl/frame_unwind.c
-index 6bf1a3907..13bff8fc6 100644
+index 3984c65ce..4885caa13 100644
--- a/libdwfl/frame_unwind.c
+++ b/libdwfl/frame_unwind.c
-@@ -802,3 +802,14 @@ out:
- *bias = state->bias;
+@@ -814,3 +814,14 @@ out:
return state->frame;
}
+ INTDEF (dwfl_frame_dwarf_frame)
+
+bool
+dwfl_frame_eval_expr (Dwfl_Frame *state, const Dwarf_Op *ops, size_t nops,
@@ -54,7 +54,7 @@ index fb261698e..1dc080c01 100644
#ifdef __cplusplus
}
#endif
-commit 2f67d8a89d24820bd74f25c0d08bf05cb2c49b81
+commit b32da5a9a88543f144afd50a213afe6fe1d9b25d
Author: Omar Sandoval
Date: Thu Feb 20 11:44:38 2020 -0800
@@ -63,17 +63,17 @@ Date: Thu Feb 20 11:44:38 2020 -0800
This is useful for debuggers that want to dump register values.
diff --git a/libdw/libdw.map b/libdw/libdw.map
-index e5def9a54..66ec16106 100644
+index e0fe21156..5f5946cb1 100644
--- a/libdw/libdw.map
+++ b/libdw/libdw.map
-@@ -376,4 +376,5 @@ ELFUTILS_0.179 {
+@@ -376,4 +376,5 @@ ELFUTILS_0.180 {
dwfl_detach_thread;
dwfl_frame_module;
dwfl_frame_dwarf_frame;
+ dwfl_frame_register;
- } ELFUTILS_0.178;
+ } ELFUTILS_0.177;
diff --git a/libdwfl/frame_unwind.c b/libdwfl/frame_unwind.c
-index 480636718..6bf1a3907 100644
+index 9ada2e550..3984c65ce 100644
--- a/libdwfl/frame_unwind.c
+++ b/libdwfl/frame_unwind.c
@@ -44,8 +44,7 @@
@@ -86,7 +86,15 @@ index 480636718..6bf1a3907 100644
{
Ebl *ebl = state->thread->process->ebl;
if (! ebl_dwarf_to_regno (ebl, ®no))
-@@ -81,7 +80,7 @@ __libdwfl_frame_reg_set (Dwfl_Frame *state, unsigned regno, Dwarf_Addr val)
+@@ -59,6 +58,7 @@ __libdwfl_frame_reg_get (Dwfl_Frame *state, unsigned regno, Dwarf_Addr *val)
+ *val = state->regs[regno];
+ return true;
+ }
++INTDEF (dwfl_frame_register)
+
+ bool
+ internal_function
+@@ -81,7 +81,7 @@ __libdwfl_frame_reg_set (Dwfl_Frame *state, unsigned regno, Dwarf_Addr val)
static bool
state_get_reg (Dwfl_Frame *state, unsigned regno, Dwarf_Addr *val)
{
@@ -95,7 +103,7 @@ index 480636718..6bf1a3907 100644
{
__libdwfl_seterrno (DWFL_E_INVALID_REGISTER);
return false;
-@@ -625,9 +624,9 @@ handle_cfi (Dwfl_Frame *state, Dwarf_Frame *frame, Dwarf_Addr bias)
+@@ -628,9 +628,9 @@ handle_cfi (Dwfl_Frame *state, Dwarf_Frame *frame, Dwarf_Addr bias)
}
if (unwound->pc_state == DWFL_FRAME_STATE_ERROR)
{
@@ -108,7 +116,7 @@ index 480636718..6bf1a3907 100644
{
/* PPC32 __libc_start_main properly CFI-unwinds PC as zero.
Currently none of the archs supported for unwinding have
-@@ -684,7 +683,7 @@ getfunc (int firstreg, unsigned nregs, Dwarf_Word *regs, void *arg)
+@@ -687,7 +687,7 @@ getfunc (int firstreg, unsigned nregs, Dwarf_Word *regs, void *arg)
Dwfl_Frame *state = arg;
assert (firstreg >= 0);
while (nregs--)
@@ -134,10 +142,10 @@ index b494d4582..fb261698e 100644
}
#endif
diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h
-index 659e671a6..eab003e66 100644
+index 90d509ece..613ccf016 100644
--- a/libdwfl/libdwflP.h
+++ b/libdwfl/libdwflP.h
-@@ -284,12 +284,6 @@ struct Dwfl_Frame
+@@ -283,12 +283,6 @@ struct Dwfl_Frame
Dwarf_Addr regs[];
};
@@ -150,6 +158,14 @@ index 659e671a6..eab003e66 100644
/* Store value to Dwfl_Frame->regs indexed by DWARF REGNO.
No error code is set if the function returns FALSE. */
bool __libdwfl_frame_reg_set (Dwfl_Frame *state, unsigned regno,
+@@ -788,6 +782,7 @@ INTDECL (dwfl_getthread_frames)
+ INTDECL (dwfl_getthreads)
+ INTDECL (dwfl_thread_getframes)
+ INTDECL (dwfl_frame_pc)
++INTDECL (dwfl_frame_register)
+
+ /* 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/linux-core-attach.c b/libdwfl/linux-core-attach.c
index c0f1b0d00..d55312b6c 100644
--- a/libdwfl/linux-core-attach.c
@@ -167,7 +183,7 @@ index c0f1b0d00..d55312b6c 100644
continue;
Dwarf_Word val;
switch (regloc->bits)
-commit e289ead84e610640d086d44eb3d1149781b0f971
+commit 1426c2a70c1748cd5a6f4e38410ae4e9796d3037
Author: Omar Sandoval
Date: Thu Feb 20 11:18:28 2020 -0800
@@ -183,18 +199,18 @@ Date: Thu Feb 20 11:18:28 2020 -0800
frame, so add dwfl_frame_module.
diff --git a/libdw/libdw.map b/libdw/libdw.map
-index 4f3ad91d4..e5def9a54 100644
+index c8961b3a6..e0fe21156 100644
--- a/libdw/libdw.map
+++ b/libdw/libdw.map
-@@ -374,4 +374,6 @@ ELFUTILS_0.179 {
+@@ -374,4 +374,6 @@ ELFUTILS_0.180 {
global:
dwfl_attach_thread;
dwfl_detach_thread;
+ dwfl_frame_module;
+ dwfl_frame_dwarf_frame;
- } ELFUTILS_0.178;
+ } ELFUTILS_0.177;
diff --git a/libdwfl/dwfl_frame.c b/libdwfl/dwfl_frame.c
-index 61fad8b9c..80f2bc146 100644
+index 0ad28e0f5..046f6c2ba 100644
--- a/libdwfl/dwfl_frame.c
+++ b/libdwfl/dwfl_frame.c
@@ -68,6 +68,13 @@ state_fetch_pc (Dwfl_Frame *state)
@@ -228,10 +244,10 @@ index 61fad8b9c..80f2bc146 100644
+ state->frame = NULL;
+ state->moderr = DWFL_E_NOERROR;
+ state->frameerr = DWFL_E_NOERROR;
- state->signal_frame = false;
- state->initial_frame = true;
+ state->isactivation = true;
state->pc_state = DWFL_FRAME_STATE_ERROR;
-@@ -486,7 +497,7 @@ dwfl_thread_getframes (Dwfl_Thread *thread,
+ memset (state->regs_set, 0, sizeof (state->regs_set));
+@@ -485,7 +496,7 @@ dwfl_thread_getframes (Dwfl_Thread *thread,
if (! cache)
{
/* The old frame is no longer needed. */
@@ -241,7 +257,7 @@ index 61fad8b9c..80f2bc146 100644
state = next;
}
diff --git a/libdwfl/frame_unwind.c b/libdwfl/frame_unwind.c
-index d7dfa5a94..480636718 100644
+index df755975e..9ada2e550 100644
--- a/libdwfl/frame_unwind.c
+++ b/libdwfl/frame_unwind.c
@@ -523,6 +523,10 @@ new_unwound (Dwfl_Frame *state)
@@ -252,10 +268,10 @@ index d7dfa5a94..480636718 100644
+ unwound->frame = NULL;
+ unwound->moderr = DWFL_E_NOERROR;
+ unwound->frameerr = DWFL_E_NOERROR;
- unwound->signal_frame = false;
- unwound->initial_frame = false;
+ unwound->isactivation = false;
unwound->pc_state = DWFL_FRAME_STATE_ERROR;
-@@ -536,22 +540,9 @@ new_unwound (Dwfl_Frame *state)
+ memset (unwound->regs_set, 0, sizeof (unwound->regs_set));
+@@ -535,22 +539,9 @@ new_unwound (Dwfl_Frame *state)
later. Therefore we continue unwinding leaving the registers undefined. */
static void
@@ -277,10 +293,10 @@ index d7dfa5a94..480636718 100644
- }
-
+ Dwfl_Frame *unwound = state->unwound;
- unwound->signal_frame = frame->fde->cie->signal_frame;
- Dwfl_Thread *thread = state->thread;
- Dwfl_Process *process = thread->process;
-@@ -665,7 +656,6 @@ handle_cfi (Dwfl_Frame *state, Dwarf_Addr pc, Dwarf_CFI *cfi, Dwarf_Addr bias)
+ if (frame->fde->cie->signal_frame)
+ {
+ state->isactivation = true;
+@@ -668,7 +659,6 @@ handle_cfi (Dwfl_Frame *state, Dwarf_Addr pc, Dwarf_CFI *cfi, Dwarf_Addr bias)
unwound->pc_state = DWFL_FRAME_STATE_PC_UNDEFINED;
}
}
@@ -289,8 +305,8 @@ index d7dfa5a94..480636718 100644
static bool
@@ -724,28 +714,16 @@ __libdwfl_frame_unwind (Dwfl_Frame *state)
- Then we need to unwind from the original, unadjusted PC. */
- if (! state->initial_frame && ! state->signal_frame)
+ assert (ok);
+ if (! isactivation)
pc--;
- Dwfl_Module *mod = INTUSE(dwfl_addrmodule) (state->thread->process->dwfl, pc);
- if (mod == NULL)
@@ -325,9 +341,9 @@ index d7dfa5a94..480636718 100644
Dwfl_Thread *thread = state->thread;
Dwfl_Process *process = thread->process;
Ebl *ebl = process->ebl;
-@@ -770,3 +748,58 @@ __libdwfl_frame_unwind (Dwfl_Frame *state)
- assert (state->unwound->pc_state == DWFL_FRAME_STATE_PC_SET);
- state->unwound->signal_frame = signal_frame;
+@@ -773,3 +751,66 @@ __libdwfl_frame_unwind (Dwfl_Frame *state)
+ state->unwound->isactivation = true;
+ }
}
+
+Dwfl_Module *
@@ -338,7 +354,10 @@ index d7dfa5a94..480636718 100644
+ if (state->moderr == DWFL_E_NOERROR)
+ {
+ Dwarf_Addr pc;
-+ INTUSE(dwfl_frame_pc) (state, &pc, NULL);
++ bool isactivation;
++ INTUSE(dwfl_frame_pc) (state, &pc, &isactivation);
++ if (! isactivation)
++ pc--;
+ state->mod = INTUSE(dwfl_addrmodule) (state->thread->process->dwfl, pc);
+ if (state->mod != NULL)
+ return state->mod;
@@ -347,6 +366,7 @@ index d7dfa5a94..480636718 100644
+ __libdwfl_seterrno (state->moderr);
+ return NULL;
+}
++INTDEF (dwfl_frame_module)
+
+Dwarf_Frame *
+dwfl_frame_dwarf_frame (Dwfl_Frame *state, Dwarf_Addr *bias)
@@ -362,7 +382,10 @@ index d7dfa5a94..480636718 100644
+ return NULL;
+ }
+ Dwarf_Addr pc;
-+ INTUSE(dwfl_frame_pc) (state, &pc, NULL);
++ bool isactivation;
++ INTUSE(dwfl_frame_pc) (state, &pc, &isactivation);
++ if (! isactivation)
++ pc--;
+ Dwarf_CFI *cfi = INTUSE(dwfl_module_eh_cfi) (state->mod,
+ &state->bias);
+ if (cfi
@@ -384,6 +407,7 @@ index d7dfa5a94..480636718 100644
+ *bias = state->bias;
+ return state->frame;
+}
++INTDEF (dwfl_frame_dwarf_frame)
diff --git a/libdwfl/libdwfl.h b/libdwfl/libdwfl.h
index 4167ef7ad..b494d4582 100644
--- a/libdwfl/libdwfl.h
@@ -406,7 +430,7 @@ index 4167ef7ad..b494d4582 100644
For every known continuous block of registers
Date: Mon Oct 7 01:22:39 2019 -0700
@@ -441,23 +474,23 @@ Date: Mon Oct 7 01:22:39 2019 -0700
possible to use the frames after dwfl_thread_getframes returns.
diff --git a/libdw/libdw.map b/libdw/libdw.map
-index decac05c7..4f3ad91d4 100644
+index decac05c7..c8961b3a6 100644
--- a/libdw/libdw.map
+++ b/libdw/libdw.map
@@ -370,3 +370,8 @@ ELFUTILS_0.177 {
# presume that NULL is only returned on error (otherwise ELF_K_NONE).
dwelf_elf_begin;
} ELFUTILS_0.175;
-+ELFUTILS_0.179 {
++ELFUTILS_0.180 {
+ global:
+ dwfl_attach_thread;
+ dwfl_detach_thread;
-+} ELFUTILS_0.178;
++} ELFUTILS_0.177;
diff --git a/libdwfl/dwfl_frame.c b/libdwfl/dwfl_frame.c
-index 5bbf850e8..61fad8b9c 100644
+index d5043cbbe..0ad28e0f5 100644
--- a/libdwfl/dwfl_frame.c
+++ b/libdwfl/dwfl_frame.c
-@@ -103,6 +103,29 @@ state_alloc (Dwfl_Thread *thread)
+@@ -102,6 +102,29 @@ state_alloc (Dwfl_Thread *thread)
return state;
}
@@ -487,7 +520,7 @@ index 5bbf850e8..61fad8b9c 100644
void
internal_function
__libdwfl_process_free (Dwfl_Process *process)
-@@ -366,6 +389,45 @@ getthread (Dwfl *dwfl, pid_t tid,
+@@ -365,6 +388,45 @@ getthread (Dwfl *dwfl, pid_t tid,
return err;
}
@@ -533,7 +566,7 @@ index 5bbf850e8..61fad8b9c 100644
struct one_thread
{
int (*callback) (Dwfl_Frame *frame, void *arg);
-@@ -394,63 +456,55 @@ dwfl_thread_getframes (Dwfl_Thread *thread,
+@@ -393,63 +455,55 @@ dwfl_thread_getframes (Dwfl_Thread *thread,
int (*callback) (Dwfl_Frame *state, void *arg),
void *arg)
{
@@ -654,7 +687,7 @@ index d5fa06d47..4167ef7ad 100644
have been processed by the callback, returns -1 on error, or the value of
the callback when not DWARF_CB_OK. -1 returned on error will
diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h
-index 25753de2f..bc088861f 100644
+index 332349d32..ed8239c92 100644
--- a/libdwfl/libdwflP.h
+++ b/libdwfl/libdwflP.h
@@ -239,7 +239,8 @@ struct Dwfl_Thread
@@ -667,7 +700,213 @@ index 25753de2f..bc088861f 100644
Dwfl_Frame *unwound;
void *callbacks_arg;
};
-commit b1515e3863da68aaee2b636121339c225095d8b9
+commit a1f60f2e2794859c7767b0b003efb20e3e018904
+Author: Omar Sandoval
+Date: Wed May 13 14:18:12 2020 -0700
+
+ libdwfl: simplify activation frame logic
+
+ When calling a noreturn function, the compiler may omit any code after
+ the call instruction. As a result, the return address on the stack may
+ not lie in the FDE for the caller. It might even lie in another symbol.
+ In the following example, the return address for the _Exit call in foo
+ is actually the first instruction of bar.
+
+ 0000000000001149 :
+ 1149: 50 push %rax
+ 114a: bf 01 00 00 00 mov $0x1,%edi
+ 114f: e8 dc fe ff ff callq 1030 <_Exit@plt>
+
+ 0000000000001154 :
+ 1154: b8 37 13 00 00 mov $0x1337,%eax
+ 1159: c3 retq
+
+ To handle this, libdwfl (and GDB, for that matter) decrements the
+ program counter when looking up the debugging information for a frame.
+
+ There are two important exceptions. The first is the initial (i.e.,
+ innermost) frame. This is typically supplied by ptrace or a PRSTATUS
+ note, which contains the exact trapped PC. libdwfl calls this case an
+ "activation" and doesn't decrement the PC.
+
+ The second exception is signal handling. When a signal is received, the
+ kernel creates a special signal stack frame so that when the signal
+ handler returns, it returns to the signal trampoline code responsible
+ for resuming execution (see sigreturn(2)).
+
+ The return address from the signal frame is the exact interrupted
+ instruction. Therefore, the interrupted frame (that is, the outer frame
+ of a signal frame) is also considered an activation.
+
+ The signal frame itself is also considered an activation frame, since
+ the return address points directly to the signal trampoline. However,
+ determining that a frame is a signal frame requires looking up the FDE.
+ To solve this chicken and egg problem, the signal trampoline is padded
+ so that the debugger can still find the FDE even if it decrements PC
+ (see [1]). This means that during the initial lookup, we can assume it's
+ not an activation, and then fix it up after the fact.
+
+ libdwfl annotates the interrupted frame (NB, not the signal frame) with
+ Dwfl_Frame::signal_frame. dwfl_frame_pc returns that a frame is an
+ activation if it is the interrupted frame, or if its outer frame is the
+ interrupted frame (which means it is the signal frame). This requires
+ unwinding the frame, so when the unwinding code calls dwfl_frame_pc, it
+ has to open-code the logic for determining whether the activation frame
+ check.
+
+ This can all be made a lot simpler by instead directly tracking whether
+ a Dwfl_Frame is an activation frame. This replaces
+ Dwfl_Frame::initial_frame and Dwfl_Frame::signal_frame with
+ Dwfl_Frame::isactivation. We set isactivation to true for the initial
+ frame, the signal frame, and the interrupted frame.
+
+ 1: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/x86/entry/vdso/vdso32/sigreturn.S?h=v5.6#n54
+
+diff --git a/libdwfl/dwfl_frame.c b/libdwfl/dwfl_frame.c
+index 5bbf850e8..d5043cbbe 100644
+--- a/libdwfl/dwfl_frame.c
++++ b/libdwfl/dwfl_frame.c
+@@ -94,8 +94,7 @@ state_alloc (Dwfl_Thread *thread)
+ if (state == NULL)
+ return NULL;
+ state->thread = thread;
+- state->signal_frame = false;
+- state->initial_frame = true;
++ state->isactivation = true;
+ state->pc_state = DWFL_FRAME_STATE_ERROR;
+ memset (state->regs_set, 0, sizeof (state->regs_set));
+ thread->unwound = state;
+diff --git a/libdwfl/dwfl_frame_pc.c b/libdwfl/dwfl_frame_pc.c
+index 296c815b9..a955d995a 100644
+--- a/libdwfl/dwfl_frame_pc.c
++++ b/libdwfl/dwfl_frame_pc.c
+@@ -39,26 +39,7 @@ dwfl_frame_pc (Dwfl_Frame *state, Dwarf_Addr *pc, bool *isactivation)
+ *pc = state->pc;
+ ebl_normalize_pc (state->thread->process->ebl, pc);
+ if (isactivation)
+- {
+- /* Bottom frame? */
+- if (state->initial_frame)
+- *isactivation = true;
+- /* *ISACTIVATION is logical union of whether current or previous frame
+- state is SIGNAL_FRAME. */
+- else if (state->signal_frame)
+- *isactivation = true;
+- else
+- {
+- /* If the previous frame has unwound unsuccessfully just silently do
+- not consider it could be a SIGNAL_FRAME. */
+- __libdwfl_frame_unwind (state);
+- if (state->unwound == NULL
+- || state->unwound->pc_state != DWFL_FRAME_STATE_PC_SET)
+- *isactivation = false;
+- else
+- *isactivation = state->unwound->signal_frame;
+- }
+- }
++ *isactivation = state->isactivation;
+ return true;
+ }
+ INTDEF (dwfl_frame_pc)
+diff --git a/libdwfl/dwfl_frame_regs.c b/libdwfl/dwfl_frame_regs.c
+index 83b1abef1..d013dc966 100644
+--- a/libdwfl/dwfl_frame_regs.c
++++ b/libdwfl/dwfl_frame_regs.c
+@@ -38,7 +38,6 @@ dwfl_thread_state_registers (Dwfl_Thread *thread, int firstreg,
+ {
+ Dwfl_Frame *state = thread->unwound;
+ assert (state && state->unwound == NULL);
+- assert (state->initial_frame);
+ for (unsigned regno = firstreg; regno < firstreg + nregs; regno++)
+ if (! __libdwfl_frame_reg_set (state, regno, regs[regno - firstreg]))
+ {
+@@ -54,7 +53,6 @@ dwfl_thread_state_register_pc (Dwfl_Thread *thread, Dwarf_Word pc)
+ {
+ Dwfl_Frame *state = thread->unwound;
+ assert (state && state->unwound == NULL);
+- assert (state->initial_frame);
+ state->pc = pc;
+ state->pc_state = DWFL_FRAME_STATE_PC_SET;
+ }
+diff --git a/libdwfl/frame_unwind.c b/libdwfl/frame_unwind.c
+index d7dfa5a94..df755975e 100644
+--- a/libdwfl/frame_unwind.c
++++ b/libdwfl/frame_unwind.c
+@@ -523,8 +523,7 @@ new_unwound (Dwfl_Frame *state)
+ state->unwound = unwound;
+ unwound->thread = thread;
+ unwound->unwound = NULL;
+- unwound->signal_frame = false;
+- unwound->initial_frame = false;
++ unwound->isactivation = false;
+ unwound->pc_state = DWFL_FRAME_STATE_ERROR;
+ memset (unwound->regs_set, 0, sizeof (unwound->regs_set));
+ return unwound;
+@@ -552,7 +551,11 @@ handle_cfi (Dwfl_Frame *state, Dwarf_Addr pc, Dwarf_CFI *cfi, Dwarf_Addr bias)
+ return;
+ }
+
+- unwound->signal_frame = frame->fde->cie->signal_frame;
++ if (frame->fde->cie->signal_frame)
++ {
++ state->isactivation = true;
++ unwound->isactivation = true;
++ }
+ Dwfl_Thread *thread = state->thread;
+ Dwfl_Process *process = thread->process;
+ Ebl *ebl = process->ebl;
+@@ -715,14 +718,11 @@ __libdwfl_frame_unwind (Dwfl_Frame *state)
+ {
+ if (state->unwound)
+ return;
+- /* Do not ask dwfl_frame_pc for ISACTIVATION, it would try to unwind STATE
+- which would deadlock us. */
+ Dwarf_Addr pc;
+- bool ok = INTUSE(dwfl_frame_pc) (state, &pc, NULL);
++ bool isactivation;
++ bool ok = INTUSE(dwfl_frame_pc) (state, &pc, &isactivation);
+ assert (ok);
+- /* Check whether this is the initial frame or a signal frame.
+- Then we need to unwind from the original, unadjusted PC. */
+- if (! state->initial_frame && ! state->signal_frame)
++ if (! isactivation)
+ pc--;
+ Dwfl_Module *mod = INTUSE(dwfl_addrmodule) (state->thread->process->dwfl, pc);
+ if (mod == NULL)
+@@ -755,7 +755,6 @@ __libdwfl_frame_unwind (Dwfl_Frame *state)
+ return;
+ }
+ state->unwound->pc_state = DWFL_FRAME_STATE_PC_UNDEFINED;
+- // &Dwfl_Frame.signal_frame cannot be passed as it is a bitfield.
+ bool signal_frame = false;
+ if (! ebl_unwind (ebl, pc, setfunc, getfunc, readfunc, state, &signal_frame))
+ {
+@@ -768,5 +767,9 @@ __libdwfl_frame_unwind (Dwfl_Frame *state)
+ return;
+ }
+ assert (state->unwound->pc_state == DWFL_FRAME_STATE_PC_SET);
+- state->unwound->signal_frame = signal_frame;
++ if (signal_frame)
++ {
++ state->isactivation = true;
++ state->unwound->isactivation = true;
++ }
+ }
+diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h
+index 25753de2f..332349d32 100644
+--- a/libdwfl/libdwflP.h
++++ b/libdwfl/libdwflP.h
+@@ -251,8 +251,7 @@ struct Dwfl_Frame
+ Dwfl_Thread *thread;
+ /* Previous (outer) frame. */
+ Dwfl_Frame *unwound;
+- bool signal_frame : 1;
+- bool initial_frame : 1;
++ bool isactivation;
+ enum
+ {
+ /* This structure is still being initialized or there was an error
+commit 148c39884329b1279c2fc4c63500f95b95205651
Author: Omar Sandoval
Date: Wed Sep 4 17:13:40 2019 -0700
@@ -695,7 +934,7 @@ index f4052125b..1beb661eb 100644
modules = i386 sh x86_64 ia64 alpha arm aarch64 sparc ppc ppc64 s390 \
tilegx m68k bpf riscv csky
diff --git a/configure.ac b/configure.ac
-index f4c5c603f..31d3b6605 100644
+index 12ee2f97c..d68d1a1eb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -70,6 +70,11 @@ AC_ARG_ENABLE([programs],
@@ -711,7 +950,7 @@ index f4c5c603f..31d3b6605 100644
[AS_HELP_STRING([--enable-deterministic-archives],
[ar and ranlib default to -D behavior])], [
diff --git a/debuginfod/Makefile.am b/debuginfod/Makefile.am
-index f4756c92f..dcae77d07 100644
+index e62e8d14b..a811e2dd1 100644
--- a/debuginfod/Makefile.am
+++ b/debuginfod/Makefile.am
@@ -86,16 +86,20 @@ libdebuginfod.so$(EXEEXT): $(srcdir)/libdebuginfod.map $(libdebuginfod_so_LIBS)
@@ -900,7 +1139,7 @@ index d5d63f733..94e6e38f6 100644
EXTRA_DIST = libelf.map
-commit 844aa1ab3265e5072ab2cc31562946d4da2f9d60
+commit 5ac48d7d9fc93c792e5bb45f91ea2f6f7190617c
Author: Omar Sandoval
Date: Wed Sep 4 17:13:23 2019 -0700
@@ -928,7 +1167,7 @@ index bd8926b52..0b13c717f 100644
if DEBUGINFOD
SUBDIRS += debuginfod
diff --git a/configure.ac b/configure.ac
-index 14ad66f29..f4c5c603f 100644
+index a39e800f7..12ee2f97c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -65,6 +65,11 @@ AC_CONFIG_FILES([debuginfod/Makefile])
@@ -944,7 +1183,7 @@ index 14ad66f29..f4c5c603f 100644
[AS_HELP_STRING([--enable-deterministic-archives],
[ar and ranlib default to -D behavior])], [
diff --git a/debuginfod/Makefile.am b/debuginfod/Makefile.am
-index 52ead30ae..f4756c92f 100644
+index 51965f65d..e62e8d14b 100644
--- a/debuginfod/Makefile.am
+++ b/debuginfod/Makefile.am
@@ -57,7 +57,9 @@ libeu = ../lib/libeu.a
diff --git a/libdrgn/elfutils/README b/libdrgn/elfutils/README
index 0e15bae6b..06a9fcd0d 100644
--- a/libdrgn/elfutils/README
+++ b/libdrgn/elfutils/README
@@ -24,7 +24,7 @@ elfutils-devel@sourceware.org.
https://sourceware.org/ml/elfutils-devel/
To subscribe send an email to elfutils-devel-subscribe@sourceware.org
-Or use the form at https://sourceware.org/lists.html#ml-requestor
+Or use the form at https://sourceware.org/mailman/listinfo/elfutils-devel
See the CONTRIBUTING file for how to propose patches to the code.
diff --git a/libdrgn/elfutils/config/ChangeLog b/libdrgn/elfutils/config/ChangeLog
index f420dba63..c3b5684af 100644
--- a/libdrgn/elfutils/config/ChangeLog
+++ b/libdrgn/elfutils/config/ChangeLog
@@ -1,3 +1,25 @@
+2020-04-21 Frank Ch. Eigler
+
+ * debuginfod.sysconfig (DEBUGINFOD_PATHS): Add /var/lib/pulp.
+
+2020-03-30 Mark Wielaard
+
+ * upload-release.sh: chmod uploaded dir and files to make them
+ readable.
+
+2020-03-30 Mark Wielaard
+
+ * elfutils.spec.in: Update for 0.179.
+
+2020-03-25 Frank Ch. Eigler
+
+ * elfutils.spec.in: *Require: bsdtar instead of dpkg.
+
+2020-03-04 Mark Wielaard
+
+ * elfutils.spec.in (package debuginfod): Remove Requires: rpm.
+ Add Requires: dpkg.
+
2020-01-12 Frank Ch. Eigler
* elfutils.spec.in: Typo fix for "Requires: debuginfod-client".
diff --git a/libdrgn/elfutils/config/debuginfod.sysconfig b/libdrgn/elfutils/config/debuginfod.sysconfig
index c56bcf3fc..446038742 100644
--- a/libdrgn/elfutils/config/debuginfod.sysconfig
+++ b/libdrgn/elfutils/config/debuginfod.sysconfig
@@ -3,7 +3,7 @@ DEBUGINFOD_PORT="8002"
#DEBUGINFOD_VERBOSE="-v"
# some common places to find trustworthy ELF/DWARF files and RPMs
-DEBUGINFOD_PATHS="-t43200 -F -R /usr/lib/debug /usr/bin /usr/libexec /usr/sbin /usr/lib /usr/lib64 /var/cache/yum /var/cache/dnf"
+DEBUGINFOD_PATHS="-t43200 -F -R /usr/lib/debug /usr/bin /usr/libexec /usr/sbin /usr/lib /usr/lib64 /var/cache/yum /var/cache/dnf /var/lib/pulp"
# prefer reliability/durability over performance
#DEBUGINFOD_PRAGMAS="-D 'pragma synchronous=full;'"
diff --git a/libdrgn/elfutils/config/elfutils.spec.in b/libdrgn/elfutils/config/elfutils.spec.in
index e992812a7..9f614882c 100644
--- a/libdrgn/elfutils/config/elfutils.spec.in
+++ b/libdrgn/elfutils/config/elfutils.spec.in
@@ -35,9 +35,7 @@ BuildRequires: pkgconfig(libarchive) >= 3.1.2
BuildRequires: bzip2
# For the run-debuginfod-find.sh test case in %check for /usr/sbin/ss
BuildRequires: iproute
-%if 0%{?fedora} >= 20
-BuildRequires: dpkg
-%endif
+BuildRequires: bsdtar
BuildRequires: curl
%define _gnu %{nil}
@@ -157,8 +155,8 @@ Requires(post): systemd
Requires(preun): systemd
Requires(postun): systemd
Requires(pre): shadow-utils
-# For /usr/bin/cpio2rpm
-Requires: rpm
+# To extract .deb files with a bsdtar (= libarchive) subshell
+Requires: bsdtar
%description debuginfod-client
The elfutils-debuginfod-client package contains shared libraries
@@ -329,6 +327,31 @@ exit 0
%systemd_postun_with_restart debuginfod.service
%changelog
+* Mon Mar 30 2020 Mark Wielaard 0.179-1
+- debuginfod-client: When DEBUGINFOD_PROGRESS is set and the program
+ doesn't install its own debuginfod_progressfn_t show download
+ progress on stderr.
+ DEBUGINFOD_TIMEOUT is now defined as seconds to get at least 100K,
+ defaults to 90 seconds.
+ Default to $XDG_CACHE_HOME/debuginfod_client.
+ New functions debuginfod_set_user_data, debuginfod_get_user_data,
+ debuginfod_get_url and debuginfod_add_http_header.
+ Support for file:// URLs.
+- debuginfod: Uses libarchive directly for reading rpm archives.
+ Support for indexing .deb/.ddeb archives through dpkg-deb or bsdtar.
+ Generic archive support through -Z EXT[=CMD]. Which can be used for
+ example for arch-linux pacman files by using -Z '.tar.zst=zstdcat'.
+ Better logging using User-Agent and X-Forwarded-For headers.
+ More prometheus metrics.
+ Support for eliding dots or extraneous slashes in path names.
+- debuginfod-find: Accept /path/names in place of buildid hex.
+- libelf: Handle PN_XNUM in elf_getphdrnum before shdr 0 is cached.
+ Ensure zlib resource cleanup on failure.
+- libdwfl: dwfl_linux_kernel_find_elf and dwfl_linux_kernel_report_offline
+ now find and handle a compressed vmlinuz image.
+- readelf, elflint: Handle PT_GNU_PROPERTY.
+- translations: Updated Ukrainian translation.
+
* Tue Nov 26 2019 Mark Wielaard 0.178-1
- debuginfod: New server, client tool and library to index and fetch
ELF/DWARF files addressed by build-id through HTTP.
diff --git a/libdrgn/elfutils/config/upload-release.sh b/libdrgn/elfutils/config/upload-release.sh
index df5e3a073..b52642ea8 100755
--- a/libdrgn/elfutils/config/upload-release.sh
+++ b/libdrgn/elfutils/config/upload-release.sh
@@ -50,6 +50,8 @@ cp -r $VERSION $HOME/elfutils-$VERSION
# Upload
scp -r $VERSION sourceware.org:/sourceware/ftp/pub/elfutils/
ssh sourceware.org "(cd /sourceware/ftp/pub/elfutils \
+ && chmod go+rx $VERSION \
+ && chmod go+r $VERSION/elfutils-$VERSION.tar.bz2* \
&& ln -sf $VERSION/elfutils-$VERSION.tar.bz2 elfutils-latest.tar.bz2 \
&& ln -sf $VERSION/elfutils-$VERSION.tar.bz2.sig elfutils-latest.tar.bz2.sig \
&& ls -lah elfutils-latest*)"
diff --git a/libdrgn/elfutils/configure.ac b/libdrgn/elfutils/configure.ac
index 31d3b6605..d68d1a1eb 100644
--- a/libdrgn/elfutils/configure.ac
+++ b/libdrgn/elfutils/configure.ac
@@ -17,7 +17,7 @@ dnl GNU General Public License for more details.
dnl
dnl You should have received a copy of the GNU General Public License
dnl along with this program. If not, see .
-AC_INIT([elfutils],[0.178],[https://sourceware.org/bugzilla],[elfutils],[http://elfutils.org/])
+AC_INIT([elfutils],[0.179],[https://sourceware.org/bugzilla],[elfutils],[http://elfutils.org/])
dnl Workaround for older autoconf < 2.64
m4_ifndef([AC_PACKAGE_URL],
diff --git a/libdrgn/elfutils/debuginfod/ChangeLog b/libdrgn/elfutils/debuginfod/ChangeLog
index b297a3749..bc3bce32f 100644
--- a/libdrgn/elfutils/debuginfod/ChangeLog
+++ b/libdrgn/elfutils/debuginfod/ChangeLog
@@ -1,3 +1,144 @@
+2020-03-29 Mark Wielaard
+
+ * debuginfod-client.c (debuginfod_add_http_header): Check header
+ contains precisely one colon that isn't the first or last char.
+
+2020-03-29 Frank Ch. Eigler
+
+ * debuginfod-client.c (struct debuginfod_client): Add a flag field
+ for progressfn printing.
+ (default_progressfn): Set it if printing \rsomething.
+ (debuginfod_end): Terminate with \n if flag set, i.e., only if the
+ default_progressfn was actually called.
+
+2020-03-27 Mark Wielaard
+
+ * debuginfod.cxx (parse_opt): Check port is not zero.
+
+2020-03-28 Frank Ch. Eigler
+
+ * debuginfod.cxx (handle_buildid_r_match): During archive
+ extraction / fdcache prefetching, set the mtime of each
+ file in the cache.
+
+2020-03-27 Frank Ch. Eigler
+
+ * debuginfod-find.c (main): Extract buildid from /binary/ if
+ given instead of hex string.
+ * Makefile.am: Add elfutils library prereqs for debuginfod-find.
+
+2020-03-24 Frank Ch. Eigler
+
+ * debuginfod.h, libdebuginfod.map: New functions for _add_url_header.
+ * debuginfod-client.c (struct debuginfod_client): Add headers fields.
+ (debuginfod_add_http_header): New client api to add outgoing headers.
+ (add_default_headers): Renamed from add_extra_headers, skip if flag.
+ (debuginfod_query_server): Pass accumulated headers to libcurl.
+ (debuginfod_end): Clean accumulated headers.
+ (debuginfod_find_*): Add default headers at this point.
+ * debuginfod.cxx (handle_buildid): Add conn pointer. Use it to relay
+ incoming UA and XFF headers to federated upstream debuginfods.
+
+2020-03-26 Frank Ch. Eigler
+
+ * debuginfod.cxx (handler_cb): Export two families of metrics for
+ prometheus traffic analysis: response times and data amounts.
+
+2020-03-26 Frank Ch. Eigler
+
+ * debuginfod.cxx (parse_opt): For -U, prefer dpkg-deb
+ after all if access(3)-able, fallback to bsdtar.
+
+2020-03-25 Frank Ch. Eigler
+
+ * debuginfod.cxx (parse_opt): Associate a bsdtar subshell with
+ the .deb & .ddeb extensions, instead of dpkg-deb.
+
+2020-03-26 Frank Ch. Eigler
+
+ * debuginfod-client.c (debuginfod_query_server): Don't
+ set CURLOPT_PATH_AS_IS on old curl. Mostly harmless.
+
+2020-03-24 Frank Ch. Eigler
+
+ * debuginfod-client.c (debuginfod_query_server): Set
+ CURLOPT_PATH_AS_IS, to propagate file names verbatim.
+ * debuginfod.cxx (canon_pathname): Implement RFC3986
+ style pathname canonicalization.
+ (handle_buildid): Canonicalize incoming webapi source
+ paths, accept either one.
+ (scan_source_file, archive_classify): Store both
+ original and canonicalized dwarf-source file names.
+
+2020-03-24 Frank Ch. Eigler
+
+ * debuginfod.cxx (handle_buildid): In case of federated fallback
+ queries, handle errors analogously to local ENOENT/404.
+ (handle_metrics): Return a size-of-response value.
+ (handler_cb): Add code to time entire application-side processing
+ stage + response sizes + http codes, so as to emit a complete
+ httpd-flavoured log line for each webapi request.
+
+2020-03-24 Frank Ch. Eigler
+
+ * debuginfod-client.c (debuginfod_query_server): Print the
+ default_progressfn terminating \n message only if that progressfn
+ is actually set.
+
+2020-03-24 Frank Ch. Eigler
+
+ * debuginfod-find.c (main): Correct /source full-pathness check for
+ "debuginfod-find -v source deadbeef /pathname" case.
+
+2020-03-22 Frank Ch. Eigler
+
+ * debuginfod-client.c (struct debuginfod_client): Add url field.
+ (struct handle_data): Add client field as backpointer.
+ (debuginfod_write_callback): Compute & save URL.
+ (default_progressfn): Print front pieces of the URL.
+ (debuginfod_query_server): Clear URL and cleanup after progressfn.
+ * debuginfod-find.c (main): Print URL at transfer conclusion.
+
+2020-03-22 Frank Ch. Eigler
+
+ * debuginfod.h, libdebuginfod.map: New functions for _get/set_user().
+ * debuginfod-client.c: Implement them.
+ * debuginfod-find.c: Include a token call just for testing them.
+
+2020-03-03 Aaron Merey
+
+ * debuginfod-client.c (debuginfod_query_server): Update
+ cache_path even when new default path already exists.
+
+2020-02-27 Aaron Merey
+
+ * debuginfod-client.c (xalloc_str): New macro. Call
+ asprintf with error checking.
+ (debuginfod_query_server): Use XDG_CACHE_HOME as a default
+ cache location if it is set. Replace snprintf with xalloc_str.
+
+2020-02-26 Konrad Kleine
+
+ * debuginfod-client.c (debuginfod_query_server): Handle curl's
+ response code correctly when DEBUGINFOD_URLS begin with file://
+
+2020-02-25 Frank Ch. Eigler
+
+ * debuginfod.cxx (parse_opt): Treat -R as if -Z.rpm .
+
+2020-02-25 Frank Ch. Eigler
+
+ * debuginfod.cxx (fdcache_prefetch): New parameter.
+ (parse_opt): Parse it.
+ (main): Default it.
+ (fdcache::fd_size_mb): Change to double for accuracy.
+ (fdcache::probe): New function.
+ (fdcache::intern): New option to intern at end of LRU.
+ (fdcache::lookup): Clean fdcache.
+ (handle_buildid_r_match): Implement multi-stage archive
+ parsing, with optional prefetching of extracted contents
+ into the fdcache.
+
2020-02-19 Aaron Merey
* debuginfod-client.c (debuginfod_clean_cache): Restrict
diff --git a/libdrgn/elfutils/debuginfod/Makefile.am b/libdrgn/elfutils/debuginfod/Makefile.am
index dcae77d07..a811e2dd1 100644
--- a/libdrgn/elfutils/debuginfod/Makefile.am
+++ b/libdrgn/elfutils/debuginfod/Makefile.am
@@ -64,7 +64,7 @@ debuginfod_SOURCES = debuginfod.cxx
debuginfod_LDADD = $(libdw) $(libelf) $(libeu) $(libdebuginfod) $(libmicrohttpd_LIBS) $(libcurl_LIBS) $(sqlite3_LIBS) $(libarchive_LIBS) -lpthread -ldl
debuginfod_find_SOURCES = debuginfod-find.c
-debuginfod_find_LDADD = $(libeu) $(libdebuginfod)
+debuginfod_find_LDADD = $(libdw) $(libelf) $(libeu) $(libdebuginfod)
noinst_LIBRARIES = libdebuginfod.a
noinst_LIBRARIES += libdebuginfod_pic.a
diff --git a/libdrgn/elfutils/debuginfod/debuginfod-client.c b/libdrgn/elfutils/debuginfod/debuginfod-client.c
index 186aa90a5..a7dfbfb18 100644
--- a/libdrgn/elfutils/debuginfod/debuginfod-client.c
+++ b/libdrgn/elfutils/debuginfod/debuginfod-client.c
@@ -79,6 +79,20 @@ struct debuginfod_client
/* Progress/interrupt callback function. */
debuginfod_progressfn_t progressfn;
+ /* Stores user data. */
+ void* user_data;
+
+ /* Stores current/last url, if any. */
+ char* url;
+
+ /* Accumulates outgoing http header names/values. */
+ int user_agent_set_p; /* affects add_default_headers */
+ struct curl_slist *headers;
+
+ /* Flags the default_progressfn having printed something that
+ debuginfod_end needs to terminate. */
+ int default_progressfn_printed_p;
+
/* Can contain all other context, like cache_path, server_urls,
timeout or other info gotten from environment variables, the
handle data, etc. So those don't have to be reparsed and
@@ -99,6 +113,7 @@ static const time_t cache_default_max_unused_age_s = 604800; /* 1 week */
/* Location of the cache of files downloaded from debuginfods.
The default parent directory is $HOME, or '/' if $HOME doesn't exist. */
static const char *cache_default_name = ".debuginfod_client_cache";
+static const char *cache_xdg_name = "debuginfod_client";
static const char *cache_path_envvar = DEBUGINFOD_CACHE_PATH_ENV_VAR;
/* URLs of debuginfods, separated by url_delim. */
@@ -124,6 +139,9 @@ struct handle_data
/* This handle. */
CURL *handle;
+ /* The client object whom we're serving. */
+ debuginfod_client *client;
+
/* Pointer to handle that should write to fd. Initially points to NULL,
then points to the first handle that begins writing the target file
to the cache. Used to ensure that a file is not downloaded from
@@ -140,7 +158,17 @@ debuginfod_write_callback (char *ptr, size_t size, size_t nmemb, void *data)
/* Indicate to other handles that they can abort their transfer. */
if (*d->target_handle == NULL)
- *d->target_handle = d->handle;
+ {
+ *d->target_handle = d->handle;
+ /* update the client object */
+ const char *url = NULL;
+ (void) curl_easy_getinfo (d->handle, CURLINFO_EFFECTIVE_URL, &url);
+ if (url)
+ {
+ free (d->client->url);
+ d->client->url = strdup(url); /* ok if fails */
+ }
+ }
/* If this handle isn't the target handle, abort transfer. */
if (*d->target_handle != d->handle)
@@ -291,8 +319,11 @@ debuginfod_clean_cache(debuginfod_client *c,
static void
-add_extra_headers(CURL *handle)
+add_default_headers(debuginfod_client *client)
{
+ if (client->user_agent_set_p)
+ return;
+
/* Compute a User-Agent: string to send. The more accurately this
describes this host, the likelier that the debuginfod servers
might be able to locate debuginfo for us. */
@@ -352,7 +383,7 @@ add_extra_headers(CURL *handle)
}
char *ua = NULL;
- rc = asprintf(& ua, "%s/%s,%s,%s/%s",
+ rc = asprintf(& ua, "User-Agent: %s/%s,%s,%s/%s",
PACKAGE_NAME, PACKAGE_VERSION,
utspart ?: "",
id ?: "",
@@ -361,7 +392,7 @@ add_extra_headers(CURL *handle)
ua = NULL;
if (ua)
- curl_easy_setopt(handle, CURLOPT_USERAGENT, (void*) ua); /* implicit strdup */
+ (void) debuginfod_add_http_header (client, ua);
free (ua);
free (id);
@@ -370,6 +401,52 @@ add_extra_headers(CURL *handle)
}
+#define xalloc_str(p, fmt, args...) \
+ do \
+ { \
+ if (asprintf (&p, fmt, args) < 0) \
+ { \
+ p = NULL; \
+ rc = -ENOMEM; \
+ goto out; \
+ } \
+ } while (0)
+
+
+/* Offer a basic form of progress tracing */
+static int
+default_progressfn (debuginfod_client *c, long a, long b)
+{
+ const char* url = debuginfod_get_url (c);
+ int len = 0;
+
+ /* We prefer to print the host part of the URL to keep the
+ message short. */
+ if (url != NULL)
+ {
+ const char* buildid = strstr(url, "buildid/");
+ if (buildid != NULL)
+ len = (buildid - url);
+ else
+ len = strlen(url);
+ }
+
+ if (b == 0 || url==NULL) /* early stage */
+ dprintf(STDERR_FILENO,
+ "\rDownloading %c", "-/|\\"[a % 4]);
+ else if (b < 0) /* download in progress but unknown total length */
+ dprintf(STDERR_FILENO,
+ "\rDownloading from %.*s %ld",
+ len, url, a);
+ else /* download in progress, and known total length */
+ dprintf(STDERR_FILENO,
+ "\rDownloading from %.*s %ld/%ld",
+ len, url, a, b);
+ c->default_progressfn_printed_p = 1;
+
+ return 0;
+}
+
/* Query each of the server URLs found in $DEBUGINFOD_URLS for the file
with the specified build-id, type (debuginfo, executable or source)
@@ -384,18 +461,24 @@ debuginfod_query_server (debuginfod_client *c,
const char *filename,
char **path)
{
- char *urls_envvar;
char *server_urls;
- char cache_path[PATH_MAX];
- char maxage_path[PATH_MAX*3]; /* These *3 multipliers are to shut up gcc -Wformat-truncation */
- char interval_path[PATH_MAX*4];
- char target_cache_dir[PATH_MAX*2];
- char target_cache_path[PATH_MAX*4];
- char target_cache_tmppath[PATH_MAX*5];
- char suffix[PATH_MAX*2];
+ char *urls_envvar;
+ char *cache_path = NULL;
+ char *maxage_path = NULL;
+ char *interval_path = NULL;
+ char *target_cache_dir = NULL;
+ char *target_cache_path = NULL;
+ char *target_cache_tmppath = NULL;
+ char suffix[PATH_MAX];
char build_id_bytes[MAX_BUILD_ID_BYTES * 2 + 1];
int rc;
+ /* Clear the obsolete URL from a previous _find operation. */
+ free (c->url);
+ c->url = NULL;
+
+ add_default_headers(c);
+
/* Is there any server we can query? If not, don't do any work,
just return with ENOSYS. Don't even access the cache. */
urls_envvar = getenv(server_urls_envvar);
@@ -452,30 +535,74 @@ debuginfod_query_server (debuginfod_client *c,
/* set paths needed to perform the query
example format
- cache_path: $HOME/.debuginfod_cache
- target_cache_dir: $HOME/.debuginfod_cache/0123abcd
- target_cache_path: $HOME/.debuginfod_cache/0123abcd/debuginfo
- target_cache_path: $HOME/.debuginfod_cache/0123abcd/source#PATH#TO#SOURCE ?
+ cache_path: $HOME/.cache
+ target_cache_dir: $HOME/.cache/0123abcd
+ target_cache_path: $HOME/.cache/0123abcd/debuginfo
+ target_cache_path: $HOME/.cache/0123abcd/source#PATH#TO#SOURCE ?
+
+ $XDG_CACHE_HOME takes priority over $HOME/.cache.
+ $DEBUGINFOD_CACHE_PATH takes priority over $HOME/.cache and $XDG_CACHE_HOME.
*/
- if (getenv(cache_path_envvar))
- strcpy(cache_path, getenv(cache_path_envvar));
+ /* Determine location of the cache. The path specified by the debuginfod
+ cache environment variable takes priority. */
+ char *cache_var = getenv(cache_path_envvar);
+ if (cache_var != NULL && strlen (cache_var) > 0)
+ xalloc_str (cache_path, "%s", cache_var);
else
{
- if (getenv("HOME"))
- sprintf(cache_path, "%s/%s", getenv("HOME"), cache_default_name);
- else
- sprintf(cache_path, "/%s", cache_default_name);
+ /* If a cache already exists in $HOME ('/' if $HOME isn't set), then use
+ that. Otherwise use the XDG cache directory naming format. */
+ xalloc_str (cache_path, "%s/%s", getenv ("HOME") ?: "/", cache_default_name);
+
+ struct stat st;
+ if (stat (cache_path, &st) < 0)
+ {
+ char cachedir[PATH_MAX];
+ char *xdg = getenv ("XDG_CACHE_HOME");
+
+ if (xdg != NULL && strlen (xdg) > 0)
+ snprintf (cachedir, PATH_MAX, "%s", xdg);
+ else
+ snprintf (cachedir, PATH_MAX, "%s/.cache", getenv ("HOME") ?: "/");
+
+ /* Create XDG cache directory if it doesn't exist. */
+ if (stat (cachedir, &st) == 0)
+ {
+ if (! S_ISDIR (st.st_mode))
+ {
+ rc = -EEXIST;
+ goto out;
+ }
+ }
+ else
+ {
+ rc = mkdir (cachedir, 0700);
+
+ /* Also check for EEXIST and S_ISDIR in case another client just
+ happened to create the cache. */
+ if (rc < 0
+ && (errno != EEXIST
+ || stat (cachedir, &st) != 0
+ || ! S_ISDIR (st.st_mode)))
+ {
+ rc = -errno;
+ goto out;
+ }
+ }
+
+ free (cache_path);
+ xalloc_str (cache_path, "%s/%s", cachedir, cache_xdg_name);
+ }
}
- /* avoid using snprintf here due to compiler warning. */
- snprintf(target_cache_dir, sizeof(target_cache_dir), "%s/%s", cache_path, build_id_bytes);
- snprintf(target_cache_path, sizeof(target_cache_path), "%s/%s%s", target_cache_dir, type, suffix);
- snprintf(target_cache_tmppath, sizeof(target_cache_tmppath), "%s.XXXXXX", target_cache_path);
+ xalloc_str (target_cache_dir, "%s/%s", cache_path, build_id_bytes);
+ xalloc_str (target_cache_path, "%s/%s%s", target_cache_dir, type, suffix);
+ xalloc_str (target_cache_tmppath, "%s.XXXXXX", target_cache_path);
/* XXX combine these */
- snprintf(interval_path, sizeof(interval_path), "%s/%s", cache_path, cache_clean_interval_filename);
- snprintf(maxage_path, sizeof(maxage_path), "%s/%s", cache_path, cache_max_unused_age_filename);
+ xalloc_str (interval_path, "%s/%s", cache_path, cache_clean_interval_filename);
+ xalloc_str (maxage_path, "%s/%s", cache_path, cache_max_unused_age_filename);
rc = debuginfod_init_cache(cache_path, interval_path, maxage_path);
if (rc != 0)
goto out;
@@ -490,7 +617,8 @@ debuginfod_query_server (debuginfod_client *c,
/* Success!!!! */
if (path != NULL)
*path = strdup(target_cache_path);
- return fd;
+ rc = fd;
+ goto out;
}
long timeout = default_timeout;
@@ -561,6 +689,7 @@ debuginfod_query_server (debuginfod_client *c,
data[i].fd = fd;
data[i].target_handle = &target_handle;
data[i].handle = curl_easy_init();
+ data[i].client = c;
if (data[i].handle == NULL)
{
@@ -601,9 +730,15 @@ debuginfod_query_server (debuginfod_client *c,
curl_easy_setopt(data[i].handle, CURLOPT_FOLLOWLOCATION, (long) 1);
curl_easy_setopt(data[i].handle, CURLOPT_FAILONERROR, (long) 1);
curl_easy_setopt(data[i].handle, CURLOPT_NOSIGNAL, (long) 1);
+#if LIBCURL_VERSION_NUM >= 0x072a00 /* 7.42.0 */
+ curl_easy_setopt(data[i].handle, CURLOPT_PATH_AS_IS, (long) 1);
+#else
+ /* On old curl; no big deal, canonicalization here is almost the
+ same, except perhaps for ? # type decorations at the tail. */
+#endif
curl_easy_setopt(data[i].handle, CURLOPT_AUTOREFERER, (long) 1);
curl_easy_setopt(data[i].handle, CURLOPT_ACCEPT_ENCODING, "");
- add_extra_headers(data[i].handle);
+ curl_easy_setopt(data[i].handle, CURLOPT_HTTPHEADER, c->headers);
curl_multi_add_handle(curlm, data[i].handle);
server_url = strtok_r(NULL, url_delim, &strtok_saveptr);
@@ -716,20 +851,34 @@ debuginfod_query_server (debuginfod_client *c,
else
{
/* Query completed without an error. Confirm that the
- response code is 200 and set verified_handle. */
- long resp_code = 500;
- CURLcode curl_res;
-
- curl_res = curl_easy_getinfo(target_handle,
- CURLINFO_RESPONSE_CODE,
- &resp_code);
+ response code is 200 when using HTTP/HTTPS and 0 when
+ using file:// and set verified_handle. */
- if (curl_res == CURLE_OK
- && resp_code == 200
- && msg->easy_handle != NULL)
+ if (msg->easy_handle != NULL)
{
- verified_handle = msg->easy_handle;
- break;
+ char *effective_url = NULL;
+ long resp_code = 500;
+ CURLcode ok1 = curl_easy_getinfo (target_handle,
+ CURLINFO_EFFECTIVE_URL,
+ &effective_url);
+ CURLcode ok2 = curl_easy_getinfo (target_handle,
+ CURLINFO_RESPONSE_CODE,
+ &resp_code);
+ if(ok1 == CURLE_OK && ok2 == CURLE_OK && effective_url)
+ {
+ if (strncmp (effective_url, "http", 4) == 0)
+ if (resp_code == 200)
+ {
+ verified_handle = msg->easy_handle;
+ break;
+ }
+ if (strncmp (effective_url, "file", 4) == 0)
+ if (resp_code == 0)
+ {
+ verified_handle = msg->easy_handle;
+ break;
+ }
+ }
}
}
}
@@ -765,12 +914,14 @@ debuginfod_query_server (debuginfod_client *c,
curl_multi_cleanup (curlm);
free (data);
free (server_urls);
+
/* don't close fd - we're returning it */
/* don't unlink the tmppath; it's already been renamed. */
if (path != NULL)
*path = strdup(target_cache_path);
- return fd;
+ rc = fd;
+ goto out;
/* error exits */
out1:
@@ -786,25 +937,25 @@ debuginfod_query_server (debuginfod_client *c,
out0:
free (server_urls);
+/* general purpose exit */
out:
+ /* Conclude the last \r status line */
+ /* Another possibility is to use the ANSI CSI n K EL "Erase in Line"
+ code. That way, the previously printed messages would be erased,
+ and without a newline. */
+ if (c->default_progressfn_printed_p)
+ dprintf(STDERR_FILENO, "\n");
+
+ free (cache_path);
+ free (maxage_path);
+ free (interval_path);
+ free (target_cache_dir);
+ free (target_cache_path);
+ free (target_cache_tmppath);
return rc;
}
-/* Activate a basic form of progress tracing */
-static int
-default_progressfn (debuginfod_client *c, long a, long b)
-{
- (void) c;
-
- dprintf(STDERR_FILENO,
- "Downloading from debuginfod %ld/%ld%s", a, b,
- ((a == b) ? "\n" : "\r"));
- /* XXX: include URL - stateful */
-
- return 0;
-}
-
/* See debuginfod.h */
debuginfod_client *
@@ -812,20 +963,42 @@ debuginfod_begin (void)
{
debuginfod_client *client;
size_t size = sizeof (struct debuginfod_client);
- client = (debuginfod_client *) malloc (size);
+ client = (debuginfod_client *) calloc (1, size);
if (client != NULL)
{
if (getenv(DEBUGINFOD_PROGRESS_ENV_VAR))
client->progressfn = default_progressfn;
- else
- client->progressfn = NULL;
}
return client;
}
+void
+debuginfod_set_user_data(debuginfod_client *client,
+ void *data)
+{
+ client->user_data = data;
+}
+
+void *
+debuginfod_get_user_data(debuginfod_client *client)
+{
+ return client->user_data;
+}
+
+const char *
+debuginfod_get_url(debuginfod_client *client)
+{
+ return client->url;
+}
+
void
debuginfod_end (debuginfod_client *client)
{
+ if (client == NULL)
+ return;
+
+ curl_slist_free_all (client->headers);
+ free (client->url);
free (client);
}
@@ -859,6 +1032,33 @@ int debuginfod_find_source(debuginfod_client *client,
}
+/* Add an outgoing HTTP header. */
+int debuginfod_add_http_header (debuginfod_client *client, const char* header)
+{
+ /* Sanity check header value is of the form Header: Value.
+ It should contain exactly one colon that isn't the first or
+ last character. */
+ char *colon = strchr (header, ':');
+ if (colon == NULL
+ || colon == header
+ || *(colon + 1) == '\0'
+ || strchr (colon + 1, ':') != NULL)
+ return -EINVAL;
+
+ struct curl_slist *temp = curl_slist_append (client->headers, header);
+ if (temp == NULL)
+ return -ENOMEM;
+
+ /* Track if User-Agent: is being set. If so, signal not to add the
+ default one. */
+ if (strncmp (header, "User-Agent:", 11) == 0)
+ client->user_agent_set_p = 1;
+
+ client->headers = temp;
+ return 0;
+}
+
+
void
debuginfod_set_progressfn(debuginfod_client *client,
debuginfod_progressfn_t fn)
diff --git a/libdrgn/elfutils/debuginfod/debuginfod-find.c b/libdrgn/elfutils/debuginfod/debuginfod-find.c
index 8bd3a3dba..83a43ce4b 100644
--- a/libdrgn/elfutils/debuginfod/debuginfod-find.c
+++ b/libdrgn/elfutils/debuginfod/debuginfod-find.c
@@ -1,6 +1,6 @@
/* Command-line frontend for retrieving ELF / DWARF / source files
from the debuginfod.
- Copyright (C) 2019 Red Hat, Inc.
+ Copyright (C) 2019-2020 Red Hat, Inc.
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
@@ -25,6 +25,10 @@
#include
#include
#include
+#include
+#include
+#include
+#include
/* Name and version of program. */
@@ -39,8 +43,12 @@ static const char doc[] = N_("Request debuginfo-related content "
/* Strings for arguments in help texts. */
static const char args_doc[] = N_("debuginfo BUILDID\n"
+ "debuginfo PATH\n"
"executable BUILDID\n"
- "source BUILDID /FILENAME");
+ "executable PATH\n"
+ "source BUILDID /FILENAME\n"
+ "source PATH /FILENAME\n");
+
/* Definitions of arguments for argp functions. */
static const struct argp_option options[] =
@@ -51,6 +59,7 @@ static const struct argp_option options[] =
/* debuginfod connection handle. */
static debuginfod_client *client;
+static int verbose;
int progressfn(debuginfod_client *c __attribute__((__unused__)),
long a, long b)
@@ -66,7 +75,8 @@ static error_t parse_opt (int key, char *arg, struct argp_state *state)
(void) state;
switch (key)
{
- case 'v': debuginfod_set_progressfn (client, & progressfn); break;
+ case 'v': verbose++;
+ debuginfod_set_progressfn (client, & progressfn); break;
default: return ARGP_ERR_UNKNOWN;
}
return 0;
@@ -84,6 +94,8 @@ static struct argp argp =
int
main(int argc, char** argv)
{
+ elf_version (EV_CURRENT);
+
client = debuginfod_begin ();
if (client == NULL)
{
@@ -91,6 +103,9 @@ main(int argc, char** argv)
return 1;
}
+ /* Exercise user data pointer, to support testing only. */
+ debuginfod_set_user_data (client, (void *)"Progress");
+
int remaining;
(void) argp_parse (&argp, argc, argv, ARGP_IN_ORDER|ARGP_NO_ARGS, &remaining, NULL);
@@ -100,29 +115,72 @@ main(int argc, char** argv)
return 1;
}
- int rc;
+ /* If we were passed an ELF file name in the BUILDID slot, look in there. */
+ unsigned char* build_id = (unsigned char*) argv[remaining+1];
+ int build_id_len = 0; /* assume text */
+
+ int any_non_hex = 0;
+ int i;
+ for (i = 0; build_id[i] != '\0'; i++)
+ if ((build_id[i] >= '0' && build_id[i] <= '9') ||
+ (build_id[i] >= 'a' && build_id[i] <= 'f'))
+ ;
+ else
+ any_non_hex = 1;
+
+ int fd = -1;
+ Elf* elf = NULL;
+ if (any_non_hex) /* raw build-id */
+ {
+ fd = open ((char*) build_id, O_RDONLY);
+ if (fd < 0)
+ fprintf (stderr, "Cannot open %s: %s\n", build_id, strerror(errno));
+ }
+ if (fd >= 0)
+ {
+ elf = elf_begin (fd, ELF_C_READ_MMAP_PRIVATE, NULL);
+ if (elf == NULL)
+ fprintf (stderr, "Cannot elf_begin %s: %s\n", build_id, elf_errmsg(-1));
+ }
+ if (elf != NULL)
+ {
+ const void *extracted_build_id;
+ ssize_t s = dwelf_elf_gnu_build_id(elf, &extracted_build_id);
+ if (s > 0)
+ {
+ /* Success: replace the build_id pointer/len with the binary blob
+ that elfutils is keeping for us. It'll remain valid until elf_end(). */
+ build_id = (unsigned char*) extracted_build_id;
+ build_id_len = s;
+ }
+ else
+ fprintf (stderr, "Cannot extract build-id from %s: %s\n", build_id, elf_errmsg(-1));
+ }
+
char *cache_name;
+ int rc = 0;
/* Check whether FILETYPE is valid and call the appropriate
debuginfod_find_* function. If FILETYPE is "source"
then ensure a FILENAME was also supplied as an argument. */
if (strcmp(argv[remaining], "debuginfo") == 0)
rc = debuginfod_find_debuginfo(client,
- (unsigned char *)argv[remaining+1], 0,
+ build_id, build_id_len,
&cache_name);
else if (strcmp(argv[remaining], "executable") == 0)
rc = debuginfod_find_executable(client,
- (unsigned char *)argv[remaining+1], 0,
+ build_id, build_id_len,
&cache_name);
else if (strcmp(argv[remaining], "source") == 0)
{
- if (remaining+2 == argc || argv[3][0] != '/')
+ if (remaining+2 == argc || argv[remaining+2][0] != '/')
{
fprintf(stderr, "If FILETYPE is \"source\" then absolute /FILENAME must be given\n");
return 1;
}
- rc = debuginfod_find_source(client, (unsigned char *)argv[remaining+1],
- 0, argv[remaining+2], &cache_name);
+ rc = debuginfod_find_source(client,
+ build_id, build_id_len,
+ argv[remaining+2], &cache_name);
}
else
{
@@ -130,6 +188,19 @@ main(int argc, char** argv)
return 1;
}
+ if (verbose)
+ {
+ const char* url = debuginfod_get_url (client);
+ if (url != NULL)
+ fprintf(stderr, "Downloaded from %s\n", url);
+ }
+
+ debuginfod_end (client);
+ if (elf)
+ elf_end(elf);
+ if (fd >= 0)
+ close (fd);
+
if (rc < 0)
{
fprintf(stderr, "Server query failed: %s\n", strerror(-rc));
@@ -137,9 +208,7 @@ main(int argc, char** argv)
}
printf("%s\n", cache_name);
-
free (cache_name);
- debuginfod_end (client);
return 0;
}
diff --git a/libdrgn/elfutils/debuginfod/debuginfod.cxx b/libdrgn/elfutils/debuginfod/debuginfod.cxx
index 0acd70e4a..76f1fa52c 100644
--- a/libdrgn/elfutils/debuginfod/debuginfod.cxx
+++ b/libdrgn/elfutils/debuginfod/debuginfod.cxx
@@ -355,6 +355,8 @@ static const struct argp_option options[] =
{ "fdcache-fds", ARGP_KEY_FDCACHE_FDS, "NUM", 0, "Maximum number of archive files to keep in fdcache.", 0 },
#define ARGP_KEY_FDCACHE_MBS 0x1002
{ "fdcache-mbs", ARGP_KEY_FDCACHE_MBS, "MB", 0, "Maximum total size of archive file fdcache.", 0 },
+#define ARGP_KEY_FDCACHE_PREFETCH 0x1003
+ { "fdcache-prefetch", ARGP_KEY_FDCACHE_PREFETCH, "NUM", 0, "Number of archive files to prefetch into fdcache.", 0 },
{ NULL, 0, NULL, 0, NULL, 0 }
};
@@ -394,6 +396,7 @@ static regex_t file_exclude_regex;
static bool traverse_logical;
static long fdcache_fds;
static long fdcache_mbs;
+static long fdcache_prefetch;
static string tmpdir;
static void set_metric(const string& key, int64_t value);
@@ -419,15 +422,25 @@ parse_opt (int key, char *arg,
case 'v': verbose ++; break;
case 'd': db_path = string(arg); break;
case 'p': http_port = (unsigned) atoi(arg);
- if (http_port > 65535) argp_failure(state, 1, EINVAL, "port number");
+ if (http_port == 0 || http_port > 65535)
+ argp_failure(state, 1, EINVAL, "port number");
break;
case 'F': scan_files = true; break;
case 'R':
- scan_archives[".rpm"]="rpm2cpio";
+ scan_archives[".rpm"]="cat"; // libarchive groks rpm natively
break;
case 'U':
- scan_archives[".deb"]="dpkg-deb --fsys-tarfile";
- scan_archives[".ddeb"]="dpkg-deb --fsys-tarfile";
+ if (access("/usr/bin/dpkg-deb", X_OK) == 0)
+ {
+ scan_archives[".deb"]="dpkg-deb --fsys-tarfile";
+ scan_archives[".ddeb"]="dpkg-deb --fsys-tarfile";
+ }
+ else
+ {
+ scan_archives[".deb"]="(bsdtar -O -x -f - data.tar.xz)<";
+ scan_archives[".ddeb"]="(bsdtar -O -x -f - data.tar.xz)<";
+ }
+ // .udeb too?
break;
case 'Z':
{
@@ -476,6 +489,9 @@ parse_opt (int key, char *arg,
case ARGP_KEY_FDCACHE_MBS:
fdcache_mbs = atol (arg);
break;
+ case ARGP_KEY_FDCACHE_PREFETCH:
+ fdcache_prefetch = atol (arg);
+ break;
case ARGP_KEY_ARG:
source_paths.insert(string(arg));
break;
@@ -847,6 +863,7 @@ conninfo (struct MHD_Connection * conn)
////////////////////////////////////////////////////////////////////////
+
static void
add_mhd_last_modified (struct MHD_Response *resp, time_t mtime)
{
@@ -938,6 +955,82 @@ shell_escape(const string& str)
}
+// PR25548: Perform POSIX / RFC3986 style path canonicalization on the input string.
+//
+// Namely:
+// // -> /
+// /foo/../ -> /
+// /./ -> /
+//
+// This mapping is done on dwarf-side source path names, which may
+// include these constructs, so we can deal with debuginfod clients
+// that accidentally canonicalize the paths.
+//
+// realpath(3) is close but not quite right, because it also resolves
+// symbolic links. Symlinks at the debuginfod server have nothing to
+// do with the build-time symlinks, thus they must not be considered.
+//
+// see also curl Curl_dedotdotify() aka RFC3986, which we mostly follow here
+// see also libc __realpath()
+// see also llvm llvm::sys::path::remove_dots()
+static string
+canon_pathname (const string& input)
+{
+ string i = input; // 5.2.4 (1)
+ string o;
+
+ while (i.size() != 0)
+ {
+ // 5.2.4 (2) A
+ if (i.substr(0,3) == "../")
+ i = i.substr(3);
+ else if(i.substr(0,2) == "./")
+ i = i.substr(2);
+
+ // 5.2.4 (2) B
+ else if (i.substr(0,3) == "/./")
+ i = i.substr(2);
+ else if (i == "/.")
+ i = ""; // no need to handle "/." complete-path-segment case; we're dealing with file names
+
+ // 5.2.4 (2) C
+ else if (i.substr(0,4) == "/../") {
+ i = i.substr(3);
+ string::size_type sl = o.rfind("/");
+ if (sl != string::npos)
+ o = o.substr(0, sl);
+ else
+ o = "";
+ } else if (i == "/..")
+ i = ""; // no need to handle "/.." complete-path-segment case; we're dealing with file names
+
+ // 5.2.4 (2) D
+ // no need to handle these cases; we're dealing with file names
+ else if (i == ".")
+ i = "";
+ else if (i == "..")
+ i = "";
+
+ // POSIX special: map // to /
+ else if (i.substr(0,2) == "//")
+ i = i.substr(1);
+
+ // 5.2.4 (2) E
+ else {
+ string::size_type next_slash = i.find("/", (i[0]=='/' ? 1 : 0)); // skip first slash
+ o += i.substr(0, next_slash);
+ if (next_slash == string::npos)
+ i = "";
+ else
+ i = i.substr(next_slash);
+ }
+ }
+
+ return o;
+}
+
+
+
// A map-like class that owns a cache of file descriptors (indexed by
// file / content names).
//
@@ -975,14 +1068,14 @@ class libarchive_fdcache
string archive;
string entry;
string fd;
- long fd_size_mb; // rounded up megabytes
+ double fd_size_mb; // slightly rounded up megabytes
};
deque lru; // @head: most recently used
long max_fds;
long max_mbs;
public:
- void intern(const string& a, const string& b, string fd, off_t sz)
+ void intern(const string& a, const string& b, string fd, off_t sz, bool front_p)
{
{
unique_lock lock(fdcache_lock);
@@ -995,31 +1088,56 @@ class libarchive_fdcache
break; // must not continue iterating
}
}
- long mb = ((sz+1023)/1024+1023)/1024;
+ double mb = (sz+65535)/1048576.0; // round up to 64K block
fdcache_entry n = { a, b, fd, mb };
- lru.push_front(n);
+ if (front_p)
+ lru.push_front(n);
+ else
+ lru.push_back(n);
if (verbose > 3)
- obatched(clog) << "fdcache interned a=" << a << " b=" << b << " fd=" << fd << " mb=" << mb << endl;
+ obatched(clog) << "fdcache interned a=" << a << " b=" << b
+ << " fd=" << fd << " mb=" << mb << " front=" << front_p << endl;
}
- this->limit(max_fds, max_mbs); // age cache if required
+ // NB: we age the cache at lookup time too
+ if (front_p)
+ this->limit(max_fds, max_mbs); // age cache if required
}
int lookup(const string& a, const string& b)
+ {
+ int fd = -1;
+ {
+ unique_lock lock(fdcache_lock);
+ for (auto i = lru.begin(); i < lru.end(); i++)
+ {
+ if (i->archive == a && i->entry == b)
+ { // found it; move it to head of lru
+ fdcache_entry n = *i;
+ lru.erase(i); // invalidates i, so no more iteration!
+ lru.push_front(n);
+
+ fd = open(n.fd.c_str(), O_RDONLY); // NB: no problem if dup() fails; looks like cache miss
+ break;
+ }
+ }
+ }
+
+ if (fd >= 0)
+ this->limit(max_fds, max_mbs); // age cache if required
+
+ return fd;
+ }
+
+ int probe(const string& a, const string& b) // just a cache residency check - don't modify LRU state, don't open
{
unique_lock lock(fdcache_lock);
for (auto i = lru.begin(); i < lru.end(); i++)
{
if (i->archive == a && i->entry == b)
- { // found it; move it to head of lru
- fdcache_entry n = *i;
- lru.erase(i); // invalidates i, so no more iteration!
- lru.push_front(n);
-
- return open(n.fd.c_str(), O_RDONLY); // NB: no problem if dup() fails; looks like cache miss
- }
+ return true;
}
- return -1;
+ return false;
}
void clear(const string& a, const string& b)
@@ -1047,7 +1165,7 @@ class libarchive_fdcache
this->max_mbs = maxmbs;
long total_fd = 0;
- long total_mb = 0;
+ double total_mb = 0.0;
for (auto i = lru.begin(); i < lru.end(); i++)
{
// accumulate totals from most recently used one going backward
@@ -1117,6 +1235,7 @@ handle_buildid_r_match (int64_t b_mtime,
return 0;
}
+ // check for a match in the fdcache first
int fd = fdcache.lookup(b_source0, b_source1);
while (fd >= 0) // got one!; NB: this is really an if() with a possible branch out to the end
{
@@ -1152,6 +1271,7 @@ handle_buildid_r_match (int64_t b_mtime,
// NB: see, we never go around the 'loop' more than once
}
+ // no match ... grumble, must process the archive
string archive_decoder = "/dev/null";
string archive_extension = "";
for (auto&& arch : scan_archives)
@@ -1196,8 +1316,19 @@ handle_buildid_r_match (int64_t b_mtime,
if (rc != ARCHIVE_OK)
throw archive_exception(a, "cannot open archive from pipe");
- while(1) // parse cpio archive entries
+ // archive traversal is in three stages, no, four stages:
+ // 1) skip entries whose names do not match the requested one
+ // 2) extract the matching entry name (set r = result)
+ // 3) extract some number of prefetched entries (just into fdcache)
+ // 4) abort any further processing
+ struct MHD_Response* r = 0; // will set in stage 2
+ unsigned prefetch_count = fdcache_prefetch; // will decrement in stage 3
+
+ while(r == 0 || prefetch_count > 0) // stage 1, 2, or 3
{
+ if (interrupted)
+ break;
+
struct archive_entry *e;
rc = archive_read_next_header (a, &e);
if (rc != ARCHIVE_OK)
@@ -1207,7 +1338,10 @@ handle_buildid_r_match (int64_t b_mtime,
continue;
string fn = canonicalized_archive_entry_pathname (e);
- if (fn != b_source1)
+ if ((r == 0) && (fn != b_source1)) // stage 1
+ continue;
+
+ if (fdcache.probe (b_source0, fn)) // skip if already interned
continue;
// extract this file to a temporary file
@@ -1229,18 +1363,39 @@ handle_buildid_r_match (int64_t b_mtime,
throw archive_exception(a, "cannot extract file");
}
+ // Set the mtime so the fdcache file mtimes, even prefetched ones,
+ // propagate to future webapi clients.
+ struct timeval tvs[2];
+ tvs[0].tv_sec = tvs[1].tv_sec = archive_entry_mtime(e);
+ tvs[0].tv_usec = tvs[1].tv_usec = 0;
+ (void) futimes (fd, tvs); /* best effort */
+
+ if (r != 0) // stage 3
+ {
+ // NB: now we know we have a complete reusable file; make fdcache
+ // responsible for unlinking it later.
+ fdcache.intern(b_source0, fn,
+ tmppath, archive_entry_size(e),
+ false); // prefetched ones go to back of lru
+ prefetch_count --;
+ close (fd); // we're not saving this fd to make a mhd-response from!
+ continue;
+ }
+
// NB: now we know we have a complete reusable file; make fdcache
// responsible for unlinking it later.
- fdcache.intern(b_source0, b_source1, tmppath, archive_entry_size(e));
+ fdcache.intern(b_source0, b_source1,
+ tmppath, archive_entry_size(e),
+ true); // requested ones go to the front of lru
inc_metric ("http_responses_total","result",archive_extension + " archive");
- struct MHD_Response* r = MHD_create_response_from_fd (archive_entry_size(e), fd);
+ r = MHD_create_response_from_fd (archive_entry_size(e), fd);
if (r == 0)
{
if (verbose)
obatched(clog) << "cannot create fd-response for " << b_source0 << endl;
close(fd);
- break; // assume no chance of better luck around another iteration
+ break; // assume no chance of better luck around another iteration; no other copies of same file
}
else
{
@@ -1251,12 +1406,12 @@ handle_buildid_r_match (int64_t b_mtime,
/* libmicrohttpd will close it. */
if (result_fd)
*result_fd = fd;
- return r;
+ continue;
}
}
// XXX: rpm/file not found: delete this R entry?
- return 0;
+ return r;
}
@@ -1286,11 +1441,12 @@ debuginfod_find_progress (debuginfod_client *, long a, long b)
}
-static struct MHD_Response* handle_buildid (const string& buildid /* unsafe */,
- const string& artifacttype /* unsafe */,
- const string& suffix /* unsafe */,
- int *result_fd
- )
+static struct MHD_Response*
+handle_buildid (MHD_Connection* conn,
+ const string& buildid /* unsafe */,
+ const string& artifacttype /* unsafe */,
+ const string& suffix /* unsafe */,
+ int *result_fd)
{
// validate artifacttype
string atype_code;
@@ -1332,12 +1488,17 @@ static struct MHD_Response* handle_buildid (const string& buildid /* unsafe */,
}
else if (atype_code == "S")
{
+ // PR25548
+ // Incoming source queries may come in with either dwarf-level OR canonicalized paths.
+ // We let the query pass with either one.
+
pp = new sqlite_ps (db, "mhd-query-s",
- "select mtime, sourcetype, source0, source1 from " BUILDIDS "_query_s where buildid = ? and artifactsrc = ? "
+ "select mtime, sourcetype, source0, source1 from " BUILDIDS "_query_s where buildid = ? and artifactsrc in (?,?) "
"order by sharedprefix(source0,source0ref) desc, mtime desc");
pp->reset();
pp->bind(1, buildid);
pp->bind(2, suffix);
+ pp->bind(3, canon_pathname(suffix));
}
unique_ptr ps_closer(pp); // release pp if exception or return
@@ -1374,6 +1535,35 @@ static struct MHD_Response* handle_buildid (const string& buildid /* unsafe */,
{
debuginfod_set_progressfn (client, & debuginfod_find_progress);
+ if (conn)
+ {
+ // Transcribe incoming User-Agent:
+ string ua = MHD_lookup_connection_value (conn, MHD_HEADER_KIND, "User-Agent") ?: "";
+ string ua_complete = string("User-Agent: ") + ua;
+ debuginfod_add_http_header (client, ua_complete.c_str());
+
+ // Compute larger XFF:, for avoiding info loss during
+ // federation, and for future cyclicity detection.
+ string xff = MHD_lookup_connection_value (conn, MHD_HEADER_KIND, "X-Forwarded-For") ?: "";
+ if (xff != "")
+ xff += string(", "); // comma separated list
+
+ // Compute the client's numeric IP address only - so can't merge with conninfo()
+ const union MHD_ConnectionInfo *u = MHD_get_connection_info (conn,
+ MHD_CONNECTION_INFO_CLIENT_ADDRESS);
+ struct sockaddr *so = u ? u->client_addr : 0;
+ char hostname[256] = ""; // RFC1035
+ if (so && so->sa_family == AF_INET)
+ (void) getnameinfo (so, sizeof (struct sockaddr_in), hostname, sizeof (hostname), NULL, 0,
+ NI_NUMERICHOST);
+ else if (so && so->sa_family == AF_INET6)
+ (void) getnameinfo (so, sizeof (struct sockaddr_in6), hostname, sizeof (hostname), NULL, 0,
+ NI_NUMERICHOST);
+
+ string xff_complete = string("X-Forwarded-For: ")+xff+string(hostname);
+ debuginfod_add_http_header (client, xff_complete.c_str());
+ }
+
if (artifacttype == "debuginfo")
fd = debuginfod_find_debuginfo (client,
(const unsigned char*) buildid.c_str(),
@@ -1412,8 +1602,16 @@ static struct MHD_Response* handle_buildid (const string& buildid /* unsafe */,
}
close (fd);
}
- else if (fd != -ENOSYS) // no DEBUGINFOD_URLS configured
- throw libc_exception(-fd, "upstream debuginfod query failed");
+ else
+ switch(fd)
+ {
+ case -ENOSYS:
+ break;
+ case -ENOENT:
+ break;
+ default: // some more tricky error
+ throw libc_exception(-fd, "upstream debuginfod query failed");
+ }
throw reportable_exception(MHD_HTTP_NOT_FOUND, "not found");
}
@@ -1503,7 +1701,7 @@ add_metric(const string& metric,
static struct MHD_Response*
-handle_metrics ()
+handle_metrics (off_t* size)
{
stringstream o;
{
@@ -1515,6 +1713,7 @@ handle_metrics ()
MHD_Response* r = MHD_create_response_from_buffer (os.size(),
(void*) os.c_str(),
MHD_RESPMEM_MUST_COPY);
+ *size = os.size();
MHD_add_response_header (r, "Content-Type", "text/plain");
return r;
}
@@ -1537,8 +1736,11 @@ handler_cb (void * /*cls*/,
struct MHD_Response *r = NULL;
string url_copy = url;
- if (verbose)
- obatched(clog) << conninfo(connection) << " " << method << " " << url << endl;
+ int rc = MHD_NO; // mhd
+ int http_code = 500;
+ off_t http_size = -1;
+ struct timeval tv_start, tv_end;
+ gettimeofday (&tv_start, NULL);
try
{
@@ -1571,12 +1773,21 @@ handler_cb (void * /*cls*/,
}
inc_metric("http_requests_total", "type", artifacttype);
- r = handle_buildid(buildid, artifacttype, suffix, 0); // NB: don't care about result-fd
+ // get the resulting fd so we can report its size
+ int fd;
+ r = handle_buildid(connection, buildid, artifacttype, suffix, &fd);
+ if (r)
+ {
+ struct stat fs;
+ if (fstat(fd, &fs) == 0)
+ http_size = fs.st_size;
+ // libmicrohttpd will close (fd);
+ }
}
else if (url1 == "/metrics")
{
inc_metric("http_requests_total", "type", "metrics");
- r = handle_metrics();
+ r = handle_metrics(& http_size);
}
else
throw reportable_exception("webapi error, unrecognized /operation");
@@ -1584,16 +1795,39 @@ handler_cb (void * /*cls*/,
if (r == 0)
throw reportable_exception("internal error, missing response");
- int rc = MHD_queue_response (connection, MHD_HTTP_OK, r);
+ rc = MHD_queue_response (connection, MHD_HTTP_OK, r);
+ http_code = MHD_HTTP_OK;
MHD_destroy_response (r);
- return rc;
}
catch (const reportable_exception& e)
{
inc_metric("http_responses_total","result","error");
e.report(clog);
- return e.mhd_send_response (connection);
+ http_code = e.code;
+ http_size = e.message.size();
+ rc = e.mhd_send_response (connection);
}
+
+ gettimeofday (&tv_end, NULL);
+ double deltas = (tv_end.tv_sec - tv_start.tv_sec) + (tv_end.tv_usec - tv_start.tv_usec)*0.000001;
+ obatched(clog) << conninfo(connection)
+ << ' ' << method << ' ' << url
+ << ' ' << http_code << ' ' << http_size
+ << ' ' << (int)(deltas*1000) << "ms"
+ << endl;
+
+ // related prometheus metrics
+ string http_code_str = to_string(http_code);
+ if (http_size >= 0)
+ add_metric("http_responses_transfer_bytes_sum","code",http_code_str,
+ http_size);
+ inc_metric("http_responses_transfer_bytes_count","code",http_code_str);
+
+ add_metric("http_responses_duration_milliseconds_sum","code",http_code_str,
+ deltas*1000); // prometheus prefers _seconds and floating point
+ inc_metric("http_responses_duration_milliseconds_count","code",http_code_str);
+
+ return rc;
}
@@ -1640,7 +1874,7 @@ dwarf_extract_source_paths (Elf *elf, set& debug_sourcefiles)
struct MHD_Response *r = 0;
try
{
- r = handle_buildid (buildid, "debuginfo", "", &alt_fd);
+ r = handle_buildid (0, buildid, "debuginfo", "", &alt_fd);
}
catch (const reportable_exception& e)
{
@@ -2022,6 +2256,27 @@ scan_source_file (const string& rps, const stat_t& st,
.bind(4, sfs.st_mtime)
.step_ok_done();
+ // PR25548: also store canonicalized source path
+ string dwarfsrc_canon = canon_pathname (dwarfsrc);
+ if (dwarfsrc_canon != dwarfsrc)
+ {
+ if (verbose > 3)
+ obatched(clog) << "canonicalized src=" << dwarfsrc << " alias=" << dwarfsrc_canon << endl;
+
+ ps_upsert_files
+ .reset()
+ .bind(1, dwarfsrc_canon)
+ .step_ok_done();
+
+ ps_upsert_s
+ .reset()
+ .bind(1, buildid)
+ .bind(2, dwarfsrc_canon)
+ .bind(3, srps)
+ .bind(4, sfs.st_mtime)
+ .step_ok_done();
+ }
+
inc_metric("found_sourcerefs_total","source","files");
}
}
@@ -2183,6 +2438,26 @@ archive_classify (const string& rps, string& archive_extension,
.bind(2, s)
.step_ok_done();
+ // PR25548: also store canonicalized source path
+ const string& dwarfsrc = s;
+ string dwarfsrc_canon = canon_pathname (dwarfsrc);
+ if (dwarfsrc_canon != dwarfsrc)
+ {
+ if (verbose > 3)
+ obatched(clog) << "canonicalized src=" << dwarfsrc << " alias=" << dwarfsrc_canon << endl;
+
+ ps_upsert_files
+ .reset()
+ .bind(1, dwarfsrc_canon)
+ .step_ok_done();
+
+ ps_upsert_sref
+ .reset()
+ .bind(1, buildid)
+ .bind(2, dwarfsrc_canon)
+ .step_ok_done();
+ }
+
fts_sref ++;
}
}
@@ -2809,7 +3084,8 @@ main (int argc, char *argv[])
fdcache_mbs = 1024; // 1 gigabyte
else
fdcache_mbs = sfs.f_bavail * sfs.f_bsize / 1024 / 1024 / 4; // 25% of free space
- fdcache_fds = concurrency * 2;
+ fdcache_prefetch = 64; // guesstimate storage is this much less costly than re-decompression
+ fdcache_fds = (concurrency + fdcache_prefetch) * 2;
/* Parse and process arguments. */
int remaining;
@@ -2943,6 +3219,7 @@ main (int argc, char *argv[])
obatched(clog) << "rescan time " << rescan_s << endl;
obatched(clog) << "fdcache fds " << fdcache_fds << endl;
obatched(clog) << "fdcache mbs " << fdcache_mbs << endl;
+ obatched(clog) << "fdcache prefetch " << fdcache_prefetch << endl;
obatched(clog) << "fdcache tmpdir " << tmpdir << endl;
obatched(clog) << "groom time " << groom_s << endl;
if (scan_archives.size()>0)
diff --git a/libdrgn/elfutils/debuginfod/debuginfod.h b/libdrgn/elfutils/debuginfod/debuginfod.h
index b4b6a3d2a..8d90838b4 100644
--- a/libdrgn/elfutils/debuginfod/debuginfod.h
+++ b/libdrgn/elfutils/debuginfod/debuginfod.h
@@ -1,5 +1,5 @@
/* External declarations for the libdebuginfod client library.
- Copyright (C) 2019 Red Hat, Inc.
+ Copyright (C) 2019-2020 Red Hat, Inc.
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
@@ -54,7 +54,7 @@ debuginfod_client *debuginfod_begin (void);
return a posix error code. If successful, set *path to a
strdup'd copy of the name of the same file in the cache.
Caller must free() it later. */
-
+
int debuginfod_find_debuginfo (debuginfod_client *client,
const unsigned char *build_id,
int build_id_len,
@@ -75,6 +75,18 @@ typedef int (*debuginfod_progressfn_t)(debuginfod_client *c, long a, long b);
void debuginfod_set_progressfn(debuginfod_client *c,
debuginfod_progressfn_t fn);
+/* Set the user parameter. */
+void debuginfod_set_user_data (debuginfod_client *client, void *value);
+
+/* Get the user parameter. */
+void* debuginfod_get_user_data (debuginfod_client *client);
+
+/* Get the current or last active URL, if known. */
+const char* debuginfod_get_url (debuginfod_client *client);
+
+/* Add an outgoing HTTP request "Header: Value". Copies string. */
+int debuginfod_add_http_header (debuginfod_client *client, const char* header);
+
/* Release debuginfod client connection context handle. */
void debuginfod_end (debuginfod_client *client);
diff --git a/libdrgn/elfutils/debuginfod/libdebuginfod.map b/libdrgn/elfutils/debuginfod/libdebuginfod.map
index 0d26f93e0..b8edfb016 100644
--- a/libdrgn/elfutils/debuginfod/libdebuginfod.map
+++ b/libdrgn/elfutils/debuginfod/libdebuginfod.map
@@ -8,3 +8,10 @@ ELFUTILS_0.178 {
debuginfod_find_source;
debuginfod_set_progressfn;
} ELFUTILS_0;
+ELFUTILS_0.179 {
+ global:
+ debuginfod_set_user_data;
+ debuginfod_get_user_data;
+ debuginfod_get_url;
+ debuginfod_add_http_header;
+};
diff --git a/libdrgn/elfutils/doc/ChangeLog b/libdrgn/elfutils/doc/ChangeLog
index 36094d002..f598b7f27 100644
--- a/libdrgn/elfutils/doc/ChangeLog
+++ b/libdrgn/elfutils/doc/ChangeLog
@@ -1,3 +1,52 @@
+2020-03-29 Mark Wielaard
+
+ * debuginfod_find_debuginfo.3 (HTTP HEADER): Document the expected
+ header format and purpose.
+
+2020-03-28 Frank Ch. Eigler
+
+ * debuginfod.8: Document valid --port=NUM range, excludes 0.
+
+2020-03-27 Frank Ch. Eigler
+
+ * debuginfod-find.1: Document /path/-based buildid passing.
+
+2020-03-24 Frank Ch. Eigler
+
+ * debuginfod_add_http_header.3: New function, documented ...
+ * debuginfod_find_debuginfo.3: ... here.
+ * Makefile.am (notrans_dist_*_man3): Add it.
+
+2020-03-26 Frank Ch. Eigler
+
+ * debuginfod.8 (-R): Note zstd compression complications
+ and workaround.
+
+2020-03-24 Frank Ch. Eigler
+
+ * debuginfod-find.1, debuginfod_find_debuginfo.3: Document
+ source path canonicalization.
+
+2020-03-22 Frank Ch. Eigler
+
+ * debuginfod_get_url.3: New function, documented ...
+ * debuginfod_find_debuginfo.3: ... here.
+ * Makefile.am (notrans_dist_*_man3): Add it.
+
+2020-03-22 Frank Ch. Eigler
+
+ * debuginfod_get_user.3, _set_user.3: New functions, documented ...
+ * debuginfod_find_debuginfo.3: ... here.
+ * Makefile.am (notrans_dist_*_man3): List all debuginfod .3 functions.
+
+2020-02-25 Frank Ch. Eigler
+
+ * debuginfod.8: Note that -R works just like -Z.rpm .
+
+2020-02-25 Frank Ch. Eigler
+
+ * debuginfod.8: Document new --fdcache-prefetch option.
+
2020-02-05 Frank Ch. Eigler
* debuginfod.8: Document new -Z flag and tweak other bits.
diff --git a/libdrgn/elfutils/doc/Makefile.am b/libdrgn/elfutils/doc/Makefile.am
index b5db01ff7..f0c7e55df 100644
--- a/libdrgn/elfutils/doc/Makefile.am
+++ b/libdrgn/elfutils/doc/Makefile.am
@@ -1,7 +1,7 @@
## Process this file with automake to create Makefile.in
## Configure input file for elfutils.
##
-## Copyright (C) 1996-2001, 2002, 2005, 2019 Red Hat, Inc.
+## Copyright (C) 1996-2001, 2002, 2005, 2019-2020 Red Hat, Inc.
## This file is part of elfutils.
##
## This file is free software; you can redistribute it and/or modify
@@ -24,7 +24,16 @@ notrans_dist_man1_MANS=
if DEBUGINFOD
notrans_dist_man8_MANS += debuginfod.8
-notrans_dist_man3_MANS += debuginfod_find_debuginfo.3 debuginfod_find_source.3 debuginfod_find_executable.3 debuginfod_set_progressfn.3
+notrans_dist_man3_MANS += debuginfod_add_http_header.3
+notrans_dist_man3_MANS += debuginfod_begin.3
+notrans_dist_man3_MANS += debuginfod_end.3
+notrans_dist_man3_MANS += debuginfod_find_debuginfo.3
+notrans_dist_man3_MANS += debuginfod_find_executable.3
+notrans_dist_man3_MANS += debuginfod_find_source.3
+notrans_dist_man3_MANS += debuginfod_get_user_data.3
+notrans_dist_man3_MANS += debuginfod_get_url.3
+notrans_dist_man3_MANS += debuginfod_set_progressfn.3
+notrans_dist_man3_MANS += debuginfod_set_user_data.3
notrans_dist_man1_MANS += debuginfod-find.1
endif
diff --git a/libdrgn/elfutils/doc/debuginfod-find.1 b/libdrgn/elfutils/doc/debuginfod-find.1
index e71ca29be..aeb1cb120 100644
--- a/libdrgn/elfutils/doc/debuginfod-find.1
+++ b/libdrgn/elfutils/doc/debuginfod-find.1
@@ -19,10 +19,11 @@ debuginfod-find \- request debuginfo-related data
.SH SYNOPSIS
.B debuginfod-find [\fIOPTION\fP]... debuginfo \fIBUILDID\fP
-
+.B debuginfod-find [\fIOPTION\fP]... debuginfo \fIPATH\fP
.B debuginfod-find [\fIOPTION\fP]... executable \fIBUILDID\fP
-
+.B debuginfod-find [\fIOPTION\fP]... executable \fIPATH\fP
.B debuginfod-find [\fIOPTION\fP]... source \fIBUILDID\fP \fI/FILENAME\fP
+.B debuginfod-find [\fIOPTION\fP]... source \fIPATH\fP \fI/FILENAME\fP
.SH DESCRIPTION
\fBdebuginfod-find\fP queries one or more \fBdebuginfod\fP servers for
@@ -52,6 +53,14 @@ Then the hexadecimal BUILDID is simply:
8713b9c3fb8a720137a4a08b325905c7aaf8429d
.ESAMPLE
+In place of the hexadecimal \fIBUILDID\fP, debuginfod-find also
+accepts a path name to to an ELF binary, from which it extracts the
+buildid. In this case, ensure the file name has some character other
+than \fB[0-9a-f]\fP. Files ambiguously named files like
+"\fBdeadbeef\fP" can be passed with a \fB./deadbeef\fP extra path
+component.
+
+
.SS debuginfo \fIBUILDID\fP
If the given buildid is known to a server, this request will result
@@ -78,10 +87,11 @@ is made up of multiple CUs. Therefore, to disambiguate, debuginfod
expects source queries to prefix relative path names with the CU
compilation-directory, followed by a mandatory "/".
-Note: the user should not elide \fB../\fP or \fB/./\fP or extraneous
-\fB///\fP sorts of path components in the directory names, because if
-this is how those names appear in the DWARF files, that is what
-debuginfod needs to see too.
+Note: the caller may or may not elide \fB../\fP or \fB/./\fP or extraneous
+\fB///\fP sorts of path components in the directory names. debuginfod
+accepts both forms. Specifically, debuginfod canonicalizes path names
+according to RFC3986 section 5.2.4 (Remove Dot Segments), plus reducing
+any \fB//\fP to \fB/\fP in the path.
For example:
.TS
diff --git a/libdrgn/elfutils/doc/debuginfod.8 b/libdrgn/elfutils/doc/debuginfod.8
index ca844aedc..a645ceed5 100644
--- a/libdrgn/elfutils/doc/debuginfod.8
+++ b/libdrgn/elfutils/doc/debuginfod.8
@@ -99,7 +99,11 @@ additional patterns. This option may be repeated.
.TP
.B "\-R"
Activate RPM patterns in archive scanning. The default is off.
-Equivalent to \fB\%\-Z\~.rpm=rpm2cpio\fP.
+Equivalent to \fB\%\-Z\~.rpm=cat\fP, since libarchive can natively
+process RPM archives. If your version of libarchive is much older
+than 2020, be aware that some distributions have switched to an
+incompatible zstd compression for their payload. You may experiment
+with \fB\%\-Z\ .rpm='(rpm2cpio|zstdcat)<'\fP instead of \fB\-R\fP.
.TP
.B "\-U"
@@ -126,9 +130,10 @@ repeated. The default is nothing extra.
.TP
.B "\-p NUM" "\-\-port=NUM"
-Set the TCP port number on which debuginfod should listen, to service
-HTTP requests. Both IPv4 and IPV6 sockets are opened, if possible.
-The webapi is documented below. The default port number is 8002.
+Set the TCP port number (0 < NUM < 65536) on which debuginfod should
+listen, to service HTTP requests. Both IPv4 and IPV6 sockets are
+opened, if possible. The webapi is documented below. The default
+port number is 8002.
.TP
.B "\-I REGEX" "\-\-include=REGEX" "\-X REGEX" "\-\-exclude=REGEX"
@@ -193,14 +198,17 @@ loops in the symbolic directory tree might lead to \fIinfinite
traversal\fP.
.TP
-.B "\-\-fdcache-fds=NUM" "\-\-fdcache-mbs=MB"
+.B "\-\-fdcache\-fds=NUM" "\-\-fdcache\-mbs=MB" "\-\-fdcache\-prefetch=NUM2"
Configure limits on a cache that keeps recently extracted files from
-archives. Up to NUM files and up to a total of MB megabytes will be
-kept extracted, in order to avoid having to decompress their archives
-again. The default NUM and MB values depend on the concurrency of the
-system, and on the available disk space on the $TMPDIR or \fB/tmp\fP
-filesystem. This is because that is where the most recently used
-extracted files are kept. Grooming cleans this cache.
+archives. Up to NUM requested files and up to a total of MB megabytes
+will be kept extracted, in order to avoid having to decompress their
+archives over and over again. In addition, up to NUM2 other files
+from an archive may be prefetched into the cache before they are even
+requested. The default NUM, NUM2, and MB values depend on the
+concurrency of the system, and on the available disk space on the
+$TMPDIR or \fB/tmp\fP filesystem. This is because that is where the
+most recently used extracted files are kept. Grooming cleans this
+cache.
.TP
.B "\-v"
@@ -261,10 +269,11 @@ is made up of multiple CUs. Therefore, to disambiguate, debuginfod
expects source queries to prefix relative path names with the CU
compilation-directory, followed by a mandatory "/".
-Note: contrary to RFC 3986, the client should not elide \fB../\fP or
-\fB/./\fP or extraneous \fB///\fP sorts of path components in the
-directory names, because if this is how those names appear in the
-DWARF files, that is what debuginfod needs to see too.
+Note: the caller may or may not elide \fB../\fP or \fB/./\fP or extraneous
+\fB///\fP sorts of path components in the directory names. debuginfod
+accepts both forms. Specifically, debuginfod canonicalizes path names
+according to RFC3986 section 5.2.4 (Remove Dot Segments), plus reducing
+any \fB//\fP to \fB/\fP in the path.
For example:
.TS
@@ -406,8 +415,10 @@ or negative means "no timeout".)
.B DEBUGINFOD_CACHE_PATH
This environment variable governs the location of the cache where
downloaded files are kept. It is cleaned periodically as this
-program is reexecuted. The default is \%$HOME/.debuginfod_client_cache.
-.\" XXX describe cache eviction policy
+program is reexecuted. If XDG_CACHE_HOME is set then
+$XDG_CACHE_HOME/debuginfod_client is the default location, otherwise
+$HOME/.cache/debuginfod_client is used. For more information regarding
+the client cache see \fIdebuginfod_find_debuginfo(3)\fP.
.SH FILES
.LP
@@ -418,8 +429,10 @@ Default database file.
.PD
.TP 20
-.B $HOME/.debuginfod_client_cache
+.B $XDG_CACHE_HOME/debuginfod_client
Default cache directory for content from upstream debuginfods.
+If XDG_CACHE_HOME is not set then \fB$HOME/.cache/debuginfod_client\fP
+is used.
.PD
diff --git a/libdrgn/elfutils/doc/debuginfod_add_http_header.3 b/libdrgn/elfutils/doc/debuginfod_add_http_header.3
new file mode 100644
index 000000000..16279936e
--- /dev/null
+++ b/libdrgn/elfutils/doc/debuginfod_add_http_header.3
@@ -0,0 +1 @@
+.so man3/debuginfod_find_debuginfo.3
diff --git a/libdrgn/elfutils/doc/debuginfod_find_debuginfo.3 b/libdrgn/elfutils/doc/debuginfod_find_debuginfo.3
index c232ac717..d9717d734 100644
--- a/libdrgn/elfutils/doc/debuginfod_find_debuginfo.3
+++ b/libdrgn/elfutils/doc/debuginfod_find_debuginfo.3
@@ -21,9 +21,15 @@ debuginfod_find_debuginfo \- request debuginfo from debuginfod
.nf
.B #include
.PP
+Link with \fB-ldebuginfod\fP.
+
+CONNECTION HANDLE
+
.BI "debuginfod_client *debuginfod_begin(void);"
.BI "void debuginfod_end(debuginfod_client *" client ");"
+LOOKUP FUNCTIONS
+
.BI "int debuginfod_find_debuginfo(debuginfod_client *" client ","
.BI " const unsigned char *" build_id ","
.BI " int " build_id_len ","
@@ -38,12 +44,18 @@ debuginfod_find_debuginfo \- request debuginfo from debuginfod
.BI " const char *" filename ","
.BI " char ** " path ");"
+OPTIONAL FUNCTIONS
+
.BI "typedef int (*debuginfod_progressfn_t)(debuginfod_client *" client ","
.BI " long a, long b);"
.BI "void debuginfod_set_progressfn(debuginfod_client *" client ","
.BI " debuginfod_progressfn_t " progressfn ");"
-
-Link with \fB-ldebuginfod\fP.
+.BI "void debuginfod_set_user_data(debuginfod_client *" client ","
+.BI " void *" data ");"
+.BI "void* debuginfod_get_user_data(debuginfod_client *" client ");"
+.BI "const char* debuginfod_get_url(debuginfod_client *" client ");"
+.BI "int debuginfod_add_http_header(debuginfod_client *" client ","
+.BI " const char* " header ");"
.SH DESCRIPTION
@@ -77,10 +89,11 @@ paths, and yet an executable is made up of multiple CUs. Therefore, to
disambiguate, debuginfod expects source queries to prefix relative path
names with the CU compilation-directory, followed by a mandatory "/".
-Note: the caller should not elide \fB../\fP or \fB/./\fP or extraneous
-\fB///\fP sorts of path components in the directory names, because if
-this is how those names appear in the DWARF files, that is what
-debuginfod needs to see too.
+Note: the caller may or may not elide \fB../\fP or \fB/./\fP or extraneous
+\fB///\fP sorts of path components in the directory names. debuginfod
+accepts both forms. Specifically, debuginfod canonicalizes path names
+according to RFC3986 section 5.2.4 (Remove Dot Segments), plus reducing
+any \fB//\fP to \fB/\fP in the path.
If \fIpath\fP is not NULL and the query is successful, \fIpath\fP is set
to the path of the file in the cache. The caller must \fBfree\fP() this value.
@@ -102,7 +115,12 @@ to the client cache and a file descriptor to that file is returned.
The caller needs to \fBclose\fP() this descriptor. Otherwise, a
negative error code is returned.
-.SH "PROGRESS CALLBACK"
+.SH "OPTIONAL FUNCTIONS"
+
+A small number of optional functions are available to tune or query
+the operation of the debuginfod client.
+
+.SS "PROGRESS CALLBACK"
As the \fBdebuginfod_find_*\fP() functions may block for seconds or
longer, a progress callback function is called periodically, if
@@ -125,6 +143,47 @@ continue the work, or any other value to stop work as soon as
possible. Consequently, the \fBdebuginfod_find_*\fP() function will
likely return with an error, but might still succeed.
+.SS "USER DATA POINTER"
+
+A single \fIvoid *\fP pointer associated with the connection handle
+may be set any time via
+.BR \%debuginfod_set_user_data () ,
+and retrieved via
+.BR \%debuginfod_get_user_data () .
+The value is undefined if unset.
+
+.SS "URL"
+
+The URL of the current or most recent outgoing download, if known,
+may be retrieved via
+.BR \%debuginfod_get_url ()
+from the progressfn callback, or afterwards. It may be NULL.
+The resulting string is owned by the library, and must not be modified
+or freed. The caller should copy it if it is needed beyond the release
+of the client object.
+
+.SS "HTTP HEADER"
+
+Before a lookup function is initiated, a client application may
+add HTTP request headers to future downloads.
+.BR \%debuginfod_add_http_header ()
+may be called with strings of the form
+.BR \%"Header:\~value" .
+These strings are copied by the library. A zero return value
+indicates success, but out-of-memory conditions may result in
+a non-zero \fI-ENOMEM\fP. If the string is in the wrong form
+\fI-EINVAL\fP will be returned.
+
+Note that the current debuginfod-client library implementation uses
+libcurl, but you shouldn't rely on that fact. Don't use this function
+for replacing any standard headers, except for the User-Agent mentioned
+below. The only supported usage of this function is for adding an
+optional header which might or might not be passed through to the
+server for logging purposes only.
+
+By default, the library adds a descriptive \fIUser-Agent:\fP
+header to outgoing requests. If the client application adds
+a header with the same name, this default is suppressed.
.SH "CACHE"
If the query is successful, the \fBdebuginfod_find_*\fP() functions save
@@ -180,7 +239,10 @@ function output.
.B DEBUGINFOD_CACHE_PATH
This environment variable governs the location of the cache where
downloaded files are kept. It is cleaned periodically as this
-program is reexecuted. The default is $HOME/.debuginfod_client_cache.
+program is reexecuted. If XDG_CACHE_HOME is set then
+$XDG_CACHE_HOME/debuginfod_client is the default location, otherwise
+$HOME/.cache/debuginfod_client is used.
+
.SH "ERRORS"
The following list is not comprehensive. Error codes may also
@@ -244,7 +306,8 @@ the timeout duration. See debuginfod(8) for more information.
.PD .1v
.TP 20
.B $HOME/.debuginfod_client_cache
-Default cache directory.
+Default cache directory. If XDG_CACHE_HOME is not set then
+\fB$HOME/.cache/debuginfod_client\fP is used.
.PD
.SH "SEE ALSO"
diff --git a/libdrgn/elfutils/doc/debuginfod_get_url.3 b/libdrgn/elfutils/doc/debuginfod_get_url.3
new file mode 100644
index 000000000..16279936e
--- /dev/null
+++ b/libdrgn/elfutils/doc/debuginfod_get_url.3
@@ -0,0 +1 @@
+.so man3/debuginfod_find_debuginfo.3
diff --git a/libdrgn/elfutils/doc/debuginfod_get_user_data.3 b/libdrgn/elfutils/doc/debuginfod_get_user_data.3
new file mode 100644
index 000000000..16279936e
--- /dev/null
+++ b/libdrgn/elfutils/doc/debuginfod_get_user_data.3
@@ -0,0 +1 @@
+.so man3/debuginfod_find_debuginfo.3
diff --git a/libdrgn/elfutils/doc/debuginfod_set_user_data.3 b/libdrgn/elfutils/doc/debuginfod_set_user_data.3
new file mode 100644
index 000000000..16279936e
--- /dev/null
+++ b/libdrgn/elfutils/doc/debuginfod_set_user_data.3
@@ -0,0 +1 @@
+.so man3/debuginfod_find_debuginfo.3
diff --git a/libdrgn/elfutils/libasm/ChangeLog b/libdrgn/elfutils/libasm/ChangeLog
index 7b0d3df34..2c092abe1 100644
--- a/libdrgn/elfutils/libasm/ChangeLog
+++ b/libdrgn/elfutils/libasm/ChangeLog
@@ -1,3 +1,7 @@
+2020-04-25 Mark Wielaard
+
+ * asm_end.c (text_end): Call fflush instead of fclose.
+
2020-01-08 Mark Wielaard
* libasm.h: Don't include libebl.h. Define an opaque Ebl handle.
diff --git a/libdrgn/elfutils/libasm/asm_end.c b/libdrgn/elfutils/libasm/asm_end.c
index 99e950170..3b8582fdd 100644
--- a/libdrgn/elfutils/libasm/asm_end.c
+++ b/libdrgn/elfutils/libasm/asm_end.c
@@ -47,7 +47,7 @@
static int
text_end (AsmCtx_t *ctx __attribute__ ((unused)))
{
- if (fclose (ctx->out.file) != 0)
+ if (fflush (ctx->out.file) != 0)
{
__libasm_seterrno (ASM_E_IOERROR);
return -1;
diff --git a/libdrgn/elfutils/libcpu/ChangeLog b/libdrgn/elfutils/libcpu/ChangeLog
index 707965140..a8b2b951e 100644
--- a/libdrgn/elfutils/libcpu/ChangeLog
+++ b/libdrgn/elfutils/libcpu/ChangeLog
@@ -1,3 +1,8 @@
+2020-04-16 Mark Wielaard
+
+ * i386_disasm.c (i386_disasm): Replace assert with goto invalid_op
+ for bad prefix.
+
2019-12-11 Omar Sandoval
* Makefile.am (i386_lex_CFLAGS): Add -Wno-implicit-fallthrough.
diff --git a/libdrgn/elfutils/libcpu/i386_disasm.c b/libdrgn/elfutils/libcpu/i386_disasm.c
index 4422ffa27..32df8cd0c 100644
--- a/libdrgn/elfutils/libcpu/i386_disasm.c
+++ b/libdrgn/elfutils/libcpu/i386_disasm.c
@@ -407,7 +407,8 @@ i386_disasm (Ebl *ebl __attribute__((unused)),
++curr;
- assert (last_prefix_bit != 0);
+ if (last_prefix_bit == 0)
+ goto invalid_op;
correct_prefix = last_prefix_bit;
}
@@ -445,8 +446,8 @@ i386_disasm (Ebl *ebl __attribute__((unused)),
the input data. */
goto do_ret;
- assert (correct_prefix == 0
- || (prefixes & correct_prefix) != 0);
+ if (correct_prefix != 0 && (prefixes & correct_prefix) == 0)
+ goto invalid_op;
prefixes ^= correct_prefix;
if (0)
@@ -473,7 +474,8 @@ i386_disasm (Ebl *ebl __attribute__((unused)),
if (data == end)
{
- assert (prefixes != 0);
+ if (prefixes == 0)
+ goto invalid_op;
goto print_prefix;
}
@@ -1125,6 +1127,7 @@ i386_disasm (Ebl *ebl __attribute__((unused)),
}
/* Invalid (or at least unhandled) opcode. */
+ invalid_op:
if (prefixes != 0)
goto print_prefix;
/* Make sure we get past the unrecognized opcode if we haven't yet. */
diff --git a/libdrgn/elfutils/libdw/ChangeLog b/libdrgn/elfutils/libdw/ChangeLog
index 59f33f9e3..c75b09587 100644
--- a/libdrgn/elfutils/libdw/ChangeLog
+++ b/libdrgn/elfutils/libdw/ChangeLog
@@ -1,3 +1,24 @@
+2020-05-08 Mark Wielaard
+
+ * libdw_visit_scopes.c (walk_children): Don't recurse into imported
+ DW_TAG_compile_units.
+
+2020-05-08 Mark Wielaard
+
+ * dwarf_decl_file.c (dwarf_decl_file): Use attr CU instead of DIE
+ CU to resolve file name.
+ * dwarf_ranges.c(dwarf_ranges): Document which CU we use when.
+ * libdw.h (dwarf_attr_integrate): Extend documentation.
+
+2020-04-25 Mark Wielaard
+
+ * libdw_alloc.c (__libdw_alloc_tail): Call Dwarf oom_handler()
+ when malloc fails.
+
+2020-04-17 Mark Wielaard
+
+ * dwarf_begin_elf.c (check_section): Handle .gnu.debuglto_ prefix.
+
2019-10-28 Aaron Merey
* Makefile.am (libdw_so_LDLIBS): Add -ldl for libdebuginfod.so dlopen.
diff --git a/libdrgn/elfutils/libdw/dwarf_begin_elf.c b/libdrgn/elfutils/libdw/dwarf_begin_elf.c
index 853430882..474ed1389 100644
--- a/libdrgn/elfutils/libdw/dwarf_begin_elf.c
+++ b/libdrgn/elfutils/libdw/dwarf_begin_elf.c
@@ -137,6 +137,10 @@ check_section (Dwarf *result, size_t shstrndx, Elf_Scn *scn, bool inscngrp)
gnu_compressed = true;
break;
}
+ else if (scnlen > 14 /* .gnu.debuglto_ prefix. */
+ && strncmp (scnname, ".gnu.debuglto_", 14) == 0
+ && strcmp (&scnname[14], dwarf_scnnames[cnt]) == 0)
+ break;
}
if (cnt >= ndwarf_scnnames)
diff --git a/libdrgn/elfutils/libdw/dwarf_decl_file.c b/libdrgn/elfutils/libdw/dwarf_decl_file.c
index 5657132f4..d4aa0a18e 100644
--- a/libdrgn/elfutils/libdw/dwarf_decl_file.c
+++ b/libdrgn/elfutils/libdw/dwarf_decl_file.c
@@ -55,7 +55,7 @@ dwarf_decl_file (Dwarf_Die *die)
}
/* Get the array of source files for the CU. */
- struct Dwarf_CU *cu = die->cu;
+ struct Dwarf_CU *cu = attr_mem.cu;
if (cu->lines == NULL)
{
Dwarf_Lines *lines;
diff --git a/libdrgn/elfutils/libdw/dwarf_ranges.c b/libdrgn/elfutils/libdw/dwarf_ranges.c
index f67d8a5a8..520f9ffe6 100644
--- a/libdrgn/elfutils/libdw/dwarf_ranges.c
+++ b/libdrgn/elfutils/libdw/dwarf_ranges.c
@@ -506,6 +506,11 @@ dwarf_ranges (Dwarf_Die *die, ptrdiff_t offset, Dwarf_Addr *basep,
Dwarf_Attribute attr_mem;
Dwarf_Attribute *attr = INTUSE(dwarf_attr) (die, DW_AT_ranges,
&attr_mem);
+ /* Note that above we use dwarf_attr, not dwarf_attr_integrate.
+ The only case where the ranges can come from another DIE
+ attribute are the split CU case. In that case we also have a
+ different CU to check against. But that is already set up
+ above using __libdw_find_split_unit. */
if (attr == NULL
&& is_cudie (die)
&& die->cu->unit_type == DW_UT_split_compile)
diff --git a/libdrgn/elfutils/libdw/libdw.h b/libdrgn/elfutils/libdw/libdw.h
index e20961be2..1a4e15a16 100644
--- a/libdrgn/elfutils/libdw/libdw.h
+++ b/libdrgn/elfutils/libdw/libdw.h
@@ -474,7 +474,14 @@ extern Dwarf_Attribute *dwarf_attr (Dwarf_Die *die, unsigned int search_name,
extern int dwarf_hasattr (Dwarf_Die *die, unsigned int search_name);
/* These are the same as dwarf_attr and dwarf_hasattr, respectively,
- but they resolve an indirect attribute through DW_AT_abstract_origin. */
+ but they resolve an indirect attribute through
+ DW_AT_abstract_origin, DW_AT_specification or, if the DIE is a
+ top-level split CU, the skeleton DIE. Note that the attribute
+ might come from a DIE in a different CU (possibly from a different
+ Dwarf file). In that case all attribute information needs to be
+ resolved through the CU associated with the returned
+ Dwarf_Attribute. The dwarf_form functions already do this
+ automatically. */
extern Dwarf_Attribute *dwarf_attr_integrate (Dwarf_Die *die,
unsigned int search_name,
Dwarf_Attribute *result)
diff --git a/libdrgn/elfutils/libdw/libdw.map b/libdrgn/elfutils/libdw/libdw.map
index b2df2ba72..b4fa63631 100644
--- a/libdrgn/elfutils/libdw/libdw.map
+++ b/libdrgn/elfutils/libdw/libdw.map
@@ -370,7 +370,7 @@ ELFUTILS_0.177 {
# presume that NULL is only returned on error (otherwise ELF_K_NONE).
dwelf_elf_begin;
} ELFUTILS_0.175;
-ELFUTILS_0.179 {
+ELFUTILS_0.180 {
global:
dwfl_attach_thread;
dwfl_detach_thread;
@@ -378,4 +378,4 @@ ELFUTILS_0.179 {
dwfl_frame_dwarf_frame;
dwfl_frame_register;
dwfl_frame_eval_expr;
-} ELFUTILS_0.178;
+} ELFUTILS_0.177;
diff --git a/libdrgn/elfutils/libdw/libdw_alloc.c b/libdrgn/elfutils/libdw/libdw_alloc.c
index e0281a3df..b3e533434 100644
--- a/libdrgn/elfutils/libdw/libdw_alloc.c
+++ b/libdrgn/elfutils/libdw/libdw_alloc.c
@@ -87,6 +87,11 @@ __libdw_alloc_tail (Dwarf *dbg)
if (result == NULL)
{
result = malloc (dbg->mem_default_size);
+ if (result == NULL)
+ {
+ pthread_rwlock_unlock (&dbg->mem_rwl);
+ dbg->oom_handler();
+ }
result->size = dbg->mem_default_size
- offsetof (struct libdw_memblock, mem);
result->remaining = result->size;
diff --git a/libdrgn/elfutils/libdw/libdw_visit_scopes.c b/libdrgn/elfutils/libdw/libdw_visit_scopes.c
index eb892e10a..7dfa5f6b8 100644
--- a/libdrgn/elfutils/libdw/libdw_visit_scopes.c
+++ b/libdrgn/elfutils/libdw/libdw_visit_scopes.c
@@ -125,8 +125,12 @@ walk_children (struct walk_children_state *state)
Dwarf_Attribute *attr = INTUSE(dwarf_attr) (&state->child.die,
DW_AT_import,
&attr_mem);
+ /* Some gcc -flto versions imported other top-level compile units,
+ skip those. */
if (INTUSE(dwarf_formref_die) (attr, &state->child.die) != NULL
- && INTUSE(dwarf_child) (&state->child.die, &state->child.die) == 0)
+ && INTUSE(dwarf_tag) (&state->child.die) != DW_TAG_compile_unit
+ && (INTUSE(dwarf_child) (&state->child.die, &state->child.die)
+ == 0))
{
/* Checks the given DIE hasn't been imported yet
to prevent cycles. */
diff --git a/libdrgn/elfutils/libdwfl/ChangeLog b/libdrgn/elfutils/libdwfl/ChangeLog
index 0b95490aa..3f9cd6659 100644
--- a/libdrgn/elfutils/libdwfl/ChangeLog
+++ b/libdrgn/elfutils/libdwfl/ChangeLog
@@ -1,3 +1,18 @@
+2020-04-30 Mark Wielaard
+
+ * find-debuginfo.c (dwfl_standard_find_debuginfo): When mod->dw
+ is already set then try fetching debugaltlink.
+
+2020-04-25 Mark Wielaard
+
+ * gzip.c (open_stream): Return DWFL_E_NOMEM instead of calling
+ zlib_fail.
+
+2020-04-16 Mark Wielaard
+
+ * find-debuginfo.c (dwfl_standard_find_debuginfo): Initialize bits
+ to NULL.
+
2020-01-24 Mark Wielaard
* linux-kernel-modules.c (find_kernel_elf): Check release isn't NULL.
diff --git a/libdrgn/elfutils/libdwfl/dwfl_frame.c b/libdrgn/elfutils/libdwfl/dwfl_frame.c
index 80f2bc146..046f6c2ba 100644
--- a/libdrgn/elfutils/libdwfl/dwfl_frame.c
+++ b/libdrgn/elfutils/libdwfl/dwfl_frame.c
@@ -105,8 +105,7 @@ state_alloc (Dwfl_Thread *thread)
state->frame = NULL;
state->moderr = DWFL_E_NOERROR;
state->frameerr = DWFL_E_NOERROR;
- state->signal_frame = false;
- state->initial_frame = true;
+ state->isactivation = true;
state->pc_state = DWFL_FRAME_STATE_ERROR;
memset (state->regs_set, 0, sizeof (state->regs_set));
thread->unwound = state;
diff --git a/libdrgn/elfutils/libdwfl/dwfl_frame_pc.c b/libdrgn/elfutils/libdwfl/dwfl_frame_pc.c
index 296c815b9..a955d995a 100644
--- a/libdrgn/elfutils/libdwfl/dwfl_frame_pc.c
+++ b/libdrgn/elfutils/libdwfl/dwfl_frame_pc.c
@@ -39,26 +39,7 @@ dwfl_frame_pc (Dwfl_Frame *state, Dwarf_Addr *pc, bool *isactivation)
*pc = state->pc;
ebl_normalize_pc (state->thread->process->ebl, pc);
if (isactivation)
- {
- /* Bottom frame? */
- if (state->initial_frame)
- *isactivation = true;
- /* *ISACTIVATION is logical union of whether current or previous frame
- state is SIGNAL_FRAME. */
- else if (state->signal_frame)
- *isactivation = true;
- else
- {
- /* If the previous frame has unwound unsuccessfully just silently do
- not consider it could be a SIGNAL_FRAME. */
- __libdwfl_frame_unwind (state);
- if (state->unwound == NULL
- || state->unwound->pc_state != DWFL_FRAME_STATE_PC_SET)
- *isactivation = false;
- else
- *isactivation = state->unwound->signal_frame;
- }
- }
+ *isactivation = state->isactivation;
return true;
}
INTDEF (dwfl_frame_pc)
diff --git a/libdrgn/elfutils/libdwfl/dwfl_frame_regs.c b/libdrgn/elfutils/libdwfl/dwfl_frame_regs.c
index 83b1abef1..d013dc966 100644
--- a/libdrgn/elfutils/libdwfl/dwfl_frame_regs.c
+++ b/libdrgn/elfutils/libdwfl/dwfl_frame_regs.c
@@ -38,7 +38,6 @@ dwfl_thread_state_registers (Dwfl_Thread *thread, int firstreg,
{
Dwfl_Frame *state = thread->unwound;
assert (state && state->unwound == NULL);
- assert (state->initial_frame);
for (unsigned regno = firstreg; regno < firstreg + nregs; regno++)
if (! __libdwfl_frame_reg_set (state, regno, regs[regno - firstreg]))
{
@@ -54,7 +53,6 @@ dwfl_thread_state_register_pc (Dwfl_Thread *thread, Dwarf_Word pc)
{
Dwfl_Frame *state = thread->unwound;
assert (state && state->unwound == NULL);
- assert (state->initial_frame);
state->pc = pc;
state->pc_state = DWFL_FRAME_STATE_PC_SET;
}
diff --git a/libdrgn/elfutils/libdwfl/find-debuginfo.c b/libdrgn/elfutils/libdwfl/find-debuginfo.c
index 408576454..4cfd0b8b2 100644
--- a/libdrgn/elfutils/libdwfl/find-debuginfo.c
+++ b/libdrgn/elfutils/libdwfl/find-debuginfo.c
@@ -357,7 +357,7 @@ dwfl_standard_find_debuginfo (Dwfl_Module *mod,
{
/* First try by build ID if we have one. If that succeeds or fails
other than just by finding nothing, that's all we do. */
- const unsigned char *bits;
+ const unsigned char *bits = NULL;
GElf_Addr vaddr;
int bits_len;
if ((bits_len = INTUSE(dwfl_module_build_id) (mod, &bits, &vaddr)) > 0)
@@ -398,8 +398,27 @@ dwfl_standard_find_debuginfo (Dwfl_Module *mod,
free (canon);
}
- if (fd < 0 && bits_len > 0)
- fd = __libdwfl_debuginfod_find_debuginfo (mod->dwfl, bits, bits_len);
+ /* Still nothing? Try if we can use the debuginfod client.
+ But note that we might be looking for the alt file.
+ We use the same trick as dwfl_build_id_find_debuginfo.
+ If the debug file (dw) is already set, then we must be
+ looking for the altfile. But we cannot use the actual
+ file/path name given as hint. We'll have to lookup the
+ alt file "build-id". Because the debuginfod client only
+ handles build-ids. */
+ if (fd < 0)
+ {
+ if (mod->dw != NULL)
+ {
+ const char *altname;
+ bits_len = INTUSE(dwelf_dwarf_gnu_debugaltlink) (mod->dw, &altname,
+ (const void **)
+ &bits);
+ }
+
+ if (bits_len > 0)
+ fd = __libdwfl_debuginfod_find_debuginfo (mod->dwfl, bits, bits_len);
+ }
return fd;
}
diff --git a/libdrgn/elfutils/libdwfl/frame_unwind.c b/libdrgn/elfutils/libdwfl/frame_unwind.c
index 13bff8fc6..4885caa13 100644
--- a/libdrgn/elfutils/libdwfl/frame_unwind.c
+++ b/libdrgn/elfutils/libdwfl/frame_unwind.c
@@ -58,6 +58,7 @@ dwfl_frame_register (Dwfl_Frame *state, unsigned regno, Dwarf_Addr *val)
*val = state->regs[regno];
return true;
}
+INTDEF (dwfl_frame_register)
bool
internal_function
@@ -526,8 +527,7 @@ new_unwound (Dwfl_Frame *state)
unwound->frame = NULL;
unwound->moderr = DWFL_E_NOERROR;
unwound->frameerr = DWFL_E_NOERROR;
- unwound->signal_frame = false;
- unwound->initial_frame = false;
+ unwound->isactivation = false;
unwound->pc_state = DWFL_FRAME_STATE_ERROR;
memset (unwound->regs_set, 0, sizeof (unwound->regs_set));
return unwound;
@@ -542,7 +542,11 @@ static void
handle_cfi (Dwfl_Frame *state, Dwarf_Frame *frame, Dwarf_Addr bias)
{
Dwfl_Frame *unwound = state->unwound;
- unwound->signal_frame = frame->fde->cie->signal_frame;
+ if (frame->fde->cie->signal_frame)
+ {
+ state->isactivation = true;
+ unwound->isactivation = true;
+ }
Dwfl_Thread *thread = state->thread;
Dwfl_Process *process = thread->process;
Ebl *ebl = process->ebl;
@@ -704,14 +708,11 @@ __libdwfl_frame_unwind (Dwfl_Frame *state)
{
if (state->unwound)
return;
- /* Do not ask dwfl_frame_pc for ISACTIVATION, it would try to unwind STATE
- which would deadlock us. */
Dwarf_Addr pc;
- bool ok = INTUSE(dwfl_frame_pc) (state, &pc, NULL);
+ bool isactivation;
+ bool ok = INTUSE(dwfl_frame_pc) (state, &pc, &isactivation);
assert (ok);
- /* Check whether this is the initial frame or a signal frame.
- Then we need to unwind from the original, unadjusted PC. */
- if (! state->initial_frame && ! state->signal_frame)
+ if (! isactivation)
pc--;
Dwarf_Addr bias;
Dwarf_Frame *frame = INTUSE(dwfl_frame_dwarf_frame) (state, &bias);
@@ -732,7 +733,6 @@ __libdwfl_frame_unwind (Dwfl_Frame *state)
return;
}
state->unwound->pc_state = DWFL_FRAME_STATE_PC_UNDEFINED;
- // &Dwfl_Frame.signal_frame cannot be passed as it is a bitfield.
bool signal_frame = false;
if (! ebl_unwind (ebl, pc, setfunc, getfunc, readfunc, state, &signal_frame))
{
@@ -745,7 +745,11 @@ __libdwfl_frame_unwind (Dwfl_Frame *state)
return;
}
assert (state->unwound->pc_state == DWFL_FRAME_STATE_PC_SET);
- state->unwound->signal_frame = signal_frame;
+ if (signal_frame)
+ {
+ state->isactivation = true;
+ state->unwound->isactivation = true;
+ }
}
Dwfl_Module *
@@ -756,7 +760,10 @@ dwfl_frame_module (Dwfl_Frame *state)
if (state->moderr == DWFL_E_NOERROR)
{
Dwarf_Addr pc;
- INTUSE(dwfl_frame_pc) (state, &pc, NULL);
+ bool isactivation;
+ INTUSE(dwfl_frame_pc) (state, &pc, &isactivation);
+ if (! isactivation)
+ pc--;
state->mod = INTUSE(dwfl_addrmodule) (state->thread->process->dwfl, pc);
if (state->mod != NULL)
return state->mod;
@@ -765,6 +772,7 @@ dwfl_frame_module (Dwfl_Frame *state)
__libdwfl_seterrno (state->moderr);
return NULL;
}
+INTDEF (dwfl_frame_module)
Dwarf_Frame *
dwfl_frame_dwarf_frame (Dwfl_Frame *state, Dwarf_Addr *bias)
@@ -780,7 +788,10 @@ dwfl_frame_dwarf_frame (Dwfl_Frame *state, Dwarf_Addr *bias)
return NULL;
}
Dwarf_Addr pc;
- INTUSE(dwfl_frame_pc) (state, &pc, NULL);
+ bool isactivation;
+ INTUSE(dwfl_frame_pc) (state, &pc, &isactivation);
+ if (! isactivation)
+ pc--;
Dwarf_CFI *cfi = INTUSE(dwfl_module_eh_cfi) (state->mod,
&state->bias);
if (cfi
@@ -802,6 +813,7 @@ dwfl_frame_dwarf_frame (Dwfl_Frame *state, Dwarf_Addr *bias)
*bias = state->bias;
return state->frame;
}
+INTDEF (dwfl_frame_dwarf_frame)
bool
dwfl_frame_eval_expr (Dwfl_Frame *state, const Dwarf_Op *ops, size_t nops,
diff --git a/libdrgn/elfutils/libdwfl/gzip.c b/libdrgn/elfutils/libdwfl/gzip.c
index 043d0b6ed..e9988cc2b 100644
--- a/libdrgn/elfutils/libdwfl/gzip.c
+++ b/libdrgn/elfutils/libdwfl/gzip.c
@@ -153,7 +153,7 @@ open_stream (int fd, off_t start_offset, struct unzip_state *state)
if (unlikely (state->zf == NULL))
{
close (d);
- return zlib_fail (state, Z (MEM_ERROR));
+ return DWFL_E_NOMEM;
}
/* From here on, zlib will close D. */
diff --git a/libdrgn/elfutils/libdwfl/libdwflP.h b/libdrgn/elfutils/libdwfl/libdwflP.h
index eab003e66..613ccf016 100644
--- a/libdrgn/elfutils/libdwfl/libdwflP.h
+++ b/libdrgn/elfutils/libdwfl/libdwflP.h
@@ -261,8 +261,7 @@ struct Dwfl_Frame
Dwfl_Error moderr;
/* Error trying to get frame. */
Dwfl_Error frameerr;
- bool signal_frame : 1;
- bool initial_frame : 1;
+ bool isactivation;
enum
{
/* This structure is still being initialized or there was an error
@@ -775,12 +774,15 @@ INTDECL (dwfl_pid)
INTDECL (dwfl_thread_dwfl)
INTDECL (dwfl_thread_tid)
INTDECL (dwfl_frame_thread)
+INTDECL (dwfl_frame_module)
+INTDECL (dwfl_frame_dwarf_frame)
INTDECL (dwfl_thread_state_registers)
INTDECL (dwfl_thread_state_register_pc)
INTDECL (dwfl_getthread_frames)
INTDECL (dwfl_getthreads)
INTDECL (dwfl_thread_getframes)
INTDECL (dwfl_frame_pc)
+INTDECL (dwfl_frame_register)
/* Leading arguments standard to callbacks passed a Dwfl_Module. */
#define MODCB_ARGS(mod) (mod), &(mod)->userdata, (mod)->name, (mod)->low_addr
diff --git a/libdrgn/elfutils/libebl/ChangeLog b/libdrgn/elfutils/libebl/ChangeLog
index b32873104..90cf97281 100644
--- a/libdrgn/elfutils/libebl/ChangeLog
+++ b/libdrgn/elfutils/libebl/ChangeLog
@@ -1,3 +1,8 @@
+2020-04-17 Mark Wielaard
+
+ * eblopenbackend.c (default_debugscn_p): Handle .gnu.debuglto_
+ prefix.
+
2020-02-08 Mark Wielaard
* eblsegmenttypename.c (ebl_segment_type_name): Handle
diff --git a/libdrgn/elfutils/libebl/eblopenbackend.c b/libdrgn/elfutils/libebl/eblopenbackend.c
index 210b47e88..4ebde45f2 100644
--- a/libdrgn/elfutils/libebl/eblopenbackend.c
+++ b/libdrgn/elfutils/libebl/eblopenbackend.c
@@ -621,7 +621,9 @@ default_debugscn_p (const char *name)
for (size_t cnt = 0; cnt < ndwarf_scn_names; ++cnt)
if (strcmp (name, dwarf_scn_names[cnt]) == 0
|| (strncmp (name, ".zdebug", strlen (".zdebug")) == 0
- && strcmp (&name[2], &dwarf_scn_names[cnt][1]) == 0))
+ && strcmp (&name[2], &dwarf_scn_names[cnt][1]) == 0)
+ || (strncmp (name, ".gnu.debuglto_", strlen (".gnu.debuglto_")) == 0
+ && strcmp (&name[14], dwarf_scn_names[cnt]) == 0))
return true;
return false;
diff --git a/libdrgn/elfutils/libelf/ChangeLog b/libdrgn/elfutils/libelf/ChangeLog
index dde6c81df..56f5354c5 100644
--- a/libdrgn/elfutils/libelf/ChangeLog
+++ b/libdrgn/elfutils/libelf/ChangeLog
@@ -1,3 +1,18 @@
+2020-04-25 Mark Wielaard
+
+ * elf_compress.c (__libelf_compress): Remove free (out_buf).
+
+2020-03-18 Omar Sandoval
+
+ * elf_getphdrnum.c (__elf_getphdrnum_rdlock): Call
+ __elf{32,64}_getshdr_rdlock if the shdr is not cached.
+
+2019-03-20 Matthias Maennich
+
+ * elf_compress.c (__libelf_compress): Always call deflate_cleanup
+ in failure path. Call deflateEnd only once.
+ (__libelf_decompress): Call inflateEnd only once.
+
2019-06-18 Mark Wielaard
* common.h (allocate_elf): Use int64_t instead of off_t for offset.
diff --git a/libdrgn/elfutils/libelf/elf_compress.c b/libdrgn/elfutils/libelf/elf_compress.c
index 244467b5e..e5d3d2e09 100644
--- a/libdrgn/elfutils/libelf/elf_compress.c
+++ b/libdrgn/elfutils/libelf/elf_compress.c
@@ -113,9 +113,8 @@ __libelf_compress (Elf_Scn *scn, size_t hsize, int ei_data,
int zrc = deflateInit (&z, Z_BEST_COMPRESSION);
if (zrc != Z_OK)
{
- free (out_buf);
__libelf_seterrno (ELF_E_COMPRESS_ERROR);
- return NULL;
+ return deflate_cleanup(NULL, NULL);
}
Elf_Data cdata;
@@ -197,13 +196,13 @@ __libelf_compress (Elf_Scn *scn, size_t hsize, int ei_data,
}
while (flush != Z_FINISH); /* More data blocks. */
- zrc = deflateEnd (&z);
- if (zrc != Z_OK)
+ if (zrc != Z_STREAM_END)
{
__libelf_seterrno (ELF_E_COMPRESS_ERROR);
return deflate_cleanup (NULL, NULL);
}
+ deflateEnd (&z);
*new_size = used;
return out_buf;
}
@@ -251,16 +250,15 @@ __libelf_decompress (void *buf_in, size_t size_in, size_t size_out)
}
zrc = inflateReset (&z);
}
- if (likely (zrc == Z_OK))
- zrc = inflateEnd (&z);
if (unlikely (zrc != Z_OK) || unlikely (z.avail_out != 0))
{
free (buf_out);
+ buf_out = NULL;
__libelf_seterrno (ELF_E_DECOMPRESS_ERROR);
- return NULL;
}
+ inflateEnd(&z);
return buf_out;
}
diff --git a/libdrgn/elfutils/libelf/elf_getphdrnum.c b/libdrgn/elfutils/libelf/elf_getphdrnum.c
index f91cba981..53617dfc7 100644
--- a/libdrgn/elfutils/libelf/elf_getphdrnum.c
+++ b/libdrgn/elfutils/libelf/elf_getphdrnum.c
@@ -63,15 +63,23 @@ __elf_getphdrnum_rdlock (Elf *elf, size_t *dst)
if (elf->class == ELFCLASS32)
{
- if (likely (scns->cnt > 0
- && elf->state.elf32.scns.data[0].shdr.e32 != NULL))
- *dst = scns->data[0].shdr.e32->sh_info;
+ if (likely (scns->cnt > 0))
+ {
+ Elf_Scn *scn = &elf->state.elf32.scns.data[0];
+ Elf32_Shdr *shdr = scn->shdr.e32 ?: __elf32_getshdr_rdlock (scn);
+ if (shdr)
+ *dst = shdr->sh_info;
+ }
}
else
{
- if (likely (scns->cnt > 0
- && elf->state.elf64.scns.data[0].shdr.e64 != NULL))
- *dst = scns->data[0].shdr.e64->sh_info;
+ if (likely (scns->cnt > 0))
+ {
+ Elf_Scn *scn = &elf->state.elf64.scns.data[0];
+ Elf64_Shdr *shdr = scn->shdr.e64 ?: __elf64_getshdr_rdlock (scn);
+ if (shdr)
+ *dst = shdr->sh_info;
+ }
}
}
diff --git a/libdrgn/elfutils/po/ChangeLog b/libdrgn/elfutils/po/ChangeLog
index 884b16668..61c97fde4 100644
--- a/libdrgn/elfutils/po/ChangeLog
+++ b/libdrgn/elfutils/po/ChangeLog
@@ -1,3 +1,7 @@
+2020-03-30 Mark Wielaard
+
+ * *.po: Update for 0.179.
+
2019-11-26 Mark Wielaard
* *.po: Update for 0.178.
diff --git a/libdrgn/elfutils/po/de.po b/libdrgn/elfutils/po/de.po
index a9b6897ab..528c8df55 100644
--- a/libdrgn/elfutils/po/de.po
+++ b/libdrgn/elfutils/po/de.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: elfutils VERSION\n"
"Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2019-11-26 09:48+0100\n"
+"POT-Creation-Date: 2020-03-30 12:56+0200\n"
"PO-Revision-Date: 2009-06-29 15:15+0200\n"
"Last-Translator: Michael Münch \n"
"Language-Team: German\n"
@@ -533,7 +533,7 @@ msgstr "Kein Backend"
#: libebl/eblcorenotetypename.c:100 libebl/eblobjnotetypename.c:77
#: libebl/eblobjnotetypename.c:109 libebl/eblobjnotetypename.c:130
#: libebl/eblosabiname.c:73 libebl/eblsectionname.c:83
-#: libebl/eblsectiontypename.c:115 libebl/eblsegmenttypename.c:79
+#: libebl/eblsectiontypename.c:115 libebl/eblsegmenttypename.c:85
msgid ""
msgstr ""
@@ -1671,14 +1671,14 @@ msgid ""
"section [%2d] '%s': section group [%2zu] '%s' does not precede group member\n"
msgstr ""
-#: src/elflint.c:610 src/elflint.c:1494 src/elflint.c:1545 src/elflint.c:1651
-#: src/elflint.c:1987 src/elflint.c:2313 src/elflint.c:2932 src/elflint.c:3095
-#: src/elflint.c:3243 src/elflint.c:3433 src/elflint.c:4431
+#: src/elflint.c:610 src/elflint.c:1498 src/elflint.c:1549 src/elflint.c:1655
+#: src/elflint.c:1991 src/elflint.c:2317 src/elflint.c:2936 src/elflint.c:3099
+#: src/elflint.c:3247 src/elflint.c:3437 src/elflint.c:4435
#, c-format
msgid "section [%2d] '%s': cannot get section data\n"
msgstr ""
-#: src/elflint.c:623 src/elflint.c:1658
+#: src/elflint.c:623 src/elflint.c:1662
#, c-format
msgid ""
"section [%2d] '%s': referenced as string table for section [%2d] '%s' but "
@@ -1697,40 +1697,47 @@ msgstr ""
msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
msgstr ""
-#: src/elflint.c:667
+#: src/elflint.c:662
+#, c-format
+msgid ""
+"section [%2u] '%s': number of local entries in 'st_info' larger than table "
+"size\n"
+msgstr ""
+
+#: src/elflint.c:671
#, c-format
msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
msgstr ""
-#: src/elflint.c:672 src/elflint.c:675 src/elflint.c:678 src/elflint.c:681
-#: src/elflint.c:684 src/elflint.c:687
+#: src/elflint.c:676 src/elflint.c:679 src/elflint.c:682 src/elflint.c:685
+#: src/elflint.c:688 src/elflint.c:691
#, c-format
msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
msgstr ""
-#: src/elflint.c:690
+#: src/elflint.c:694
#, c-format
msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
msgstr ""
-#: src/elflint.c:700
+#: src/elflint.c:704
#, c-format
msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
msgstr ""
-#: src/elflint.c:709
+#: src/elflint.c:713
#, c-format
msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
msgstr ""
-#: src/elflint.c:724
+#: src/elflint.c:728
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: too large section index but no extended "
"section index section\n"
msgstr ""
-#: src/elflint.c:730
+#: src/elflint.c:734
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
@@ -1738,116 +1745,116 @@ msgid ""
msgstr ""
#. || sym->st_shndx > SHN_HIRESERVE always false
-#: src/elflint.c:742
+#: src/elflint.c:746
#, c-format
msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
msgstr ""
-#: src/elflint.c:750
+#: src/elflint.c:754
#, c-format
msgid "section [%2d] '%s': symbol %zu: unknown type\n"
msgstr ""
-#: src/elflint.c:756
+#: src/elflint.c:760
#, c-format
msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
msgstr ""
-#: src/elflint.c:761
+#: src/elflint.c:765
#, c-format
msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
msgstr ""
-#: src/elflint.c:769
+#: src/elflint.c:773
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
msgstr ""
-#: src/elflint.c:773
+#: src/elflint.c:777
#, c-format
msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
msgstr ""
-#: src/elflint.c:777
+#: src/elflint.c:781
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
msgstr ""
-#: src/elflint.c:828
+#: src/elflint.c:832
#, c-format
msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
msgstr ""
-#: src/elflint.c:834 src/elflint.c:859 src/elflint.c:908
+#: src/elflint.c:838 src/elflint.c:863 src/elflint.c:912
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu does not fit completely in referenced section "
"[%2d] '%s'\n"
msgstr ""
-#: src/elflint.c:843
+#: src/elflint.c:847
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
"SHF_TLS flag set\n"
msgstr ""
-#: src/elflint.c:853 src/elflint.c:901
+#: src/elflint.c:857 src/elflint.c:905
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
"[%2d] '%s'\n"
msgstr ""
-#: src/elflint.c:880
+#: src/elflint.c:884
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
msgstr ""
-#: src/elflint.c:886
+#: src/elflint.c:890
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: TLS symbol but couldn't get TLS program "
"header entry\n"
msgstr ""
-#: src/elflint.c:894
+#: src/elflint.c:898
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] "
"'%s'\n"
msgstr ""
-#: src/elflint.c:921
+#: src/elflint.c:925
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: local symbol outside range described in "
"sh_info\n"
msgstr ""
-#: src/elflint.c:928
+#: src/elflint.c:932
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
"sh_info\n"
msgstr ""
-#: src/elflint.c:935
+#: src/elflint.c:939
#, c-format
msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
msgstr ""
-#: src/elflint.c:985
+#: src/elflint.c:989
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section "
"[%2d]\n"
msgstr ""
-#: src/elflint.c:992
+#: src/elflint.c:996
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] "
@@ -1857,1367 +1864,1367 @@ msgstr ""
#. 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:1008
+#: src/elflint.c:1012
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %# does not "
"match %s section address %#\n"
msgstr ""
-#: src/elflint.c:1015
+#: src/elflint.c:1019
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size % does not "
"match %s section size %\n"
msgstr ""
-#: src/elflint.c:1023
+#: src/elflint.c:1027
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
"section\n"
msgstr ""
-#: src/elflint.c:1039
+#: src/elflint.c:1043
#, c-format
msgid ""
"section [%2d] '%s': _DYNAMIC_ symbol value %# does not match dynamic "
"segment address %#\n"
msgstr ""
-#: src/elflint.c:1046
+#: src/elflint.c:1050
#, c-format
msgid ""
"section [%2d] '%s': _DYNAMIC symbol size % does not match dynamic "
"segment size %\n"
msgstr ""
-#: src/elflint.c:1059
+#: src/elflint.c:1063
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
"default visibility\n"
msgstr ""
-#: src/elflint.c:1063
+#: src/elflint.c:1067
#, c-format
msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
msgstr ""
-#: src/elflint.c:1101
+#: src/elflint.c:1105
#, fuzzy, c-format
msgid "section [%2d] '%s': cannot get section data.\n"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/elflint.c:1117
+#: src/elflint.c:1121
#, c-format
msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
msgstr ""
-#: src/elflint.c:1128 src/elflint.c:1181
+#: src/elflint.c:1132 src/elflint.c:1185
#, c-format
msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
msgstr ""
-#: src/elflint.c:1153 src/elflint.c:1206
+#: src/elflint.c:1157 src/elflint.c:1210
#, c-format
msgid ""
"section [%2d] '%s': relative relocations after index %d as specified by "
"DT_RELCOUNT\n"
msgstr ""
-#: src/elflint.c:1159 src/elflint.c:1212
+#: src/elflint.c:1163 src/elflint.c:1216
#, c-format
msgid ""
"section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
"specified %d relative relocations\n"
msgstr ""
-#: src/elflint.c:1171
+#: src/elflint.c:1175
#, c-format
msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
msgstr ""
-#: src/elflint.c:1254
+#: src/elflint.c:1258
#, c-format
msgid "section [%2d] '%s': invalid destination section index\n"
msgstr ""
-#: src/elflint.c:1266
+#: src/elflint.c:1270
#, c-format
msgid "section [%2d] '%s': invalid destination section type\n"
msgstr ""
-#: src/elflint.c:1274
+#: src/elflint.c:1278
#, c-format
msgid "section [%2d] '%s': sh_info should be zero\n"
msgstr ""
-#: src/elflint.c:1282
+#: src/elflint.c:1286
#, fuzzy, c-format
msgid ""
"section [%2d] '%s': no relocations for merge-able string sections possible\n"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/elflint.c:1290
+#: src/elflint.c:1294
#, c-format
msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
msgstr ""
-#: src/elflint.c:1350
+#: src/elflint.c:1354
#, c-format
msgid "text relocation flag set but there is no read-only segment\n"
msgstr ""
-#: src/elflint.c:1377
+#: src/elflint.c:1381
#, c-format
msgid "section [%2d] '%s': relocation %zu: invalid type\n"
msgstr ""
-#: src/elflint.c:1385
+#: src/elflint.c:1389
#, c-format
msgid ""
"section [%2d] '%s': relocation %zu: relocation type invalid for the file "
"type\n"
msgstr ""
-#: src/elflint.c:1393
+#: src/elflint.c:1397
#, c-format
msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
msgstr ""
-#: src/elflint.c:1411
+#: src/elflint.c:1415
#, c-format
msgid ""
"section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
"be used with %s\n"
msgstr ""
-#: src/elflint.c:1428
+#: src/elflint.c:1432
#, c-format
msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
msgstr ""
-#: src/elflint.c:1443
+#: src/elflint.c:1447
#, c-format
msgid ""
"section [%2d] '%s': relocation %zu: copy relocation against symbol of type "
"%s\n"
msgstr ""
-#: src/elflint.c:1464
+#: src/elflint.c:1468
#, c-format
msgid ""
"section [%2d] '%s': relocation %zu: read-only section modified but text "
"relocation flag not set\n"
msgstr ""
-#: src/elflint.c:1479
+#: src/elflint.c:1483
#, c-format
msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
msgstr ""
-#: src/elflint.c:1519 src/elflint.c:1570
+#: src/elflint.c:1523 src/elflint.c:1574
#, c-format
msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
msgstr ""
-#: src/elflint.c:1646
+#: src/elflint.c:1650
#, c-format
msgid "more than one dynamic section present\n"
msgstr ""
-#: src/elflint.c:1664
+#: src/elflint.c:1668
#, c-format
msgid ""
"section [%2d]: referenced as string table for section [%2d] '%s' but section "
"link value is invalid\n"
msgstr ""
-#: src/elflint.c:1672
+#: src/elflint.c:1676
#, c-format
msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
msgstr ""
-#: src/elflint.c:1677 src/elflint.c:1966
+#: src/elflint.c:1681 src/elflint.c:1970
#, c-format
msgid "section [%2d] '%s': sh_info not zero\n"
msgstr ""
-#: src/elflint.c:1687
+#: src/elflint.c:1691
#, c-format
msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
msgstr ""
-#: src/elflint.c:1695
+#: src/elflint.c:1699
#, c-format
msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
msgstr ""
-#: src/elflint.c:1702
+#: src/elflint.c:1706
#, c-format
msgid "section [%2d] '%s': entry %zu: unknown tag\n"
msgstr ""
-#: src/elflint.c:1713
+#: src/elflint.c:1717
#, c-format
msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
msgstr ""
-#: src/elflint.c:1723
+#: src/elflint.c:1727
#, c-format
msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
msgstr ""
-#: src/elflint.c:1741
+#: src/elflint.c:1745
#, c-format
msgid ""
"section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
msgstr ""
-#: src/elflint.c:1754
+#: src/elflint.c:1758
#, 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:1797
+#: src/elflint.c:1801
#, c-format
msgid ""
"section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
msgstr ""
-#: src/elflint.c:1812
+#: src/elflint.c:1816
#, c-format
msgid ""
"section [%2d] '%s': entry %zu: %s value must be valid offset in section "
"[%2d] '%s'\n"
msgstr ""
-#: src/elflint.c:1832 src/elflint.c:1860
+#: src/elflint.c:1836 src/elflint.c:1864
#, c-format
msgid "section [%2d] '%s': contains %s entry but not %s\n"
msgstr ""
-#: src/elflint.c:1844
+#: src/elflint.c:1848
#, c-format
msgid "section [%2d] '%s': mandatory tag %s not present\n"
msgstr ""
-#: src/elflint.c:1853
+#: src/elflint.c:1857
#, c-format
msgid "section [%2d] '%s': no hash section present\n"
msgstr ""
-#: src/elflint.c:1868 src/elflint.c:1875
+#: src/elflint.c:1872 src/elflint.c:1879
#, c-format
msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
msgstr ""
-#: src/elflint.c:1885 src/elflint.c:1889
+#: src/elflint.c:1889 src/elflint.c:1893
#, c-format
msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
msgstr ""
-#: src/elflint.c:1895
+#: src/elflint.c:1899
#, c-format
msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
msgstr ""
-#: src/elflint.c:1906 src/elflint.c:1910 src/elflint.c:1914 src/elflint.c:1918
+#: src/elflint.c:1910 src/elflint.c:1914 src/elflint.c:1918 src/elflint.c:1922
#, c-format
msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
msgstr ""
-#: src/elflint.c:1930
+#: src/elflint.c:1934
#, c-format
msgid ""
"section [%2d] '%s': only relocatable files can have extended section index\n"
msgstr ""
-#: src/elflint.c:1940
+#: src/elflint.c:1944
#, c-format
msgid ""
"section [%2d] '%s': extended section index section not for symbol table\n"
msgstr ""
-#: src/elflint.c:1944
+#: src/elflint.c:1948
#, c-format
msgid "section [%2d] '%s': sh_link extended section index [%2d] is invalid\n"
msgstr ""
-#: src/elflint.c:1949
+#: src/elflint.c:1953
#, c-format
msgid "cannot get data for symbol section\n"
msgstr ""
-#: src/elflint.c:1952
+#: src/elflint.c:1956
#, c-format
msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
msgstr ""
-#: src/elflint.c:1961
+#: src/elflint.c:1965
#, c-format
msgid "section [%2d] '%s': extended index table too small for symbol table\n"
msgstr ""
-#: src/elflint.c:1976
+#: src/elflint.c:1980
#, c-format
msgid ""
"section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
"same symbol table\n"
msgstr ""
-#: src/elflint.c:1994
+#: src/elflint.c:1998
#, c-format
msgid "symbol 0 should have zero extended section index\n"
msgstr ""
-#: src/elflint.c:2006
+#: src/elflint.c:2010
#, c-format
msgid "cannot get data for symbol %zu\n"
msgstr ""
-#: src/elflint.c:2011
+#: src/elflint.c:2015
#, c-format
msgid "extended section index is % but symbol index is not XINDEX\n"
msgstr ""
-#: src/elflint.c:2028 src/elflint.c:2085
+#: src/elflint.c:2032 src/elflint.c:2089
#, c-format
msgid ""
"section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
msgstr ""
-#: src/elflint.c:2042 src/elflint.c:2099
+#: src/elflint.c:2046 src/elflint.c:2103
#, c-format
msgid "section [%2d] '%s': chain array too large\n"
msgstr ""
-#: src/elflint.c:2056 src/elflint.c:2113
+#: src/elflint.c:2060 src/elflint.c:2117
#, c-format
msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
msgstr ""
-#: src/elflint.c:2066
+#: src/elflint.c:2070
#, c-format
msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
msgstr ""
-#: src/elflint.c:2123
+#: src/elflint.c:2127
#, c-format
msgid "section [%2d] '%s': hash chain reference % out of bounds\n"
msgstr ""
-#: src/elflint.c:2136
+#: src/elflint.c:2140
#, c-format
msgid "section [%2d] '%s': not enough data\n"
msgstr ""
-#: src/elflint.c:2148
+#: src/elflint.c:2152
#, c-format
msgid "section [%2d] '%s': bitmask size zero or not power of 2: %u\n"
msgstr ""
-#: src/elflint.c:2164
+#: src/elflint.c:2168
#, c-format
msgid ""
"section [%2d] '%s': hash table section is too small (is %ld, expected at "
"least %ld)\n"
msgstr ""
-#: src/elflint.c:2173
+#: src/elflint.c:2177
#, c-format
msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
msgstr ""
-#: src/elflint.c:2207
+#: src/elflint.c:2211
#, c-format
msgid ""
"section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
msgstr ""
-#: src/elflint.c:2228
+#: src/elflint.c:2232
#, c-format
msgid ""
"section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
"undefined\n"
msgstr ""
-#: src/elflint.c:2241
+#: src/elflint.c:2245
#, c-format
msgid ""
"section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
msgstr ""
-#: src/elflint.c:2250
+#: src/elflint.c:2254
#, c-format
msgid ""
"section [%2d] '%s': mask index for symbol %u in chain for bucket %zu wrong\n"
msgstr ""
-#: src/elflint.c:2280
+#: src/elflint.c:2284
#, c-format
msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
msgstr ""
-#: src/elflint.c:2285
+#: src/elflint.c:2289
#, c-format
msgid ""
"section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
msgstr ""
-#: src/elflint.c:2291
+#: src/elflint.c:2295
#, c-format
msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
msgstr ""
-#: src/elflint.c:2304
+#: src/elflint.c:2308
#, c-format
msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
msgstr ""
-#: src/elflint.c:2322
+#: src/elflint.c:2326
#, c-format
msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
msgstr ""
-#: src/elflint.c:2326
+#: src/elflint.c:2330
#, c-format
msgid "section [%2d] '%s': invalid sh_link symbol table section index [%2d]\n"
msgstr ""
-#: src/elflint.c:2336
+#: src/elflint.c:2340
#, c-format
msgid "section [%2d] '%s': hash table entry size incorrect\n"
msgstr ""
-#: src/elflint.c:2341
+#: src/elflint.c:2345
#, c-format
msgid "section [%2d] '%s': not marked to be allocated\n"
msgstr ""
-#: src/elflint.c:2346
+#: src/elflint.c:2350
#, c-format
msgid ""
"section [%2d] '%s': hash table has not even room for initial administrative "
"entries\n"
msgstr ""
-#: src/elflint.c:2395
+#: src/elflint.c:2399
#, c-format
msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
msgstr ""
-#: src/elflint.c:2419 src/elflint.c:2484 src/elflint.c:2519
+#: src/elflint.c:2423 src/elflint.c:2488 src/elflint.c:2523
#, c-format
msgid "hash section [%2zu] '%s' does not contain enough data\n"
msgstr ""
-#: src/elflint.c:2440
+#: src/elflint.c:2444
#, c-format
msgid "hash section [%2zu] '%s' has zero bit mask words\n"
msgstr ""
-#: src/elflint.c:2451 src/elflint.c:2495 src/elflint.c:2532
+#: src/elflint.c:2455 src/elflint.c:2499 src/elflint.c:2536
#, c-format
msgid "hash section [%2zu] '%s' uses too much data\n"
msgstr ""
-#: src/elflint.c:2466
+#: src/elflint.c:2470
#, c-format
msgid ""
"hash section [%2zu] '%s' invalid symbol index % (max_nsyms: "
"%, nentries: %\n"
msgstr ""
-#: src/elflint.c:2553
+#: src/elflint.c:2557
#, c-format
msgid "hash section [%2zu] '%s' invalid sh_entsize\n"
msgstr ""
-#: src/elflint.c:2563 src/elflint.c:2567
+#: src/elflint.c:2567 src/elflint.c:2571
#, c-format
msgid "section [%2zu] '%s': reference to symbol index 0\n"
msgstr ""
-#: src/elflint.c:2574
+#: src/elflint.c:2578
#, 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:2586
+#: src/elflint.c:2590
#, 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:2602
+#: src/elflint.c:2606
#, c-format
msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
msgstr ""
-#: src/elflint.c:2622
+#: src/elflint.c:2626
#, c-format
msgid ""
"section [%2d] '%s': section groups only allowed in relocatable object files\n"
msgstr ""
-#: src/elflint.c:2633
+#: src/elflint.c:2637
#, c-format
msgid "section [%2d] '%s': cannot get symbol table: %s\n"
msgstr ""
-#: src/elflint.c:2638
+#: src/elflint.c:2642
#, c-format
msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
msgstr ""
-#: src/elflint.c:2644
+#: src/elflint.c:2648
#, c-format
msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
msgstr ""
-#: src/elflint.c:2649
+#: src/elflint.c:2653
#, c-format
msgid "section [%2d] '%s': sh_flags not zero\n"
msgstr ""
-#: src/elflint.c:2656
+#: src/elflint.c:2660
#, c-format
msgid "section [%2d] '%s': cannot get symbol for signature\n"
msgstr ""
-#: src/elflint.c:2660
+#: src/elflint.c:2664
#, c-format
msgid "section [%2d] '%s': cannot get symbol name for signature\n"
msgstr ""
-#: src/elflint.c:2665
+#: src/elflint.c:2669
#, c-format
msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
msgstr ""
-#: src/elflint.c:2671
+#: src/elflint.c:2675
#, c-format
msgid "section [%2d] '%s': sh_flags not set correctly\n"
msgstr ""
-#: src/elflint.c:2677
+#: src/elflint.c:2681
#, c-format
msgid "section [%2d] '%s': cannot get data: %s\n"
msgstr ""
-#: src/elflint.c:2686
+#: src/elflint.c:2690
#, c-format
msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
msgstr ""
-#: src/elflint.c:2692
+#: src/elflint.c:2696
#, c-format
msgid "section [%2d] '%s': section group without flags word\n"
msgstr ""
-#: src/elflint.c:2700
+#: src/elflint.c:2704
#, c-format
msgid "section [%2d] '%s': section group without member\n"
msgstr ""
-#: src/elflint.c:2704
+#: src/elflint.c:2708
#, c-format
msgid "section [%2d] '%s': section group with only one member\n"
msgstr ""
-#: src/elflint.c:2715
+#: src/elflint.c:2719
#, c-format
msgid "section [%2d] '%s': unknown section group flags\n"
msgstr ""
-#: src/elflint.c:2727
+#: src/elflint.c:2731
#, fuzzy, c-format
msgid "section [%2d] '%s': section index %zu out of range\n"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/elflint.c:2736
+#: src/elflint.c:2740
#, c-format
msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
msgstr ""
-#: src/elflint.c:2743
+#: src/elflint.c:2747
#, c-format
msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
msgstr ""
-#: src/elflint.c:2749
+#: src/elflint.c:2753
#, c-format
msgid ""
"section [%2d] '%s': element %zu references section [%2d] '%s' without "
"SHF_GROUP flag set\n"
msgstr ""
-#: src/elflint.c:2756
+#: src/elflint.c:2760
#, c-format
msgid "section [%2d] '%s' is contained in more than one section group\n"
msgstr ""
-#: src/elflint.c:2946
+#: src/elflint.c:2950
#, 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:2958
+#: src/elflint.c:2962
#, c-format
msgid ""
"section [%2d] '%s' has different number of entries than symbol table [%2d] "
"'%s'\n"
msgstr ""
-#: src/elflint.c:2974
+#: src/elflint.c:2978
#, c-format
msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
msgstr ""
-#: src/elflint.c:2990
+#: src/elflint.c:2994
#, c-format
msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
msgstr ""
-#: src/elflint.c:2998
+#: src/elflint.c:3002
#, c-format
msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
msgstr ""
-#: src/elflint.c:3012
+#: src/elflint.c:3016
#, c-format
msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
msgstr ""
-#: src/elflint.c:3017
+#: src/elflint.c:3021
#, c-format
msgid ""
"section [%2d] '%s': symbol %d: version index %d is for defined version\n"
msgstr ""
-#: src/elflint.c:3027
+#: src/elflint.c:3031
#, c-format
msgid ""
"section [%2d] '%s': symbol %d: version index %d is for requested version\n"
msgstr ""
-#: src/elflint.c:3080
+#: src/elflint.c:3084
#, c-format
msgid "more than one version reference section present\n"
msgstr ""
-#: src/elflint.c:3088 src/elflint.c:3235
+#: src/elflint.c:3092 src/elflint.c:3239
#, c-format
msgid "section [%2d] '%s': sh_link does not link to string table\n"
msgstr ""
-#: src/elflint.c:3113 src/elflint.c:3289
+#: src/elflint.c:3117 src/elflint.c:3293
#, c-format
msgid "section [%2d] '%s': entry %d has wrong version %d\n"
msgstr ""
-#: src/elflint.c:3120 src/elflint.c:3296
+#: src/elflint.c:3124 src/elflint.c:3300
#, c-format
msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
msgstr ""
-#: src/elflint.c:3130
+#: src/elflint.c:3134
#, c-format
msgid "section [%2d] '%s': entry %d has invalid file reference\n"
msgstr ""
-#: src/elflint.c:3138
+#: src/elflint.c:3142
#, c-format
msgid "section [%2d] '%s': entry %d references unknown dependency\n"
msgstr ""
-#: src/elflint.c:3150
+#: src/elflint.c:3154
#, c-format
msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
msgstr ""
-#: src/elflint.c:3158
+#: src/elflint.c:3162
#, c-format
msgid ""
"section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
"reference\n"
msgstr ""
-#: src/elflint.c:3167
+#: src/elflint.c:3171
#, c-format
msgid ""
"section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: "
"%#x, expected %#x\n"
msgstr ""
-#: src/elflint.c:3176
+#: src/elflint.c:3180
#, c-format
msgid ""
"section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
"name '%s'\n"
msgstr ""
-#: src/elflint.c:3187
+#: src/elflint.c:3191
#, c-format
msgid ""
"section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
msgstr ""
-#: src/elflint.c:3204 src/elflint.c:3380
+#: src/elflint.c:3208 src/elflint.c:3384
#, c-format
msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
msgstr ""
-#: src/elflint.c:3212 src/elflint.c:3388
+#: src/elflint.c:3216 src/elflint.c:3392
#, c-format
msgid ""
"section [%2d] '%s': entry %d has zero offset to next entry, but sh_info says "
"there are more entries\n"
msgstr ""
-#: src/elflint.c:3227
+#: src/elflint.c:3231
#, c-format
msgid "more than one version definition section present\n"
msgstr ""
-#: src/elflint.c:3274
+#: src/elflint.c:3278
#, c-format
msgid "section [%2d] '%s': more than one BASE definition\n"
msgstr ""
-#: src/elflint.c:3278
+#: src/elflint.c:3282
#, c-format
msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
msgstr ""
-#: src/elflint.c:3284
+#: src/elflint.c:3288
#, c-format
msgid "section [%2d] '%s': entry %d has unknown flag\n"
msgstr ""
-#: src/elflint.c:3311
+#: src/elflint.c:3315
#, c-format
msgid "section [%2d] '%s': entry %d has invalid name reference\n"
msgstr ""
-#: src/elflint.c:3318
+#: src/elflint.c:3322
#, c-format
msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
msgstr ""
-#: src/elflint.c:3326
+#: src/elflint.c:3330
#, c-format
msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
msgstr ""
-#: src/elflint.c:3346
+#: src/elflint.c:3350
#, c-format
msgid ""
"section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
msgstr ""
-#: src/elflint.c:3363
+#: src/elflint.c:3367
#, c-format
msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
msgstr ""
-#: src/elflint.c:3396
+#: src/elflint.c:3400
#, c-format
msgid "section [%2d] '%s': no BASE definition\n"
msgstr ""
-#: src/elflint.c:3412
+#: src/elflint.c:3416
#, c-format
msgid "section [%2d] '%s': unknown parent version '%s'\n"
msgstr ""
-#: src/elflint.c:3425
+#: src/elflint.c:3429
#, c-format
msgid "section [%2d] '%s': empty object attributes section\n"
msgstr ""
-#: src/elflint.c:3446
+#: src/elflint.c:3450
#, c-format
msgid "section [%2d] '%s': unrecognized attribute format\n"
msgstr ""
-#: src/elflint.c:3462
+#: src/elflint.c:3466
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: zero length field in attribute section\n"
msgstr ""
-#: src/elflint.c:3471
+#: src/elflint.c:3475
#, c-format
msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
msgstr ""
-#: src/elflint.c:3483
+#: src/elflint.c:3487
#, c-format
msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
msgstr ""
-#: src/elflint.c:3500
+#: src/elflint.c:3504
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
msgstr ""
-#: src/elflint.c:3509
+#: src/elflint.c:3513
#, c-format
msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
msgstr ""
-#: src/elflint.c:3518
+#: src/elflint.c:3522
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
msgstr ""
-#: src/elflint.c:3533
+#: src/elflint.c:3537
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
msgstr ""
#. Tag_File
-#: src/elflint.c:3544
+#: src/elflint.c:3548
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
msgstr ""
-#: src/elflint.c:3562
+#: src/elflint.c:3566
#, c-format
msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
msgstr ""
-#: src/elflint.c:3573
+#: src/elflint.c:3577
#, c-format
msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
msgstr ""
-#: src/elflint.c:3586
+#: src/elflint.c:3590
#, c-format
msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
msgstr ""
-#: src/elflint.c:3590
+#: src/elflint.c:3594
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: unrecognized %s attribute value %\n"
msgstr ""
-#: src/elflint.c:3600
+#: src/elflint.c:3604
#, c-format
msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
msgstr ""
-#: src/elflint.c:3606
+#: src/elflint.c:3610
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
msgstr ""
-#: src/elflint.c:3695
+#: src/elflint.c:3699
#, c-format
msgid "cannot get section header of zeroth section\n"
msgstr ""
-#: src/elflint.c:3699
+#: src/elflint.c:3703
#, c-format
msgid "zeroth section has nonzero name\n"
msgstr ""
-#: src/elflint.c:3701
+#: src/elflint.c:3705
#, c-format
msgid "zeroth section has nonzero type\n"
msgstr ""
-#: src/elflint.c:3703
+#: src/elflint.c:3707
#, c-format
msgid "zeroth section has nonzero flags\n"
msgstr ""
-#: src/elflint.c:3705
+#: src/elflint.c:3709
#, c-format
msgid "zeroth section has nonzero address\n"
msgstr ""
-#: src/elflint.c:3707
+#: src/elflint.c:3711
#, c-format
msgid "zeroth section has nonzero offset\n"
msgstr ""
-#: src/elflint.c:3709
+#: src/elflint.c:3713
#, c-format
msgid "zeroth section has nonzero align value\n"
msgstr ""
-#: src/elflint.c:3711
+#: src/elflint.c:3715
#, c-format
msgid "zeroth section has nonzero entry size value\n"
msgstr ""
-#: src/elflint.c:3714
+#: src/elflint.c:3718
#, c-format
msgid ""
"zeroth section has nonzero size value while ELF header has nonzero shnum "
"value\n"
msgstr ""
-#: src/elflint.c:3718
+#: src/elflint.c:3722
#, c-format
msgid ""
"zeroth section has nonzero link value while ELF header does not signal "
"overflow in shstrndx\n"
msgstr ""
-#: src/elflint.c:3722
+#: src/elflint.c:3726
#, c-format
msgid ""
"zeroth section has nonzero link value while ELF header does not signal "
"overflow in phnum\n"
msgstr ""
-#: src/elflint.c:3740
+#: src/elflint.c:3744
#, c-format
msgid "cannot get section header for section [%2zu] '%s': %s\n"
msgstr ""
-#: src/elflint.c:3749
+#: src/elflint.c:3753
#, c-format
msgid "section [%2zu]: invalid name\n"
msgstr ""
-#: src/elflint.c:3776
+#: src/elflint.c:3780
#, c-format
msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
msgstr ""
-#: src/elflint.c:3794
+#: src/elflint.c:3798
#, c-format
msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
msgstr ""
-#: src/elflint.c:3812
+#: src/elflint.c:3816
#, c-format
msgid ""
"section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
msgstr ""
-#: src/elflint.c:3830
+#: src/elflint.c:3834
#, c-format
msgid "section [%2zu] '%s' present in object file\n"
msgstr ""
-#: src/elflint.c:3836 src/elflint.c:3868
+#: src/elflint.c:3840 src/elflint.c:3872
#, c-format
msgid ""
"section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
msgstr ""
-#: src/elflint.c:3841 src/elflint.c:3873
+#: src/elflint.c:3845 src/elflint.c:3877
#, c-format
msgid ""
"section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
"segments\n"
msgstr ""
-#: src/elflint.c:3849
+#: src/elflint.c:3853
#, c-format
msgid ""
"section [%2zu] '%s' is extension section index table in non-object file\n"
msgstr ""
-#: src/elflint.c:3892
+#: src/elflint.c:3896
#, c-format
msgid "section [%2zu] '%s': size not multiple of entry size\n"
msgstr ""
-#: src/elflint.c:3897
+#: src/elflint.c:3901
#, c-format
msgid "cannot get section header\n"
msgstr ""
-#: src/elflint.c:3907
+#: src/elflint.c:3911
#, c-format
msgid "section [%2zu] '%s' has unsupported type %d\n"
msgstr ""
-#: src/elflint.c:3922
+#: src/elflint.c:3926
#, c-format
msgid ""
"section [%2zu] '%s' contains invalid processor-specific flag(s) %#\n"
msgstr ""
-#: src/elflint.c:3929
+#: src/elflint.c:3933
#, c-format
msgid "section [%2zu] '%s' contains unknown flag(s) %#\n"
msgstr ""
-#: src/elflint.c:3937
+#: src/elflint.c:3941
#, c-format
msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
msgstr ""
-#: src/elflint.c:3947
+#: src/elflint.c:3951
#, fuzzy, c-format
msgid "section [%2zu] '%s': allocated section cannot be compressed\n"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/elflint.c:3952
+#: src/elflint.c:3956
#, fuzzy, c-format
msgid "section [%2zu] '%s': nobits section cannot be compressed\n"
msgstr "konnte Abschnittsdaten nicht holen: %s"
-#: src/elflint.c:3958
+#: src/elflint.c:3962
#, c-format
msgid ""
"section [%2zu] '%s': compressed section with no compression header: %s\n"
msgstr ""
-#: src/elflint.c:3964
+#: src/elflint.c:3968
#, c-format
msgid "section [%2zu] '%s': invalid section reference in link value\n"
msgstr ""
-#: src/elflint.c:3969
+#: src/elflint.c:3973
#, c-format
msgid "section [%2zu] '%s': invalid section reference in info value\n"
msgstr ""
-#: src/elflint.c:3976
+#: src/elflint.c:3980
#, c-format
msgid "section [%2zu] '%s': strings flag set without merge flag\n"
msgstr ""
-#: src/elflint.c:3981
+#: src/elflint.c:3985
#, c-format
msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
msgstr ""
-#: src/elflint.c:4000
+#: src/elflint.c:4004
#, c-format
msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
msgstr ""
-#: src/elflint.c:4009
+#: src/elflint.c:4013
#, c-format
msgid "section [%2zu] '%s' must be of type NOBITS in debuginfo files\n"
msgstr ""
-#: src/elflint.c:4016
+#: src/elflint.c:4020
#, c-format
msgid "section [%2zu] '%s' is both executable and writable\n"
msgstr ""
-#: src/elflint.c:4047
+#: src/elflint.c:4051
#, c-format
msgid ""
"section [%2zu] '%s' not fully contained in segment of program header entry "
"%d\n"
msgstr ""
-#: src/elflint.c:4057
+#: src/elflint.c:4061
#, 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:4083
+#: src/elflint.c:4087
#, c-format
msgid ""
"section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
"program header entry %d and file contents is non-zero\n"
msgstr ""
-#: src/elflint.c:4094
+#: src/elflint.c:4098
#, 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:4105
+#: src/elflint.c:4109
#, c-format
msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
msgstr ""
-#: src/elflint.c:4115
+#: src/elflint.c:4119
#, c-format
msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
msgstr ""
-#: src/elflint.c:4125
+#: src/elflint.c:4129
#, c-format
msgid ""
"section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
msgstr ""
-#: src/elflint.c:4131
+#: src/elflint.c:4135
#, 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:4139
+#: src/elflint.c:4143
#, c-format
msgid ""
"section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
msgstr ""
-#: src/elflint.c:4190
+#: src/elflint.c:4194
#, c-format
msgid "more than one version symbol table present\n"
msgstr ""
-#: src/elflint.c:4213
+#: src/elflint.c:4217
#, c-format
msgid "INTERP program header entry but no .interp section\n"
msgstr ""
-#: src/elflint.c:4224
+#: src/elflint.c:4228
#, c-format
msgid ""
"loadable segment [%u] is executable but contains no executable sections\n"
msgstr ""
-#: src/elflint.c:4230
+#: src/elflint.c:4234
#, c-format
msgid "loadable segment [%u] is writable but contains no writable sections\n"
msgstr ""
-#: src/elflint.c:4241
+#: src/elflint.c:4245
#, c-format
msgid ""
"no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
"exist\n"
msgstr ""
-#: src/elflint.c:4254
+#: src/elflint.c:4258
#, c-format
msgid "duplicate version index %d\n"
msgstr ""
-#: src/elflint.c:4268
+#: src/elflint.c:4272
#, c-format
msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
msgstr ""
-#: src/elflint.c:4317
+#: src/elflint.c:4321
#, c-format
msgid "phdr[%d]: unknown core file note type % at offset %\n"
msgstr ""
-#: src/elflint.c:4321
+#: src/elflint.c:4325
#, c-format
msgid ""
"section [%2d] '%s': unknown core file note type % at offset %zu\n"
msgstr ""
-#: src/elflint.c:4370
+#: src/elflint.c:4374
#, c-format
msgid ""
"phdr[%d]: unknown object file note type % with owner name '%s' at "
"offset %zu\n"
msgstr ""
-#: src/elflint.c:4375
+#: src/elflint.c:4379
#, c-format
msgid ""
"section [%2d] '%s': unknown object file note type % with owner name "
"'%s' at offset %zu\n"
msgstr ""
-#: src/elflint.c:4394
+#: src/elflint.c:4398
#, c-format
msgid "phdr[%d]: no note entries defined for the type of file\n"
msgstr ""
-#: src/elflint.c:4414
+#: src/elflint.c:4418
#, c-format
msgid "phdr[%d]: cannot get content of note section: %s\n"
msgstr ""
-#: src/elflint.c:4417
+#: src/elflint.c:4421
#, c-format
msgid "phdr[%d]: extra % bytes after last note\n"
msgstr ""
-#: src/elflint.c:4438
+#: src/elflint.c:4442
#, c-format
msgid "section [%2d] '%s': no note entries defined for the type of file\n"
msgstr ""
-#: src/elflint.c:4445
+#: src/elflint.c:4449
#, c-format
msgid "section [%2d] '%s': cannot get content of note section\n"
msgstr ""
-#: src/elflint.c:4448
+#: src/elflint.c:4452
#, c-format
msgid "section [%2d] '%s': extra % bytes after last note\n"
msgstr ""
-#: src/elflint.c:4466
+#: src/elflint.c:4470
#, c-format
msgid ""
"only executables, shared objects, and core files can have program headers\n"
msgstr ""
-#: src/elflint.c:4481
+#: src/elflint.c:4485
#, c-format
msgid "cannot get program header entry %d: %s\n"
msgstr ""
-#: src/elflint.c:4490
+#: src/elflint.c:4499
#, c-format
msgid "program header entry %d: unknown program header entry type %#\n"
msgstr ""
-#: src/elflint.c:4501
+#: src/elflint.c:4510
#, c-format
msgid "more than one INTERP entry in program header\n"
msgstr ""
-#: src/elflint.c:4509
+#: src/elflint.c:4518
#, c-format
msgid "more than one TLS entry in program header\n"
msgstr ""
-#: src/elflint.c:4516
+#: src/elflint.c:4525
#, c-format
msgid "static executable cannot have dynamic sections\n"
msgstr ""
-#: src/elflint.c:4530
+#: src/elflint.c:4539
#, c-format
msgid "dynamic section reference in program header has wrong offset\n"
msgstr ""
-#: src/elflint.c:4533
+#: src/elflint.c:4542
#, c-format
msgid "dynamic section size mismatch in program and section header\n"
msgstr ""
-#: src/elflint.c:4543
+#: src/elflint.c:4552
#, c-format
msgid "more than one GNU_RELRO entry in program header\n"
msgstr ""
-#: src/elflint.c:4564
+#: src/elflint.c:4573
#, c-format
msgid "loadable segment GNU_RELRO applies to is not writable\n"
msgstr ""
-#: src/elflint.c:4575
+#: src/elflint.c:4584
#, c-format
msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
msgstr ""
-#: src/elflint.c:4582
+#: src/elflint.c:4591
#, c-format
msgid ""
"GNU_RELRO [%u] flags are not a subset of the loadable segment [%u] flags\n"
msgstr ""
-#: src/elflint.c:4591 src/elflint.c:4614
+#: src/elflint.c:4600 src/elflint.c:4623
#, c-format
msgid "%s segment not contained in a loaded segment\n"
msgstr ""
-#: src/elflint.c:4620
+#: src/elflint.c:4629
#, c-format
msgid "program header offset in ELF header and PHDR entry do not match"
msgstr ""
-#: src/elflint.c:4647
+#: src/elflint.c:4656
#, c-format
msgid "call frame search table reference in program header has wrong offset\n"
msgstr ""
-#: src/elflint.c:4650
+#: src/elflint.c:4659
#, c-format
msgid "call frame search table size mismatch in program and section header\n"
msgstr ""
-#: src/elflint.c:4663
+#: src/elflint.c:4672
#, c-format
msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
msgstr ""
-#: src/elflint.c:4671
+#: src/elflint.c:4680
#, c-format
msgid "call frame search table must be allocated\n"
msgstr ""
-#: src/elflint.c:4674
+#: src/elflint.c:4683
#, c-format
msgid "section [%2zu] '%s' must be allocated\n"
msgstr ""
-#: src/elflint.c:4678
+#: src/elflint.c:4687
#, c-format
msgid "call frame search table must not be writable\n"
msgstr ""
-#: src/elflint.c:4681
+#: src/elflint.c:4690
#, c-format
msgid "section [%2zu] '%s' must not be writable\n"
msgstr ""
-#: src/elflint.c:4686
+#: src/elflint.c:4695
#, c-format
msgid "call frame search table must not be executable\n"
msgstr ""
-#: src/elflint.c:4689
+#: src/elflint.c:4698
#, c-format
msgid "section [%2zu] '%s' must not be executable\n"
msgstr ""
-#: src/elflint.c:4700
+#: src/elflint.c:4709
#, c-format
msgid "program header entry %d: file size greater than memory size\n"
msgstr ""
-#: src/elflint.c:4707
+#: src/elflint.c:4716
#, c-format
msgid "program header entry %d: alignment not a power of 2\n"
msgstr ""
-#: src/elflint.c:4710
+#: src/elflint.c:4719
#, c-format
msgid ""
"program header entry %d: file offset and virtual address not module of "
"alignment\n"
msgstr ""
-#: src/elflint.c:4723
+#: src/elflint.c:4732
#, 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:4757
+#: src/elflint.c:4766
#, c-format
msgid "cannot read ELF header: %s\n"
msgstr ""
-#: src/elflint.c:4783
+#: src/elflint.c:4792
#, c-format
msgid "text relocation flag set but not needed\n"
msgstr ""
diff --git a/libdrgn/elfutils/po/es.po b/libdrgn/elfutils/po/es.po
index 0d32a5de2..ffb877be9 100644
--- a/libdrgn/elfutils/po/es.po
+++ b/libdrgn/elfutils/po/es.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: elfutils.master.es\n"
"Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2019-11-26 09:48+0100\n"
+"POT-Creation-Date: 2020-03-30 12:56+0200\n"
"PO-Revision-Date: 2011-01-10 15:17-0300\n"
"Last-Translator: Claudio Rodrigo Pereyra Diaz \n"
@@ -531,7 +531,7 @@ msgstr "No hay segundo plano (Backend)"
#: libebl/eblcorenotetypename.c:100 libebl/eblobjnotetypename.c:77
#: libebl/eblobjnotetypename.c:109 libebl/eblobjnotetypename.c:130
#: libebl/eblosabiname.c:73 libebl/eblsectionname.c:83
-#: libebl/eblsectiontypename.c:115 libebl/eblsegmenttypename.c:79
+#: libebl/eblsectiontypename.c:115 libebl/eblsegmenttypename.c:85
msgid ""
msgstr ""
@@ -1690,14 +1690,14 @@ msgstr ""
"sección [%2d] '%s': el grupo de sección [%2zu] '%s' no precede al miembro de "
"grupo\n"
-#: src/elflint.c:610 src/elflint.c:1494 src/elflint.c:1545 src/elflint.c:1651
-#: src/elflint.c:1987 src/elflint.c:2313 src/elflint.c:2932 src/elflint.c:3095
-#: src/elflint.c:3243 src/elflint.c:3433 src/elflint.c:4431
+#: src/elflint.c:610 src/elflint.c:1498 src/elflint.c:1549 src/elflint.c:1655
+#: src/elflint.c:1991 src/elflint.c:2317 src/elflint.c:2936 src/elflint.c:3099
+#: src/elflint.c:3247 src/elflint.c:3437 src/elflint.c:4435
#, 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:623 src/elflint.c:1658
+#: src/elflint.c:623 src/elflint.c:1662
#, c-format
msgid ""
"section [%2d] '%s': referenced as string table for section [%2d] '%s' but "
@@ -1721,33 +1721,42 @@ 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:667
+#: src/elflint.c:662
+#, fuzzy, c-format
+msgid ""
+"section [%2u] '%s': number of local entries in 'st_info' larger than table "
+"size\n"
+msgstr ""
+"Sección [%2d] '%s': no hay entradas de nota definidas para el tipo de "
+"archivo\n"
+
+#: src/elflint.c:671
#, 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:672 src/elflint.c:675 src/elflint.c:678 src/elflint.c:681
-#: src/elflint.c:684 src/elflint.c:687
+#: src/elflint.c:676 src/elflint.c:679 src/elflint.c:682 src/elflint.c:685
+#: src/elflint.c:688 src/elflint.c:691
#, 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:690
+#: src/elflint.c:694
#, 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:700
+#: src/elflint.c:704
#, 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:709
+#: src/elflint.c:713
#, 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:724
+#: src/elflint.c:728
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: too large section index but no extended "
@@ -1756,7 +1765,7 @@ msgstr ""
"Sección [%2d] '%s': símbolo %zu: el índice de sección es demasiado extenso, "
"pero no la sección extendida de la sección de índice\n"
-#: src/elflint.c:730
+#: src/elflint.c:734
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
@@ -1766,27 +1775,27 @@ msgstr ""
"caber en st_shndx (%)\n"
#. || sym->st_shndx > SHN_HIRESERVE always false
-#: src/elflint.c:742
+#: src/elflint.c:746
#, 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:750
+#: src/elflint.c:754
#, 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:756
+#: src/elflint.c:760
#, 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:761
+#: src/elflint.c:765
#, 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:769
+#: src/elflint.c:773
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
@@ -1794,25 +1803,25 @@ msgstr ""
"sección [%2d] '%s': símbolo %zu: COMMON solo es permitido en archivos "
"realojables\n"
-#: src/elflint.c:773
+#: src/elflint.c:777
#, 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:777
+#: src/elflint.c:781
#, 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:828
+#: src/elflint.c:832
#, 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:834 src/elflint.c:859 src/elflint.c:908
+#: src/elflint.c:838 src/elflint.c:863 src/elflint.c:912
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu does not fit completely in referenced section "
@@ -1821,7 +1830,7 @@ msgstr ""
"Sección [%2d] '%s': símbolo %zu no se ajusta totalmente en la sección [%2d] "
"'%s'\n"
-#: src/elflint.c:843
+#: src/elflint.c:847
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
@@ -1830,7 +1839,7 @@ msgstr ""
"Sección [%2d] '%s': símbolo %zu: sección de referencia [%2d] '%s' no tiene "
"establecida bandera SHF_TLS\n"
-#: src/elflint.c:853 src/elflint.c:901
+#: src/elflint.c:857 src/elflint.c:905
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
@@ -1839,7 +1848,7 @@ msgstr ""
"Sección [%2d] '%s': símbolo %zu: st_value fuera de límites de sección de "
"referencia [%2d] '%s'\n"
-#: src/elflint.c:880
+#: src/elflint.c:884
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
@@ -1847,7 +1856,7 @@ msgstr ""
"Sección [%2d] '%s': símbolo %zu: símbolo TLS, pero no hay entrada de "
"programa TLS\n"
-#: src/elflint.c:886
+#: src/elflint.c:890
#, fuzzy, c-format
msgid ""
"section [%2d] '%s': symbol %zu: TLS symbol but couldn't get TLS program "
@@ -1856,7 +1865,7 @@ msgstr ""
"Sección [%2d] '%s': símbolo %zu: símbolo TLS, pero no hay entrada de "
"programa TLS\n"
-#: src/elflint.c:894
+#: src/elflint.c:898
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] "
@@ -1865,7 +1874,7 @@ msgstr ""
"Sección [%2d] '%s': símbolo %zu: st_value falta sección de referencia [%2d] "
"'%s'\n"
-#: src/elflint.c:921
+#: src/elflint.c:925
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: local symbol outside range described in "
@@ -1874,7 +1883,7 @@ msgstr ""
"Sección [%2d] '%s': símbolo %zu: símbolo local fuera del rango descrito en "
"sh_info\n"
-#: src/elflint.c:928
+#: src/elflint.c:932
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
@@ -1883,12 +1892,12 @@ msgstr ""
"Sección [%2d] '%s': símbolo %zu: símbolo non-local fuera del rango descrito "
"en sh_info\n"
-#: src/elflint.c:935
+#: src/elflint.c:939
#, 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:985
+#: src/elflint.c:989
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section "
@@ -1897,7 +1906,7 @@ msgstr ""
"Sección [%2d] '%s': símbolo _GLOBAL_OFFSET_TABLE_ se refiere a sección "
"errada [%2d]\n"
-#: src/elflint.c:992
+#: src/elflint.c:996
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] "
@@ -1909,7 +1918,7 @@ msgstr ""
#. 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:1008
+#: src/elflint.c:1012
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %# does not "
@@ -1918,7 +1927,7 @@ msgstr ""
"Sección [%2d] '%s': valor del símbolo _GLOBAL_OFFSET_TABLE_ %# no "
"coincide con dirección de sección %s %#\n"
-#: src/elflint.c:1015
+#: src/elflint.c:1019
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size % does not "
@@ -1927,7 +1936,7 @@ msgstr ""
"Sección [%2d] '%s': tamaño de símbolo _GLOBAL_OFFSET_TABLE_ % no "
"coincide con tamaño de sección %s %\n"
-#: src/elflint.c:1023
+#: src/elflint.c:1027
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
@@ -1936,7 +1945,7 @@ msgstr ""
"Sección [%2d] '%s': símbolo _GLOBAL_OFFSET_TABLE_ presente, pero no. sección "
"got\n"
-#: src/elflint.c:1039
+#: src/elflint.c:1043
#, c-format
msgid ""
"section [%2d] '%s': _DYNAMIC_ symbol value %# does not match dynamic "
@@ -1945,7 +1954,7 @@ msgstr ""
"sección [%2d] '%s': Valor de símbolo _DYNAMIC_ %# no coincide con la "
"dirección de segmento%#\n"
-#: src/elflint.c:1046
+#: src/elflint.c:1050
#, c-format
msgid ""
"section [%2d] '%s': _DYNAMIC symbol size % does not match dynamic "
@@ -1954,7 +1963,7 @@ msgstr ""
"Sección [%2d] '%s': tamaño de símbolo _DYNAMIC % no coincide con "
"tamaño de segmento %\n"
-#: src/elflint.c:1059
+#: src/elflint.c:1063
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
@@ -1963,29 +1972,29 @@ msgstr ""
"Sección [%2d] '%s': símbolo %zu: símbolo en tabla de símbolos dinámicos sin "
"visibilidad predeterminada\n"
-#: src/elflint.c:1063
+#: src/elflint.c:1067
#, 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:1101
+#: src/elflint.c:1105
#, fuzzy, 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:1117
+#: src/elflint.c:1121
#, 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:1128 src/elflint.c:1181
+#: src/elflint.c:1132 src/elflint.c:1185
#, 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:1153 src/elflint.c:1206
+#: src/elflint.c:1157 src/elflint.c:1210
#, c-format
msgid ""
"section [%2d] '%s': relative relocations after index %d as specified by "
@@ -1994,7 +2003,7 @@ msgstr ""
"Sección [%2d] '%s': reubicaciones relativas después de que el %d de índice "
"haya sido especificado por DT_RELCOUNT\n"
-#: src/elflint.c:1159 src/elflint.c:1212
+#: src/elflint.c:1163 src/elflint.c:1216
#, c-format
msgid ""
"section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
@@ -2003,50 +2012,50 @@ msgstr ""
"Sección [%2d] '%s': reubicación no-relativa en %zu de índice; DT_RELCOUNT "
"especificado %d reubicaciones relativas\n"
-#: src/elflint.c:1171
+#: src/elflint.c:1175
#, 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:1254
+#: src/elflint.c:1258
#, 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:1266
+#: src/elflint.c:1270
#, 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:1274
+#: src/elflint.c:1278
#, 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:1282
+#: src/elflint.c:1286
#, fuzzy, c-format
msgid ""
"section [%2d] '%s': no relocations for merge-able string sections possible\n"
msgstr ""
"Sección [%2d] '%s': no reubicaciones para secciones de fusión posibles\n"
-#: src/elflint.c:1290
+#: src/elflint.c:1294
#, 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:1350
+#: src/elflint.c:1354
#, 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:1377
+#: src/elflint.c:1381
#, 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:1385
+#: src/elflint.c:1389
#, c-format
msgid ""
"section [%2d] '%s': relocation %zu: relocation type invalid for the file "
@@ -2055,12 +2064,12 @@ msgstr ""
"Sección [%2d] '%s': reubicación %zu: tipo de reubicación inválido para el "
"tipo de archivo\n"
-#: src/elflint.c:1393
+#: src/elflint.c:1397
#, 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:1411
+#: src/elflint.c:1415
#, c-format
msgid ""
"section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
@@ -2069,12 +2078,12 @@ msgstr ""
"Sección [%2d] '%s': reubicación %zu: sólo el símbolo '_GLOBAL_OFFSET_TABLE_' "
"puede utilizarse con %s\n"
-#: src/elflint.c:1428
+#: src/elflint.c:1432
#, 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:1443
+#: src/elflint.c:1447
#, c-format
msgid ""
"section [%2d] '%s': relocation %zu: copy relocation against symbol of type "
@@ -2083,7 +2092,7 @@ msgstr ""
"Sección [%2d] '%s': reubicación %zu: reubicación de copia con símbolo de "
"tipo %s\n"
-#: src/elflint.c:1464
+#: src/elflint.c:1468
#, c-format
msgid ""
"section [%2d] '%s': relocation %zu: read-only section modified but text "
@@ -2092,24 +2101,24 @@ 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:1479
+#: src/elflint.c:1483
#, 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:1519 src/elflint.c:1570
+#: src/elflint.c:1523 src/elflint.c:1574
#, 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:1646
+#: src/elflint.c:1650
#, c-format
msgid "more than one dynamic section present\n"
msgstr "más de una sección dinámica presente\n"
-#: src/elflint.c:1664
+#: src/elflint.c:1668
#, fuzzy, c-format
msgid ""
"section [%2d]: referenced as string table for section [%2d] '%s' but section "
@@ -2118,44 +2127,44 @@ 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:1672
+#: src/elflint.c:1676
#, 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:1677 src/elflint.c:1966
+#: src/elflint.c:1681 src/elflint.c:1970
#, 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:1687
+#: src/elflint.c:1691
#, 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:1695
+#: src/elflint.c:1699
#, 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:1702
+#: src/elflint.c:1706
#, c-format
msgid "section [%2d] '%s': entry %zu: unknown tag\n"
msgstr "Sección [%2d] '%s': entrada %zu: etiqueta desconocida\n"
-#: src/elflint.c:1713
+#: src/elflint.c:1717
#, 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:1723
+#: src/elflint.c:1727
#, 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:1741
+#: src/elflint.c:1745
#, c-format
msgid ""
"section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
@@ -2163,7 +2172,7 @@ msgstr ""
"Sección [%2d] '%s': entrada %zu: el valor DT_PLTREL debe ser DT_REL or "
"DT_RELA\n"
-#: src/elflint.c:1754
+#: src/elflint.c:1758
#, c-format
msgid ""
"section [%2d] '%s': entry %zu: pointer does not match address of section "
@@ -2172,14 +2181,14 @@ msgstr ""
"Sección [%2d] '%s': entrada %zu: puntero no coincide con dirección de "
"sección [%2d] '%s' al que hace referencia sh_link\n"
-#: src/elflint.c:1797
+#: src/elflint.c:1801
#, 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:1812
+#: src/elflint.c:1816
#, c-format
msgid ""
"section [%2d] '%s': entry %zu: %s value must be valid offset in section "
@@ -2188,46 +2197,46 @@ msgstr ""
"sección [%2d] '%s': entrada %zu: valor %s debe ser compensación válida en "
"sección [%2d] '%s'\n"
-#: src/elflint.c:1832 src/elflint.c:1860
+#: src/elflint.c:1836 src/elflint.c:1864
#, 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:1844
+#: src/elflint.c:1848
#, 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:1853
+#: src/elflint.c:1857
#, 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:1868 src/elflint.c:1875
+#: src/elflint.c:1872 src/elflint.c:1879
#, 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:1885 src/elflint.c:1889
+#: src/elflint.c:1889 src/elflint.c:1893
#, 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:1895
+#: src/elflint.c:1899
#, 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:1906 src/elflint.c:1910 src/elflint.c:1914 src/elflint.c:1918
+#: src/elflint.c:1910 src/elflint.c:1914 src/elflint.c:1918 src/elflint.c:1922
#, 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:1930
+#: src/elflint.c:1934
#, c-format
msgid ""
"section [%2d] '%s': only relocatable files can have extended section index\n"
@@ -2235,37 +2244,37 @@ msgstr ""
"Sección [%2d] '%s': sólo los archivos reubicables pueden tener índice de "
"sección extendido\n"
-#: src/elflint.c:1940
+#: src/elflint.c:1944
#, 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:1944
+#: src/elflint.c:1948
#, fuzzy, c-format
msgid "section [%2d] '%s': sh_link extended section index [%2d] is invalid\n"
msgstr ""
"Sección [%2d] '%s': índice de sección extendido no para tabla de símbolos\n"
-#: src/elflint.c:1949
+#: src/elflint.c:1953
#, c-format
msgid "cannot get data for symbol section\n"
msgstr "no se puede obtener sección para símbolos\n"
-#: src/elflint.c:1952
+#: src/elflint.c:1956
#, 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:1961
+#: src/elflint.c:1965
#, 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:1976
+#: src/elflint.c:1980
#, c-format
msgid ""
"section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
@@ -2274,24 +2283,24 @@ msgstr ""
"Sección [%2d] '%s': índice de sección extendida en sección [%2zu] '%s' se "
"refiere a la misma tabla de símbolos\n"
-#: src/elflint.c:1994
+#: src/elflint.c:1998
#, 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:2006
+#: src/elflint.c:2010
#, c-format
msgid "cannot get data for symbol %zu\n"
msgstr "no puede obtener datos para símbolo %zu\n"
-#: src/elflint.c:2011
+#: src/elflint.c:2015
#, c-format
msgid "extended section index is % but symbol index is not XINDEX\n"
msgstr ""
"índice de sección extendida es % pero índice de símbolo no es "
"XINDEX\n"
-#: src/elflint.c:2028 src/elflint.c:2085
+#: src/elflint.c:2032 src/elflint.c:2089
#, c-format
msgid ""
"section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
@@ -2299,42 +2308,42 @@ 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:2042 src/elflint.c:2099
+#: src/elflint.c:2046 src/elflint.c:2103
#, 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:2056 src/elflint.c:2113
+#: src/elflint.c:2060 src/elflint.c:2117
#, 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:2066
+#: src/elflint.c:2070
#, 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:2123
+#: src/elflint.c:2127
#, c-format
msgid "section [%2d] '%s': hash chain reference % out of bounds\n"
msgstr ""
"Sección [%2d] '%s': referencia de cadena de dispersión % fuera de "
"límites\n"
-#: src/elflint.c:2136
+#: src/elflint.c:2140
#, fuzzy, c-format
msgid "section [%2d] '%s': not enough data\n"
msgstr "Sección [%2d] '%s': no puede obtener datos: %s\n"
-#: src/elflint.c:2148
+#: src/elflint.c:2152
#, fuzzy, c-format
msgid "section [%2d] '%s': bitmask size zero or 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:2164
+#: src/elflint.c:2168
#, fuzzy, c-format
msgid ""
"section [%2d] '%s': hash table section is too small (is %ld, expected at "
@@ -2343,14 +2352,14 @@ 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:2173
+#: src/elflint.c:2177
#, 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:2207
+#: src/elflint.c:2211
#, c-format
msgid ""
"section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
@@ -2358,7 +2367,7 @@ msgstr ""
"Sección [%2d] '%s': cadena de dispersión para cubetas %zu inferior a "
"polarización de índice de símbolo\n"
-#: src/elflint.c:2228
+#: src/elflint.c:2232
#, c-format
msgid ""
"section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
@@ -2367,7 +2376,7 @@ msgstr ""
"Sección [%2d] '%s': el símbolo %u al que se hace referencia en cadena para "
"cubeta %zu es indefinido\n"
-#: src/elflint.c:2241
+#: src/elflint.c:2245
#, c-format
msgid ""
"section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
@@ -2375,7 +2384,7 @@ msgstr ""
"Sección [%2d] '%s': valor de dispersión para símbolo %u en cadena para "
"cubeta %zu está errado\n"
-#: src/elflint.c:2250
+#: src/elflint.c:2254
#, fuzzy, c-format
msgid ""
"section [%2d] '%s': mask index for symbol %u in chain for bucket %zu wrong\n"
@@ -2383,13 +2392,13 @@ msgstr ""
"Sección [%2d] '%s': valor de dispersión para símbolo %u en cadena para "
"cubeta %zu está errado\n"
-#: src/elflint.c:2280
+#: src/elflint.c:2284
#, 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:2285
+#: src/elflint.c:2289
#, c-format
msgid ""
"section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
@@ -2397,43 +2406,43 @@ msgstr ""
"Sección [%2d] '%s': referencia de símbolo en cadena para cubeta %zu fuera de "
"límites\n"
-#: src/elflint.c:2291
+#: src/elflint.c:2295
#, 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:2304
+#: src/elflint.c:2308
#, 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:2322
+#: src/elflint.c:2326
#, 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:2326
+#: src/elflint.c:2330
#, fuzzy, c-format
msgid "section [%2d] '%s': invalid sh_link symbol table section index [%2d]\n"
msgstr "Sección [%2d] '%s': índice de sección de destino inválido\n"
-#: src/elflint.c:2336
+#: src/elflint.c:2340
#, 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:2341
+#: src/elflint.c:2345
#, 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:2346
+#: src/elflint.c:2350
#, c-format
msgid ""
"section [%2d] '%s': hash table has not even room for initial administrative "
@@ -2442,46 +2451,46 @@ msgstr ""
"Sección [%2d] '%s': tabla de dispersión no tiene ni siquiera espacio para "
"entradas administrativas iniciales\n"
-#: src/elflint.c:2395
+#: src/elflint.c:2399
#, 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:2419 src/elflint.c:2484 src/elflint.c:2519
+#: src/elflint.c:2423 src/elflint.c:2488 src/elflint.c:2523
#, fuzzy, c-format
msgid "hash section [%2zu] '%s' does not contain enough data\n"
msgstr "sección [%2zu] '%s' no debe ser ejecutable\n"
-#: src/elflint.c:2440
+#: src/elflint.c:2444
#, fuzzy, c-format
msgid "hash section [%2zu] '%s' has zero bit mask words\n"
msgstr "Sección [%2d] '%s': grupo de sección sin palabra de banderas\n"
-#: src/elflint.c:2451 src/elflint.c:2495 src/elflint.c:2532
+#: src/elflint.c:2455 src/elflint.c:2499 src/elflint.c:2536
#, fuzzy, c-format
msgid "hash section [%2zu] '%s' uses too much data\n"
msgstr "sección [%2zu] '%s' debe ser asignada\n"
-#: src/elflint.c:2466
+#: src/elflint.c:2470
#, c-format
msgid ""
"hash section [%2zu] '%s' invalid symbol index % (max_nsyms: "
"%, nentries: %\n"
msgstr ""
-#: src/elflint.c:2553
+#: src/elflint.c:2557
#, fuzzy, c-format
msgid "hash section [%2zu] '%s' invalid sh_entsize\n"
msgstr "Sección [%2zu]: nombre inválido\n"
-#: src/elflint.c:2563 src/elflint.c:2567
+#: src/elflint.c:2567 src/elflint.c:2571
#, 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:2574
+#: src/elflint.c:2578
#, c-format
msgid ""
"symbol %d referenced in new hash table in [%2zu] '%s' but not in old hash "
@@ -2490,7 +2499,7 @@ msgstr ""
"Símbolo %d nombrado en nueva tabla de dispersión en [%2zu] '%s' pero no en "
"la tabla de dispersión anterior en [%2zu] '%s'\n"
-#: src/elflint.c:2586
+#: src/elflint.c:2590
#, c-format
msgid ""
"symbol %d referenced in old hash table in [%2zu] '%s' but not in new hash "
@@ -2499,12 +2508,12 @@ msgstr ""
"Símbolo %d nombrado en la tabla de dispersión anterior en [%2zu] '%s' pero "
"no en la nueva tabla de dispersión en [%2zu] '%s'\n"
-#: src/elflint.c:2602
+#: src/elflint.c:2606
#, 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:2622
+#: src/elflint.c:2626
#, c-format
msgid ""
"section [%2d] '%s': section groups only allowed in relocatable object files\n"
@@ -2512,99 +2521,99 @@ msgstr ""
"Sección [%2d] '%s': grupos de sección sólo permitidos en archivos de objeto "
"reubicables\n"
-#: src/elflint.c:2633
+#: src/elflint.c:2637
#, 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:2638
+#: src/elflint.c:2642
#, 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:2644
+#: src/elflint.c:2648
#, 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:2649
+#: src/elflint.c:2653
#, c-format
msgid "section [%2d] '%s': sh_flags not zero\n"
msgstr "Sección [%2d] '%s': sh_flags no cero\n"
-#: src/elflint.c:2656
+#: src/elflint.c:2660
#, 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:2660
+#: src/elflint.c:2664
#, fuzzy, c-format
msgid "section [%2d] '%s': cannot get symbol name for signature\n"
msgstr "Sección [%2d] '%s': no puede obtener símbolo para firma\n"
-#: src/elflint.c:2665
+#: src/elflint.c:2669
#, 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:2671
+#: src/elflint.c:2675
#, 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:2677
+#: src/elflint.c:2681
#, 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:2686
+#: src/elflint.c:2690
#, 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:2692
+#: src/elflint.c:2696
#, 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:2700
+#: src/elflint.c:2704
#, 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:2704
+#: src/elflint.c:2708
#, 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:2715
+#: src/elflint.c:2719
#, 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:2727
+#: src/elflint.c:2731
#, fuzzy, 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:2736
+#: src/elflint.c:2740
#, 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:2743
+#: src/elflint.c:2747
#, 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:2749
+#: src/elflint.c:2753
#, fuzzy, c-format
msgid ""
"section [%2d] '%s': element %zu references section [%2d] '%s' without "
@@ -2613,12 +2622,12 @@ msgstr ""
"Sección [%2d] '%s': elemento %Zu hace referencia a sección [%2d] '%s' sin "
"establecer bandera SHF_GROUP\n"
-#: src/elflint.c:2756
+#: src/elflint.c:2760
#, 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:2946
+#: src/elflint.c:2950
#, c-format
msgid ""
"section [%2d] '%s' refers in sh_link to section [%2d] '%s' which is no "
@@ -2627,7 +2636,7 @@ msgstr ""
"Sección [%2d] '%s' se refiere en sh_link a la sección [%2d] '%s' la cual no "
"es una tabla de símbolos dinámicos\n"
-#: src/elflint.c:2958
+#: src/elflint.c:2962
#, c-format
msgid ""
"section [%2d] '%s' has different number of entries than symbol table [%2d] "
@@ -2636,29 +2645,29 @@ msgstr ""
"Sección [%2d] '%s' tiene un número diferente de entradas a la de la tabla de "
"símbolos [%2d] '%s'\n"
-#: src/elflint.c:2974
+#: src/elflint.c:2978
#, 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:2990
+#: src/elflint.c:2994
#, 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:2998
+#: src/elflint.c:3002
#, 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:3012
+#: src/elflint.c:3016
#, 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:3017
+#: src/elflint.c:3021
#, c-format
msgid ""
"section [%2d] '%s': symbol %d: version index %d is for defined version\n"
@@ -2666,7 +2675,7 @@ msgstr ""
"Sección [%2d] '%s': símbolo %d: índice de versión %d es para versión "
"definida\n"
-#: src/elflint.c:3027
+#: src/elflint.c:3031
#, c-format
msgid ""
"section [%2d] '%s': symbol %d: version index %d is for requested version\n"
@@ -2674,46 +2683,46 @@ msgstr ""
"Sección [%2d] '%s': símbolo %d: índice de versión %d es para la versión "
"solicitada\n"
-#: src/elflint.c:3080
+#: src/elflint.c:3084
#, 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:3088 src/elflint.c:3235
+#: src/elflint.c:3092 src/elflint.c:3239
#, 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:3113 src/elflint.c:3289
+#: src/elflint.c:3117 src/elflint.c:3293
#, 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:3120 src/elflint.c:3296
+#: src/elflint.c:3124 src/elflint.c:3300
#, 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:3130
+#: src/elflint.c:3134
#, 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:3138
+#: src/elflint.c:3142
#, 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:3150
+#: src/elflint.c:3154
#, 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:3158
+#: src/elflint.c:3162
#, c-format
msgid ""
"section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
@@ -2722,7 +2731,7 @@ msgstr ""
"Sección [%2d] '%s': entrada auxiliar %d de entrada %d tiene referencia de "
"nombre inválida\n"
-#: src/elflint.c:3167
+#: src/elflint.c:3171
#, c-format
msgid ""
"section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: "
@@ -2731,7 +2740,7 @@ msgstr ""
"Sección [%2d] '%s': entrada auxiliar %d de entrada %d tiene valor de "
"dispersión: %#x, esperado %#x\n"
-#: src/elflint.c:3176
+#: src/elflint.c:3180
#, c-format
msgid ""
"section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
@@ -2740,7 +2749,7 @@ msgstr ""
"sección [%2d] '%s': entrada auxiliar %d de entrada %d tiene nombre duplicado "
"'%s'\n"
-#: src/elflint.c:3187
+#: src/elflint.c:3191
#, c-format
msgid ""
"section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
@@ -2748,14 +2757,14 @@ msgstr ""
"sección [%2d] '%s': entrada auxiliar %d de entrada %d tiene próximo campo "
"errado\n"
-#: src/elflint.c:3204 src/elflint.c:3380
+#: src/elflint.c:3208 src/elflint.c:3384
#, 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:3212 src/elflint.c:3388
+#: src/elflint.c:3216 src/elflint.c:3392
#, fuzzy, c-format
msgid ""
"section [%2d] '%s': entry %d has zero offset to next entry, but sh_info says "
@@ -2764,46 +2773,46 @@ msgstr ""
"sección [%2d] '%s': entrada %d tiene compensación inválida para próxima "
"entrada\n"
-#: src/elflint.c:3227
+#: src/elflint.c:3231
#, 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:3274
+#: src/elflint.c:3278
#, 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:3278
+#: src/elflint.c:3282
#, 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:3284
+#: src/elflint.c:3288
#, 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:3311
+#: src/elflint.c:3315
#, 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:3318
+#: src/elflint.c:3322
#, 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:3326
+#: src/elflint.c:3330
#, 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:3346
+#: src/elflint.c:3350
#, c-format
msgid ""
"section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
@@ -2811,34 +2820,34 @@ msgstr ""
"Sección [%2d] '%s': entrada %d tiene referencia de nombre inválida en datos "
"auxiliares\n"
-#: src/elflint.c:3363
+#: src/elflint.c:3367
#, 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:3396
+#: src/elflint.c:3400
#, 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:3412
+#: src/elflint.c:3416
#, 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:3425
+#: src/elflint.c:3429
#, 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:3446
+#: src/elflint.c:3450
#, c-format
msgid "section [%2d] '%s': unrecognized attribute format\n"
msgstr "Sección[%2d] '%s': formato de atributo no reconocido\n"
-#: src/elflint.c:3462
+#: src/elflint.c:3466
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: zero length field in attribute section\n"
@@ -2846,21 +2855,21 @@ msgstr ""
"Sección[%2d] '%s': compensación %zu: campo de longitud cero en sección de "
"atributo\n"
-#: src/elflint.c:3471
+#: src/elflint.c:3475
#, 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:3483
+#: src/elflint.c:3487
#, 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:3500
+#: src/elflint.c:3504
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
@@ -2868,12 +2877,12 @@ msgstr ""
"Sección [%2d] '%s': compensación %zu: sin fin ULEB128 en etiqueta de sub-"
"sección de atributo\n"
-#: src/elflint.c:3509
+#: src/elflint.c:3513
#, 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:3518
+#: src/elflint.c:3522
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
@@ -2881,7 +2890,7 @@ msgstr ""
"Sección [%2d] '%s': compensación %zu: campo de longitud cero length en sub-"
"sección de atributo\n"
-#: src/elflint.c:3533
+#: src/elflint.c:3537
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
@@ -2890,7 +2899,7 @@ msgstr ""
"atributo\n"
#. Tag_File
-#: src/elflint.c:3544
+#: src/elflint.c:3548
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
@@ -2898,26 +2907,26 @@ msgstr ""
"Sección[%2d] '%s': compensación %zu: sub-sección de atributo tiene etiqueta "
"inesperada %u\n"
-#: src/elflint.c:3562
+#: src/elflint.c:3566
#, 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:3573
+#: src/elflint.c:3577
#, 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:3586
+#: src/elflint.c:3590
#, 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:3590
+#: src/elflint.c:3594
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: unrecognized %s attribute value %\n"
@@ -2925,12 +2934,12 @@ msgstr ""
"Sección [%2d] '%s': compensación %zu: no reconocido %s valor de atributo "
"%\n"
-#: src/elflint.c:3600
+#: src/elflint.c:3604
#, 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:3606
+#: src/elflint.c:3610
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
@@ -2938,47 +2947,47 @@ msgstr ""
"Sección [%2d] '%s': compensación %zu: extra bytes después de la última "
"sección de atributo\n"
-#: src/elflint.c:3695
+#: src/elflint.c:3699
#, 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:3699
+#: src/elflint.c:3703
#, c-format
msgid "zeroth section has nonzero name\n"
msgstr "Sección zeroth tiene nombre nonzero\n"
-#: src/elflint.c:3701
+#: src/elflint.c:3705
#, c-format
msgid "zeroth section has nonzero type\n"
msgstr "Sección zeroth tiene tipo nonzero\n"
-#: src/elflint.c:3703
+#: src/elflint.c:3707
#, c-format
msgid "zeroth section has nonzero flags\n"
msgstr "Sección zeroth tiene banderas nonzero\n"
-#: src/elflint.c:3705
+#: src/elflint.c:3709
#, c-format
msgid "zeroth section has nonzero address\n"
msgstr "Sección zeroth tiene dirección nonzero\n"
-#: src/elflint.c:3707
+#: src/elflint.c:3711
#, c-format
msgid "zeroth section has nonzero offset\n"
msgstr "Sección zeroth tiene compensación nonzero\n"
-#: src/elflint.c:3709
+#: src/elflint.c:3713
#, c-format
msgid "zeroth section has nonzero align value\n"
msgstr "Sección zeroth tiene valor de alineación nonzero\n"
-#: src/elflint.c:3711
+#: src/elflint.c:3715
#, 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:3714
+#: src/elflint.c:3718
#, c-format
msgid ""
"zeroth section has nonzero size value while ELF header has nonzero shnum "
@@ -2987,7 +2996,7 @@ msgstr ""
"Sección zeroth tiene valor de tamaño nonzero mientras que el encabezamiento "
"ELF tiene valor shnum nonzero\n"
-#: src/elflint.c:3718
+#: src/elflint.c:3722
#, c-format
msgid ""
"zeroth section has nonzero link value while ELF header does not signal "
@@ -2996,7 +3005,7 @@ msgstr ""
"Sección zeroth tiene valor de enlace nonzero mientras que el encabezamiento "
"ELF no señala sobreflujo en shstrndx\n"
-#: src/elflint.c:3722
+#: src/elflint.c:3726
#, c-format
msgid ""
"zeroth section has nonzero link value while ELF header does not signal "
@@ -3005,27 +3014,27 @@ msgstr ""
"la sección zeroth tiene un valor de enlace distinto a cero mientras que el "
"encabezamiento ELF no señala desbordamiento en phnum\n"
-#: src/elflint.c:3740
+#: src/elflint.c:3744
#, 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:3749
+#: src/elflint.c:3753
#, c-format
msgid "section [%2zu]: invalid name\n"
msgstr "Sección [%2zu]: nombre inválido\n"
-#: src/elflint.c:3776
+#: src/elflint.c:3780
#, 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:3794
+#: src/elflint.c:3798
#, 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:3812
+#: src/elflint.c:3816
#, c-format
msgid ""
"section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
@@ -3033,12 +3042,12 @@ msgstr ""
"Sección [%2zu] '%s' tiene banderas erradas: %s esperado y posiblemente %s, "
"es %s\n"
-#: src/elflint.c:3830
+#: src/elflint.c:3834
#, c-format
msgid "section [%2zu] '%s' present in object file\n"
msgstr "Sección [%2zu] '%s' presente en archivo objeto\n"
-#: src/elflint.c:3836 src/elflint.c:3868
+#: src/elflint.c:3840 src/elflint.c:3872
#, c-format
msgid ""
"section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
@@ -3046,7 +3055,7 @@ msgstr ""
"Sección [%2zu] '%s' tiene bandera SHF_ALLOC establecida pero no es un "
"segmento cargable\n"
-#: src/elflint.c:3841 src/elflint.c:3873
+#: src/elflint.c:3845 src/elflint.c:3877
#, c-format
msgid ""
"section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
@@ -3055,7 +3064,7 @@ msgstr ""
"Sección [%2zu] '%s' no tiene bandera SHF_ALLOC establecida pero hay "
"segmentos cargables\n"
-#: src/elflint.c:3849
+#: src/elflint.c:3853
#, c-format
msgid ""
"section [%2zu] '%s' is extension section index table in non-object file\n"
@@ -3063,22 +3072,22 @@ msgstr ""
"Sección [%2zu] '%s' es tabla de índice de sección de extensión en archivo no-"
"objeto\n"
-#: src/elflint.c:3892
+#: src/elflint.c:3896
#, 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:3897
+#: src/elflint.c:3901
#, c-format
msgid "cannot get section header\n"
msgstr "no se puede obtener encabezamiento de sección\n"
-#: src/elflint.c:3907
+#: src/elflint.c:3911
#, c-format
msgid "section [%2zu] '%s' has unsupported type %d\n"
msgstr "sección [%2zu] '%s' tiene tipo %d incompatible \n"
-#: src/elflint.c:3922
+#: src/elflint.c:3926
#, c-format
msgid ""
"section [%2zu] '%s' contains invalid processor-specific flag(s) %#\n"
@@ -3086,76 +3095,76 @@ msgstr ""
"Sección [%2zu] '%s' contiene bandera(s) de procesador-específico inválidas "
"%#\n"
-#: src/elflint.c:3929
+#: src/elflint.c:3933
#, c-format
msgid "section [%2zu] '%s' contains unknown flag(s) %#\n"
msgstr "Sección [%2zu] '%s' contiene bandera(s) desconocidas %#\n"
-#: src/elflint.c:3937
+#: src/elflint.c:3941
#, 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:3947
+#: src/elflint.c:3951
#, fuzzy, c-format
msgid "section [%2zu] '%s': allocated section cannot be compressed\n"
msgstr ""
"Sección [%2zu] '%s': dirección de secciones de datos de hilo-local no cero\n"
-#: src/elflint.c:3952
+#: src/elflint.c:3956
#, fuzzy, c-format
msgid "section [%2zu] '%s': nobits section cannot be compressed\n"
msgstr "Sección [%2d] '%s': no hay sección de dispersión presente\n"
-#: src/elflint.c:3958
+#: src/elflint.c:3962
#, fuzzy, c-format
msgid ""
"section [%2zu] '%s': compressed section with no compression header: %s\n"
msgstr "Sección [%2d] '%s': grupo de sección con sólo un miembro\n"
-#: src/elflint.c:3964
+#: src/elflint.c:3968
#, 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:3969
+#: src/elflint.c:3973
#, 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:3976
+#: src/elflint.c:3980
#, 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:3981
+#: src/elflint.c:3985
#, 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:4000
+#: src/elflint.c:4004
#, 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:4009
+#: src/elflint.c:4013
#, fuzzy, c-format
msgid "section [%2zu] '%s' must be of type NOBITS in debuginfo files\n"
msgstr "sección [%2zu] '%s' no debe tener permiso de escritura\n"
-#: src/elflint.c:4016
+#: src/elflint.c:4020
#, 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:4047
+#: src/elflint.c:4051
#, c-format
msgid ""
"section [%2zu] '%s' not fully contained in segment of program header entry "
@@ -3164,7 +3173,7 @@ msgstr ""
"Sección [%2zu] '%s' no contenida totalmente en segmento de entrada de "
"encabezamiento de programa %d\n"
-#: src/elflint.c:4057
+#: src/elflint.c:4061
#, c-format
msgid ""
"section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
@@ -3173,7 +3182,7 @@ msgstr ""
"Sección [%2zu] '%s' no tiene tipo NOBITS pero es leída desde el archivo en "
"segmento de entrada de encabezamiento de programa %d\n"
-#: src/elflint.c:4083
+#: src/elflint.c:4087
#, fuzzy, c-format
msgid ""
"section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
@@ -3182,7 +3191,7 @@ msgstr ""
"Sección [%2zu] '%s' no tiene tipo NOBITS pero es leída desde el archivo en "
"segmento de entrada de encabezamiento de programa %d\n"
-#: src/elflint.c:4094
+#: src/elflint.c:4098
#, c-format
msgid ""
"section [%2zu] '%s' has not type NOBITS but is not read from the file in "
@@ -3191,18 +3200,18 @@ msgstr ""
"Sección [%2zu] '%s' no tiene tipo NOBITS pero no es leída desde el fichero "
"en segmento de entrada de encabezamiento de programa %d\n"
-#: src/elflint.c:4105
+#: src/elflint.c:4109
#, 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:4115
+#: src/elflint.c:4119
#, 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:4125
+#: src/elflint.c:4129
#, c-format
msgid ""
"section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
@@ -3210,7 +3219,7 @@ msgstr ""
"Sección [%2zu] '%s': asignación de bandera establecida pero sección no en "
"ningún segmento cargado\n"
-#: src/elflint.c:4131
+#: src/elflint.c:4135
#, c-format
msgid ""
"section [%2zu] '%s': ELF header says this is the section header string table "
@@ -3219,7 +3228,7 @@ msgstr ""
"Sección [%2zu] '%s': encabezamiento ELF dice esta es la tabla de cadena de "
"encabezamiento de sección, pero el tipo no es SHT_TYPE\n"
-#: src/elflint.c:4139
+#: src/elflint.c:4143
#, c-format
msgid ""
"section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
@@ -3227,32 +3236,32 @@ msgstr ""
"sección [%2zu] '%s': ficheros reubicables no pueden tener tablas de símbolos "
"dinámicos\n"
-#: src/elflint.c:4190
+#: src/elflint.c:4194
#, 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:4213
+#: src/elflint.c:4217
#, 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:4224
+#: src/elflint.c:4228
#, 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:4230
+#: src/elflint.c:4234
#, 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:4241
+#: src/elflint.c:4245
#, c-format
msgid ""
"no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
@@ -3261,26 +3270,26 @@ msgstr ""
"Sección no .gnu.versym presente, pero la sección .gnu.versym_d o la sección ."
"gnu.versym_r existen\n"
-#: src/elflint.c:4254
+#: src/elflint.c:4258
#, c-format
msgid "duplicate version index %d\n"
msgstr "Duplicar índice de versión %d\n"
-#: src/elflint.c:4268
+#: src/elflint.c:4272
#, 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:4317
+#: src/elflint.c:4321
#, c-format
msgid "phdr[%d]: unknown core file note type % at offset %\n"
msgstr ""
"phdr[%d]: tipo de nota de fichero core desconocido % en compensación "
"%\n"
-#: src/elflint.c:4321
+#: src/elflint.c:4325
#, fuzzy, c-format
msgid ""
"section [%2d] '%s': unknown core file note type % at offset %zu\n"
@@ -3288,7 +3297,7 @@ msgstr ""
"Sección [%2d] '%s': tipo de nota de fichero core desconocido % en "
"compensación %Zu\n"
-#: src/elflint.c:4370
+#: src/elflint.c:4374
#, fuzzy, c-format
msgid ""
"phdr[%d]: unknown object file note type % with owner name '%s' at "
@@ -3297,7 +3306,7 @@ msgstr ""
"phdr[%d]: tipo de nota de fichero objeto desconocido % en "
"compensación %Zu\n"
-#: src/elflint.c:4375
+#: src/elflint.c:4379
#, fuzzy, c-format
msgid ""
"section [%2d] '%s': unknown object file note type % with owner name "
@@ -3306,40 +3315,40 @@ msgstr ""
"Sección [%2d] '%s': tipo de nota de fichero objeto desconocido % en "
"compensación %Zu\n"
-#: src/elflint.c:4394
+#: src/elflint.c:4398
#, 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:4414
+#: src/elflint.c:4418
#, 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:4417
+#: src/elflint.c:4421
#, c-format
msgid "phdr[%d]: extra % bytes after last note\n"
msgstr "phdr[%d]: extra % bytes después de la última nota\n"
-#: src/elflint.c:4438
+#: src/elflint.c:4442
#, 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:4445
+#: src/elflint.c:4449
#, 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:4448
+#: src/elflint.c:4452
#, c-format
msgid "section [%2d] '%s': extra % bytes after last note\n"
msgstr "Sección[%2d] '%s': extra % bytes después de la última nota\n"
-#: src/elflint.c:4466
+#: src/elflint.c:4470
#, c-format
msgid ""
"only executables, shared objects, and core files can have program headers\n"
@@ -3347,145 +3356,145 @@ msgstr ""
"Sólo ejecutables, objetos compartidos y ficheros core pueden tener "
"encabezamientos de programas\n"
-#: src/elflint.c:4481
+#: src/elflint.c:4485
#, 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:4490
+#: src/elflint.c:4499
#, c-format
msgid "program header entry %d: unknown program header entry type %#\n"
msgstr ""
"entrada de encabezamiento de programa %d: tipo %# de entrada de "
"encabezamiento de programa desconocido\n"
-#: src/elflint.c:4501
+#: src/elflint.c:4510
#, 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:4509
+#: src/elflint.c:4518
#, 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:4516
+#: src/elflint.c:4525
#, c-format
msgid "static executable cannot have dynamic sections\n"
msgstr "ejecutable estático no puede tener secciones dinámicas\n"
-#: src/elflint.c:4530
+#: src/elflint.c:4539
#, 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:4533
+#: src/elflint.c:4542
#, 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:4543
+#: src/elflint.c:4552
#, 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:4564
+#: src/elflint.c:4573
#, 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:4575
+#: src/elflint.c:4584
#, 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:4582
+#: src/elflint.c:4591
#, c-format
msgid ""
"GNU_RELRO [%u] flags are not a subset of the loadable segment [%u] flags\n"
msgstr ""
-#: src/elflint.c:4591 src/elflint.c:4614
+#: src/elflint.c:4600 src/elflint.c:4623
#, 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:4620
+#: src/elflint.c:4629
#, 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:4647
+#: src/elflint.c:4656
#, 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:4650
+#: src/elflint.c:4659
#, 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:4663
+#: src/elflint.c:4672
#, 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:4671
+#: src/elflint.c:4680
#, 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:4674
+#: src/elflint.c:4683
#, c-format
msgid "section [%2zu] '%s' must be allocated\n"
msgstr "sección [%2zu] '%s' debe ser asignada\n"
-#: src/elflint.c:4678
+#: src/elflint.c:4687
#, 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:4681
+#: src/elflint.c:4690
#, 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:4686
+#: src/elflint.c:4695
#, 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:4689
+#: src/elflint.c:4698
#, c-format
msgid "section [%2zu] '%s' must not be executable\n"
msgstr "sección [%2zu] '%s' no debe ser ejecutable\n"
-#: src/elflint.c:4700
+#: src/elflint.c:4709
#, 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:4707
+#: src/elflint.c:4716
#, 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:4710
+#: src/elflint.c:4719
#, c-format
msgid ""
"program header entry %d: file offset and virtual address not module of "
@@ -3494,7 +3503,7 @@ msgstr ""
"entrada de encabezamiento de programa %d: compensación de fichero y "
"dirección virtual no módulo de alineación\n"
-#: src/elflint.c:4723
+#: src/elflint.c:4732
#, c-format
msgid ""
"executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
@@ -3503,12 +3512,12 @@ msgstr ""
"ejecutable/DSO con sección .eh_frame_hdr no tiene una entrada de "
"encabezamiento de programa PT_GNU_EH_FRAME"
-#: src/elflint.c:4757
+#: src/elflint.c:4766
#, c-format
msgid "cannot read ELF header: %s\n"
msgstr "No se puede leer encabezamiento ELF: %s\n"
-#: src/elflint.c:4783
+#: src/elflint.c:4792
#, c-format
msgid "text relocation flag set but not needed\n"
msgstr "Bandera de reubicación de texto establecida pero no necesaria\n"
diff --git a/libdrgn/elfutils/po/ja.po b/libdrgn/elfutils/po/ja.po
index cd53f220c..97a529bdd 100644
--- a/libdrgn/elfutils/po/ja.po
+++ b/libdrgn/elfutils/po/ja.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ja\n"
"Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2019-11-26 09:48+0100\n"
+"POT-Creation-Date: 2020-03-30 12:56+0200\n"
"PO-Revision-Date: 2009-09-20 15:32+0900\n"
"Last-Translator: Hyu_gabaru Ryu_ichi \n"
"Language-Team: Japanese \n"
@@ -530,7 +530,7 @@ msgstr "バックエンドがありません"
#: libebl/eblcorenotetypename.c:100 libebl/eblobjnotetypename.c:77
#: libebl/eblobjnotetypename.c:109 libebl/eblobjnotetypename.c:130
#: libebl/eblosabiname.c:73 libebl/eblsectionname.c:83
-#: libebl/eblsectiontypename.c:115 libebl/eblsegmenttypename.c:79
+#: libebl/eblsectiontypename.c:115 libebl/eblsegmenttypename.c:85
msgid ""
msgstr "<不明>"
@@ -1677,14 +1677,14 @@ msgstr ""
"セクション [%2d] '%s': セクショングループ [%2zu] '%s' がグループメンバーを継"
"続していません\n"
-#: src/elflint.c:610 src/elflint.c:1494 src/elflint.c:1545 src/elflint.c:1651
-#: src/elflint.c:1987 src/elflint.c:2313 src/elflint.c:2932 src/elflint.c:3095
-#: src/elflint.c:3243 src/elflint.c:3433 src/elflint.c:4431
+#: src/elflint.c:610 src/elflint.c:1498 src/elflint.c:1549 src/elflint.c:1655
+#: src/elflint.c:1991 src/elflint.c:2317 src/elflint.c:2936 src/elflint.c:3099
+#: src/elflint.c:3247 src/elflint.c:3437 src/elflint.c:4435
#, c-format
msgid "section [%2d] '%s': cannot get section data\n"
msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
-#: src/elflint.c:623 src/elflint.c:1658
+#: src/elflint.c:623 src/elflint.c:1662
#, c-format
msgid ""
"section [%2d] '%s': referenced as string table for section [%2d] '%s' but "
@@ -1707,33 +1707,40 @@ msgstr ""
msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
msgstr "セクション [%2u] '%s': 項目サイズが ElfXX_Sym と一致しません\n"
-#: src/elflint.c:667
+#: src/elflint.c:662
+#, c-format
+msgid ""
+"section [%2u] '%s': number of local entries in 'st_info' larger than table "
+"size\n"
+msgstr ""
+
+#: src/elflint.c:671
#, c-format
msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
msgstr "セクション [%2d] '%s': シンボル %d を得られません: %s\n"
-#: src/elflint.c:672 src/elflint.c:675 src/elflint.c:678 src/elflint.c:681
-#: src/elflint.c:684 src/elflint.c:687
+#: src/elflint.c:676 src/elflint.c:679 src/elflint.c:682 src/elflint.c:685
+#: src/elflint.c:688 src/elflint.c:691
#, c-format
msgid "section [%2d] '%s': '%s' in zeroth entry not zero\n"
msgstr "セクション [%2d] '%s': 0番目の項目にある '%s' ゼロではありません\n"
-#: src/elflint.c:690
+#: src/elflint.c:694
#, c-format
msgid "section [%2d] '%s': XINDEX for zeroth entry not zero\n"
msgstr "セクション [%2d] '%s': 0番目の項目用の XINDEX がゼロではありません\n"
-#: src/elflint.c:700
+#: src/elflint.c:704
#, c-format
msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
msgstr "セクション [%2d] '%s': シンボル %zu を得られません: %s\n"
-#: src/elflint.c:709
+#: src/elflint.c:713
#, c-format
msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
msgstr "セクション [%2d] '%s': シンボル %zu: 不当な名前の値\n"
-#: src/elflint.c:724
+#: src/elflint.c:728
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: too large section index but no extended "
@@ -1742,7 +1749,7 @@ msgstr ""
"セクション [%2d] '%s': シンボル %zu: 大きすぎるセクションインデックスだが、拡"
"張セクションインデックスセクションがありません\n"
-#: src/elflint.c:730
+#: src/elflint.c:734
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
@@ -1752,29 +1759,29 @@ msgstr ""
"クス用に使われる XINDEX\n"
#. || sym->st_shndx > SHN_HIRESERVE always false
-#: src/elflint.c:742
+#: src/elflint.c:746
#, c-format
msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
msgstr "セクション [%2d] '%s': シンボル %zu: 不当なセクションインデックス\n"
-#: src/elflint.c:750
+#: src/elflint.c:754
#, c-format
msgid "section [%2d] '%s': symbol %zu: unknown type\n"
msgstr "セクション [%2d] '%s': シンボル %zu: 不明なタイプ\n"
-#: src/elflint.c:756
+#: src/elflint.c:760
#, c-format
msgid "section [%2d] '%s': symbol %zu: unknown symbol binding\n"
msgstr "セクション [%2d] '%s': シンボル %zu: 不明なシンボルバインディング\n"
-#: src/elflint.c:761
+#: src/elflint.c:765
#, c-format
msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
msgstr ""
"セクション [%2d] '%s': シンボル %zu: オブジェクトタイプと異なる固有のシンボ"
"ル\n"
-#: src/elflint.c:769
+#: src/elflint.c:773
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
@@ -1782,14 +1789,14 @@ msgstr ""
"セクション [%2d] '%s': シンボル %zu: COMMON はリロケータブルファイル内のみで"
"許されます\n"
-#: src/elflint.c:773
+#: src/elflint.c:777
#, c-format
msgid "section [%2d] '%s': symbol %zu: local COMMON symbols are nonsense\n"
msgstr ""
"セクション [%2d] '%s': シンボル %zu: ローカルな COMMON シンボルは意味がありま"
"せん\n"
-#: src/elflint.c:777
+#: src/elflint.c:781
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"
@@ -1797,12 +1804,12 @@ msgstr ""
"セクション [%2d] '%s': シンボル %zu: COMMON セクションの機能は意味がありませ"
"ん\n"
-#: src/elflint.c:828
+#: src/elflint.c:832
#, c-format
msgid "section [%2d] '%s': symbol %zu: st_value out of bounds\n"
msgstr "セクション [%2d] '%s': シンボル %zu: st_value 境界外\n"
-#: src/elflint.c:834 src/elflint.c:859 src/elflint.c:908
+#: src/elflint.c:838 src/elflint.c:863 src/elflint.c:912
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu does not fit completely in referenced section "
@@ -1811,7 +1818,7 @@ msgstr ""
"セクション [%2d] '%s': シンボル %zu は参照されるセクション [%2d] '%s' とは完"
"全に一致しません\n"
-#: src/elflint.c:843
+#: src/elflint.c:847
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
@@ -1820,7 +1827,7 @@ msgstr ""
"セクション [%2d] '%s': シンボル %zu: 参照されるセクション [%2d] '%s' は "
"SHF_TLS フラグが設定されていません\n"
-#: src/elflint.c:853 src/elflint.c:901
+#: src/elflint.c:857 src/elflint.c:905
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
@@ -1829,7 +1836,7 @@ msgstr ""
"セクション [%2d] '%s': シンボル %zu: st_value 参照されるセクション [%2d] "
"'%s' の境界外\n"
-#: src/elflint.c:880
+#: src/elflint.c:884
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
@@ -1837,7 +1844,7 @@ msgstr ""
"セクション [%2d] '%s': シンボル %zu: TLS プログラムヘッダー項目がない TLS シ"
"ンボル\n"
-#: src/elflint.c:886
+#: src/elflint.c:890
#, fuzzy, c-format
msgid ""
"section [%2d] '%s': symbol %zu: TLS symbol but couldn't get TLS program "
@@ -1846,7 +1853,7 @@ msgstr ""
"セクション [%2d] '%s': シンボル %zu: TLS プログラムヘッダー項目がない TLS シ"
"ンボル\n"
-#: src/elflint.c:894
+#: src/elflint.c:898
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] "
@@ -1855,7 +1862,7 @@ msgstr ""
"セクション [%2d] '%s': シンボル %zu: 参照されるセクション [%2d] '%s' の"
"st_value 不足\n"
-#: src/elflint.c:921
+#: src/elflint.c:925
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: local symbol outside range described in "
@@ -1864,7 +1871,7 @@ msgstr ""
"セクション [%2d] '%s': シンボル %zu: sh_info に記述された範囲外のローカルシン"
"ボル\n"
-#: src/elflint.c:928
+#: src/elflint.c:932
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
@@ -1873,12 +1880,12 @@ msgstr ""
"セクション [%2d] '%s': シンボル %zu: sh_info に記述された範囲外の非ローカルシ"
"ンボル\n"
-#: src/elflint.c:935
+#: src/elflint.c:939
#, c-format
msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
msgstr "セクション [%2d] '%s': シンボル %zu: 非ローカルセクションシンボル\n"
-#: src/elflint.c:985
+#: src/elflint.c:989
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section "
@@ -1887,7 +1894,7 @@ msgstr ""
"セクション [%2d] '%s': _GLOBAL_OFFSET_TABLE_ シンボルが間違ったセクション "
"[%2d] を参照しています\n"
-#: src/elflint.c:992
+#: src/elflint.c:996
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] "
@@ -1899,7 +1906,7 @@ msgstr ""
#. 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:1008
+#: src/elflint.c:1012
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %# does not "
@@ -1908,7 +1915,7 @@ msgstr ""
"セクション [%2d] '%s': _GLOBAL_OFFSET_TABLE_ シンボル値 %# は %s のセ"
"クションアドレス %# と一致しません\n"
-#: src/elflint.c:1015
+#: src/elflint.c:1019
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size % does not "
@@ -1917,7 +1924,7 @@ msgstr ""
"セクション [%2d] '%s': _GLOBAL_OFFSET_TABLE_ シンボルサイズ % は %s "
"のセクションサイズ % と一致しません\n"
-#: src/elflint.c:1023
+#: src/elflint.c:1027
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
@@ -1926,7 +1933,7 @@ msgstr ""
"セクション [%2d] '%s': _GLOBAL_OFFSET_TABLE_ シンボルはありますが、.got セク"
"ションがありません\n"
-#: src/elflint.c:1039
+#: src/elflint.c:1043
#, c-format
msgid ""
"section [%2d] '%s': _DYNAMIC_ symbol value %# does not match dynamic "
@@ -1935,7 +1942,7 @@ msgstr ""
"セクション [%2d] '%s': _DYNAMIC_ シンボル値 %# は動的セグメントアドレ"
"ス %# と一致しません\n"
-#: src/elflint.c:1046
+#: src/elflint.c:1050
#, c-format
msgid ""
"section [%2d] '%s': _DYNAMIC symbol size % does not match dynamic "
@@ -1944,7 +1951,7 @@ msgstr ""
"セクション [%2d] '%s': _DYNAMIC シンボルサイズ % は動的セグメントサイ"
"ズ % と一致しません\n"
-#: src/elflint.c:1059
+#: src/elflint.c:1063
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
@@ -1953,29 +1960,29 @@ msgstr ""
"セクション [%2d] '%s': シンボル %zu: 省略以外の可視性を持った動的シンボルテー"
"ブル中のシンボル\n"
-#: src/elflint.c:1063
+#: src/elflint.c:1067
#, 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:1101
+#: src/elflint.c:1105
#, fuzzy, c-format
msgid "section [%2d] '%s': cannot get section data.\n"
msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
-#: src/elflint.c:1117
+#: src/elflint.c:1121
#, c-format
msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
msgstr "セクション [%2d] '%s': この RELA セクション用に使われる DT_RELCOUNT\n"
-#: src/elflint.c:1128 src/elflint.c:1181
+#: src/elflint.c:1132 src/elflint.c:1185
#, 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:1153 src/elflint.c:1206
+#: src/elflint.c:1157 src/elflint.c:1210
#, c-format
msgid ""
"section [%2d] '%s': relative relocations after index %d as specified by "
@@ -1984,7 +1991,7 @@ msgstr ""
"セクション [%2d] '%s': UT_RELOCOUNT で指定されたインデックス %d 後の相対リロ"
"ケーション\n"
-#: src/elflint.c:1159 src/elflint.c:1212
+#: src/elflint.c:1163 src/elflint.c:1216
#, c-format
msgid ""
"section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
@@ -1993,52 +2000,52 @@ msgstr ""
"セクション [%2d] '%s': インデックス %zu での非相対リロケーション; %d 相対リ"
"ロケーションで指定された DT_RELCOUNT\n"
-#: src/elflint.c:1171
+#: src/elflint.c:1175
#, c-format
msgid "section [%2d] '%s': DT_RELACOUNT used for this REL section\n"
msgstr "セクション [%2d] '%s': この REL セクション用に使われる DT_RELACOUNT\n"
-#: src/elflint.c:1254
+#: src/elflint.c:1258
#, c-format
msgid "section [%2d] '%s': invalid destination section index\n"
msgstr "セクション [%2d] '%s': 不当な宛先セクションインデックス\n"
-#: src/elflint.c:1266
+#: src/elflint.c:1270
#, c-format
msgid "section [%2d] '%s': invalid destination section type\n"
msgstr "セクション [%2d] '%s': 不当な宛先セクションタイプ\n"
-#: src/elflint.c:1274
+#: src/elflint.c:1278
#, c-format
msgid "section [%2d] '%s': sh_info should be zero\n"
msgstr "セクション [%2d] '%s': sh_info はゼロでなければなりません\n"
-#: src/elflint.c:1282
+#: src/elflint.c:1286
#, fuzzy, c-format
msgid ""
"section [%2d] '%s': no relocations for merge-able string sections possible\n"
msgstr ""
"セクション [%2d] '%s': マージできるセクションのリロケーションは不可能です\n"
-#: src/elflint.c:1290
+#: src/elflint.c:1294
#, c-format
msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela\n"
msgstr ""
"セクション [%2d] '%s': セクション項目サイズが ElfXX_Rela と一致しません\n"
-#: src/elflint.c:1350
+#: src/elflint.c:1354
#, c-format
msgid "text relocation flag set but there is no read-only segment\n"
msgstr ""
"テキストリロケーションフラグが設定されていますが、読込み専用セグメントがあり"
"ません\n"
-#: src/elflint.c:1377
+#: src/elflint.c:1381
#, c-format
msgid "section [%2d] '%s': relocation %zu: invalid type\n"
msgstr "セクション [%2d] '%s': リロケーション %zu: 不当なタイプ\n"
-#: src/elflint.c:1385
+#: src/elflint.c:1389
#, c-format
msgid ""
"section [%2d] '%s': relocation %zu: relocation type invalid for the file "
@@ -2047,13 +2054,13 @@ msgstr ""
"セクション [%2d] '%s': リロケーション %zu: このファイル用のリロケーションタイ"
"プは不当です\n"
-#: src/elflint.c:1393
+#: src/elflint.c:1397
#, c-format
msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
msgstr ""
"セクション [%2d] '%s': リロケーション %zu: 不当なシンボルインデックス\n"
-#: src/elflint.c:1411
+#: src/elflint.c:1415
#, c-format
msgid ""
"section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
@@ -2062,12 +2069,12 @@ msgstr ""
"セクション [%2d] '%s': リロケーション %zu: シンボル '_GLOBAL_OFFSET_TABLE_' "
"のみが %s と一緒に使用できます\n"
-#: src/elflint.c:1428
+#: src/elflint.c:1432
#, c-format
msgid "section [%2d] '%s': relocation %zu: offset out of bounds\n"
msgstr "セクション [%2d] '%s': リロケーション %zu: オフセット境界外\n"
-#: src/elflint.c:1443
+#: src/elflint.c:1447
#, c-format
msgid ""
"section [%2d] '%s': relocation %zu: copy relocation against symbol of type "
@@ -2076,7 +2083,7 @@ msgstr ""
"セクション [%2d] '%s': リロケーション %zu: タイプ %s のシンボルに対するコピー"
"リロケーション\n"
-#: src/elflint.c:1464
+#: src/elflint.c:1468
#, c-format
msgid ""
"section [%2d] '%s': relocation %zu: read-only section modified but text "
@@ -2085,24 +2092,24 @@ msgstr ""
"セクション [%2d] '%s': リロケーション %zu: 読込み専用セクションが変更されまし"
"たが、テキストリロケーションフラグが設定されていません\n"
-#: src/elflint.c:1479
+#: src/elflint.c:1483
#, c-format
msgid "section [%2d] '%s': relocations are against loaded and unloaded data\n"
msgstr ""
"セクション [%2d] '%s': リロケーションがロードされたデータとロードされなかった"
"データに対してです\n"
-#: src/elflint.c:1519 src/elflint.c:1570
+#: src/elflint.c:1523 src/elflint.c:1574
#, c-format
msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
msgstr ""
-#: src/elflint.c:1646
+#: src/elflint.c:1650
#, c-format
msgid "more than one dynamic section present\n"
msgstr ""
-#: src/elflint.c:1664
+#: src/elflint.c:1668
#, fuzzy, c-format
msgid ""
"section [%2d]: referenced as string table for section [%2d] '%s' but section "
@@ -2111,427 +2118,427 @@ msgstr ""
"セクション [%2d] '%s': セクション [%2d] '%s' 用の文字列テーブルとして参照され"
"ていますが、タイプが SHT_STRTAB ではありません\n"
-#: src/elflint.c:1672
+#: src/elflint.c:1676
#, c-format
msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"
msgstr ""
-#: src/elflint.c:1677 src/elflint.c:1966
+#: src/elflint.c:1681 src/elflint.c:1970
#, c-format
msgid "section [%2d] '%s': sh_info not zero\n"
msgstr ""
-#: src/elflint.c:1687
+#: src/elflint.c:1691
#, c-format
msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
msgstr ""
-#: src/elflint.c:1695
+#: src/elflint.c:1699
#, c-format
msgid "section [%2d] '%s': non-DT_NULL entries follow DT_NULL entry\n"
msgstr ""
-#: src/elflint.c:1702
+#: src/elflint.c:1706
#, c-format
msgid "section [%2d] '%s': entry %zu: unknown tag\n"
msgstr ""
-#: src/elflint.c:1713
+#: src/elflint.c:1717
#, c-format
msgid "section [%2d] '%s': entry %zu: more than one entry with tag %s\n"
msgstr ""
-#: src/elflint.c:1723
+#: src/elflint.c:1727
#, c-format
msgid "section [%2d] '%s': entry %zu: level 2 tag %s used\n"
msgstr ""
-#: src/elflint.c:1741
+#: src/elflint.c:1745
#, c-format
msgid ""
"section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
msgstr ""
-#: src/elflint.c:1754
+#: src/elflint.c:1758
#, 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:1797
+#: src/elflint.c:1801
#, c-format
msgid ""
"section [%2d] '%s': entry %zu: %s value must point into loaded segment\n"
msgstr ""
-#: src/elflint.c:1812
+#: src/elflint.c:1816
#, c-format
msgid ""
"section [%2d] '%s': entry %zu: %s value must be valid offset in section "
"[%2d] '%s'\n"
msgstr ""
-#: src/elflint.c:1832 src/elflint.c:1860
+#: src/elflint.c:1836 src/elflint.c:1864
#, c-format
msgid "section [%2d] '%s': contains %s entry but not %s\n"
msgstr ""
-#: src/elflint.c:1844
+#: src/elflint.c:1848
#, c-format
msgid "section [%2d] '%s': mandatory tag %s not present\n"
msgstr ""
-#: src/elflint.c:1853
+#: src/elflint.c:1857
#, c-format
msgid "section [%2d] '%s': no hash section present\n"
msgstr ""
-#: src/elflint.c:1868 src/elflint.c:1875
+#: src/elflint.c:1872 src/elflint.c:1879
#, c-format
msgid "section [%2d] '%s': not all of %s, %s, and %s are present\n"
msgstr ""
-#: src/elflint.c:1885 src/elflint.c:1889
+#: src/elflint.c:1889 src/elflint.c:1893
#, c-format
msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
msgstr ""
-#: src/elflint.c:1895
+#: src/elflint.c:1899
#, c-format
msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
msgstr ""
-#: src/elflint.c:1906 src/elflint.c:1910 src/elflint.c:1914 src/elflint.c:1918
+#: src/elflint.c:1910 src/elflint.c:1914 src/elflint.c:1918 src/elflint.c:1922
#, c-format
msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
msgstr ""
-#: src/elflint.c:1930
+#: src/elflint.c:1934
#, c-format
msgid ""
"section [%2d] '%s': only relocatable files can have extended section index\n"
msgstr ""
-#: src/elflint.c:1940
+#: src/elflint.c:1944
#, c-format
msgid ""
"section [%2d] '%s': extended section index section not for symbol table\n"
msgstr ""
-#: src/elflint.c:1944
+#: src/elflint.c:1948
#, fuzzy, c-format
msgid "section [%2d] '%s': sh_link extended section index [%2d] is invalid\n"
msgstr "セクション [%2d] '%s': 不当な宛先セクションインデックス\n"
-#: src/elflint.c:1949
+#: src/elflint.c:1953
#, c-format
msgid "cannot get data for symbol section\n"
msgstr ""
-#: src/elflint.c:1952
+#: src/elflint.c:1956
#, c-format
msgid "section [%2d] '%s': entry size does not match Elf32_Word\n"
msgstr ""
-#: src/elflint.c:1961
+#: src/elflint.c:1965
#, c-format
msgid "section [%2d] '%s': extended index table too small for symbol table\n"
msgstr ""
-#: src/elflint.c:1976
+#: src/elflint.c:1980
#, c-format
msgid ""
"section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
"same symbol table\n"
msgstr ""
-#: src/elflint.c:1994
+#: src/elflint.c:1998
#, c-format
msgid "symbol 0 should have zero extended section index\n"
msgstr ""
-#: src/elflint.c:2006
+#: src/elflint.c:2010
#, c-format
msgid "cannot get data for symbol %zu\n"
msgstr ""
-#: src/elflint.c:2011
+#: src/elflint.c:2015
#, c-format
msgid "extended section index is % but symbol index is not XINDEX\n"
msgstr ""
-#: src/elflint.c:2028 src/elflint.c:2085
+#: src/elflint.c:2032 src/elflint.c:2089
#, c-format
msgid ""
"section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
msgstr ""
-#: src/elflint.c:2042 src/elflint.c:2099
+#: src/elflint.c:2046 src/elflint.c:2103
#, c-format
msgid "section [%2d] '%s': chain array too large\n"
msgstr ""
-#: src/elflint.c:2056 src/elflint.c:2113
+#: src/elflint.c:2060 src/elflint.c:2117
#, c-format
msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
msgstr ""
-#: src/elflint.c:2066
+#: src/elflint.c:2070
#, c-format
msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
msgstr ""
-#: src/elflint.c:2123
+#: src/elflint.c:2127
#, c-format
msgid "section [%2d] '%s': hash chain reference % out of bounds\n"
msgstr ""
-#: src/elflint.c:2136
+#: src/elflint.c:2140
#, fuzzy, c-format
msgid "section [%2d] '%s': not enough data\n"
msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
-#: src/elflint.c:2148
+#: src/elflint.c:2152
#, fuzzy, c-format
msgid "section [%2d] '%s': bitmask size zero or not power of 2: %u\n"
msgstr "セクション [%2d] '%s': 0番目の項目にある '%s' ゼロではありません\n"
-#: src/elflint.c:2164
+#: src/elflint.c:2168
#, c-format
msgid ""
"section [%2d] '%s': hash table section is too small (is %ld, expected at "
"least %ld)\n"
msgstr ""
-#: src/elflint.c:2173
+#: src/elflint.c:2177
#, c-format
msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
msgstr ""
-#: src/elflint.c:2207
+#: src/elflint.c:2211
#, c-format
msgid ""
"section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
msgstr ""
-#: src/elflint.c:2228
+#: src/elflint.c:2232
#, c-format
msgid ""
"section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
"undefined\n"
msgstr ""
-#: src/elflint.c:2241
+#: src/elflint.c:2245
#, c-format
msgid ""
"section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
msgstr ""
-#: src/elflint.c:2250
+#: src/elflint.c:2254
#, fuzzy, c-format
msgid ""
"section [%2d] '%s': mask index for symbol %u in chain for bucket %zu wrong\n"
msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
-#: src/elflint.c:2280
+#: src/elflint.c:2284
#, c-format
msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
msgstr ""
-#: src/elflint.c:2285
+#: src/elflint.c:2289
#, c-format
msgid ""
"section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
msgstr ""
-#: src/elflint.c:2291
+#: src/elflint.c:2295
#, c-format
msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
msgstr ""
-#: src/elflint.c:2304
+#: src/elflint.c:2308
#, c-format
msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
msgstr ""
-#: src/elflint.c:2322
+#: src/elflint.c:2326
#, c-format
msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
msgstr ""
-#: src/elflint.c:2326
+#: src/elflint.c:2330
#, fuzzy, c-format
msgid "section [%2d] '%s': invalid sh_link symbol table section index [%2d]\n"
msgstr "セクション [%2d] '%s': 不当な宛先セクションインデックス\n"
-#: src/elflint.c:2336
+#: src/elflint.c:2340
#, c-format
msgid "section [%2d] '%s': hash table entry size incorrect\n"
msgstr ""
-#: src/elflint.c:2341
+#: src/elflint.c:2345
#, c-format
msgid "section [%2d] '%s': not marked to be allocated\n"
msgstr ""
-#: src/elflint.c:2346
+#: src/elflint.c:2350
#, c-format
msgid ""
"section [%2d] '%s': hash table has not even room for initial administrative "
"entries\n"
msgstr ""
-#: src/elflint.c:2395
+#: src/elflint.c:2399
#, c-format
msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
msgstr ""
-#: src/elflint.c:2419 src/elflint.c:2484 src/elflint.c:2519
+#: src/elflint.c:2423 src/elflint.c:2488 src/elflint.c:2523
#, fuzzy, c-format
msgid "hash section [%2zu] '%s' does not contain enough data\n"
msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
-#: src/elflint.c:2440
+#: src/elflint.c:2444
#, fuzzy, c-format
msgid "hash section [%2zu] '%s' has zero bit mask words\n"
msgstr ""
"\n"
"セクション [%Zu] '%s' にはダンプすべきデータがありません。\n"
-#: src/elflint.c:2451 src/elflint.c:2495 src/elflint.c:2532
+#: src/elflint.c:2455 src/elflint.c:2499 src/elflint.c:2536
#, fuzzy, c-format
msgid "hash section [%2zu] '%s' uses too much data\n"
msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
-#: src/elflint.c:2466
+#: src/elflint.c:2470
#, c-format
msgid ""
"hash section [%2zu] '%s' invalid symbol index % (max_nsyms: "
"%, nentries: %\n"
msgstr ""
-#: src/elflint.c:2553
+#: src/elflint.c:2557
#, fuzzy, c-format
msgid "hash section [%2zu] '%s' invalid sh_entsize\n"
msgstr "セクション [%2d] '%s': 不当な宛先セクションタイプ\n"
-#: src/elflint.c:2563 src/elflint.c:2567
+#: src/elflint.c:2567 src/elflint.c:2571
#, c-format
msgid "section [%2zu] '%s': reference to symbol index 0\n"
msgstr ""
-#: src/elflint.c:2574
+#: src/elflint.c:2578
#, 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:2586
+#: src/elflint.c:2590
#, 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:2602
+#: src/elflint.c:2606
#, c-format
msgid "section [%2d] '%s': nonzero sh_%s for NULL section\n"
msgstr ""
-#: src/elflint.c:2622
+#: src/elflint.c:2626
#, c-format
msgid ""
"section [%2d] '%s': section groups only allowed in relocatable object files\n"
msgstr ""
-#: src/elflint.c:2633
+#: src/elflint.c:2637
#, c-format
msgid "section [%2d] '%s': cannot get symbol table: %s\n"
msgstr ""
-#: src/elflint.c:2638
+#: src/elflint.c:2642
#, c-format
msgid "section [%2d] '%s': section reference in sh_link is no symbol table\n"
msgstr ""
-#: src/elflint.c:2644
+#: src/elflint.c:2648
#, c-format
msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
msgstr ""
-#: src/elflint.c:2649
+#: src/elflint.c:2653
#, c-format
msgid "section [%2d] '%s': sh_flags not zero\n"
msgstr ""
-#: src/elflint.c:2656
+#: src/elflint.c:2660
#, c-format
msgid "section [%2d] '%s': cannot get symbol for signature\n"
msgstr ""
-#: src/elflint.c:2660
+#: src/elflint.c:2664
#, fuzzy, c-format
msgid "section [%2d] '%s': cannot get symbol name for signature\n"
msgstr "セクション [%2d] '%s': シンボル %d を得られません: %s\n"
-#: src/elflint.c:2665
+#: src/elflint.c:2669
#, fuzzy, c-format
msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
-#: src/elflint.c:2671
+#: src/elflint.c:2675
#, c-format
msgid "section [%2d] '%s': sh_flags not set correctly\n"
msgstr ""
-#: src/elflint.c:2677
+#: src/elflint.c:2681
#, c-format
msgid "section [%2d] '%s': cannot get data: %s\n"
msgstr ""
-#: src/elflint.c:2686
+#: src/elflint.c:2690
#, c-format
msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)\n"
msgstr ""
-#: src/elflint.c:2692
+#: src/elflint.c:2696
#, c-format
msgid "section [%2d] '%s': section group without flags word\n"
msgstr ""
-#: src/elflint.c:2700
+#: src/elflint.c:2704
#, c-format
msgid "section [%2d] '%s': section group without member\n"
msgstr ""
-#: src/elflint.c:2704
+#: src/elflint.c:2708
#, c-format
msgid "section [%2d] '%s': section group with only one member\n"
msgstr ""
-#: src/elflint.c:2715
+#: src/elflint.c:2719
#, c-format
msgid "section [%2d] '%s': unknown section group flags\n"
msgstr ""
-#: src/elflint.c:2727
+#: src/elflint.c:2731
#, fuzzy, c-format
msgid "section [%2d] '%s': section index %zu out of range\n"
msgstr "セクション [%2d] '%s': リロケーション %zu: オフセット境界外\n"
-#: src/elflint.c:2736
+#: src/elflint.c:2740
#, c-format
msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
msgstr ""
-#: src/elflint.c:2743
+#: src/elflint.c:2747
#, c-format
msgid "section [%2d] '%s': section group contains another group [%2d] '%s'\n"
msgstr ""
-#: src/elflint.c:2749
+#: src/elflint.c:2753
#, fuzzy, c-format
msgid ""
"section [%2d] '%s': element %zu references section [%2d] '%s' without "
@@ -2540,765 +2547,765 @@ msgstr ""
"セクション [%2d] '%s': シンボル %zu: 参照されるセクション [%2d] '%s' は "
"SHF_TLS フラグが設定されていません\n"
-#: src/elflint.c:2756
+#: src/elflint.c:2760
#, c-format
msgid "section [%2d] '%s' is contained in more than one section group\n"
msgstr ""
-#: src/elflint.c:2946
+#: src/elflint.c:2950
#, 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:2958
+#: src/elflint.c:2962
#, c-format
msgid ""
"section [%2d] '%s' has different number of entries than symbol table [%2d] "
"'%s'\n"
msgstr ""
-#: src/elflint.c:2974
+#: src/elflint.c:2978
#, c-format
msgid "section [%2d] '%s': symbol %d: cannot read version data\n"
msgstr ""
-#: src/elflint.c:2990
+#: src/elflint.c:2994
#, c-format
msgid "section [%2d] '%s': symbol %d: local symbol with global scope\n"
msgstr ""
-#: src/elflint.c:2998
+#: src/elflint.c:3002
#, c-format
msgid "section [%2d] '%s': symbol %d: local symbol with version\n"
msgstr ""
-#: src/elflint.c:3012
+#: src/elflint.c:3016
#, c-format
msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
msgstr ""
-#: src/elflint.c:3017
+#: src/elflint.c:3021
#, c-format
msgid ""
"section [%2d] '%s': symbol %d: version index %d is for defined version\n"
msgstr ""
-#: src/elflint.c:3027
+#: src/elflint.c:3031
#, c-format
msgid ""
"section [%2d] '%s': symbol %d: version index %d is for requested version\n"
msgstr ""
-#: src/elflint.c:3080
+#: src/elflint.c:3084
#, c-format
msgid "more than one version reference section present\n"
msgstr ""
-#: src/elflint.c:3088 src/elflint.c:3235
+#: src/elflint.c:3092 src/elflint.c:3239
#, c-format
msgid "section [%2d] '%s': sh_link does not link to string table\n"
msgstr ""
-#: src/elflint.c:3113 src/elflint.c:3289
+#: src/elflint.c:3117 src/elflint.c:3293
#, c-format
msgid "section [%2d] '%s': entry %d has wrong version %d\n"
msgstr ""
-#: src/elflint.c:3120 src/elflint.c:3296
+#: src/elflint.c:3124 src/elflint.c:3300
#, c-format
msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
msgstr ""
-#: src/elflint.c:3130
+#: src/elflint.c:3134
#, c-format
msgid "section [%2d] '%s': entry %d has invalid file reference\n"
msgstr ""
-#: src/elflint.c:3138
+#: src/elflint.c:3142
#, c-format
msgid "section [%2d] '%s': entry %d references unknown dependency\n"
msgstr ""
-#: src/elflint.c:3150
+#: src/elflint.c:3154
#, c-format
msgid "section [%2d] '%s': auxiliary entry %d of entry %d has unknown flag\n"
msgstr ""
-#: src/elflint.c:3158
+#: src/elflint.c:3162
#, c-format
msgid ""
"section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
"reference\n"
msgstr ""
-#: src/elflint.c:3167
+#: src/elflint.c:3171
#, c-format
msgid ""
"section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: "
"%#x, expected %#x\n"
msgstr ""
-#: src/elflint.c:3176
+#: src/elflint.c:3180
#, c-format
msgid ""
"section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
"name '%s'\n"
msgstr ""
-#: src/elflint.c:3187
+#: src/elflint.c:3191
#, c-format
msgid ""
"section [%2d] '%s': auxiliary entry %d of entry %d has wrong next field\n"
msgstr ""
-#: src/elflint.c:3204 src/elflint.c:3380
+#: src/elflint.c:3208 src/elflint.c:3384
#, c-format
msgid "section [%2d] '%s': entry %d has invalid offset to next entry\n"
msgstr ""
-#: src/elflint.c:3212 src/elflint.c:3388
+#: src/elflint.c:3216 src/elflint.c:3392
#, c-format
msgid ""
"section [%2d] '%s': entry %d has zero offset to next entry, but sh_info says "
"there are more entries\n"
msgstr ""
-#: src/elflint.c:3227
+#: src/elflint.c:3231
#, c-format
msgid "more than one version definition section present\n"
msgstr ""
-#: src/elflint.c:3274
+#: src/elflint.c:3278
#, c-format
msgid "section [%2d] '%s': more than one BASE definition\n"
msgstr ""
-#: src/elflint.c:3278
+#: src/elflint.c:3282
#, c-format
msgid "section [%2d] '%s': BASE definition must have index VER_NDX_GLOBAL\n"
msgstr ""
-#: src/elflint.c:3284
+#: src/elflint.c:3288
#, c-format
msgid "section [%2d] '%s': entry %d has unknown flag\n"
msgstr ""
-#: src/elflint.c:3311
+#: src/elflint.c:3315
#, c-format
msgid "section [%2d] '%s': entry %d has invalid name reference\n"
msgstr ""
-#: src/elflint.c:3318
+#: src/elflint.c:3322
#, c-format
msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
msgstr ""
-#: src/elflint.c:3326
+#: src/elflint.c:3330
#, c-format
msgid "section [%2d] '%s': entry %d has duplicate version name '%s'\n"
msgstr ""
-#: src/elflint.c:3346
+#: src/elflint.c:3350
#, c-format
msgid ""
"section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
msgstr ""
-#: src/elflint.c:3363
+#: src/elflint.c:3367
#, c-format
msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
msgstr ""
-#: src/elflint.c:3396
+#: src/elflint.c:3400
#, c-format
msgid "section [%2d] '%s': no BASE definition\n"
msgstr ""
-#: src/elflint.c:3412
+#: src/elflint.c:3416
#, c-format
msgid "section [%2d] '%s': unknown parent version '%s'\n"
msgstr ""
-#: src/elflint.c:3425
+#: src/elflint.c:3429
#, c-format
msgid "section [%2d] '%s': empty object attributes section\n"
msgstr ""
-#: src/elflint.c:3446
+#: src/elflint.c:3450
#, c-format
msgid "section [%2d] '%s': unrecognized attribute format\n"
msgstr ""
-#: src/elflint.c:3462
+#: src/elflint.c:3466
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: zero length field in attribute section\n"
msgstr ""
-#: src/elflint.c:3471
+#: src/elflint.c:3475
#, c-format
msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
msgstr ""
-#: src/elflint.c:3483
+#: src/elflint.c:3487
#, c-format
msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
msgstr ""
-#: src/elflint.c:3500
+#: src/elflint.c:3504
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
msgstr ""
-#: src/elflint.c:3509
+#: src/elflint.c:3513
#, c-format
msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
msgstr ""
-#: src/elflint.c:3518
+#: src/elflint.c:3522
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
msgstr ""
-#: src/elflint.c:3533
+#: src/elflint.c:3537
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
msgstr ""
#. Tag_File
-#: src/elflint.c:3544
+#: src/elflint.c:3548
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
msgstr ""
-#: src/elflint.c:3562
+#: src/elflint.c:3566
#, c-format
msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
msgstr ""
-#: src/elflint.c:3573
+#: src/elflint.c:3577
#, c-format
msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
msgstr ""
-#: src/elflint.c:3586
+#: src/elflint.c:3590
#, c-format
msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
msgstr ""
-#: src/elflint.c:3590
+#: src/elflint.c:3594
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: unrecognized %s attribute value %\n"
msgstr ""
-#: src/elflint.c:3600
+#: src/elflint.c:3604
#, c-format
msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
msgstr ""
-#: src/elflint.c:3606
+#: src/elflint.c:3610
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
msgstr ""
-#: src/elflint.c:3695
+#: src/elflint.c:3699
#, c-format
msgid "cannot get section header of zeroth section\n"
msgstr ""
-#: src/elflint.c:3699
+#: src/elflint.c:3703
#, c-format
msgid "zeroth section has nonzero name\n"
msgstr ""
-#: src/elflint.c:3701
+#: src/elflint.c:3705
#, c-format
msgid "zeroth section has nonzero type\n"
msgstr ""
-#: src/elflint.c:3703
+#: src/elflint.c:3707
#, c-format
msgid "zeroth section has nonzero flags\n"
msgstr ""
-#: src/elflint.c:3705
+#: src/elflint.c:3709
#, c-format
msgid "zeroth section has nonzero address\n"
msgstr ""
-#: src/elflint.c:3707
+#: src/elflint.c:3711
#, c-format
msgid "zeroth section has nonzero offset\n"
msgstr ""
-#: src/elflint.c:3709
+#: src/elflint.c:3713
#, c-format
msgid "zeroth section has nonzero align value\n"
msgstr ""
-#: src/elflint.c:3711
+#: src/elflint.c:3715
#, c-format
msgid "zeroth section has nonzero entry size value\n"
msgstr ""
-#: src/elflint.c:3714
+#: src/elflint.c:3718
#, c-format
msgid ""
"zeroth section has nonzero size value while ELF header has nonzero shnum "
"value\n"
msgstr ""
-#: src/elflint.c:3718
+#: src/elflint.c:3722
#, c-format
msgid ""
"zeroth section has nonzero link value while ELF header does not signal "
"overflow in shstrndx\n"
msgstr ""
-#: src/elflint.c:3722
+#: src/elflint.c:3726
#, c-format
msgid ""
"zeroth section has nonzero link value while ELF header does not signal "
"overflow in phnum\n"
msgstr ""
-#: src/elflint.c:3740
+#: src/elflint.c:3744
#, c-format
msgid "cannot get section header for section [%2zu] '%s': %s\n"
msgstr ""
-#: src/elflint.c:3749
+#: src/elflint.c:3753
#, c-format
msgid "section [%2zu]: invalid name\n"
msgstr ""
-#: src/elflint.c:3776
+#: src/elflint.c:3780
#, c-format
msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
msgstr ""
-#: src/elflint.c:3794
+#: src/elflint.c:3798
#, c-format
msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
msgstr ""
-#: src/elflint.c:3812
+#: src/elflint.c:3816
#, c-format
msgid ""
"section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
msgstr ""
-#: src/elflint.c:3830
+#: src/elflint.c:3834
#, c-format
msgid "section [%2zu] '%s' present in object file\n"
msgstr ""
-#: src/elflint.c:3836 src/elflint.c:3868
+#: src/elflint.c:3840 src/elflint.c:3872
#, c-format
msgid ""
"section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
msgstr ""
-#: src/elflint.c:3841 src/elflint.c:3873
+#: src/elflint.c:3845 src/elflint.c:3877
#, c-format
msgid ""
"section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
"segments\n"
msgstr ""
-#: src/elflint.c:3849
+#: src/elflint.c:3853
#, c-format
msgid ""
"section [%2zu] '%s' is extension section index table in non-object file\n"
msgstr ""
-#: src/elflint.c:3892
+#: src/elflint.c:3896
#, c-format
msgid "section [%2zu] '%s': size not multiple of entry size\n"
msgstr ""
-#: src/elflint.c:3897
+#: src/elflint.c:3901
#, c-format
msgid "cannot get section header\n"
msgstr ""
-#: src/elflint.c:3907
+#: src/elflint.c:3911
#, c-format
msgid "section [%2zu] '%s' has unsupported type %d\n"
msgstr ""
-#: src/elflint.c:3922
+#: src/elflint.c:3926
#, c-format
msgid ""
"section [%2zu] '%s' contains invalid processor-specific flag(s) %#\n"
msgstr ""
-#: src/elflint.c:3929
+#: src/elflint.c:3933
#, c-format
msgid "section [%2zu] '%s' contains unknown flag(s) %#\n"
msgstr ""
-#: src/elflint.c:3937
+#: src/elflint.c:3941
#, c-format
msgid "section [%2zu] '%s': thread-local data sections address not zero\n"
msgstr ""
-#: src/elflint.c:3947
+#: src/elflint.c:3951
#, fuzzy, c-format
msgid "section [%2zu] '%s': allocated section cannot be compressed\n"
msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
-#: src/elflint.c:3952
+#: src/elflint.c:3956
#, fuzzy, c-format
msgid "section [%2zu] '%s': nobits section cannot be compressed\n"
msgstr "セクション [%2d] '%s': セクションデータを得られません\n"
-#: src/elflint.c:3958
+#: src/elflint.c:3962
#, c-format
msgid ""
"section [%2zu] '%s': compressed section with no compression header: %s\n"
msgstr ""
-#: src/elflint.c:3964
+#: src/elflint.c:3968
#, c-format
msgid "section [%2zu] '%s': invalid section reference in link value\n"
msgstr ""
-#: src/elflint.c:3969
+#: src/elflint.c:3973
#, c-format
msgid "section [%2zu] '%s': invalid section reference in info value\n"
msgstr ""
-#: src/elflint.c:3976
+#: src/elflint.c:3980
#, c-format
msgid "section [%2zu] '%s': strings flag set without merge flag\n"
msgstr ""
-#: src/elflint.c:3981
+#: src/elflint.c:3985
#, c-format
msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
msgstr ""
-#: src/elflint.c:4000
+#: src/elflint.c:4004
#, c-format
msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
msgstr ""
-#: src/elflint.c:4009
+#: src/elflint.c:4013
#, c-format
msgid "section [%2zu] '%s' must be of type NOBITS in debuginfo files\n"
msgstr ""
-#: src/elflint.c:4016
+#: src/elflint.c:4020
#, c-format
msgid "section [%2zu] '%s' is both executable and writable\n"
msgstr ""
-#: src/elflint.c:4047
+#: src/elflint.c:4051
#, c-format
msgid ""
"section [%2zu] '%s' not fully contained in segment of program header entry "
"%d\n"
msgstr ""
-#: src/elflint.c:4057
+#: src/elflint.c:4061
#, 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:4083
+#: src/elflint.c:4087
#, c-format
msgid ""
"section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
"program header entry %d and file contents is non-zero\n"
msgstr ""
-#: src/elflint.c:4094
+#: src/elflint.c:4098
#, 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:4105
+#: src/elflint.c:4109
#, c-format
msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
msgstr ""
-#: src/elflint.c:4115
+#: src/elflint.c:4119
#, c-format
msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
msgstr ""
-#: src/elflint.c:4125
+#: src/elflint.c:4129
#, c-format
msgid ""
"section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
msgstr ""
-#: src/elflint.c:4131
+#: src/elflint.c:4135
#, 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:4139
+#: src/elflint.c:4143
#, c-format
msgid ""
"section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
msgstr ""
-#: src/elflint.c:4190
+#: src/elflint.c:4194
#, c-format
msgid "more than one version symbol table present\n"
msgstr ""
-#: src/elflint.c:4213
+#: src/elflint.c:4217
#, c-format
msgid "INTERP program header entry but no .interp section\n"
msgstr ""
-#: src/elflint.c:4224
+#: src/elflint.c:4228
#, c-format
msgid ""
"loadable segment [%u] is executable but contains no executable sections\n"
msgstr ""
-#: src/elflint.c:4230
+#: src/elflint.c:4234
#, c-format
msgid "loadable segment [%u] is writable but contains no writable sections\n"
msgstr ""
-#: src/elflint.c:4241
+#: src/elflint.c:4245
#, c-format
msgid ""
"no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
"exist\n"
msgstr ""
-#: src/elflint.c:4254
+#: src/elflint.c:4258
#, c-format
msgid "duplicate version index %d\n"
msgstr ""
-#: src/elflint.c:4268
+#: src/elflint.c:4272
#, c-format
msgid ".gnu.versym section present without .gnu.versym_d or .gnu.versym_r\n"
msgstr ""
-#: src/elflint.c:4317
+#: src/elflint.c:4321
#, c-format
msgid "phdr[%d]: unknown core file note type % at offset %\n"
msgstr ""
-#: src/elflint.c:4321
+#: src/elflint.c:4325
#, c-format
msgid ""
"section [%2d] '%s': unknown core file note type % at offset %zu\n"
msgstr ""
-#: src/elflint.c:4370
+#: src/elflint.c:4374
#, c-format
msgid ""
"phdr[%d]: unknown object file note type % with owner name '%s' at "
"offset %zu\n"
msgstr ""
-#: src/elflint.c:4375
+#: src/elflint.c:4379
#, c-format
msgid ""
"section [%2d] '%s': unknown object file note type % with owner name "
"'%s' at offset %zu\n"
msgstr ""
-#: src/elflint.c:4394
+#: src/elflint.c:4398
#, c-format
msgid "phdr[%d]: no note entries defined for the type of file\n"
msgstr ""
-#: src/elflint.c:4414
+#: src/elflint.c:4418
#, c-format
msgid "phdr[%d]: cannot get content of note section: %s\n"
msgstr ""
-#: src/elflint.c:4417
+#: src/elflint.c:4421
#, c-format
msgid "phdr[%d]: extra % bytes after last note\n"
msgstr ""
-#: src/elflint.c:4438
+#: src/elflint.c:4442
#, c-format
msgid "section [%2d] '%s': no note entries defined for the type of file\n"
msgstr ""
-#: src/elflint.c:4445
+#: src/elflint.c:4449
#, c-format
msgid "section [%2d] '%s': cannot get content of note section\n"
msgstr ""
-#: src/elflint.c:4448
+#: src/elflint.c:4452
#, c-format
msgid "section [%2d] '%s': extra % bytes after last note\n"
msgstr ""
-#: src/elflint.c:4466
+#: src/elflint.c:4470
#, c-format
msgid ""
"only executables, shared objects, and core files can have program headers\n"
msgstr ""
-#: src/elflint.c:4481
+#: src/elflint.c:4485
#, c-format
msgid "cannot get program header entry %d: %s\n"
msgstr ""
-#: src/elflint.c:4490
+#: src/elflint.c:4499
#, c-format
msgid "program header entry %d: unknown program header entry type %#\n"
msgstr ""
-#: src/elflint.c:4501
+#: src/elflint.c:4510
#, c-format
msgid "more than one INTERP entry in program header\n"
msgstr ""
-#: src/elflint.c:4509
+#: src/elflint.c:4518
#, c-format
msgid "more than one TLS entry in program header\n"
msgstr ""
-#: src/elflint.c:4516
+#: src/elflint.c:4525
#, c-format
msgid "static executable cannot have dynamic sections\n"
msgstr ""
-#: src/elflint.c:4530
+#: src/elflint.c:4539
#, c-format
msgid "dynamic section reference in program header has wrong offset\n"
msgstr ""
-#: src/elflint.c:4533
+#: src/elflint.c:4542
#, c-format
msgid "dynamic section size mismatch in program and section header\n"
msgstr ""
-#: src/elflint.c:4543
+#: src/elflint.c:4552
#, c-format
msgid "more than one GNU_RELRO entry in program header\n"
msgstr ""
-#: src/elflint.c:4564
+#: src/elflint.c:4573
#, c-format
msgid "loadable segment GNU_RELRO applies to is not writable\n"
msgstr ""
-#: src/elflint.c:4575
+#: src/elflint.c:4584
#, c-format
msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
msgstr ""
-#: src/elflint.c:4582
+#: src/elflint.c:4591
#, c-format
msgid ""
"GNU_RELRO [%u] flags are not a subset of the loadable segment [%u] flags\n"
msgstr ""
-#: src/elflint.c:4591 src/elflint.c:4614
+#: src/elflint.c:4600 src/elflint.c:4623
#, c-format
msgid "%s segment not contained in a loaded segment\n"
msgstr ""
-#: src/elflint.c:4620
+#: src/elflint.c:4629
#, c-format
msgid "program header offset in ELF header and PHDR entry do not match"
msgstr ""
-#: src/elflint.c:4647
+#: src/elflint.c:4656
#, c-format
msgid "call frame search table reference in program header has wrong offset\n"
msgstr ""
-#: src/elflint.c:4650
+#: src/elflint.c:4659
#, c-format
msgid "call frame search table size mismatch in program and section header\n"
msgstr ""
-#: src/elflint.c:4663
+#: src/elflint.c:4672
#, c-format
msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
msgstr ""
-#: src/elflint.c:4671
+#: src/elflint.c:4680
#, c-format
msgid "call frame search table must be allocated\n"
msgstr ""
-#: src/elflint.c:4674
+#: src/elflint.c:4683
#, c-format
msgid "section [%2zu] '%s' must be allocated\n"
msgstr ""
-#: src/elflint.c:4678
+#: src/elflint.c:4687
#, c-format
msgid "call frame search table must not be writable\n"
msgstr ""
-#: src/elflint.c:4681
+#: src/elflint.c:4690
#, c-format
msgid "section [%2zu] '%s' must not be writable\n"
msgstr ""
-#: src/elflint.c:4686
+#: src/elflint.c:4695
#, c-format
msgid "call frame search table must not be executable\n"
msgstr ""
-#: src/elflint.c:4689
+#: src/elflint.c:4698
#, c-format
msgid "section [%2zu] '%s' must not be executable\n"
msgstr ""
-#: src/elflint.c:4700
+#: src/elflint.c:4709
#, c-format
msgid "program header entry %d: file size greater than memory size\n"
msgstr ""
-#: src/elflint.c:4707
+#: src/elflint.c:4716
#, c-format
msgid "program header entry %d: alignment not a power of 2\n"
msgstr ""
-#: src/elflint.c:4710
+#: src/elflint.c:4719
#, c-format
msgid ""
"program header entry %d: file offset and virtual address not module of "
"alignment\n"
msgstr ""
-#: src/elflint.c:4723
+#: src/elflint.c:4732
#, 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:4757
+#: src/elflint.c:4766
#, c-format
msgid "cannot read ELF header: %s\n"
msgstr ""
-#: src/elflint.c:4783
+#: src/elflint.c:4792
#, c-format
msgid "text relocation flag set but not needed\n"
msgstr ""
diff --git a/libdrgn/elfutils/po/pl.po b/libdrgn/elfutils/po/pl.po
index 54a016411..63e09a37f 100644
--- a/libdrgn/elfutils/po/pl.po
+++ b/libdrgn/elfutils/po/pl.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: elfutils\n"
"Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2019-11-26 09:48+0100\n"
+"POT-Creation-Date: 2020-03-30 12:56+0200\n"
"PO-Revision-Date: 2016-12-29 17:48+0100\n"
"Last-Translator: Piotr Drąg \n"
"Language-Team: Polish \n"
@@ -526,7 +526,7 @@ msgstr "Brak zaplecza"
#: libebl/eblcorenotetypename.c:100 libebl/eblobjnotetypename.c:77
#: libebl/eblobjnotetypename.c:109 libebl/eblobjnotetypename.c:130
#: libebl/eblosabiname.c:73 libebl/eblsectionname.c:83
-#: libebl/eblsectiontypename.c:115 libebl/eblsegmenttypename.c:79
+#: libebl/eblsectiontypename.c:115 libebl/eblsegmenttypename.c:85
msgid ""
msgstr ""
@@ -1673,14 +1673,14 @@ msgid ""
msgstr ""
"sekcja [%2d] „%s”: grupa sekcji [%2zu] „%s” nie poprzedza elementu grupy\n"
-#: src/elflint.c:610 src/elflint.c:1494 src/elflint.c:1545 src/elflint.c:1651
-#: src/elflint.c:1987 src/elflint.c:2313 src/elflint.c:2932 src/elflint.c:3095
-#: src/elflint.c:3243 src/elflint.c:3433 src/elflint.c:4431
+#: src/elflint.c:610 src/elflint.c:1498 src/elflint.c:1549 src/elflint.c:1655
+#: src/elflint.c:1991 src/elflint.c:2317 src/elflint.c:2936 src/elflint.c:3099
+#: src/elflint.c:3247 src/elflint.c:3437 src/elflint.c:4435
#, c-format
msgid "section [%2d] '%s': cannot get section data\n"
msgstr "sekcja [%2d] „%s”: nie można uzyskać danych sekcji\n"
-#: src/elflint.c:623 src/elflint.c:1658
+#: src/elflint.c:623 src/elflint.c:1662
#, c-format
msgid ""
"section [%2d] '%s': referenced as string table for section [%2d] '%s' but "
@@ -1703,33 +1703,40 @@ msgstr ""
msgid "section [%2u] '%s': entry size is does not match ElfXX_Sym\n"
msgstr "sekcja [%2u] „%s”: rozmiar wpisu nie zgadza się z ElfXX_Sym\n"
-#: src/elflint.c:667
+#: src/elflint.c:662
+#, fuzzy, c-format
+msgid ""
+"section [%2u] '%s': number of local entries in 'st_info' larger than table "
+"size\n"
+msgstr "sekcja [%2d] „%s”: brak określonych wpisów notatek dla typu pliku\n"
+
+#: src/elflint.c:671
#, c-format
msgid "section [%2d] '%s': cannot get symbol %d: %s\n"
msgstr "sekcja [%2d] „%s”: nie można uzyskać symbolu %d: %s\n"
-#: src/elflint.c:672 src/elflint.c:675 src/elflint.c:678 src/elflint.c:681
-#: src/elflint.c:684 src/elflint.c:687
+#: src/elflint.c:676 src/elflint.c:679 src/elflint.c:682 src/elflint.c:685
+#: src/elflint.c:688 src/elflint.c:691
#, 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:690
+#: src/elflint.c:694
#, 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:700
+#: src/elflint.c:704
#, c-format
msgid "section [%2d] '%s': cannot get symbol %zu: %s\n"
msgstr "sekcja [%2d] „%s”: nie można uzyskać symbolu %zu: %s\n"
-#: src/elflint.c:709
+#: src/elflint.c:713
#, c-format
msgid "section [%2d] '%s': symbol %zu: invalid name value\n"
msgstr "sekcja [%2d] „%s”: symbol %zu: nieprawidłowa wartość nazwy\n"
-#: src/elflint.c:724
+#: src/elflint.c:728
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: too large section index but no extended "
@@ -1738,7 +1745,7 @@ msgstr ""
"sekcja [%2d] „%s”: symbol %zu: za duży indeks sekcji, ale nie ma sekcji "
"rozszerzonych indeksów sekcji\n"
-#: src/elflint.c:730
+#: src/elflint.c:734
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: XINDEX used for index which would fit in "
@@ -1748,28 +1755,28 @@ msgstr ""
"się w st_shndx (%)\n"
#. || sym->st_shndx > SHN_HIRESERVE always false
-#: src/elflint.c:742
+#: src/elflint.c:746
#, c-format
msgid "section [%2d] '%s': symbol %zu: invalid section index\n"
msgstr "sekcja [%2d] „%s”: symbol %zu: nieprawidłowy indeks sekcji\n"
-#: src/elflint.c:750
+#: src/elflint.c:754
#, c-format
msgid "section [%2d] '%s': symbol %zu: unknown type\n"
msgstr "sekcja [%2d] „%s”: symbol %zu: nieznany typ\n"
-#: src/elflint.c:756
+#: src/elflint.c:760
#, 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:761
+#: src/elflint.c:765
#, c-format
msgid "section [%2d] '%s': symbol %zu: unique symbol not of object type\n"
msgstr ""
"sekcja [%2d] „%s”: symbol %zu: unikalny symbol nie jest typem obiektu\n"
-#: src/elflint.c:769
+#: src/elflint.c:773
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: COMMON only allowed in relocatable files\n"
@@ -1777,23 +1784,23 @@ msgstr ""
"sekcja [%2d] „%s”: symbol %zu: COMMON jest dozwolone tylko w plikach "
"relokowalnych\n"
-#: src/elflint.c:773
+#: src/elflint.c:777
#, 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:777
+#: src/elflint.c:781
#, 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:828
+#: src/elflint.c:832
#, 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:834 src/elflint.c:859 src/elflint.c:908
+#: src/elflint.c:838 src/elflint.c:863 src/elflint.c:912
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu does not fit completely in referenced section "
@@ -1802,7 +1809,7 @@ msgstr ""
"sekcja [%2d] „%s”: symbol %zu nie mieści się w całości we wskazywanej sekcji "
"[%2d] „%s”\n"
-#: src/elflint.c:843
+#: src/elflint.c:847
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: referenced section [%2d] '%s' does not have "
@@ -1811,7 +1818,7 @@ msgstr ""
"sekcja [%2d] „%s”: symbol %zu: wskazywana sekcja [%2d] „%s” nie ma "
"ustawionej flagi SHF_TLS\n"
-#: src/elflint.c:853 src/elflint.c:901
+#: src/elflint.c:857 src/elflint.c:905
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: st_value out of bounds of referenced section "
@@ -1820,7 +1827,7 @@ msgstr ""
"sekcja [%2d] „%s”: symbol %zu: st_value spoza zakresu wskazywanej sekcji "
"[%2d] „%s”\n"
-#: src/elflint.c:880
+#: src/elflint.c:884
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: TLS symbol but no TLS program header entry\n"
@@ -1828,7 +1835,7 @@ msgstr ""
"sekcja [%2d] „%s”: symbol %zu: symbol TLS, ale brak wpisu TLS nagłówka "
"programu\n"
-#: src/elflint.c:886
+#: src/elflint.c:890
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: TLS symbol but couldn't get TLS program "
@@ -1837,7 +1844,7 @@ msgstr ""
"sekcja [%2d] „%s”: symbol %zu: symbol TLS, ale nie można uzyskać wpisu TLS "
"nagłówka programu\n"
-#: src/elflint.c:894
+#: src/elflint.c:898
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: st_value short of referenced section [%2d] "
@@ -1845,7 +1852,7 @@ msgid ""
msgstr ""
"sekcja [%2d] „%s”: symbol %zu: st_value pomija wskazywaną sekcję [%2d] „%s”\n"
-#: src/elflint.c:921
+#: src/elflint.c:925
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: local symbol outside range described in "
@@ -1854,7 +1861,7 @@ msgstr ""
"sekcja [%2d] „%s”: symbol %zu: lokalny symbol spoza zakresu określonego "
"w sh_info\n"
-#: src/elflint.c:928
+#: src/elflint.c:932
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: non-local symbol outside range described in "
@@ -1863,12 +1870,12 @@ msgstr ""
"sekcja [%2d] „%s”: symbol %zu: nielokalny symbol spoza zakresu określonego "
"w sh_info\n"
-#: src/elflint.c:935
+#: src/elflint.c:939
#, c-format
msgid "section [%2d] '%s': symbol %zu: non-local section symbol\n"
msgstr "sekcja [%2d] „%s”: symbol %zu: nielokalny symbol sekcji\n"
-#: src/elflint.c:985
+#: src/elflint.c:989
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to bad section "
@@ -1877,7 +1884,7 @@ msgstr ""
"sekcja [%2d] „%s”: symbol _GLOBAL_OFFSET_TABLE_ odnosi się do błędnej sekcji "
"[%2d]\n"
-#: src/elflint.c:992
+#: src/elflint.c:996
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol refers to section [%2d] "
@@ -1889,7 +1896,7 @@ msgstr ""
#. 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:1008
+#: src/elflint.c:1012
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol value %# does not "
@@ -1898,7 +1905,7 @@ msgstr ""
"sekcja [%2d] „%s”: wartość symbolu _GLOBAL_OFFSET_TABLE_ %# nie "
"pasuje do adresu sekcji %s %#\n"
-#: src/elflint.c:1015
+#: src/elflint.c:1019
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol size % does not "
@@ -1907,7 +1914,7 @@ msgstr ""
"sekcja [%2d] „%s”: rozmiar symbolu _GLOBAL_OFFSET_TABLE_ % nie "
"pasuje do rozmiaru sekcji %s %\n"
-#: src/elflint.c:1023
+#: src/elflint.c:1027
#, c-format
msgid ""
"section [%2d] '%s': _GLOBAL_OFFSET_TABLE_ symbol present, but no .got "
@@ -1916,7 +1923,7 @@ msgstr ""
"sekcja [%2d] „%s”: symbol _GLOBAL_OFFSET_TABLE_ istnieje, ale brak sekcji ."
"got\n"
-#: src/elflint.c:1039
+#: src/elflint.c:1043
#, c-format
msgid ""
"section [%2d] '%s': _DYNAMIC_ symbol value %# does not match dynamic "
@@ -1925,7 +1932,7 @@ msgstr ""
"sekcja [%2d] „%s”: wartość symbolu _DYNAMIC_ %# nie pasuje do adresu "
"segmentu dynamicznego %#\n"
-#: src/elflint.c:1046
+#: src/elflint.c:1050
#, c-format
msgid ""
"section [%2d] '%s': _DYNAMIC symbol size % does not match dynamic "
@@ -1934,7 +1941,7 @@ msgstr ""
"sekcja [%2d] „%s”: rozmiar symbolu _DYNAMIC_ % nie pasuje do "
"rozmiaru segmentu dynamicznego %\n"
-#: src/elflint.c:1059
+#: src/elflint.c:1063
#, c-format
msgid ""
"section [%2d] '%s': symbol %zu: symbol in dynamic symbol table with non-"
@@ -1943,27 +1950,27 @@ msgstr ""
"sekcja [%2d] „%s”: symbol %zu: symbol w dynamicznej tabeli symboli "
"z niedomyślną widocznością\n"
-#: src/elflint.c:1063
+#: src/elflint.c:1067
#, c-format
msgid "section [%2d] '%s': symbol %zu: unknown bit set in st_other\n"
msgstr "sekcja [%2d] „%s”: symbol %zu: ustawiono nieznany bit w st_other\n"
-#: src/elflint.c:1101
+#: src/elflint.c:1105
#, c-format
msgid "section [%2d] '%s': cannot get section data.\n"
msgstr "sekcja [%2d] „%s”: nie można uzyskać danych sekcji.\n"
-#: src/elflint.c:1117
+#: src/elflint.c:1121
#, c-format
msgid "section [%2d] '%s': DT_RELCOUNT used for this RELA section\n"
msgstr "sekcja [%2d] „%s”: DT_RELCOUNT użyte dla tej sekcji RELA\n"
-#: src/elflint.c:1128 src/elflint.c:1181
+#: src/elflint.c:1132 src/elflint.c:1185
#, c-format
msgid "section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"
msgstr "sekcja [%2d] „%s”: DT_RELCOUNT %d za duże dla tej sekcji\n"
-#: src/elflint.c:1153 src/elflint.c:1206
+#: src/elflint.c:1157 src/elflint.c:1210
#, c-format
msgid ""
"section [%2d] '%s': relative relocations after index %d as specified by "
@@ -1972,7 +1979,7 @@ msgstr ""
"sekcja [%2d] „%s”: relokacje względne po indeksie %d podanym przez "
"DT_RELCOUNT\n"
-#: src/elflint.c:1159 src/elflint.c:1212
+#: src/elflint.c:1163 src/elflint.c:1216
#, c-format
msgid ""
"section [%2d] '%s': non-relative relocation at index %zu; DT_RELCOUNT "
@@ -1981,50 +1988,50 @@ msgstr ""
"sekcja [%2d] „%s”: relokacja bezwzględna pod indeksem %zu; DT_RELCOUNT podał "
"%d relokacji względnych\n"
-#: src/elflint.c:1171
+#: src/elflint.c:1175
#, 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:1254
+#: src/elflint.c:1258
#, c-format
msgid "section [%2d] '%s': invalid destination section index\n"
msgstr "sekcja [%2d] „%s”: nieprawidłowy indeks sekcji docelowej\n"
-#: src/elflint.c:1266
+#: src/elflint.c:1270
#, c-format
msgid "section [%2d] '%s': invalid destination section type\n"
msgstr "sekcja [%2d] „%s”: nieprawidłowy typ sekcji docelowej\n"
-#: src/elflint.c:1274
+#: src/elflint.c:1278
#, c-format
msgid "section [%2d] '%s': sh_info should be zero\n"
msgstr "sekcja [%2d] „%s”: sh_info powinno wynosić zero\n"
-#: src/elflint.c:1282
+#: src/elflint.c:1286
#, c-format
msgid ""
"section [%2d] '%s': no relocations for merge-able string sections possible\n"
msgstr ""
"sekcja [%2d] „%s”: relokacje dla sekcji złączalnych ciągów są niemożliwe\n"
-#: src/elflint.c:1290
+#: src/elflint.c:1294
#, 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:1350
+#: src/elflint.c:1354
#, c-format
msgid "text relocation flag set but there is no read-only segment\n"
msgstr ""
"flaga relokacji tekstu jest ustawiona, ale nie ma segmentu tylko do odczytu\n"
-#: src/elflint.c:1377
+#: src/elflint.c:1381
#, c-format
msgid "section [%2d] '%s': relocation %zu: invalid type\n"
msgstr "sekcja [%2d] „%s”: relokacja %zu: nieprawidłowy typ\n"
-#: src/elflint.c:1385
+#: src/elflint.c:1389
#, c-format
msgid ""
"section [%2d] '%s': relocation %zu: relocation type invalid for the file "
@@ -2033,12 +2040,12 @@ msgstr ""
"sekcja [%2d] „%s”: relokacja %zu: typ relokacji nieprawidłowy dla tego typu "
"pliku\n"
-#: src/elflint.c:1393
+#: src/elflint.c:1397
#, c-format
msgid "section [%2d] '%s': relocation %zu: invalid symbol index\n"
msgstr "sekcja [%2d] „%s”: relokacja %zu: nieprawidłowy indeks symbolu\n"
-#: src/elflint.c:1411
+#: src/elflint.c:1415
#, c-format
msgid ""
"section [%2d] '%s': relocation %zu: only symbol '_GLOBAL_OFFSET_TABLE_' can "
@@ -2047,12 +2054,12 @@ msgstr ""
"sekcja [%2d] „%s”: relokacja %zu: z %s można użyć tylko symbolu "
"„_GLOBAL_OFFSET_TABLE_”\n"
-#: src/elflint.c:1428
+#: src/elflint.c:1432
#, 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:1443
+#: src/elflint.c:1447
#, c-format
msgid ""
"section [%2d] '%s': relocation %zu: copy relocation against symbol of type "
@@ -2060,7 +2067,7 @@ msgid ""
msgstr ""
"sekcja [%2d] „%s”: relokacja %zu: relokacja kopii względem symbolu typu %s\n"
-#: src/elflint.c:1464
+#: src/elflint.c:1468
#, c-format
msgid ""
"section [%2d] '%s': relocation %zu: read-only section modified but text "
@@ -2069,23 +2076,23 @@ msgstr ""
"sekcja [%2d] „%s”: relokacja %zu: sekcja tylko do odczytu została "
"zmodyfikowana, ale nie ustawiono flagi relokacji tekstu\n"
-#: src/elflint.c:1479
+#: src/elflint.c:1483
#, 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:1519 src/elflint.c:1570
+#: src/elflint.c:1523 src/elflint.c:1574
#, c-format
msgid "section [%2d] '%s': cannot get relocation %zu: %s\n"
msgstr "sekcja [%2d] „%s”: nie można uzyskać relokacji %zu: %s\n"
-#: src/elflint.c:1646
+#: src/elflint.c:1650
#, c-format
msgid "more than one dynamic section present\n"
msgstr "obecna jest więcej niż jedna sekcja dynamiczna\n"
-#: src/elflint.c:1664
+#: src/elflint.c:1668
#, c-format
msgid ""
"section [%2d]: referenced as string table for section [%2d] '%s' but section "
@@ -2094,43 +2101,43 @@ msgstr ""
"sekcja [%2d]: wskazane jako tabela ciągów dla sekcji [%2d] „%s”, ale wartość "
"dowiązania sekcji jest nieprawidłowa\n"
-#: src/elflint.c:1672
+#: src/elflint.c:1676
#, 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:1677 src/elflint.c:1966
+#: src/elflint.c:1681 src/elflint.c:1970
#, c-format
msgid "section [%2d] '%s': sh_info not zero\n"
msgstr "sekcja [%2d] „%s”: sh_info nie wynosi zero\n"
-#: src/elflint.c:1687
+#: src/elflint.c:1691
#, c-format
msgid "section [%2d] '%s': cannot get dynamic section entry %zu: %s\n"
msgstr ""
"sekcja [%2d] „%s”: nie można uzyskać wpisu %zu sekcji dynamicznej: %s\n"
-#: src/elflint.c:1695
+#: src/elflint.c:1699
#, 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:1702
+#: src/elflint.c:1706
#, c-format
msgid "section [%2d] '%s': entry %zu: unknown tag\n"
msgstr "sekcja [%2d] „%s”: wpis %zu: nieznany znacznik\n"
-#: src/elflint.c:1713
+#: src/elflint.c:1717
#, 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:1723
+#: src/elflint.c:1727
#, 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:1741
+#: src/elflint.c:1745
#, c-format
msgid ""
"section [%2d] '%s': entry %zu: DT_PLTREL value must be DT_REL or DT_RELA\n"
@@ -2138,7 +2145,7 @@ msgstr ""
"sekcja [%2d] „%s”: wpis %zu: wartość DT_PLTREL musi wynosić DT_REL lub "
"DT_RELA\n"
-#: src/elflint.c:1754
+#: src/elflint.c:1758
#, c-format
msgid ""
"section [%2d] '%s': entry %zu: pointer does not match address of section "
@@ -2147,14 +2154,14 @@ msgstr ""
"sekcja [%2d] „%s”: wpis %zu: wskaźnik nie pasuje do adresu sekcji [%2d] „%s” "
"wskazywanej przez sh_link\n"
-#: src/elflint.c:1797
+#: src/elflint.c:1801
#, 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 wczytany segment\n"
-#: src/elflint.c:1812
+#: src/elflint.c:1816
#, c-format
msgid ""
"section [%2d] '%s': entry %zu: %s value must be valid offset in section "
@@ -2163,48 +2170,48 @@ msgstr ""
"sekcja [%2d] „%s”: wpis %zu: wartość %s musi być prawidłowym offsetem "
"w sekcji [%2d] „%s”\n"
-#: src/elflint.c:1832 src/elflint.c:1860
+#: src/elflint.c:1836 src/elflint.c:1864
#, 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:1844
+#: src/elflint.c:1848
#, 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:1853
+#: src/elflint.c:1857
#, c-format
msgid "section [%2d] '%s': no hash section present\n"
msgstr "sekcja [%2d] „%s”: brak sekcji skrótów\n"
-#: src/elflint.c:1868 src/elflint.c:1875
+#: src/elflint.c:1872 src/elflint.c:1879
#, 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:1885 src/elflint.c:1889
+#: src/elflint.c:1889 src/elflint.c:1893
#, c-format
msgid "section [%2d] '%s': %s tag missing in DSO marked during prelinking\n"
msgstr ""
"sekcja [%2d] „%s”: brak znacznika %s w DSO oznaczonym podczas wstępnej "
"konsolidacji\n"
-#: src/elflint.c:1895
+#: src/elflint.c:1899
#, c-format
msgid "section [%2d] '%s': non-DSO file marked as dependency during prelink\n"
msgstr ""
"sekcja [%2d] „%s”: plik nie-DSO oznaczony jako zależność podczas wstępnej "
"konsolidacji\n"
-#: src/elflint.c:1906 src/elflint.c:1910 src/elflint.c:1914 src/elflint.c:1918
+#: src/elflint.c:1910 src/elflint.c:1914 src/elflint.c:1918 src/elflint.c:1922
#, c-format
msgid "section [%2d] '%s': %s tag missing in prelinked executable\n"
msgstr ""
"sekcja [%2d] „%s”: brak znacznika %s we wstępnie konsolidowanym pliku "
"wykonywalnym\n"
-#: src/elflint.c:1930
+#: src/elflint.c:1934
#, c-format
msgid ""
"section [%2d] '%s': only relocatable files can have extended section index\n"
@@ -2212,7 +2219,7 @@ msgstr ""
"sekcja [%2d] „%s”: tylko pliki relokowalne mogą mieć rozszerzoną sekcję "
"indeksów\n"
-#: src/elflint.c:1940
+#: src/elflint.c:1944
#, c-format
msgid ""
"section [%2d] '%s': extended section index section not for symbol table\n"
@@ -2220,31 +2227,31 @@ msgstr ""
"sekcja [%2d] „%s”: sekcja rozszerzonych indeksów sekcji nie dla tabeli "
"symboli\n"
-#: src/elflint.c:1944
+#: src/elflint.c:1948
#, c-format
msgid "section [%2d] '%s': sh_link extended section index [%2d] is invalid\n"
msgstr ""
"sekcja [%2d] „%s”: rozszerzony indeks sekcji sh_link [%2d] jest "
"nieprawidłowy\n"
-#: src/elflint.c:1949
+#: src/elflint.c:1953
#, c-format
msgid "cannot get data for symbol section\n"
msgstr "nie można uzyskać danych dla sekcji symboli\n"
-#: src/elflint.c:1952
+#: src/elflint.c:1956
#, 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:1961
+#: src/elflint.c:1965
#, c-format
msgid "section [%2d] '%s': extended index table too small for symbol table\n"
msgstr ""
"sekcja [%2d] „%s”: tabela rozszerzonych indeksów jest za mała dla tabeli "
"symboli\n"
-#: src/elflint.c:1976
+#: src/elflint.c:1980
#, c-format
msgid ""
"section [%2d] '%s': extended section index in section [%2zu] '%s' refers to "
@@ -2253,24 +2260,24 @@ msgstr ""
"sekcja [%2d] „%s”: rozszerzony indeks sekcji w sekcji [%2zu] „%s” odwołuje "
"się do tej samej tabeli symboli\n"
-#: src/elflint.c:1994
+#: src/elflint.c:1998
#, c-format
msgid "symbol 0 should have zero extended section index\n"
msgstr "symbol 0 powinien mieć zerowy rozszerzony indeks sekcji\n"
-#: src/elflint.c:2006
+#: src/elflint.c:2010
#, c-format
msgid "cannot get data for symbol %zu\n"
msgstr "nie można uzyskać danych dla symbolu %zu\n"
-#: src/elflint.c:2011
+#: src/elflint.c:2015
#, c-format
msgid "extended section index is % but symbol index is not XINDEX\n"
msgstr ""
"rozszerzony indeks sekcji wynosi %, ale indeks symbolu nie wynosi "
"XINDEX\n"
-#: src/elflint.c:2028 src/elflint.c:2085
+#: src/elflint.c:2032 src/elflint.c:2089
#, c-format
msgid ""
"section [%2d] '%s': hash table section is too small (is %ld, expected %ld)\n"
@@ -2278,43 +2285,43 @@ msgstr ""
"sekcja [%2d] „%s”: sekcja tabeli mieszającej jest za mała (%ld, oczekiwano "
"%ld)\n"
-#: src/elflint.c:2042 src/elflint.c:2099
+#: src/elflint.c:2046 src/elflint.c:2103
#, c-format
msgid "section [%2d] '%s': chain array too large\n"
msgstr "sekcja [%2d] „%s”: tabela łańcuchowa jest za duża\n"
-#: src/elflint.c:2056 src/elflint.c:2113
+#: src/elflint.c:2060 src/elflint.c:2117
#, c-format
msgid "section [%2d] '%s': hash bucket reference %zu out of bounds\n"
msgstr ""
"sekcja [%2d] „%s”: odwołanie do kubełka skrótu %zu jest spoza zakresu\n"
-#: src/elflint.c:2066
+#: src/elflint.c:2070
#, c-format
msgid "section [%2d] '%s': hash chain reference %zu out of bounds\n"
msgstr ""
"sekcja [%2d] „%s”: odwołanie do łańcucha skrótu %zu jest spoza zakresu\n"
-#: src/elflint.c:2123
+#: src/elflint.c:2127
#, c-format
msgid "section [%2d] '%s': hash chain reference % out of bounds\n"
msgstr ""
"sekcja [%2d] „%s”: odwołanie do łańcucha skrótu % jest spoza "
"zakresu\n"
-#: src/elflint.c:2136
+#: src/elflint.c:2140
#, c-format
msgid "section [%2d] '%s': not enough data\n"
msgstr "sekcja [%2d] „%s”: brak wystarczającej ilości danych\n"
-#: src/elflint.c:2148
+#: src/elflint.c:2152
#, c-format
msgid "section [%2d] '%s': bitmask size zero or not power of 2: %u\n"
msgstr ""
"sekcja [%2d] „%s”: rozmiar maski bitowej wynosi zero lub nie jest potęgą 2: "
"%u\n"
-#: src/elflint.c:2164
+#: src/elflint.c:2168
#, c-format
msgid ""
"section [%2d] '%s': hash table section is too small (is %ld, expected at "
@@ -2323,13 +2330,13 @@ msgstr ""
"sekcja [%2d] „%s”: sekcja tabeli mieszającej jest za mała (wynosi %ld, "
"oczekiwano co najmniej %ld)\n"
-#: src/elflint.c:2173
+#: src/elflint.c:2177
#, c-format
msgid "section [%2d] '%s': 2nd hash function shift too big: %u\n"
msgstr ""
"sekcja [%2d] „%s”: drugie przesunięcie funkcji mieszającej jest za duże: %u\n"
-#: src/elflint.c:2207
+#: src/elflint.c:2211
#, c-format
msgid ""
"section [%2d] '%s': hash chain for bucket %zu lower than symbol index bias\n"
@@ -2337,7 +2344,7 @@ msgstr ""
"sekcja [%2d] „%s”: łańcuch mieszający dla kubełka %zu jest mniejszy niż "
"przesunięcie indeksu symboli\n"
-#: src/elflint.c:2228
+#: src/elflint.c:2232
#, c-format
msgid ""
"section [%2d] '%s': symbol %u referenced in chain for bucket %zu is "
@@ -2346,7 +2353,7 @@ msgstr ""
"sekcja [%2d] „%s”: symbol %u wskazywany w łańcuchu dla kubełka %zu jest "
"nieokreślony\n"
-#: src/elflint.c:2241
+#: src/elflint.c:2245
#, c-format
msgid ""
"section [%2d] '%s': hash value for symbol %u in chain for bucket %zu wrong\n"
@@ -2354,7 +2361,7 @@ msgstr ""
"sekcja [%2d] „%s”: wartość skrótu dla symbolu %u w łańcuchu dla kubełka %zu "
"jest błędna\n"
-#: src/elflint.c:2250
+#: src/elflint.c:2254
#, c-format
msgid ""
"section [%2d] '%s': mask index for symbol %u in chain for bucket %zu wrong\n"
@@ -2362,12 +2369,12 @@ msgstr ""
"sekcja [%2d] „%s”: indeks maski dla symbolu %u w łańcuchu dla kubełka %zu "
"jest błędny\n"
-#: src/elflint.c:2280
+#: src/elflint.c:2284
#, c-format
msgid "section [%2d] '%s': hash chain for bucket %zu out of bounds\n"
msgstr "sekcja [%2d] „%s”: łańcuch skrótu dla kubełka %zu jest spoza zakresu\n"
-#: src/elflint.c:2285
+#: src/elflint.c:2289
#, c-format
msgid ""
"section [%2d] '%s': symbol reference in chain for bucket %zu out of bounds\n"
@@ -2375,41 +2382,41 @@ msgstr ""
"sekcja [%2d] „%s”: odwołanie do symbolu w łańcuchu dla kubełka %zu jest "
"spoza zakresu\n"
-#: src/elflint.c:2291
+#: src/elflint.c:2295
#, c-format
msgid "section [%2d] '%s': bitmask does not match names in the hash table\n"
msgstr ""
"sekcja [%2d] „%s”: maska bitowa nie pasuje do nazw w tabeli mieszającej\n"
-#: src/elflint.c:2304
+#: src/elflint.c:2308
#, c-format
msgid "section [%2d] '%s': relocatable files cannot have hash tables\n"
msgstr ""
"sekcja [%2d] „%s”: pliki relokowalne nie mogą mieć tabeli mieszających\n"
-#: src/elflint.c:2322
+#: src/elflint.c:2326
#, c-format
msgid "section [%2d] '%s': hash table not for dynamic symbol table\n"
msgstr ""
"sekcja [%2d] „%s”: tabela mieszająca nie dla tabeli dynamicznych symboli\n"
-#: src/elflint.c:2326
+#: src/elflint.c:2330
#, c-format
msgid "section [%2d] '%s': invalid sh_link symbol table section index [%2d]\n"
msgstr ""
"sekcja [%2d] „%s”: nieprawidłowy indeks sekcji tabeli symboli sh_link [%2d]\n"
-#: src/elflint.c:2336
+#: src/elflint.c:2340
#, c-format
msgid "section [%2d] '%s': hash table entry size incorrect\n"
msgstr "sekcja [%2d] „%s”: niepoprawny rozmiar wpisu tabeli mieszającej\n"
-#: src/elflint.c:2341
+#: src/elflint.c:2345
#, c-format
msgid "section [%2d] '%s': not marked to be allocated\n"
msgstr "sekcja [%2d] „%s”: nieoznaczona do przydzielenia\n"
-#: src/elflint.c:2346
+#: src/elflint.c:2350
#, c-format
msgid ""
"section [%2d] '%s': hash table has not even room for initial administrative "
@@ -2418,29 +2425,29 @@ msgstr ""
"sekcja [%2d] „%s”: tabela mieszająca nie ma miejsca nawet na początkowe "
"wpisy administracyjne\n"
-#: src/elflint.c:2395
+#: src/elflint.c:2399
#, c-format
msgid "sh_link in hash sections [%2zu] '%s' and [%2zu] '%s' not identical\n"
msgstr ""
"sh_link w sekcjach skrótu [%2zu] „%s” i [%2zu] „%s” nie są identyczne\n"
-#: src/elflint.c:2419 src/elflint.c:2484 src/elflint.c:2519
+#: src/elflint.c:2423 src/elflint.c:2488 src/elflint.c:2523
#, c-format
msgid "hash section [%2zu] '%s' does not contain enough data\n"
msgstr ""
"sekcja mieszania [%2zu] „%s” nie zawiera wystarczającej ilości danych\n"
-#: src/elflint.c:2440
+#: src/elflint.c:2444
#, c-format
msgid "hash section [%2zu] '%s' has zero bit mask words\n"
msgstr "sekcja mieszania [%2zu] „%s” ma zerowe słowa maski bitów\n"
-#: src/elflint.c:2451 src/elflint.c:2495 src/elflint.c:2532
+#: src/elflint.c:2455 src/elflint.c:2499 src/elflint.c:2536
#, c-format
msgid "hash section [%2zu] '%s' uses too much data\n"
msgstr "sekcja mieszania [%2zu] „%s” używa za dużo danych\n"
-#: src/elflint.c:2466
+#: src/elflint.c:2470
#, c-format
msgid ""
"hash section [%2zu] '%s' invalid symbol index % (max_nsyms: "
@@ -2449,17 +2456,17 @@ msgstr ""
"sekcja mieszająca [%2zu] „%s” nieprawidłowy indeks symboli % "
"(max_nsyms: %, nentries: %\n"
-#: src/elflint.c:2553
+#: src/elflint.c:2557
#, c-format
msgid "hash section [%2zu] '%s' invalid sh_entsize\n"
msgstr "sekcja mieszania [%2zu] „%s” nieprawidłowe sh_entsize\n"
-#: src/elflint.c:2563 src/elflint.c:2567
+#: src/elflint.c:2567 src/elflint.c:2571
#, 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:2574
+#: src/elflint.c:2578
#, c-format
msgid ""
"symbol %d referenced in new hash table in [%2zu] '%s' but not in old hash "
@@ -2468,7 +2475,7 @@ msgstr ""
"symbol %d wymieniony w nowej tabeli mieszającej w [%2zu] „%s”, ale nie "
"w poprzedniej tabeli mieszającej [%2zu] „%s”\n"
-#: src/elflint.c:2586
+#: src/elflint.c:2590
#, c-format
msgid ""
"symbol %d referenced in old hash table in [%2zu] '%s' but not in new hash "
@@ -2477,12 +2484,12 @@ msgstr ""
"symbol %d wymieniony w poprzedniej tabeli mieszającej w [%2zu] „%s”, ale nie "
"w nowej tabeli mieszającej w [%2zu] „%s”\n"
-#: src/elflint.c:2602
+#: src/elflint.c:2606
#, 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:2622
+#: src/elflint.c:2626
#, c-format
msgid ""
"section [%2d] '%s': section groups only allowed in relocatable object files\n"
@@ -2490,96 +2497,96 @@ msgstr ""
"sekcja [%2d] „%s”: w plikach obiektów relokowalnych dozwolone są tylko grupy "
"sekcji\n"
-#: src/elflint.c:2633
+#: src/elflint.c:2637
#, c-format
msgid "section [%2d] '%s': cannot get symbol table: %s\n"
msgstr "sekcja [%2d] „%s”: nie można uzyskać tabeli symboli: %s\n"
-#: src/elflint.c:2638
+#: src/elflint.c:2642
#, 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:2644
+#: src/elflint.c:2648
#, c-format
msgid "section [%2d] '%s': invalid symbol index in sh_info\n"
msgstr "sekcja [%2d] „%s”: nieprawidłowy indeks symbolu w sh_info\n"
-#: src/elflint.c:2649
+#: src/elflint.c:2653
#, c-format
msgid "section [%2d] '%s': sh_flags not zero\n"
msgstr "sekcja [%2d] „%s”: niezerowe sh_flags\n"
-#: src/elflint.c:2656
+#: src/elflint.c:2660
#, c-format
msgid "section [%2d] '%s': cannot get symbol for signature\n"
msgstr "sekcja [%2d] „%s”: nie można uzyskać symbolu dla podpisu\n"
-#: src/elflint.c:2660
+#: src/elflint.c:2664
#, c-format
msgid "section [%2d] '%s': cannot get symbol name for signature\n"
msgstr "sekcja [%2d] „%s”: nie można uzyskać nazwy symbolu dla podpisu\n"
-#: src/elflint.c:2665
+#: src/elflint.c:2669
#, c-format
msgid "section [%2d] '%s': signature symbol cannot be empty string\n"
msgstr "sekcja [%2d] „%s”: symbol podpisu nie można być pustym ciągiem\n"
-#: src/elflint.c:2671
+#: src/elflint.c:2675
#, 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:2677
+#: src/elflint.c:2681
#, c-format
msgid "section [%2d] '%s': cannot get data: %s\n"
msgstr "sekcja [%2d] „%s”: nie można uzyskać danych: %s\n"
-#: src/elflint.c:2686
+#: src/elflint.c:2690
#, 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:2692
+#: src/elflint.c:2696
#, 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:2700
+#: src/elflint.c:2704
#, c-format
msgid "section [%2d] '%s': section group without member\n"
msgstr "sekcja [%2d] „%s”: grupa sekcji bez elementów\n"
-#: src/elflint.c:2704
+#: src/elflint.c:2708
#, 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:2715
+#: src/elflint.c:2719
#, c-format
msgid "section [%2d] '%s': unknown section group flags\n"
msgstr "sekcja [%2d] „%s”: nieznane flagi grupy sekcji\n"
-#: src/elflint.c:2727
+#: src/elflint.c:2731
#, c-format
msgid "section [%2d] '%s': section index %zu out of range\n"
msgstr "sekcja [%2d] „%s”: indeks sekcji %zu jest spoza zakresu\n"
-#: src/elflint.c:2736
+#: src/elflint.c:2740
#, c-format
msgid "section [%2d] '%s': cannot get section header for element %zu: %s\n"
msgstr ""
"sekcja [%2d] „%s”: nie można uzyskać nagłówka sekcji dla elementu %zu: %s\n"
-#: src/elflint.c:2743
+#: src/elflint.c:2747
#, 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:2749
+#: src/elflint.c:2753
#, c-format
msgid ""
"section [%2d] '%s': element %zu references section [%2d] '%s' without "
@@ -2588,12 +2595,12 @@ msgstr ""
"sekcja [%2d] „%s”: element %zu odwołuje się do sekcji [%2d] „%s” bez flagi "
"SHF_GROUP\n"
-#: src/elflint.c:2756
+#: src/elflint.c:2760
#, 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:2946
+#: src/elflint.c:2950
#, c-format
msgid ""
"section [%2d] '%s' refers in sh_link to section [%2d] '%s' which is no "
@@ -2602,7 +2609,7 @@ msgstr ""
"sekcja [%2d] „%s” odwołuje się w sh_link do sekcji [%2d] „%s”, która nie "
"jest tabelą symboli dynamicznych\n"
-#: src/elflint.c:2958
+#: src/elflint.c:2962
#, c-format
msgid ""
"section [%2d] '%s' has different number of entries than symbol table [%2d] "
@@ -2610,76 +2617,76 @@ msgid ""
msgstr ""
"sekcja [%2d] „%s” ma inną liczbę wpisów niż tabela symboli [%2d] „%s”\n"
-#: src/elflint.c:2974
+#: src/elflint.c:2978
#, 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:2990
+#: src/elflint.c:2994
#, 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:2998
+#: src/elflint.c:3002
#, 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:3012
+#: src/elflint.c:3016
#, c-format
msgid "section [%2d] '%s': symbol %d: invalid version index %d\n"
msgstr "sekcja [%2d] „%s”: symbol %d: nieprawidłowy indeks wersji %d\n"
-#: src/elflint.c:3017
+#: src/elflint.c:3021
#, c-format
msgid ""
"section [%2d] '%s': symbol %d: version index %d is for defined version\n"
msgstr ""
"sekcja [%2d] „%s”: symbol %d: indeks wersji %d jest dla wersji określonej\n"
-#: src/elflint.c:3027
+#: src/elflint.c:3031
#, 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:3080
+#: src/elflint.c:3084
#, c-format
msgid "more than one version reference section present\n"
msgstr "obecna jest więcej niż jedna sekcja odniesienia wersji\n"
-#: src/elflint.c:3088 src/elflint.c:3235
+#: src/elflint.c:3092 src/elflint.c:3239
#, c-format
msgid "section [%2d] '%s': sh_link does not link to string table\n"
msgstr "sekcja [%2d] „%s”: sh_link nie łączy się z tabelą ciągów\n"
-#: src/elflint.c:3113 src/elflint.c:3289
+#: src/elflint.c:3117 src/elflint.c:3293
#, c-format
msgid "section [%2d] '%s': entry %d has wrong version %d\n"
msgstr "sekcja [%2d] „%s”: wpis %d ma błędną wersję %d\n"
-#: src/elflint.c:3120 src/elflint.c:3296
+#: src/elflint.c:3124 src/elflint.c:3300
#, c-format
msgid "section [%2d] '%s': entry %d has wrong offset of auxiliary data\n"
msgstr "sekcja [%2d] „%s”: wpis %d ma błędny offset dla danych dodatkowych\n"
-#: src/elflint.c:3130
+#: src/elflint.c:3134
#, 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:3138
+#: src/elflint.c:3142
#, 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:3150
+#: src/elflint.c:3154
#, 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:3158
+#: src/elflint.c:3162
#, c-format
msgid ""
"section [%2d] '%s': auxiliary entry %d of entry %d has invalid name "
@@ -2688,7 +2695,7 @@ msgstr ""
"sekcja [%2d] „%s”: wpis dodatkowy %d do wpisu %d ma nieprawidłowe "
"odniesienie do nazwy\n"
-#: src/elflint.c:3167
+#: src/elflint.c:3171
#, c-format
msgid ""
"section [%2d] '%s': auxiliary entry %d of entry %d has wrong hash value: "
@@ -2697,7 +2704,7 @@ msgstr ""
"sekcja [%2d] „%s”: wpis dodatkowy %d do wpisu %d ma błędną wartość skrótu: "
"%#x, oczekiwano %#x\n"
-#: src/elflint.c:3176
+#: src/elflint.c:3180
#, c-format
msgid ""
"section [%2d] '%s': auxiliary entry %d of entry %d has duplicate version "
@@ -2706,19 +2713,19 @@ msgstr ""
"sekcja [%2d] „%s”: wpis dodatkowy %d do wpisu %d ma powtórzoną nazwę wersji "
"„%s”\n"
-#: src/elflint.c:3187
+#: src/elflint.c:3191
#, 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 błędne następne pole\n"
-#: src/elflint.c:3204 src/elflint.c:3380
+#: src/elflint.c:3208 src/elflint.c:3384
#, 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:3212 src/elflint.c:3388
+#: src/elflint.c:3216 src/elflint.c:3392
#, c-format
msgid ""
"section [%2d] '%s': entry %d has zero offset to next entry, but sh_info says "
@@ -2727,43 +2734,43 @@ msgstr ""
"sekcja [%2d] „%s”: wpis %d ma zerowy offset do następnego wpisu, ale sh_info "
"zawiera informacje o większej liczbie wpisów\n"
-#: src/elflint.c:3227
+#: src/elflint.c:3231
#, c-format
msgid "more than one version definition section present\n"
msgstr "obecna jest więcej niż jedna sekcja definicji wersji\n"
-#: src/elflint.c:3274
+#: src/elflint.c:3278
#, 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:3278
+#: src/elflint.c:3282
#, 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:3284
+#: src/elflint.c:3288
#, 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:3311
+#: src/elflint.c:3315
#, c-format
msgid "section [%2d] '%s': entry %d has invalid name reference\n"
msgstr "sekcja [%2d] „%s”: wpis %d ma nieprawidłowe odniesienie do nazwy\n"
-#: src/elflint.c:3318
+#: src/elflint.c:3322
#, c-format
msgid "section [%2d] '%s': entry %d has wrong hash value: %#x, expected %#x\n"
msgstr ""
"sekcja [%2d] „%s”: wpis %d ma błędną wartość skrótu: %#x, oczekiwano %#x\n"
-#: src/elflint.c:3326
+#: src/elflint.c:3330
#, 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:3346
+#: src/elflint.c:3350
#, c-format
msgid ""
"section [%2d] '%s': entry %d has invalid name reference in auxiliary data\n"
@@ -2771,51 +2778,51 @@ msgstr ""
"sekcja [%2d] „%s”: wpis %d ma nieprawidłowe odniesienie do nazwy w danych "
"dodatkowych\n"
-#: src/elflint.c:3363
+#: src/elflint.c:3367
#, c-format
msgid "section [%2d] '%s': entry %d has wrong next field in auxiliary data\n"
msgstr ""
"sekcja [%2d] „%s”: wpis %d ma błędne następne pole w danych dodatkowych\n"
-#: src/elflint.c:3396
+#: src/elflint.c:3400
#, c-format
msgid "section [%2d] '%s': no BASE definition\n"
msgstr "sekcja [%2d] „%s”: brak definicji BASE\n"
-#: src/elflint.c:3412
+#: src/elflint.c:3416
#, c-format
msgid "section [%2d] '%s': unknown parent version '%s'\n"
msgstr "sekcja [%2d] „%s”: nieznana wersja rodzica „%s”\n"
-#: src/elflint.c:3425
+#: src/elflint.c:3429
#, c-format
msgid "section [%2d] '%s': empty object attributes section\n"
msgstr "sekcja [%2d] „%s”: pusta sekcja atrybutów obiektu\n"
-#: src/elflint.c:3446
+#: src/elflint.c:3450
#, c-format
msgid "section [%2d] '%s': unrecognized attribute format\n"
msgstr "sekcja [%2d] „%s”: nierozpoznany format atrybutu\n"
-#: src/elflint.c:3462
+#: src/elflint.c:3466
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: zero length field in attribute section\n"
msgstr ""
"sekcja [%2d] „%s”: offset %zu: pole o zerowej długości w sekcji atrybutów\n"
-#: src/elflint.c:3471
+#: src/elflint.c:3475
#, c-format
msgid "section [%2d] '%s': offset %zu: invalid length in attribute section\n"
msgstr ""
"sekcja [%2d] „%s”: offset %zu: nieprawidłowa długość w sekcji atrybutów\n"
-#: src/elflint.c:3483
+#: src/elflint.c:3487
#, c-format
msgid "section [%2d] '%s': offset %zu: unterminated vendor name string\n"
msgstr "sekcja [%2d] „%s”: offset %zu: niezakończony ciąg nazwy producenta\n"
-#: src/elflint.c:3500
+#: src/elflint.c:3504
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: endless ULEB128 in attribute subsection tag\n"
@@ -2823,19 +2830,19 @@ msgstr ""
"sekcja [%2d] „%s”: offset %zu: niekończące się ULEB128 w znaczniku podsekcji "
"atrybutów\n"
-#: src/elflint.c:3509
+#: src/elflint.c:3513
#, c-format
msgid "section [%2d] '%s': offset %zu: truncated attribute section\n"
msgstr "sekcja [%2d] „%s”: offset %zu: skrócona sekcja atrybutów\n"
-#: src/elflint.c:3518
+#: src/elflint.c:3522
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: zero length field in attribute subsection\n"
msgstr ""
"sekcja [%2d] „%s”: offset %zu: zerowej długości pole w podsekcji atrybutów\n"
-#: src/elflint.c:3533
+#: src/elflint.c:3537
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: invalid length in attribute subsection\n"
@@ -2843,7 +2850,7 @@ msgstr ""
"sekcja [%2d] „%s”: offset %zu: nieprawidłowa długość w podsekcji atrybutów\n"
#. Tag_File
-#: src/elflint.c:3544
+#: src/elflint.c:3548
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: attribute subsection has unexpected tag %u\n"
@@ -2851,23 +2858,23 @@ msgstr ""
"sekcja [%2d] „%s”: offset %zu: podsekcja atrybutów ma nieoczekiwany znacznik "
"%u\n"
-#: src/elflint.c:3562
+#: src/elflint.c:3566
#, c-format
msgid "section [%2d] '%s': offset %zu: endless ULEB128 in attribute tag\n"
msgstr ""
"sekcja [%2d] „%s”: offset %zu: niekończące się ULEB128 w znaczniku atrybutu\n"
-#: src/elflint.c:3573
+#: src/elflint.c:3577
#, c-format
msgid "section [%2d] '%s': offset %zu: unterminated string in attribute\n"
msgstr "sekcja [%2d] „%s”: offset %zu: niezakończony ciąg w atrybucie\n"
-#: src/elflint.c:3586
+#: src/elflint.c:3590
#, c-format
msgid "section [%2d] '%s': offset %zu: unrecognized attribute tag %u\n"
msgstr "sekcja [%2d] „%s”: offset %zu: nierozpoznany znacznik atrybutu %u\n"
-#: src/elflint.c:3590
+#: src/elflint.c:3594
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: unrecognized %s attribute value %\n"
@@ -2875,12 +2882,12 @@ msgstr ""
"sekcja [%2d] „%s”: offset %zu: atrybut %s ma nierozpoznaną wartość "
"%\n"
-#: src/elflint.c:3600
+#: src/elflint.c:3604
#, c-format
msgid "section [%2d] '%s': offset %zu: vendor '%s' unknown\n"
msgstr "sekcja [%2d] „%s”: offset %zu: producent „%s” jest nieznany\n"
-#: src/elflint.c:3606
+#: src/elflint.c:3610
#, c-format
msgid ""
"section [%2d] '%s': offset %zu: extra bytes after last attribute section\n"
@@ -2888,47 +2895,47 @@ msgstr ""
"sekcja [%2d] „%s”: offset %zu: dodatkowe bajty po ostatniej sekcji "
"atrybutów\n"
-#: src/elflint.c:3695
+#: src/elflint.c:3699
#, c-format
msgid "cannot get section header of zeroth section\n"
msgstr "nie można uzyskać nagłówka sekcji zerowej\n"
-#: src/elflint.c:3699
+#: src/elflint.c:3703
#, c-format
msgid "zeroth section has nonzero name\n"
msgstr "sekcja zerowa ma niezerową nazwę\n"
-#: src/elflint.c:3701
+#: src/elflint.c:3705
#, c-format
msgid "zeroth section has nonzero type\n"
msgstr "sekcja zerowa ma niezerowy typ\n"
-#: src/elflint.c:3703
+#: src/elflint.c:3707
#, c-format
msgid "zeroth section has nonzero flags\n"
msgstr "sekcja zerowa ma niezerowe flagi\n"
-#: src/elflint.c:3705
+#: src/elflint.c:3709
#, c-format
msgid "zeroth section has nonzero address\n"
msgstr "sekcja zerowa ma niezerowy adres\n"
-#: src/elflint.c:3707
+#: src/elflint.c:3711
#, c-format
msgid "zeroth section has nonzero offset\n"
msgstr "sekcja zerowa ma niezerowy offset\n"
-#: src/elflint.c:3709
+#: src/elflint.c:3713
#, c-format
msgid "zeroth section has nonzero align value\n"
msgstr "sekcja zerowa ma niezerową wartość wyrównania\n"
-#: src/elflint.c:3711
+#: src/elflint.c:3715
#, c-format
msgid "zeroth section has nonzero entry size value\n"
msgstr "sekcja zerowa ma niezerową wartość rozmiaru wpisu\n"
-#: src/elflint.c:3714
+#: src/elflint.c:3718
#, c-format
msgid ""
"zeroth section has nonzero size value while ELF header has nonzero shnum "
@@ -2937,7 +2944,7 @@ msgstr ""
"sekcja zerowa ma niezerową wartość rozmiaru, a nagłówek ELF ma niezerową "
"wartość shnum\n"
-#: src/elflint.c:3718
+#: src/elflint.c:3722
#, c-format
msgid ""
"zeroth section has nonzero link value while ELF header does not signal "
@@ -2946,7 +2953,7 @@ msgstr ""
"sekcja zerowa ma niezerową wartość dowiązań, a nagłówek ELF nie wskazuje "
"przepełnienia w shstrndx\n"
-#: src/elflint.c:3722
+#: src/elflint.c:3726
#, c-format
msgid ""
"zeroth section has nonzero link value while ELF header does not signal "
@@ -2955,46 +2962,46 @@ msgstr ""
"sekcja zerowa ma niezerową wartość dowiązań, a nagłówek ELF nie wskazuje "
"przepełnienia w phnum\n"
-#: src/elflint.c:3740
+#: src/elflint.c:3744
#, c-format
msgid "cannot get section header for section [%2zu] '%s': %s\n"
msgstr "nie można uzyskać nagłówka sekcji dla sekcji [%2zu] „%s”: %s\n"
-#: src/elflint.c:3749
+#: src/elflint.c:3753
#, c-format
msgid "section [%2zu]: invalid name\n"
msgstr "sekcja [%2zu]: nieprawidłowa nazwa\n"
-#: src/elflint.c:3776
+#: src/elflint.c:3780
#, c-format
msgid "section [%2d] '%s' has wrong type: expected %s, is %s\n"
msgstr "sekcja [%2d] „%s” ma błędny typ: oczekiwano %s, jest %s\n"
-#: src/elflint.c:3794
+#: src/elflint.c:3798
#, c-format
msgid "section [%2zu] '%s' has wrong flags: expected %s, is %s\n"
msgstr "sekcja [%2zu] „%s” ma błędne flagi: oczekiwano %s, jest %s\n"
-#: src/elflint.c:3812
+#: src/elflint.c:3816
#, c-format
msgid ""
"section [%2zu] '%s' has wrong flags: expected %s and possibly %s, is %s\n"
msgstr ""
"sekcja [%2zu] „%s” ma błędne flagi: oczekiwano %s i być może %s, jest %s\n"
-#: src/elflint.c:3830
+#: src/elflint.c:3834
#, c-format
msgid "section [%2zu] '%s' present in object file\n"
msgstr "sekcja [%2zu] „%s” jest obecna w pliku obiektu\n"
-#: src/elflint.c:3836 src/elflint.c:3868
+#: src/elflint.c:3840 src/elflint.c:3872
#, c-format
msgid ""
"section [%2zu] '%s' has SHF_ALLOC flag set but there is no loadable segment\n"
msgstr ""
"sekcja [%2zu] „%s” ma flagę SHF_ALLOC, ale nie ma segmentu wczytywalnego\n"
-#: src/elflint.c:3841 src/elflint.c:3873
+#: src/elflint.c:3845 src/elflint.c:3877
#, c-format
msgid ""
"section [%2zu] '%s' has SHF_ALLOC flag not set but there are loadable "
@@ -3002,7 +3009,7 @@ msgid ""
msgstr ""
"sekcja [%2zu] „%s” nie ma flagi SHF_ALLOC, ale są segmenty wczytywalne\n"
-#: src/elflint.c:3849
+#: src/elflint.c:3853
#, c-format
msgid ""
"section [%2zu] '%s' is extension section index table in non-object file\n"
@@ -3010,22 +3017,22 @@ msgstr ""
"sekcja [%2zu] „%s” jest tabelą indeksów sekcji rozszerzeń w pliku "
"nieobiektowym\n"
-#: src/elflint.c:3892
+#: src/elflint.c:3896
#, 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:3897
+#: src/elflint.c:3901
#, c-format
msgid "cannot get section header\n"
msgstr "nie można uzyskać nagłówka sekcji\n"
-#: src/elflint.c:3907
+#: src/elflint.c:3911
#, c-format
msgid "section [%2zu] '%s' has unsupported type %d\n"
msgstr "sekcja [%2zu] „%s” ma nieobsługiwany typ %d\n"
-#: src/elflint.c:3922
+#: src/elflint.c:3926
#, c-format
msgid ""
"section [%2zu] '%s' contains invalid processor-specific flag(s) %#\n"
@@ -3033,74 +3040,74 @@ msgstr ""
"sekcja [%2zu] „%s” zawiera nieprawidłowe flagi dla konkretnego procesora "
"%#\n"
-#: src/elflint.c:3929
+#: src/elflint.c:3933
#, c-format
msgid "section [%2zu] '%s' contains unknown flag(s) %#\n"
msgstr "sekcja [%2zu] „%s” zawiera nieznane flagi %#\n"
-#: src/elflint.c:3937
+#: src/elflint.c:3941
#, 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:3947
+#: src/elflint.c:3951
#, c-format
msgid "section [%2zu] '%s': allocated section cannot be compressed\n"
msgstr "sekcja [%2zu] „%s”: nie można skompresować przydzielonej sekcji\n"
-#: src/elflint.c:3952
+#: src/elflint.c:3956
#, c-format
msgid "section [%2zu] '%s': nobits section cannot be compressed\n"
msgstr "sekcja [%2zu] „%s”: nie można skompresować sekcji „nobits”\n"
-#: src/elflint.c:3958
+#: src/elflint.c:3962
#, c-format
msgid ""
"section [%2zu] '%s': compressed section with no compression header: %s\n"
msgstr "sekcja [%2zu] „%s”: skompresowana sekcja bez nagłówka kompresji: %s\n"
-#: src/elflint.c:3964
+#: src/elflint.c:3968
#, c-format
msgid "section [%2zu] '%s': invalid section reference in link value\n"
msgstr ""
"sekcja [%2zu] „%s”: nieprawidłowe odwołanie do sekcji w wartości dowiązania\n"
-#: src/elflint.c:3969
+#: src/elflint.c:3973
#, c-format
msgid "section [%2zu] '%s': invalid section reference in info value\n"
msgstr ""
"sekcja [%2zu] „%s”: nieprawidłowe odwołanie do sekcji w wartości "
"informacyjnej\n"
-#: src/elflint.c:3976
+#: src/elflint.c:3980
#, c-format
msgid "section [%2zu] '%s': strings flag set without merge flag\n"
msgstr "sekcja [%2zu] „%s”: flaga ciągów jest ustawiona bez flagi merge\n"
-#: src/elflint.c:3981
+#: src/elflint.c:3985
#, c-format
msgid "section [%2zu] '%s': merge flag set but entry size is zero\n"
msgstr ""
"sekcja [%2zu] „%s”: flaga merge jest ustawiona, ale rozmiar wpisu jest "
"zerowy\n"
-#: src/elflint.c:4000
+#: src/elflint.c:4004
#, c-format
msgid "section [%2zu] '%s' has unexpected type %d for an executable section\n"
msgstr "sekcja [%2zu] „%s” ma nieoczekiwany typ %d dla sekcji wykonywalnej\n"
-#: src/elflint.c:4009
+#: src/elflint.c:4013
#, c-format
msgid "section [%2zu] '%s' must be of type NOBITS in debuginfo files\n"
msgstr "sekcja [%2zu] „%s” musi być typu NOBITS w plikach debuginfo\n"
-#: src/elflint.c:4016
+#: src/elflint.c:4020
#, c-format
msgid "section [%2zu] '%s' is both executable and writable\n"
msgstr "sekcja [%2zu] „%s” jest wykonywalne i zapisywalne\n"
-#: src/elflint.c:4047
+#: src/elflint.c:4051
#, c-format
msgid ""
"section [%2zu] '%s' not fully contained in segment of program header entry "
@@ -3109,7 +3116,7 @@ msgstr ""
"sekcja [%2zu] „%s” nie jest w całości zawarta w segmencie wpisu %d nagłówka "
"programu\n"
-#: src/elflint.c:4057
+#: src/elflint.c:4061
#, c-format
msgid ""
"section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
@@ -3118,7 +3125,7 @@ msgstr ""
"sekcja [%2zu] „%s” ma typ NOBITS, a jest odczytywana z pliku w segmencie "
"wpisu %d nagłówka programu\n"
-#: src/elflint.c:4083
+#: src/elflint.c:4087
#, c-format
msgid ""
"section [%2zu] '%s' has type NOBITS but is read from the file in segment of "
@@ -3127,7 +3134,7 @@ msgstr ""
"sekcja [%2zu] „%s” ma typ NOBITS, ale jest odczytywana z pliku w segmencie "
"wpisu %d nagłówka programu, a zawartość pliku jest niezerowa\n"
-#: src/elflint.c:4094
+#: src/elflint.c:4098
#, c-format
msgid ""
"section [%2zu] '%s' has not type NOBITS but is not read from the file in "
@@ -3136,17 +3143,17 @@ msgstr ""
"sekcja [%2zu] „%s” nie ma typu NOBITS, a nie jest odczytywana z pliku "
"w segmencie wpisu %d nagłówka programu\n"
-#: src/elflint.c:4105
+#: src/elflint.c:4109
#, c-format
msgid "section [%2zu] '%s' is executable in nonexecutable segment %d\n"
msgstr "sekcja [%2zu] „%s” jest wykonywalne w segmencie niewykonywalnym %d\n"
-#: src/elflint.c:4115
+#: src/elflint.c:4119
#, c-format
msgid "section [%2zu] '%s' is writable in unwritable segment %d\n"
msgstr "sekcja [%2zu] „%s” jest zapisywalne w niezapisywalnym segmencie %d\n"
-#: src/elflint.c:4125
+#: src/elflint.c:4129
#, c-format
msgid ""
"section [%2zu] '%s': alloc flag set but section not in any loaded segment\n"
@@ -3154,7 +3161,7 @@ msgstr ""
"sekcja [%2zu] „%s”: ma flagę alloc, ale sekcja nie jest w żadnym segmencie "
"wczytywalnym\n"
-#: src/elflint.c:4131
+#: src/elflint.c:4135
#, c-format
msgid ""
"section [%2zu] '%s': ELF header says this is the section header string table "
@@ -3163,7 +3170,7 @@ msgstr ""
"sekcja [%2zu] „%s”: według nagłówka ELF to jest tabela ciągów nagłówków "
"sekcji, ale typ nie jest SHT_TYPE\n"
-#: src/elflint.c:4139
+#: src/elflint.c:4143
#, c-format
msgid ""
"section [%2zu] '%s': relocatable files cannot have dynamic symbol tables\n"
@@ -3171,17 +3178,17 @@ msgstr ""
"sekcja [%2zu] „%s”: pliki relokowalne nie mogą mieć tabeli symboli "
"dynamicznych\n"
-#: src/elflint.c:4190
+#: src/elflint.c:4194
#, c-format
msgid "more than one version symbol table present\n"
msgstr "obecna jest więcej niż jedna tabela symboli wersji\n"
-#: src/elflint.c:4213
+#: src/elflint.c:4217
#, 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:4224
+#: src/elflint.c:4228
#, c-format
msgid ""
"loadable segment [%u] is executable but contains no executable sections\n"
@@ -3189,14 +3196,14 @@ msgstr ""
"wczytywalny segment [%u] jest wykonywalny, ale nie zawiera wykonywalnych "
"sekcji\n"
-#: src/elflint.c:4230
+#: src/elflint.c:4234
#, c-format
msgid "loadable segment [%u] is writable but contains no writable sections\n"
msgstr ""
"wczytywalny segment [%u] jest zapisywalny, ale nie zawiera zapisywalnych "
"sekcji\n"
-#: src/elflint.c:4241
+#: src/elflint.c:4245
#, c-format
msgid ""
"no .gnu.versym section present but .gnu.versym_d or .gnu.versym_r section "
@@ -3205,23 +3212,23 @@ msgstr ""
"brak sekcji .gnu.versym, ale istnieje sekcja .gnu.versym_d lub .gnu."
"versym_r\n"
-#: src/elflint.c:4254
+#: src/elflint.c:4258
#, c-format
msgid "duplicate version index %d\n"
msgstr "powtórzony indeks wersji %d\n"
-#: src/elflint.c:4268
+#: src/elflint.c:4272
#, 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:4317
+#: src/elflint.c:4321
#, c-format
msgid "phdr[%d]: unknown core file note type % at offset %\n"
msgstr ""
"phdr[%d]: nieznany typ notatki pliku core % pod offsetem %\n"
-#: src/elflint.c:4321
+#: src/elflint.c:4325
#, c-format
msgid ""
"section [%2d] '%s': unknown core file note type % at offset %zu\n"
@@ -3229,7 +3236,7 @@ msgstr ""
"sekcja [%2d]: „%s”: nieznany typ notatki pliku core % pod offsetem "
"%zu\n"
-#: src/elflint.c:4370
+#: src/elflint.c:4374
#, fuzzy, c-format
msgid ""
"phdr[%d]: unknown object file note type % with owner name '%s' at "
@@ -3237,7 +3244,7 @@ msgid ""
msgstr ""
"phdr[%d]: nieznany typ notatki pliku obiektu % pod offsetem %zu\n"
-#: src/elflint.c:4375
+#: src/elflint.c:4379
#, fuzzy, c-format
msgid ""
"section [%2d] '%s': unknown object file note type % with owner name "
@@ -3246,37 +3253,37 @@ msgstr ""
"sekcja [%2d] „%s”: nieznany typ notatki pliku obiektu % pod offsetem "
"%zu\n"
-#: src/elflint.c:4394
+#: src/elflint.c:4398
#, c-format
msgid "phdr[%d]: no note entries defined for the type of file\n"
msgstr "phdr[%d]: brak określonych wpisów notatek dla typu pliku\n"
-#: src/elflint.c:4414
+#: src/elflint.c:4418
#, c-format
msgid "phdr[%d]: cannot get content of note section: %s\n"
msgstr "phdr[%d]: nie można uzyskać zawartości sekcji notatki: %s\n"
-#: src/elflint.c:4417
+#: src/elflint.c:4421
#, c-format
msgid "phdr[%d]: extra % bytes after last note\n"
msgstr "phdr[%d]: dodatkowe % bajtów po ostatniej notatce\n"
-#: src/elflint.c:4438
+#: src/elflint.c:4442
#, c-format
msgid "section [%2d] '%s': no note entries defined for the type of file\n"
msgstr "sekcja [%2d] „%s”: brak określonych wpisów notatek dla typu pliku\n"
-#: src/elflint.c:4445
+#: src/elflint.c:4449
#, c-format
msgid "section [%2d] '%s': cannot get content of note section\n"
msgstr "sekcja [%2d] „%s”: nie można uzyskać zawartości sekcji notatek\n"
-#: src/elflint.c:4448
+#: src/elflint.c:4452
#, c-format
msgid "section [%2d] '%s': extra % bytes after last note\n"
msgstr "sekcja [%2d] „%s”: dodatkowe % bajtów po ostatniej notatce\n"
-#: src/elflint.c:4466
+#: src/elflint.c:4470
#, c-format
msgid ""
"only executables, shared objects, and core files can have program headers\n"
@@ -3284,135 +3291,135 @@ msgstr ""
"tylko pliki wykonywalne, obiekty współdzielone i pliki core mogą mieć "
"nagłówki programu\n"
-#: src/elflint.c:4481
+#: src/elflint.c:4485
#, c-format
msgid "cannot get program header entry %d: %s\n"
msgstr "nie można uzyskać wpisu nagłówka programu %d: %s\n"
-#: src/elflint.c:4490
+#: src/elflint.c:4499
#, c-format
msgid "program header entry %d: unknown program header entry type %#\n"
msgstr ""
"wpis nagłówka programu %d: nieznany typ wpisu nagłówka programu %#\n"
-#: src/elflint.c:4501
+#: src/elflint.c:4510
#, 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:4509
+#: src/elflint.c:4518
#, 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:4516
+#: src/elflint.c:4525
#, c-format
msgid "static executable cannot have dynamic sections\n"
msgstr "statyczny plik wykonywalny nie może mieć sekcji dynamicznych\n"
-#: src/elflint.c:4530
+#: src/elflint.c:4539
#, c-format
msgid "dynamic section reference in program header has wrong offset\n"
msgstr "odniesienie sekcji dynamicznej w nagłówku programu ma błędny offset\n"
-#: src/elflint.c:4533
+#: src/elflint.c:4542
#, 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:4543
+#: src/elflint.c:4552
#, 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:4564
+#: src/elflint.c:4573
#, c-format
msgid "loadable segment GNU_RELRO applies to is not writable\n"
msgstr "wczytywalny segment wskazywany przez GNU_RELRO nie jest zapisywalny\n"
-#: src/elflint.c:4575
+#: src/elflint.c:4584
#, c-format
msgid "loadable segment [%u] flags do not match GNU_RELRO [%u] flags\n"
msgstr "flagi wczytywalnego segmentu [%u] nie pasują do flag GNU_RELRO [%u]\n"
-#: src/elflint.c:4582
+#: src/elflint.c:4591
#, c-format
msgid ""
"GNU_RELRO [%u] flags are not a subset of the loadable segment [%u] flags\n"
msgstr ""
"flagi GNU_RELRO [%u] nie są podzbiorem flag wczytywalnego segmentu [%u]\n"
-#: src/elflint.c:4591 src/elflint.c:4614
+#: src/elflint.c:4600 src/elflint.c:4623
#, c-format
msgid "%s segment not contained in a loaded segment\n"
msgstr "segment %s nie zawiera się we wczytywalnym segmencie\n"
-#: src/elflint.c:4620
+#: src/elflint.c:4629
#, 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:4647
+#: src/elflint.c:4656
#, c-format
msgid "call frame search table reference in program header has wrong offset\n"
msgstr ""
"odniesienie tabeli wyszukiwania ramki wywołania w nagłówku programu ma "
"błędny offset\n"
-#: src/elflint.c:4650
+#: src/elflint.c:4659
#, c-format
msgid "call frame search table size mismatch in program and section header\n"
msgstr ""
"różne rozmiary tabel wyszukiwania ramki wywołania w nagłówku programu "
"i sekcji\n"
-#: src/elflint.c:4663
+#: src/elflint.c:4672
#, c-format
msgid "PT_GNU_EH_FRAME present but no .eh_frame_hdr section\n"
msgstr "PT_GNU_EH_FRAME jest obecne, ale brak sekcji .eh_frame_hdr\n"
-#: src/elflint.c:4671
+#: src/elflint.c:4680
#, c-format
msgid "call frame search table must be allocated\n"
msgstr "tabela wyszukiwania ramki wywołania musi być przydzielona\n"
-#: src/elflint.c:4674
+#: src/elflint.c:4683
#, c-format
msgid "section [%2zu] '%s' must be allocated\n"
msgstr "sekcja [%2zu] „%s”: musi być przydzielona\n"
-#: src/elflint.c:4678
+#: src/elflint.c:4687
#, c-format
msgid "call frame search table must not be writable\n"
msgstr "tabela wyszukiwania ramki wywołania nie może być zapisywalna\n"
-#: src/elflint.c:4681
+#: src/elflint.c:4690
#, c-format
msgid "section [%2zu] '%s' must not be writable\n"
msgstr "sekcja [%2zu] „%s” nie może być zapisywalna\n"
-#: src/elflint.c:4686
+#: src/elflint.c:4695
#, c-format
msgid "call frame search table must not be executable\n"
msgstr "tabela wyszukiwania ramki wywołania nie może być wykonywalna\n"
-#: src/elflint.c:4689
+#: src/elflint.c:4698
#, c-format
msgid "section [%2zu] '%s' must not be executable\n"
msgstr "sekcja [%2zu] „%s” nie może być wykonywalna\n"
-#: src/elflint.c:4700
+#: src/elflint.c:4709
#, 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:4707
+#: src/elflint.c:4716
#, 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:4710
+#: src/elflint.c:4719
#, c-format
msgid ""
"program header entry %d: file offset and virtual address not module of "
@@ -3421,7 +3428,7 @@ msgstr ""
"wpis nagłówka programu %d: offset w pliku i adres wirtualny nie są "
"wielokrotnością wyrównania\n"
-#: src/elflint.c:4723
+#: src/elflint.c:4732
#, c-format
msgid ""
"executable/DSO with .eh_frame_hdr section does not have a PT_GNU_EH_FRAME "
@@ -3430,12 +3437,12 @@ msgstr ""
"plik wykonywalny/DSO z sekcją .eh_frame_hdr nie ma wpisu nagłówka programu "
"PT_GNU_EH_FRAME"
-#: src/elflint.c:4757
+#: src/elflint.c:4766
#, c-format
msgid "cannot read ELF header: %s\n"
msgstr "nie można odczytać nagłówka ELF: %s\n"
-#: src/elflint.c:4783
+#: src/elflint.c:4792
#, c-format
msgid "text relocation flag set but not needed\n"
msgstr "flaga relokacji tekstu jest ustawiona, ale niepotrzebna\n"
diff --git a/libdrgn/elfutils/po/uk.po b/libdrgn/elfutils/po/uk.po
index 0ca049e72..051cc0bb2 100644
--- a/libdrgn/elfutils/po/uk.po
+++ b/libdrgn/elfutils/po/uk.po
@@ -2,13 +2,13 @@
# Copyright (C) 2010 Free Software Foundation, Inc.
# This file is distributed under the same license as the elfutils package.
#
-# Yuri Chornoivan , 2010, 2011, 2012, 2013, 2014, 2015.
+# Yuri Chornoivan , 2010, 2011, 2012, 2013, 2014, 2015, 2020.
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: https://sourceware.org/bugzilla/\n"
-"POT-Creation-Date: 2019-11-26 09:48+0100\n"
-"PO-Revision-Date: 2015-09-26 16:41+0300\n"
+"POT-Creation-Date: 2020-03-30 12:56+0200\n"
+"PO-Revision-Date: 2020-03-28 14:59+0200\n"
"Last-Translator: Yuri Chornoivan \n"
"Language-Team: Ukrainian