Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah pthread yang memautkan secara statik dengan g menyebabkan kesalahan pembahagian, dan bagaimanakah saya boleh membetulkannya?

Mengapakah pthread yang memautkan secara statik dengan g menyebabkan kesalahan pembahagian, dan bagaimanakah saya boleh membetulkannya?

DDD
DDDasal
2024-10-25 20:05:29736semak imbas

Why does statically linking pthread with g   cause a segmentation fault, and how can I fix it?

Mengapa g menyebabkan ralat segmentasi apabila memautkan pthread secara statik?

Penyelesaian:

Untuk menyelesaikan isu ini, gunakan arahan berikut:

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

Memahami Masalah:

Pautan statik ke pthread memerlukan pendekatan khusus kerana penggunaan simbol yang lemah.

Simbol Lemah

Fail ELF (digunakan dalam Unix) membezakan antara simbol kuat dan lemah:

  • Kuat: Boleh mengatasi simbol lemah dengan nama yang sama.
  • Lemah: Boleh digantikan dengan simbol kuat, tetapi bukan oleh simbol lemah lain.

Simbol pthread dan Lemah

GLIBC dan pthread gunakan simbol yang lemah untuk ciri keselamatan benang. Versi simbol yang lemah ditakrifkan dalam perpustakaan statik, manakala versi simbol yang kuat ditakrifkan dalam perpustakaan dinamik. Apabila pemautan dinamik, simbol kuat digunakan, tetapi apabila pemautan statik, simbol lemah mesti digantikan dengan versi kuat.

Penggunaan -Wl,--whole-archive dan -Wl,--no- whole-archive

Apabila memaut secara statik, pemaut melihat simbol pertama dalam arkib dan berhenti mencari. Bendera -Wl,--keseluruhan arkib memaksa pemaut melihat semua simbol dalam arkib, termasuk simbol yang lemah. Bendera -Wl,--no-whole-archive mematikan pilihan ini untuk arkib seterusnya.

Dengan menggunakan bendera ini, anda memastikan bahawa versi simbol kuat bagi fungsi pthread disertakan dalam boleh laku, menyelesaikan masalah isu kesalahan pembahagian yang disebabkan oleh simbol yang lemah.

Atas ialah kandungan terperinci Mengapakah pthread yang memautkan secara statik dengan g menyebabkan kesalahan pembahagian, dan bagaimanakah saya boleh membetulkannya?. 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