Saya memiliki executable biner bernama "alpha" yang membutuhkan pustaka tertaut (libz.so.1.2.7) yang ditempatkan di /home/username/myproduct/lib/libz.so.1.2.7
Saya mengekspor hal yang sama ke instance terminal saya sebelum menelurkan binary yang dapat dieksekusi dengan mengeksekusi perintah berikut.
export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH
Sekarang, ketika saya menelurkan aplikasi lain "bravo" yang membutuhkan pustaka yang sama tetapi dari versi yang berbeda, yaitu (libz.so.1.2.8) yang tersedia
/lib/x86_64-linux-gnu/libz.so.1.2.8
, sistem melempar kesalahan berikut.
version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2)
Jika saya menghapus LD_LIBRARY_PATH
, "bravo" mulai baik-baik saja. Saya mengerti bahwa perilaku di atas karena LD_LIBRARY_PATH
lebih diutamakan daripada jalur direktori didefinisikan dalam /etc/ld.so.conf
sambil mencari perpustakaan terkait dan akibatnya kesalahan di atas terjadi. Saya hanya ingin tahu mengapa pengembang UNIX / LINUX tidak merancang OS untuk mencari perpustakaan yang terhubung di direktori lain sesuai dengan hierarki jika instance perpustakaan pertama adalah versi yang berbeda.
Sederhananya, sistem UNIX / LINUX melintasi seperangkat direktori sampai menemukan perpustakaan yang diperlukan. Tetapi mengapa ia tidak melakukan hal yang sama sampai ia menemukan versi yang diharapkan daripada menerima contoh pertama perpustakaan terlepas dari versinya?
sumber
libz.so.1
adalah symlink kelibz.so.1.2.8
Jawaban:
Itu, sejauh yang disadari.
zlib.so.1.2.7
danzlib.so.1.2.8
keduanya memiliki nama samaranzlib.so.1
, jadi biner Andaalpha
danbravo
mereka mengatakan mereka membutuhkannyazlib.so.1
. Loader dinamis memuat perpustakaan yang cocok pertama yang ditemukannya; tidak tahu bahwa versi 1.2.8 menyediakan simbol tambahan yangbravo
dibutuhkan. (Inilah sebabnya mengapa distribusi bersusah payah untuk menentukan informasi dependensi tambahan, sepertizlib1g (>= 1.2.8)
untukbravo
.)Anda mungkin berpikir ini seharusnya mudah untuk diperbaiki, tetapi tidak, paling tidak karena biner dan perpustakaan mendaftar simbol yang mereka butuhkan secara terpisah dari perpustakaan yang mereka butuhkan, sehingga loader tidak dapat memeriksa bahwa perpustakaan yang diberikan menyediakan semua simbol yang dibutuhkan dari itu. Simbol dapat disediakan dalam berbagai cara, dan memperkenalkan tautan antara simbol dan perpustakaan yang menyediakannya dapat merusak biner yang ada. Ada juga kesenangan tambahan dari penempatan simbol untuk mempersulit hal-hal (dan membuat pengembang yang peka terhadap keamanan merobek rambut mereka).
Beberapa perpustakaan menyediakan informasi versi yang akhirnya disimpan
.gnu.version_r
, dengan tautan ke perpustakaan yang menyediakan, yang akan membantu di sini, tetapilibz
bukan salah satunya.(Diberikan sonames, saya berharap
alpha
biner Anda bekerja dengan baikzlib.so.1.2.8
.)sumber
zlib
tidak digunakanlibtool
, kecuali di Darwinar
;-).