我正在制作一个使用 .so 库的程序(也是由我开发的)。我希望能够在开发 .so 时更新并重新部署它,而无需重新启动使用它的程序。我已经在我的系统(Ubuntu 15.04)上演示了 dlopen、dlsym 和 dlclose 可以让这种情况发生在我身上,如果我替换文件,关闭旧库,通过相同的文件路径打开新版本,然后重新加载符号(s) 我需要。但是如果我也想保持旧版本打开怎么办?
我想我可以通过对 N 个版本的库使用 N 个不同的文件路径来实现这一点,尽管我还没有尝试过。但我更愿意使用相同的路径。但我无法让它发挥作用。如果我这样做:
- dlopen 旧的 .so
- dl符号
- 从程序外部,rm .so 并将其替换为更新的版本
- dlopen .so(这次想要获取新版本的句柄)
- dl符号
...然后我似乎最终得到了同一个库句柄的两个副本,大概现在必须 dlclose 两次,因为它的引用计数已增加。我在第 5 步中从 dlsym 获取了旧版本的内容。因此 dlopen 没有看到我的新文件。我猜它的引用计数机制是按路径或其他方式对文件进行索引,而不是按其内容?我想,它尝试通过检查库的内容来识别库是非常奇怪的。
我可以做我想做的事,还是只需要使用两个不同的文件路径?在这种情况下这不是什么大问题,但我很好奇。并且 dlopen 手册页似乎没有指定 dlopen 使用什么逻辑来决定您正在打开的库是否是您已经打开的库。