我实际上是想通过C程序获取objdump -s命令给出的标志。但我不知道在哪里寻找它们。例如:
./my_objdump: file format elf64-x86-64
architecture: i386:x86-64, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x00000000004006f0
我想知道如何获得: 标志0x00000112: EXEC_P,HAS_SYMS,D_PAGED 在C. 谢谢
答案 0 :(得分:2)
我想知道如何获取:标志0x00000112:EXEC_P,HAS_SYMS,C中的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,则需要进行明显的调整。它还假设您正在查看 native ELF文件。在little-endian机器上检查big-endian ELF文件(反之亦然)需要额外的工作。