You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建OS ISO镜像时GCC链接报错:跳过不兼容目录及找不到libgcc

问题解决步骤

1. 解决32位libgcc缺失问题

错误提示说明当前系统仅存在64位版本的libgcc,无法找到兼容32位编译的版本,需要安装对应平台的32位gcc支持包:

  • Debian/Ubuntu系发行版:
sudo apt install gcc-multilib
  • RHEL/CentOS系发行版:
sudo dnf install glibc-devel.i686 libgcc.i686 gcc

2. 修正Makefile中的错误

原Makefile存在语法、逻辑多方面问题,以下是修正后的完整版本:

CC=gcc
TARGET=myos
C_FILES=./kernel.c
OBJS=$(C_FILES:.c=.o) start.o

all: $(TARGET) finale
compile: $(TARGET)
.PHONY: all compile clean finale

# 编译C文件为32位目标文件
%.o: %.c
	$(CC) -c $< -o $@ -ffreestanding -fno-exceptions -m32

# 汇编start.asm为32位ELF目标文件
start.o: start.asm
	nasm -f elf start.asm -o $@

# 链接生成内核镜像
$(TARGET): $(OBJS)
	$(CC) -m32 -nostdlib -nodefaultlibs -lgcc $^ -T linker.ld -o $(TARGET)

# 生成可引导ISO
finale:
	cd ~/my_os/ && cp $(TARGET) ./iso/boot/$(TARGET)
	grub2-mkrescue iso --output=$(TARGET).iso

# 清理编译产物
clean:
	rm -f *.o $(TARGET) $(TARGET).iso
	find . -name \*.o | xargs --no-run-if-empty rm

关键修正点:

  • 将start.o加入依赖列表,新增单独的汇编规则,替代原错误的$(shell)调用,确保make正确管理依赖关系
  • 移除所有$(shell):规则内直接写命令即可,$(shell)是在Makefile解析阶段执行,而非构建阶段
  • 修复命令中的空格缺失问题:比如cp$(TARGET)改为cp $(TARGET)、-o$(TARGET)改为-o $(TARGET)、find .-name改为find . -name
  • 修正拼写错误:grub2-mkresceu改为grub2-mkrescue,--output$(TARGET)改为--output=$(TARGET).iso
  • 修复变量引用错误:(TARGET)改为$(TARGET)
  • 用$^替代$?,确保所有依赖文件都被纳入链接流程
  • 将cd和cp命令合并为一行,避免单独cd无法影响后续命令的工作目录

3. 验证构建

执行以下命令完成完整构建流程:

make clean
make all

内容的提问来源于stack exchange,提问作者van Thielen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:44:59