linker所使用的函数名称

Warning LNK4037: '_XXXX' does not exist;

本文解决上述错误。

 

在使用vc的link工具时,时常会涉及到输入函数名。如在.def文件中指定导出函数,或使用/ORDER@orderfile选项指定函数顺序,在orderfile中放置函数名等情况。(为啥要给函数排序呢,在多函数的shellcode中,函数的顺序是至关重要的。)

 

今天发现一个奇怪的现象,链接时始终报Warning LNK4037,说orderfile中有函数名找不到。折腾了一圈,观察这个warning和函数的名字没有关系,但是发现报错的函数是__stdcall调用方式,而其他能找到的函数都是__cdecl,如果把能找到的函数改为_stdcall,重新编译链接也找不到了。

 

查文档,发现link.exe使用的函数名都是所谓的Decorated Name。

编译器在编译程序时,会把函数名Decorate一下,于是在.obj文件中出现的函数名都是Decorated Name。

而且编译器会根据不同的调用类型进行不同的Decorate。

 

__cdecl    (the default)  Leading underscore (_)
__stdcall  Leading underscore (_) and a trailing at sign (@) followed by a number representing the number of bytes in the parameter list
__fastcall Same as __stdcall, but prepended by an at sign instead of an underscore

 

__cdecl在函数名前加一个下划线

__stdcall除了加一个下划线还会加一个@后跟参数列表占用字节的总大小

 

同时/order选项的说明告诉我们,不用写入前面的underscore,所以对 __stdcall 调用类型的需要在orderfile中把函数名写成functionname@n的形式。

 

n的具体值计算一下所以参数的总大小就可以了,如果不会数,或者懒得数,可以使用

dumpin /symbols xxx.obj

命令来看在obj文件中函数名被Decorated 成什么样了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值