Saya memiliki executable lama yang dijadwalkan untuk tumpukan memo, tetapi belum ada. Ini bergantung pada beberapa libs yang telah dihapus dari lingkungan saya, tetapi saya memiliki beberapa lib bertopik di suatu tempat yang berfungsi dengan baik. Saya ingin mengarahkan ini dapat dieksekusi ke perpustakaan rintisan ini. Ya, saya dapat menyetel LD_LIBRARY_PATH, tetapi file yang dapat dieksekusi ini dipanggil dari banyak skrip, dan banyak pengguna, dan saya ingin memperbaikinya di satu tempat.
Saya tidak punya sumber untuk ini, dan akan sulit mendapatkannya. Saya berpikir - dapatkah saya mengedit file ini, menggunakan editor yang sadar ELF, dan menambahkan PATH sederhana ke rpath agar dapat mencapai libs baru? Apakah ini mungkin, atau setelah Anda membuat biner ELF, Anda memperbaiki berbagai hal ke lokasi dan tidak dapat dipindahkan?
Jawaban:
Ada sebuah alat bernama
chrpath
yang dapat melakukan ini - itu mungkin tersedia di paket distribusi Anda.sumber
install_name_tool
dapat melakukan ini dengan-rpath
bendera<binary>: no rpath or runpath tag found.
chrpath
patchelf
patchelf --set-rpath /path/to/libaries <binary>
Ada alat yang lebih universal daripada yang
chrpath
disebutpatchelf
. Awalnya dibuat untuk digunakan dalam pembuatan paket untuk Nix dan NixOS (sistem pengemasan dan distribusi GNU / Linux).Jika tidak ada rpath dalam biner (di sini disebut rdsamp),
chrpath
gagal:Di samping itu,
berhasil dengan baik.
sumber
patchelf
dapat menambahkan rpath ke biner yang tidak berisi rpath, namun - di manachrpath
hanya tampak dapat memodifikasi entri yang sudah ada.rpath
danrunpath
. Pada dasarnya, yang satu bisa menimpaLD_LIBRARY_PATH
dan yang lainnya tidak bisa. Untuk detailnya, lihat blog.tremily.us/posts/rpathchrpath
danpatchelf
ceroboh dengan terminologi mereka. Misalnya,patchelf
perintah yang ditunjukkan di atas akan berubahrunpath
tetapi tidakrpath
kecuali Anda juga memberikan--force-rpath
opsi.patchelf
menjelaskannya: "--set-rpath
,--shrink-rpath
dan--print-rpath
sekarang lebih memilihDT_RUNPATH
daripadaDT_RPATH
, yang sudah usang. Saat memperbarui, jika keduanya ada, keduanya diperbarui. Jika hanya DT_RPATH ada, itu akan diubah keDT_RUNPATH
kecuali--force-rpath
ditentukan. Jika tidak ada , aDT_RUNPATH
ditambahkan kecuali--force-rpath
ditentukan, dalam hal ini aDT_RPATH
ditambahkan. " Nama opsi mungkin tidak diubah karena alasan kompatibilitas.Seperti yang dikatakan @ user7610, cara yang tepat adalah menggunakan
patchelf
alat.Tetapi, saya merasa bahwa saya dapat memberikan jawaban yang lebih komprehensif, mencakup semua perintah yang harus dilakukan oleh seseorang.
Untuk artikel komprehensif tentang subjek, klik di sini
Pertama-tama, banyak pengembang membicarakannya
RPATH
, tetapi sebenarnya mereka bermaksud jahatRUNPATH
. Ini adalah dua bagian dinamis opsional yang berbeda, dan loader menanganinya dengan sangat berbeda. Anda dapat membaca lebih lanjut tentang perbedaan di antara mereka di tautan yang saya sebutkan sebelumnya.Untuk saat ini, ingat saja:
RUNPATH
disetel,RPATH
diabaikanRPATH
sudah usang dan harus dihindariRUNPATH
lebih disukai karena dapat diganti olehLD_LIBRARY_PATH
Lihat R [UN] PATH saat ini
Kosongkan R [UN] PATH
Catatan:
RPATH
danRUNPATH
Tambahkan nilai ke R [UN] PATH
Catatan:
<desired-path>
adalah daftar direktori yang dipisahkan koma, misalnya:/my/libs:/my/other/libs
--force-rpath
, menyetelRPATH
, sebaliknya menyetelRUNPATH
sumber
-Wl,-R,<desired-rpath> -Wl,--enable-new-dtags
setDT_RUNPATH
, dan itulah yang harus digunakan kebanyakan orang.RUNPATH
dapat diganti olehLD_LIBRARY_PATH
, jadi orang tidak boleh menggunakan--force-rpath
.<desired-path>
menggunakan titik dua; itu harus berupa koma (yaitu:)/my/libs,/my/other/libs
.Ini berhasil untuk saya, mengganti XORIGIN dengan $ ORIGIN.
chrpath -r '\$\ORIGIN/../lib64' httpd
sumber