我在我正在编写的 Apache 模块中使用 dlopen() ,以便我可以为我的模块拥有一个插件系统。我发现如果我编译我的模块、编译我的插件并启动 Apache,一切都会顺利进行。

然而,如果在我完成所有这些之后,我重新编译我的插件(对插件代码进行一两个小更改),我的下一个页面加载将导致 Apache 出现段错误。每个后续请求都再次正常工作。因此,只有编译后立即加载的第一个页面才会导致段错误。

我几天来一直在尝试解决这个问题(我不太擅长 C 调试),今天,我在我的 apache 错误日志中注意到了这一点:

Inconsistency detected by ld.so: dl-close.c: 719: _dl_close: Assertion `map->l_init_called' failed!

有人知道发生了什么事吗?这是否意味着这不是我的代码并且我一直在寻找幽灵错误?我相当有信心每次调用 dlopen() 时都会调用 dlcose()。然而,当我在单进程模式下运行 apache 并开始快速刷新页面时,似乎会发生这个特定的错误/段错误。

有帮助吗?

解决方案

一些想法:

  1. 也许你打电话 dlopen() 多于一次? dl 库维护引用计数器,该计数器在每次更新时都会增加 dlopen() 所以 dlclose() 仅当 counter == 0 时才会卸载库。

  2. 您指定了吗 RTLD_NODELETE 标志为 dlopen() (假设你使用的是 Linux)?如果是, dlclose() 不会卸载您的库。

您是否尝试过调试系统调用 strace?启动 Apache,查找其 pid 并通过调用跟踪 Apache 不执行的所有系统调用 strace -p<pid>. 。也许它会让你知道发生了什么。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top