对于ELF文件,如何判断哪个部分包含执行二进制代码?

时间:2018-08-20 01:48:56

标签: elf

我正在研究ELF,并且有一段时间怀疑。我试图寻找答案,但徒劳无功。如果有人可以给我答案或将我引导到寻找答案的地方,我会很感激。

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

Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 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 个答案:

答案 0 :(得分:2)

对于问题的第一部分,在确定哪些部分包含代码以及哪些部分包含只读数据时,要寻找的一件好事是section属性标志。

使用readelf -S命令,X指示该节包含可执行指令,A指示该节在进程执行期间占用内存,而W指示该部分应可写。

因此,在目标文件中,有一部分i.main是可执行的,并且它也是只读的。其他部分不可写,但由于它们根本不在内存中,所以不能只读。

我对ARM二进制文件不是很熟悉,因此我无法真正解决您问题的其他部分。