프로그래머가 코딩을 처음 배울 때, 아주아주 처음 배우면 먼저 해보는 Helloworld!.


#include<stdio.h>


int main(int argc, char **argv)

{

    printf("Hello World\n");

    return 0;


이 코드를 작성해서 터미널에 

gcc helloworld.c -o helloworld 라고 명령어를 치거나, Visual-Studio를 통해서 Run 버튼을 누르면, 결과창에 나타나는 것은 Hello World라는 한 줄이다.


왜 인지는 모르지만, main 이라는 함수를 실행하는거 보니, 이 프로그램은 main 이라는 함수가 시작지점 즉, Entry-point 인가 보다 하면서 공부를 시작했던게 기억난다. 시간이 지나고 보니 내가 했던 생각은 맞기도, 틀리기도 한 내용이다. 엄밀히 말하면 틀리기 보다는 똑똑한 운영체제가 나 대신에 Entry-point를 main함수로 지정해 준 것이라는걸(운영체제가 main함수를 엔트리 포인트로 하고 있는, 디폴트 링커스크립트를 제공해준다는 걸) 나중에 머리가 조금 크고 나니 알게 되었다.


프로그램을 작성하려면 내 코드를 기계어로 바꿔주는 컴파일러에게 "내가 만든 이 코드들을 여기부터 시작해야되!" 라는 힌트를 제공해주어야 한다. 사실, Entry-point 말고도 여러가지 힌트들을 제공해주어야 하는데 링커스크립트를 통해서 제공해준다.


바로 위 문장을 보고나면 아래와 같은 질문들이 생긴다.

  • 링커스크립트(Linker-Script)가 뭔대?!
  • 어떠한 힌트들을 제공해 주는데?
  • Entry-point에 대한 힌트는 어떻게 제공하는데?
모든 질문에 대한 답은 나중에 다른 글을 통해서 알게되겠지만, 이 글에서는 마지막 질문에 대해서만 대답해보려 한다.
링크를 눌러 한 번 살펴보면, ENTRY라는 명령어 또는 지시어 라고 불리는 함수 같이 생긴 놈을 호출하는 형식으로 내 프로그램이 처음으로 시작되는 지점을 컴파일러에게 힌트로 제공하는 셈이다. 컴파일러는 내가 만든 코드들을 기계어로 바꿔주는 역할을 하고, 이러한 컴파일러에게 
"너가 만든 기계어 중에서 제일 먼저 시작되어야 할 기계어는 이거야" 라고 말을 해주어야 하는 셈이다.

리눅스 커널의 링커스크립트를 살펴보면,

<linux/arch/arm64/kernel/vmlinux.lds.S>


이렇게 _text라는 심볼을 리눅스의 처음 시작 지점으로 할게! 라고 컴파일러에게 정보를 제공해주고 있다.


이처럼 링커스크립트에서 ENTRY라는 지시어는 프로그램의 시작지점 즉 엔트리 포인트를 지정해주는 지시어! 이다.




 










'전공공부 > ARM' 카테고리의 다른 글

ARM Relocations (adrp)  (0) 2020.10.18
[ARM] Alignment가 무엇인가?!  (0) 2019.02.17
GICv3 LPI, ITS  (0) 2018.07.18
interrupt status - level sensitive  (0) 2018.07.17
ARMv8 HPPIR/IAR, AHPPIR/AIAR  (0) 2018.03.27

+ Recent posts