【问题标题】:Meaning of __real, __imp, __xmm symbols in MSVC-generated symbol tablesMSVC 生成的符号表中 __real、__imp、__xmm 符号的含义
【发布时间】:2014-02-09 07:32:13
【问题描述】:

我是一名帮助维护一些 Windows 软件的 UNIX 开发人员,我正在查看.DEF 生成器,同时修复一个错误。它从导出中排除 __xmm__real__imp 前缀符号。

我一直试图弄清楚这些符号到底是什么。很明显,它们不需要出现在 .DEF 文件中(如果它们需要在 DLL 接口上导出,编译器会 __declspec(dllexport) 自行注释它们)但是......它们是什么?

看起来排除__imp前缀的目的是排除function call thunks。对吗?

搜索 MSDN 并没有提供有关 __xmm__real 的信息(顺便说一句,当使用 site:msdn.microsoft.com 搜索时,social.msdn.microsoft.commsdn.microsoft.com 的子域,这非常烦人)。

那么,为了了解发生了什么,是否有人能够解释(或链接到参考)__xmm__real 前缀符号是什么?

例子:

1B8 00000000 SECT5C notype       External     | __real@4132d68700000000

307 00000000 SECTB8 notype       External     | __real@4059000000000000

(我当前的构建似乎没有产生任何__xmm syms,所以我无法显示这些示例。我在此测试中使用带有 cl 116 的 Windows SDK 7.1,在 Windows 7 x64 SP1 上编译PostgreSQL 使用自动生成的 MSBuild 文件和 VC 项目)。

【问题讨论】:

  • 它必须对浮点数做一些事情。也许 msvc 将浮点值存储为单独的符号?
  • 对于其他任何人来说,??_C 符号是字符串常量,它们出现在符号表中,因此可以在链接期间在对象之间进行重复数据删除。不知道NULL_THUNK_DATA*__IMPORT_DESCRIPTOR*__NULL_IMPORT*@comp.id@feat.00@__security_check_cookie@4___security_cookie 或以( 开头的符号是什么意思。文档是……有限的。
  • @comp.id 指定用于生成 pecoff 的内部编译器版本。 @feat.00 包含功能标志:0x01 用于安全 seh,0x02 和 0x04 用于分别识别“纯”和“安全”的 MSIL 图像。 __security_cookie 与 /GS 一起使用
  • @joshpoley 谢谢。非常感激。找到任何相关文档或刚刚从反汇编、杂项文章等中学习?

标签: c windows visual-c++


【解决方案1】:

__real 是浮点字面量/常量,不能内联,因为没有操作码可以作用于 fp 立即数(有一个例外,即基于堆栈的 fp 参数,它被预编码并作为立即数推送),因此它们在二进制的数据或常量部分中分配了一个地址,并以__real为前缀;所有具有相同值的常量都聚合到一个符号中(冗余消除)。 __xmm 几乎是一回事,但对于存储为常量/静态的 SIMD/SSE 原语。

__imp 及其同类用于从外部 dll 导入的符号(静态链接库不会生成这些前缀)。

【讨论】:

  • 啊,这有点道理。谢谢;这确认不为这些符号发出任何 .DEF 条目是合适的,并解释了发生了什么。赞赏 - 我对 PostgreSQL 很好,在 C 方面表现一般,在特定于 Windows 的细节方面很差。
猜你喜欢
  • 1970-01-01
  • 2013-07-18
  • 2016-10-25
  • 1970-01-01
  • 2012-06-12
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多