2017-12-03 114 views
1

我想知道我的C++應用程序的.text開始和大小。我一直在閱讀這方面的相關主題(link),但我無法做到我想要的。Linux精靈.text方向

分析我的示例程序的readelf輸出我得到這個:

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地址我的程序啓動的.text段。

,但我不能訪問這個地址從我的程序:

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部分在所有:部分表可能被剝離,並將可執行將仍然運行得很好。對於這樣的二進制文件,你的問題是不可回答的。

要知道ELF二進制文件.text的確切偏移量和大小,只需閱讀截面表(就像readelf一樣)。這是not hard

不這樣做,你可以通過使用啓發式/近似值得到相當接近。您已找到__executable_start__etext。通過使用&__start-通常是可以獲得更緊密的界限,這是.text部分中的第一個符號。