링커가 실행되는 방법

부팅 순서를 분석하며 링커가 어떻게 실행되는지 궁금해서 찾아보았다.

링커란? 컴파일로 생성된 object 파일을 메모리 설정이 정의된 링커 스크립트를 이용하여 실행 파일로 만드는 역할을 한다.

링커 스크립트란? 링커 스크립트의 주목적은 입력파일(object file)의 섹션이 어떻게 출력파일로 대응하는지와 출력파일의 메모리 상태를 어떻게 조정하는지를 지정하는 것이다.

링커가 실행되는 법은 다음과 같다.

G++/GCC 명령어로 링커가 실행 되며 링커 스크립트는 G++/GCC 명령어로 링커에게 전달 된다. 링커가 실행되는 G++/GCC(GNU) 명령어는 아래와 같다. “-Tscriptname.ld” 이 부분이 링커에게 linker script를 전달하라는 명렁어이다.

링커 스크립터에 관한 설명
참고 링크 : http://korea.gnu.org/manual/release/ld/ld-mahajjh/ld_3.html

makefile 명령어

arm-none-eabi-gcc -o "Study.elf" @"objects.list" $(USER_OBJS) $(LIBS) -mcpu=cortex-m3 -T"/Users/mong/STM32CubeIDE/workspace_1.10.1/Study/STM32F103C8TX_FLASH.ld" --specs=nosys.specs -Wl,-Map="Study.map" -Wl,--gc-sections -static --specs=nano.specs -mfloat-abi=soft -mthumb -Wl,--start-group -lc -lm -Wl,--end-group

아래와 사진은 makefile에서 command를 캡쳐한 사진이며 경로는 “project”/Debug/makefile에서 확인할 수 있다.

makefile_related_to_linker_script

참고 링크: http://www.stf12.org/developers/freerots_ec-linker_script.html

STM32 IDE 툴이 실행 파일을 만드는 과정

아래와 같은 사진은 STM32 CUBE IDE 툴로 빌드를 하였을 경우 .elf 파일이 생성되는 과정을 설명한 그림이다.

process_create_elf_fileprocess_create_elf_file
실행 파일 생성과정실행 파일이 Flash 메모리에 Write 되는 과정
  1. c 파일 과 .s 파일이 .o 파일로 생성
  2. 링커는 Linker 스크립트를 이용하여 .elf 파일을 생성
  3. Flash programmer 또는 Debugger를 이용하여 Flash 메모리에 저장

참고 링크: https://embedds.com/programming-stm32-discovery-using-gnu-tools-linker-script/