„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > 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?

Veröffentlicht am 15.11.2024
Durchsuche:642

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, was zu einem Segmentierungsfehler führt, 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

Hier ist, was passiert:

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

Was schwache Symbole versteht

Das ELF-Dateiformat hat das Konzept von schwachen und starken Symbolen. 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 verwenden sie schwache Symbole. 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.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3