Heim > Backend-Entwicklung > C++ > Warum führt mein C-Programm mit statischer Verknüpfung und Pthreads zu einem Segmentierungsfehler?

Warum führt mein C-Programm mit statischer Verknüpfung und Pthreads zu einem Segmentierungsfehler?

DDD
Freigeben: 2024-10-26 11:14:02
Original
1047 Leute haben es durchsucht

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

Wenn g statische Links Pthread sind, was einen Segmentierungsfehler verursacht: Erklärung und Lösung

Problem:

Beim Kompilieren eines C-Programms mit g und dem Flag -pthread zum Verknüpfen mit der pthread-Bibliothek, aber statisch (-static), stößt das Programm auf einen Segmentierungsfehler.

Erklärung:

  1. Schwache Symbole:

    • pthread und libstdc verwenden schwache Symbole für bestimmte Funktionen, wie z. B. pthread_mutex_lock().
    • Schwache Symbole können beim Verlinken durch starke Symbole ersetzt werden.
  2. Dynamische Verlinkung vs. Statische Verlinkung:

    • Im dynamischen Beim Verknüpfen werden schwache Symbole aus gemeinsam genutzten Bibliotheken aufgelöst.
    • Beim statischen Verknüpfen stoppt der Linker beim ersten Symbol (einschließlich schwacher Symbole) und sucht nicht nach starken Symbolen.
  3. Unvollständige Linkauflösung:

    • Bei Verwendung von -static berücksichtigt der Linker nicht alle Symbole aus der pthread-Bibliothek, da er zuerst auf ein schwaches Symbol stößt .
    • Folglich wird das starke Symbol für pthread_mutex_lock() nicht verwendet.

Lösung:

An Erzwingen Sie, dass der Linker alle Symbole aus der pthread-Bibliothek in einem statisch verknüpften Programm betrachtet. Verwenden Sie:

g++ -o one one.cpp -Wall -std=c++11 -O3 -static -pthread \
    -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
Nach dem Login kopieren
  • -Wl,--whole-archive: Beinhaltet alle Objekte Dateien im angegebenen Archiv.
  • -lpthread: Links zur pthread-Bibliothek.
  • -Wl,--no-whole-archive: Deaktiviert die Option für das gesamte Archiv für nachfolgende Archive.

Zusätzliche Hinweise:

  • Einige Systeme erfordern möglicherweise zusätzliche Flags, z. B. -lrt für librt .
  • Wenn Sie Autotools verwenden, definieren Sie die Flags in configure.ac und ersetzen Sie sie in Makefile.am. Zum Beispiel:
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@
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum führt mein C-Programm mit statischer Verknüpfung und Pthreads zu einem Segmentierungsfehler?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage