it-swarm-id.com

Bagaimana cara kerja angka SO (objek bersama)?

Saya menyadari bahwa objek yang dibagikan di Linux menggunakan "nomor-nomor", yaitu bahwa berbagai versi objek yang dibagikan diberi ekstensi yang berbeda, misalnya:

  • example.so.1
  • example.so.2

Saya mengerti idenya adalah memiliki dua file berbeda sehingga dua versi perpustakaan dapat ada pada suatu sistem (sebagai lawan dari "DLL Hell" pada Windows). Saya ingin tahu bagaimana cara kerjanya dalam praktik? Seringkali, saya melihat itu example.so sebenarnya adalah tautan simbolis ke example.so.2 dimana .2 adalah versi terbaru. Lalu bagaimana aplikasi tergantung pada versi example.so mengidentifikasi dengan benar? Apakah ada aturan mengenai nomor apa yang harus digunakan seseorang? Atau ini hanya konvensi? Apakah itu masalahnya, tidak seperti di Windows di mana binari perangkat lunak ditransfer antar sistem, jika suatu sistem memiliki versi yang lebih baru dari objek yang dibagikan, itu ditautkan ke versi yang lebih lama secara otomatis ketika dikompilasi dari sumber?

Saya curiga ini terkait dengan ldconfig tapi saya tidak yakin bagaimana caranya.

127
user119

Binari sendiri tahu versi perpustakaan bersama mana yang mereka andalkan, dan memintanya secara khusus. Anda dapat menggunakan ldd untuk menampilkan dependensi; punyaku untuk ls adalah:

$ ldd /bin/ls
    linux-gate.so.1 =>  (0xb784e000)
    librt.so.1 => /lib/librt.so.1 (0xb782c000)
    libacl.so.1 => /lib/libacl.so.1 (0xb7824000)
    libc.so.6 => /lib/libc.so.6 (0xb76dc000)
    libpthread.so.0 => /lib/libpthread.so.0 (0xb76c3000)
    /lib/ld-linux.so.2 (0xb784f000)
    libattr.so.1 => /lib/libattr.so.1 (0xb76bd000)

Seperti yang Anda lihat, itu menunjuk ke mis. libpthread.so.0, tidak hanya libpthread.so.


Alasan untuk tautan simbolik adalah untuk tautan tersebut. Saat Anda ingin tautan terhadap libpthread.so secara langsung, Anda memberi gcc bendera -lpthread, dan ia menambahkan awalan lib dan .so akhiran secara otomatis. Anda tidak bisa mengatakannya untuk menambahkan .so.0 suffix, jadi tautan simbolik menunjuk ke versi lib terbaru untuk memudahkan itu

91
Michael Mrozek

Angka-angka di perpustakaan bersama adalah konvensi yang digunakan di Linux untuk mengidentifikasi API perpustakaan. Biasanya formatnya adalah:

libFOO.so.MAJOR.MINOR

Dan seperti yang Anda perhatikan biasanya ada tautan simbolis dari libFOO.so ke libFOO.so.MAJOR.MINOR. ldconfig bertanggung jawab untuk memperbarui tautan ini ke versi terbaru.

MAJOR biasanya bertambah ketika API berubah (titik masuk baru dihapus atau parameter atau tipe diubah). MINOR biasanya ditambahkan untuk rilis perbaikan bug atau ketika API baru diperkenalkan tanpa melanggar API yang ada.

Diskusi yang lebih luas dapat ditemukan di sini: Membedah shared library

61
miguel.de.icaza

Pustaka bersama harus diversi versi sesuai dengan skema berikut:

blah.so.X.Y.Z

dimana

  • X = mundur rilis ABI tidak kompatibel
  • Y = rilis ABI yang kompatibel ke belakang
  • Z = Hanya perubahan internal - tidak ada perubahan pada ABI

Biasanya Anda hanya melihat digit pertama seperti hello.so.1 karena digit pertama adalah satu-satunya hal yang diperlukan untuk mengidentifikasi "versi" perpustakaan karena semua digit lainnya kompatibel ke belakang.

ldconfig mengelola tabel perpustakaan apa yang tersedia bersama pada suatu sistem dan di mana path ke perpustakaan itu ada. Anda dapat memverifikasi ini dengan menjalankan:

ldconfig -p

Ketika sebuah paket dibangun untuk sesuatu seperti Red Hat, pustaka bersama yang dipanggil dalam biner akan dilihat dan ditambahkan sebagai dependensi paket pada waktu pembuatan RPM. Oleh karena itu, ketika Anda pergi untuk menginstal paket, penginstal akan mencari apakah hello.so.1 diinstal pada sistem dengan memeriksa ldconfig.

Anda dapat melihat dependensi suatu paket dengan melakukan sesuatu seperti:

rpm -qpR hello.rpm

Sistem ini (tidak seperti Windows) memungkinkan beberapa versi hello.so untuk diinstal pada sistem dan digunakan oleh aplikasi yang berbeda secara bersamaan.

25
ascotan

libNAME.so adalah nama file yang digunakan oleh compiler/linker ketika pertama kali mencari perpustakaan yang ditentukan oleh -lNAME. Di dalam file perpustakaan bersama adalah bidang yang disebut SONAME. Bidang ini disetel saat pustaka itu sendiri pertama kali ditautkan ke objek bersama (jadi) oleh proses pembuatan. SONAME ini sebenarnya yang disimpan linker di dalam executable tergantung pada objek yang dibagikan yang terhubung dengannya. Biasanya SONAME adalah dalam bentuk libNAME.so.MAJOR dan diubah kapan saja perpustakaan menjadi tidak kompatibel dengan executable yang ada yang terhubung dengannya dan kedua versi utama perpustakaan dapat tetap diinstal sesuai kebutuhan (meskipun hanya satu yang akan diarahkan untuk pengembangan sebagai libNAME.so) Juga, untuk mendukung peningkatan dengan mudah di antara versi kecil pustaka, libNAME.so.MAJOR biasanya merupakan tautan ke file seperti libNAME.so.MAJOR.MINOR. Versi minor baru dapat diinstal dan setelah selesai, tautan ke versi minor lama dihancurkan untuk menunjuk ke versi minor baru yang segera memutakhirkan semua eksekusi baru untuk menggunakan pustaka yang ditingkatkan. Juga, lihat jawaban saya untuk Linux, GNU GCC, ld, skrip versi dan format biner ELF - Bagaimana cara kerjanya?

20
penguin359