构建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
相关产品推荐
相关产品推荐

