Linux Box를 사용할 때 bash를 셸로 사용합니다. 이제 bash가 ELF 파일 실행을 어떻게 처리하는지 알고 싶습니다. 즉, ./program을 입력하면 프로그램이 ELF 파일입니다. bash-4.3.tar.gz를 grep했는데 파일이 ELF인지 알아내는 일종의 마법 파서가 없는 것 같고 exec() 시스템 호출도 찾지 못하는 것 같습니다.
전체 과정은 어떻게 진행되나요? Bash는 ELF 실행을 운영 체제에 어떻게 전달합니까?
답변1
Bash는 ELF에 대해 아무것도 모릅니다. 단지 외부 프로그램을 실행하라고 요청한 것을 보고 지정한 이름을 그대로 전달합니다.execve(2)
. 실행파일 형식 등의 지식을 이해하고,셰르본 라인, 실행 권한이 그 뒤에 있습니다시스템 호출, 커널에서.
(다른 쉘에도 동일하게 적용되지만 사용하도록 선택할 수 있습니다.exec(3)
하지만 가족. )
Bash 4.3에서는 5195행에서 이런 일이 발생합니다.execute_cmd.c
shell_execve()
기능 에서 .
소스 코드 수준에서 Linux를 이해하고 싶다면 사본을 다운로드하는 것이 좋습니다.Unix V6 또는 V7 연구, 그리고 통과저것최신 Linux 시스템에서 발견되는 모든 복잡성 대신.사자의 책코딩에 대한 좋은 가이드입니다.
V7은 어디에 있나요?본 쉘데뷔. 전체 C 소스 코드는 Bash의 C 파일 크기의 절반을 조금 넘습니다. 이것톰슨 쉘V6의 크기는 원래 Bourne 쉘 크기의 거의 절반입니다. 그러나 이 두 가지 간단한 쉘은 모두 Bash와 동일한 작업을 수행하며 동일한 이유도 있습니다. (이것은 Thompson 쉘에서의 호출 execv(2)
과 Bourne 쉘 모듈에서의 호출인 것으로 보입니다.)texec()
execve()
execs()
service.c