首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在遵循简单的内核教程时出现奇怪的链接器错误: gcc

在遵循简单的内核教程时出现奇怪的链接器错误: gcc
EN

Stack Overflow用户
提问于 2012-03-22 03:16:05
回答 3查看 3.1K关注 0票数 0

我正在学习如何创建一个简单的可引导内核的教程:http://www.osdever.net/tutorials/view/writing-a-simple-c-kernel

本教程中有以下必需文件:

kernel.c源代码:

代码语言:javascript
复制
#define WHITE_TXT 0x07 // white on black text

void k_clear_screen();
unsigned int k_printf(char *message, unsigned int line);


k_main() // like main in a normal C program
{
    k_clear_screen();
    k_printf("Hi!\nHow's this for a starter OS?", 0);
};

void k_clear_screen() // clear the entire text screen
{
    char *vidmem = (char *) 0xb8000;
    unsigned int i=0;
    while(i < (80*25*2))
    {
        vidmem[i]=' ';
        i++;
        vidmem[i]=WHITE_TXT;
        i++;
    };
};

unsigned int k_printf(char *message, unsigned int line) // the message and then the line #
{
    char *vidmem = (char *) 0xb8000;
    unsigned int i=0;

    i=(line*80*2);

    while(*message!=0)
    {
        if(*message=='\n') // check for a new line
        {
            line++;
            i=(line*80*2);
            *message++;
        } else {
            vidmem[i]=*message;
            *message++;
            i++;
            vidmem[i]=WHITE_TXT;
            i++;
        };
    };

    return(1);
};

kernel_start.asm源代码:

代码语言:javascript
复制
[BITS 32]

[global start]
[extern _k_main] ; this is in the c file

start:
  call _k_main

  cli  ; stop interrupts
  hlt ; halt the CPU

link.ld源代码:

代码语言:javascript
复制
OUTPUT_FORMAT("binary")
ENTRY(start)
SECTIONS
{
  .text  0x100000 : {
    code = .; _code = .; __code = .;
    *(.text)
    . = ALIGN(4096);
  }
  .data  : {
    data = .; _data = .; __data = .;
    *(.data)
    . = ALIGN(4096);
  }
  .bss  :
  {
    bss = .; _bss = .; __bss = .;
    *(.bss)
    . = ALIGN(4096);
  }
  end = .; _end = .; __end = .;
}

编译它的说明如下:

代码语言:javascript
复制
nasm -f aout kernel_start.asm -o ks.o
gcc -c kernel.c -o kernel.o
ld -T link.ld -o kernel.bin ks.o kernel.o

我能够成功地执行前两行代码:

代码语言:javascript
复制
nasm -f aout kernel_start.asm -o ks.o
gcc -c kernel.c -o kernel.o

然后,当我尝试运行这行代码时:

代码语言:javascript
复制
ld -T link.ld -o kernel.bin ks.o kernel.o

我得到了错误:

代码语言:javascript
复制
C:\basic_kernel>ld -T link.ld -o kernel.bin ks.o kernel.o
ks.o: file not recognized: File format not recognized

有没有人知道为什么会这样,我怎么解决这个问题?我使用的是64位windows 7

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

https://stackoverflow.com/questions/9811370

复制
相关文章

相似问题

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