Linux精灵.text方向

Linux精灵.text方向

问题描述:

我想知道我的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是文本部分的结尾......我如何获得文本部分的开始? –

我想知道我的C++应用程序的.text开始和大小。

如果你告诉我们为什么你想知道的是,你很可能已经获得了更好的答案。

注意,可执行并不需要有一个.text部分在所有:部分表可能被剥离,并将可执行将仍然运行得很好。对于这样的二进制文件,你的问题是不可回答的。

要知道ELF二进制文件.text的确切偏移量和大小,只需阅读截面表(就像readelf一样)。这是not hard

不这样做,你可以通过使用启发式/近似值得到相当接近。您已找到__executable_start__etext。通过使用&__start-通常是可以获得更紧密的界限,这是.text部分中的第一个符号。