Lorsque des liens statiques Pthread provoquent un défaut de segmentation : explication et solution
Problème :
Lors de la compilation d'un programme C avec g et l'indicateur -pthread pour établir une liaison avec la bibliothèque pthread, mais de manière statique (-static), le programme rencontre un défaut de segmentation.
Explication :
-
Symboles faibles :
- pthread et libstdc utilisent des symboles faibles pour certaines fonctions, telles que pthread_mutex_lock().
- Les symboles faibles peuvent être remplacés par des symboles forts lors de la liaison.
-
Lien dynamique vs. Lien statique :
- En dynamique liaison, les symboles faibles sont résolus à partir des bibliothèques partagées.
- Dans la liaison statique, l'éditeur de liens s'arrête au premier symbole (y compris les plus faibles) et ne recherche pas de symboles forts.
-
Résolution de lien incomplète :
- Lors de l'utilisation de -static, l'éditeur de liens ne prend pas en compte tous les symboles de la bibliothèque pthread, car il rencontre d'abord un symbole faible .
- Par conséquent, le symbole fort pour pthread_mutex_lock() n'est pas utilisé.
Solution :
Pour forcez l'éditeur de liens à examiner tous les symboles de la bibliothèque pthread dans un programme lié statiquement, utilisez :
g++ -o one one.cpp -Wall -std=c++11 -O3 -static -pthread \
-Wl,--whole-archive -lpthread -Wl,--no-whole-archive
Copier après la connexion
-
-Wl,--whole-archive: Inclut tous les objets fichiers dans l'archive spécifiée.
-
-lpthread : Liens vers la bibliothèque pthread.
-
-Wl,--no-whole-archive : Désactive l'option d'archive complète pour les archives suivantes.
Remarques supplémentaires :
- Certains systèmes peuvent nécessiter des indicateurs supplémentaires, tels que -lrt pour librt .
- Si vous utilisez Autotools, définissez les indicateurs dans configure.ac et remplacez-les dans Makefile.am. Par exemple :
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@
Copier après la connexion
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!