Электрический забор с резьбой
Я работаю над многопоточным (основанным на 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 не поддерживает многопоточность?
Редактировать: В основном я предполагаю, что библиотека электрического забора заменяет вызовы malloc / free обычного libc. Тот факт, что они были обернуты с защитой от ниток, бесполезен, так как они снова обернуты не реентерабельным материалом.
3 ответа
Проверьте поставьте эти два - у него определенно была проблема с phthread ( https://bugzilla.redhat.com/show_bug.cgi?id=54368), но недавно кто-то требовал исправления ( http://www.mail-archive.com/debian-bugs-closed@lists.debian.org/msg280548.html) Обратите внимание также на упоминание еще одного отложенного патча.
Чтобы проверить это, я связал его с -lefence, и он дал мне SIGSEGV. После большого количества времени, потраченного на выяснение того, что не так, я, наконец, решил поискать ошибку в библиотеке, даже если ее функциональность чрезвычайно проста.
Я знаю только концепцию Electric fence, но вы должны сразу заметить, где происходит переполнение буфера:
gcc ... -g ;
gdb a.out ;
run
**Program received signal SIGSEGV, Segmentation fault.
address in function () from file.c**
и есть ваше переполнение!