首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >i386 GNU :文件不可识别:文件格式不可识别

i386 GNU :文件不可识别:文件格式不可识别
EN

Stack Overflow用户
提问于 2017-10-06 23:17:29
回答 1查看 1.1K关注 0票数 1

我正在学习操作系统开发的小书,特别是关于框架缓冲区(链接)的部分。我能够成功地组装、链接、转换为ISO文件并引导纯程序集,但一旦我试图链接编译好的C代码对象文件(从我的加载程序(它是在程序集中编写的)调用),链接器就会发出抱怨。这是输出:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

这是我的链接脚本:

代码语言:javascript
复制
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 */
}
}

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-01 01:34:51

事实证明,这是通过交叉编译GNU Binutils和GCC (前缀相同)在我的Mac上解决的。我按照这里的指示做了这件事。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46615117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档