我有一个程序,它使用memfd_create
将简单的Hello World二进制文件加载到内存中,然后使用write
将二进制数据写入文件.然后,我派生一个进程并呼叫fexecve
.
代码运行得很好,我得到了运行程序时所期望的常见的"Hello world"输出,所以我使用Valgrind对其进行了测试,以确保没有内存泄漏,因为它是一个更大的项目的一部分,并得到了以下Valgrind输出:
VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting.
valgrind: the 'impossible' happened:
Killed by fatal signal
at 0x495B178: fexecve
并且根本没有来自Hello_world程序的输出.
我已经try 了不同的类似exec的函数,它们都可以处理匿名文件,如fexecve(file_fd, argv, envp)
和execveat(file_fd, "", argv, envp, AT_EMPTY_PATH)
,它们都会产生相同的Valgrind段错误,但在没有的情况下可以正常工作.
然而,更有趣的是,如果我使用classic 的execve("/path/to/hello_world", argv, envp)
,Valgrind就会快乐地前进.它报告没有内存泄漏,事实上,不可能的事情并没有发生.