Bagaimana bash mengeksekusi file ELF?

8

Ketika saya menggunakan Linux Box, saya menggunakan bash sebagai shell. Sekarang saya bertanya-tanya bagaimana bash menangani eksekusi file ELF, saat itulah saya mengetik ./program dan program adalah file ELF. Saya memahami bash-4.3.tar.gz, sepertinya tidak ada semacam parser angka ajaib untuk mencari tahu apakah file tersebut adalah ELF atau apakah saya menemukan syscall exec ().

Bagaimana cara kerjanya? Bagaimana bash meneruskan eksekusi ELF ke OS?

JohnnyFromBF
sumber

Jawaban:

15

Bash tidak tahu apa-apa tentang ELF. Itu hanya melihat bahwa Anda memintanya untuk menjalankan program eksternal, sehingga melewati nama yang Anda berikan apa adanya execve(2). Pengetahuan tentang hal-hal seperti format file yang dapat dieksekusi, baris shebang , dan mengeksekusi izin tinggal di balik syscall itu , di kernel.

(Ini sama untuk shell lain, meskipun mereka dapat memilih untuk menggunakan fungsi lain dalam exec(3)keluarga.)

Dalam Bash 4.3, ini terjadi pada baris 5195 execute_cmd.cdi dalam shell_execve()fungsi.

Jika Anda ingin memahami Linux di tingkat kode sumber, saya sarankan men-download salinan Penelitian Unix V6 atau V7 , dan akan melalui bahwa bukan semua kompleksitas yang ada di sistem Linux modern. The Lions Book adalah panduan yang baik untuk kode.

V7 adalah tempat shell Bourne memulai debutnya. Seluruh kode sumber C-nya hanya sedikit lebih dari setengah ukuran hanya satu file C di Bash. The Thompson shell di V6 hampir setengah ukuran asli Bourne shell. Namun, kedua cangkang yang lebih sederhana ini melakukan hal yang sama seperti Bash, dan untuk alasan yang sama. (Tampaknya merupakan execv(2)panggilan dari texec()dalam shell Thompson dan execve()panggilan dari execs()dalam service.cmodul shell Bourne .)

Warren Young
sumber