在我运行可执行文件之后,我用新版本覆盖其.so库文件,这会导致可执行文件因为分段错误而死亡。我以为只有在加载ELF文件时才访问库文件。我错了吗?
答案 0 :(得分:11)
库文件在加载时会被映射到内存中(通常,在加载可执行文件时 - 但是稍后也可以使用dlopen()
加载库)。然后根据需要加载文件的实际页面。
覆盖文件将导致文件映射MAP_SHARED
(其中大部分)的页面使用新内容进行更新。这是导致分段错误的原因。不要这样做 - 而是删除现有的.so文件,然后在其中写下新文件。
答案 1 :(得分:2)
正如caf所说,在可执行文件运行时覆盖它并不是一个好主意。
相反,将新文件作为临时文件写入同一目录,然后使用rename()以原子方式重命名。这就是安装人员通常所做的事情。