From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
To: "Rui Qi" <qirui.001@bytedance.com>
Cc: "Steven Rostedt" <rostedt@goodmis.org>,
"Mathieu Desnoyers" <mathieu.desnoyers@efficios.com>,
"Shuah Khan" <shuah@kernel.org>,
"Heiko Carstens" <hca@linux.ibm.com>,
<linux-kernel@vger.kernel.org>,
<linux-trace-kernel@vger.kernel.org>,
<linux-kselftest@vger.kernel.org>
Subject: Re: [PATCH v2 2/2] selftests/ftrace: Convert ELF entry point to file offset in uprobe test
Date: Fri, 7 Aug 2026 19:30:13 +0900 [thread overview]
Message-ID: <20260807193013.7fe47144c1f41facb60b310f@kernel.org> (raw)
In-Reply-To: <20260807081512.2974757-3-qirui.001@bytedance.com>
On Fri, 7 Aug 2026 16:15:12 +0800
"Rui Qi" <qirui.001@bytedance.com> wrote:
> The add_remove_uprobe test uses readelf -h to obtain the ELF entry
> point (e_entry) and passes it directly as the offset to uprobe_events.
> However, uprobe_events expects a file offset, not a virtual address.
>
> For PIE binaries, the virtual address happens to equal the file offset
> because the first LOAD segment has p_vaddr == p_offset, so the test
> works by coincidence. But for non-PIE executables, e_entry is an
> absolute virtual address that can far exceed the file size. When the
> probe is enabled, uprobe_register() checks offset > i_size_read(inode)
> and rejects it with -EINVAL.
Good catch!
>
> Fix this by converting the virtual address to a file offset using the
> ELF program headers: scan readelf -lW output for the LOAD segment
> containing the entry point, then compute file_offset = e_entry -
> p_vaddr + p_offset. For PIE binaries the result is unchanged; for
> non-PIE binaries the offset is correctly translated.
>
> The conversion uses only POSIX shell primitives, with no dependency on
> gawk or perl.
>
> Fixes: dc4b165855f2 ("selftests/ftrace: Use readelf to find entry point in uprobe test")
> Signed-off-by: Rui Qi <qirui.001@bytedance.com>
OK, let me take it.
Thank you!
> ---
> .../test.d/dynevent/add_remove_uprobe.tc | 27 +++++++++++++++++--
> 1 file changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/tools/testing/selftests/ftrace/test.d/dynevent/add_remove_uprobe.tc b/tools/testing/selftests/ftrace/test.d/dynevent/add_remove_uprobe.tc
> index f2048c244526..19430bd5864c 100644
> --- a/tools/testing/selftests/ftrace/test.d/dynevent/add_remove_uprobe.tc
> +++ b/tools/testing/selftests/ftrace/test.d/dynevent/add_remove_uprobe.tc
> @@ -12,9 +12,32 @@ echo 0 > events/enable
> echo > dynamic_events
>
> REALBIN=`readlink -f /bin/sh`
> -ENTRYPOINT=`readelf -h ${REALBIN} | grep Entry | sed -e 's/[^0]*//'`
>
> -echo "p:myevent ${REALBIN}:${ENTRYPOINT}" >> uprobe_events
> +# Get the entry point virtual address from ELF header
> +ENTRY=`readelf -hW ${REALBIN} | grep "Entry point" | awk '{print $NF}'`
> +
> +# Convert virtual address to file offset: find the LOAD segment containing
> +# the entry point, then compute file_offset = e_entry - p_vaddr + p_offset.
> +# For PIE binaries this is a no-op (vaddr == file offset), but for non-PIE
> +# executables the virtual address is much larger than the file size and
> +# must be converted, otherwise uprobe_register() rejects it with -EINVAL.
> +ENTRY_DEC=$(printf '%d' "$ENTRY")
> +OFFSET=$ENTRY
> +while IFS= read -r line; do
> + set -- $line
> + [ "$1" = "LOAD" ] || continue
> + VA_DEC=$(printf '%d' "$3")
> + OFF_DEC=$(printf '%d' "$2")
> + FSZ_DEC=$(printf '%d' "$5")
> + if [ "$ENTRY_DEC" -ge "$VA_DEC" ] && [ "$ENTRY_DEC" -lt "$((VA_DEC + FSZ_DEC))" ]; then
> + OFFSET=$(printf '0x%x' "$((ENTRY_DEC - VA_DEC + OFF_DEC))")
> + break
> + fi
> +done << EOF
> +$(readelf -lW ${REALBIN} | grep LOAD)
> +EOF
> +
> +echo "p:myevent ${REALBIN}:${OFFSET}" >> uprobe_events
>
> grep -q myevent uprobe_events
> test -d events/uprobes/myevent
> --
> 2.20.1
--
Masami Hiramatsu (Google) <mhiramat@kernel.org>
next prev parent reply other threads:[~2026-08-07 10:30 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-06 8:31 [PATCH 1/2] selftests/ftrace: Force C locale for readelf in uprobe test Rui Qi
2026-08-06 8:31 ` [PATCH 2/2] selftests/ftrace: Convert ELF entry point to file offset " Rui Qi
2026-08-07 1:47 ` [PATCH 1/2] selftests/ftrace: Force C locale for readelf " Masami Hiramatsu
2026-08-07 8:01 ` Rui Qi
2026-08-07 8:15 ` [PATCH v2 0/2] selftests/ftrace: Fix add_remove_uprobe robustness Rui Qi
2026-08-07 8:15 ` [PATCH v2 1/2] selftests/ftrace: Force C locale in ftracetest Rui Qi
2026-08-07 8:15 ` [PATCH v2 2/2] selftests/ftrace: Convert ELF entry point to file offset in uprobe test Rui Qi
2026-08-07 10:30 ` Masami Hiramatsu [this message]
2026-08-07 10:29 ` [PATCH v2 0/2] selftests/ftrace: Fix add_remove_uprobe robustness Masami Hiramatsu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260807193013.7fe47144c1f41facb60b310f@kernel.org \
--to=mhiramat@kernel.org \
--cc=hca@linux.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=qirui.001@bytedance.com \
--cc=rostedt@goodmis.org \
--cc=shuah@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.