Mengubah pustaka tertaut untuk executable yang diberikan (CentOs 6)

29

Saya memiliki tautan yang dapat dieksekusi seperti ini:

  $ ldd a.out
        libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x00007f4881f56000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4881cfb000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4881965000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f488175d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4881540000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f4881239000)
.
.

Di mana libcrypto dan libssl libraries adalah openssl 1.0.0-fips libs. Saya ingin bereksperimen dengan pustaka 1.0.1, jadi saya membuatnya di direktori home saya. Apakah ada cara untuk a.outterhubung kembali dengan perpustakaan openssl baru saya tanpa banyak rasa sakit? Saya ingin menghindarinya

  • Harus me-relink a.out(karena alat build sangat rumit)
  • Mengubah pengaturan global (karena pengembang lain mengerjakan mesin ini)

Apakah mungkin melakukan apa yang saya harapkan di sini?

Fixee
sumber

Jawaban:

22

Anda dapat secara sementara mengganti pustaka yang berbeda untuk eksekusi khusus ini. Di Linux, variabel lingkungan LD_LIBRARY_PATH adalah kumpulan direktori yang dipisahkan oleh titik dua di mana perpustakaan harus dicari terlebih dahulu, sebelum kumpulan direktori standar; ini berguna saat men-debug pustaka baru atau menggunakan pustaka yang tidak standar untuk tujuan khusus. Variabel lingkungan LD_PRELOAD mencantumkan pustaka bersama dengan fungsi yang mengesampingkan set standar, seperti halnya /etc/ld.so.preload. - Perpustakaan Bersama

Anda juga dapat memanggil loader secara langsung:

/lib/ld-linux.so.2 --library-path path executable

David Schwartz
sumber
1
LD_LIBRARY_PATH tidak mengesampingkan jalur pencarian default. Saya mengaturnya tetapi ldd masih menunjukkan jalur default sistem, bukan yang ditimpa. Meskipun saya bisa memaksakan pemuatan perpustakaan saya sendiri dengan mengatur LD_PRELOAD.
Calmarius
18

Tulis skrip pembungkus yang menetapkan LD_LIBRARY_PATHvariabel lingkungan. Ini adalah liontin PATHuntuk perpustakaan bersama. Jalur pencarian sistem selalu dicari setelah direktori yang terdaftar di $LD_LIBRARY_PATH. Lihat manual tautan dinamis untuk referensi.

#!/bin/sh
export LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib
exec /path/to/a.out "$@"

Atau, untuk sekali saja, langsung di baris perintah:

LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib ./a.out

Sebagai alternatif, jika Anda ingin memodifikasi biner, coba chrpath , yang memungkinkan Anda mengedit jalur pencarian pustaka yang dibuat di executable.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
+1 untuk chrpath. Apa yang saya butuhkan.
Raghav RV
Cerita lucu, Microsoft terlalu bodoh untuk menghabiskan 2 menit Googling ini dan menyarankan semua orang untuk digunakan LD_LIBRARY_PATH daripada menghubungkan SQL Server untuk openss-1.0.0 eksplisit atau mengkompilasi ulang dengan versi openssl.so blogs.msdn.microsoft.com/sql_server_team / ...
Evan Carroll