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

取得方法を知りたい: flags 0x00000112: EXEC_P, HAS_SYMS, D_PAGED in C. ありがとう

4

1 に答える 1

2

取得方法を知りたい: flags 0x00000112: EXEC_P, HAS_SYMS, D_PAGED in C.

あなたの質問からは、数値 を取得する方法がわからないのか、0x112その数値を に変換する方法などがわからないのかが明確ではありませんEXEC_P。[1]

前者は、ファイルの先頭にある Elf64_Ehdr の e_flags の値です。つまり、ファイルのsizeof(struct Elf64_Ehdr)オフセットからバッファ [2] にバイト単位で読み込み、次に:0

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");
}

またはセクションが存在するHAS_SYMS場合などに設定されていると確信しています。.symtab.dynsym

[1] 注: 考えられることとは反対に、EXEC_Pフラグはから導出できませんflags

[2] ファイルが 32 ビット ELF の場合、これには明らかな調整が必要です。また、ネイティブELF ファイルを見ていることも前提としています。リトルエンディアン マシンでビッグ エンディアン ELF ファイルを調べる (またはその逆) には、追加の作業が必要になります。

于 2013-03-18T02:34:53.633 に答える