Maison > développement back-end > C++ > Pourquoi mon programme C avec liaison statique et Pthreads entraîne-t-il une erreur de segmentation ?

Pourquoi mon programme C avec liaison statique et Pthreads entraîne-t-il une erreur de segmentation ?

DDD
Libérer: 2024-10-26 11:14:02
original
1117 Les gens l'ont consulté

Why Does My C   Program With Static Linking and Pthreads Result in a Segmentation Fault?

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 :

  1. 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.
  2. 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.
  3. 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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal