[DTrace-devel] [PATCH] link: introduce -o linknommap

Nick Alcock nick.alcock at oracle.com
Tue May 23 21:12:03 UTC 2023


This option allows users of dtrace -G to force elfutils to not use
mmap(), avoiding various bugs in elfutils which can break mmap() usage
with large projects.

It's rather horrible and (I hope) a stopgap we can eventually turn into
a NOP.

Signed-off-by: Nick Alcock <nick.alcock at oracle.com>
---
 libdtrace/dt_impl.h    |  1 +
 libdtrace/dt_link.c    |  3 ++-
 libdtrace/dt_options.c | 10 ++++++++++
 3 files changed, 13 insertions(+), 1 deletion(-)

This might work better (replacing the earlier patch).

No test, because it's clear I don't actually have a way to provoke this
to fail.

diff --git a/libdtrace/dt_impl.h b/libdtrace/dt_impl.h
index 581bb8a644e7c..6eedb8541dc73 100644
--- a/libdtrace/dt_impl.h
+++ b/libdtrace/dt_impl.h
@@ -371,6 +371,7 @@ struct dtrace_hdl {
 	uint_t dt_prcmode;	/* dtrace process create mode (see dt_proc.h) */
 	uint_t dt_linkmode;	/* dtrace symbol linking mode (see below) */
 	uint_t dt_linktype;	/* dtrace link output file type (see below) */
+	uint_t dt_link_no_mmap;	/* whether linking should avoid mmap() */
 	uint_t dt_xlatemode;	/* dtrace translator linking mode (see below) */
 	uint_t dt_stdcmode;	/* dtrace stdc compatibility mode (see below) */
 	uint_t dt_treedump;	/* dtrace tree debug bitmap (see below) */
diff --git a/libdtrace/dt_link.c b/libdtrace/dt_link.c
index a27ca7212b54c..b2148a8b21d6d 100644
--- a/libdtrace/dt_link.c
+++ b/libdtrace/dt_link.c
@@ -1042,13 +1042,14 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp)
 	key_t objkey;
 	dt_link_pair_t *pair, *bufs = NULL;
 	dt_strtab_t *strtab;
+	int flags = dtp->dt_link_no_mmap ? ELF_C_RDWR : ELF_C_RDWR_MMAP;
 
 	if ((fd = open64(obj, O_RDWR)) == -1) {
 		return dt_link_error(dtp, elf, fd, bufs,
 		    "failed to open %s: %s", obj, strerror(errno));
 	}
 
-	if ((elf = elf_begin(fd, ELF_C_RDWR_MMAP, NULL)) == NULL) {
+	if ((elf = elf_begin(fd, flags, NULL)) == NULL) {
 		return dt_link_error(dtp, elf, fd, bufs,
 		    "failed to process %s: %s", obj, elf_errmsg(elf_errno()));
 	}
diff --git a/libdtrace/dt_options.c b/libdtrace/dt_options.c
index 1c32dc3d4c150..faa28268c5e67 100644
--- a/libdtrace/dt_options.c
+++ b/libdtrace/dt_options.c
@@ -376,6 +376,15 @@ dt_opt_linktype(dtrace_hdl_t *dtp, const char *arg, uintptr_t option)
 	return 0;
 }
 
+/*ARGSUSED*/
+static int
+dt_opt_linknommap(dtrace_hdl_t *dtp, const char *arg, uintptr_t option)
+{
+	dtp->dt_link_no_mmap = 1;
+
+	return 0;
+}
+
 /*ARGSUSED*/
 static int
 dt_opt_module_path(dtrace_hdl_t *dtp, const char *arg, uintptr_t option)
@@ -1095,6 +1104,7 @@ static const dt_option_t _dtrace_ctoptions[] = {
 	{ "libdir", dt_opt_libdir },
 	{ "linkmode", dt_opt_linkmode },
 	{ "linktype", dt_opt_linktype },
+	{ "linknommap", dt_opt_linknommap },
 	{ "modpath", dt_opt_module_path },
 	{ "nolibs", dt_opt_cflags, DTRACE_C_NOLIBS },
 	{ "pgmax", dt_opt_pgmax },

base-commit: f543fa6706c0b31364356c01bf3de63e3cce8ad1
prerequisite-patch-id: fa667248b7b02e92ee6b3807123ebcf2ac0acc38
prerequisite-patch-id: 0cec5f1a31d528a493d6143644c1e6b78c7f403b
prerequisite-patch-id: 1e1ced5fcec01a0c2e38d12f1ae5a124c8f93860
prerequisite-patch-id: eb290f098e38981181d85240150e1713979dc505
prerequisite-patch-id: c25b38ab68e815a63f064aff7496408684f94a36
prerequisite-patch-id: b86eb7e00b5883a586bd4dc7143ab25094912288
prerequisite-patch-id: 85d3c176dc4a7105e4f04dbcdb4ccbdf18741795
prerequisite-patch-id: 94206b53a67820bb1c9e828c11e57a0cb36949b6
prerequisite-patch-id: c5a64d246ff26047723e5e1a9c16b42a1d5fbf87
prerequisite-patch-id: 89cf4c6b9242525883ac02bb8ef90856ef908d0f
prerequisite-patch-id: 0992642ac657a1da617588a6d7b28f3669960374
prerequisite-patch-id: e8a65c309b3eaf3341ceac421ef602bcc3f057fa
prerequisite-patch-id: 4d38462a4bf2b242f8fcec3bf28f1ad97fa40ca7
prerequisite-patch-id: 6430030eaa9b5f09eedf6d41b698549096905c56
prerequisite-patch-id: aefef52e1438f34dd49e0cde010e791d96ef06d9
prerequisite-patch-id: f9ca834410ab770ec2d0b4f4f1ea70d5bea37c84
prerequisite-patch-id: a2e41bc39d3eb5bea3c1543928d1a695320cce52
prerequisite-patch-id: 5998403c58e4b48f0cb0d87971e553d2999421fc
prerequisite-patch-id: 8766128335d133bdd548ed5978aa9eefeb6f7b6d
prerequisite-patch-id: 35e83414bbe54be31fe7cc15c7d6368543cd4e8f
prerequisite-patch-id: fe12afceb640e98f3e1c71915e005f114677b22c
-- 
2.39.1.268.g9de2f9a303




More information about the DTrace-devel mailing list