Heim  >  Artikel  >  Backend-Entwicklung  >  Warum stürzt mein C-Programm, das „pthread“ verwendet, mit einem „Segmentierungsfehler“ ab, wenn es statisch verknüpft ist, funktioniert aber einwandfrei, wenn es dynamisch verknüpft ist?

Warum stürzt mein C-Programm, das „pthread“ verwendet, mit einem „Segmentierungsfehler“ ab, wenn es statisch verknüpft ist, funktioniert aber einwandfrei, wenn es dynamisch verknüpft ist?

Linda Hamilton
Linda HamiltonOriginal
2024-11-02 00:46:02335Durchsuche

Why does my C   program using `pthread` crash with a

Wenn g statischer Link pthread, Ursache Segmentierungsfehler, warum?

Dieses C-Programm, wenn es dynamisch mit -pthread -o verknüpft wird, eins eins .cpp -Wall -std=c 11 -O3, läuft ohne Probleme. Bei einer statischen Verknüpfung mit -pthread -o one one.cpp -Wall -std=c 11 -O3 -static stürzt es jedoch mit einem „Segmentierungsfehler“ ab.

Verstehen des Problems

Bei Verwendung von -pthread verknüpft der Compiler automatisch die pthread-Bibliothek. Beim statischen Verknüpfen müssen Sie jedoch explizit -lpthread angeben, um die pthread-Bibliothek einzuschließen.

Schwache Symbole

Unter Unix verwendet das ELF-Dateiformat das Konzept von schwache Symbole, die beim Verknüpfen durch starke Symbole überschrieben werden können. Glibc und pthread verwenden schwache Symbole für Funktionen, die optional durch optimierte Versionen ersetzt werden können.

In diesem Fall stellt Glibc schwache Symbole für Synchronisierungsfunktionen wie __pthread_mutex_lock bereit. Wenn pthread dynamisch verknüpft wird, werden die schwachen Symbole durch starke Symbole von pthread ersetzt.

Statische Verknüpfung und schwache Symbole

Während der statischen Verknüpfung stoppt der Linker bei erstes Symbol, das es findet, auch wenn es ein schwaches Symbol ist. Um alle Symbole aus der pthread-Bibliothek einzuschließen, müssen Sie die Option Wl,--whole-archive verwenden, die den Linker zwingt, jede Objektdatei aus dem Archiv einzuschließen.

Lösung

Um das Problem zu beheben, verwenden Sie den folgenden Verknüpfungsbefehl:

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

Anhang: Autotools-Problemumgehung

Wenn Sie Autotools als Build-System verwenden, wird das Die folgende Problemumgehung ist erforderlich, da Automake keine Optionen in LDADD zulässt:

In configure.ac:

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)

In Makefile.am:

mytarget_LDADD = @WL_WHOLE_ARCHIVE_HACK@ -lpthread @WL_NO_WHOLE_ARCHIVE_HACK@

Das obige ist der detaillierte Inhalt vonWarum stürzt mein C-Programm, das „pthread“ verwendet, mit einem „Segmentierungsfehler“ ab, wenn es statisch verknüpft ist, funktioniert aber einwandfrei, wenn es dynamisch verknüpft ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn