获取可执行文件中文本部分的起始和结束地址
我需要获取可执行文件文本部分的开始和结束地址。我怎样才能得到它?
我可以从 _init
符号或 _start
符号获取起始地址,但是结束地址呢?我是否应该将 text
部分的结束地址视为 .rodata
部分开始之前的最后一个地址?
或者我应该编辑默认的 ld 脚本并添加自己的符号来指示文本部分的开始和结束,并在编译时将其传递给 GCC?在这种情况下,我应该在哪里放置新符号,我应该考虑 init 和 fini 部分吗?
获取文本部分的开始和结束地址的好方法是什么?
I need to get the start and end address of an executable's text section. How can I get it?
I can get the starting address from the _init
symbol or the _start
symbol, but what about the ending address? Shall I consider the ending address of the text
section to be the last address before starting of the .rodata
section?
Or shall I edit the default ld script and add my own symbols to indicate the start and end of the text section, and pass it to GCC when compiling? In this case, where shall I place the new symbols, shall I consider the init and fini section?
What is a good way to get the start and end address of the text section?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
基于 ELF 的平台的 GNU binutils 默认链接器脚本通常定义大量不同的符号,可用于查找各个部分的开始和结束。
文本部分的末尾通常通过选择三种不同的符号来引用:
etext
、_etext
或__etext
;可以通过__executable_start
找到开始。 (请注意,这些符号通常使用 PROVIDE() 机制导出,这意味着它们将被覆盖如果可执行文件中的其他内容定义它们而不是仅仅引用它们,特别是意味着_etext
或__etext
。可能是比etext
。)示例:
我不相信任何标准都指定了这些符号,因此不应假定它们是可移植的(我不知道甚至 GNU binutils 是否也提供了它们所有基于 ELF 的平台,或者提供的符号集是否在不同的 binutils 版本中发生了变化),尽管我猜测是否 a) 你正在做一些需要这些信息的事情,b) 你正在考虑黑客链接描述文件作为一个选项,然后是可移植性不用太担心!
要查看在特定平台上构建特定事物时获得的确切符号集,请将
--verbose
标志赋予ld
(或-Wl,- -verbose
到gcc
)来打印它选择使用的链接器脚本(实际上有几种不同的默认链接器脚本,它们根据链接器选项和您正在构建的对象类型而变化)。The GNU binutils default linker scripts for ELF-based platforms normally define quite a number of different symbols which can be used to find the start and end of various sections.
The end of the text section is usually referenced by a choice of three different symbols:
etext
,_etext
or__etext
; the start can be found as__executable_start
. (Note that these symbols are usually exported using the PROVIDE() mechanism, which means that they will be overridden if something else in your executable defines them rather than merely referencing them. In particular that means that_etext
or__etext
are likely to be safer choices thanetext
.)Example:
I don't believe that any of these symbols are specified by any standard, so this shouldn't be assumed to be portable (I have no idea whether even GNU binutils provides them for all ELF-based platforms, or whether the set of symbols provided has changed over different binutils versions), although I guess if a) you are doing something that needs this information, and b) you're considering hacked linker scripts as an option, then portability isn't too much of a concern!
To see the exact set of symbols you get when building a particular thing on a particular platform, give the
--verbose
flag told
(or-Wl,--verbose
togcc
) to print the linker script it chooses to use (there are really several different default linker scripts, which vary according to linker options and the type of object you're building).谈论“the”文本段是不正确的,因为可能有多个文本段(当您拥有共享库时通常情况下可以保证,但单个 ELF 二进制文件仍然可能有多个
PT_LOAD
无论如何具有相同标志的部分)。以下示例程序转储 dl_iterate_phr 返回的所有信息。您对带有
PF_X
标志的PT_LOAD
类型的任何段感兴趣(请注意,如果-z execstack,
被传递给链接器,因此您确实必须检查两者)。PT_GNU_STACK
将包含该标志It's incorrect to speak of "the" text segment, since there may be more than one (guaranteed for the usual case when you have shared libraries, but it's still possible for a single ELF binary to have multiple
PT_LOAD
sections with the same flags anyway).The following sample program dumps out all the information returned by
dl_iterate_phr
. You're interested in any segment of typePT_LOAD
with thePF_X
flag (note thatPT_GNU_STACK
will include the flag if-z execstack
is passed to the linker, so you really do have to check both).对于 Linux,请考虑使用 nm(1) 工具来检查目标文件提供的符号。您可以挑选这组符号,从中您可以了解 Matthew Slattery 在其答案中提供的两个符号。
For Linux, consider using
nm(1)
tool to inspect what symbols the object file provides. You can pick through this set of symbols, where you could learn both of the symbols that Matthew Slattery provided in his answer.不保证
.rodata
始终直接位于.text
之后。您可以使用 objdump -h file 和 readelf --sections file 来获取更多信息。使用 objdump,您可以将大小和偏移量获取到文件中。.rodata
is not guaranteed to always come directly after.text
. You can useobjdump -h file
andreadelf --sections file
to get more info. With objdump you get both size and offset into file.