静的リンクと Pthread を使用した C プログラムでセグメンテーション違反が発生するのはなぜですか?

DDD
リリース: 2024-10-26 11:14:02
オリジナル
965 人が閲覧しました

Why Does My C   Program With Static Linking and Pthreads Result in a Segmentation Fault?

静的リンク Pthread の場合、セグメンテーション違反が発生する: 説明と解決策

問題:

g と、pthread ライブラリに対してリンクする -pthread フラグを使用して C プログラムをコンパイルすると、静的 (-static) に、プログラムでセグメンテーション違反が発生します。

説明:

  1. 弱いシンボル:

    • pthread と libstdc は、pthread_mutex_lock() などの特定の関数に弱いシンボルを使用します。
    • 弱いシンボルは、リンク中に強いシンボルに置き換えることができます。
  2. 動的リンクと静的リンク:

    • 動的リンクリンクでは、弱いシンボルは共有ライブラリから解決されます。
    • 静的リンクでは、リンカーは最初のシンボル (弱いシンボルを含む) で停止し、強いシンボルは検索しません。
  3. 不完全なリンク解決:

    • -static を使用する場合、リンカは最初に弱いシンボルに遭遇するため、pthread ライブラリのすべてのシンボルを考慮しません。 .
    • そのため、pthread_mutex_lock() の強力なシンボルは使用されません。

解決策:

リンカーが静的にリンクされたプログラム内の pthread ライブラリからすべてのシンボルを参照するように強制するには、次を使用します。

g++ -o one one.cpp -Wall -std=c++11 -O3 -static -pthread \
    -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
ログイン後にコピー
  • -Wl,--whole-archive: すべてのオブジェクトが含まれます指定されたアーカイブ内のファイル。
  • -lpthread: pthread ライブラリに対するリンク。
  • -Wl,--no-whole-archive:後続のアーカイブのアーカイブ全体オプションを無効にします。

追加メモ:

  • 一部のシステムでは、librt の -lrt などの追加のフラグが必要な場合があります。 .
  • Autotools を使用している場合は、configure.ac でフラグを定義し、Makefile.am でそれらを置き換えます。例:
WL_WHOLE_ARCHIVE_HACK="-Wl,--whole-archive"
WL_NO_WHOLE_ARCHIVE_HACK="-Wl,--no-whole-archive"
AC_SUBST(WL_WHOLE_ARCHIVE_HACK)
AC_SUBST(WL_NO_WHOLE_ARCHIVE_HACK)

mytarget_LDADD = @WL_WHOLE_ARCHIVE_HACK@ -lpthread @WL_NO_WHOLE_ARCHIVE_HACK@
ログイン後にコピー

以上が静的リンクと Pthread を使用した C プログラムでセグメンテーション違反が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!