- UID
- 2
- 精华
- 积分
- 7736
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
昨天和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文件导出函数,这样所有的修饰都没了。 |
|