Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah atur cara C saya menggunakan `pthread` ranap dengan \"Segmentation fault\" apabila dipautkan secara statik tetapi berfungsi dengan baik apabila dipautkan secara dinamik?

Mengapakah atur cara C saya menggunakan `pthread` ranap dengan \"Segmentation fault\" apabila dipautkan secara statik tetapi berfungsi dengan baik apabila dipautkan secara dinamik?

Linda Hamilton
Linda Hamiltonasal
2024-11-02 00:46:02335semak imbas

Why does my C   program using `pthread` crash with a

Apabila g statik pautan pthread, menyebabkan Segmentation fault, kenapa?

Program C ini, apabila dipautkan secara dinamik menggunakan -pthread -o one one .cpp -Wall -std=c 11 -O3, berjalan tanpa sebarang masalah. Walau bagaimanapun, apabila dipautkan secara statik menggunakan -pthread -o one one.cpp -Wall -std=c 11 -O3 -static, ia ranap dengan "Segmentation fault".

Memahami Isu

Apabila menggunakan -pthread, pengkompil secara automatik memaut ke perpustakaan pthread. Walau bagaimanapun, apabila memaut secara statik, anda perlu menyatakan secara eksplisit -lpthread untuk memasukkan perpustakaan pthread.

Simbol Lemah

Dalam Unix, format fail ELF menggunakan konsep simbol lemah, yang boleh ditindih oleh simbol kuat semasa memaut. Glibc dan pthread menggunakan simbol lemah untuk fungsi yang boleh digantikan secara pilihan dengan versi yang dioptimumkan.

Dalam kes ini, glibc menyediakan simbol lemah untuk fungsi penyegerakan seperti __pthread_mutex_lock. Apabila pthread dipautkan secara dinamik, simbol lemah digantikan dengan simbol kuat daripada pthread.

Pautan Statik dan Simbol Lemah

Semasa pemautan statik, pemaut akan berhenti di simbol pertama yang ditemuinya, walaupun ia adalah simbol yang lemah. Untuk memasukkan semua simbol daripada pustaka pthread, anda perlu menggunakan pilihan Wl,--keseluruhan arkib, yang memaksa pemaut untuk memasukkan setiap fail objek daripada arkib.

Penyelesaian

Untuk menyelesaikan isu, gunakan arahan pemautan berikut:

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

Lampiran: Penyelesaian Autotools

Jika menggunakan Autotools sebagai sistem binaan, penyelesaian berikut diperlukan, kerana Automake tidak membenarkan pilihan dalam LDADD:

Dalam configure.ac:

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)

Dalam Makefile.am:

mytarget_LDADD = @WL_WHOLE_ARCHIVE_HACK@ -lpthread @WL_NO_WHOLE_ARCHIVE_HACK@

Atas ialah kandungan terperinci Mengapakah atur cara C saya menggunakan `pthread` ranap dengan \"Segmentation fault\" apabila dipautkan secara statik tetapi berfungsi dengan baik apabila dipautkan secara dinamik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn