patches/ltrace/0.5.2/120-debian-ltrace-0.5.2-2.patch
author Arnaud Lacombe <lacombar@gmail.com>
Thu Aug 05 17:59:51 2010 +0200 (2010-08-05)
changeset 2069 366bd2b22675
permissions -rw-r--r--
complibs/mpc: fix MPC 0.8.1 build with MPFR 3.0.0

This is the change introduced by revision 734 of MPC repository.

Author: Paul Zimmermann <Paul.Zimmermann@loria.fr>
Revision log: [acos.c] fixed problem with GMP_RNDA (should be MPFR_RNDA, and code was wrong)

Signed-off-by: Arnaud Lacombe <lacombar@gmail.com>
yann@1437
     1
--- ltrace-0.5.2.orig/TODO
yann@1437
     2
+++ ltrace-0.5.2/TODO
yann@1437
     3
@@ -37,3 +37,4 @@
yann@1437
     4
 * debug: change "-d" option to be something like "-d elf,events", or "-d breakpoints"
yann@1437
     5
 * Find out if a process is sharing memory with its parent?
yann@1437
     6
 * When using -p, find out if that process is sharing memory with other procs
yann@1437
     7
+* After a clone(), syscalls may be seen as sysrets in s390 (see trace.c:syscall_p())
yann@1437
     8
--- ltrace-0.5.2.orig/process_event.c
yann@1437
     9
+++ ltrace-0.5.2/process_event.c
yann@1437
    10
@@ -170,7 +170,7 @@
yann@1437
    11
 			enable_breakpoint(proc->pid, proc->breakpoint_being_enabled);
yann@1437
    12
 			proc->breakpoint_being_enabled = NULL;
yann@1437
    13
 		}
yann@1437
    14
