我有一个程序,它使用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就会快乐地前进.它报告没有内存泄漏,事实上,不可能的事情并没有发生.

推荐答案

这可能与我go 年4月修复的一个问题是一样的.试试最近的Valgrind.

commit 5f83395616befb96af66ec2cc7f4330605271faf
Author: Paul Floyd <redacted>
Date:   Sun Apr 10 20:55:28 2022 +0200

    Fix a crash handling fexecve.
    
    Found this by testing the Solaris execx (the bits that are
    Linux-cmpatible) test. That was giving
    
    --28286-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting
    --28286-- si_code=2;  Faulting address: 0x4A0095A;  sp: 0x1002ca9c88
    
    valgrind: the 'impossible' happened:
       Killed by fatal signal
    
    host stacktrace:
    ==28286==    at 0x5803DE54: vgPlain_strcpy (m_libcbase.c:309)
    ==28286==    by 0x5810A9B3: vgSysWrap_linux_sys_execveat_before (syswrap-linux.c:13310)
    ==28286==    by 0x580953C9: vgPlain_client_syscall (syswrap-main.c:2234)
    
    It's a mistake to copy the path obtained with VG_(resolve_filename) to
    the client ARG2, it's unlikely to have space for the path.
    
    Instead just copy the pointer.

C++相关问答推荐

为指针 struct 创建宏

为什么PLT表中没有push指令?

了解一些CLIPS原语数据类型

什么C代码将确定打开的套接字正在使用的网络适配器?

为什么复合文字(C99)的返回会生成更多的汇编代码?

在C中使用JMP_buf数组进行线程化(在xv6中测试)

C:scanf(%d&q;,...)输入只有一个减号

增加getaddrinfo返回的IP地址数量

C:二进制搜索和二进制插入

ESP32在vTaskDelay上崩溃

当我更改编译优化时,相同的C代码以不同的方式运行

如何在CANbus RX/TX FIFO起始地址寄存器(ATSAME 51)的特定地址初始化数组?

S将C语言宏定义为自身的目的是什么?(在glibc标题中看到)

如何在GDB中查看MUSL的源代码

如何读取文件并将内容保存在字符串中?(在C语言中,没有崩溃或核心转储错误)

类型定义 struct 与简单的类型定义 struct

C:Assignment中的链表赋值从指针目标类型中丢弃‘const’限定符

从不兼容的指针类型返回&&警告,但我看不出原因

根据输入/输出将 C 编译过程分为预处理、编译、汇编和链接步骤

`void foo(int a[static 0]);` 有效吗?