写入Linux上执行进程的映像

时间:2011-11-11 16:42:59

标签: linux image process

如果进程B在进程A执行时将某些数据写入进程A的映像,该怎么办?它不会导致进程A正在执行的腐败吗?

我是Linux的新手。据我所知,Unix历史上并没有强制执行强制文件锁(就像Windows一样)。所以写作很有可能。

我在网上搜索没有结果。当我向Linux经验丰富的同事提出这个问题时,他们都回答过程A的图像完全在内存中。

然而,从我所读到的内容来看,内核可以轻松地将一些页面从内存交换回图像文件,例如,当内存条件受到压力时。因此,在磁盘上,某些页面可能会被另一个编写器进程损坏;之后,它们可以换回RAM并执行。

3 个答案:

答案 0 :(得分:2)

您是否正在考虑将流程写入/proc/1234/mem 1234的另一个pid_t进程?

或者您是否正在考虑将进程写入另一个进程的ELF可执行文件?

scenarii都非常罕见且特定于Linux(其他Posix没有这些),所以我不知道在这种情况下会发生什么。但至少许可机制应该保护一些。

另请参阅ETXTBSY错误。

在实践中(如strace -f /usr/bin/gcc hello.c -o hello所示),编译器和链接器在open之前删除可执行文件,以便编写可执行文件,因此大多数编译都不会写入旧的可执行文件:

870   stat("hello", {st_mode=S_IFREG|0755, st_size=6096, ...}) = 0
870   unlink("hello")                   = 0
870   open("hello", O_RDWR|O_CREAT|O_TRUNC|O_CLOEXEC, 0777) = 17
870   fstat(17, {st_mode=S_IFREG|0755, st_size=0, ...}) = 0

所以要写入可执行文件,你必须努力。当然,当你这样做时,可能会发生顽皮的崩溃。

答案 1 :(得分:1)

你读到了什么表明页面可以换回“图像文件”?

如果系统内存不足,页面将被交换到磁盘上的交换分区,这与可执行文件不同。在下次运行文件之前,写入可执行文件将无效。

如果以某种方式你能够写入交换文件上的确切页面(这将是困难的,因为你必须确切地知道数据写入磁盘的位置和时间)。如果您这样做,您可能能够修改目标代码。您是建议破坏可执行文件,还是在程序运行时更改程序的一些聪明方法?

答案 2 :(得分:1)

实际上,对于要换出的页面,没有必要具有“低内存条件”。 Linux无论如何都“按需”加载可执行文件,因此页面只在需要时加载。

但请参阅我之前的What happens when you overwrite a memory-mapped executable?

的答案