Frank Ch. Eigler [Sun, 14 Feb 2021 21:02:05 +0000 (16:02 -0500)]
PR27413: use bsdtar to unpack deb-related formats
dpkg-deb has been reported to be fragile when running under
debuginfod, whereas bsdtar (libarchive) is happy with all these
flavors of files. Switch to a bsdtar based pipeline, now
equipped with an escaped glob pattern that adapts to a variety
of interior data.tar* compression formats.
No testsuite impact. .ipk format tested with some random openwrt and
kino-extension binaries found on the net. Some of these are built
with out buildid, and hardly any with debuginfo, but whatever, bsdtar
and elfutils extract whatever info is there.
Signed-off-by: Frank Ch. Eigler <fche@redhat.com> Signed-off-by: Dorinda Bassey <dorindabassey@gmail.com>
Commit eb922a1b8f3a ("tests: use ${CC} instead of 'gcc' in tests")
exports ${CC} into the test environment, but doesn't quote the
value for the assignment. That doesn't work properly if the value
contains whitespace. In a multilib/biarch environment however, it's
common to set CC="gcc -m32" or similar. That causes tests to print
error messages: "/bin/sh: line 2: -m32: command not found".
Fix that by adding quotes around all make variables (not just $CC)
used in setting up TESTS_ENVIRONMENT.
Signed-off-by: Alexander Miller <alex.miller@gmx.de>
A couple of closely related pieces of work allow more early warning
about low storage/memory conditions:
- New prometheus metrics to track filesystem freespace, and more
details about some errors.
- Frequent checking of $TMPDIR freespace, to trigger fdcache
emergency flushes.
- Switch to floating point prometheus metrics, to communicate
fractions - and short time intervals - accurately.
- Fix startup-time pthread-creation error handling.
Testing is smoke-test-level only as it is hard to create
free-space-limited $TMPDIRs. Locally tested against tiny through
medium tmpfs filesystems, with or without sqlite db also there. Shows
a pleasant stream of diagnostics and metrics during shortage but
generally does not fail outright. However, catching an actual
libstdc++- or kernel-level OOM is beyond our ken.
PR27323 debuginfod: improve query concurrency with grooming
Start using a second sqlite3 database connection for webapi query
servicing. This allows much better concurrency when long-running
grooming operations are in progress.
No testsuite impact. Grooming times are too short to try to hit with
concurrent requests. OTOH the existing tests did show some
interesting regressions that needed fixing, like needing not to
dual-wield db and dbq when doing rpm-dwz-related lookups from during
scanning, and the way in which corrupted databases are reported.
These needed some automated invocations of gdb on the running
debuginfod binaries that just failed their testing, for in-situ
debugging.
Hand-tested for function on a huge 20GB index file. Allowed webapi
queries to be run throughout random points of the grooming process,
including especially the long count(*) report loops before & after.
Érico Rolim [Tue, 2 Feb 2021 00:16:56 +0000 (21:16 -0300)]
libdwfl: use GNU strerror_r only when available.
Some C libraries don't provide the GNU version of strerror_r, only the
XSI-compliant one. We use the GNU version when available, since it fits
the code better, and otherwise use the XSI-compliant one.
To better support cross-compilation Gentoo provides a way
to configure system without 'gcc' binary and only provide
tool-prefixed tools, like 'x86_64-pc-linux-gnu-gcc'.
The packages are built as ./configure --host=x86_64-pc-linux-gnu.
In https://bugs.gentoo.org/718872 Agostino Sarubbo found
a few test failures that use hardcoded 'gcc' instead of
expected ${CC}. The change propagates detected ${CC} at
configure time to test scripts.
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
Timm Bäder [Fri, 8 Jan 2021 08:04:49 +0000 (09:04 +0100)]
strip: Remove no_symtab_updates() function
The no_symtab_updates() function was being called at the beginning of
all case labels in this switch, so we can just call it once before the
switch. Then it only has one call-site, so inline this short function
there.
Timm Bäder [Fri, 8 Jan 2021 08:04:47 +0000 (09:04 +0100)]
strip: Pull relocate() info file scope
Pull relocate() info file scope and get rid of a nested function this
way. Refactor remove_debug_relocations() to minimize the parameters we
need to pass to relocate().
Mark Wielaard [Tue, 12 Jan 2021 10:35:10 +0000 (11:35 +0100)]
elflint: Recognize SHF_GNU_RETAIN as extra section flag.
SHF_GNU_RETAIN is like SHF_LINK_ORDER it can appear on any section
and should be ignored by elflint. Add all such flags to a new
EXTRA_SHFLAGS and use it consistently in check_sections.
before the change section_flags_string() ignored unknown section
flags: snprintf() did write numeric value into buffer, but
"*cp = '\0'" negated the effect.
The change advances the 'cp' pointer'.
While at it add a '|' separator between known and unknown flags.
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
Érico Rolim [Wed, 16 Dec 2020 22:30:12 +0000 (19:30 -0300)]
src/readelf: use qsort instead of qsort_r.
This program is single threaded, so using qsort with a global variable
isn't a danger. The interface for qsort_r isn't standardized (and
diverges between glibc and FreeBSD, for example), which makes usage of
qsort, where possible, preferrable.
Dmitry V. Levin [Sun, 20 Dec 2020 08:00:00 +0000 (08:00 +0000)]
Split the top level .gitignore file
Move subdirectory parts of the top level .gitignore into appropriate
subdirectories. This would be consistent with ChangeLog files,
currently one has to update the top level ChangeLog file when
the top level .gitignore file is changed in a way that affects
a specific subdirectory only.
Dmitry V. Levin [Tue, 15 Dec 2020 08:00:00 +0000 (08:00 +0000)]
Modernize gettext infrastructure
Switch to use AM_GNU_GETTEXT, AM_GNU_GETTEXT_VERSION, and
AM_GNU_GETTEXT_REQUIRE_VERSION, this allows to stop bundling gettext
infrastructure files and let autoreconf invoke autopoint which will set
the gettext infrastructure up.
Use this opportunity to create separate .gitignore files for m4/ and po/
directories.
Tested with
autoreconf -if && ./configure --enable-maintainer-mode && make && make distcheck
Dmitry V. Levin [Wed, 16 Dec 2020 08:00:00 +0000 (08:00 +0000)]
libcpu: consistently use _(Str) instead of gettext(Str)
eu-config.h defines _(Str) to dgettext ("elfutils", Str) instead of
a simple gettext (Str) for a reason: the library might be indirectly
used by clients that called bindtextdomain with a domain different
from "elfutils".
The change was made automatically using the following command:
$ git grep -l '\<gettext *(' libcpu |xargs sed -i 's/\<gettext *(/_(/g'
Dmitry V. Levin [Wed, 16 Dec 2020 08:00:00 +0000 (08:00 +0000)]
lib: consistently use _(Str) instead of gettext(Str)
eu-config.h defines _(Str) to dgettext ("elfutils", Str) instead of
a simple gettext (Str) for a reason: the library might be indirectly
used by clients that called bindtextdomain with a domain different
from "elfutils".
The change was made automatically using the following command:
$ git grep -l '\<gettext *(' lib |xargs sed -i 's/\<gettext *(/_(/g'
Dmitry V. Levin [Wed, 16 Dec 2020 08:00:00 +0000 (08:00 +0000)]
Consistently define _(Str) using dgettext ("elfutils", Str)
Move the definition of _(Str) macro to lib/eu-config.h which already
provides a definition of N_(Str) macro. Since lib/eu-config.h is
appended to config.h, it is included into every compilation unit
and therefore both macros are now universally available.
Remove all other definitions of N_(Str) and _(Str) macros from other files
to avoid conflicts and redundancies.
The next step is to replace all uses of gettext(Str) with _(Str).
Dmitry V. Levin [Tue, 15 Dec 2020 08:00:00 +0000 (08:00 +0000)]
libebl: consistently use _(Str) instead of gettext(Str)
libeblP.h defines _(Str) to dgettext ("elfutils", Str) instead of
a simple gettext (Str) for a reason: the library might be indirectly
used by clients that called bindtextdomain with a domain different
from "elfutils".
The change was made automatically using the following command:
$ git grep -l '\<gettext *(' libebl |xargs sed -i 's/\<gettext *(/_(/g'
Mark Wielaard [Wed, 16 Dec 2020 09:57:22 +0000 (10:57 +0100)]
libelf: Make sure we have at least a full ELF header available.
When elf_memory is called we could get a slightly too small image
that doesn't contain a full ELF header (but does contain at least
the e_ident values). Require the full header before even validating
the rest of the ELF header fields.
Dmitry V. Levin [Tue, 15 Dec 2020 20:56:37 +0000 (23:56 +0300)]
po: remove empty translation files
Remove translation files that do not contain any translation strings,
not even a single fuzzy one. These files are also unused because they
are not listed in the LINGUAS file.
Dmitry V. Levin [Tue, 15 Dec 2020 14:40:38 +0000 (17:40 +0300)]
m4: remove unneeded Makefile.am
m4 files do not have to listed in EXTRA_DIST, in fact,
biarch.m4 has not been listed since its very beginning in 2013,
and nobody seems to have noticed so far.
Tested with
autoreconf -if && ./configure --enable-maintainer-mode && make && make distcheck
Dmitry V. Levin [Sat, 12 Dec 2020 01:27:37 +0000 (04:27 +0300)]
src: fix spelling typos in argp help text and error diagnostics
Since all these help text strings are marked for translation, apply the fixes
to translation strings as well, this helps to avoid translations becoming fuzzy.
An attempt to run autoreconf in tests would currently fail
with the following automake error:
automake: error: cannot open < config/eu.am: No such file or directory
Apparently, nobody builds tests as a separate project for more than 10
years, so cleanup the remains of that unused and broken code.
Dmitry V. Levin [Wed, 9 Dec 2020 23:34:55 +0000 (02:34 +0300)]
Fix automake warnings
Apparently, commit 2f02e81510946a4c8e9157ad0b72d92894b9acd7 that removed
$(EXEEXT) suffix from shared libraries was incomplete: it missed the
fact that some libraries were included into noinst_PROGRAMS, resulting
to the following automake warnings:
Fix this by renaming noinst_PROGRAMS to noinst_DATA and removing no
longer needed lib{asm,dw,elf}_so_SOURCES variables and add lib{asm,dw,elf).so
to CLEANFILES.
Fixes: 2f02e8151094 ("Drop $(EXEEXT) suffix from shared libraries") Signed-off-by: Dmitry V. Levin <ldv@altlinux.org> Signed-off-by: Mark Wielaard <mark@klomp.org>
Dmitry V. Levin [Wed, 9 Dec 2020 00:13:12 +0000 (03:13 +0300)]
debuginfod: create libdebuginfod.so.1 before libdebuginfod.so
This would allow to switch from "libdebuginfod-" VERSION ".so"
to DEBUGINFOD_SONAME in __libdwfl_debuginfod_init, and to remove the
fall back to dlopen of "libdebuginfod.so" which would no longer be needed.
Dmitry V. Levin [Wed, 9 Dec 2020 00:12:53 +0000 (03:12 +0300)]
debuginfod: export DEBUGINFOD_SONAME macro in debuginfod.h
Add DEBUGINFOD_SONAME macro to API for use by those of libdebuginfod
clients that would like to dlopen the library in the same way as
__libdwfl_debuginfod_init does.
Frank Ch. Eigler [Thu, 26 Nov 2020 00:41:03 +0000 (19:41 -0500)]
debuginfod: use clock_gettime(CLOCK_MONOTONIC) for intervals
On Mark's request, use a monotonic clock for metrics/reports related
to time interval measurement. gettimeofday can jump a bit, which
could distort metrics. Tests unaffected.
Frank Ch. Eigler [Tue, 24 Nov 2020 00:58:10 +0000 (19:58 -0500)]
debuginfod: sqlite3 metrics
Add metrics for tracking sqlite3 error counts and query performance.
The former looks like a new sibling of the "error_count" family, and
is tested by dd-corrupting a live database file then triggering some
debuginfod activity.
error_count{sqlite3="file is not a database"} 1
The latter looks like _count/_sum pairs for each type of sqlite
prepared-statement used in the code, and is grep smoke-tested. They
should assist a sysadmin in tuning db storage. This example shows a
6.4 ms/operation cost:
Mark Wielaard [Tue, 10 Nov 2020 23:23:08 +0000 (00:23 +0100)]
debuginfod-client: Add debuginfod_set_verbose_fd and DEBUGINFOD_VERBOSE
Introduce a new function debuginfod_set_verbose_fd which will produce
verbose output on a given file descriptor (STDERR_FILENO if the
environment variable DEBUGINFOD_VERBOSE is set) showing how the search
for a particular client query is going.
Example output:
debuginfod_find_debuginfo 1234567890
server urls "https://debuginfod.elfutils.org/ http://dbgd.usersys.com:3632/"
checking build-id
checking cache dir /home/mark/.cache/debuginfod_client
using timeout 90
init server 0 https://debuginfod.elfutils.org/
url 0 https://debuginfod.elfutils.org/buildid/1234567890/debuginfo
init server 1 http://dbgd.usersys.com:3632/
url 1 http://dbgd.usersys.com:3632/buildid/1234567890/debuginfo
query 2 urls in parallel
server response HTTP response code said error
url 0 The requested URL returned error: 404 Not Found
server response HTTP response code said error
url 1 The requested URL returned error: 404 Not Found
not found No such file or directory (err=-2)
Frank Ch. Eigler [Thu, 19 Nov 2020 18:16:10 +0000 (13:16 -0500)]
debuginfod: add thread-busy metrics to webapi service
Improve monitoring of debuginfod instances by tracking thread_busy
status for the threads responding to http requests. While these are
usually short-lived, longer archive-uncompress operations can take
long enough time to show up on top/uptime. This should also assist
noticing abusive clients and guide scaling of the service.
Mark Wielaard [Wed, 11 Nov 2020 20:28:07 +0000 (21:28 +0100)]
debuginfod-find: Be a bit less verbose with -v
debuginfod-find -v enables a progressfn that prints the Progress every
time the callback is called. For slow transfers or big downloads this
can be really verbose (hundreds a times a second). Slow it down a bit,
so it only prints the progress at most 5 times a second.
Mark Wielaard [Fri, 6 Nov 2020 17:16:24 +0000 (18:16 +0100)]
libelf: Update SH_ENTSIZE_HASH comment.
The elf-knowledge.h contains various macros to deal with specific ELF
knowledge needed to interpret some ELF constructs that can be ambigious
depending on architecture ABI. Update the comment of SH_ENTSIZE_HASH
to add a more technical description of why it is needed.