gcc -g test_execve.c Without . in PATH ================= gdb ./a.out break test_execve.c:11 n until 48 execv(ofile, argv); (gdb) s execv (path=0x80489dc "hello", argv=0x804a358) at execv.c:26 26 execv.c: No such file or directory. in execv.c dir /usr/src/kernels/eglibc/eglibc-2.13/posix/ 22 /* Execute PATH with arguments ARGV and environment from `environ'. */ 23 int 24 execv (const char *path, char *const argv[]) 25 { 26 return __execve (path, argv, __environ); 27 } (gdb) step __execve (file_name=0x80489dc "hello", argv=0x804a358, envp=0x804a378) at ../sysdeps/mach/hurd/execve.c:30 30 { (gdb) list 25 int 26 __execve (file_name, argv, envp) 27 const char *file_name; 28 char *const argv[]; 29 char *const envp[]; 30 { 31 error_t err; 32 file_t file = __file_name_lookup (file_name, O_EXEC, 0); 33 34 if (file == MACH_PORT_NULL) (gdb) p file $42 = 125 35 return -1; 36 37 /* Hopefully this will not return. */ 38 err = _hurd_exec (__mach_task_self (), file, argv, envp); [New Thread 27529.6] warning: "gnu_write_inferior vm_read failed": (os/kern) invalid address warning: "gnu_write_inferior vm_read failed": (os/kern) invalid address Can't fetch registers from thread bogus thread id 4: No such thread With . in PATH =============== export PATH=.:$PATH gdb ./a.out dir /usr/src/kernels/eglibc/eglibc-2.13/posix/ break execve.c:30 (gdb) p envp[10] $5 = 0x10265c0 "PATH=.:/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" (gdb) p file $11 = 125 [New Thread 27565.6] warning: "gnu_write_inferior vm_read failed": (os/kern) invalid address warning: "gnu_write_inferior vm_read failed": (os/kern) invalid address Can't fetch registers from thread bogus thread id 4: No such thread gdb ./a.out dir /usr/src/kernels/eglibc/eglibc-2.13/posix/ break execve.c:38 run Starting program: /home/srs/DEBs/icon/debugging_icon/a.out [New Thread 27569.5] Can't fetch registers from thread bogus thread id 4: No such thread restarting again: dir /usr/src/kernels/eglibc/eglibc-2.13/hurd/ list 34 If TASK == mach_task_self (), some ports are dealloc'd by the exec server. 35 ARGV and ENVP are terminated by NULL pointers. */ 36 error_t 37 _hurd_exec (task_t task, file_t file, 38 char *const argv[], char *const envp[]) 39 { 40 error_t err; 41 char *args, *env; 42 size_t argslen, envlen; 43 int ints[INIT_INT_MAX]; 44 mach_port_t ports[_hurd_nports]; 45 struct hurd_userlink ulink_ports[_hurd_nports]; 46 inline void free_port (unsigned int i) 47 { 48 _hurd_port_free (&_hurd_ports[i], &ulink_ports[i], ports[i]); (gdb) where #0 _hurd_exec (task=1, file=125, argv=0x804a358, envp=0x804a378) at hurdexec.c:39 ... 59 if (argv == NULL) 60 args = NULL, argslen = 0; 61 else if (err = __argz_create (argv, &args, &argslen)) 62 return err; err = 0 63 if (envp == NULL) 64 env = NULL, envlen = 0; 65<- else if (err = __argz_create (envp, &env, &envlen)) 66 goto outargs; 69 for (i = 0; i < _hurd_nports; ++i) 70 if (i == INIT_PORT_PROC && task != __mach_task_self ()) 71 { 72 /* This is another task, so we need to ask the proc server 73 for the right proc server port for it. */ 81 else 82 ports[i] = _hurd_port_get (&_hurd_ports[i], &ulink_ports[i]); gdb hang here