【发布时间】:2017-10-06 23:17:29
【问题描述】:
我正在通过The Little Book About OS Development 工作,特别是关于帧缓冲区的部分(链接)。我能够成功地组装、链接、转换成 ISO 文件并启动纯程序集,但是一旦我尝试为我的 C 代码链接编译的目标文件(从我的加载器调用,它是用程序集编写的),链接器抱怨。这是输出:
nasm -f elf loader.s -o loader.o
nasm -f elf out.s -o out.o
/usr/local/Cellar/gcc@6/6.4.0/bin/gcc-6 -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector -nostartfiles -nodefaultlibs -Wall -Wextra -Werror -c framebuffer.c -o framebuffer.o
/usr/local/Cellar/gcc@6/6.4.0/bin/gcc-6 -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector -nostartfiles -nodefaultlibs -Wall -Wextra -Werror -c kmain.c -o kmain.o
i386-unknown-linux-gnu-ld -T link.ld -melf_i386 loader.o out.o framebuffer.o kmain.o -o kernel.elf
framebuffer.o: file not recognized: File format not recognized
make: *** [kernel.elf] Error 1
我在 Mac 上,所以你知道我已经编译了一个自定义版本的 GNU 链接器,以便我可以使用链接器脚本,并且我确保指定 GCC 6(系统默认值为 4.0 )。无论如何,这是我的 Makefile:
OBJECTS = loader.o out.o framebuffer.o kmain.o
CC = /usr/local/Cellar/gcc@6/6.4.0/bin/gcc-6
CFLAGS = -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector \
-nostartfiles -nodefaultlibs -Wall -Wextra -Werror -c
LDFLAGS = -T link.ld -melf_i386
AS = nasm
ASFLAGS = -f elf
all: kernel.elf
kernel.elf: $(OBJECTS)
i386-unknown-linux-gnu-ld $(LDFLAGS) $(OBJECTS) -o kernel.elf
os.iso: kernel.elf
cp kernel.elf iso/boot/kernel.elf
mkisofs -R \
-b boot/grub/stage2_eltorito \
-no-emul-boot \
-boot-load-size 4 \
-A os \
-input-charset utf8 \
-quiet \
-boot-info-table \
-o os.iso \
iso
run: os.iso
bochs -f bochsrc.txt -q
%.o: %.c
$(CC) $(CFLAGS) $< -o $@
%.o: %.s
$(AS) $(ASFLAGS) $< -o $@
clean:
rm -rf *.o kernel.elf os.iso
这是我的链接器脚本:
ENTRY(loader) /* the name of the entry label */
SECTIONS {
. = 0x00100000; /* the code should be loaded at 1 MB */
.text ALIGN (0x1000) : /* align at 4 KB */
{
*(.text) /* all text sections from all files */
}
.rodata ALIGN (0x1000) : /* align at 4 KB */
{
*(.rodata*) /* all read-only data sections from all files */
}
.data ALIGN (0x1000) : /* align at 4 KB */
{
*(.data) /* all data sections from all files */
}
.bss ALIGN (0x1000) : /* align at 4 KB */
{
*(COMMON) /* all COMMON sections from all files */
*(.bss) /* all bss sections from all files */
}
}
任何帮助将不胜感激。
【问题讨论】:
-
您的 GCC6 版本是 OSX 版本吗?也许它正在生成 i386 LD 不理解的男子气概对象。命令
file framebuffer.o显示什么。您可能会发现自己必须创建一个 GCC 交叉编译器(如 i686-elf-gcc)并使用它进行编译。 -
是的,显然是这样。我认为使用
-m32使其成为 i386 对象文件就足够了,但显然它仍然是一个 Mach-O 对象。谢谢! -
否
-m32只生成 32 位代码。如果在 64 位 OS/X 上,它将默认为 64 位代码 (-m64)。没问题 -
这有帮助(我认为),但现在我遇到了另一个问题:stackoverflow.com/questions/46621305/…
-
参数
-nostdlib是链接器参数而不是编译器参数。
标签: c gcc makefile linker osdev