Rumah > pembangunan bahagian belakang > C++ > 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
Lepaskan: 2024-10-26 11:14:02
asal
1117 orang telah melayarinya

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

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 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan