开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2991|回复: 18
收起左侧

[技术专题] 解决VC2017等新链接器缺少符号的思路及一些适配问题

[复制链接]
发表于 2023-10-11 14:22:59 | 显示全部楼层 |阅读模式   广东省广州市
本帖最后由 aiqinxuancai 于 2023-10-11 15:50 编辑

由于误报实在是太多了,又限制了写新的支持库,前几日痛下决心把我的一个项目升级到了VC2017链接器。

过程坎坷。。。

首先就是缺少符号,某个Json支持库提示缺少_timezone符号,看起来是在vc6以后就不存在的c++符号,但是我对这个库的使用很多,实在没办法简单的替换掉。

看到了原生legacy_stdio_definitions.lib的启发,不如...自己写一个_timezone链接进去。

于是写了此项目,简单实现了_timezone符号
https://github.com/aiqinxuancai/legacy_link_definitions

编为x86+Release的lib放在链接器目录,在ini文件的extra_args写成这样既可。
extra_args=/DYNAMICBASE "legacy_stdio_definitions.lib" "legacy_link_definitions.lib"

简单的符号缺少,比如全局函数或全局变量,使用这种方法可以很快的处理,就是一些Xlen等std的类方法可能就比较麻烦了。

---------------------------------------------------

说说后续
然后就是可以编译了,但是编辑后运行就崩溃。
1.png
从堆栈可以看出是标准输出崩了,找遍了模块找到了日志库里有调用,接下来测试发现,VC2017的链接器用不了标准输出...

解决掉以后,编译再运行,又崩溃。
根据子程序名的崩溃定位到是Gdiplus模块的某个类COM的释放,过程就不讲了,崩溃点在字节流释放部分,即IStream的释放函数。
上面为原始代码,下面是我直接封装了个DLL来做释放,如果你有兼容VC6和其他链接器的汇编方法,欢迎发出来。https://github.com/aiqinxuancai/FreeCOMObject
(为啥这么常用的模块在VC2017链接器下崩溃论坛就没人讲过??)
2.png


接下来就大功告成了,误报减少了很多。
后续又自己提取了VC2022的链接器,误报进一步减少了。

以后的支持库终于可以用c++20来写了。。。







补充内容 (2023-10-19 15:43):
这几天发现了最后一个COM释放崩溃的原因,是因为在VC2010以后的链接器默认开启了DEP兼容,我们需要链接器添加 /NXCOMPAT:NO 参数对其进行关闭

补充内容 (2023-12-27 16:25):
最后还是换回了VC6, 因为好像还是有不明原因第三方库崩溃

补充内容 (2024-2-2 16:20):
link.ini 附加链接参数加/FORCE 可解决符号重定义的问题(只保证编译成功,不保证一定会正常)

补充内容 (2024-2-2 16:45):
又换回了VC2022,舒服了

评分

参与人数 1好评 +1 精币 +3 收起 理由
空竹 + 1 + 3 感谢分享,很给力!~

查看全部评分


本帖被以下淘专辑推荐:

 楼主| 发表于 2023-10-19 14:51:43 | 显示全部楼层   广东省广州市
文章怎么不能编辑了,这几天发现了最后一个COM释放崩溃的原因,是因为在VC2010以后的链接器默认开启了DEP兼容,我们需要链接器添加 /NXCOMPAT:NO 参数对其进行关闭,关闭后似乎就可以了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-19 14:51:56 | 显示全部楼层   广东省广州市
文章怎么不能编辑了,这几天发现了最后一个COM释放崩溃的原因,是因为在VC2010以后的链接器默认开启了DEP兼容,我们需要链接器添加 /NXCOMPAT:NO 参数对其进行关闭,关闭后似乎就可以了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-5 14:26:16 | 显示全部楼层   广东省广州市
Av0x 发表于 2024-3-4 05:54
[ 5:54:19  176 ]  LINK : fatal error LNK1181: 无法打开输入文件“legacy_link_definitions.lib” [ 5:54 ...

你要编译legacy_link_definitions项目,然后把legacy_link_definitions.lib放到你的对应的链接器里
回复 支持 反对

使用道具 举报

结帖率:89% (8/9)

签到天数: 10 天

发表于 2024-3-4 05:54:46 | 显示全部楼层   云南省大理白族自治州
[ 5:54:19  176 ]  LINK : fatal error LNK1181: 无法打开输入文件“legacy_link_definitions.lib” [ 5:54:19  480 ]  静态连接失败  么啥用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-2 16:20:43 | 显示全部楼层   广东省广州市
link.ini 附加链接参数加/FORCE 可解决符号重定义的问题(只保证编译成功,不保证一定会正常)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-26 14:44:47 | 显示全部楼层   广东省广州市
Dakk 发表于 2024-1-20 10:51
换回了VC6 渡劫算是失败了吗?

又换回VC2022了,那个崩溃问题似乎并不是链接器的问题
回复 支持 反对

使用道具 举报

结帖率:86% (6/7)

签到天数: 23 天

发表于 2024-1-20 10:51:05 | 显示全部楼层   浙江省嘉兴市
换回了VC6 渡劫算是失败了吗?
回复 支持 反对

使用道具 举报

发表于 2023-12-1 05:01:00 | 显示全部楼层   福建省福州市
楼主能分享下你制作的VC链接器吗?谢谢
回复 支持 反对

使用道具 举报

结帖率:94% (181/193)

签到天数: 24 天

发表于 2023-11-1 23:23:47 | 显示全部楼层   安徽省芜湖市
期待 VC2022 链接器
回复 支持 反对

使用道具 举报

签到天数: 20 天

发表于 2023-11-1 23:01:47 | 显示全部楼层   湖南省长沙市
为你加油!!!!!!
 ☆  * .   ☆
  . ∧_∧ ∩ * ☆
*  ☆ ( ・∀・)/ .
 .  ⊂   ノ* ☆
☆ * (つ ノ  .☆
   (ノ

大佬,到时发个vc2022呗,谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-30 11:40:36 | 显示全部楼层   广东省广州市
wowopipi 发表于 2023-10-27 11:27
vc2017没人用吧,随便编译什么都报错,只能用回vc6

可以减少误报,原VC6编译的程序30+/70,换VC2017后大概是20/70
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表