要编译一个内核,必须要想办法将C和汇编语言连接在一起。
这里是一个汇编语言的一份代码:
foo.asm
; 编译链接方法
; (ld 的‘-s’选项意为“strip all”)
;
; [root@XXX XXX]# nasm -f elf foo.asm -o foo.o
; [root@XXX XXX]# gcc -c bar.c -o bar.o
; [root@XXX XXX]# ld -s hello.o bar.o -o foobar
; [root@XXX XXX]# ./foobar
; the 2nd one
; [root@XXX XXX]#
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
bar.c
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;
}
本来在Linux下输入命令:
nasm -f elf -o foo.o foo.asm
gcc -c -o bar.o bar.c
ld -s -o foobar foo.o bar.o
就可以连接完毕了,但是我的虚拟机是CentOS 64-bit 最后一步显示file not recongize
错误的原因很明显...gcc默认按64位搞了……估计GCC咋办呢...上网搜了一下 Bingo~
连接完毕~