使用 Valgrind 运行时 mmap 返回 EINVAL

2024-01-01

我针对 Valgrind 运行的 mips32 应用程序在 mmap 函数中失败。如果我单独运行它工作正常,但是当我针对 valgrind 运行它时,它每次都会失败并显示 EINVAL。

   void * mem = (uint32_t *)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, <fd>,
                                 mmap_size);

当客户端应用程序针对 Valgrind 运行时,Valgrind 会拦截客户端发出的 mmap 调用。然后,它通过设置 MAP_FIXED 标志来调用内核的 mmap 函数,并指定要映射的内存位置。然后内核将尝试映射到这个建议的内存。当建议的位置不可用于映射时,内核将返回失败 (EINVAL),因为设置了 MAP_FIXED 标志。上面的函数调用将被翻译成,

void * mem = (uint32_t *)mmap( advised_memory, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, <fd>,
                                               mmap_size);

您可以修改 Valgrind 的 mmap 函数来修复此行为。删除 MAP_FIXED 标志并重试 mmap,而不指定建议的内存地址。

--- .coregrind/m_syswrap/syswrap-mips32-linux.c 2014-09-08 13:28:45.000000000 +0100
+++ coregrind/m_syswrap/syswrap-mips32-linux.c 2014-11-19 12:12:43.000000000 +0000
@@ -452,10 +452,11 @@
/* Otherwise we're OK (so far). Install aspacem's choice of
address, and let the mmap go through. */
sres = VG_(am_do_mmap_NO_NOTIFY)(advised, arg2, arg3,
- arg4 | VKI_MAP_FIXED,
+ arg4,
arg5, arg6);

- /* A refinement: it may be that the kernel refused aspacem's choice
+
+ /* A refinement: it may be that the kernel refused aspacem's choice
of address. If we were originally asked for a hinted mapping,
there is still a last chance: try again at any address.
Hence: */
@@ -470,10 +471,20 @@
}
/* and try again with the kernel */
sres = VG_(am_do_mmap_NO_NOTIFY)(advised, arg2, arg3,
- arg4 | VKI_MAP_FIXED,
+ arg4,
+ arg5, arg6);
+
+ if( sr_isError(sres) )
+ sres = VG_(am_do_mmap_NO_NOTIFY)(NULL, arg2, arg3,
+ arg4,
arg5, arg6);
}

+ if( sr_isError(sres) )
+ sres = VG_(am_do_mmap_NO_NOTIFY)(NULL, arg2, arg3,
+ arg4,
+ arg5, arg6);
+ 
if (!sr_isError(sres)) {
ULong di_handle;
/* Notify aspacem. */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Valgrind 运行时 mmap 返回 EINVAL 的相关文章

随机推荐