关于dll导出symbols杂谈。

 

 Dll导出的symbols每个编译器的实现都不一样,现在主要讨论vc++编译器的一些做法。

Symbols 主要与函数调用方式,以及extern "C" 链接指示符,以及参数列表,函数返回值有关。

 

1.    函数调用方式。

__stdcall ,__cdecl.的区别。

参数压栈方式不同。前者是被调用函数自身负责自己参数的压栈,出栈。后者是调用者负责该函数的参数的压栈,出栈。

这样的话,__stdcall就不支持可变参数列表,例如printf().

__stdcall方式下,将会生成更小的可执行程序。因为在__cdecl方式下,每个调用者都要保存一份代码来清理栈,这样就会有大量的冗余代码,因而生成的可执行程序比较大。

2.    一个c++ 函数将会以c++ name mangling方式导出函数符号。如果我们不想以c++的这种name mangling方式导出函数的话,我们可以采用.def 文件和extern "C"链接指示符。采用.def文件对导出函数,变量比较方便,但对导出类会比较麻烦,需要自己从lib库取出类的symbols,然后添加到.def 文件中,而extern "C"则只能应用于变量和函数。

 

 Note

个人感觉采用c的导出方式主要在于动态调用dll的时候。因为你需要知道你所要调用函数的详细symbols,采用c导出方式,函数,变量的导出symbols就是函数,变量的名字,这样使用起来很方便,不需要去查看lib里的函数,变量的导出symbols

 

实际导出symbols不只是受c++name mangling 或非c++name mangling方式,其还与函数的调用方式有关,例如__stdcal,__cdecl.

 

__stdcallc++的标准函数调用,因为他要支持重载等很多功能,所以它把函数参数信息,返回值信息都添加到函数名字后面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值