Cuando g vincula estáticamente pthread, provocando un error de segmentación, ¿por qué?
En la vinculación estática, el vinculador se detendrá en el primer símbolo, incluso si es débil, y deja de buscar fuertes. Para obligarlo a mirar todos los símbolos (como lo habría hecho para una biblioteca vinculada dinámicamente), ld admite la opción --whole-archive.
El siguiente comando funcionará:
g -o one one.cpp -Wall -std=c 11 -O3 -static -pthread \ -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
Esto es lo que está sucediendo:
Comprender los símbolos débiles
El formato de archivo ELF tiene el concepto de símbolos débiles y fuertes. De forma predeterminada, los símbolos de un archivo objeto son fuertes. Durante la vinculación, un símbolo fuerte puede anular un símbolo débil del mismo nombre.
En el caso de glibc y pthreads, usan símbolos débiles. Por ejemplo, POSIX requiere que fputc sea seguro para subprocesos y debe sincronizarse, lo cual es costoso. En un entorno de un solo subproceso, no querrás pagar estos costos. Por lo tanto, una implementación podría implementar las funciones de sincronización como apéndices vacíos y declarar las funciones como símbolos débiles. no está previsto. Al vincular la biblioteca de subprocesos múltiples, el vinculador puede reemplazar los códigos auxiliares por las funciones de sincronización reales (definidas como símbolos fuertes e implementadas por la biblioteca de subprocesos).
Aplicando esto al programa de ejemploLa biblioteca libc.a contiene __pthread_mutex_lock como símbolo débil y la biblioteca libpthread.a lo contiene como símbolo fuerte. Al vincular dinámicamente, el vinculador reemplaza el símbolo débil con el símbolo fuerte. Sin embargo, al vincular estáticamente, es necesario aplicar la misma semántica. Es por eso que -Wl,--whole-archive -lpthread -Wl,--no-whole-archive es necesario.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3