因此,我有两个文件:kernel.o(操作系统的内核)和libbios.o(将bios中断移植到c),而ld告诉我:"undefined reference to 'printchar'"
。
我用objdump -t检查了libbios.o,这是结果:
source/libbios.o: file format elf32-i386 SYMBOL TABLE: 00000000 l df *ABS* 00000000 include/libbios.asm 00000000 l d .TEXT 00000000 .TEXT 00000000 l .TEXT 00000000 printchar
printchar存在于.o文件中。
这是libbios.asm:
printchar: MOV AH,0x0e MOV AL,[ESP+4] INT 0X10 RET
和kernel.c:
#define TRUE 1 extern void printchar(char l); void main(){ printchar('a'); fin: asm volatile ("hlt"); goto fin; }
和用于编译kernel.o,libbios.o并将其链接的命令行:
i686-elf-gcc kernel.c -c -B ../i686 -o cpartofkernel.o -m16 -masm=intel -O0 nasm -O0 -felf include/libbios.asm -o libbios.o i686-elf-ld --oformat binary libbios.o cpartofkernel.o -o kernel.bin -Ttext 0x20000000 -emain
这也是实模式代码,因为我在Linux中找不到任何原始二进制链接程序,所以必须使用elf。
因此,我有两个文件:kernel.o(操作系统的内核)和libbios.o(将bios中断移植到c),而ld告诉我:“对'printchar'的未定义引用”。我用...
通过在libbios.asm顶部添加global printchar
解决。