Makefile 没有正确复制二进制代码
Makefile not copying binary code properly
我正在努力制作一个简单的操作系统(为了好玩),但我偶然发现了一个相当奇怪的问题,我找不到解决方法。
当我尝试将 kernel.bin 连接到 boot/boot_sect.bin 并将结果保存在 os-image 中时,它似乎复制了汇编代码,但是 kernel.bin 文件按预期连接。但是 boot/boot_sect.bin 确实存在并且确实包含正确的二进制数据,如下所示。
当我使用 Windows 10 文件资源管理器将 boot/boot_sect.bin 复制到 boot_sect_real.bin 时,然后 运行 使用相同的命令但在 boot_sect_real.bin 上,一切都按预期工作。因此,它似乎与 boot_sect.bin 在目录中或 boot_sect.bin 和 boot_sect.asm 在同一目录中有关。我也在使用 MinGW 来使用 Makefile
(使用 mingw32-make)
这是 Makefile,os-image 命令使用注释突出显示:
C_SOURCES = $(wildcard kernel/*.c drivers/*.c)
HEADERS = $(wildcard kernel/*.h drivers/*.h)
OBJ = ${C_SOURCES:.c=.o}
all: os-image
########################################
os-image: boot/boot_sect.bin kernel.bin
copy /b $<+kernel.bin os-image
########################################
%.o : %.c ${HEADERS}
gcc -ffreestanding -c $< -o $@
%.o : %.asm
nasm $< -f elf -o $@
%.bin : %.asm
nasm $< -f bin -o $@
kernel.bin: kernel/kernel_entry.o ${OBJ}
ld -T NUL -o kernel.tmp -Ttext 0x1000 $^
objcopy -O binary -j .text kernel.tmp kernel.bin
这就是我 运行 将所有这些放在其中的目录:
这是引导目录的内容:
这是内核目录的内容:
(drivers目录现在是空的)
这是 kernel.bin 文件的内容:
这是 boot/boot_sect.bin 文件的内容:
但是os-image文件包含汇编代码?
(我正在使用带 /b 的复制命令)
有什么方法可以将 kernel.bin 的二进制内容连接到 boot/boot_sect.bin 并将结果保存在 os-image 中?怎么了?
更新:我发现这件事发生了,如果它值得的话:
它正在使用 .asm 文件,即使我在命令中指定了 .bin。
好吧,我现在确实觉得自己很蠢。
我变了
复制/b boot/boot_sect.bin+kernel.bin os-图片
至
复制/b boot\boot_sect.bin+kernel.bin os-图片
这是一个简单的字符替换!
我正在努力制作一个简单的操作系统(为了好玩),但我偶然发现了一个相当奇怪的问题,我找不到解决方法。
当我尝试将 kernel.bin 连接到 boot/boot_sect.bin 并将结果保存在 os-image 中时,它似乎复制了汇编代码,但是 kernel.bin 文件按预期连接。但是 boot/boot_sect.bin 确实存在并且确实包含正确的二进制数据,如下所示。
当我使用 Windows 10 文件资源管理器将 boot/boot_sect.bin 复制到 boot_sect_real.bin 时,然后 运行 使用相同的命令但在 boot_sect_real.bin 上,一切都按预期工作。因此,它似乎与 boot_sect.bin 在目录中或 boot_sect.bin 和 boot_sect.asm 在同一目录中有关。我也在使用 MinGW 来使用 Makefile (使用 mingw32-make)
这是 Makefile,os-image 命令使用注释突出显示:
C_SOURCES = $(wildcard kernel/*.c drivers/*.c)
HEADERS = $(wildcard kernel/*.h drivers/*.h)
OBJ = ${C_SOURCES:.c=.o}
all: os-image
########################################
os-image: boot/boot_sect.bin kernel.bin
copy /b $<+kernel.bin os-image
########################################
%.o : %.c ${HEADERS}
gcc -ffreestanding -c $< -o $@
%.o : %.asm
nasm $< -f elf -o $@
%.bin : %.asm
nasm $< -f bin -o $@
kernel.bin: kernel/kernel_entry.o ${OBJ}
ld -T NUL -o kernel.tmp -Ttext 0x1000 $^
objcopy -O binary -j .text kernel.tmp kernel.bin
这就是我 运行 将所有这些放在其中的目录:
这是引导目录的内容:
这是内核目录的内容:
(drivers目录现在是空的)
这是 kernel.bin 文件的内容:
这是 boot/boot_sect.bin 文件的内容:
但是os-image文件包含汇编代码?
(我正在使用带 /b 的复制命令)
有什么方法可以将 kernel.bin 的二进制内容连接到 boot/boot_sect.bin 并将结果保存在 os-image 中?怎么了?
更新:我发现这件事发生了,如果它值得的话:
好吧,我现在确实觉得自己很蠢。
我变了
复制/b boot/boot_sect.bin+kernel.bin os-图片
至
复制/b boot\boot_sect.bin+kernel.bin os-图片
这是一个简单的字符替换!