링커가 함수 및 변수를 제거하거나 외부 참조를 찾을 수 없음

기술노트 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, test3test4는 액세스되지 않기 때문에 유지되지 않습니다.
일부 다른 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) 오류를 발생시킬 수 있는 매우 많은 변수를 생성하기 때문입니다.

 

모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.

죄송하지만, 당사 사이트에서는 Internet Explorer를 지원하지 않습니다.보다 편안한 사이트를 위해 Chrome, Edge, Firefox 등과 같은 최신 브라우저를 사용해 주시길 부탁드립니다.