Hi, I am using armv7 for openwrt development and facing a segfault caused by vfork. I have wrote a small test program with the following segments: ... pid_t child_t; if((child_t = vfork()) < 0) { printf("error!\n"); return -1; } else if(child_t == 0) { printf("in child:pid =%d\n",getpid()); sleep(2); _exit(0); } else { printf("in parent:child_t id = %d,pid = %d\n",child_t,getpid()); } ... The vfork() function always cause segfault, this is the gdb debug trace: ... (gdb) c Breakpoint 1, main (argc=1, argv=0xbefffed4) at handler.c:33 33 if((child_t = vfork()) < 0) (gdb) stepi 0x00008474 in vfork () at libpthread/nptl/sysdeps/unix/sysv/linux/arm/../../../../../../../libc/sysdeps/linux/arm/vfork.S:71 71 SAVE_PID (gdb) l 66 67 #else 68 __vfork: 69 70 #ifdef __NR_vfork 71 SAVE_PID 72 DO_CALL (vfork) 73 RESTORE_PID 74 cmn r0, #4096 75 IT(t, cc) (gdb) b libpthread/nptl/sysdeps/unix/sysv/linux/arm/../../../../../../../libc/sysdeps/linux/arm/vfork.S:72 Breakpoint 2 at 0xb6fcf930: file libpthread/nptl/sysdeps/unix/sysv/linux/arm/../../../../../../../libc/sysdeps/linux/arm/vfork.S, line 72. (gdb) disassemble 0x00008584 <+40>: bl 0x8444 <puts> => 0x00008588 <+44>: bl 0x8474 <vfork> 0x0000858c <+48>: str r0, [r11, #-12] (gdb)stepi ... (gdb) stepi 0x00008474 in vfork () at libpthread/nptl/sysdeps/unix/sysv/linux/arm/../../../../../../../libc/sysdeps/linux/arm/vfork.S:71 71 SAVE_PID (gdb) disassemble Dump of assembler code for function vfork: => 0x00008474 <+0>: add r12, pc, #0, 12 0x00008478 <+4>: add r12, r12, #8, 20 ; 0x8000 0x0000847c <+8>: ldr pc, [r12, #796]! ; 0x31c (gdb) stepi ... (gdb) disassemble Dump of assembler code for function vfork: 0x00008474 <+0>: add r12, pc, #0, 12 0x00008478 <+4>: add r12, r12, #8, 20 ; 0x8000 => 0x0000847c <+8>: ldr pc, [r12, #796]! ; 0x31c (gdb)c Continuing. Program received signal SIGSEGV, Segmentation fault. 0xffff0fe0 in ?? () (gdb) I have also found the vfork code at vfork.S: __vfork:
#ifdef __NR_vfork SAVE_PID DO_CALL (vfork) RESTORE_PID cmn r0, #4096 IT(t, cc) #if defined(__USE_BX__) bxcc lr #else movcc pc, lr #endif /* Check if vfork even exists. */ ldr r1, =-ENOSYS teq r0, r1 bne __error #endif /* If we don't have vfork, use fork. */ DO_CALL (fork) cmn r0, #4096 /* Syscall worked. Return to child/parent */ IT(t, cc) #if defined(__USE_BX__) bxcc lr #else movcc pc, lr #endif __error: b __syscall_error #endif It just seems that SAVE_PID instruction cause some problem. Could anyone help? Thanks, Qi
_______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel