Saya memperhatikan sesuatu saat melakukan find /bin -exec file {} \;
:
yang file
laporan perintah beberapa entri dalam /bin
yang shared objects
, sementara yang lain sebagai executables
. Misalnya,
/ bin / ntfsck:
ELF 64-bit LSB shared object , x86-64, versi 1 (SYSV),
ditautkan secara dinamis (menggunakan shared libs), untuk GNU / Linux 2.6.24, BuildID [sha1] = 312d93fd0d8653e7236a61db2e67b93c63225a00
Laporan yang sama untuk gawk
/ usr / bin / gawk: Objek bersama
ELF 64-bit LSB , x86-64, versi 1 (SYSV), ditautkan secara dinamis (menggunakan lib bersama), untuk GNU / Linux 2.6.24, BuildID [sha1] = 76bb13aac7e212164bd6e0d7b8a5d92db4459
Sebaliknya file
untuk /bin/echo
adalah:
/ bin / echo:
ELF 64-bit LSB yang dapat dieksekusi , x86-64, versi 1 (SYSV),
ditautkan secara dinamis (menggunakan shared libs), untuk GNU / Linux 2.6.24,
BuildID [sha1] = 193e75fc13e9c4599e772b8d79125a5934cf601c, dilucuti
Intinya, saya ingin tahu apa perbedaan antara executable
file dan shared object
file.
sumber
Jawaban:
Tl; dr
Tidak ada perbedaan, selain dari fakta bahwa executable yang dikompilasi dapat dihubungkan dengan objek bersama tetapi tidak terhadap executable.
Secara umum, ada dua cara untuk mengkompilasi 1 yang dapat dieksekusi:
Ada kelebihan / kekurangan dalam menggunakan masing-masing metode ini, tetapi itu bukan poin dari pertanyaan;
/bin/ntfsck
dan/usr/bin/gawk
merupakan objek bersama: ini berarti bahwa executable dapat dikompilasi dan kemudian dihubungkan dengannya untuk menggunakan fungsionalitasnya;/bin/echo
adalah executable: ini berarti bahwa executable mungkin tidak dikompilasi dan kemudian dihubungkan dengannya untuk menggunakan fungsionalitasnya;Jadi
/bin/ntfsck
dan/usr/bin/gawk
secara teknis dikompilasi pustaka (atau objek dalam perspektif linker), tetapi, seperti yang dapat diramalkan, tidak ada yang mencegah objek yang dibagikan dijalankan sebagai yang dapat dieksekusi.Di samping catatan, perhatikan juga bahwa
file
laporan (untuk masing-masing):Ini berarti bahwa masing-masing dari mereka secara dinamis terkait dengan (dan kemungkinan menggunakan) objek bersama lainnya juga.
1. "Kompilasi" dimaksudkan dalam penerimaannya yang lebih luas, yang mencakup preprocessing, kompilasi, dan penautan.
sumber
Perbedaan lainnya adalah bahwa executable memiliki offset alamat titik masuk yang ditentukan, yaitu 0x08048000 untuk i386, 0x00400000 untuk x86 dan 0x00010000 untuk arm.
File objek bersama bisa berupa pustaka, tetapi juga dapat dieksekusi. Ketika menjadi executable, tidak ada offset semacam itu. Sebuah objek executable bersama , sehingga untuk mengatakan, adalah executable independen posisional (PIE) menggunakan alamat tata ruang pengacakan (ASLR). Dengan demikian, ketika melihat file / proc / pid / maps-nya, Anda akan melihat bahwa lokasi segmen yang dimuat bervariasi di setiap eksekusi berbeda dengan yang dapat dieksekusi standar.
Gagasan di balik fitur ini adalah untuk menambahkan keamanan ke executables dengan menghalangi penyerang melakukan serangan pemrograman berorientasi kembali. Banyak pengelola memutuskan untuk membangun paket dengan PIE diaktifkan sebagai default, misalnya, sejak Fedora 23 atau dengan Ubuntu 17.10.
sumber