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

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

我在 Linux 上有一个 C++ 动态共享库 abc.so,我的可执行程序使用 dlopen 动态加载它,然后使用新版本覆盖 abc.so rm + cp using abc.so的inode发生变化的情况下,但有时也有coredump,我意识到这可能与动态共享库的延迟加载有关,但我无法确认,任何人都可以帮我弄清楚为什么?非常感谢!

由于无法自行调查,这成为推测,但使用:

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 的完整版本总是在预期的位置。任何需要它的程序都将获得旧版本 新版本 - 两者之间没有任何区别。