[DTrace-devel] [PATCH 1/3] pid: ensure pid offset probes perform lookup with adjusted address

Kris Van Hees kris.van.hees at oracle.com
Mon Feb 9 20:43:47 UTC 2026


For PIE executables and libraries, pid offset probes need to have the
address adjusted based on the actual segment load address.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 include/sys/sol_procfs.h | 3 ++-
 libdtrace/dt_pid.c       | 3 +++
 libproc/Psymtab.c        | 7 +++++--
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/include/sys/sol_procfs.h b/include/sys/sol_procfs.h
index d195a108..950ab31a 100644
--- a/include/sys/sol_procfs.h
+++ b/include/sys/sol_procfs.h
@@ -1,6 +1,6 @@
 /*
  * Oracle Linux DTrace.
- * Copyright (c) 2006, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2026, Oracle and/or its affiliates. All rights reserved.
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
@@ -50,6 +50,7 @@ typedef struct prmap {
 
 
 /* Protection and attribute flags */
+#define MA_PIC		0x08	/* position independent code */
 #define	MA_READ		0x04	/* readable by the traced process */
 #define	MA_WRITE	0x02	/* writable by the traced process */
 #define	MA_EXEC		0x01	/* executable by the traced process */
diff --git a/libdtrace/dt_pid.c b/libdtrace/dt_pid.c
index ed329b9d..5c62548b 100644
--- a/libdtrace/dt_pid.c
+++ b/libdtrace/dt_pid.c
@@ -55,6 +55,7 @@ typedef struct dt_pid_probe {
 	dev_t dpp_dev;
 	ino_t dpp_inum;
 	const char *dpp_fname;
+	uintptr_t dpp_base;
 	uintptr_t dpp_vaddr;
 	Lmid_t dpp_lmid;
 	uint_t dpp_nmatches;
@@ -202,6 +203,7 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func)
 		}
 
 		psp->pps_nameoff = off;
+		off += pp->dpp_base;
 
 		if (dt_Plookup_by_addr(dtp, pid, off, (const char **)&psp->pps_fun, &sym)) {
 			rc = dt_pid_error(dtp, dpr, D_PROC_NAME,
@@ -470,6 +472,7 @@ dt_pid_per_mod(void *arg, const prmap_t *pmp, const char *obj)
 	pp->dpp_dev = pmp->pr_dev;
 	pp->dpp_inum = pmp->pr_inum;
 	pp->dpp_vaddr = pmp->pr_file->first_segment->pr_vaddr;
+	pp->dpp_base = (pmp->pr_mflags & MA_PIC) ? pp->dpp_vaddr : 0;
 
 	/*
 	 * Note: if an execve() happens in the victim after this point, the
diff --git a/libproc/Psymtab.c b/libproc/Psymtab.c
index 40543511..e7197b38 100644
--- a/libproc/Psymtab.c
+++ b/libproc/Psymtab.c
@@ -1,6 +1,6 @@
 /*
  * Oracle Linux DTrace.
- * Copyright (c) 2009, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2026, Oracle and/or its affiliates. All rights reserved.
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
@@ -742,8 +742,11 @@ Pupdate_maps(struct ps_prochandle *P)
 
 			if (mptr->map_file &&
 			    mptr->map_file->file_map == -1 &&
-			    mptr->map_pmap->pr_file->prf_text_map == mptr->map_pmap)
+			    mptr->map_pmap->pr_file->prf_text_map == mptr->map_pmap) {
 				mptr->map_file->file_map = P->num_mappings;
+				if (mptr->map_file->file_etype == ET_DYN)
+					mptr->map_pmap->pr_mflags |= MA_PIC;
+			}
 		}
 
 		_dprintf("Added mapping for %s: %lx:%lx %lx(%lx)\n",
-- 
2.51.0




More information about the DTrace-devel mailing list