Alfred Wingate [Wed, 29 Jan 2025 07:32:49 +0000 (09:32 +0200)]
Declare HAVE_ERROR_H only if error symbol is available
Musl doesn't provide error.h. But there exists a standalone implementation
that installs /usr/include/error.h but requires explicit linkage. This
leads linkage errors later on due to the assumption that error
symbols are provided by the libc.
Bug: https://bugs.gentoo.org/948878
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32548 Signed-off-by: Alfred Wingate <parona@protonmail.com>
Michael Pratt [Mon, 13 Jan 2025 23:56:38 +0000 (23:56 +0000)]
Replace usage of ar with stored library manifest files
The ar program is called to assemble a list of objects
within each archive to assist in building combined libraries,
however make already has this information
when processing the subdirectory for that respective library.
The list can be saved in a "manifest" file
instead of being generated whenever it is needed
for use with other subdirectories.
Even though the difference in time is insignificant,
a simple "echo" and "cat" is as much as 10 times faster
than a call to "ar t" for printing the archive members.
Since elfutils builds ar,
this also removes the awkward circular dependency
where an installation of ar is required
to build the libraries for ar.
Additionally, not every version of ar is equally portable,
as native versions of ar on macOS and other BSD-like distributions
may print out a special archive member like "__.SYMDEF"
which is not a compiled object but rather just metadata
from ranlib, leading to a build failure.
Avoid these limitations by removing usage of ar
and adding build and clean rules
for the usage of archive manifest files.
* .gitignore: exclude ".manifest" file extension.
* backends/Makefile.am: add manifest file build and clean rules.
* debuginfod/Makefile.am: Likewise.
* lib/Makefile.am: Likewise.
* libasm/Makefile.am: Likewise.
* libcpu/Makefile.am: Likewise.
* libdw/Makefile.am: Likewise,
and set object lists to manifest contents.
* libdwelf/Makefile.am: Likewise.
* libdwfl/Makefile.am: Likewise.
* libebl/Makefile.am: Likewise.
* libelf/Makefile.am: Likewise,
and set object lists to manifest contents.
* src/Makefile.am: Likewise.
Aaron Merey [Tue, 21 Jan 2025 00:20:12 +0000 (19:20 -0500)]
libdwfl/argp-std.c: Set offline_next_address for a.out default
If none of -e, -p or -k is given as a command line option, libdwfl
parse_opt will use '-e a.out' as the default.
When handling -e, parse_opt will set dwfl->offline_next_address
to 0. However when handling the default '-e a.out',
dwfl->offline_next_address is not set to 0. This can result in
eu-addr2line failing to correctly output the line information for a
given address.
Fix this by setting dwfl->offline_next_address to 0 when setting up
the default '-e a.out' dwfl.
Mark Wielaard [Mon, 18 Nov 2024 23:45:39 +0000 (00:45 +0100)]
Update minimum C compiler supported to C11 plus stdatomic.h
We were using a somewhat odd mix of gnu99 with a fallback atomics.h so
we could build with gcc 4.7. Lets requires a compiler that can do at
least C11 and has a stdatomic.h. So we can build against any C
standard >= C11 (including C17 and C23). That means GCC 4.9+.
GCC 4.9 was released in 2014.
The lowest compiler version we check in the buildbots is currently
GCC 8.3.0 (Debian old old stable, released in 2018).
Also update the minimum autoconf version to 2.69. We would really like
2.70+ so we don't need the gnulib gnu11.m4. But 2.69 still seems in
use on various stable systems. autoconf 2.70 was released end of 2020,
autoconf 2.69 in 2012.
* configure.ac (AC_PACKAGE_URL): Removed workaround for
autoconf < 2.64.
(AC_PREREQ): Update from 2.63 to 2.69.
(AC_PROG_CC): Test for ac_cv_prog_cc_c11.
(AC_CACHE_CHECK for stdatomic.h
* config/eu.am (AM_CFLAGS): Remove -std=gnu99.
* lib/Makefile.am (noinst_HEADERS): Remove atomics.h and
stdatomic-fbsd.h.
* lib/atomics.h: Removed.
* lib/stdatomic-fbsd.h: Removed.
* lib/dynamicsizehash_concurrent.h: Include stdatomic.h.
* libdw/libdw_alloc.c: Likewise.
* m4/.gitignore: Add !/std-gnu11.m4.
* m4/std-gnu11.m4: New file from gnulib to provide AC_PROG_CC
from autoconf 2.70.
i386_lex_CFLAGS is a make variable to tweak the i386_lex.c.o
specific compile flags. The are already some -W defined there, I'd
like to add one to avoid seeing false warning during build with -O3
compile flag.
GCC 14.2 (as well as 13.x) produce a false positive warning for the
i386 lexer, a bug is filled already against GCC for that, CLANG is
immune.
Mark Wielaard [Wed, 8 Jan 2025 11:37:35 +0000 (12:37 +0100)]
config: Put the -D option as first argument to INSTALL_DATA
INSTALL_DATA uses the install program to install files. The GNU
coreutils implementation of install takes options anywhere. Other
implementations of install might take options only before the source
and destination arguments.
* config/Makefile.am (all-local): Move -D option before
file and directory arguments.
Michael Pratt [Sun, 24 Nov 2024 19:03:58 +0000 (19:03 +0000)]
Consolidate list of custom phony targets
Having a target defined as phony within a condition
while another target is always defined as phony
causes an automake warning:
Makefile.am:67: warning: .PHONY was already defined in condition TRUE, which includes condition GCOV ...
config/eu.am:141: ... '.PHONY' previously defined here
Makefile.am:21: 'config/eu.am' included from here
tests/Makefile.am:895: warning: .PHONY was already defined in condition TRUE, which includes condition GCOV ...
config/eu.am:141: ... '.PHONY' previously defined here
tests/Makefile.am:19: 'config/eu.am' included from here
Instead, list all the custom targets that are phony
in the common definitions in the eu.am file.
Since it is all related to coverage at this moment,
the list can be grouped as it is instead of moved or split.
* Makefile.am: remove .PHONY list in conditional
* config/eu.am: add coverage target to .PHONY list
* tests/Makefile.am: remove .PHONY list in conditional
Michael Pratt [Sun, 24 Nov 2024 19:03:47 +0000 (19:03 +0000)]
Consolidate custom clean targets for coverage files
As reported by Mark:
Since b2f225d6b ("Consolidate and add files to clean target variables")
autoreconf (automake) produces these warnings:
debuginfod/Makefile.am:130: warning: CLEANFILES multiply defined in condition TRUE ...
config/eu.am:138: ... 'CLEANFILES' previously defined here
debuginfod/Makefile.am:32: 'config/eu.am' included from here
libasm/Makefile.am:91: warning: CLEANFILES multiply defined in condition TRUE ...
config/eu.am:138: ... 'CLEANFILES' previously defined here
libasm/Makefile.am:30: 'config/eu.am' included from here
libcpu/Makefile.am:105: warning: CLEANFILES multiply defined in condition TRUE ...
config/eu.am:138: ... 'CLEANFILES' previously defined here
libcpu/Makefile.am:30: 'config/eu.am' included from here
libdw/Makefile.am:156: warning: CLEANFILES multiply defined in condition TRUE ...
config/eu.am:138: ... 'CLEANFILES' previously defined here
libdw/Makefile.am:30: 'config/eu.am' included from here
libelf/Makefile.am:142: warning: CLEANFILES multiply defined in condition TRUE ...
config/eu.am:138: ... 'CLEANFILES' previously defined here
libelf/Makefile.am:30: 'config/eu.am' included from here
src/Makefile.am:47: warning: CLEANFILES multiply defined in condition TRUE ...
config/eu.am:138: ... 'CLEANFILES' previously defined here
src/Makefile.am:19: 'config/eu.am' included from here
tests/Makefile.am:891: warning: CLEANFILES multiply defined in condition TRUE ...
config/eu.am:138: ... 'CLEANFILES' previously defined here
tests/Makefile.am:19: 'config/eu.am' included from here
This is because config/eu.am defines a default "CLEANFILES".
However, the list is only for the removal of coverage files.
Since there is an exising custom clean rule for coverage in Makefile.am
because there is a directory involved as well as files,
further simplification of these rule definitions can resolve this.
Define cleaning targets for coverage files
in a single place and as a common definition
for all generated Makefiles using a custom rule.
This allows for avoiding the use of "CLEANFILES"
variables for anything related to removing coverage files,
and removing the usage of this variable where there is a conflict,
as it is no longer needed to be defined there.
* Makefile.am: remove variables and custom clean target.
* config/eu.am: remove clean variables, add variables
and custom clean target based on removed definitions.
Fixes: b2f225d6b ("Consolidate and add files to clean target variables") Reported-by: Mark Wielaard <mark@klomp.org> Signed-off-by: Michael Pratt <mcpratt@pm.me>
Michael Pratt [Sun, 24 Nov 2024 19:03:28 +0000 (19:03 +0000)]
Makefile.am: include common eu.am definitions
Some definitions in Makefile.am can be moved
to the common definitions in config/eu.am,
but for them to apply to the top-level Makefile after moving,
eu.am must be added as an include statement.
Except for "CLEANFILES", handled in the next commit,
there are no definitions in eu.am that are defined in Makefile.am,
so there are no other conflicts or overrides between the two.
Henning Meyer [Sat, 7 Dec 2024 20:01:54 +0000 (15:01 -0500)]
debuginfod: in --cors mode, add CORS response headers and OPTIONS method
CORS is the Cross-Origin-Resource-Sharing mechanism explained at
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS 1. by default
JavaScript code from Website A cannot request arbitrary resources from
website B, these are called cross-origin-requests 2. The browser
performs what is called a preflight check, this the OPTIONS method 3.
the response allows website B fine-grained control over what the web
browser should allow 4. Setting "Access-Control-Allow-Origin: *" tells
the web browser to allow all access, e.g. the same behavior you get with
curl or debuginfod-find The website mentions that the corresponding spec
has been changed, such that preflight requests are no longer necessary,
but in the browsers I use today (Firefox 132 and Chromium 131) they are
still necessary.
I have confirmed that I can use debuginfod with this patch from my web
application at https://core-explorer.github.io/cdx-type/
FChE simplified the code and added a few quick "curl -i | grep" tests
to confirm the new headers are there.
* debuginfod/debuginfod.cxx (handle_options): New function.
(handler_cb): Call it for OPTIONS. Add ACAO header for all
successful requests.
(parse_opt): Parse --cors.
* tests/run-debuginfod-federation-metrics.sh,
tests/run-debuginfod-find-metadata.sh: Lightly test.
* doc/debuginfod.8: Document --cors option, default off.
Signed-off-by: Henning Meyer <hmeyer.eu@gmail.com> Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
Mark Wielaard [Fri, 22 Nov 2024 17:17:29 +0000 (18:17 +0100)]
libdw: Update DW_LANG codes
Pick up the language codes published after DWARF5 was published.
The are listed at https://dwarfstd.org/languages.html
Also adjust C language dectection in dwarf_getfuncs and update the
dwarf_default_lower_bound function to return the default lower bounds
for the new langauge codes.
There is one small change in dwarf_default_lower_bound. We now return
zero instead of an error when called for DW_LANG_Mips_Assembler. Since
there is now an "official" DW_LANG_Assembly which is explicitly
defined as having a default lower bound of zero. It seems better to do
the same for the vendor code too.
* libdw/dwarf.h: Add new DW_LANG codes.
* libdw/dwarf_default_lower_bound.c (dwarf_default_lower_bound):
Handle new language codes and remove a special case for
DW_LANG_Mips_Assembler.
* libdw/dwarf_getfuncs.c (dwarf_getfuncs): Check against
DW_LANG_C17 and DW_LANG_C23.
* tests/dwarf_default_lower_bound.c: Also check for
DW_LANG_Mips_Assembler.
Mark Wielaard [Mon, 18 Nov 2024 18:50:17 +0000 (19:50 +0100)]
libdw: Don't use ATOMIC_VAR_INIT
ATOMIC_VAR_INIT was introduced in C11, but not deemed necessary to
implement atomics. So deprecated in C17 and removed in C23. Normal
initialization syntax should be sufficient.
* libdw/libdw_alloc.c (next_id): Initialize to zero without
using ATOMIC_VAR_INIT.
Michael Pratt [Wed, 23 Oct 2024 06:33:18 +0000 (06:33 +0000)]
Consolidate and add files to clean target variables
To increase the consistency of how automatic clean targets run,
define the variables together without +=, default to MOSTLYCLEANFILES
when there is no need for different levels or
add more clean levels to match other subdirectories,
add more files that are built, remove duplication, and cleanup.
Do the same for EXTRA_DIST where it is equally messy.
* backends/Makefile.am: add more objects to clean, improve spacing.
* debuginfod/Makefile.am: Likewise, and remove duplicates.
* lib/Makefile.am: improve spacing.
* libasm/Makefile.am: add more objects to clean, split similar to debuginfod.
* libcpu/Makefile.am: use normal =, add more objects to clean.
* libdw/Makefile.am: add more objects to clean, split similar to debuginfod.
* libdwelf/Makefile.am: add more objects to clean, use lowest clean level.
* libdwfl/Makefile.am: Likewise.
* libebl/Makefile.am: add more objects to clean.
* libelf/Makefile.am: add more objects to clean, split similar to debuginfod.
* src/Makefile.am: consolidate including EXTRA_DIST, split clean levels,
define with normal =, define with variables.
* tests/Makefile.am: Likewise, but not including EXTRA_DIST.
Mark Wielaard [Tue, 5 Nov 2024 22:31:14 +0000 (23:31 +0100)]
libelf: Only fetch shdr once in elf_compress[_gnu]
Some compilers assume the second call to elf[32|64]_getshdr can fail
and produce error: potential null pointer dereference. Just store the
result of the first call and reuse (when not NULL).
* libelf/elf_compress.c (elf_compress): Store getshdr result in
a shdr union var.
* libelf/elf_compress_gnu.c (): Likewise
Aaron Merey [Tue, 5 Nov 2024 22:41:26 +0000 (17:41 -0500)]
strip: Ignore --reloc-debug-sections-only for non-ET_REL files.
strip --reloc-debug-sections-only is expected to be a no-op for
non-ET_REL files. This was not enforced in the code. Sections
were copied over to a new output file and normally its contents
would be identical to the input file.
However the output file is not identical to a non-ET_REL input
file if the linker organized sections such that the indices of
SHF_ALLOC sections are not in a contigous group.
In this case strip will modify sections in order to keep all SHF_ALLOC
sections in a contiguous group.
Fix this by ignoring --reloc-debug-sections-only for non-ET_REL files.
Mark Wielaard [Thu, 24 Oct 2024 09:34:11 +0000 (11:34 +0200)]
config: Enable Debuginfod RPM sig checking and eu-stacktrace in spec
For testing that the eu-stacktrace and debuginfod ima verification
code builds correctly explicitly add --enable-stacktrace and
--enable-debuginfod-ima-verification to configure.
* config/elfutils.spec.in (enable_stacktrace): New global,
depends on arch.
(BuildRequires): Add sysprof-capture-devel.
(configure): Add --enable-stacktrace and
--enable-debuginfod-ima-verification.
(files): Add eu-stacktrace.
Mark Wielaard [Thu, 24 Oct 2024 09:06:08 +0000 (11:06 +0200)]
stacktrace: Init elf_fd in sysprof_init_dwfl
When building with LTO gcc believes elf_fd can be used uninitialized:
In function ‘sysprof_init_dwfl’,
inlined from ‘sysprof_unwind_cb’ at stacktrace.c:1235:16:
stacktrace.c:1087:7: error: ‘elf_fd’ may be used uninitialized [-Werror=maybe-uninitialized]
1087 | close (elf_fd);
| ^
This code won't be reached because if find_procfile doesn't initialize
elf_fd, it will return an error. But help the compiler by initializing
elf_fd to -1.
* src/stacktrace.c (sysprof_init_dwfl): Init elf_fd to -1.
Mark Wielaard [Tue, 22 Oct 2024 16:19:09 +0000 (18:19 +0200)]
configure: better error message for [lib]debuginfod missing dependencies
When dependencies for libdebuginfod, debuginfod or ima verification are
missing and these features are explicitly enabled the user might not
immediately know which of the dependicies are missing. Move the checks
around a little so checks for dependencies are done immediately before
the enable error message. And add the possible reason to the error to
make things more clear.
* configure.ac: Move libcurl and json-c tests before libdebuginfod
check, move libmicrohttpd, sqlite3 and libarchive tests before
debuginfod check and move librpm, libcrypto and imaevm.h tests
before ima verification check.
Mark Wielaard [Tue, 22 Oct 2024 13:03:42 +0000 (15:03 +0200)]
libelf: Add libeu objects to libelf.a static archive
libelf might use some symbols from libeu.a, specifically the eu-search
wrappers. But we don't ship libeu.a separately. So include the libeu
objects in the libelf.a archive to facilitate static linking.
* libelf/Makefile.am (libeu_objects): New variable.
(libelf_a_LIBADD): New, add libeu_objects.
Mark Wielaard [Tue, 22 Oct 2024 11:48:22 +0000 (13:48 +0200)]
tests: run-debuginfod-seekable.sh depends on LZMA and DEBUGINFOD
The run-debuginfod-seekable.sh test would run (and fail) if lzma
support was enabled, but debuginfod wasn't build. Only run it when
both are available.
* tests/Makefile.am (TESTS): Add run-debuginfod-seekable.sh if
DEBUGINFOD and LZMA.
Mark Wielaard [Fri, 18 Oct 2024 14:52:49 +0000 (16:52 +0200)]
libelf: Treat elf_memory image as writable
There are use cases where the Elf image created by elf_memory is
manipulated, through the libelf interfaces, in place. This doesn't
work anymore since we changed elf_memory to assume the memory is
read-only in elfutils 0.191. commit cc44ac674 ('libelf: Treat
elf_memory as if using ELF_C_READ_MMAP').
The reason for that change was that if elf_memory was given a
read-only memory image then decompressing a section with elf_compress
would crash. Since it directly writes the updated Shdr size. If you do
want to use elf_compress on an Elf created by elf_memory you have make
sure the memory is writable. You can do this for example by using mmap
PROTE_WRITE and MAP_PRIVATE.
* libelf/elf_memory.c (elf_memory): Call
__libelf_read_mmaped_file with ELF_C_READ_MMAP_PRIVATE.
* tests/elfgetzdata.c (main): Use mmap PROT_WRITE and MAP_PRIVATE.
elf_compress would compress all (new) data chunks, but didn't reset
the section data_list. This would cause extra data to be returned
after decompression or create bad compressed data. Add a new testcase
for this and explicitly zap the scn->data_list before resetting the
elf section raw data after (de)compression.
* libelf/elf_compress.c (__libelf_reset_rawdata): Cleanup
scn->data_list.
* tests/newzdata.c: New testcase.
* tests/Makefile.am (check_PROGRAMS): Add newzdata.
(TESTS): Likewise.
(newzdata_LDADD): New variable.
Serhei Makarov [Sat, 12 Oct 2024 19:26:06 +0000 (15:26 -0400)]
eu-stacktrace [4/5]: src: add unwind origin diagnostics to eu-stack
Since we obtain diagnostics about unwind method, another logical place
to show them is in eu-stack.
* src/stack.c (show_unwound_source): New global variable.
(struct frame): Add unwound_source field.
(frame_callback): Copy over unwound_source from Dwfl_Frame.
(print_frame): Take unwound_source string and print it.
(print_inline_frames): Take unwound_source argument and pass it on,
except for subsequent frames where we pass the string "inline".
(print_frames): Take unwound_source field from struct frame and pass
it on.
(parse_opt): Add --cfi-type,-c option to set show_unwound_source.
(main): Ditto.
* tests/run-stack-i-test.sh: Add testcase for --cfi-type.
Track the method used to unwind each Dwfl_Frame using an enum field
unwound_source; provide access to the field. Then use that in
eu-stacktrace to display the unwind methods used for each process.
This is an important diagnostic to verify how many processes are
adequately covered by the eh_frame unwinder.
* libdw/libdw.map (ELFUTILS_0.192): Add dwfl_frame_unwound_source,
dwfl_unwound_source_str.
* libdwfl/libdwfl.h (Dwfl_Unwound_Source): New enum.
(dwfl_frame_unwound_source)
(dwfl_unwound_source_str): New functions.
* libdwfl/dwfl_frame.c (dwfl_frame_unwound_source)
(dwfl_unwound_source_str): New functions.
* libdwfl/libdwflP.h: Add INTDECL for dwfl_frame_unwound_source,
dwfl_unwound_source_str.
(struct Dwfl_Frame): Add unwound_source field.
* libdwfl/frame_unwind.c (__libdwfl_frame_unwind): Set
state->unwound_source depending on the unwind method used.
* src/stacktrace.c (struct sysprof_unwind_info): Add last_pid
field to provide access to the current sample's dwfltab entry.
(sysprof_unwind_frame_cb): Add unwound_source to the data displayed
with the show_frames option.
(sysprof_unwind_cb): Set last_pid when processing a sample.
(main): Add unwind_source to the data displayed in the final summary
table.
Serhei Makarov [Fri, 11 Oct 2024 21:14:41 +0000 (17:14 -0400)]
eu-stacktrace [2/5]: configure.ac: initial version (x86/sysprof only)
Due to the x86-specific code in the initial version the configury has
significant restrictions. If --enable-stacktrace is not explicitly
provided, then eu-stacktrace will be disabled by default.
The way we test for x86 is a bit unusual. What we actually care about
is that the register file provided by perf_events on the system is an
x86 register file; this is done by checking that <asm/perf_regs.h> is
Linux kernel arch/x86/include/uapi/asm/perf_regs.h.
Once eu-stacktrace is properly portable across architectures,
these grody checks can be simplified. Enablement of the feature
by default depends on a released Sysprof version we can point to
for the patches.
* configure.ac: Add configure checks and conditionals for stacktrace tool.
* src/Makefile.am: Add stacktrace tool conditional on ENABLE_STACKTRACE.
Serhei Makarov [Fri, 11 Oct 2024 21:05:54 +0000 (17:05 -0400)]
eu-stacktrace [1/5]: src: add eu-stacktrace tool
eu-stacktrace is a utility to process a stream of raw stack
samples (such as those obtained from the Linux kernel's
PERF_SAMPLE_STACK facility) into a stream of stack traces (such as
those obtained from PERF_SAMPLE_CALLCHAIN), freeing other profiling
utilities from having to implement their own backtracing logic.
eu-stacktrace accepts data from a profiling tool via a pipe or
fifo. The initial version of the tool works on x86 architectures and
accepts data from Sysprof [1]. For future work, it will make sense
to expand support to other profilers, in particular perf tool.
Further patches in this series provide configury, docs, and improved
diagnostics for tracking the method used to unwind each frame in the
stack trace.
[1]: The following patched version of Sysprof (upstream submission ETA
~very_soon) can produce data with stack samples:
Note that sysprof polkit actions must be installed systemwide
(e.g. installing the system sysprof package will provide these).
Otherwise, "Action org.gnome.sysprof3.profile is not registered"
error will result.
Michael Pratt [Wed, 16 Oct 2024 19:53:52 +0000 (19:53 +0000)]
Remove usage of "unlocked" variant of stdio print functions
These "unlocked" Linux Standard Base variants of standard functions
are not available on some systems that are still capable
of building Linux and ELFs.
The difference is negligible for simple printing to stdout.
POSIX also states for the similar putc_unlocked():
These functions can safely be used in a multi-threaded program
if and only if they are called while the invoking thread owns
the (FILE *) object, as is the case after a successful call
to the flockfile() or ftrylockfile() functions.
...
These unlocked versions can be safely used
only within explicitly locked program regions,
using exported locking primitives.
and these precautions were never done.
Use the standard forms of these print functions.
There is inconsistent use of fputc_unlocked() with putc_unlocked(),
so consistently use the safer fputc() instead.
Frank Ch. Eigler [Thu, 10 Oct 2024 20:30:19 +0000 (16:30 -0400)]
PR32218: debuginfod-client: support very long source file names
debuginfod clients & servers may sometimes encounter very long source
file names. Previously, the client would synthesize a path name like
$CACHEDIR/$BUILDID/source-$PATHNAME
where $PATHNAME was a funky ##-encoded version of the entire source
path name. See https://sourceware.org/PR32218 for a horror case.
This can get too long to store as a single component of a file system
pathname (e.g. linux/limits.h NAME_MAX), resulting on client-side
errors even after a successful download.
New code switches encoding of the $PATHNAME part to use less escaping,
and a merciless truncation to the tail part of the filename. (We keep
the tail rather than the head, so that the extension is preserved,
which makes some consumers happier.) To limit collision damage from
truncation, we add also insert a goofy hash (4-byte DJBX33A) of the
name into the path name. The result is a relatively short name:
$CACHEDIR/$BUILDID/source-$HASH-$NAMETAIL
This is a transparent change to clients, who are not to make any
assumptions about cache file naming structure. However, one existing
test did make such assumptions, so is fixed with some globness. A new
test is also added, using a pre-baked tarball with a very long srcfile
name.
Michael Pratt [Thu, 10 Oct 2024 10:27:09 +0000 (10:27 +0000)]
libdw: Let clean targets be unconditional
The automake rule "maintainer-clean-generic"
is always available and never conditional,
so let the variable that uses it be define
non-conditionally.
If one actually wants conditional cleaning
they should write a custom rule and set it
as a dependency of a "*clean-local" automake rule.
There is no need to do conditional cleaning here,
so move the MAINTAINERCLEANFILES variable definition
to the end of the Makefile.am file as it is
in the rest of the project.
* libdw/Makefile.am: move MAINTAINERCLEANFILES
variable to the end of the file
as a non-conditional definition.
Michael Pratt [Thu, 10 Oct 2024 10:27:02 +0000 (10:27 +0000)]
libcpu: Include config.h before standard headers in lexer source
As part of the processing of flex, definitions and headers
are added to output source before any literal text or generated code.
This causes standard headers to come before config.h
unless config.h is included in a %top block instead
as specified in the flex manual, section 5.1 "Format of the Definitions".
The %top block is non-POSIX, so using it reinforces
the requirement of "flex" over a standardized "lex" even more.
* libcpu/i386_lex.l (%top): add flex %top block
and move config.h header inclusion to it.
Every individual test in elfutils involves a temporary directory.
Previous version of this script put that directory under the build
tree. That's OK if it's a local disk, but if it's on NFS, then some
tests - run-large-elf-file.sh, several run-debuginfod-*.sh - take long
enough to run to fail tests intermittently.
This patch moves the temp_dir under ${TMPDIR-/var/tmp/}, so it
operates at local disk speed rather than whatever-build-filesystem
speed. Individual test scripts are all unaffected. (One could
consider /tmp instead, which is a RAM disk on modern systems, except
that some of the elfutils tests produce GB-sized temporary files.
That's probably too big for RAM.)
Mark Wielaard [Wed, 28 Aug 2024 21:43:02 +0000 (23:43 +0200)]
elf*_xlatetof: do not check ELF_T_NHDR[8] has integer number of records
commit bc0f7450c "elf*_xlatetom: do not check ELF_T_NHDR has integer
number of records" fixed
https://bugzilla.redhat.com/show_bug.cgi?id=835877
But only for xlatetom. Do the same for xlatetof.
* elf32_xlatetof.c (elfw2(LIBELFBITS, xlatetof)): Do not check for
integer number of records in case of ELF_T_NHDR[8].
Mark Wielaard [Sat, 7 Sep 2024 22:00:05 +0000 (00:00 +0200)]
readelf: Allow .gdb_index const table to be empty
The .gdb_index const table can be empty, if no symbol table entry
refers to a name or CU. Which technically means the symbol table is
empty or has only zero members.
* src/readelf.c (print_gdb_index_section): Check const_off is
not past the end of the data section, it can be at the end.
Mark Wielaard [Mon, 9 Sep 2024 08:24:07 +0000 (10:24 +0200)]
srcfiles: Fix compile with --disable-libdebuginfod
The eu-srcfiles --no-backup option is only valid when build with
libdebuginfod support. Adjust the ENABLE_LIBDEBUGINFOD conditional
to not use no_backup anywhere. Also only run the run-srcfiles-self.sh
test when debuginfod is enabled.
* src/srcfiles.cxx (zip_files): Move endif ENABLE_LIBDEBUGINFOD
after no_backup check.
* tests/Makefile.am (TESTS): Only add run-srcfiles-self.sh
if DEBUGINFOD and !DUMMY_LIBDEBUGINFOD.
* tests/run-srcfiles.self.sh: Use local DEBUGINFOD_CACHE_PATH.
Mark Wielaard [Sat, 7 Sep 2024 00:15:18 +0000 (02:15 +0200)]
readelf: Fix printing of .gdb_index symbol table offset.
We were printing the addr_off instead of the sym_off. And the
testcases all expected the address offset instead of the symbol table
offset.
* src/readelf.c (print_gdb_index_section): Print sym_off as
Symbol table offset.
* tests/run-readelf-gdb_index.sh: Fix up all symbol table
offsets that were the same as the address offset.
debuginfod: Make sure extra libs are also included in static link in src/ too
commit 742fb81f3 did most of the work for supporting --enable-gcov,
but one debuginfod client is hiding in the src/ directory, namely
srcfiles, which also needs this enumeration of dependent libraries
for static linkage.
src/srcfiles.cxx depends on the HAVE_LIBARCHIVE macro to enable
the srcfiles --zip option. Defining this macro was accidentally
removed from configure.ac in commit 30b5592a3.
debuginfod: service metadata queries in separate, timed-out connections
The --metadata-maxtime=SECONDS parameter was intended to limit elapsed
time debuginfod spends attempting to answer metadata queries. These
can be slow because they have to apply glob matches across a large set
of strings, potentially taking many seconds.
However, this option was not implemented fully. It checked for
timeouts only when rows of data were finally served up by the
database, not during. Also, it used the same database connection that
normal debuginfod queries were using, locking them out.
New code creates a new temporary database connection for these
infrequent(?) metadata queries, and enforces timeouts using the
sqlite3 progress-handler callback. This effectively limits total
query runtime, inside or outside the database.
The elfutils testsuite dataset is not large enough to show either the
slow-glob or the locking-out-normal-queries phenomenon, so the
behavioral impact was hand-tested on a moderate sized debuginfod index
on a live federation server. A full valgrind leak check indicated
it's clean.
Steve Capper [Mon, 26 Aug 2024 10:52:56 +0000 (11:52 +0100)]
libdwfl, aarch64: extend dwfl_thread_state_registers to handle PAC
On AArch64 systems with pointer authentication enabled, one needs to
know the PAC mask in order to unwind functions that employ PAC.
This patch extends dwfl_thread_state_registers to handle the PAC mask
information by introducing a special register -2. (-1 is used in a
similar manner already for handling the program counter).
The AArch64 linux process attach logic is also extended to query ptrace
for the PAC mask.
A subsequent patch will add support for retrieving the PAC mask from an
AArch64 linux core file.
Signed-off-by: Steve Capper <steve.capper@arm.com>
Signed-off-by: German Gomez <german.gomez@arm.com>
[SteveC: move DW_AARCH64_RA_SIGN_STATE to cfi.h, fix comments] Signed-off-by: Steve Capper <steve.capper@arm.com>
Mark Wielaard [Wed, 21 Aug 2024 13:52:20 +0000 (15:52 +0200)]
tests: When BUILD_STATIC always link against libeu
libeu is a static library with internal helper functions normally
included in all shared libraries. But when linking static (with
--enable-gcov) we need to explicitly link it into the test binaries.
* tests/Makefile.am (libelf): Add $(libeu) when BUILD_STATIC.
Mark Wielaard [Wed, 21 Aug 2024 13:32:59 +0000 (15:32 +0200)]
debuginfod: Make sure crypto and jsonc are also included in static link
When doing a --enable-gcov build we link all binaries static.
libdebuginfod.so now depends on crypto an jsonc. So also add those
when linking against libdebuginfod.a
debuginfod/Makefile.am (libdebuginfod): Add $(crypto_LIBS)
$(jsonc_LIBS) when BUILD_STATIC.
Alfred Wingate [Wed, 14 Aug 2024 16:14:38 +0000 (12:14 -0400)]
Avoid overriding libcxx system header
Replace -I with -iquote to avoid overriding stack system header from libcxx-18
with the previously built stack binary. Override DEFAULT_INLCUDES because m4
adds -I. by default.
Andreas Schwab [Wed, 31 Jul 2024 13:03:35 +0000 (15:03 +0200)]
backends/riscv: Remove unused relocations
None of these relocations were ever part of any object file. The
GNU_VTINHERIT and GNU_VTINHERIT relocations were part of the obsolete
--gc-sections support which was never implemented for RISC-V. The other
relocations are only used internally by libbfd during the relaxation pass
and eliminated before writing the object file.
Since the schema change adding _r_seekable was done in a backward
compatible way, seekable archives that were previously scanned will not
be in _r_seekable. Whenever an archive is going to be extracted to
satisfy a request, check if it is seekable. If so, populate _r_seekable
while extracting it so that future requests use the optimized path.
The next time that BUILDIDS is bumped, all archives will be checked at
scan time. At that point, checking again will be unnecessary and this
commit (including the test case modification) can be reverted.
Whenever a new archive is scanned, check if it is seekable with a little
liblzma magic, and populate _r_seekable if so. With this, newly scanned
seekable archives will used the optimized extraction path added in the
previous commit. Also add a test case using some artificial packages.
debuginfod: optimize extraction from seekable xz archives
The kernel debuginfo packages on Fedora, Debian, and Ubuntu, and many of
their downstreams, are all compressed with xz in multi-threaded mode,
which allows random access. We can use this to bypass the full archive
extraction and dramatically speed up kernel debuginfo requests (from ~50
seconds in the worst case to < 0.25 seconds).
This works because multi-threaded xz compression splits up the stream
into many independently compressed blocks. The stream ends with an
index of blocks. So, to seek to an offset, we find the block containing
that offset in the index and then decompress and throw away data until
we reach the offset within the block. We can then decompress the
desired amount of data, possibly from subsequent blocks. There's no
high-level API in liblzma to do this, but we can do it by stitching
together a few low-level APIs.
We need to pass down the file ids then look up the size, uncompressed
offset, and mtime in the _r_seekable table. Note that this table is not
yet populated, so this commit has no functional change on its own.
debugifod: add new table and views for seekable archives
In order to extract a file from a seekable archive, we need to know
where in the uncompressed archive the file data starts and its size.
Additionally, in order to populate the response headers, we need the
file modification time (since we won't be able to get it from the
archive metadata). Add a new table, _r_seekable, keyed on the archive
file id and entry file id and containing the size, offset, and mtime.
It also contains the compression type just in case new seekable formats
are supported in the future.
In order to search this table when we get a request, we need the file
ids available. Add the ids to the _query_d and _query_e views, and
rename them to _query_d2 and _query_e2.
This schema change is backward compatible and doesn't require
reindexing. _query_d2 and _query_e2 can be renamed back the next time
BUILDIDS needs to be bumped.
Before this change, the database for a single kernel debuginfo RPM
(kernel-debuginfo-6.9.6-200.fc40.x86_64.rpm) was about 15MB. This
change increases that by about 70kB, only a 0.5% increase.
debuginfod: factor out common code for responding from an archive
handle_buildid_r_match has two very similar branches where it optionally
extracts a section and then creates a microhttpd response. In
preparation for adding a third one, factor it out into a function.
Since commit acd9525e93d7 ("PR31265 - rework debuginfod archive-extract
fdcache"), the fdcache limit is only applied when a new file is interned
and it has been at least 10 seconds since the limit was last applied.
This means that the fdcache can go over the limit temporarily.
run-debuginfod-fd-prefetch-caches.sh happens to avoid tripping over this
because of lucky sizes of the files used in the test. However, adding
new files for an upcoming test exposed this failure.
dwarf_extract_source_paths explicitly skips source files that equal
"<built-in>", but dwarf_filesrc may return a path like "dir/<built-in>".
Check for and skip that case, too.
In particular, the test debuginfod RPMs have paths like this. However,
the test cases didn't catch this because they have a bug, too: they
follow symlinks, which results in double-counting every file. Fix that,
too.
backends: allocate enough stace for null terminator
`gcc-15` added a new warning in https://gcc.gnu.org/PR115185:
i386_regs.c:88:11: error: initializer-string for array of 'char' is too long [-Werror=unterminated-string-initialization]
88 | "ax", "cx", "dx", "bx", "sp", "bp", "si", "di", "ip"
| ^~~~
`elfutils` does not need to store '\0'. We could either initialize the
arrays with individual bytes or allocate extra byte for null.
This change initializes the array bytewise.
* backends/i386_regs.c (i386_register_info): Initialize the
array bytewise to fix gcc-15 warning.
* backends/x86_64_regs.c (x86_64_register_info): Ditto.
Signed-off-by: Sergei Trofimovich <slyich@gmail.com>
Aleksei Vetrov [Thu, 11 Jul 2024 20:35:21 +0000 (20:35 +0000)]
libdwfl: Make dwfl_report_offline_memory work with ELF_C_READ_MMAP
elf_memory open mode recently changed from ELF_C_READ to
ELF_C_READ_MMAP. This broken dwfl_report_offline_memory that changes
mode to ELF_C_READ_MMAP_PRIVATE to be compatible with subsequent
elf_begin on embedded ELF files.
The proper implementation of dwfl_report_offline_memory doesn't change
open mode and subsequent elf_begin invocations simply use cmd from the
reference Elf*.
Add tests to exercise Elf* to trigger the bug caused by incorrect cmd
set to Elf*.
* libdwfl/offline.c (process_archive): Use archive->cmd
instead of hardcoded ELF_C_READ_MMAP_PRIVATE.
* libdwfl/open.c (libdw_open_elf): Use elf->cmd instead of
hardcoded ELF_C_READ_MMAP_PRIVATE.
(__libdw_open_elf_memory): Don't override (*elfp)->cmd.
* tests/Makefile.am (dwfl_report_offline_memory): Add libelf
as dependency.
* tests/dwfl-report-offline-memory.c: Add count_sections to
exercise Elf* from dwfl_report_offline_memory.
* tests/run-dwfl-report-offline-memory.sh: Add expected number
of sections to test invocations.
tests/run-sysroot.sh: Avoid testing output that depends on LZMA support
run-sysroot.sh checks whether a backtrace generated by eu-stack contains
symbol names found in binaries under a test sysroot. Two frames in
the backtrace contain symbol names that must be read from .gnu_debugdata.
However this section can only be read if elfutils was built with LZMA
support. If not, then the symbol names will be absent from the
backtrace.
Test the eu-stack output with these 2 frames removed in order to prevent
a test failure when LZMA support is missing.