Obviously we're never going to be able to build strace for macOS,
but right now the reference to the struct was breaking even a macOS
build with strace disabled! From poking at building for arm on the
Raspberry Pi over the weekend, changes like this will be needed
there too (because different architectures have different _names_
for this struct, not just different contents).

Tested on macOS (where it juts fixes the build) and on x86-64 (where
strace continues to function as before).
---
 lib/portability.h     |  2 --
 toys/pending/strace.c | 42 ++++++++++++++++++++++++------------------
 2 files changed, 24 insertions(+), 20 deletions(-)
From 1194a60f71983d43495e669b5d0c9c3f677418f4 Mon Sep 17 00:00:00 2001
From: Elliott Hughes <e...@google.com>
Date: Mon, 20 Sep 2021 10:13:02 -0700
Subject: [PATCH] strace: fix macOS build.

Obviously we're never going to be able to build strace for macOS,
but right now the reference to the struct was breaking even a macOS
build with strace disabled! From poking at building for arm on the
Raspberry Pi over the weekend, changes like this will be needed
there too (because different architectures have different _names_
for this struct, not just different contents).

Tested on macOS (where it juts fixes the build) and on x86-64 (where
strace continues to function as before).
---
 lib/portability.h     |  2 --
 toys/pending/strace.c | 42 ++++++++++++++++++++++++------------------
 2 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/lib/portability.h b/lib/portability.h
index 22e82ad6..bb792f10 100644
--- a/lib/portability.h
+++ b/lib/portability.h
@@ -371,5 +371,3 @@ int dev_makedev(int major, int minor);
 char *fs_type_name(struct statfs *statfs);
 
 int get_block_device_size(int fd, unsigned long long *size);
-
-#include <sys/user.h>
diff --git a/toys/pending/strace.c b/toys/pending/strace.c
index cd87dd87..16871e5b 100644
--- a/toys/pending/strace.c
+++ b/toys/pending/strace.c
@@ -18,6 +18,7 @@ config STRACE
 
 #include <sys/ptrace.h>
 #include <sys/syscall.h>
+#include <sys/user.h>
 
 #define FOR_strace
 #include "toys.h"
@@ -26,31 +27,36 @@ GLOBALS(
   long s;
   long p;
 
-  struct user_regs_struct regs;
+  // 216 for x86-64.
+  char regs_buf[256];
   pid_t pid;
   char *fmt;
   char ioctl[32];
   int arg;
 )
 
+  struct user_regs_struct regs;
+
 #if defined(__x86_64__)
-#define REG_SYSCALL TT.regs.orig_rax
-#define REG_ARG0 TT.regs.rdi
-#define REG_ARG1 TT.regs.rsi
-#define REG_ARG2 TT.regs.rdx
-#define REG_ARG3 TT.regs.r10
-#define REG_ARG4 TT.regs.r8
-#define REG_ARG5 TT.regs.r9
-#define REG_RESULT TT.regs.rax
+#define REGS ((struct user_regs_struct *) &TT.regs_buf)
+#define REG_SYSCALL REGS->orig_rax
+#define REG_ARG0 REGS->rdi
+#define REG_ARG1 REGS->rsi
+#define REG_ARG2 REGS->rdx
+#define REG_ARG3 REGS->r10
+#define REG_ARG4 REGS->r8
+#define REG_ARG5 REGS->r9
+#define REG_RESULT REGS->rax
 #elif defined(__i386__)
-#define REG_SYSCALL TT.regs.orig_eax
-#define REG_ARG0 TT.regs.ebx
-#define REG_ARG1 TT.regs.ecx
-#define REG_ARG2 TT.regs.edx
-#define REG_ARG3 TT.regs.esi
-#define REG_ARG4 TT.regs.edi
-#define REG_ARG5 TT.regs.ebp
-#define REG_RESULT TT.regs.eax
+#define REGS ((struct user_regs_struct *) &TT.regs_buf)
+#define REG_SYSCALL REGS->orig_eax
+#define REG_ARG0 REGS->ebx
+#define REG_ARG1 REGS->ecx
+#define REG_ARG2 REGS->edx
+#define REG_ARG3 REGS->esi
+#define REG_ARG4 REGS->edi
+#define REG_ARG5 REGS->ebp
+#define REG_RESULT REGS->eax
 #else
 // TODO: arm/arm64
 #error unsupported architecture
@@ -163,7 +169,7 @@ static void xptrace(int req, pid_t pid, void *addr, void *data)
 
 static void get_regs()
 {
-  xptrace(PTRACE_GETREGS, TT.pid, 0, &TT.regs);
+  xptrace(PTRACE_GETREGS, TT.pid, 0, &TT.regs_buf);
 }
 
 static long get_arg()
-- 
2.33.0.464.g1972c5931b-goog

_______________________________________________
Toybox mailing list
Toybox@lists.landley.net
http://lists.landley.net/listinfo.cgi/toybox-landley.net

Reply via email to