-		if (proc->parent->state == STATE_ATTACHED && options.follow) {
yann@1437
    15
+		if (options.follow) {
yann@1437
    16
 			proc->state = STATE_ATTACHED;
yann@1437
    17
 		} else {
yann@1437
    18
 			proc->state = STATE_IGNORED;
yann@1437
    19
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/ppc/trace.c
yann@1437
    20
+++ ltrace-0.5.2/sysdeps/linux-gnu/ppc/trace.c
yann@1437
    21
@@ -50,9 +50,9 @@
yann@1437
    22
 			*sysnum =
yann@1437
    23
 			    (int)ptrace(PTRACE_PEEKUSER, proc->pid,
yann@1437
    24
 					sizeof(long) * PT_R0, 0);
yann@1437
    25
-			if (proc->callstack_depth > 0
yann@1437
    26
-			    && proc->callstack[proc->callstack_depth -
yann@1437
    27
-					       1].is_syscall) {
yann@1437
    28
+			if (proc->callstack_depth > 0 &&
yann@1437
    29
+					proc->callstack[proc->callstack_depth - 1].is_syscall &&
yann@1437
    30
+					proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
yann@1437
    31
 				return 2;
yann@1437
    32
 			}
yann@1437
    33
 			return 1;
yann@1437
    34
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/i386/trace.c
yann@1437
    35
+++ ltrace-0.5.2/sysdeps/linux-gnu/i386/trace.c
yann@1437
    36
@@ -32,7 +32,8 @@
yann@1437
    37
 		*sysnum = ptrace(PTRACE_PEEKUSER, proc->pid, 4 * ORIG_EAX, 0);
yann@1437
    38
 
yann@1437
    39
 		if (proc->callstack_depth > 0 &&
yann@1437
    40
-		    proc->callstack[proc->callstack_depth - 1].is_syscall) {
yann@1437
    41
+				proc->callstack[proc->callstack_depth - 1].is_syscall &&
yann@1437
    42
+				proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
yann@1437
    43
 			return 2;
yann@1437
    44
 		}
yann@1437
    45
 
yann@1437
    46
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/ia64/trace.c
yann@1437
    47
+++ ltrace-0.5.2/sysdeps/linux-gnu/ia64/trace.c
yann@1437
    48
@@ -106,8 +106,8 @@
yann@1437
    49
 		if (insn == 0x1000000000 || insn == 0x1ffffffffff) {
yann@1437
    50
 			*sysnum = r15;
yann@1437
    51
 			if (proc->callstack_depth > 0 &&
yann@1437
    52
-			    proc->callstack[proc->callstack_depth -
yann@1437
    53
-					    1].is_syscall) {
yann@1437
    54
+				proc->callstack[proc->callstack_depth - 1].is_syscall &&
yann@1437
    55
+				proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
yann@1437
    56
 				return 2;
yann@1437
    57
 			}
yann@1437
    58
 			return 1;
yann@1437
    59
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/m68k/trace.c
yann@1437
    60
+++ ltrace-0.5.2/sysdeps/linux-gnu/m68k/trace.c
yann@1437
    61
@@ -36,9 +36,8 @@
yann@1437
    62
 		if (*sysnum >= 0) {
yann@1437
    63
 			depth = proc->callstack_depth;
yann@1437
    64
 			if (depth > 0 &&
yann@1437
    65
-			    proc->callstack[depth - 1].is_syscall &&
yann@1437
    66
-			    proc->callstack[depth - 1].c_un.syscall ==
yann@1437
    67
-			    *sysnum) {
yann@1437
    68
+					proc->callstack[depth - 1].is_syscall &&
yann@1437
    69
+					proc->callstack[depth - 1].c_un.syscall == *sysnum) {
yann@1437
    70
 				return 2;
yann@1437
    71
 			} else {
yann@1437
    72
 				return 1;
yann@1437
    73
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/alpha/trace.c
yann@1437
    74
+++ ltrace-0.5.2/sysdeps/linux-gnu/alpha/trace.c
yann@1437
    75
@@ -36,8 +36,9 @@
yann@1437
    76
 			return 0;
yann@1437
    77
 		*sysnum =
yann@1437
    78
 		    ptrace(PTRACE_PEEKUSER, proc->pid, 0 /* REG_R0 */ , 0);
yann@1437
    79
-		if (proc->callstack_depth > 0
yann@1437
    80
-		    && proc->callstack[proc->callstack_depth - 1].is_syscall) {
yann@1437
    81
+		if (proc->callstack_depth > 0 &&
yann@1437
    82
+		    proc->callstack[proc->callstack_depth - 1].is_syscall &&
yann@1437
    83
+			proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
yann@1437
    84
 			return 2;
yann@1437
    85
 		}
yann@1437
    86
 		if (*sysnum >= 0 && *sysnum < 500) {
yann@1437
    87
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/sparc/trace.c
yann@1437
    88
+++ ltrace-0.5.2/sysdeps/linux-gnu/sparc/trace.c
yann@1437
    89
@@ -33,9 +33,9 @@
yann@1437
    90
 		insn = ptrace(PTRACE_PEEKTEXT, proc->pid, ip, 0);
yann@1437
    91
 		if ((insn & 0xc1f8007f) == 0x81d00010) {
yann@1437
    92
 			*sysnum = ((proc_archdep *) proc->arch_ptr)->regs.r_g1;
yann@1437
    93
-			if ((proc->callstack_depth > 0)
yann@1437
    94
-			    && proc->callstack[proc->callstack_depth -
yann@1437
    95
-					       1].is_syscall) {
yann@1437
    96
+			if (proc->callstack_depth > 0 &&
yann@1437
    97
+					proc->callstack[proc->callstack_depth - 1].is_syscall &&
yann@1437
    98
+					proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
yann@1437
    99
 				return 2;
yann@1437
   100
 			} else if (*sysnum >= 0) {
yann@1437
   101
 				return 1;
yann@1437
   102
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/mipsel/trace.c
yann@1437
   103
+++ ltrace-0.5.2/sysdeps/linux-gnu/mipsel/trace.c
yann@1437
   104
@@ -60,33 +60,34 @@
yann@1437
   105
 int
yann@1437
   106
 syscall_p(Process *proc, int status, int *sysnum) {
yann@1437
   107
 	if (WIFSTOPPED(status)
yann@1437
   108
-	    && WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) {
yann@1437
   109
-       /* get the user's pc (plus 8) */
yann@1437
   110
-       long pc = (long)get_instruction_pointer(proc);
yann@1437
   111
-       /* fetch the SWI instruction */
yann@1437
   112
-       int insn = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 4, 0);
yann@1437
   113
-       int num = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 8, 0);
yann@1437
   114
-       
yann@1437
   115
-/*
yann@1437
   116
-  On a mipsel,  syscall looks like:
yann@1437
   117
-  24040fa1    li v0, 0x0fa1   # 4001 --> _exit syscall
yann@1437
   118
-  0000000c    syscall
yann@1437
   119
- */
yann@1437
   120
-      if(insn!=0x0000000c){
yann@1437
   121
-          return 0;
yann@1437
   122
-      }
yann@1437
   123
-
yann@1437
   124
-      *sysnum = (num & 0xFFFF) - 4000;
yann@1437
   125
-      /* if it is a syscall, return 1 or 2 */
yann@1437
   126
-      if (proc->callstack_depth > 0 &&
yann@1437
   127
-          proc->callstack[proc->callstack_depth - 1].is_syscall) {
yann@1437
   128
-          return 2;
yann@1437
   129
-      }
yann@1437
   130
-      
yann@1437
   131
-      if (*sysnum >= 0) {
yann@1437
   132
-          return 1;
yann@1437
   133
-      }
yann@1437
   134
-   }
yann@1437
   135
+			&& WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) {
yann@1437
   136
+		/* get the user's pc (plus 8) */
yann@1437
   137
+		long pc = (long)get_instruction_pointer(proc);
yann@1437
   138
+		/* fetch the SWI instruction */
yann@1437
   139
+		int insn = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 4, 0);
yann@1437
   140
+		int num = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 8, 0);
yann@1437
   141
+
yann@1437
   142
+		/*
yann@1437
   143
+		   On a mipsel,  syscall looks like:
yann@1437
   144
+		   24040fa1    li v0, 0x0fa1   # 4001 --> _exit syscall
yann@1437
   145
+		   0000000c    syscall
yann@1437
   146
+		 */
yann@1437
   147
+		if(insn!=0x0000000c){
yann@1437
   148
+			return 0;
yann@1437
   149
+		}
yann@1437
   150
+
yann@1437
   151
+		*sysnum = (num & 0xFFFF) - 4000;
yann@1437
   152
+		/* if it is a syscall, return 1 or 2 */
yann@1437
   153
+		if (proc->callstack_depth > 0 &&
yann@1437
   154
+				proc->callstack[proc->callstack_depth - 1].is_syscall &&
yann@1437
   155
+				proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
yann@1437
   156
+			return 2;
yann@1437
   157
+		}
yann@1437
   158
+
yann@1437
   159
+		if (*sysnum >= 0) {
yann@1437
   160
+			return 1;
yann@1437
   161
+		}
yann@1437
   162
+	}
yann@1437
   163
 	return 0;
yann@1437
   164
 }
yann@1437
   165
 /**
yann@1437
   166
@@ -119,34 +120,34 @@
yann@1437
   167
 */
yann@1437
   168
 long
yann@1437
   169
 gimme_arg(enum tof type, Process *proc, int arg_num, arg_type_info *info) {
yann@1437
   170
-    long ret;
yann@1437
   171
-    debug(2,"type %d arg %d",type,arg_num);
yann@1437
   172
-    if (type == LT_TOF_FUNCTION || type == LT_TOF_SYSCALL){
yann@1437
   173
-        if(arg_num <4){
yann@1437
   174
-            ret=ptrace(PTRACE_PEEKUSER,proc->pid,off_a0+arg_num,0);
yann@1437
   175
-            debug(2,"ret = %#lx",ret);
yann@1437
   176
-            return ret;
yann@1437
   177
-        } else {
yann@1437
   178
-            // If we need this, I think we can look at [sp+16] for arg_num==4.
yann@1437
   179
-            CP;
yann@1437
   180
-            return 0;
yann@1437
   181
-        }
yann@1437
   182
-    } 
yann@1437
   183
-    if(arg_num>=0){
yann@1437
   184
-       fprintf(stderr,"args on return?");
yann@1437
   185
-    }
yann@1437
   186
-    if(type == LT_TOF_FUNCTIONR) {
yann@1437
   187
-        return  ptrace(PTRACE_PEEKUSER,proc->pid,off_v0,0);
yann@1437
   188
-    }
yann@1437
   189
-    if (type == LT_TOF_SYSCALLR) {
yann@1437
   190
-        unsigned a3=ptrace(PTRACE_PEEKUSER, proc->pid,off_a3,0);
yann@1437
   191
-        unsigned v0=ptrace(PTRACE_PEEKUSER, proc->pid,off_v0,0);
yann@1437
   192
-        if(!a3){
yann@1437
   193
-            return v0;
yann@1437
   194
-        }
yann@1437
   195
-        return -1;
yann@1437
   196
-    }
yann@1437
   197
-    fprintf(stderr, "gimme_arg called with wrong arguments\n");
yann@1437
   198
+	long ret;
yann@1437
   199
+	debug(2,"type %d arg %d",type,arg_num);
yann@1437
   200
+	if (type == LT_TOF_FUNCTION || type == LT_TOF_SYSCALL){
yann@1437
   201
+		if(arg_num <4){
yann@1437
   202
+			ret=ptrace(PTRACE_PEEKUSER,proc->pid,off_a0+arg_num,0);
yann@1437
   203
+			debug(2,"ret = %#lx",ret);
yann@1437
   204
+			return ret;
yann@1437
   205
+		} else {
yann@1437
   206
+			// If we need this, I think we can look at [sp+16] for arg_num==4.
yann@1437
   207
+			CP;
yann@1437
   208
+			return 0;
yann@1437
   209
+		}
yann@1437
   210
+	} 
yann@1437
   211
+	if(arg_num>=0){
yann@1437
   212
+		fprintf(stderr,"args on return?");
yann@1437
   213
+	}
yann@1437
   214
+	if(type == LT_TOF_FUNCTIONR) {
yann@1437
   215
+		return  ptrace(PTRACE_PEEKUSER,proc->pid,off_v0,0);
yann@1437
   216
+	}
yann@1437
   217
+	if (type == LT_TOF_SYSCALLR) {
yann@1437
   218
+		unsigned a3=ptrace(PTRACE_PEEKUSER, proc->pid,off_a3,0);
yann@1437
   219
+		unsigned v0=ptrace(PTRACE_PEEKUSER, proc->pid,off_v0,0);
yann@1437
   220
+		if(!a3){
yann@1437
   221
+			return v0;
yann@1437
   222
+		}
yann@1437
   223
+		return -1;
yann@1437
   224
+	}
yann@1437
   225
+	fprintf(stderr, "gimme_arg called with wrong arguments\n");
yann@1437
   226
 	return 0;
yann@1437
   227
 }
yann@1437
   228
 
yann@1437
   229
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/x86_64/trace.c
yann@1437
   230
+++ ltrace-0.5.2/sysdeps/linux-gnu/x86_64/trace.c
yann@1437
   231
@@ -41,7 +41,8 @@
yann@1437
   232
 		*sysnum = ptrace(PTRACE_PEEKUSER, proc->pid, 8 * ORIG_RAX, 0);
yann@1437
   233
 
yann@1437
   234
 		if (proc->callstack_depth > 0 &&
yann@1437
   235
-		    proc->callstack[proc->callstack_depth - 1].is_syscall) {
yann@1437
   236
+				proc->callstack[proc->callstack_depth - 1].is_syscall &&
yann@1437
   237
+				proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
yann@1437
   238
 			return 2;
yann@1437
   239
 		}
yann@1437
   240