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?
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!