在MSVC生成的符号表中,__real、__imp和__xmm符号的含义是什么?

3

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

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

排除__imp前缀的目的似乎是为了排除函数调用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 符号,因此我无法展示这些的例子。在这个测试中,我使用的是Windows SDK 7.1和cl 116,在Windows 7 x64 SP1 上编译PostgreSQL,使用自动生成的MSBuild文件和VC项目。


这可能与浮点数有关。也许MSVC将浮点值存储为单独的符号? - user529758
对于其他人来说,??_C 符号是字符串常量,它们出现在符号表中,以便在链接期间在对象之间进行去重。目前还不知道 NULL_THUNK_DATA*__IMPORT_DESCRIPTOR*__NULL_IMPORT*@comp.id@feat.00@__security_check_cookie@4___security_cookie 或以 ( 开头的符号的含义。文档非常有限。 - Craig Ringer
2
@comp.id 指定用于生成 pecoff 的内部编译器版本。@feat.00 包含特征标志:0x01 用于安全 seh,0x02 和 0x04 用于 MSIL 图像分别识别“纯净”和“安全”。__security_cookie 与 /GS 一起使用。 - josh poley
@joshpoley 谢谢。非常感谢。是找到了相关文档还是从反汇编、杂项文章中学到的? - Craig Ringer
1个回答

3
__real是浮点数字面常量,由于没有操作码可以对fp立即数进行操作(有一种例外情况是基于堆栈的fp参数,它们被预编码并作为立即数推送),因此不能内联。因此,在二进制文件的数据或const部分中分配一个地址,并以__real为前缀。所有具有相同值的常量都聚合到单个符号中(冗余消除)。__xmm与此类似,但用于存储作为常量/静态的SIMD / SSE原语。 __imp及其类似物是用于从外部dll导入的符号(静态链接库不会生成这些前缀)。

啊,这有些讲得通。谢谢;这证实了不为这些符号发出任何.DEF条目是合适的,并解释了正在发生的事情。感激不尽 - 我很擅长 PostgreSQL,对 C 一般,对Windows特定细节相当糟糕。 - Craig Ringer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接