1

Ruby 1.9.1 在使用默认 -arch:SSE 编译器标志构建时,由于未解析的外部因素,无法使用 Visual Studio 2012(update1 和 2)构建。

    cl -nologo -LD main.obj dmyext.obj msvcr110-ruby191-static.lib  msvcr110-ruby191.res unicows.lib oldnames.lib user32.lib advapi32.lib shell32.lib ws2_32.lib  -Femsvcr110-ruby191.dll -link -incremental:no -debug -opt:ref -opt:icf   -implib:dummy.lib -def:msvcr110-ruby191.def -MAP:map-out.txt
Creating library dummy.lib and object dummy.exp
dummy.exp : error LNK2001: unresolved external symbol _xmm@41f00000000000000000000000000000
dummy.exp : error LNK2001: unresolved external symbol _xmm@7fffffffffffffff7fffffffffffffff
msvcr110-ruby191.dll : fatal error LNK1120: 2 unresolved externals

打开模块定义文件,导出部分出现如下寄存器数据项:

__xmm@80000000000000008000000000000000 DATA
__xmm@80000000800000008000000080000000 DATA
_xmm@41f00000000000000000000000000000 DATA
_xmm@7fffffffffffffff7fffffffffffffff DATA

带有两个下划线的前两项不会引起问题,但带有一个下划线的后两项负责未解决的外部问题。手动修改 def 文件,使它们都有两个下划线似乎可以解决问题,但我不确定这是否只是隐藏问题或解决问题。

另一种选择是使用链接器标志 -force:unresolved 构建,但如果实际需要未解析的外部,这很危险。

解决此问题的第三个选项是使用 -arch:IA32 选项进行编译,该选项不会生成 SSE 指令。但是,此 ruby​​ dll 也是为 x64 平台构建的,似乎无法使用替代 -arch 选项成功构建 x64。

我的问题是:

xmm 寄存器数据作为导出出现在模块定义文件中是否正常/预期?

关于如何为 Win32 和 x64 平台解决这个问题有什么想法吗?

4

1 回答 1

1

这个问题现在解决了。

事实证明,有一个名为mkexports.rb的 ruby​​ 脚本为msvcr110-ruby191.lib生成导出。

在函数each_export中,有一行代码根据8-16位十六进制数字排除数据项,成功排除__real数据。

next if /(?!^)@.*@/ =~ l || /@[[:xdigit:]]{8,16}$/ =~ l || /^_DllMain@/ =~ l

修改了代码以排除基于 8 - 32 位十六进制数字的项目,现在也排除了 __xmm 数据。

next if /(?!^)@.*@/ =~ l || /@[[:xdigit:]]{8,32}$/ =~ l || /^_DllMain@/ =~ l
于 2013-05-15T16:09:46.470 回答