我在我正在编写的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并开始快速刷新页面时,似乎会发生这种特殊的错误/段错误。
答案 0 :(得分:5)
一些想法:
您可能再次致电dlopen()
一次? dl
库维护引用计数器,每dlopen()
递增一次,因此dlclose()
只有在计数器== 0时才会卸载库。
您是否为RTLD_NODELETE
指定了dlopen()
标志(假设您使用的是Linux)?如果是,dlclose()
将不会卸载您的库。
您是否尝试使用strace
调试系统调用?启动Apache,找到它的pid并通过调用strace -p<pid>
跟踪Apache没有的所有系统调用。可能它会让你知道发生了什么。