免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3129 | 回复: 2

load executable失败,但是execle函数仍然不返回 [复制链接]

论坛徽章:
0
发表于 2011-09-20 16:18 |显示全部楼层
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也检测不到状态改变。

论坛徽章:
0
发表于 2011-09-22 16:03 |显示全部楼层
没人看俺的帖子吗?

论坛徽章:
0
发表于 2011-09-28 13:53 |显示全部楼层
这个问题解决了。在load_flat_file()函数中,当要执行的程序完全脱离了父进程之后,也即flush_old_exec()调用后,凡是有失败的地方,都要调用send_sig(SIGKILL, current, 0)杀kill掉当前的进程,这样的话,load失败的process就不会永驻内核了。

在aout/elf格式的loader中,也是这么个做法,为什么在flat格式的loader中,就没有这么做呢?不明白。有可能是kernel的一个bug。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP