首页
社区
课程
招聘
[旧帖] [求助]C 语言调用汇编模块链接错误 0.00雪花
2010-4-29 17:38 1272

[旧帖] [求助]C 语言调用汇编模块链接错误 0.00雪花

2010-4-29 17:38
1272
大家好。
我现在在写一个程序,使用C语言调用汇编程序中的过程。
1.汇编部分代码
.486
.MODEL FLAT, STDCALL
OPTION CASEMAP:NONE

PUBLIC _SetEKey

.CODE
_SetEKey PROC C USES EAX EBX ESI EDI key:DWORD, roundkey:DWORD, bits:DWORD
   ....
_SetEKey ENDP

2.C语言部分代码
extern void SetEKey(unsigned char *key, unsigned char *roundkey, int bits);
int main(void)
{
     ......
     SetEKey(key,roundkey,128);   //调用汇编过程
     ......
}

使用ml.exe 将汇编程序编译成.obj文件,然后添加到VC 6.0工程中,但用VC 6.0编译C程序没有错误,链接时出现下面的错误:

error LNK2001: unresolved external symbol _SetEKey
Debug/AES.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞0
打赏
分享
最新回复 (4)
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
半道出家 2010-4-29 18:40
2
0
SetEKey(key,roundkey,128); //调用汇编过程

改为_SetEKey(key,roundkey,128);
雪    币: 76
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
younghust 2010-4-29 21:00
3
0
改过后也是不行啊。
期待大家的帮助。
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Kuser 2010-4-30 09:14
4
0
确实,我也发现这个问题,不知道VC6到底如何链接汇编的OBJ文件,始终未解决..  期待高手
雪    币: 76
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
younghust 2010-4-30 09:42
5
0
昨晚已经解决了。
在VC新建源文件的,最好是.cpp,不要是.c
汇编程序中,使用STDCALL,过程名前不加_,用ml /c /coff /Sa /Zf test.asm来编译,然后将test.obj拷贝到VC工程目录下,并手动添加到工程中。
.cpp中声明汇编过程时,extern void __stdcall  procedure_name(arg)。

我觉得整个过程中,关键是要保证函数参数的处理方式,要保持一致,即都要是__stdcall或其他的,否则生成的.obj文件中过程的修饰名为不一样,链接时候也就会提示找不到某个符号而报错了。
之后我会写篇总结的,谢谢大家的关注。
游客
登录 | 注册 方可回帖
返回