Mengapa perpustakaan bersama di Linux dapat dieksekusi?

8

Saya hanya penasaran.

bash-3.00$  ldd libmylibrary.so
ldd: warning: you do not have execution permission for `libmylibrary.so'

Semuanya tampaknya berfungsi dengan baik hanya dengan + r. Saya perhatikan bahwa sebagian besar .so di / usr / lib memiliki + x set ...

Mengapa shared libs seharusnya memiliki bit set yang dapat dieksekusi? Apa yang bisa terjadi jika saya tidak mengaturnya?

Tomo
sumber
2
Perpustakaan jelas tidak perlu + x untuk berjalan dengan baik. Mungkin mereka memiliki tautan? Tautan perlu + x untuk diikuti.
Chris S
Ya, mereka tidak perlu + x, namun sebagian besar perpustakaan sudah mengaturnya.
Tomo
Pertanyaan ini juga telah ditanyakan di Unix & Linux: unix.stackexchange.com/questions/40587/… (dan mendapat jawaban yang benar di sana)
Michał Górny

Jawaban:

3

Sebenarnya itu tergantung pada lddimplementasinya. lddbiasanya skrip, Anda dapat mengeditnya untuk melihat di mana dan mengapa Anda mendapatkan kesalahan itu.

Di Ubuntu 10,04, lddperiksa untuk readizin saja. Mungkin memberikan kesalahan bukan eksekusi dinamis jika file bukan ELF ( Format yang Dapat Dieksekusi dan Dapat Ditautkan ). Lib di sini semuanya -rw-r--r--, misalnya

$ find /usr/lib -type f -name "libm*.so*" -ls
(...)
-rw-r--r--   1 root     root       216800 Feb 26 22:20 /usr/lib/libmp.so.3.1.16
-rw-r--r--   1 root     root        76728 Mar 14 04:23 /usr/lib/libmjpegutils-1.9.so.0.0.0
-rw-r--r--   1 root     root       134464 Jan 29  2010 /usr/lib/libm17n-core.so.0.3.0
-rw-r--r--   1 root     root       290480 Feb 17  2010 /usr/lib/libmtp.so.8.3.2

Tidak mengejutkan untuk menginginkan xakses ke perpustakaan bersama. The executableModus adalah konvensi yang memberikan OS tingkat lain kontrol hak akses. Loader yang dapat dieksekusi mengontrol akses itu, untuk memastikan pengguna dapat menjalankannya, tetapi juga untuk mencegah kesalahan (beberapa skrip atau program tidak boleh dijalankan oleh beberapa orang).

Ini dapat diperluas ke pustaka bersama karena alasan yang sama - tetapi pustaka bersama tidak dapat berjalan sendiri, dan lebih sedikit kemungkinan kesalahan untuk digunakan secara tidak sengaja ). Dengan demikian kebutuhannya kurang jelas ( raksesnya mencukupi).

e2-e4
sumber
3

Anda sebenarnya dapat menjalankan banyak perpustakaan, lihat misalnya apa yang terjadi ketika Anda mengetikkan /lib/libc.so.6shell pada sistem GNU / Linux baru-baru ini.

jaq
sumber
0

berpikir seperti memiliki file yang dapat dieksekusi dengan -x. Anda tidak akan bisa menjalankannya. Pertimbangkan pustaka ini sebagai kumpulan fungsi umum, yang dipanggil oleh program lain (misalkan myProgra). Jika Anda tidak dapat menjalankan library / function ... maka Anda tidak punya apa-apa

Sebuah contoh

function1() {} 
function2() {} 
int main() { 
printf("Let's call func1"); 
function1(); 
printf("Let's call func2"); 
function2(); 
} 

Sekarang jika Anda menempatkan function1 dan function2 di file lain dan Anda memasukkannya, maka Anda perpustakaan. (Tentu saja itu sesuatu yang lebih rumit. Ini hanya sebuah contoh)

Tetapi bagaimanapun juga, seperti yang Anda lihat, Anda harus mengeksekusi kode yang dimasukkan dalam perpustakaan

Nikolaidis Fotis
sumber
Tapi Anda menjalankan file executable, bukan library.
Ignacio Vazquez-Abrams
Lihat versi yang telah diedit di atas
Nikolaidis Fotis
0

Kuncinya adalah format file, Executable dan Linkable Format. Karena format file yang sama persis digunakan untuk mengidentifikasi kedua executable dan shared library, keduanya harus memiliki izin yang dapat dieksekusi yang sesuai untuk loader OS. Ini memungkinkan loader tunggal dan untuk executable digunakan sebagai DSO jika mereka menyertakan tabel simbol.

nzwulfin
sumber
Jadi, loader menggunakan bit izin, bukan header file, untuk mengidentifikasi hal-hal yang akan dimuat?
Tomo
Loader menggunakan header file untuk mengidentifikasi konten sebagai DYN atau EXEC dan melakukan hal yang sesuai. Bit eksekusi untuk OS, bukan loader. ELF adalah format yang dapat dieksekusi, tanpa bit eksekusi, OS tidak akan mengizinkan loader untuk mengeksekusi file untuk membaca header. Lihat wikipedia untuk informasi lebih lanjut tentang ELF en.wikipedia.org/wiki/Executable_and_Linkable_Format .
nzwulfin