元始天尊 发表于 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文件导出函数,这样所有的修饰都没了。

0xAA55 发表于 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

页: [1]
查看完整版本: 有关名字修饰