- 论坛徽章:
- 0
|
Hi ALL,
小弟最近在ARM平台的uclinux系统上写程序,发现了一个问题,在这里和大家共享一下,希望能得到大家的帮助!先谢啦!
问题描述:我在程序中通过vfork产生一个子进程,在子进程中通过exec函数族加载执行一个新的executable,暂且把这个新executable叫做B,B中有一个大的全局数组,所以导致其bss段很大,execve执行B时,kernel加载B失败,按理exec应该返回错误,但是现在exec没有返回,其在kernel中的call chain如下:
sys_execve()->do_execve()->search_binary_handler()->load_flat_binary()->load_flat_file()...
通过debug,现在基本上确定导致exec不返回的代码是在load_flat_file()中,代码如下:
===================================================
/* Flush all traces of the currently running executable */
if (id == 0) {
result = flush_old_exec(bprm);
if (result) {
ret = result;
goto err;
}
/* OK, This is the point of no return */
set_personality(PER_LINUX_32BIT);
}
==========================================================
在上面这段代码后面,就是do_mmap() for text, data/bss section了,而我的程序B就是在do_mmap() for data/bss时因内存不够失败的。
我想知道的是:load_flat_file()返回错误后,call chain上就没有函数做一些资源释放或者rollback方面的工作吗?因为我用“ps“命令查看,B进程一直处在运行状态,但是进程名加了中括号。exec函数没有返回,使用waitpid也检测不到状态改变。 |
|