Heim  >  Artikel  >  Backend-Entwicklung  >  Warum verursacht die statische Verknüpfung von pthread mit g einen Segmentierungsfehler und wie kann ich ihn beheben?

Warum verursacht die statische Verknüpfung von pthread mit g einen Segmentierungsfehler und wie kann ich ihn beheben?

DDD
DDDOriginal
2024-10-25 20:05:29736Durchsuche

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

Warum verursacht g einen Segmentierungsfehler, wenn pthread statisch verknüpft wird?

Die Lösung:

Um dieses Problem zu beheben, Verwenden Sie den folgenden Befehl:

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

Das Problem verstehen:

Die statische Verknüpfung mit pthread erfordert aufgrund der Verwendung schwacher Symbole einen bestimmten Ansatz.

Schwache Symbole

ELF-Dateien (in Unix verwendet) unterscheiden zwischen starken und schwachen Symbolen:

  • Stark: Kann schwache Symbole mit demselben Namen überschreiben.
  • Schwach:Kann von starken Symbolen überschrieben werden, aber nicht von anderen schwachen Symbolen.

pthread und schwache Symbole

GLIBC und pthread Verwenden Sie schwache Symbole für Thread-Sicherheitsfunktionen. Die schwachen Symbolversionen werden in den statischen Bibliotheken definiert, während die starken Symbolversionen in den dynamischen Bibliotheken definiert werden. Bei der dynamischen Verlinkung werden die starken Symbole verwendet, bei der statischen Verlinkung müssen die schwachen Symbole jedoch durch die starken Versionen ersetzt werden.

Verwendung von -Wl,--whole-archive und -Wl,--no- Whole-Archive

Beim statischen Linken schaut der Linker auf das erste Symbol in einem Archiv und stoppt die Suche. Das Flag -Wl,--whole-archive zwingt den Linker, alle Symbole im Archiv zu betrachten, einschließlich der schwachen Symbole. Das Flag -Wl,--no-whole-archive deaktiviert diese Option für nachfolgende Archive.

Durch die Verwendung dieser Flags stellen Sie sicher, dass die starken Symbolversionen der pthread-Funktionen in der ausführbaren Datei enthalten sind, wodurch das Problem behoben wird Segmentierungsfehlerproblem durch schwache Symbole.

Das obige ist der detaillierte Inhalt vonWarum verursacht die statische Verknüpfung von pthread mit g einen Segmentierungsfehler und wie kann ich ihn beheben?. 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