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
Hier ist, was passiert:
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!