[DTrace-devel] [PATCH] Fix DIFO strtab handling
Kris Van Hees
kris.van.hees at oracle.com
Thu Mar 10 06:39:26 UTC 2022
Incorrect hansling of the DIFO strtab caused DIFOs to have string
constant tables that were missing items. This caused annotations to
report incorrect strings.
Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
libdtrace/dt_cc.c | 28 ++++++--------
.../unittest/disasm/tst.ann-strconst-strtab.r | 2 +
.../disasm/tst.ann-strconst-strtab.sh | 37 +++++++++++++++++++
3 files changed, 50 insertions(+), 17 deletions(-)
create mode 100644 test/unittest/disasm/tst.ann-strconst-strtab.r
create mode 100755 test/unittest/disasm/tst.ann-strconst-strtab.sh
diff --git a/libdtrace/dt_cc.c b/libdtrace/dt_cc.c
index 49901710..99577b7d 100644
--- a/libdtrace/dt_cc.c
+++ b/libdtrace/dt_cc.c
@@ -2234,9 +2234,8 @@ static int get_boottime() {
static int
dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
- dt_ident_t *idp, const dtrace_difo_t *sdp, dt_strtab_t *stab,
- uint_t *pcp, uint_t *rcp, uint_t *vcp, dtrace_epid_t epid,
- uint_t clid)
+ dt_ident_t *idp, const dtrace_difo_t *sdp, uint_t *pcp,
+ uint_t *rcp, uint_t *vcp, dtrace_epid_t epid, uint_t clid)
{
uint_t pc = *pcp;
uint_t rc = *rcp;
@@ -2276,7 +2275,7 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
const char *name = dt_difo_getstr(sdp, vp->dtdv_name);
*nvp = *vp;
- nvp->dtdv_name = dt_strtab_insert(stab, name);
+ nvp->dtdv_name = dt_strtab_insert(dtp->dt_ccstab, name);
nvp->dtdv_insn_from += pc;
nvp->dtdv_insn_to += pc;
}
@@ -2293,7 +2292,7 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
const char *name = dt_difo_getstr(sdp, rp->dofr_name);
dt_ident_t *idp = dt_dlib_get_func(dtp, name);
- nrp->dofr_name = dt_strtab_insert(stab, name);
+ nrp->dofr_name = dt_strtab_insert(dtp->dt_ccstab, name);
nrp->dofr_type = rp->dofr_type;
nrp->dofr_offset = rp->dofr_offset +
pc * sizeof(struct bpf_insn);
@@ -2395,8 +2394,8 @@ dt_link_construct(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
clid++;
} else
nepid = 0;
- ipc = dt_link_construct(dtp, prp, dp, idp, rdp, stab,
- pcp, rcp, vcp, nepid, clid);
+ ipc = dt_link_construct(dtp, prp, dp, idp, rdp, pcp,
+ rcp, vcp, nepid, clid);
if (ipc == -1)
return -1;
@@ -2465,7 +2464,6 @@ dt_link(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
uint_t relc = 0;
uint_t varc = 0;
dtrace_difo_t *fdp = NULL;
- dt_strtab_t *stab;
int rc;
/*
@@ -2506,12 +2504,9 @@ dt_link(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
* string table, and variable table).
*/
insc = relc = varc = 0;
- stab = dt_strtab_create(BUFSIZ);
- if (stab == NULL)
- goto nomem;
- rc = dt_link_construct(dtp, prp, fdp, idp, dp, stab, &insc, &relc,
- &varc, 0, 0);
+ rc = dt_link_construct(dtp, prp, fdp, idp, dp, &insc, &relc, &varc, 0,
+ 0);
dt_dlib_reset(dtp, B_FALSE);
if (rc == -1)
goto fail;
@@ -2535,18 +2530,17 @@ dt_link(dtrace_hdl_t *dtp, const dt_probe_t *prp, dtrace_difo_t *dp,
* Write out the new string table.
*/
dt_free(dtp, dp->dtdo_strtab);
- dp->dtdo_strlen = dt_strtab_size(stab);
+ dp->dtdo_strlen = dt_strtab_size(dtp->dt_ccstab);
if (dp->dtdo_strlen > 0) {
dp->dtdo_strtab = dt_zalloc(dtp, dp->dtdo_strlen);
if (dp->dtdo_strtab == NULL)
goto nomem;
- dt_strtab_write(stab, (dt_strtab_write_f *)dt_strtab_copystr,
+ dt_strtab_write(dtp->dt_ccstab,
+ (dt_strtab_write_f *)dt_strtab_copystr,
dp->dtdo_strtab);
} else
dp->dtdo_strtab = NULL;
- dt_strtab_destroy(stab);
-
/*
* Resolve the function relocation records.
*/
diff --git a/test/unittest/disasm/tst.ann-strconst-strtab.r b/test/unittest/disasm/tst.ann-strconst-strtab.r
new file mode 100644
index 00000000..d3c2bfbd
--- /dev/null
+++ b/test/unittest/disasm/tst.ann-strconst-strtab.r
@@ -0,0 +1,2 @@
+linked 07 7 0 0000 XXXXXXXX add %rX, D ! "a"
+final 07 7 0 0000 XXXXXXXX add %rX, D ! "a"
diff --git a/test/unittest/disasm/tst.ann-strconst-strtab.sh b/test/unittest/disasm/tst.ann-strconst-strtab.sh
new file mode 100755
index 00000000..1becdf4c
--- /dev/null
+++ b/test/unittest/disasm/tst.ann-strconst-strtab.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+#
+# Oracle Linux DTrace.
+# Copyright (c) 2022, 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.
+#
+# The process of linking BPF functions together into a program caused the
+# strtab for a DIFO to not contain all the strings needed for the code. This
+# was evidenced through incorrect string constant annotations on the linked and
+# final program disassembler listings.
+#
+# This test verifies that this problem is no longer present.
+#
+
+dtrace=$1
+
+$dtrace $dt_flags -xdisasm=12 -Sn '
+BEGIN
+{
+ a["a"] = 42;
+ exit(0);
+}
+' 2>&1 | \
+ awk '/^Disassembly of/ {
+ kind = $3;
+ next;
+ }
+ / ! "/ {
+ sub(/^[^:]+:/, kind);
+ sub(/^07 [0-9] /, "07 X ");
+ sub(/[0-9a-f]{8} add/, "XXXXXXXX add");
+ sub(/%r[0-9], [0-9]+ +/, "%rX, D ");
+ print;
+ }'
+
+exit $?
--
2.34.1
More information about the DTrace-devel
mailing list