Làm thế nào để bash thực thi một tập tin ELF?


8

Khi tôi sử dụng Linux Box, tôi sử dụng bash làm vỏ. Bây giờ tôi tự hỏi làm thế nào bash xử lý việc thực thi tệp ELF, đó là khi tôi nhập ./program và chương trình là một tệp ELF. Tôi đã chọn bash-4.3.tar.gz, dường như không có một trình phân tích cú pháp số ma thuật nào để tìm hiểu xem tập tin có phải là ELF hay không và tôi không tìm thấy một tòa nhà exec ().

Làm thế nào để quá trình làm việc? Làm thế nào để bash vượt qua việc thực thi ELF cho HĐH?

Câu trả lời:


15

Bash không biết gì về ELF. Nó chỉ đơn giản thấy rằng bạn đã yêu cầu nó chạy một chương trình bên ngoài, vì vậy nó chuyển tên bạn đã đặt cho nó execve(2). Kiến thức về những thứ như các định dạng tập tin thực thi, dòng công việc , và thực hiện quyền cuộc sống đằng sau đó syscall , trong kernel.

(Tương tự đối với các shell khác, mặc dù chúng có thể chọn sử dụng chức năng khác trong exec(3)gia đình.)

Trong Bash 4.3, điều này xảy ra trên dòng 5195 của execute_cmd.ctrong shell_execve()chức năng.

Nếu bạn muốn hiểu Linux ở cấp mã nguồn, tôi khuyên bạn nên tải xuống một bản sao của Research Unix V6 hoặc V7 , và trải qua điều đó thay vì tất cả sự phức tạp trong các hệ thống Linux hiện đại. Sách Lions là một hướng dẫn tốt về mã.

V7 là nơi vỏ Bourne ra mắt. Toàn bộ mã nguồn C của nó chỉ lớn hơn một nửa kích thước của một tệp C trong Bash. Các vỏ Thompson trong V6 là gần một nửa kích thước của bản gốc Bourne shell. Tuy nhiên, cả hai lớp vỏ đơn giản này đều làm cùng một thứ với Bash và vì cùng một lý do. (Nó dường như là một execv(2)cuộc gọi từ texec()trong vỏ của Thompson và một execve()cuộc gọi từ execs()trong service.cmô-đun của vỏ Bourne .)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.