我想知道如何获取:标志 0x00000112:C 中的 EXEC_P、HAS_SYMS、D_PAGED。
从您的问题中不清楚您是否不知道如何获取数字0x112
,或者如何将该数字翻译成EXEC_P
等等。 [1]
前者是Elf64_Ehdr中e_flags的值,就在文件的开头。也就是说,您sizeof(struct Elf64_Ehdr)
从文件中的偏移量中读取字节0
到缓冲区 [2],然后:
printf("flags: 0x%x\n", ((struct Elf64_Ehdr *)buf)->e_flags);
后者:EXEC_P
,HAS_SYMS
等表示内部使用的标志,与实际文件libbfd
几乎没有关系。ELF
它们是内部抽象,并且(或应该)对任何人都不感兴趣。
但如果你真的在乎,D_PAGED
如果文件有,则设置标志e_phnum != 0
,即
if (((struct Elf64_Ehdr *)buf)->e_phnum != 0) {
printf("D_PAGED\n");
}
我确信HAS_SYMS
如果.symtab
或.dynsym
部分存在,则设置,等等。
[1] 注意:与人们的想法相反,EXEC_P
等标志不能从flags
.
[2] 如果您的文件是 32 位 ELF,则需要进行明显的调整。它还假设您正在查看本机ELF 文件。在 little-endian 机器上检查 big-endian ELF 文件(反之亦然)需要额外的工作。