2013-03-12 33 views
0

我實際上試圖通過C程序獲取objdump -s命令給出的標誌。但我不知道在哪裏尋找他們。例如這裏:使用C程序獲取程序標誌

./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. 謝謝

+4

爲什麼不直接看看objdump做了什麼?它是開源的,對嗎? – 2013-03-12 22:18:11

+0

在Linux上運行'strace'顯示沒有系統調用,但有很多'read'和'lseek',所以這是進入二進制文件並直接解釋數據的情況。您需要的部分將位於源代碼中,如上所述。 – teppic 2013-03-12 22:38:14

+0

總是有[libELF](http://directory.fsf.org/wiki/Libelf)它允許您讀取(和修改)ELF文件。 – Petesh 2013-03-13 00:38:34

回答

2

我想知道如何得到:標誌0x00000112:EXEC_P,HAS_SYMS,D_PAGED在C.

這不是從你的問題清楚你是否不知道如何獲得數量0x112,或如何將該號碼翻譯成EXEC_P等。[1]

前者是Elf64_Ehdr中e_flags的值,該值在文件的開頭。也就是說,你在該文件中偏離0sizeof(struct Elf64_Ehdr)字節讀入到緩衝液[2],然後:

printf("flags: 0x%x\n", ((struct Elf64_Ehdr *)buf)->e_flags); 

後者:EXEC_PHAS_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文件(反之亦然)需要額外的工作。