微软的 PE/COFF 文档提到了符号表中的类型字段:
“最高有效字节指定符号是指向、函数返回还是 LSB 中指定的基本类型的数组。Microsoft 工具仅使用此字段来指示符号是否为函数,因此只有两个类型字段的结果值为 0x0 和 0x20。”
但是,文档和 winnt.h 都指定 IMAGE_SYM_DTYPE_FUNCTION = 2,而不是 0x20。即使这被视为 MSB 的值,它也会为整个字段提供 0x200 的值,而不是 0x20。
我错过了什么?
微软的 PE/COFF 文档提到了符号表中的类型字段:
“最高有效字节指定符号是指向、函数返回还是 LSB 中指定的基本类型的数组。Microsoft 工具仅使用此字段来指示符号是否为函数,因此只有两个类型字段的结果值为 0x0 和 0x20。”
但是,文档和 winnt.h 都指定 IMAGE_SYM_DTYPE_FUNCTION = 2,而不是 0x20。即使这被视为 MSB 的值,它也会为整个字段提供 0x200 的值,而不是 0x20。
我错过了什么?
检查 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) 的基本类型。