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!