2008-12-15 156 views
6

我正在使用我正在编写的Apache模块中的dlopen(),以便可以为我的模块安装一个插件系统。我发现,如果我编译我的模块,编译我的插件,并启动Apache,那么一切工作都很棒。如果在完成所有这些工作之后,我重新编译了我的插件(对插件代码做了一两个小改动),我的下一页加载将导致Apache发生段错误。每个后续请求再次正常工作。因此,编译后只会立即加载第一个页面,导致段错误。_dl_close声明失败

我一直在试图解决这一几天(我不是位于C调试巨大的),今天,我在Apache的错误日志中注意到了这一点:

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

任何人有任何的想法是什么继续?这是否意味着它不是我的代码,并且我一直在寻找幻影错误?我相当有信心,每次调用dlopen()时都会调用dlcose()。然而,当我在单进程模式下运行apache并快速刷新页面时,这种特定的bug/segfault似乎发生了。

回答

5

一些想法:

  1. 也许你叫dlopen(),曾多次? dl库维护其递增每个dlopen()所以dlclose()将卸载ONLY柜台,如果== 0,

  2. 你指定dlopen()RTLD_NODELETE标志库引用计数器(假设你是在Linux上)?如果是,dlclose()将不会卸载您的库。

您是否尝试使用strace调试系统调用?启动Apache,找到它的pid并通过调用strace -p<pid>来跟踪Apache所做的所有系统调用。可能它会给你一些想法是怎么回事。

+0

感谢您的反馈!我没有使用RTLD_NODELETE。我非常确定我每次调用dlopen都会调用dllcose(尽管在代码中有明显不同的地方)。我会再检查一次。 – 2008-12-15 18:29:33