절대번지에 위치한 변수
기술노트 43262
아키텍처:
All
컴포넌트:
compiler
업데이트:
2021-05-11 오전 5:58
소개
본 기술 노트는 절대번지에 배치될 변수를 다루는 법을 설명합니다.
문제
경우에 따라 절대번지 변수가 정의되지 않았다는 링커 에러가 발생할 수 있습니다. 이는 이러한 변수를 정의해야 하는 비직관적인 방식과 관련이 있을 수 있습니다.
해결방법
변수를 참조하는 모든 소스파일에 포함되는 헤더 파일에 변수를 위치하고 정의하세요.
배경지식/자세한 정보
절대 주소에 위치하는 변수는 일반적인 C/C++ 비자동(non-auto) 변수들과 비교하여 약간 다른 동작을 가집니다. 절대 주소에 위치하는 변수들은 절대영역(absolute segment)에 위치합니다. (ABSOLUTE
나 xxxx_AN
과 같은) 이미 변수가 컴파일 타임에 위치하게 되므로, 절대 영역은 링커 파일에는 없습니다.
파일 범위를 가진 다른 (일반적인) 비자동 변수들은 일반적으로 링크 파일에 의해 해석될 재배치 세그먼트에 위치합니다. 그 이유는 주소 확인이 링크 시간에 이루어지기 때문입니다.
명백하지 않은 행동:
절대 위치에 있는 각 변수에 대한 정의는 현재 컴파일 단위 (파일)에 대해 실제로 로컬에 있으므로, 변수에 접근하는 각 컴파일 단위의 정의를 가질 수 있습니다. 링크 시에는 이러한 여러 정의는 충돌하지 않습니다. (모든 모듈에 동일한 방식으로 정의해야 합니다) 절대 위치 변수를 사용하지 않으면, 컴파일 단위에서 해당 변수가 삭제됩니다. 사용한다면, 그것은 출력 파일에 있을 것이고, 그 이유는 다음 두 가지 입니다. 첫 번째로, 그것은 사용되기에, 링크 단계에서 그것의 절대 주소를 차지해야합니다. 두 번째로, 링커가 모든 모듈에서 정의가 일치하는지 확인할 수 있게 합니다. 즉, 여러 파일에서 사용해야 할 경우, 헤더 파일에 정의 (일반적으로 사용하는 선언 방식이 아닌)를 배치해야 합니다:
setup.h
:
__no_init struct setup configuration @ 0x100;
Then just include setup.h
header file from all source files that need to access it.
접근이 필요한 모든 소스 파일에 setup.h 헤더 파일을 포함시킵니다.
한가지 기억해야 할 것은 메모리 위치를 설명하는 #define를 가진것으로 생각하고, 링커가 일관성을 확인 할 수 있도록 하는 것입니다.
반면 객체를 지정된 세그먼트에 배치하는 경우:
__no_init struct setup located_configuration @ "SETUP";
그런 다음, 세그먼트 SETUP은 반드시 링커 파일에 정의하고 위치 시켜야합니다. 세그먼트에 위치한 변수는 일반적인 C 변수로 작동하여, 헤더파일에 다음과 같이 선언을 입력합니다:
setup.h
:
extern __no_init struct setup located_configuration;
그런 다음 정의를 하나의 소스파일에 넣어야합니다:
__no_init struct setup located_configuration @ "SETUP";
만약 @-구문이 싫다면 다음과 같이 동일하게 동작하는 구문을
#pragma location=
대신 사용할 수 있습니다.
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.