Dapat dieksekusi vs Objek bersama

13

Saya memperhatikan sesuatu saat melakukan find /bin -exec file {} \;:

yang filelaporan perintah beberapa entri dalam /binyang 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 fileuntuk /bin/echoadalah:

/ 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 executablefile dan shared objectfile.

Sergiy Kolodyazhnyy
sumber

Jawaban:

14

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:

  • Menggunakan tautan statis: perpustakaan eksternal yang termasuk dalam kode sumber dikompilasi dan perpustakaan terkompilasi (atau objek dalam perspektif tautan) ditambahkan ke executable itu sendiri;
  • Menggunakan tautan dinamis: perpustakaan eksternal yang termasuk dalam kode sumber dikompilasi tetapi tautan ke perpustakaan terkompilasi (atau objek dalam perspektif tautan) ditambahkan ke yang dapat dieksekusi (dan perpustakaan / objek yang dikompilasi dimuat oleh tautan pada saat run-time jika dibutuhkan);

Ada kelebihan / kekurangan dalam menggunakan masing-masing metode ini, tetapi itu bukan poin dari pertanyaan;

  • /bin/ntfsckdan /usr/bin/gawkmerupakan objek bersama: ini berarti bahwa executable dapat dikompilasi dan kemudian dihubungkan dengannya untuk menggunakan fungsionalitasnya;
  • /bin/echoadalah executable: ini berarti bahwa executable mungkin tidak dikompilasi dan kemudian dihubungkan dengannya untuk menggunakan fungsionalitasnya;

Jadi /bin/ntfsckdan /usr/bin/gawksecara 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 filelaporan (untuk masing-masing):

ditautkan secara dinamis (menggunakan lib bersama)

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.

kos
sumber
1
ditautkan secara dinamis ke objek bersama lainnya , IN OS? atau berbagi perpustakaan itu sendiri ?!
Dr.jacky
@ Mr.Hyde Di OS, lebih khusus di lokasi yang harus dikonfigurasikan sebelumnya di linker, sehingga linker dapat memuatnya saat run-time jika diperlukan. Lihat di sini , bab 3.2.
kos
Seseorang dapat benar-benar menautkan file executable menggunakan dlopen: D example
Adam Zahran
4

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.

florian
sumber
Jawaban yang menarik. Tidak memiliki beberapa sumber (akan lebih baik jika Anda menambahkan beberapa tautan, terutama untuk bagian titik masuk) tetapi saya mencari beberapa pertanyaan stackoverflow tentang hal itu. Tapi jawaban pasti bagus.
Sergiy Kolodyazhnyy