【发布时间】:2025-12-02 06:55:02
【问题描述】:
所以我有两个文件: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。
【问题讨论】:
-
您需要在您的 NASM 源中使用
global printchar来将符号标记为可以链接的东西。你现在拥有的相当于 Cstatic printchar(){...} -
我查找了重复项,但我找到的最接近的是How to use asm function in C,这与 GAS 相同,而不是 NASM。
标签: c assembly nasm linker-errors