我正在开发一个多线程(基于 pthread)的项目。该项目使用我正在编写的库。
为了检查它,我将它与它联系起来-lefence
,它给了我 SIGSEGV。在花了很多时间找出问题所在之后,我终于决定在库中搜索错误,即使它的功能非常简单。
作为测试,我尝试编译链接的测试单元-lefence
,我得到了 SIGSEGV。测试不会弄乱动态分配的内存,但在不同测试单元中成功的代码除外。
我还注意到该-pthread
标志将内存分配设置为已包装。gcc -dumpspecs | grep pthread
产生以下内容:
%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}
%{pthread:-lpthread} %{shared:-lc} %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}}
%{static: %{fmudflap|fmudflapth: --wrap=malloc --wrap=free --wrap=calloc --wrap=realloc --wrap=mmap --wrap=munmap --wrap=alloca} %{fmudflapth: --wrap=pthread_create}} %{fmudflap|fmudflapth: --wrap=main}
libefence 是否不支持多线程?
编辑:基本上我假设电子围栏库取代了常规 libc 的 malloc/free 调用。他们已经用线程安全的引擎盖包裹的事实是没有用的,因为他们已经用不可重入的东西再次包裹了。