2012-03-13 6 views
0

__data_start 심볼의 주소를 프로그램에서 얻고 싶습니다. _GLOBAL_OFFSET_TABLE_의 경우 extern void* _GLOBAL_OFFSET_TABLE_을 사용했습니다 (예제 here 참조). 그러나 __data_start의 경우 동일한 기술이 작동하지 않습니다. 컴파일러가 프로그램을 잘 컴파일하지만 프로그램이 반환하는 값은 가짜입니다. 어떻게하면이 문제를 해결할 수 있는지 생각해보십시오.__data_start 심볼의 주소 얻기

+2

작동하지 않았습니다. 다른 질문에 대한 내 의견을 참조하십시오. '__data_start'를'& __ data_start'로 변경하십시오. –

+0

@R .. 멋지다! 그것의 작품은 지금! 감사! 어쩌면 당신은 대답으로 이것을 넣을 수 있으므로 받아 들일 수 있습니다. – MetallicPriest

답변

3

__data_start과 같은 마법 기호는 값이 원하는 주소 인 포인터 변수가 아닙니다. 원하는 기호의 주소입니다. 따라서 &__data_start처럼 & 연산자가 필요합니다.

+0

'__data_start'는 어디에 정의되어 있습니까? 'etext'와 달리'ld -verbose'에 의해 주어진 링커 스크립트에는 없습니다. 그러나 그것은'ld'의 유물에 나타나는 것처럼 그것을 정의하는 링커입니다. 다른 링커 스크립트는'__data_start__'을 정의하지만'__data_start'는 정의하지 않습니다. –

+0

사실 나는 전혀 모른다. 알아 내려면 링커 소스를 확인하거나 GNU ld의 전문가 인 사람에게 질문해야합니다. –

+0

물론, 확실한 경우를 대비하여 :-) 내가 알면 다시 게시 할 것입니다. –

1

당신은 (!하지 포인터의 배열이이 선언)

extern char _GLOBAL_OFFSET_TABLE_[]; 
extern char __data_start[]; 

을 시도 할 수

및 코드에서 &__data_start를 사용합니다.

+0

이 경우 배열 이름이 첫 번째 요소에 대한 포인터로 계산되므로 '&'는 필요하지 않습니다. –

+0

동의. 그러나 가독성을 위해 유용 할 수 있습니다. –

+0

불완전한 타입 (알 수없는 크기)으로 선언 된 배열에서도'&'가 유효합니까? 일반적으로'T [N]'타입의 배열에 적용된'&'의 타입은'T (*) [N]'타입이지만, 여기에는'N'이 없습니다 ... –

1

이 코드는 전혀 문제없이 작동합니다.

extern void *data_start; 
int main() { 
fprintf(stdout,">%p\n", &data_start); 
return 0; 
} 

atom :: » nm test | grep "data_start" ; ./test 
0804a00c D __data_start 
0804a00c W data_start 
>0x804a00 
+0

그것이 제대로 작동하는지 잘 모르겠습니다. 내 대답을 보라. –