【问题标题】:ld not finding symbol in .o [duplicate]ld在.o中找不到符号[重复]
【发布时间】: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 来将符号标记为可以链接的东西。你现在拥有的相当于 C static printchar(){...}
  • 我查找了重复项,但我找到的最接近的是How to use asm function in C,这与 GAS 相同,而不是 NASM。

标签: c assembly nasm linker-errors


【解决方案1】:

通过在 libbios.asm 顶部添加 global printchar 解决。

【讨论】: