linux: implement PTRACE_EVENT_EXEC
This fixes strace(1) from Ubuntu Focal. Reviewed By: jhb Sponsored By: EPSRC Differential Revision: https://reviews.freebsd.org/D32367
This commit is contained in:
parent
4b9725184e
commit
6e66030c4c
@ -71,6 +71,7 @@ __FBSDID("$FreeBSD$");
|
||||
#define LINUX_PTRACE_SEIZE 0x4206
|
||||
#define LINUX_PTRACE_GET_SYSCALL_INFO 0x420e
|
||||
|
||||
#define LINUX_PTRACE_EVENT_EXEC 4
|
||||
#define LINUX_PTRACE_EVENT_EXIT 6
|
||||
|
||||
#define LINUX_PTRACE_O_TRACESYSGOOD 1
|
||||
@ -151,8 +152,12 @@ linux_ptrace_status(struct thread *td, pid_t pid, int status)
|
||||
lwpinfo.pl_flags & PL_FLAG_SCE)
|
||||
status |= (LINUX_SIGTRAP | 0x80) << 8;
|
||||
if ((pem->ptrace_flags & LINUX_PTRACE_O_TRACESYSGOOD) &&
|
||||
lwpinfo.pl_flags & PL_FLAG_SCX)
|
||||
status |= (LINUX_SIGTRAP | 0x80) << 8;
|
||||
lwpinfo.pl_flags & PL_FLAG_SCX) {
|
||||
if (lwpinfo.pl_flags & PL_FLAG_EXEC)
|
||||
status |= (LINUX_SIGTRAP | LINUX_PTRACE_EVENT_EXEC << 8) << 8;
|
||||
else
|
||||
status |= (LINUX_SIGTRAP | 0x80) << 8;
|
||||
}
|
||||
if ((pem->ptrace_flags & LINUX_PTRACE_O_TRACEEXIT) &&
|
||||
lwpinfo.pl_flags & PL_FLAG_EXITED)
|
||||
status |= (LINUX_SIGTRAP | LINUX_PTRACE_EVENT_EXIT << 8) << 8;
|
||||
|
@ -254,6 +254,18 @@ syscallret(struct thread *td)
|
||||
if (__predict_false(traced ||
|
||||
(td->td_dbgflags & (TDB_EXEC | TDB_FORK)) != 0)) {
|
||||
PROC_LOCK(p);
|
||||
/*
|
||||
* Linux debuggers expect an additional stop for exec,
|
||||
* between the usual syscall entry and exit. Raise
|
||||
* the exec event now and then clear TDB_EXEC so that
|
||||
* the next stop is reported as a syscall exit by
|
||||
* linux_ptrace_status().
|
||||
*/
|
||||
if ((td->td_dbgflags & TDB_EXEC) != 0 &&
|
||||
SV_PROC_ABI(td->td_proc) == SV_ABI_LINUX) {
|
||||
ptracestop(td, SIGTRAP, NULL);
|
||||
td->td_dbgflags &= ~TDB_EXEC;
|
||||
}
|
||||
/*
|
||||
* If tracing the execed process, trap to the debugger
|
||||
* so that breakpoints can be set before the program
|
||||
|
Loading…
Reference in New Issue
Block a user