マルチスレッド (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 呼び出しを置き換えると仮定しています。それらがスレッドセーフなフードでラップされているという事実は、再入不可のもので再びラップされているため、役に立ちません。