GNU/Linux >> Belajar Linux >  >> Linux

Kompilasi gagal dengan relokasi R_X86_64_32 terhadap `.rodata.str1.8' tidak dapat digunakan saat membuat objek bersama

Lakukan apa yang diperintahkan oleh kompilator, yaitu kompilasi ulang dengan -fPIC . Untuk mempelajari apa yang dilakukan bendera ini dan mengapa Anda memerlukannya dalam kasus ini, lihat Opsi Pembuatan Kode dari manual GCC.

Singkatnya, istilah kode independen posisi (PIC) mengacu pada kode mesin yang dihasilkan yang agnostik alamat memori, yaitu tidak membuat asumsi tentang di mana ia dimuat ke dalam RAM. Hanya kode independen posisi yang seharusnya disertakan ke objek bersama (SO) karena mereka harus memiliki kemampuan untuk mengubah lokasinya secara dinamis di RAM.

Terakhir, Anda dapat membacanya di Wikipedia juga.


Dalam kasus saya, kesalahan ini terjadi karena make perintah mengharapkan untuk mengambil pustaka bersama (*.so file) dari direktori jarak jauh yang ditunjukkan oleh LDFLAGS variabel lingkungan. Secara keliru, hanya pustaka statis yang tersedia di sana (*.la atau *.a file).

Oleh karena itu, masalah saya tidak terletak pada program yang saya kompilasi tetapi dengan pustaka jarak jauh yang coba diambilnya. Jadi, saya tidak perlu menambahkan tanda apa pun (katakanlah, -fPIC ) ke kompilasi yang terganggu oleh kesalahan relokasi. Sebaliknya, saya mengkompilasi ulang pustaka jarak jauh sehingga objek yang dibagikan tersedia.

Pada dasarnya, ini adalah kesalahan penyamaran file tidak ditemukan.

Dalam kasus saya, saya harus menghapus --disable-shared yang salah tempat beralih di configure doa untuk program yang diperlukan, karena perpustakaan bersama dan statis keduanya dibangun sebagai default.

Saya perhatikan bahwa sebagian besar program membangun kedua jenis perpustakaan pada saat yang sama, jadi milik saya mungkin merupakan kasus sudut. Secara umum, mungkin Anda lebih suka mengaktifkan pustaka bersama, tergantung pada default.

Untuk memeriksa situasi khusus Anda dengan sakelar kompilasi dan default, saya akan membacakan ringkasan yang muncul dengan ./configure --help | less , biasanya di bagian Fitur Opsional. Saya sering menemukan bahwa bacaan ini lebih dapat diandalkan daripada panduan penginstalan yang tidak diperbarui saat program dependensi berkembang.


Memperbaikinya dengan -no-pie opsi di tahap linker:

g++-8 -L"/home/pedro/workspace/project/lib" -no-pie ...

Linux
  1. Ssh Inside Ssh Gagal Dengan "stdin:Is Not A Tty"?

  2. Perintah lvremove Gagal Dengan Kesalahan "LVM - Tidak dapat menghapus volume logis terbuka"

  3. CentOS/RHEL:Perintah Mount Gagal Dengan "mount:tidak mengandung label SELinux"

  1. Bagaimana cara menampilkan semua pustaka bersama yang digunakan oleh executable di Linux?

  2. Kompilasi Pustaka Bersama Dinamis dengan g++

  3. Kesalahan Linux saat memuat pustaka bersama:tidak dapat membuka file objek bersama:Tidak ada file atau direktori tersebut

  1. Bisakah read(2) mengembalikan nol saat tidak di EOF?

  2. Hapus memori bersama posix saat tidak digunakan?

  3. Skrip Nohup untuk Python tidak berfungsi saat berjalan di latar belakang dengan &