Raw dependency graph data (JSON)
elfutils
Author: Ludovic HENRY ludovic.henry@qti.qualcomm.com
Date: 2026-09-30
Readiness: blue
Scope: RISC-V (riscv64/linux) support status for elfutils
Audience: Technical leadership, resource allocation strategy
Verification policy: Every claim is cross-referenced to a primary upstream source. Items that could not be verified against a second source are marked [NEEDS VERIFICATION].
1. Project Overview
elfutils is the canonical ELF and DWARF processing library suite on Linux. It provides:
- libelf: low-level ELF file read/write (an alternative to BFD’s libelf)
- libdw: DWARF consumer (CFI, line tables, type info, abbreviations)
- libdwfl: higher-level debugger integration layer (module loading, stack unwinding, live process inspection via ptrace)
- libcpu: per-architecture disassemblers (used by eu-objdump)
- debuginfod: a source/debuginfo distribution server, client library, and CLI
- Command-line tools: eu-strip, eu-readelf, eu-objdump, eu-stack, eu-elflint, eu-nm, eu-addr2line, debuginfod-find
The project is the ELF/DWARF backend for systemtap, perf symbol annotation, bpftrace symbol resolution, GDB’s build-ID index, RPM debuginfo packaging, Fedora/Red Hat’s debuginfod infrastructure, and several kernel profiling tools.
elfutils is hosted on sourceware.org (git, Bugzilla, mailing list, Patchwork), not GitHub; unofficial read-only GitHub mirrors exist (e.g. sailfishos-mirror/elfutils, fedora-riscv/elfutils) but carry no project activity of their own. Since 2023, Sourceware is a member project of the Software Freedom Conservancy, which acts as fiscal sponsor and legal/governance host. Sourceware’s own governance is a Project Leadership Committee (PLC) of 8 people with a rule that no more than 2 members may work for the same employer (members include Mark J. Wielaard, Ian Lance Taylor, Tom Tromey, Jon Turney, Elena Zannoni, Frank Ch. Eigler, Christopher Faylor, Ian Kelling). Day-to-day elfutils maintenance is informal and mailing-list-driven (elfutils-devel@sourceware.org), led in practice by Mark J. Wielaard (Red Hat), who is also a Sourceware PLC member. There is no MAINTAINERS or CODEOWNERS file in the repository (confirmed by a direct clone); only AUTHORS, THANKS, CONTRIBUTING, CONDUCT and SECURITY exist. Patches use a Linux-kernel-style Signed-off-by DCO process; there is no CLA. License is dual GPLv2+/LGPLv3+ for the libraries and backends, GPLv3+ for the command-line utilities.
Corporate affiliations of key RISC-V contributors (no single corporate sponsor, but concentrated in a few companies):
| Contributor | Org | Role |
|---|---|---|
| Andreas Schwab | SUSE | Authored the original RISC-V backend (2018); most prolific RISC-V contributor (10 commits to the riscv backend) |
| Mark Wielaard | Red Hat | Lead maintainer; merged flatten_aggregate and disassembler fixes |
| Jim Wilson | SiFive (at the time) | 3 commits improving riscv64 core-file/return-value support, Dec 2018 |
| William Cohen | Red Hat | LP64/LP64F ABI return-value support, 2021 |
| Ilya Leoshkevich | IBM | lvalue/rvalue reference return support, 2023 |
| Ulrich Drepper | Independent (formerly Red Hat/Google/Akamai) | Added the RISC-V disassembler, 2019 |
| Aaron Merey | Red Hat | Disassembler fixes, const-correctness, CSR out-of-bounds fixes |
For comparison, the later LoongArch backend was contributed by Loongson engineers (Youling Tang, Liwei Ge) following the same “company engineer submits a patch series, gets it merged” pattern used for RISC-V. elfutils has no formal architecture-tiering policy and no RFC/vote/foundation-approval gate for new backends: a new architecture is accepted through ordinary patch review on elfutils-devel.
RISE Project involvement: elfutils is not a RISE member or backed project. A full inventory of all 35 RISE blog posts (May 2024 to Sep 2026, via the site’s sitemap) and the site’s own search contain zero mentions of elfutils, libdw, libelf, or debuginfod. elfutils is also not listed on RISE’s Python wheel_builder page (79 packages tracked, elfutils absent), and a check of the riseproject-dev/system-libraries-wg GitHub issue tracker (18 issues) found zero elfutils references. The only concrete, verifiable touchpoint found is indirect: riseproject-dev/python-wheels PR #2398 (“pystack: Add version 1.7.1”) compiles elfutils from source as a native build dependency of pystack’s nanobind C++ extension (which links against libdw/libelf), built and tested on RISE’s own bare-metal RISC-V Runners (riseproject-dev/riscv-runner, Scaleway EM-RV1 hardware). That PR explicitly notes there is no riscv64 equivalent of the elfutils-aarch64-signal-frame.patch used for AArch64 native-unwind support, i.e. a documented per-architecture native-unwind gap surfaces even in this downstream consumer. This is an incidental build dependency inside RISE’s Python package pipeline, not a funded or tracked RISE project.
2. Port History and Upstreaming Timeline
All RISC-V work is fully upstream. No downstream-only patches were found in Debian, Ubuntu, or Arch Linux RISC-V packaging for elfutils.
| Date | Event | Source |
|---|---|---|
| 2018-04-19 | First RISC-V commit (470aba95790b52d70b6bd78b4c4a481ab791a4c9, “Add support for RISC-V”): initial riscv64 backend module, backends/riscv_init.c. Author: Andreas Schwab (SUSE). |
Governance/history research, direct clone |
| 2018-Q2/Q3 | Initial backend files follow: riscv_reloc.def, riscv_symbol.c, riscv_regs.c, riscv_cfi.c. | elfutils homepage |
| 2018-12 | Jim Wilson (SiFive): 3 commits improving riscv64 core-file and return-value support. | Contributor-history research |
| 2019-09-07 | Ulrich Drepper posts the RISC-V disassembler patch (libcpu/riscv_disasm.c, ~1501 lines, rv32/rv64, compressed+standard encodings, float/system instructions). Reviewed by Mark Wielaard and Jim Wilson (SiFive), who flags the deliberate exclusion of the then-unstable Vector and Bit-Manipulation extensions. |
2019q3 thread |
| 2019-11-27 | elfutils 0.178 released, confirmed shipping the RISC-V disassembler per the release announcement. | Release announcement |
| 2022-10 to 11 | Andreas Schwab / Mark Wielaard: PT_RISCV_ATTRIBUTES / SHT_RISCV_ATTRIBUTES object-attribute support (elf.h sync, elflint zero-p_memsz handling, readelf attribute printing via a new has_gnu_attributes ebl flag). Root RFC thread authored by Mark Wielaard, not Andreas Schwab as earlier summarized; final committed diff text was not independently retrievable (Bugzilla/gitweb blocked by anti-bot protection), so the mechanism is confirmed via mailing-list discussion, not the literal merged patch. |
RFC thread |
| 2022-11-02 | elfutils 0.188 released; SHT_RISCV_ATTRIBUTES confirmed present in src/readelf.c at the 0.188 tag, absent at 0.187. |
Source-diff verification |
| 2021 | William Cohen (Red Hat): LP64/LP64F ABI return-value support. | Contributor-history research |
| 2023-06-17 | Test fix: run-strip-reloc.sh updated for RISC-V ELF relocation sections. |
Commit 127e3831 |
| 2023-06-26 | psABI sync: add IRELATIVE, PLT32, SET_ULEB128, SUB_ULEB128 to riscv_reloc.def. | Commit 485b87a2 |
| 2023 | Ilya Leoshkevich (IBM): lvalue/rvalue reference return support. | Contributor-history research |
| 2024-03-19 | Bugzilla backends/31142 fixed (“riscv pass_by_flattened_arg not implemented”): partial flatten_aggregate implementation in riscv_retval.c for same-base-type struct members. SiFive’s Palmer Dabbelt (RISC-V psABI maintainer) reviewed and flagged that the psABI also allows a struct with one float and one integer member to be split across an FP and a GP register, a case the initial patch did not handle; Mark Wielaard acknowledged the gap and committed to extending the implementation. Author: Mark Wielaard. |
Commit 669b6481, review thread |
| 2024-03-19 | elfutils 0.192 released; commit confirmed present (absent in the 0.191 tag source, present in 0.192). | Tag-diff verification |
| 2024-07-31 | Remove seven obsolete relocations from riscv_reloc.def. Authors: Andreas Schwab / Aaron Merey. | Commit 46c5c98e |
| 2024-12-30 | Fix false elflint _GLOBAL_OFFSET_TABLE_ warning for RISC-V .got.plt layout (lld-linked binaries). Author: Mark Wielaard. First shipped in 0.193. |
Commit a4ece6a5 |
| 2025-05-27 | Bug tools/33006 opened (Xiaoguo Li, CUPL; Xudong Cao, UCAS), against elfutils 0.192: AddressSanitizer-detected stack buffer overflow in riscv_disasm.c:1308 (mnebuf overflow disassembling crafted illegal instructions up to 24 bytes). Mark Wielaard’s first triage closed it NOTABUG, characterizing it as a _FORTIFY_SOURCE-triggered snprintf truncation rather than an exploitable overflow; the reporter reopened and reproduced on current main before the fix. |
Bug report thread |
| 2025-06-03 | Bug 33006 fixed: mnebuf enlarged to 50 chars. Author: Mark Wielaard. First shipped in elfutils 0.194 (confirmed present in the 0.194 tag shortlog; tag dated 2025-10-25). |
Commit 07bd923c |
| 2025-11-24 | Fix const-correctness in riscv_disasm.c (C23 bsearch const-void* prototype mismatch broke clang -Werror builds for 0.191-0.194). Authors: Andreas Schwab / Aaron Merey. First shipped in 0.195. |
Commit 4a5cf8be |
| 2026-05-31 | Fix two out-of-bounds reads in riscv_disasm.c CSR mnemonic lookup arrays (crafted-ELF triggerable). Author: Aaron Merey. Carried in the 0.196 changelog per the August 2026 release notes. |
Commit 003d1c8b |
| 2026 (summer) | elfutils 0.196 released (current upstream release; confirmed via a direct repo clone showing AC_INIT version 0.196 with copyright lines through 2026, and the release announcement). |
0.196 release announcement |
No single master tracking bug for “the riscv64 port” exists; support was added incrementally across release cycles, each reviewed and merged directly to master by Mark Wielaard with no foundation approval gate.
3. Upstream Support Tier
elfutils publishes no formal tiering policy (no document analogous to GCC’s host/target tier list or LLVM’s tier policy). The effective tier is determined in practice by whether a Buildbot CI worker exists for the architecture, whether it is listed as supported on the project homepage, and whether the maintainer accepts patches for it. riscv64 satisfies all three.
riscv64 is explicitly listed as a supported ELF backend architecture on the elfutils homepage. Releases are not formally gated on riscv64 CI passing (there is no documented release-blocking policy for any architecture), but the CI runs on every push regardless.
| Architecture | Buildbot builder present | Worker type | Active |
|---|---|---|---|
| amd64/x86_64 | Yes (Debian, Fedora, CentOS, openSUSE builders) | x86_64 VM | Yes |
| arm64 | Yes (Debian builder) | arm64 VM | Yes |
| riscv64 | Yes (elfutils-ubuntu-riscv, elfutils-try-ubuntu-riscv) |
5 physical StarFive VisionFive V2 boards | Yes |
The project’s stance on riscv32 is explicitly limited: Mark Wielaard has stated that elfutils “accepts 32-bit RISC-V ELF files, but don’t know anything about how it handles calling conventions.” Only riscv64 ABIs (lp64, lp64f, lp64d) are implemented in riscv_retval.c and riscv_initreg.c. This report covers riscv64 only.
4. Technical Architecture and RISC-V-Specific Subsystems
elfutils is a pure C project: no JIT, no SIMD dispatch, no cryptographic implementation, and no assembly code anywhere in the source tree, for any architecture (this is a general project characteristic, not a riscv64-specific gap). Architecture-specific code lives in backends/ (ELF/DWARF processing) and libcpu/ (disassembly), using an <arch>_*.c filename-prefix convention rather than an arch/riscv/ subdirectory.
RISC-V backend files, independently reviewed against current upstream source (direct clone of sourceware.org/git/elfutils.git):
| File | Purpose | Quality | Notes |
|---|---|---|---|
riscv_reloc.def |
Relocation type table | Full | Complete, including TLS and ADD/SUB relaxation relocations |
riscv_retval.c (413 lines) |
DWARF return-value location for lp64/lp64f/lp64d ABIs | Full for simple cases, partial overall | Correctly implements GPR/FPR passing, struct “flattening” for same-base-type members, pass-by-reference for large aggregates, and complex floats; mixed int+float structs, nested structs, and unions remain unimplemented (acknowledged partial in the 2024-03-19 commit) |
riscv_cfi.c |
DWARF CFI ABI defaults | Full | Correct CFA=sp, ra=x1, all callee-saved GPRs/FPRs (s0-s11, fs0-fs11) marked same-value |
riscv_regs.c |
DWARF register name/number table | Full | All 64 int+FP register names (x0-x31, f0-f31 with ABI aliases) |
riscv_symbol.c |
Special symbol/ELF metadata validation, object attributes | Full, with one known bug | PT/SHT_RISCV_ATTRIBUTES, DT_RISCV_VARIANT_CC, _GLOBAL_OFFSET_TABLE_/__global_pointer$ handling correctly implemented; see SHT_RISCV_ATTRIBUTES stripping bug in Section 6/11 |
riscv_corenote.c / riscv64_corenote.c |
Core-dump note parsing | Partial | Only PRSTATUS (integer registers + pc) is defined; unlike aarch64_corenote.c, x86_64_corenote.c, and arm_corenote.c, there is no NT_FPREGSET item set at all |
riscv_initreg.c |
Live register read via ptrace for debugger integration | Partial | Fetches x0-x31 and PC via PTRACE_GETREGSET/NT_PRSTATUS correctly; source explicitly states “FP registers not yet supported,” no NT_FPREGSET fetch |
libcpu/riscv_disasm.c (1504 lines) |
Instruction disassembler | Partial | Hand-decodes RV64 base integer, compressed 16-bit (C), multiply/divide (M), atomics (A), float/double (F/D), CSR and privileged instructions - this is real bit-level decoding, not a wrapper. No decode for the V (vector) or B (bitmanip) extensions (falls through to raw hex); several // TODO translate address sites mean branch/jump targets are not symbolized |
(none: no riscv_unwind.c) |
Frame-pointer fallback stack unwinding | Missing | backends/Makefile.am lists no riscv_unwind.c, while x86_64, aarch64, s390, ppc64, and loongarch each ship one; riscv64 has no fallback when .eh_frame/CFI is unavailable and depends entirely on CFI-based unwinding |
(none: no riscv_auxv.c) |
Auxv name table | Missing, but not riscv-specific | Also absent on loongarch, csky, mips, hexagon, bpf - a general gap across newer ports rather than a riscv64 deficiency |
Code-coverage figures from the 0.196 LCOV report (single source, [NEEDS VERIFICATION]): riscv_init.c 91.7%, riscv_regs.c 97.1%, riscv_retval.c 55.2%, riscv_symbol.c 54.5%, riscv_disasm.c 82%, consistent with active CI exercising the backend and with riscv_retval.c’s known partial coverage of aggregate-return edge cases.
Comparison table:
| Subsystem | amd64 | arm64 | riscv64 |
|---|---|---|---|
| Register table | Full | Full | Full |
| CFI ABI defaults | Full | Full | Full |
| Core note parsing (integer) | Full | Full | Full |
| Core note parsing (FP registers) | Full | Full | Missing (no NT_FPREGSET) |
| Relocation table | Full | Full | Full (psABI-current) |
| Special symbol / object-attribute validation | Full | Full | Full, one known bug (SHT_RISCV_ATTRIBUTES stripping) |
| Return-value location (simple aggregates) | Full | Full | Full |
| Return-value location (mixed/nested aggregates) | Full | Full | Partial (unimplemented) |
| Live register read (integer, ptrace) | Full | Full | Full |
| Live register read (FPU, ptrace) | Full | Full | Missing |
| Disassembler (base ISA) | Full | Full | Full |
| Disassembler (vector/bitmanip extensions) | Full (AVX/SSE etc.) | Full (NEON/SVE) | Missing (V, B) |
| Frame-pointer fallback unwind | Present | Present | Missing |
5. Build System, Cross-Compilation, and Toolchain
elfutils uses GNU Autotools (autoconf 2.69+, automake 1.11+). There is no CMake build anywhere in the tree, and no Dockerfile exists in the elfutils repository (confirmed via a full root-tree listing: backends, config, debuginfod, doc, lib, libasm, libcpu, libdw, libdwelf, libdwfl, libdwfl_stacktrace, libebl, libelf, m4, po, src, tests, .forgejo/workflows, plus top-level README/NEWS/configure.ac). CI (.forgejo/workflows/check-fedora.yaml, check-debian.yaml) runs natively on x86_64 Sourceware runners, with no cross-compilation, containers, or per-architecture matrix.
No QEMU usage exists anywhere in the elfutils source tree or CI (a text search for “qemu” across the tree returns zero hits). riscv64 test coverage (tests/testfile-riscv64-*, run-disasm-riscv64.sh, etc.) uses pre-built binary fixtures checked into tests/; a comment in run-readelf-mixed-corenote.sh confirms the riscv64 core-dump fixture was generated natively “on a riscv64 machine,” not via emulation. QEMU only becomes relevant for a third party wanting to run the riscv64 test suite under emulation on a non-riscv64 build host (via qemu-riscv64-static + binfmt_misc), which is why it appears as an optional test-dependency in the tracked dependency list (Section 9) even though upstream’s own CI does not use it.
Toolchain requirements (from configure.ac):
| Requirement | Minimum | Reason |
|---|---|---|
| C compiler | C11 | AC_PROG_CC followed by a hard error if ac_cv_prog_cc_c11 is absent |
| stdatomic.h | GCC 4.9+ / equivalent | Hard error if absent |
| Autoconf | 2.69 | AC_PREREQ(2.69) |
| Automake | 1.11 | AM_INIT_AUTOMAKE([gnits 1.11 ...]) |
| gettext | 0.19.6 | AM_GNU_GETTEXT_VERSION |
| C++ (optional) | C++20 preferred, falls back to C++11 | AX_CXX_COMPILE_STDCXX(20, noext, optional), then (11, noext, optional) |
C++11 is sufficient to build the debuginfod client/server if json-c, libarchive and sqlite3 are present. C++20 (plus <format> support, practically GCC 10+ or Clang 10+) is required only for eu-stackprof.
Exact build commands, none riscv64-specific (from README and CI config):
git clone git://sourceware.org/git/elfutils.git
autoreconf -i -f && ./configure --enable-maintainer-mode && make && make check
CI’s actual sequence (check-fedora.yaml): autoreconf -f -i, ./configure --enable-maintainer-mode, make -j$(nproc), make check -j$(nproc), make rpmbuild. None of these differ for riscv64; riscv backend code is unconditionally compiled into every build alongside all other architectures, with no per-architecture configure switch.
Cross-compiling to riscv64 is not documented by elfutils itself (no mention in README, configure.ac, or CI). The standard autotools approach, inferred rather than upstream-documented:
./configure --host=riscv64-linux-gnu \
CC=riscv64-linux-gnu-gcc CXX=riscv64-linux-gnu-g++ \
--build=$(./config.guess)
Two distinct riscv64-specific feature gates exist in configure.ac:
- eu-stacktrace: gated on the presence of an architecture-specific kernel perf_regs header (
_ASM_X86_PERF_REGS_H/_ASM_ARM_PERF_REGS_H/_ASM_ARM64_PERF_REGS_H). No riscv64 equivalent exists, so--enable-stacktracefails to configure on riscv64. - eu-stackprof: gated by an explicit
case $host_cpu in i?86|x86_64|amd64|arm*|aarch64*) stackprof_arch_supported=yes ;; *) stackprof_arch_supported=no ;; esac- riscv/riscv64 is not in that list. Passing--enable-stackprof=yesexplicitly on riscv64 hard-fails configure (AC_MSG_ERROR([Unable to build eu-stackprof, unsupported host cpu or missing linux <perf_event.h> with build_id or C++20 with <format.h>])); leaving the default (auto) silently disables it.
Musl riscv64 caveat: argp, fts, and obstack are absent from musl libc; configure fails unless libargp, libfts, and libobstack are installed and discovered via AC_SEARCH_LIBS.
Known, now-fixed build issue: elfutils 0.191-0.194 failed to build under clang with -Werror=incompatible-pointer-types-discards-qualifiers in libcpu/riscv_disasm.c (a non-const struct known_csrs *found receiving bsearch()’s const void * return per C11/C23; GCC was permissive, clang rejected it). Fixed in 0.195 (commit 4a5cf8be, 2025-11-24). Distributions still vendoring 0.191-0.194 and building with clang need either the patch or -Wno-error=incompatible-pointer-types-discards-qualifiers; Ubuntu 26.04 resolute’s 0.194-4 package falls in this affected range (see Section 8).
6. Feature Coverage and Gap Analysis vs arm64 and amd64
Functional gaps:
- eu-stacktrace disabled: permanently gated off pending a kernel
_ASM_RISCV_PERF_REGS_H-equivalent header; see Section 5. - FPU live register read missing:
riscv_initreg.cdoes not fetch FP registers via ptrace, sodwfl_thread_getframes()cannot observe floating-point state when unwinding a live riscv64 process. Affects FP-heavy code paths in perf/bpftrace/systemtap symbol resolution. - Complex heterogeneous struct return-value location unimplemented: mixed int+float structs, nested structs, and unions give incorrect
dwfl_module_return_value_locationresults on riscv64; SiFive’s Palmer Dabbelt specifically flagged the mixed-type case during review of the 2024-03-19 fix. - eu-strip incorrectly strips
SHT_RISCV_ATTRIBUTES:eu-strip --remove-commentremoves the.riscv.attributessection (typeSHT_RISCV_ATTRIBUTES= 0x70000003), destroying RISC-V ISA/ABI metadata. Tracked only downstream in openeuler-riscv/oerv-team #2074; no upstream elfutils bug has been filed. - No frame-pointer fallback unwinder:
riscv_unwind.cdoes not exist for riscv64 (unlike x86_64, aarch64, s390, ppc64, loongarch), so unwinding fails entirely if CFI/.eh_framedata is missing or corrupt.
Feature matrix:
| Feature | amd64 | arm64 | riscv64 |
|---|---|---|---|
| ELF read/write/strip | Full | Full | Full |
| DWARF consumer (libdw) | Full | Full | Full |
| Core file parsing (integer regs) | Full | Full | Full |
| Core file parsing (FP regs) | Full | Full | Missing |
| Return value location (simple) | Full | Full | Full |
| Return value location (complex aggregates) | Full | Full | Partial |
| Live register read (integer) | Full | Full | Full |
| Live register read (FPU) | Full | Full | Missing |
| CFI-based stack unwind (eu-stack) | Full | Full | Full |
| Frame-pointer fallback unwind | Present | Present | Missing |
| eu-stacktrace | Full | Partial | Not available |
| eu-stackprof | Full | Full | Not available |
| Disassembly (base ISA) | Full | Full | Full |
| Disassembly (vector/bitmanip extensions) | Full | Full | Missing |
| eu-strip –remove-comment correctness | Correct | Correct | Bug (strips SHT_RISCV_ATTRIBUTES) |
| elflint GOT validation | Correct | Correct | Correct (fixed 2024-12-30) |
| clang buildability | Full | Full | Requires 0.195+ |
Security hardening: no riscv64-specific gaps remain open. The disassembler stack buffer overflow (Bug 33006) and the CSR mnemonic out-of-bounds reads were riscv64-specific security-relevant bugs, both fixed (0.194 and 0.196 respectively). Two general (non-riscv64) memory-safety CVEs in elfutils 0.192, CVE-2025-1352 (__libdw_thread_tail/libdw_alloc.c) and CVE-2025-1376 (elf_strptr/libelf), affect all architectures and are not RISC-V-specific.
7. CI/CD Infrastructure
riscv64 CI exists and is active, independently re-verified this session by cloning the canonical CI config repository (https://sourceware.org/git/builder.git) and reading builder/master.cfg (7083 lines) directly at commit 2148972be9406234f13a8880acfb3d05a70971f6 (dated 2026-09-26, four days before this report):
- Workers (lines 93-136): 5 physical riscv64 workers,
starfive-riscvandstarfive-1throughstarfive-4, each a StarFive VisionFive V2 board (8 GB RAM, 4 cores, donated by StarFive), grouped asstarfive_workers. Live and wired into the config, not dead code. - Builders (lines 2822-2836):
elfutils-ubuntu-riscv(Buildbot builder id 274) andelfutils-try-ubuntu-riscv, both running onstarfive_workers, tagged["elfutils","ubuntu","riscv"]/["elfutils-try","ubuntu","riscv"]. - Schedulers (lines 718-765):
elfutils_scheduler(SingleBranchScheduler, branchmain) listselfutils-ubuntu-riscv;elfutils_try_scheduler(AnyBranchScheduler, try-branch regex) listselfutils-try-ubuntu-riscv. Every push to elfutils’mainbranch and every try-branch push triggers a native riscv64 build+test. - Build factory (
elfutils_factory, lines 2532-2541): git checkout,autoreconf,configure,make,make check(full test suite), upload of.trs/.logresults to Bunsen, thenmake distclean- run natively on the StarFive hardware, not emulated. - Corroboration: mailing-list buildbot notifications (e.g.
elfutils-devel@sourceware.orgmsg09439) show live build activity fromelfutils-ubuntu-riscvon workerstarfive-2; the 0.196 LCOV coverage report includesbackends/riscv_cfi.c.gcov.html, indicating riscv-specific code is actively exercised by this CI.
| Builder | Architecture | Worker | Status |
|---|---|---|---|
elfutils-ubuntu-riscv (id 274) |
riscv64 (native) | StarFive VisionFive V2 physical boards | Active, config-verified |
elfutils-try-ubuntu-riscv |
riscv64 (native) | Same StarFive boards | Active, config-verified |
elfutils-debian-riscv / elfutils-try-debian-riscv |
riscv64 | Unclear | The Buildbot REST API lists builder ids 271/272 under these names, but neither appears in the current master.cfg text; likely a stale API entry or a builder defined outside this file. A separate claim, that this builder logged only 2 builds (both 2023 failures) and is now offline, could not be corroborated this session and is carried here only as [NEEDS VERIFICATION] |
elfutils-debian-amd64 / elfutils-fedora-x86_64 |
amd64/x86_64 | VM | Active |
elfutils-debian-arm64 |
arm64 | VM | Active |
RISE runners: elfutils’ own riscv64 CI does not run on RISE infrastructure; it runs on Sourceware’s own StarFive hardware. RISE’s RISC-V Runners (bare-metal Scaleway EM-RV1, riseproject-dev/riscv-runner) are used only downstream, to build and test the pystack Python wheel that compiles elfutils from source as a dependency (Section 1).
8. Distribution and Release Status
No upstream-published riscv64 (or any architecture-specific) binaries exist. elfutils’ own releases are source tarballs only; sourceware.org/git/elfutils.git’s web UI is behind an anti-bot (Anubis) wall that blocked direct verification of the release page, but this is consistent across every source checked and matches the project’s Autotools-only build model (Section 5). This is the central fact behind the project’s readiness color: build and test both pass natively, but the consumable riscv64 artifact always comes from a downstream distro rebuilding upstream source, not from elfutils itself.
Current upstream version: 0.196, confirmed via a direct repository clone (AC_INIT version 0.196, copyright lines through 2026) and the 0.196 release announcement.
Binary package availability (verified via live HTTP fetches against each archive):
| Distribution | Version (riscv64) | Status | Notes |
|---|---|---|---|
| Ubuntu 26.04 “resolute” | 0.194-4 [ports] | Confirmed present, HTTP 200 | packages.ubuntu.com live page shows architecture riscv64 explicitly, package size 544.8 kB, installed size 2,959.0 kB, real dependency chain to riscv64 libdw1t64/libelf1t64. Tagged [ports] (built via Ubuntu’s ports infrastructure rather than the primary archive) but is a real, signed, installable binary, not a placeholder. Lags upstream: missing both the 0.195 clang const-correctness fix and the 0.196 CSR out-of-bounds-read fix |
| Debian sid/testing | riscv64 build present | Confirmed present | Unmodified upstream source, no riscv64-specific packaging patches found |
| Arch Linux RISC-V | elfutils-0.196-1-riscv64.pkg.tar.zst |
Confirmed present, HTTP 200 | archriscv.felixc.at/repo/core/ live directory listing: signed package, 700,423 bytes, dated 2026-08-19 - the most current elfutils package of any distribution checked, matching current upstream 0.196 |
| Ubuntu 24.04 LTS | 0.190-1.1build4 (carried over, not independently re-checked this session) | Available in ports pocket | [NEEDS VERIFICATION]: not re-verified in this research pass |
| Fedora | Data not available: Fedora riscv64 build status was not retrieved in this research session | - | - |
| PyPI | N/A | No package named elfutils exists on PyPI for any architecture (pypi.org/pypi/elfutils/json returns HTTP 404) |
elfutils is a C library/toolset, not a Python package; this is expected, not a gap |
| RISE GitLab wheel mirror | N/A | 302-redirects to the same PyPI 404 | Consistent with elfutils having no PyPI presence |
| OCI/container images | Data not available: no search was performed for official elfutils container images | - | - |
To get a working riscv64 binary today: apt install elfutils on Ubuntu 26.04 or Debian sid/testing (0.194-4, missing two post-0.194 correctness/security fixes), or pacman -S elfutils on Arch Linux RISC-V (0.196-1, fully current). There is no path to an upstream-published riscv64 binary; building from source is the only way to get exactly-current upstream on riscv64.
9. Dependencies
All tracked elfutils build/runtime dependencies have riscv64 binaries present in the live Ubuntu 26.04 “resolute” archive, and elfutils itself (0.194-4) is built and released for riscv64 in that same suite, so no dependency currently blocks elfutils’ riscv64 availability on Ubuntu. Six of the twelve tracked dependencies already have their own dedicated RISC-V readiness reports in this repository; three have no report yet.
| Name | Relation | Criticality | Role in elfutils | riscv64 status (Ubuntu 26.04 resolute) | Notes |
|---|---|---|---|---|---|
| glibc | runtime-dependency | critical | C runtime; also provides argp (CLI argument parsing) natively |
Fully supported; tier-1 platform since glibc 2.27 | musl systems need separate libargp/libfts/libobstack |
| GCC | build-dependency | critical | Build toolchain; C11 mandatory, C++20 optional for eu-stackprof | GCC 15.3.0 available in Debian sid | None found |
| zlib | runtime-dependency | critical | DEFLATE compression of .zdebug/.zlib sections; configure fails hard without it |
zlib1g 1:1.3.dfsg+really1.3.1-1ubuntu3, builds cleanly |
None found. See status report at project-reports/zlib.md (rated blue) |
| bzip2 | runtime-dependency | optional | .bz2-compressed debug sections |
libbz2-1.0 1.0.8-6build2, builds cleanly |
Distro-build verified only, not full upstream riscv64 CI. See status report at project-reports/bzip2.md (rated yellow) |
| xz | runtime-dependency | optional | .xz-compressed debug sections, increasingly the toolchain default |
liblzma5 5.8.3-1, builds cleanly; upstream has a merged RISC-V BCJ filter |
See status report at project-reports/xz.md (rated yellow despite the native filter - see that report for nuance) |
| zstd | runtime-dependency | optional | .zstd-compressed debug sections; also used internally by debuginfod caching |
libzstd1 1.5.7+dfsg-3, builds cleanly, good coverage |
None found. See status report at project-reports/zstd.md (rated blue) |
| libcurl | runtime-dependency | optional | debuginfod federation (fetching from upstream debuginfod servers) and debuginfod-client | libcurl4t64 8.18.0-1ubuntu2, builds cleanly |
See status report at project-reports/libcurl.md (rated yellow, TLS-backend/optional-dep nuances) |
| libmicrohttpd | runtime-dependency | optional | debuginfod’s embedded HTTP server (REST/webapi) | libmicrohttpd12t64/libmicrohttpd-dev 1.0.1-2, builds cleanly |
In RISC-V Ecosystem scope but no status report generated yet |
| SQLite | runtime-dependency | optional | debuginfod’s index database backend | libsqlite3-0 3.46.1-9, builds cleanly |
See status report at project-reports/sqlite.md (rated yellow) |
| libarchive | runtime-dependency | optional | debuginfod source-archive indexing (reads rpm/deb/tar/cpio to extract source+debug info) | libarchive13t64 3.8.5-1ubuntu2, builds cleanly |
In RISC-V Ecosystem scope but no status report generated yet |
| json-c | runtime-dependency | optional | debuginfod metadata/webapi JSON handling and IMA verification | libjson-c5 0.18+ds-3, builds cleanly |
In RISC-V Ecosystem scope but no status report generated yet |
| QEMU | test-dependency | optional | Not used by elfutils’ own CI (tests natively on real riscv64 hardware) or in-tree (zero references found); relevant only to a third party cross-compiling elfutils and wanting to run make check under qemu-riscv64-static/binfmt_misc on a non-riscv64 host |
N/A (not a build/runtime input of the shipped package) | None found |
Additional indirect/transitive dependencies identified during research:
| Name | Role | riscv64 status |
|---|---|---|
| OpenSSL | TLS backend used transitively via libcurl for debuginfod client connections | Well-supported on riscv64; CI passes |
| libstdc++ | C++ demangler support (unless --disable-demangler) |
Present on riscv64 across major distros |
None of elfutils’ dependencies has a JIT, SIMD, or cryptographic implementation that creates riscv64-specific correctness risk: zlib, bzip2, xz, and zstd have optional SIMD-accelerated paths but degrade gracefully to scalar C on riscv64, and no riscv64 correctness issue in any of their scalar fallbacks was found.
11. Known Bugs and Active Issues
Active issues:
| Reference | Title | Status | Severity | Notes |
|---|---|---|---|---|
| openeuler-riscv/oerv-team #2074 | eu-strip --remove-comment incorrectly strips the SHT_RISCV_ATTRIBUTES (.riscv.attributes) section |
Open, tracked downstream only | High | Destroys RISC-V ISA/ABI metadata; no upstream elfutils Bugzilla entry exists yet |
| No upstream bug ID | riscv_retval.c: flatten_aggregate handles only same-base-type struct members |
Open, acknowledged partial in the 2024-03-19 commit; mixed float+int gap specifically flagged by SiFive’s Palmer Dabbelt in review | Medium | Mixed int+float structs, nested structs, unions give incorrect dwfl_module_return_value_location results |
| No upstream bug ID | riscv_initreg.c: FPU live registers not read via ptrace |
Open, TODO comment in source (“FP registers not yet supported”) | Medium | dwfl_thread_getframes() cannot see FP register state for live riscv64 processes |
| Architectural gap, not a bug | eu-stacktrace hard-disabled on riscv64 at configure time (no perf_regs kernel header) |
Permanent until a kernel ABI addition | - | See Section 5 |
| Architectural gap, not a bug | No riscv_unwind.c frame-pointer fallback unwinder |
Open | Medium | Unwinding fails entirely if .eh_frame/CFI data is unavailable |
| No upstream bug ID | libcpu/riscv_disasm.c has no decode for V (vector) or B (bitmanip) extensions |
Open | Low-Medium | Such instructions dump as raw hex in eu-objdump |
Upstream Bugzilla itself (bugs.sourceware.org) could not be queried directly in this or the prior research pass (blocked by Anubis anti-bot protection), so additional open riscv-tagged bugs may exist that were not surfaced by mailing-list/mirror search.
Resolved issues:
| ID | Title | Fixed in | Commit | Severity |
|---|---|---|---|---|
| Bug 33006 | Stack buffer overflow in riscv_disasm (mnebuf too small for wide illegal instructions) |
0.194 (2025-06-03) | 07bd923c | High |
| Bug 31142 | riscv: pass_by_flattened_arg not implemented |
0.192 (2024-03-19) | 669b6481 | Medium |
| No Bugzilla ID | Two out-of-bounds reads in riscv_disasm.c CSR mnemonic lookup arrays |
0.196 (2026-05-31) | 003d1c8b | High (security-relevant, crafted-ELF triggerable) |
| No Bugzilla ID | riscv_disasm.c const-correctness (clang -Werror/C23 bsearch prototype mismatch), broke clang builds for 0.191-0.194 |
0.195 (2025-11-24) | 4a5cf8be | Medium |
| No Bugzilla ID | elflint false _GLOBAL_OFFSET_TABLE_ warning for RISC-V .got.plt layout (lld-linked binaries) |
0.193 (2024-12-30) | a4ece6a5 | Low |
Not riscv-specific, for completeness: CVE-2025-1352 and CVE-2025-1376 in elfutils 0.192 are general memory-safety issues affecting all architectures.
Performance data: Data not available. No riscv64-vs-arm64/amd64 performance comparison for elfutils tools (eu-readelf, eu-strip, libdw parsing, debuginfod indexing) was found in any public source, including Phoronix’s extensive RISC-V hardware benchmark suite (SpacemiT K3/RVV, SiFive HiFive Unmatched, Scaleway EM-RV1, Ubuntu RISC-V evolution), which covers general CPU/SoC workloads but not ELF/DWARF tooling specifically. This is consistent with elfutils being I/O-bound (ELF/DWARF file parsing) with no hot, SIMD-acceleratable inner loops, making dedicated performance benchmarking low-value.
12. Objections and Upstream Blockers
No blockers exist for riscv64 in elfutils. The port is fully upstream, CI is active and passing on dedicated hardware, distributions ship packages built from unmodified upstream source, and the maintainer (Mark Wielaard) has a track record of reviewing and merging RISC-V patches within days to weeks (both tracked Bugzilla bugs, 31142 and 33006, were resolved on this timescale).
Open gaps that require upstream contribution, not blocked by policy:
- SHT_RISCV_ATTRIBUTES stripping bug: needs an upstream Bugzilla report (none filed as of this writing; tracked only in openeuler-riscv/oerv-team #2074) and a one-line fix in eu-strip to preserve sections of type SHT_RISCV_ATTRIBUTES.
- FPU live register read: requires implementing
PTRACE_GETREGSET/NT_FPREGSETsupport inriscv_initreg.c(kernel structstruct __riscv_d_ext_state), analogous to the existing arm64 implementation. - Complex aggregate return-value location: requires completing
flatten_aggregateinriscv_retval.cfor heterogeneous structs per the LP64D psABI floating-point calling convention, including the mixed int+float case Palmer Dabbelt (SiFive) specifically flagged in review. - Disassembler extension coverage: table-driven addition of Zba/Zbb/Zbc/Zbs (bitmanip) and V (vector) decode to
riscv_disasm.c; mechanical but volume-intensive. - Frame-pointer fallback unwinder: a new
riscv_unwind.c, modeled on the existing x86_64/aarch64/s390/ppc64/loongarch implementations. elfutils-debian-riscv/elfutils-try-debian-riscvbuilder status is unclear: these builder ids appear in the Buildbot REST API but not in the currentmaster.cfg; whether a Debian-based riscv64 builder is actually running today could not be confirmed this session and would need direct confirmation with the Sourceware infrastructure team before being scoped as investment.
Organizational stance: Mark Wielaard has accepted every RISC-V patch submitted with tests and mailing-list review to date; there is no stated objection to further RISC-V work.
13. Readiness Assessment
- Color: blue (N/A - blue has no sub-type; build = yes, test = yes, upstream-published riscv64 artifact = no)
- Release provider: distro
elfutils has active, passing native riscv64 CI: the sourceware.org Buildbot builder “elfutils-ubuntu-riscv” runs full autoreconf/configure/make/make check on 5 dedicated physical StarFive VisionFive V2 boards for every main-branch and try-branch push (builder.sourceware.org/buildbot/#/builders/274), so build = yes and test = yes. However elfutils itself only ships source tarballs; it does not publish riscv64 (or any architecture-specific) binaries directly, so the consumable riscv64 package comes from downstream distros: Ubuntu 26.04 “resolute” ships elfutils 0.194-4 for riscv64 (packages.ubuntu.com) and Debian sid/testing also carries a riscv64 build, both from unmodified upstream source with no riscv64-specific packaging patches found. Per the release-provider rule, this yields blue (build yes, test yes, upstream-published artifact no) rather than green, with the release provided by the distro, not upstream.
Pending work that could change the grade (non-blocking correctness gaps that do not affect the color but are worth tracking): eu-strip --remove-comment incorrectly strips the SHT_RISCV_ATTRIBUTES section (tracked only in a downstream GitHub issue, openeuler-riscv/oerv-team #2074, not yet filed upstream); riscv_retval.c’s flatten_aggregate handles only simple homogeneous-type struct returns (mixed int+float, nested structs, unions unimplemented, acknowledged partial in the 2024-03-19 commit); riscv_initreg.c does not read FPU live registers via ptrace; eu-stacktrace is permanently disabled on riscv64 pending a kernel perf_regs header. There is no RISE project funding or involvement in elfutils specifically; all RISC-V work to date is organic upstream contribution from SUSE, Red Hat, and SiFive engineers, with a responsive maintainer (two riscv64 Bugzilla bugs filed and fixed within days to weeks in 2024-2025).
14. Investment Analysis
RISE has no prior investment in elfutils. All existing RISC-V work was contributed organically by SUSE, Red Hat, SiFive, and IBM engineers; the CI hardware (StarFive boards) was donated independently of RISE. The only RISE touchpoint found is incidental: elfutils is compiled from source as a native build dependency of pystack in riseproject-dev/python-wheels PR #2398, using RISE’s RISC-V Runners as the execution environment, not as a funded improvement to elfutils itself.
14.1 Functional Enablement
eu-strip SHT_RISCV_ATTRIBUTES fix: a one-line fix in eu-strip’s --remove-comment path, adding a check for sh_type == SHT_RISCV_ATTRIBUTES. An upstream bug report must be filed first (none exists yet).
FPU live register read (riscv_initreg.c): add PTRACE_GETREGSET/NT_FPREGSET support (kernel struct struct __riscv_d_ext_state, 32 FP registers + fcsr), analogous to the existing arm64 peer implementation. Requires a riscv64 Linux machine for testing.
Complete flatten_aggregate in riscv_retval.c: handle heterogeneous aggregates per LP64D psABI section 2.14, including the mixed int+float split-register case SiFive flagged in review. New test binaries are needed for each aggregate pattern.
Frame-pointer fallback unwinder: a new riscv_unwind.c, modeled on the x86_64/aarch64/s390/ppc64/loongarch implementations already in the tree.
14.2 Performance Optimization
Data not available: no benchmark data comparing elfutils performance on riscv64 vs arm64 or amd64 was found in any public source. elfutils is primarily I/O-bound with no hot SIMD-acceleratable inner loops. Performance investment is low priority.
14.3 CI/CD Infrastructure
Confirm status of elfutils-debian-riscv/elfutils-try-debian-riscv builders: these builder ids appear in the Buildbot REST API but not in the current master.cfg; direct confirmation with the Sourceware infrastructure team is needed before this can be scoped as a restoration effort or ruled out entirely. The active elfutils-ubuntu-riscv builder already provides solid native riscv64 coverage; a second, Debian-based builder would primarily catch packaging/dependency differences rather than close a functional gap.
14.4 Ecosystem Enablement
Not applicable: elfutils has no dependent Python/npm/Maven/OCI package ecosystem of its own; it is a C library consumed via system package managers. The one indirect ecosystem touchpoint found, elfutils being compiled from source inside pystack’s riscv64 wheel build (riseproject-dev/python-wheels PR #2398), is a single downstream consumer’s build dependency, not a package ecosystem requiring separate riscv64 enablement work on elfutils’ side.
14.5 Summary Table
| Area | Work Item | Effort (person-weeks) | Owner | Priority |
|---|---|---|---|---|
| Functional | File upstream bug and fix eu-strip SHT_RISCV_ATTRIBUTES stripping | 1 | Chip company contributor | Critical |
| Functional | Implement FPU live register read in riscv_initreg.c (NT_FPREGSET via ptrace) | 2 | Chip company contributor | High |
| Functional | Complete flatten_aggregate for heterogeneous aggregates in riscv_retval.c | 3 | Chip company contributor | High |
| Functional | Implement riscv_unwind.c frame-pointer fallback unwinder | 2 | Chip company contributor | Medium |
| Functional | Disassembler: add Zba/Zbb/Zbc/Zbs (bitmanip) decode to riscv_disasm.c | 3 | Chip company contributor | Medium |
| Functional | Disassembler: add V (vector) extension decode to riscv_disasm.c | 5 | Chip company contributor | Medium |
| Functional | Disassembler: implement symcb address resolution for branch targets (TODO in source) | 2 | Chip company contributor | Low |
| CI/CD | Confirm and, if needed, restore a Debian-based riscv64 Buildbot builder | 1 | Chip company contributor + Sourceware infra team | Medium |
Total estimated effort: 19 person-weeks across all items. The three Critical/High functional items (SHT_RISCV_ATTRIBUTES fix, FPU live register read, complex aggregate return values) total 6 person-weeks and resolve the most user-visible correctness gaps in DWARF/debugger tooling on riscv64.
15. References
- elfutils project homepage
- elfutils git repository
- Buildbot: elfutils-ubuntu-riscv builder (id 274)
- 2019q3 thread: RISC-V disassembler
- elfutils 0.178 release announcement
- PT_RISCV_ATTRIBUTES RFC thread
- Commit 127e3831: tests: use readelf -N -w in run-strip-reloc.sh (2023-06-17)
- Commit 485b87a2: backends: update list of RISC-V relocations (2023-06-26)
- Commit 669b6481: riscv: partial implementation of flatten_aggregate (2024-03-19)
- Bug 31142 review thread (Palmer Dabbelt)
- Commit 46c5c98e: backends/riscv: remove unused relocations (2024-07-31)
- Commit a4ece6a5: backends: check_special_symbol GLOBAL_OFFSET_TABLE (2024-12-30)
- Bug tools/33006 initial report
- Bug tools/33006 reopen
- Commit 07bd923c: libcpu: riscv_disasm use 50 char mnebuf (2025-06-03)
- Commit 4a5cf8be: fix const-correctness issues in riscv_disasm.c (2025-11-24)
- Commit 003d1c8b: riscv_disasm.c: fix out-of-bounds reads (2026-05-31)
- elfutils 0.196 released announcement
- elfutils Bug 31142: riscv pass_by_flattened_arg not implemented
- elfutils Bug 33006: stack buffer overflow in riscv_disasm
- openeuler-riscv/oerv-team issue #2074: eu-strip –remove-comment incorrectly strips .riscv.attributes
- Ubuntu 26.04 resolute elfutils package search
- Ubuntu 24.04 elfutils package (noble ports)
- Arch Linux RISC-V core repository listing
- sourceware.org Buildbot API: elfutils builders
- riseproject-dev/python-wheels PR #2398: pystack: Add version 1.7.1
- RISE Project blog