gpt4 book ai didi

c - 获取可执行文件中文本部分的开始和结束地址

转载 作者:太空狗 更新时间:2023-10-29 16:33:28 24 4
gpt4 key购买 nike

我需要获取可执行文件文本部分的开始和结束地址。我怎样才能得到它?

我可以从_init 符号或_start 符号获取起始地址,但是结束地址呢?我是否应该将 text 部分的结束地址视为 .rodata 部分开始之前的最后一个地址?

或者我应该编辑默认的 ld 脚本并添加我自己的符号来指示文本部分的开始和结束,并在编译时将其传递给 GCC?在这种情况下,我应该在哪里放置新的符号,我应该考虑 init 和 fini 部分吗?

有什么好的方法可以获取正文段的起始地址和结束地址?

最佳答案

用于基于 ELF 的平台的 GNU binutils 默认链接器脚本通常定义了大量不同的符号,可用于查找各个部分的开始和结束。

文本部分的末尾通常通过选择三种不同的符号来引用:etext_etext__etext;开始可以作为 __executable_start 找到。 (请注意,这些符号通常使用 PROVIDE() 机制导出,这意味着如果您的可执行文件中的其他内容定义它们而不是仅仅引用它们,它们将被覆盖。特别是这意味着 _etext__etext 可能是比 etext 更安全的选择。)

例子:

$ cat etext.c
#include <stdio.h>

extern char __executable_start;
extern char __etext;

int main(void)
{
printf("0x%lx\n", (unsigned long)&__executable_start);
printf("0x%lx\n", (unsigned long)&__etext);
return 0;
}
$ gcc -Wall -o etext etext.c
$ ./etext
0x8048000
0x80484a0
$

我不相信这些符号中的任何一个是由任何标准指定的,所以这不应该被假定为可移植的(我不知道 GNU binutils 是否为所有 ELF 提供它们-based 平台,或者所提供的符号集是否在不同的 binutils 版本中发生了变化),尽管我猜想如果 a)你正在做一些需要这些信息的事情,并且 b)你正在考虑将被黑的链接描述文件作为一个选项,那么可移植性不是太担心!

要查看在特定平台上构建特定事物时获得的确切符号集,请将 --verbose 标志提供给 ld(或 - Wl,--verbosegcc) 来打印它选择使用的链接器脚本(实际上有几种不同的默认链接器脚本,它们根据链接器选项和您的对象类型而有所不同正在 build )。

关于c - 获取可执行文件中文本部分的开始和结束地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7370407/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com