对于ELF文件,如何确定哪个节包含可执行的二进制代码?

6

我正在学习ELF并有一个疑问已经困扰了我一段时间。我尝试寻找答案,但徒劳无功。如果有人能给我答案或指导我在哪里找到答案,我将不胜感激。

我读的几乎所有关于ELF的文档都说.text节包含可执行二进制代码(.data 包含数据....)。然而,当我使用readelf查看obj文件中包含的节时,我没有看到.text节,但有一个名为i.main的节,其中包含可执行代码(从这个节所包含的代码中我找到了机器码)。以下是readelf解析的节的内容:

节头部分: [编号] 名称 类型 地址 偏移量 大小 ES 标志位 Lk Inf Al [ 0] 空 00000000 000000 000000 00 0 0 0 [ 1] i.main PROGBITS 00000000 000034 00000a 00 AX 0 0 2 [ 2] .arm_vfe_header PROGBITS 00000000 000040 000004 00 0 0 4 [ 3] .comment PROGBITS 00000000 000044 0001c6 00 0 0 1 [ 4] .debug_frame PROGBITS 00000000 00020a 00003c 00 0 0 1 [ 5] .debug_info PROGBITS 00000000 000246 000088 00 0 0 1 [ 6] .debug_info PROGBITS 00000000 0002ce 0000dc 00 0 0 1 [ 7] .debug_line PROGBITS 00000000 0003aa 000030 00 0 0 1 [ 8] .debug_line PROGBITS 00000000 0003da 000044 00 0 0 1 [ 9] .debug_loc PROGBITS 00000000 00041e 000014 00 0 0 1 [10] .debug_macinfo PROGBITS 00000000 000432 000308 00 0 0 1 [11] .debug_pubnames PROGBITS 00000000 00073a 00001b 00 0 0 1 [12] __ARM_grp..debug_ GROUP 00000000 000758 000008 04 14 14 4 [13] .debug_abbrev PROGBITS 00000000 000760 0005a4 00 G 0 0 1 [14] .symtab SYMTAB 00000000 000d04 000110 10 21 13 4 [15] .rel.debug_frame REL 00000000 000e14 000010 08 14 4 4 [16] .rel.debug_info REL 00000000 000e24 000018 08 14 5 4 [17] .rel.debug_info REL 00000000 000e3c 000038 08 14 6 4 [18] .rel.debug_line REL 00000000 000e74 000008 08 14 8 4 [19] .rel.debug_pubnam REL 00000000 000e7c 000008 08 14 11 4 [20] .shstrtab STRTAB 00000000 000e84 0000f2 00 0 0 1 [21] .strtab STRTAB 00000000 000f76 0001b3 00 0 0 1 [22] .ARM.attributes ARM_ATTRIBUTES 00000000 001129 000044 00 0 0 1

看起来节名称可以任意选择(我是对的吗?)如果是这样,那么我的问题是:

  1. 如何知道哪个节包含什么?(例如,哪个节包含代码,哪个节包含只读数据....)。

  2. 如何了解每个节的定义,例如我如何知道"[12] __ARM_grp..debug_" 这个节的目的是什么?

提前致谢。

1个回答

3
关于您问题的第一部分,确定哪些部分包含代码,哪些部分包含只读数据,一个好的方法是查看区段属性标志。
使用命令readelf -SX表示该部分包含可执行指令,A表示该部分在进程执行期间占用内存,W表示该部分应该是可写的。
因此,在您的目标文件中,有一个名为i.main的部分是可执行的,而且它也是只读的。其他部分既不可写,也不是只读的,因为它们根本没有在内存中。
我不太熟悉ARM二进制文件,所以无法回答您问题的其他部分。

1
请注意,在可执行文件(或共享库)中,不是必需的,可以完全剥离,尽管这并不常见。在运行时,只有才是重要的。 - Employed Russian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接