[PATCH 2/3] test: make tst.dash.sh work for position-independent code
Kris Van Hees <[email protected]> Mon, 09 Feb 2026 15:43:48 -0500
| Newsgroups | dev.linux.lists.dtrace |
|---|---|
| Message-ID | <DS0PR10MB75221E0927D3E1E80DCE5EDCC265A@DS0PR10MB7522.namprd10.prod.outlook.com> |
When code is compiled as position-independent code, the logic for comparing the reported PC at probe firing needs to adjust for the fact that the reported addresses are absolute whereas the addresses obtained from the executable are relative to the mapping base Signed-off-by: Kris Van Hees <[email protected]> --- test/unittest/pid/tst.dash.sh | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/test/unittest/pid/tst.dash.sh b/test/unittest/pid/tst.dash.sh index 0289b609..d793e081 100755 --- a/test/unittest/pid/tst.dash.sh +++ b/test/unittest/pid/tst.dash.sh @@ -1,7 +1,7 @@ #!/bin/bash # # Oracle Linux DTrace. -# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2025, 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. # @@ -16,6 +16,8 @@ cd $DIRNAME # Make trigger program. cat << EOF > main.c +#include <stdio.h> + int foo0(int i) { int j, k; @@ -46,6 +48,10 @@ int foo2(int i) { int main(int c, char **v) { int i = 0; + printf("foo0 %p\n" + "foo1 %p\n" + "foo2 %p\n" + "main %p\n", &foo0, &foo1, &foo2, &main); i = foo0(i) ^ i; i = foo1(i) ^ i; i = foo2(i) ^ i; @@ -85,8 +91,8 @@ for func in foo0 foo1 foo2 main; do }'` # Write the expected output to the compare file. - echo got $ABS $func:$REL >> dtrace.exp - echo got $ABS "-":$ABS >> dtrace.exp +# echo got $ABS $func:$REL >> dtrace.exp +# echo got $ABS "-":$ABS >> dtrace.exp # Write the actual dtrace output to the output file. # Specify the pid probe with both relative and absolute @@ -95,12 +101,18 @@ for func in foo0 foo1 foo2 main; do $dtrace -c ./a.out -o dtrace.out -qn ' pid$target:a.out:'$probe' { printf("got %x %s:%s", uregs[R_PC], probefunc, - probename); }' + probename); }' > addrs if [ $? -ne 0 ]; then echo ERROR: dtrace cat dtrace.out exit 1 fi + + awk -vfn="$func" -vrel="$REL" -vprobe="$probe" \ + '$1 == fn { + addr = strtonum($2) + int(rel); + printf "got %x %s\n", addr, probe; + }' addrs >> dtrace.exp done done -- 2.51.0