GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mengatur RPATH dan RUNPATH dengan GCC/LD?

Proyek GNU Binutils (berisi GNU linker (ld)) bukanlah sumber dari perubahan perilaku ini, melainkan Debian (2016)1, dan Gentoo (2013!)2.

Menurut komit gentoo dari Mike Frysinger pada Jan 2013 :

Opsi dtags "baru" telah ada selama 14+ tahun, jadi untuk target Linux dan GNU, aktifkan secara default."

Perubahan ini tidak diterima dengan baik 3, 4, 5, karena RUNPATH dan RPATH memiliki "perbedaan perilaku tidak terdokumentasi"...Anehnya, perubahan ini sekarang diterapkan pada kandang Debian.

Masalahnya adalah menggunakan RUNPATH, mengarah ke masalah yang tidak dapat diprediksi ... Tetapi terutama hanya berfungsi. Dari wikipedia :

ld dynamic linker tidak mencari lokasi DT_RUNPATH untukketergantungan transitif , tidak seperti DT_RPATH.


Apakah ada cara untuk memaksakan perilaku lama?

Ya. Anda dapat menggunakan opsi ini -Wl,--disable-new-dtags untuk memberi tahu baru linker untuk menggunakan lama perilaku, yaitu RPATH.

Apakah mungkin memberi tahu linker versi lama untuk menghasilkan keluaran baru (mis. RUNPATH alih-alih RPATH)?

Ya. Gunakan -Wl,--enable-new-dtags untuk memberi tahu lama linker untuk menggunakan baru perilaku, yaitu RUNPATH.

Saya memverifikasi yang dapat dieksekusi dengan readelf dan kedua opsi ini sepertinya mengontrol apa yang akan ditulis di bagian Dinamis ELF. Saya pikir masalahnya disebabkan oleh perubahan default untuk versi baru, meskipun, yang menarik, halaman manual untuk ld akan menyarankan bahwa itu harus tetap sama:

--aktifkan-tag-baru
--disable-new-dtags
Linker ini dapat membuat tag dinamis baru di ELF. Tapi sistem ELF yang lebih tua mungkin tidak memahaminya. Jika Anda menetapkan--aktifkan-tag-baru, tag dinamis baru akan dibuat sesuai kebutuhan dan tag dinamis lama akan dihilangkan. Jika Anda menetapkan --disable-new-dtags, tidak ada tag dinamis baru yang akan dibuat. Secara default, tag dinamis baru tidak dibuat. Perhatikan bahwa opsi tersebut hanya tersedia untuk sistem ELF.


Linux
  1. Bagaimana menangani perpustakaan dinamis dan statis di Linux

  2. Cara Mengatur LogAnalyzer dengan Rsyslog dan MySQL

  3. Bagaimana Cara Mengatur Tanggal Dengan Format Epoch?

  1. Cara Mengatur Zona Waktu dan Menyinkronkan Waktu Server dengan NTP di Linux

  2. Bagaimana cara melakukan peningkatan atom dan mengambil di C?

  3. Cara mengatur zram dan swap dengan benar

  1. Cara Mengatur atau Mengubah Agen Pengguna dengan curl

  2. Cara Mengecualikan File dan Direktori dengan Rsync

  3. Cara Mengatur Apache dengan Acara MPM dan PHP-FPM di Ubuntu 20.04