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
这个怎么解决?
见笑了,新手刚学。
还有一个报错:
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
这个怎么解决?
见笑了,新手刚学。
还有一个报错:
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