ホームページ  >  記事  >  バックエンド開発  >  pthread を g に静的にリンクするとセグメンテーション違反が発生するのはなぜですか?それを修正するにはどうすればよいですか?

pthread を g に静的にリンクするとセグメンテーション違反が発生するのはなぜですか?それを修正するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-25 20:05:29736ブラウズ

Why does statically linking pthread with g   cause a segmentation fault, and how can I fix it?

pthread を静的にリンクするときに g によってセグメンテーション違反が発生するのはなぜですか?

解決策:

この問題を解決するには、次のようにします。次のコマンドを使用します:

g++ -o one one.cpp -Wall -std=c++11 -O3 -static -lrt -pthread \
    -Wl,--whole-archive -lpthread -Wl,--no-whole-archive

問題の理解:

弱いシンボルを使用しているため、pthread への静的リンクには特定のアプローチが必要です。

弱いシンボル

ELF ファイル (Unix で使用) は、強いシンボルと弱いシンボルを区別します:

  • Strong: 同じ名前の弱いシンボルをオーバーライドできます。
  • 弱い: 強いシンボルによってオーバーライドできますが、他の弱いシンボルによってはオーバーライドできません。

pthread と弱いシンボル

GLIBC と pthreadスレッドセーフティ機能には弱いシンボルを使用します。弱いシンボルのバージョンは静的ライブラリで定義され、強いシンボルのバージョンは動的ライブラリで定義されます。動的リンクの場合は強いシンボルが使用されますが、静的リンクの場合は弱いシンボルを強いバージョンに置き換える必要があります。

-Wl,--whole-archive および -Wl,--no- の使用Whole-archive

静的にリンクする場合、リンカーはアーカイブ内の最初のシンボルを見て検索を停止します。 -Wl,--whole-archive フラグは、リンカに弱いシンボルを含むアーカイブ内のすべてのシンボルを強制的に調べます。 -Wl,--no-whole-archive フラグは、後続のアーカイブに対してこのオプションをオフにします。

これらのフラグを使用すると、pthread 関数の強力なシンボル バージョンが実行可能ファイルに含まれるようになり、弱いシンボルによって引き起こされるセグメンテーション違反の問題。

以上がpthread を g に静的にリンクするとセグメンテーション違反が発生するのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。