2

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

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

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

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

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

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

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

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

4

1 回答 1

0

我在这里假设一些事情:

1.您没有使用“-L”选项将共享库与可执行文件链接。这永远不会卸载您的共享库。

2. 在运行时使用dlopen打开库

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

当您调用dlclose时,它​​“减少动态库句柄句柄上的引用计数。如果引用计数降至零并且没有其他加载的库在其中使用符号,则动态库被卸载。” (来自手册页

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

因此,这些东西必须在程序中得到支持,否则最终会使用像LD_PRELOAD这样的肮脏黑客,这将在原始库之前预先加载您的库。但那是我认为你不是在寻找的另一件事。

于 2013-10-18T20:17:56.600 回答