2016-10-12 7 views
1

링커 스크립트에서 PROVIDE(__KERNEL_BEGIN__ = .);을 정의했습니다. 이 작동하지 않음 다음은 (잘못된 주소를 제공),C에서 링커 스크립트에서 정의하는 변수에 액세스하는 방법은 무엇입니까?

extern uint32_t __KERNEL_BEGIN__[]; 

:하지만

주소

는 액세스 할 수 있습니다

extern uint32_t * __KERNEL_BEGIN__; 

내가 어셈블리를 바라 보았다. 첫 번째 방법 인 __KERNEL_BEGIN__은 정확한 주소를 제공합니다. 두 번째 주소 인 __KERNEL_BEGIN__ = [address]은 주소에서 값을 조회합니다.

이렇게해야합니까? 나는 그 차이를 말할 수 없다.

답변

4

extern 변수의 주소를 취해야합니다. 완전히 직관적이지는 않지만 the manual에 설명되어 있습니다.

이론상으로 extern은 원시 데이터 형식이 될 수 있습니다. 내가 모르고 나는 이유를 들어, 규칙은 사용하는 것입니다 char :

printf("Address: %08x\n", &__KERNEL_BEGIN__); 

당신에 대해 읽을 수 있습니다 :

extern char __KERNEL_BEGIN__; 

그런 다음 링커 스크립트에서 내 보낸 주소를 얻기 위해, __KERNEL_BEGIN__의 주소를 가지고 this in the manual for ld.