【发布时间】:2010-10-04 12:01:06
【问题描述】:
运行可执行文件后,我用新版本覆盖其 .so 库文件,这会导致可执行文件因分段错误而死。我认为只有在加载 ELF 文件时才访问库文件。我错了吗?
【问题讨论】:
运行可执行文件后,我用新版本覆盖其 .so 库文件,这会导致可执行文件因分段错误而死。我认为只有在加载 ELF 文件时才访问库文件。我错了吗?
【问题讨论】:
库文件在加载时被映射到内存中(通常是在加载可执行文件时 - 但库也可以稍后使用dlopen() 加载)。然后根据需要按需加载文件的实际页面。
覆盖文件将导致映射MAP_SHARED 的文件中的页面(大部分)使用新内容进行更新。这就是导致分段错误的原因。不要那样做 - 而是删除现有的 .so 文件,然后在其位置写入新文件。
【讨论】:
就像 caf 所说,在运行时覆盖可执行文件并不是一个好主意。
相反,将新文件作为临时文件写入同一目录中,然后使用 rename() 自动重命名。这是安装人员通常会做的事情。
【讨论】: