0

我实际上是在尝试通过 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:C 中的 EXEC_P、HAS_SYMS、D_PAGED。谢谢

4

1 回答 1

2

我想知道如何获取:标志 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 文件(反之亦然)需要额外的工作。

于 2013-03-18T02:34:53.633 回答