[DTrace-devel] [PATCH] Fix relocations of 64-bit values

Kris Van Hees kris.van.hees at oracle.com
Tue Jun 15 10:58:41 PDT 2021


The R_BPF_64_64 relocation in the final linking was truncating 64-bit
values to 32-bits.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_cc.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/libdtrace/dt_cc.c b/libdtrace/dt_cc.c
index 9bf6ba09..a39c701b 100644
--- a/libdtrace/dt_cc.c
+++ b/libdtrace/dt_cc.c
@@ -2395,7 +2395,7 @@ dt_link_resolve(dtrace_hdl_t *dtp, dtrace_difo_t *dp)
 		dt_ident_t	*idp = dt_dlib_get_sym(dtp, name);
 		uint_t		ioff = rp->dofr_offset /
 				       sizeof(struct bpf_insn);
-		uint32_t	val;
+		uint64_t	val;
 
 		if (idp == NULL)			/* not found */
 			continue;
@@ -2418,10 +2418,10 @@ dt_link_resolve(dtrace_hdl_t *dtp, dtrace_difo_t *dp)
 		}
 
 		if (rp->dofr_type == R_BPF_64_64) {
-			buf[ioff].imm = val;
-			buf[ioff + 1].imm = 0;
+			buf[ioff].imm = val & 0xffffffff;
+			buf[ioff + 1].imm = val >> 32;
 		} else if (rp->dofr_type == R_BPF_64_32)
-			buf[ioff].imm = val;
+			buf[ioff].imm = (uint32_t)val;
 	}
 }
 
-- 
2.31.1




More information about the DTrace-devel mailing list