2017-12-03 23 views
1

.text 시작 및 내 C++ 응용 프로그램의 크기를 알고 싶습니다. 이 (link)에 관한 관련 주제를 읽었지만 원하는 것을 할 수 없습니다. 리눅스 엘프. 텍스트 방향

Section Headers: 
[Nr] Name    Type    Address   Offset 
Size    EntSize   Flags Link Info Align 

[14] .text    PROGBITS   0000000000400830 00000830 
0000000000000252 0000000000000000 AX  0  0  16 

그래서 본인은 0x400830 주소에서 내 프로그램 시작의 텍스트 섹션 :

내 샘플 프로그램의 readelf 출력을 분석 난이 있어요.

는하지만 내 프로그램에서이 주소에 대한 액세스를 기울인다 :

printf("My process ID : %d\n", getpid()); 
printf("Executable Start address: 0x%lx\n", (unsigned long)&__executable_start); 
printf("Text Start Address: 0x%lx\n", (unsigned long)&__etext); 

그러나 출력은 다음과 같습니다

My process ID : 4029 
Executable Start address: 0x400000 
Text Start Address: 0x400a8d 

당신이 시작 주소가 동일하지 않습니다 볼 수 있듯이. .text 섹션의 시작 주소에 어떻게 액세스 할 수 있습니까? 크기 또는 최종 주소를 알아야합니다 ... 가능합니까?

+0

__etext는 텍스트 섹션의 끝 부분입니다. "e"는 그 점을 알려줍니다. –

+0

C! = C++. 둘 다 실제로 관련이없는 한 사용중인 언어로만 태그하십시오. – tambre

+0

그리고 __etext가 텍스트 섹션의 끝이면 ... 어떻게 텍스트 섹션의 시작을 얻을 수 있습니까? –

답변

0

내 C++ 응용 프로그램의 .text 시작 및 크기를 알고 싶습니다.

당신이 알고 싶어요, 당신은 가능성이 더 나은 답을 얻었을 왜 당신이 우리에게 말했다 경우. 실행 모든에서 .text 섹션 을 가질 필요가 없습니다 않습니다

참고 : 섹션 테이블이 제거 될 수 있으며, 실행 파일은 여전히 ​​잘 실행됩니다. 그러한 바이너리의 경우 질문에 답할 수 없습니다.

.text의 정확한 오프셋과 크기를 ELF 바이너리로 알기 위해서는 섹션 테이블을 읽어야합니다 (readelf처럼). not hard입니다.

이렇게하지 않고도 경험적/근사법을 사용하면 아주 가까워 질 수 있습니다.

이미 __executable_start__etext을 발견했습니다. -일반적으로.text 섹션의 첫 번째 기호 인 더 좁은 경계를 얻을 수 있습니다.