【问题标题】:Linux elf .text directionLinux精灵.text方向
【发布时间】:2017-12-03 09:59:21
【问题描述】:

我想知道我的 c++ 应用程序的 .text 开头和大小。我一直在阅读与此相关的主题 (link),但我无法做我想做的事。

分析我的示例程序的 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

所以我知道我的程序的 .text 部分从 0x400830 地址开始。

但我无法从我的程序中访问此地址:

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 部分的起始地址。我需要知道大小或结束地址...这可能吗?

【问题讨论】:

  • __etext 是文本部分的结尾,“e”有点暗示你。
  • C != C++。仅使用您正在使用的语言进行标记,除非两者确实相关。
  • 如果 __etext 是文本部分的结尾......我如何才能获得文本部分的开头?
  • 另外,取决于你想要达到的目标,ALSR 可能是一个严肃的 PITA

标签: c++ c linux elf


【解决方案1】:

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

如果您告诉我们为什么您想知道这一点,您可能会得到更好的答案。

请注意,可执行文件不需要有一个.text 部分完全:部分表可能会被剥离,而可执行文件仍然可以正常运行。对于这样的二进制文件,您的问题无法回答。

要知道 ELF 二进制文件 .text 的确切偏移量和大小,只需读取节表(就像 readelf 所做的那样)。我是not hard

如果不这样做,您可以通过使用启发式/近似法非常接近。

您已经找到了__executable_start__etext。使用&__start 可以获得更紧密的界限——通常.text 部分中的第一个符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多