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:
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.
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