링커가 함수 및 변수를 제거하거나 외부 참조를 찾을 수 없음
기술노트 51348
아키텍처:
All
컴포넌트:
linker
업데이트:
2021-06-30 오전 2:44
소개
함수와 변수가 main()
콜 트리 또는 인터럽트 콜 트리에서 참조되지 않는 경우, 링커는 기본적으로 이를 제거합니다.__root
확장 키워드를 사용하여 링크에서 특정 변수나 함수를 유지하도록 할 수 있습니다.
__root char myvariable;
__root void myfunction(void)
{
/* function code */
}
함수/변수를 유지하는 다른 방법:
- IAR XLINK Linker
-g
option - IAR ILINK Linker
--keep
option - use the
REQUIRE
keyword in assembler
다음과 같은 이점이 있습니다:
- RAM과 ROM 사용 감소.
- "segment did not fit" 에러를 최소화.
- 사용되지 않는 "외부" 변수/함수는 검색되지 않으므로 오류 최소화
컴파일러는 절대 주소에서 사용되지 않는 변수도 제거합니다.
다른 모듈에서 참조할 경우 문제가 발생할 수 있습니다.
아래 코드로 설명할 수 있습니다.
변수 test1
만 이 컴파일 유닛에 보관됩니다.test2
, test3
및 test4
는 액세스되지 않기 때문에 유지되지 않습니다.
일부 다른 C 파일에서 test2
를 외부로 사용하는 경우 링크에서 이를 찾을 수 없습니다.
__no_init int test1 @ 0x0004;
__no_init int test2 @ 0x0008;
__no_init int test3 @ 0x000C;
__no_init int test4 @ 0x0010;
void abc(void)
{
test1 = 1;
}
이렇게 하는 한 가지 중요한 이유는 장비 별 .h
파일이 두 개 이상의 모듈에 포함될 경우 세그먼트 오버랩(segment overlap) 오류를 발생시킬 수 있는 매우 많은 변수를 생성하기 때문입니다.
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.