Lorsque g lie statiquement pthread, provoquant une erreur de segmentation, pourquoi ?
Dans la liaison statique, l'éditeur de liens s'arrêtera au premier symbole, même s'il est faible, et arrête de chercher des forts. Pour le forcer à examiner tous les symboles (comme il l'aurait fait pour une bibliothèque liée dynamiquement), ld prend en charge l'option --whole-archive.
La commande suivante fonctionnera :
g++ -o one one.cpp -Wall -std=c++11 -O3 -static -pthread \ -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
Voici ce qui se passe :
Compréhension symboles faibles
Le format de fichier ELF a le concept de symboles faibles et forts. Par défaut, les symboles d'un fichier objet sont forts. Lors de la liaison, un symbole fort peut remplacer un symbole faible du même nom.
Dans le cas de la glibc et des pthreads, ils utilisent des symboles faibles. Par exemple, fputc doit être thread-safe selon POSIX et doit être synchronisé, ce qui est coûteux. Dans un environnement monothread, vous ne voulez pas payer ces coûts. Une implémentation pourrait donc implémenter les fonctions de synchronisation sous forme de stubs vides et déclarer les fonctions comme symboles faibles.
Plus tard, si une bibliothèque multi-thread est liée (par exemple, pthread), il devient évident que la prise en charge d'un seul thread n’est pas prévu. Lors de la liaison de la bibliothèque multi-thread, l'éditeur de liens peut alors remplacer les stubs par les fonctions de synchronisation réelles (définies comme des symboles forts et implémentées par la bibliothèque de threads).
Appliquer cela à l'exemple de programme
La bibliothèque libc.a contient __pthread_mutex_lock comme symbole faible, et la bibliothèque libpthread.a le contient comme symbole fort. Lors d'une liaison dynamique, l'éditeur de liens remplace le symbole faible par le symbole fort. Cependant, lors d’une liaison statique, vous devez appliquer la même sémantique. C'est pourquoi -Wl,--whole-archive -lpthread -Wl,--no-whole-archive est nécessaire.
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!