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 ...