c++ - Linux elf .text方向

标签 c++ c linux elf

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

最佳答案

I want to know to the .text start and size of my c++ application.

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

请注意,可执行文件根本不需要 .text 部分:部分表可能会被剥离,并且可执行文件仍然会运行得很好。对于这样的二进制文件,您的问题无法回答。

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

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

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

关于c++ - Linux elf .text方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47617269/

相关文章:

c++ - Visual C++ 错误 LNK1120 编译

c++ - 给类(class)成员打分

c - Erlang NIF 从单个进程在内存中存储结构

mysql - 安装mysql时yum事务检查错误

我可以将 stdin 和 stdout 解析为 char* 然后给它们指针吗?

linux - 想要从一个txt文件复制到另一个

c++ - 在visual studio中,在c++项目的项目属性中,引用窗口是什么?

c++ - 多线程 galib247 遗传算法卡在局部最大值

c - 如何用C语言编写求和函数的代码?

c - 奇怪的 C 程序行为