【问题标题】:PE/COFF symbol type fieldPE/COFF 符号类型字段
【发布时间】:2014-02-02 02:48:39
【问题描述】:

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

"最高有效字节指定符号是指向、函数返回还是 LSB 中指定的基本类型的数组。Microsoft 工具仅使用此字段来指示符号是否为函数,因此对于 Type 字段,仅有的两个结果值是 0x0 和 0x20。”

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

我错过了什么?

【问题讨论】:

    标签: windows winapi portable-executable coff


    【解决方案1】:

    检查 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) 的基本类型。

    【讨论】:

      猜你喜欢
      • 2021-05-03
      • 2014-03-17
      • 2011-01-11
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多