首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制另一个进程的内存映射

控制另一个进程的内存映射
EN

Stack Overflow用户
提问于 2014-05-12 19:38:03
回答 1查看 1.7K关注 0票数 3

是否有可能在Linux中更改另一个进程的内存映射?相反,也就是说,只能通过在调用mmap的进程中运行的代码来控制它。

我之所以问这个问题,是因为我希望能够用一个非常自定义的内存映射来构建一个进程,而且如果不能使用共享库甚至vDSO,我就看不到在流程本身中有什么方法可以做到这一点--基本上不需要编写自己的libc来处理syscall之类的问题。(即使我静态地链接libc,它不会尝试使用vDSO吗?)

EN

回答 1

Stack Overflow用户

发布于 2014-05-12 23:04:29

mmap映射内存由fork保存,但由exec家族的系统调用擦除,因此这不能由经典的序列fork完成,然后是exec

一个简单的解决方案是使用LD_PRELOAD钩子。让我们将这些代码放在add_mmap.c中。

代码语言:javascript
复制
#include <sys/mman.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void add_mmap(void) __attribute__((constructor));

void add_mmap(void)
{
    int fd;
    void *addr;

    printf("calling mmap() before main...\n");
    fd = open("/etc/passwd", O_RDONLY);
    printf("fd=%d\n", fd);
    /* map the first 100 bytes of the file to an address chosen by the kernel */
    addr = mmap(0, 100, PROT_READ, MAP_SHARED, fd, 0);
    printf("addr=%llx\n", (long long unsigned)addr);
}

然后,将其构建为动态库:

代码语言:javascript
复制
gcc -Wall -g -fPIC -shared -o add_mmap.so add_mmap.c

最后使用它运行一些现有的程序:

代码语言:javascript
复制
$ LD_PRELOAD=./add_mmap.so /bin/cat 
calling mmap() before main...
fd=3
addr=7fe4916f8000

在运行cat之前,我们可以检查映射是否已经设置和保存:

代码语言:javascript
复制
$ cat /proc/27967/maps
...
7f2f7f2d0000-7f2f7f2d1000 r--s 00000000 09:00 1056387                    /etc/passwd
...

编辑

我在这里只展示了如何在程序启动之前添加内存映射,但是我的示例可以很容易地扩展到在程序中透明地注入一个“内存管理器”线程。该线程将通过IPC机制(如套接字)接收订单,并相应地操作映射。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23617448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档