C ++ - 动态加载行为

时间:2013-10-18 14:17:12

标签: c++ linux g++

我用c ++共享库代码。我正在用更新的c ++函数替换现有的c ++共享库。但是应用程序没有执行最新的代码路径,而是通过前面的代码路径,即我在新库中添加了一个带有附加消息的打印,但是我得到的打印来自之前的。

我已经使用strings命令来检查更改是否反映在较新的库中,并且它给出了积极的结果。

应用程序正在使用动态加载调用来打开库。我没有应用程序代码。

Make file具有以下用于创建共享库的标志。

${CXX}  -shared -Wl,--exclude-libs,ALL,-soname,${LIB} ${LDFLAGS} -o $@ $(OBJECTS)

我缺少任何共享库标志吗?

有人知道这种奇怪的行为吗?

PS:我在嵌入式环境中运行它。

1 个答案:

答案 0 :(得分:0)

我在这里假设一些事情:

1。您尚未使用“ - L”选项将共享库与可执行文件相关联。这永远不会卸载您的共享库。

2。使用 dlopen

在运行时打开库

运行时库交换只有在提到的2点适合您时才能工作。当打开共享库(使用dlopen)时,它会加载到程序的内存中。因此,即使您从磁盘中删除了库(在加载之后),程序仍将继续运行。

当你调用 dlclose 时,“减少动态的引用计数 库句柄。如果引用计数降至零并且 没有其他加载的库在其中使用符号,然后是动态库 已卸载。“(来自手册页

那么,你应该做什么来实现“刷新库机制”是用dlclose关闭现有的库并用dlopen重新加载你的新库(确保新库的符号名称与旧库的符号名称相同)和访问过的符号将是新库。

因此,必须在程序中支持此类内容,或最终使用诸如 LD_PRELOAD 之类的脏黑客,这将在原始库之前预先加载您的库。但那是我认为你不想要的另一件事。