Chuyu-Team / VC-LTL5

Shared to msvcrt.dll or ucrtbase.dll and optimize the C/C++ application file size.
Eclipse Public License 2.0
499 stars 48 forks source link

5.2.3790.0编译目标在Windows Server 2003 x64上无法运行 #45

Closed zhangshuangjun closed 1 year ago

zhangshuangjun commented 1 year ago

程序编译成64位,VC-LTL选择5.2.3790.0,msvcrt.dll缺少一些函数,导致程序运行不起来。 目前测试发现的有tanhf,_ftime32,_gmtime32,_localtime32,文件在这里。 https://github.com/zhangshuangjun/raw_files/blob/master/msvcrt_w2003_sp2_x64.zip

msvcrt_w2003_sp2_x64.zip

mingkuang-Chuyu commented 1 year ago

感谢反馈。问题的原因是,构建脚本错误的使用 excel 的LOOKUP来确定ucrt函数是否在msvcrt中。 由于此函数是模糊匹配,这会导致 tanh 匹配 tanhf,_ftime匹配_ftime32等情况发生。这使我错误的认为这些ucrt函数在msvcrt中是存在的,然后引入了错误的函数导入。

影响范围

问题影响较低。只影响NT5.2 x64系统无法运行目标平台为5.2.3790.0 x64的编译产物。

其他目标平台由于msvcrt恰好拥有这些函数或者压根就没有相关函数直接被静态导入了,所以未能触发此问题。

临时缓解方案

无。只能等待VC-LTL发布新版本。

修复方案

现在已经使用XLOOKUP重新纠正函数搜索脚本,并且确认现在5.2.3790.0 x64目标中以下函数受到影响需要跟进解决:

; 调用tanh,这是它等效的double版本
tanhf

; 下面的时间相关函数使用weak转发到对应的VC6时代的无32后缀版本即可
_wutime32 
_wctime32
_utime32
_time32
_mktime32
_localtime32
_gmtime32
_futime32
_ftime32
_ctime32

; 已经实现,调整编译条件,5.2.3790.0 x64重新编译即可
_set_controlfp
mingkuang-Chuyu commented 1 year ago

https://github.com/Chuyu-Team/VC-LTL5/releases/tag/v5.0.6-Beta5