我是一名UNIX开发人员,帮助维护一些Windows软件,我在修复错误时正在查看.DEF
生成器。它会从导出中排除__xmm
,__real
和__imp
- 前缀符号。
我一直试图弄清楚这些符号到底是什么。很明显它们不需要出现在.DEF
文件中(如果它们需要在DLL接口上导出,编译器会__declspec(dllexport)
注释它们自己)但是......它们是什么?< / p>
排除__imp
前缀的目的似乎是排除function call thunks。正确的吗?
搜索MSDN并未提供__xmm
或__real
的信息(在旁注中,social.msdn.microsoft.com
在使用{搜索时msdn.microsoft.com
的子域名时非常烦人{1}})。
因此,为了理解正在发生的事情,是否有人能够解释(或链接到引用)site:msdn.microsoft.com
和__xmm
前缀符号是什么?
示例:
__real
(我的当前构建似乎没有产生任何1B8 00000000 SECT5C notype External | __real@4132d68700000000
307 00000000 SECTB8 notype External | __real@4059000000000000
syms,所以我无法显示这些的示例。我在Windows 7 x64 SP1上使用Windows SDK 7.1和cl 116进行此测试,使用自动生成的MSBuild文件和VC项目编译PostgreSQL。
答案 0 :(得分:2)
__real
是浮点文字/常量,不能内联,因为没有可以作用于fp immediates的操作码(这是一个例外,它是基于堆栈的fp参数,它们被预编码并作为immediates推送),因此它们被分配一个地址在二进制数据或const部分和前缀__real
;具有相同值的所有常量将聚合为单个符号(冗余消除)。 __xmm
与存储为常量/静态的SIMD / SSE基元完全相同。
__imp
及其类似用于从外部dll导入的符号(静态链接库不会生成这些前缀)。