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