Я работаю над многопоточным (основанным на 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 не поддерживает многопоточность?
Редактировать: По сути, я предполагаю, чтобиблиотека fence заменяет вызовы malloc / free обычного libc.Тот факт, что они были обернуты в поточно-защитный колпак, бесполезен, поскольку они снова обернуты материалом, не предназначенным для повторного использования.