tags 459820 + patch kthxbye Patch attached that reawakens some disabled strace code. Output of testcase is now:
<snip> write(1, "--------------------\n", 21-------------------- ) = 21 [ Process PID=9059 runs in 32 bit mode. ] fork([i am 9060] ) = 9060 --- SIGCHLD (Child exited) @ 0 (0) --- [ Process PID=9059 runs in 64 bit mode. ] getpid() = 9059 write(1, "[i am 9059]\n", 12[i am 9059] ) = 12 exit_group(0) = ? Process 9059 detached Regards, -- Chris Lamb, UK [EMAIL PROTECTED] GPG: 0x634F9A20
--- syscall.c.orig 2008-01-11 08:51:23.000000000 +0000 +++ syscall.c 2008-01-11 08:52:40.000000000 +0000 @@ -944,34 +944,13 @@ return -1; if (!(tcp->flags & TCB_INSYSCALL)) { - static int currpers=-1; - long val; - - /* Check CS register value. On x86-64 linux it is: - * 0x33 for long mode (64 bit) - * 0x23 for compatibility mode (32 bit) - * It takes only one ptrace and thus doesn't need - * to be cached. - */ - if (upeek(pid, 8*CS, &val) < 0) - return -1; - switch(val) - { - case 0x23: currpers = 1; break; - case 0x33: currpers = 0; break; - default: - fprintf(stderr, "Unknown value CS=0x%02X while " - "detecting personality of process " - "PID=%d\n", (int)val, pid); - currpers = current_personality; - break; - } -#if 0 - /* This version analyzes the opcode of a syscall instruction. + /* Analyze the opcode of a syscall instruction. * (int 0x80 on i386 vs. syscall on x86-64) * It works, but is too complicated. */ - unsigned long val, rip, i; + static int currpers=-1; + unsigned long call; + long rip; if(upeek(pid, 8*RIP, &rip)<0) perror("upeek(RIP)"); @@ -998,7 +977,6 @@ "PID=%d\n", (int)call, pid); break; } -#endif if(currpers != current_personality) { char *names[]={"64 bit", "32 bit"};
signature.asc
Description: PGP signature