관리 메뉴

KorSA

Makefile - multiple definition of 'main' 오류 원인 본문

Study/임베디드OS (RTOS)

Makefile - multiple definition of 'main' 오류 원인

Praiv. 2024. 4. 2. 09:00
320x100

 

[임베디드 OS 개발 프로젝트 (이만우)] 책을 따라 어셈블리 코드 -> C 언어 코드 부팅 예제를 따라하고 있었다.

분명 책에 있는 그대로 Makefile 을 작성했다고 하는데

multiple definition of 'main' 이라는 오류가 발생했다.

 

현재 공부중인 예제는

어셈블리 코드로 작성된 Entry.S 파일에서 BL main 이라는 명령어를 통해 main 함수로 분기를 이동한다.

이 main 파일은 Main.c 파일에 정의되어 있는 함수이고,

기본적으로 c언어에서 정의된 함수 이름은 전역으로 선언되기 때문에 Entry.S 파일에서도 main 함수의 위치가 어디인지 알 수 있다.

 

Makefile에서는 Main.c 파일을 컴파일해서 Main.o 파일을 만들고,

Entry.S 파일을 컴파일하여 Entry.os 파일을 만든다.

이후 링커를 통해 이 두 OBJ 파일을 링킹하여 서로를 연결시키는 방식이다.

 

아무리 눈씻고 찾아봐도 main 이라는 함수명은 Main.c 파일에서만 선언되어 있었는데

계속 중복 선언되었다고 오류가 발생하는 현상이었다.

 

결국 삽질 끝에 찾은 원인은... 오타 였다.

 

Makefile에서 Entry.S 파일을 Entry.os 로 컴파일해야 하는데 Entry.o 로 컴파일을 했던 것이다.

s 하나가 빠진 채로 OBJ 파일이 생성된 것이다.

정상적으로 Entry.os를 생성하도록 Makefile을 수정하자 해당 오류가 사라지고 컴파일과 실행도 깔끔하게 되었다!!

 

아마 Entry.o 파일에 있던 BL main 명령어에서 main 이라는 이름이 한번 나오고,

Main.o 파일에 있던 main 함수에서 main 이라는 이름이 또 한번 나왔기 때문에

multiple definition 으로 인식된걸로 짐작할 수 있었다.

 

그런데 .os 파일과 .o 파일은 어떤 차이점이 있길래 이렇게 definition에 영향을 주는 걸까?

이런 저런 조사를 해보았지만 두 확장자 모두 오브젝트 파일을 뜻하고

특정 개발 환경이나 빌드 시스템의 관례에 따라 다를 수 있다는 점 밖에 찾지 못했다.

 

현재 예제를 실행하는 환경이 ARM 아키텍처의 cortex-a8 CPU 인데

이 둘 간의 차이가 있지 않을까 싶다.

 

여하튼, Entry.o 파일로 변환하면 컴파일이 실패하고 Entry.os 파일로 변환하면 성공하긴 하니까..

그래도 좀 찝찝함이 남긴 한다..

728x90
728x90

'Study > 임베디드OS (RTOS)' 카테고리의 다른 글

어셈블리어 명령어 정리  (0) 2024.03.31
Comments