빌드 중 제목과 같은 메시지의 에러가 발생했다. 에러메시지의 전체 라인은 다음과 같다.
/usr/lib/gcc/arm-none-eabi/10.3.1/../../../arm-none-eabi/bin/ld: ./scripts/corstone1000_m3.ld:169 cannot move location counter backwards (from 000000002000d324 to 0000000020004000)
이 에러에 대해 ChatGPT에 물어보니 문제는 다음과 같았다.
링커 스크립트에서 메모리 주소를 잘못 설정
좀더 자세히 살펴보자.
먼저, location counter라고 하는 변수가 있다. 이 변수의 역할은 링커가 메모리 상에서 섹션들이 배치되는 위치를 추적한다. 링커는 링커 스크립트에 나와있는 대로 섹션들을 배치하려고 한다. 여기서 메모리 주소 문제가 발생했는데, 이미 배치되어 있는 섹션에서 다음 주소로 location counter가 이동해서 배치해야 되는데 다시 뒤로 이동한게 문제였던 것이다.
문제가 된 코드는 다음과 같다.
.privileged_data :
{
. = ALIGN(4); /* 4byte align */
_sdata = .; /* Create a global symbol at data start. */
*(privileged_data)
. = ALIGN(4);
FILL(0xDEAD);
/* Ensure that un-privileged data is placed after the region reserved
* for privileged kernel data. */
/* Note that dot (.) actually refers to the byte offset from the start
* * of the current section (.privileged_data in this case). As a result,
* * setting dot (.) to a value sets the size of the section. */
. = __privileged_data_region_size__;
} >RAM AT> FLASH /* 이 섹션의 실제 위치는 RAM, but 초기값을 flash에 저장, 실행 시 starup 코드에서 RAM으로 복사 */
여기서 링커는 privileged_data 섹션을 배치했고, 에러 메시지와 같이 주소 000000002000d324 를 location counter가 가리키게 된다. 그럼 다음 섹션은 000000002000d324 이후에 배치해야되는 것이 맞는데, 다시 0000000020004000으로 이동하라는 스크립트가 있다. 이 부분이다.
. = __privileged_data_region_size__; /* __privileged_data_region_size__ = 16K; */
location counter는 위 스크립트에 따라 0000000020004000 으로 이동하고, 결국 에러가 발생했다.
해결방법은 간단하다.
privileged_data_region_size 사이즈를 좀 더 늘리는 것이다. 그럼 섹션 배치 이후 location counter가 다시 뒤로 돌아가지 않아도 된다.
'Linux' 카테고리의 다른 글
Package net-tools is not available, but is referred to by another package. (0) | 2025.05.07 |
---|---|
Package python3-distutils is not available (0) | 2025.04.21 |
Please make sure locale 'en_US.UTF-8' is available on your system (0) | 2025.04.21 |
error: externally-managed-environment (0) | 2025.04.21 |
E: Unable to locate package lz4c (0) | 2025.04.18 |