精易论坛

标题: 解决VC2017等新链接器缺少符号的思路及一些适配问题 [打印本页]

作者: aiqinxuancai    时间: 2023-10-11 14:22
标题: 解决VC2017等新链接器缺少符号的思路及一些适配问题
本帖最后由 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的类方法可能就比较麻烦了。

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

说说后续
然后就是可以编译了,但是编辑后运行就崩溃。

从堆栈可以看出是标准输出崩了,找遍了模块找到了日志库里有调用,接下来测试发现,VC2017的链接器用不了标准输出...

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



接下来就大功告成了,误报减少了很多。
后续又自己提取了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,舒服了
作者: zzh233    时间: 2023-10-11 14:35
恭喜 恭喜 期待2022链接器发布  
作者: 曜辉    时间: 2023-10-11 14:53
这玩意就不是向我们小白能弄明白的,再加上易语言大佬已经失去维护的动力了,所以....基本上...
作者: jcos    时间: 2023-10-11 22:15
为你加油!!!!!!
 ☆  * .   ☆
  . ∧_∧ ∩ * ☆
*  ☆ ( ・∀・)/ .
 .  ⊂   ノ* ☆
☆ * (つ ノ  .☆
   (ノ

大佬,到时发个vc2022呗,谢谢
作者: menghan    时间: 2023-10-12 08:55
感谢楼主分享,支持一下~~
作者: aiqinxuancai    时间: 2023-10-19 14:51
文章怎么不能编辑了,这几天发现了最后一个COM释放崩溃的原因,是因为在VC2010以后的链接器默认开启了DEP兼容,我们需要链接器添加 /NXCOMPAT:NO 参数对其进行关闭,关闭后似乎就可以了。
作者: aiqinxuancai    时间: 2023-10-19 14:51
文章怎么不能编辑了,这几天发现了最后一个COM释放崩溃的原因,是因为在VC2010以后的链接器默认开启了DEP兼容,我们需要链接器添加 /NXCOMPAT:NO 参数对其进行关闭,关闭后似乎就可以了。
作者: aiqinxuancai    时间: 2023-10-19 14:51
文章怎么不能编辑了,这几天发现了最后一个COM释放崩溃的原因,是因为在VC2010以后的链接器默认开启了DEP兼容,我们需要链接器添加 /NXCOMPAT:NO 参数对其进行关闭,关闭后似乎就可以了。
作者: wowopipi    时间: 2023-10-24 15:50
能把链接器发下吗。我也是静态编译符号出错。
作者: wowopipi    时间: 2023-10-27 11:27
vc2017没人用吧,随便编译什么都报错,只能用回vc6
作者: aiqinxuancai    时间: 2023-10-30 11:40
wowopipi 发表于 2023-10-27 11:27
vc2017没人用吧,随便编译什么都报错,只能用回vc6

可以减少误报,原VC6编译的程序30+/70,换VC2017后大概是20/70
作者: 红桃じ简简箪箪    时间: 2023-11-1 23:01
为你加油!!!!!!
 ☆  * .   ☆
  . ∧_∧ ∩ * ☆
*  ☆ ( ・∀・)/ .
 .  ⊂   ノ* ☆
☆ * (つ ノ  .☆
   (ノ

大佬,到时发个vc2022呗,谢谢
作者: zzh233    时间: 2023-11-1 23:23
期待 VC2022 链接器
作者: 茶末余香    时间: 2023-12-1 05:01
楼主能分享下你制作的VC链接器吗?谢谢
作者: Dakk    时间: 2024-1-20 10:51
换回了VC6 渡劫算是失败了吗?
作者: aiqinxuancai    时间: 2024-1-26 14:44
Dakk 发表于 2024-1-20 10:51
换回了VC6 渡劫算是失败了吗?

又换回VC2022了,那个崩溃问题似乎并不是链接器的问题
作者: aiqinxuancai    时间: 2024-2-2 16:20
link.ini 附加链接参数加/FORCE 可解决符号重定义的问题(只保证编译成功,不保证一定会正常)
作者: Av0x    时间: 2024-3-4 05:54
[ 5:54:19  176 ]  LINK : fatal error LNK1181: 无法打开输入文件“legacy_link_definitions.lib” [ 5:54:19  480 ]  静态连接失败  么啥用
作者: aiqinxuancai    时间: 2024-3-5 14:26
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放到你的对应的链接器里
作者: 真IKUN    时间: 2024-12-15 18:59
  好好学习,天天向上~
作者: 真IKUN    时间: 2024-12-15 18:59
  好好学习,天天向上~




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4