Maison  >  Article  >  développement back-end  >  Pourquoi la liaison statique de pthread avec g provoque-t-elle une erreur de segmentation et comment puis-je la corriger ?

Pourquoi la liaison statique de pthread avec g provoque-t-elle une erreur de segmentation et comment puis-je la corriger ?

DDD
DDDoriginal
2024-10-25 20:05:29736parcourir

Why does statically linking pthread with g   cause a segmentation fault, and how can I fix it?

Pourquoi g provoque-t-il une erreur de segmentation lors de la liaison statique de pthread ?

La solution :

Pour résoudre ce problème, utilisez la commande suivante :

g++ -o one one.cpp -Wall -std=c++11 -O3 -static -lrt -pthread \
    -Wl,--whole-archive -lpthread -Wl,--no-whole-archive

Comprendre le problème :

La liaison statique vers pthread nécessite une approche spécifique en raison de l'utilisation de symboles faibles.

Symboles faibles

Les fichiers ELF (utilisés sous Unix) font la différence entre les symboles forts et faibles :

  • Fort :Peut remplacer les symboles faibles portant le même nom.
  • Faible : Peut être remplacé par des symboles forts, mais pas par d'autres symboles faibles.

pthread et symboles faibles

GLIBC et pthread utilisez des symboles faibles pour les fonctionnalités de sécurité des threads. Les versions de symboles faibles sont définies dans les bibliothèques statiques, tandis que les versions de symboles forts sont définies dans les bibliothèques dynamiques. Lors d'une liaison dynamique, les symboles forts sont utilisés, mais lors d'une liaison statique, les symboles faibles doivent être remplacés par les versions fortes.

Utilisation de -Wl,--whole-archive et -Wl,--no- archive entière

Lors d'une liaison statique, l'éditeur de liens examine le premier symbole d'une archive et arrête la recherche. L'indicateur -Wl,--whole-archive force l'éditeur de liens à examiner tous les symboles de l'archive, y compris les symboles faibles. L'indicateur -Wl,--no-whole-archive désactive cette option pour les archives suivantes.

En utilisant ces indicateurs, vous vous assurez que les versions de symboles forts des fonctions pthread sont incluses dans l'exécutable, résolvant ainsi le problème. problème d'erreur de segmentation causé par des symboles faibles.

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