PE / COFF符号类型字段

时间:2014-02-02 02:48:39

标签: windows winapi portable-executable coff

Microsoft的PE / COFF文档说明了符号表中的类型字段:

“最重要的字节指定符号是指针,函数返回还是LSB中指定的基类型数组.Microsoft工具仅使用此字段来指示符号是否为函数,以便对于Type字段,唯一的两个结果值是0x0和0x20。“

但是,文档和winnt.h都指定IMAGE_SYM_DTYPE_FUNCTION = 2,而不是0x20。即使这被认为是MSB的值,也会给出整个0x200字段的值,而不是0x20。

我错过了什么?

1 个答案:

答案 0 :(得分:4)

检查winnt.h以获取以下行:

// type packing constants

#define N_BTMASK                            0x000F
#define N_TMASK                             0x0030
#define N_TMASK1                            0x00C0
#define N_TMASK2                            0x00F0
#define N_BTSHFT                            4
#define N_TSHIFT                            2
// MACROS

// Basic Type of  x
#define BTYPE(x) ((x) & N_BTMASK)

// Is x a pointer?
#ifndef ISPTR
#define ISPTR(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT))
#endif

// Is x a function?
#ifndef ISFCN
#define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))
#endif

所以似乎官方MSB,LSB描述错误 - 它们不是字节而是半字节。所以0x20将是一个函数(MS nibble = 2),返回基类型IMAGE_SYM_TYPE_NULL(LS nibble = 0)。