解決策:
この問題を解決するには、次のようにします。次のコマンドを使用します:
g++ -o one one.cpp -Wall -std=c++11 -O3 -static -lrt -pthread \ -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
問題の理解:
弱いシンボルを使用しているため、pthread への静的リンクには特定のアプローチが必要です。
ELF ファイル (Unix で使用) は、強いシンボルと弱いシンボルを区別します:
GLIBC と pthreadスレッドセーフティ機能には弱いシンボルを使用します。弱いシンボルのバージョンは静的ライブラリで定義され、強いシンボルのバージョンは動的ライブラリで定義されます。動的リンクの場合は強いシンボルが使用されますが、静的リンクの場合は弱いシンボルを強いバージョンに置き換える必要があります。
静的にリンクする場合、リンカーはアーカイブ内の最初のシンボルを見て検索を停止します。 -Wl,--whole-archive フラグは、リンカに弱いシンボルを含むアーカイブ内のすべてのシンボルを強制的に調べます。 -Wl,--no-whole-archive フラグは、後続のアーカイブに対してこのオプションをオフにします。
これらのフラグを使用すると、pthread 関数の強力なシンボル バージョンが実行可能ファイルに含まれるようになり、弱いシンボルによって引き起こされるセグメンテーション違反の問題。
以上がpthread を g に静的にリンクするとセグメンテーション違反が発生するのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。