如果我在 Linux 上更改C++动态共享库,而我的可执行程序在其上使用,会发生什么

what would happened if I changed the C++ Dynamic Shared Library on Linux while my executable program using on it

本文关键字:可执行程序 什么 我的 Linux C++ 如果 共享 动态      更新时间:2023-10-16

我在Linux上有一个C++动态共享库abc.so,我的可执行程序用dlopen动态加载它,然后在使用abc.so的索引节点更改的情况下使用rm + cp的新版本覆盖abc.so,但有时也有核心转储,我意识到这可能与动态共享库上的延迟加载有关, 但我无法确认,任何人都可以帮助我找出原因?非常感谢!

如果没有自己调查的可能性,这变得具有推测性,但使用:

rm abc.so
cp new_version.so abc.so

对已加载abc.so的程序没有影响。对于与abc.so链接的程序(或使用dlopen加载它(,如果在删除文件或将文件复制到适当的位置时启动(或使用dlopen(它们,则会出现问题。核心转储很可能是结果。

更换abc.so的更好方法:

copy new_version.so to the same filesystem as abc.so (like the same directory)
mv new_version.so abc.so

这确保了始终有一个完整的abc.so版本。任何需要它的程序都会得到旧版本新版本 - 两者之间没有任何内容。