Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Program C Saya Dengan Pautan Statik dan Pthreads Mengakibatkan Ralat Segmentasi?

Mengapa Program C Saya Dengan Pautan Statik dan Pthreads Mengakibatkan Ralat Segmentasi?

DDD
DDDasal
2024-10-26 11:14:02966semak imbas

Why Does My C   Program With Static Linking and Pthreads Result in a Segmentation Fault?

Apabila g Pautan Statik Pthread, Menyebabkan Kerosakan Segmentasi: Penjelasan dan Penyelesaian

Masalah:

Apabila menyusun atur cara C dengan g dan bendera -pthread untuk memaut dengan pustaka pthread, tetapi secara statik (-statik), atur cara menghadapi Kesalahan Segmentasi.

Penjelasan:

  1. Simbol Lemah:

    • pthread dan libstdc menggunakan simbol lemah untuk fungsi tertentu, seperti pthread_mutex_lock().
    • Simbol yang lemah boleh digantikan dengan simbol yang kuat semasa memaut.
  2. Pautan Dinamik lwn. Pautan Statik:

    • Dalam dinamik memaut, simbol lemah diselesaikan daripada perpustakaan kongsi.
    • Dalam pemautan statik, pemaut berhenti pada simbol pertama (termasuk yang lemah) dan tidak mencari simbol yang kuat.
  3. Resolusi Pautan Tidak Lengkap:

    • Apabila menggunakan -statik, pemaut tidak menganggap semua simbol daripada perpustakaan pthread, kerana ia menemui simbol yang lemah terlebih dahulu .
    • Oleh itu, simbol kuat untuk pthread_mutex_lock() tidak digunakan.

Penyelesaian:

Kepada paksa pemaut untuk melihat semua simbol daripada perpustakaan pthread dalam atur cara yang dipautkan secara statik, gunakan:

g++ -o one one.cpp -Wall -std=c++11 -O3 -static -pthread \
    -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
  • -Wl,--whole-archive: Termasuk semua objek fail dalam arkib yang ditentukan.
  • -lpthread: Pautan terhadap pustaka pthread.
  • -Wl,--no-whole-archive: Melumpuhkan pilihan keseluruhan arkib untuk arkib seterusnya.

Nota Tambahan:

  • Sesetengah sistem mungkin memerlukan bendera tambahan, seperti -lrt untuk librt .
  • Jika menggunakan Autotools, tentukan bendera dalam configure.ac dan gantikannya dalam Makefile.am. Contohnya:
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)

mytarget_LDADD = @WL_WHOLE_ARCHIVE_HACK@ -lpthread @WL_NO_WHOLE_ARCHIVE_HACK@

Atas ialah kandungan terperinci Mengapa Program C Saya Dengan Pautan Statik dan Pthreads Mengakibatkan Ralat Segmentasi?. 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