Heim > Backend-Entwicklung > C++ > Warum führt die statische Verknüpfung von pthread mit g zu einem Segmentierungsfehler und wie kann ich ihn mit der Option „--whole-archive' beheben?

Warum führt die statische Verknüpfung von pthread mit g zu einem Segmentierungsfehler und wie kann ich ihn mit der Option „--whole-archive' beheben?

Barbara Streisand
Freigeben: 2024-10-27 01:57:02
Original
557 Leute haben es durchsucht

Why does statically linking pthread with g   lead to a segmentation fault, and how can I resolve it using the `--whole-archive` option?

Wenn g pthread statisch verknüpft und einen Segmentierungsfehler verursacht, warum?

Bei der statischen Verknüpfung stoppt der Linker sogar beim ersten Symbol wenn es schwach ist, und hört auf, nach starken zu suchen. Um zu erzwingen, dass alle Symbole betrachtet werden (wie es bei einer dynamisch verknüpften Bibliothek der Fall gewesen wäre), unterstützt ld die Option --whole-archive.

Der folgende Befehl funktioniert:

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

Hier ist, was passiert:

  • -pthread impliziert eine Verknüpfung mit pthread (und je nach Plattform definiert es zusätzliche Makros wie -D_REENTRANT).
  • Auch wenn -pthread eine Verknüpfung impliziert gegen -lpthread müssen Sie beim statischen Linken immer noch -lpthread explizit angeben.
  • Wl,--whole-archive zwingt den Linker, jede Objektdatei im Archiv in den Link aufzunehmen, anstatt das Archiv danach zu durchsuchen die erforderlichen Objektdateien.
  • Wl,--no-whole-archive schaltet die Wirkung der Option --whole-archive für nachfolgende Archivdateien aus.

Verstehen schwache Symbole

Das ELF-Dateiformat basiert auf dem Konzept schwacher und starker Symbole. Standardmäßig sind Symbole in einer Objektdatei stark. Beim Verknüpfen kann ein starkes Symbol ein schwaches Symbol mit demselben Namen überschreiben.

Im Fall von glibc und pthreads werden schwache Symbole verwendet. Beispielsweise muss fputc von POSIX threadsicher sein und synchronisiert werden, was kostspielig ist. In einer Single-Threaded-Umgebung möchten Sie diese Kosten nicht bezahlen. Eine Implementierung könnte daher die Synchronisationsfunktionen als leere Stubs implementieren und die Funktionen als schwache Symbole deklarieren.

Wenn später eine Multithreading-Bibliothek verknüpft wird (z. B. pthread), wird die Single-Thread-Unterstützung offensichtlich ist nicht vorgesehen. Beim Linken der Multithreading-Bibliothek kann der Linker dann die Stubs durch die echten Synchronisationsfunktionen ersetzen (definiert als starke Symbole und implementiert durch die Threading-Bibliothek).

Anwenden auf das Beispielprogramm

Die Bibliothek libc.a enthält __pthread_mutex_lock als schwaches Symbol und die Bibliothek libpthread.a enthält es als starkes Symbol. Beim dynamischen Verknüpfen ersetzt der Linker das schwache Symbol durch das starke Symbol. Bei der statischen Verknüpfung müssen Sie jedoch dieselbe Semantik erzwingen. Deshalb wird -Wl,--whole-archive -lpthread -Wl,--no-whole-archive benötigt.

Das obige ist der detaillierte Inhalt vonWarum führt die statische Verknüpfung von pthread mit g zu einem Segmentierungsfehler und wie kann ich ihn mit der Option „--whole-archive' beheben?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage