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
Lepaskan: 2024-11-02 00:46:02
asal
334 orang telah melayarinya

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
Salin selepas log masuk

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)
Salin selepas log masuk

Dalam Makefile.am:

mytarget_LDADD = @WL_WHOLE_ARCHIVE_HACK@ -lpthread @WL_NO_WHOLE_ARCHIVE_HACK@
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!