gpt4 book ai didi

unix - 重新编译二进制文件时出现总线错误

转载 作者:行者123 更新时间:2023-12-03 15:40:06 25 4
gpt4 key购买 nike

有时,在各种 Unix 架构上,在程序运行时重新编译程序会导致程序崩溃并出现“总线错误”。谁能解释在什么情况下会发生这种情况?首先,更新磁盘上的二进制文件如何影响内存中的代码?我唯一能想到的是,有些系统会将代码mmap到内存中,当编译器重写磁盘镜像时,这会导致mmap失效。这种方法的优点是什么?通过更改可执行文件来使正在运行的代码崩溃似乎不太理想。

最佳答案

在本地文件系统上,所有主要的类 Unix 系统都支持通过删除文件来解决这个问题。旧的 vnode 保持打开状态,即使在目录条目消失然后重新用于新图像之后,旧文件仍然存在,未更改,现在未命名,直到最后一次引用它(在本例中为内核)消失.

但是如果你只是开始重写它,那么是的,它是 mmap(3) 的。当 block 被重写时,根据动态链接器使用的 mmap(3) 选项,可能会发生以下两种情况之一:

  1. 内核将使相应的页面无效,或者
  2. 磁盘镜像会改变,但现有的内存页面不会

无论哪种方式,正在运行的程序都可能有问题。在第一种情况下,它基本上肯定会崩溃,而在第二种情况下,除非所有页面都已被引用、调入并且永远不会被删除,否则它将被破坏。

有两个 mmap 标志旨在解决这个问题。一种是 MAP_DENYWRITE(防止写入),另一种是 MAP_COPY,它保留了原始版本并防止写入者更改映射图像。

但出于安全原因,DENYWRITE 已被禁用,并且 COPY 未在任何主要的类 Unix 系统中实现。

关于unix - 重新编译二进制文件时出现总线错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5263213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com