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
DDDoriginal
2024-10-26 11:14:021055parcourir

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
  • -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@

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