[DTrace-devel] [PATCH 2/2] debian: add distribution specific patches
Kris Van Hees
kris.van.hees at oracle.com
Sat Aug 29 13:52:30 UTC 2026
Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
dists/debian/changelog | 8 +
dists/debian/control | 8 +-
.../patches/debian-static-linking.patch | 248 ++++++++++++++++++
.../debian-surpress-utsname-in-note.patch | 15 ++
dists/debian/patches/series | 1 +
5 files changed, 276 insertions(+), 4 deletions(-)
create mode 100644 dists/debian/patches/debian-static-linking.patch
create mode 100644 dists/debian/patches/debian-surpress-utsname-in-note.patch
diff --git a/dists/debian/changelog b/dists/debian/changelog
index b176f3cd..dfb05e2b 100644
--- a/dists/debian/changelog
+++ b/dists/debian/changelog
@@ -1,3 +1,11 @@
+dtrace (2.0.7-2) unstable; urgency=medium
+
+ * Apply fixes in control file. (Closes: #1140165)
+ * Use static linking for libbinutils. (Closes: #1140166, #1140168)
+ * Surpress adding utsname info in USDT ELF notes. (Closes: #1140167)
+
+ -- Kris Van Hees <kvanhees at gmail.com> Tue, 16 Jun 2026 19:46:35 -0400
+
dtrace (2.0.7-1) unstable; urgency=medium
* Fix CVE-2026-21996: divide-by-zero if section header data corruped.
diff --git a/dists/debian/control b/dists/debian/control
index 7560dc9a..0861ed17 100644
--- a/dists/debian/control
+++ b/dists/debian/control
@@ -5,7 +5,8 @@ Maintainer: Kris Van Hees <kvanhees at gmail.com>
Build-Depends: debhelper-compat (= 13),
bison, flex, gawk, gcc-bpf (>= 14.2) , valgrind, binutils-dev (>= 2.44),
login.defs, libbpf-dev (>= 1.5), libc-dev (>= 2.34), libelf-dev, libfuse3-dev,
- libpcap-dev, libpfm4-dev, libsystemd-dev, libz-dev
+ libpcap-dev, libpfm4-dev, libsystemd-dev, libz-dev, libsframe-dev,
+ libiberty-dev
Standards-Version: 4.7.4
Homepage: https://github.com/oracle/dtrace/
Rules-Requires-Root: no
@@ -25,8 +26,7 @@ Description: Dynamic tracing for Linux (DTrace)
Package: libdtrace2
Architecture: amd64 arm64
-Depends: ${misc:Depends}, ${shlibs:Depends},
- fuse3, libctf0, libelf1t64, libfuse3-4, libpcap0.8t64, libpfm4, libz1
+Depends: ${misc:Depends}, ${shlibs:Depends}
Description: Dynamic tracing for Linux (DTrace) (library)
This is the official Linux port of the advanced tracing tool DTrace.
.
@@ -60,7 +60,7 @@ Description: Dynamic tracing for Linux (DTrace) (development)
Package: dtrace-tests
Architecture: amd64 arm64
Depends: ${misc:Depends}, ${shlibs:Depends}, ${perl:Depends},
- binutils, cpp, gawk, gcc, make, pkgconf, tshark, bpftool
+ binutils, cpp, gawk, gcc, make, pkgconf, tshark, bpftool, libdtrace2-dev
Description: Dynamic tracing for Linux (DTrace) (testsuite)
This is the official Linux port of the advanced tracing tool DTrace.
.
diff --git a/dists/debian/patches/debian-static-linking.patch b/dists/debian/patches/debian-static-linking.patch
new file mode 100644
index 00000000..363cdb56
--- /dev/null
+++ b/dists/debian/patches/debian-static-linking.patch
@@ -0,0 +1,248 @@
+diff --git a/cmd/Build b/cmd/Build
+index 98d0ebd7..3492638d 100644
+--- a/cmd/Build
++++ b/cmd/Build
+@@ -13,7 +13,7 @@ dtrace_SOURCES = dtrace.c
+ dtrace_DEPS = libdtrace.so libport.a
+ dtrace_SRCDEPS := $(objdir)/dt_git_version.h
+ ifdef HAVE_LIBCTF
+-dtrace_LIBS = -ldtrace -lctf -lport -lelf
++dtrace_LIBS = -ldtrace -lctf-nobfd -lport -lelf
+ else
+ dtrace_LIBS = -ldtrace -ldtrace-ctf -lport -lelf
+ endif
+diff --git a/libdtrace/Build b/libdtrace/Build
+index 3a6c0466..3bf6c7c0 100644
+--- a/libdtrace/Build
++++ b/libdtrace/Build
+@@ -82,10 +82,16 @@ SHLIBS += libdtrace
+ libdtrace_DIR := $(current-dir)
+ libdtrace_TARGET = libdtrace
+ ifdef HAVE_LIBCTF
+-libdtrace_LIBS := -lctf
++libdtrace_LIBS := -lctf-nobfd
+ else
+ libdtrace_LIBS := -ldtrace-ctf
+ endif
++
++# Required for dt_pid.c for varying instruction lengths on x86
++ifeq ($(shell uname -m), x86_64)
++libdtrace_LIBS += -lopcodes_pic -lbfd_pic -lsframe -liberty
++endif
++
+ libdtrace_LIBS += -lelf -lz -lrt -lpcap -lpthread -ldl -lm -lpfm
+ libdtrace_VERSION := 2.0.0
+ libdtrace_SONAME := libdtrace.so.2
+@@ -93,11 +99,6 @@ libdtrace_VERSCRIPT := libdtrace.ver
+ libdtrace_LIBSOURCES := libdtrace-build libproc libport libcommon
+ libdtrace_SECONDARY := libproc libport
+
+-# Required for dt_pid.c for varying instruction lengths on x86
+-ifeq ($(shell uname -m), x86_64)
+-libdtrace_LIBS += -lopcodes
+-endif
+-
+ # Disable certain warnings for these files
+ dt_bpf.c_CFLAGS := -Wno-pedantic
+ dt_btf.c_CFLAGS := -Wno-pedantic
+diff --git a/libdtrace/dt_impl.h b/libdtrace/dt_impl.h
+index 5282efbd..f757c866 100644
+--- a/libdtrace/dt_impl.h
++++ b/libdtrace/dt_impl.h
+@@ -304,6 +304,7 @@ struct dtrace_hdl {
+ dt_htab_t *dt_kernsyms; /* htab of kernel symbol names */
+ char *dt_ctfa_path; /* path to vmlinux.ctfa */
+ ctf_archive_t *dt_ctfa; /* ctf archive for the entire kernel tree */
++ void *dt_ctfa_data; /* backing data for dt_ctfa */
+ char *dt_btf_path; /* path to vmlinux.btf */
+ struct dt_btf *dt_shared_btf; /* BTF data for the kernel (shared) */
+ ctf_file_t *dt_shared_ctf; /* Handle to the shared CTF */
+diff --git a/libdtrace/dt_module.c b/libdtrace/dt_module.c
+index 00978911..14ca18fb 100644
+--- a/libdtrace/dt_module.c
++++ b/libdtrace/dt_module.c
+@@ -194,8 +194,16 @@ dt_module_lookup_by_ctf(dtrace_hdl_t *dtp, ctf_file_t *ctfp)
+ return ctfp ? ctf_getspecific(ctfp) : NULL;
+ }
+
++static void
++dt_module_delete_registered(dtrace_hdl_t *dtp, dt_module_t *dmp)
++{
++ if (dt_module_lookup_by_name(dtp, dmp->dm_name) == dmp)
++ dt_htab_delete(dtp->dt_mods, dmp);
++}
++
+ static int
+-dt_module_init_elf(dtrace_hdl_t *dtp, dt_module_t *dmp)
++dt_module_init_elf_impl(dtrace_hdl_t *dtp, dt_module_t *dmp,
++ int unregister_on_error)
+ {
+ int fd, err, bits;
+ size_t shstrs;
+@@ -226,7 +234,8 @@ dt_module_init_elf(dtrace_hdl_t *dtp, dt_module_t *dmp)
+ elf_getshdrstrndx(dmp->dm_elf, &shstrs) == -1) {
+ dt_dprintf("failed to load %s: %s\n", dmp->dm_file,
+ elf_errmsg(elf_errno()));
+- dt_htab_delete(dtp->dt_mods, dmp);
++ if (unregister_on_error)
++ dt_module_delete_registered(dtp, dmp);
+ return dt_set_errno(dtp, EDT_OBJIO);
+ }
+
+@@ -242,7 +251,8 @@ dt_module_init_elf(dtrace_hdl_t *dtp, dt_module_t *dmp)
+ default:
+ dt_dprintf("failed to load %s: unknown ELF class\n",
+ dmp->dm_file);
+- dt_htab_delete(dtp->dt_mods, dmp);
++ if (unregister_on_error)
++ dt_module_delete_registered(dtp, dmp);
+ return dt_set_errno(dtp, EDT_ELFCLASS);
+ }
+
+@@ -252,6 +262,12 @@ dt_module_init_elf(dtrace_hdl_t *dtp, dt_module_t *dmp)
+ return 0;
+ }
+
++static int
++dt_module_init_elf(dtrace_hdl_t *dtp, dt_module_t *dmp)
++{
++ return dt_module_init_elf_impl(dtp, dmp, 1);
++}
++
+ static int
+ dt_module_load_sect(dtrace_hdl_t *dtp, dt_module_t *dmp, ctf_sect_t *ctsp)
+ {
+@@ -297,6 +313,91 @@ dt_module_load_sect(dtrace_hdl_t *dtp, dt_module_t *dmp, ctf_sect_t *ctsp)
+ return 0;
+ }
+
++#ifdef HAVE_LIBCTF
++/*
++ * libctf-nobfd cannot use the BFD-backed ctf_arc_open() helper, so extract
++ * the .ctf section ourselves and open that with ctf_arc_bufopen().
++ */
++static ctf_archive_t *
++dt_ctfa_open(dtrace_hdl_t *dtp, const char *ctfa_name)
++{
++ ctf_archive_t *ctfa = NULL;
++ ctf_sect_t ctsp = { 0 };
++ dt_module_t *dmp;
++ char dm_file[PATH_MAX];
++ const dt_modops_t *dm_ops;
++ Elf *dm_elf;
++ void *ctfa_data = NULL;
++
++ dmp = dtp->dt_exec;
++ if (dmp == NULL || strcmp(dmp->dm_name, "vmlinux") != 0)
++ dmp = dt_module_lookup_by_name(dtp, "vmlinux");
++ if (dmp == NULL) {
++ dtp->dt_ctferr = ECTF_INTERNAL;
++ return NULL;
++ }
++
++ /*
++ * Borrow the registered vmlinux module as the ELF loader context, but
++ * leave its persistent module state exactly as we found it.
++ */
++ memcpy(dm_file, dmp->dm_file, sizeof(dm_file));
++ dm_ops = dmp->dm_ops;
++ dm_elf = dmp->dm_elf;
++
++ if (strlcpy(dmp->dm_file, ctfa_name, sizeof(dmp->dm_file)) >=
++ sizeof(dmp->dm_file)) {
++ dtp->dt_ctferr = ENAMETOOLONG;
++ goto out;
++ }
++
++ errno = 0;
++ if (dt_module_init_elf_impl(dtp, dmp, 0) != 0) {
++ dtp->dt_ctferr = errno != 0 ? errno : ECTF_FMT;
++ goto out;
++ }
++
++ ctsp.cts_name = ".ctf";
++ ctsp.cts_entsize = 0;
++
++ if (dt_module_load_sect(dtp, dmp, &ctsp) == -1) {
++ dtp->dt_ctferr = ECTF_FMT;
++ goto out;
++ }
++
++ if (ctsp.cts_data == NULL || ctsp.cts_size == 0) {
++ dtp->dt_ctferr = ECTF_NOCTFDATA;
++ goto out;
++ }
++
++ ctfa_data = malloc(ctsp.cts_size);
++ if (ctfa_data == NULL) {
++ dtp->dt_ctferr = errno;
++ goto out;
++ }
++ memcpy(ctfa_data, ctsp.cts_data, ctsp.cts_size);
++ ctsp.cts_data = ctfa_data;
++
++ ctfa = ctf_arc_bufopen(&ctsp, NULL, NULL, &dtp->dt_ctferr);
++ if (ctfa != NULL) {
++ free(dtp->dt_ctfa_data);
++ dtp->dt_ctfa_data = ctfa_data;
++ ctfa_data = NULL;
++ }
++
++out:
++ free(ctfa_data);
++ if (dmp->dm_elf != dm_elf) {
++ if (dmp->dm_elf != NULL)
++ elf_end(dmp->dm_elf);
++ dmp->dm_elf = dm_elf;
++ }
++ dmp->dm_ops = dm_ops;
++ memcpy(dmp->dm_file, dm_file, sizeof(dmp->dm_file));
++ return ctfa;
++}
++#endif
++
+ /*
+ * Only used for linked-in modules. Archived modules are uncompressed
+ * automatically.
+@@ -928,7 +1029,11 @@ dt_kern_module_find_ctf(dtrace_hdl_t *dtp, dt_module_t *dmp)
+ } else
+ ctfa_name = dtp->dt_ctfa_path;
+
++#ifdef HAVE_LIBCTF
++ dtp->dt_ctfa = dt_ctfa_open(dtp, ctfa_name);
++#else
+ dtp->dt_ctfa = ctf_arc_open(ctfa_name, &dtp->dt_ctferr);
++#endif
+ if (dtp->dt_ctfa != NULL) {
+ /*
+ * Load in the shared CTF immediately.
+@@ -941,6 +1046,8 @@ dt_kern_module_find_ctf(dtrace_hdl_t *dtp, dt_module_t *dmp)
+ ctfa_name, ctf_errmsg(dtp->dt_ctferr));
+ ctf_arc_close(dtp->dt_ctfa);
+ dtp->dt_ctfa = NULL;
++ free(dtp->dt_ctfa_data);
++ dtp->dt_ctfa_data = NULL;
+ } else {
+ dt_dprintf("Loaded shared CTF from archive %s.\n",
+ ctfa_name);
+@@ -958,7 +1065,7 @@ dt_kern_module_find_ctf(dtrace_hdl_t *dtp, dt_module_t *dmp)
+ * data for shared_ctf from.
+ */
+ mod = dt_module_lookup_by_name(dtp, "vmlinux");
+- if (mod->dm_btf != NULL) {
++ if (mod != NULL && mod->dm_btf != NULL) {
+ dt_kern_module_ctf_from_btf(dtp, mod);
+ dtp->dt_shared_ctf = mod->dm_ctfp;
+ } else
+diff --git a/libdtrace/dt_open.c b/libdtrace/dt_open.c
+index 54adec02..a3932790 100644
+--- a/libdtrace/dt_open.c
++++ b/libdtrace/dt_open.c
+@@ -1319,6 +1319,7 @@ dtrace_close(dtrace_hdl_t *dtp)
+ ctf_close(dtp->dt_shared_ctf);
+ if (dtp->dt_ctfa != NULL)
+ ctf_arc_close(dtp->dt_ctfa);
++ free(dtp->dt_ctfa_data);
+
+ dt_pcap_destroy(dtp);
+
diff --git a/dists/debian/patches/debian-surpress-utsname-in-note.patch b/dists/debian/patches/debian-surpress-utsname-in-note.patch
new file mode 100644
index 00000000..d058d8da
--- /dev/null
+++ b/dists/debian/patches/debian-surpress-utsname-in-note.patch
@@ -0,0 +1,15 @@
+diff --git a/libdtrace/dt_link.c b/libdtrace/dt_link.c
+index 6d733881..5a7d414c 100644
+--- a/libdtrace/dt_link.c
++++ b/libdtrace/dt_link.c
+@@ -398,8 +398,10 @@ create_elf64(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, int fd, uint_t flags)
+ if (!(flags & DTRACE_D_STRIP)) {
+ if (note_add_version(usdt) == -1)
+ goto fail;
++#f 0
+ if (note_add_utsname(usdt) == -1)
+ goto fail;
++#endif
+ }
+
+ dt_free(dtp, usdt);
diff --git a/dists/debian/patches/series b/dists/debian/patches/series
index 99f0cdc5..3c97f198 100644
--- a/dists/debian/patches/series
+++ b/dists/debian/patches/series
@@ -1,3 +1,4 @@
# You must remove unused comment lines for the released package.
debian-configure.patch
debian-fix-sed-path.patch
+debian-static-linking.patch
--
2.53.0
More information about the DTrace-devel
mailing list