c和汇编的混合编链接问题

时间:2022-10-21 19:27:13
extern choose	; int choose(int a, int b);


[section .data] ; 数据在此

num1st dd 3
num2nd dd 4


[section .text] ; 代码在此

global _start ; 我们必须导出 _start 这个入口,以便让链接器识别。
global myprint ; 导出这个函数为了让 bar.c 使用

_start:
push num2nd ; ┓
push num1st ; ┃
call choose ; ┣ choose(num1st, num2nd);
add esp, 4 ; ┛

mov ebx, 0
mov eax, 1 ; sys_exit
int 0x80 ; 系统调用

; void myprint(char* msg, int len)
myprint:
mov edx, [esp + 8] ; len
mov ecx, [esp + 4] ; msg
mov ebx, 1
mov eax, 4 ; sys_write
int 0x80 ; 系统调用
ret



void myprint(char* msg, int len);

int choose(int a, int b)
{
if(a >= b){
myprint("the 1st one\n", 13);
}
else{
myprint("the 2nd one\n", 13);
}

return 0;
}


编译过程如下:
Administrator@ZYJ /cygdrive/d/temp
$ nasm -f elf -o foo.o foo.asm

Administrator@ZYJ /cygdrive/d/temp
$ gcc -c -o bar.o bar.c

Administrator@ZYJ /cygdrive/d/temp
$

Administrator@ZYJ /cygdrive/d/temp
$ ld -s -o foobar.exe boo.o bar.o
d:\Program Files\DEV-CPP\Bin\ld.exe: boo.o: No such file: No such file or direct
ory

Administrator@ZYJ /cygdrive/d/temp
$ ld -s -o boobar.exe foo.o bar.o
d:\Program Files\DEV-CPP\Bin\ld.exe: warning: cannot find entry symbol _mainCRTS
tartup; defaulting to 00401000
foo.o(.text+0xb): In function `start':
: undefined reference to `choose'
bar.o(.text+0x1e):bar.c: undefined reference to `myprint'
bar.o(.text+0x34):bar.c: undefined reference to `myprint'

Administrator@ZYJ /cygdrive/d/temp

9 个解决方案

#1


myprint换成_myprint

#2


谢谢楼上,问题解决了一半。
还有一个报错:
 cannot find entry symbol _mainCRTS tartup; defaulting to 00401000 
这个怎么解决?
见笑了,新手刚学。

#3


这个不是用_start标明入口吗?

#4


我用windows版本的nasm,devcpp自带的gcc,ld

#5


up

#6


up

#7


顶一下

#8


..start

解决完了  给分 


#9


up

#1


myprint换成_myprint

#2


谢谢楼上,问题解决了一半。
还有一个报错:
 cannot find entry symbol _mainCRTS tartup; defaulting to 00401000 
这个怎么解决?
见笑了,新手刚学。

#3


这个不是用_start标明入口吗?

#4


我用windows版本的nasm,devcpp自带的gcc,ld

#5


up

#6


up

#7


顶一下

#8


..start

解决完了  给分 


#9


up