我想知道如何得到:標誌0x00000112:EXEC_P,HAS_SYMS,D_PAGED在C.
這不是從你的問題清楚你是否不知道如何獲得數量0x112
,或如何將該號碼翻譯成EXEC_P
等。[1]
前者是Elf64_Ehdr中e_flags的值,該值在文件的開頭。也就是說,你在該文件中偏離0
sizeof(struct Elf64_Ehdr)
字節讀入到緩衝液[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");
}
設置我相信,如果.symtab
或.dynsym
段都存在該HAS_SYMS
設置等
[1]注意:與人們可能認爲的相反,EXEC_P
等標誌是而不是可從flags
導出。
[2]如果你的文件是32位ELF,這將需要明顯的調整。它還假定您正在查看原生 ELF文件。在little-endian機器上檢查big-endian ELF文件(反之亦然)需要額外的工作。
爲什麼不直接看看objdump做了什麼?它是開源的,對嗎? – 2013-03-12 22:18:11
在Linux上運行'strace'顯示沒有系統調用,但有很多'read'和'lseek',所以這是進入二進制文件並直接解釋數據的情況。您需要的部分將位於源代碼中,如上所述。 – teppic 2013-03-12 22:38:14
總是有[libELF](http://directory.fsf.org/wiki/Libelf)它允許您讀取(和修改)ELF文件。 – Petesh 2013-03-13 00:38:34