找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2502|回复: 2

有关名字修饰

[复制链接]

307

主题

228

回帖

7349

积分

用户组: 真·技术宅

UID
2
精华
76
威望
291 点
宅币
5599 个
贡献
253 次
宅之契约
0 份
在线时间
949 小时
注册时间
2014-1-25
发表于 2014-8-6 12:15:30 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
    昨天和0xaa55讨论了很久,关于这个,原因是使用vs编译导出函数时,导出名和MSDN上所谓的名称修饰规范产生了不一致。
我一贯认为导出函数才是名称修饰的存在意义。每种语言都有其默认调用规范,为了让不同语言写的程序可以相互调用,
因此产生了名称修饰这种东西,以至于语言函数之间不会导致混淆,而相互调用这里很大程度上用的是导出函数,导出了规范,
才好给别人使用。然而微软msdn在这里却十分含糊,他这里所谓的名称修饰方式是链接器内部使用的符号名的使用规范,
而非指导出函数所用规范,这样没有任何意义,因为我不关心你内部符号是什么样,因为我又不能直接调用内部符号。
内部符号一般是通过dumpbin /symbols来查看的。
    在实践中,我发现dumpbin /export获得的名称修饰在lib和dll中是不同的,而我此前一直用dll来查看名称修饰。
下面来细数这些吧(这个lib只存在于debug版本编译结果里):
int _cdecl func(int a,int b,int c);
lib导出函数名:
        C链接式:_func
        C++链接式:?func@@YAHHHH@Z       
dll导出函数名
        C链接式:func
        C++链接式:?func@@YAHHHH@Z       

int _stdcall func(int a,int b,int c)
lib导出函数名:
        C链接式:_func@12
        C++链接式:?func@@YGHHHH@Z
dll导出函数名
        C链接式:_func@12
        C++链接式:?func@@YGHHHH@Z

int _fastcall func(int a,int b,int c)
lib导出函数名:
        C链接式:@func@12
        C++链接式:?func@@YIHHHH@Z
dll导出函数名
        C链接式:@func@12
        C++链接式:?func@@YIHHHH@Z

显而易见,只有_cdecl中微软称的名称修饰才和我理解的名称修饰不同,而这也是我们争论的原因?这是不是微软的bug还不得而知。
不过在你使用别人的导出函数时,还是要参照我上面这个表的。当然现在很多dll都采用.DEF文件导出函数,这样所有的修饰都没了。
回复

使用道具 举报

1112

主题

1653

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
245
威望
744 点
宅币
24265 个
贡献
46222 次
宅之契约
0 份
在线时间
2299 小时
注册时间
2014-1-26
发表于 2014-8-6 22:35:38 | 显示全部楼层
{:soso_e127:}我才知道你是要说这个。。。。
其实就算是Lib,int _cdecl func(int a,int b,int c);导出的符号也不是_func,而是__imp__func
因为_declspec(dllexport)导出的符号在LIB都会被加上__imp_
详细的例子请看我用纯汇编写的学校机房反控制工具
回复 赞! 靠!

使用道具 举报

KxIX 该用户已被删除
发表于 2014-8-7 05:39:35 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-5-5 04:39 , Processed in 0.038333 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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