exe 같은 프로그램이 시작되는 과정이 궁금합니다

사람이 짠 프로그램이 컴퓨터가 이해하는 무언가로 바뀌는 과정은 많이 들어 봤는데요

예를들어 윈도우 운영체제에서 어떤 고수준 언어로 짠 코드를 컴파일한다고 가정한다면

고수준의 코드가 차례대로

전처리기(C/C++로 짠경우), 컴파일러, 어셈블러, 링커라는 과정을 통해 exe 파일을 만들어 내잖아요

물론 자바면 과정이 다르고 파이썬 등의 코드들도 이런 과정인지는 아직 모르겠지만…

하지만 exe파일은 기반한 CPU가 이해할 수 있는 그저 기계어의 모음일 뿐이지 그 자체로 아무 일도 안하는데

이걸 실행한다는건 이 이진 코드들을 메모리에 적재한 다음에

CPU의 인출 사이클에 차례대로 들어간다는 거잖아요?

프로그램 카운터가 메모리에 있는 내가 만든 코드들 중에서 가장 먼저 실행해야할 코드의 주소를

가지고 있고 그 다음엔 정확힌 모르겠지만 CPU가 정해진 규칙에 따라 무언가 여러가지 일을 할텐데…

그럼 이 프로그램 카운터가 가장 먼저 가져야할 주소는 제가 짠 코드에서 main함수의 시작위치…

그게 들어가 있는건가요? 만약 C/C++로 짰다고 가정하면 말이에요

링커로 최종적으로 완성된 exe파일은 “CPU야 나 시작할때 꼭 이 코드부터 시작해줘!” 같은 정보나

지시사항을 컴파일 과정 중 언젠가 생성하는건가요?

네 맞습니다. 그러한 관련된 규칙은 pe파일이라는 파일형식에 정해져있고요.
컴파일러가 코드를 생성하고 섹션을 배치할때 엔트리포인트를 정하여 파일에 씁니다.

기타 등등 여러 정보가 exe파일에 쓰여지게 되죠.

그러한 정보를 윈도우의 로더가 해석하여, 정해진대로 섹션을 메모리에 배치하고 그 후 엔트리포인트부터 프로그램을 실행하게 되는것이지요.

2 Likes

이걸 위에 분이 말씀하신 대로 진입점(Entry Point) 라고 합니다. 대개 런타임 라이브러리들이 이걸 가지고 있고, 여기서 main 함수를 실행하는 식으로 진행됩니다.

참고로 PE(Portable Executable)는 Windows에서 사용하는 용어고, 리눅스나 맥 등 POSIX 계열에서는 ELF (Executable and Linkable Format) 이라고 부릅니다. 둘 다 실행 파일을 부르는 용어지만 세부 스펙은 당연히 다릅니다.

그래서 일반적인 경우에서 윈도우 exe를 리눅스에서 실행할 수 없는 것이지요.

2 Likes

감사합니다! pe파일하고 엔트리포인트를 알아봐야겠네요!

진입점이란 단어가 그거였군요 정말 감사합니다!