2

我的 32 位保护模式操作系统项目Sinatra有问题。我可以将源代码编译为目标文件,但我不知道如何将它们链接在一起。我在 Windows 上使用NASMTDM-GCC 。我已经修复了我的代码的问题,因此它可以编译。为简洁起见,我已删除评论。

我的文件boot.asm

[BITS 32]
[global start]
[extern _JlMain]
start: 
    cli
    call _JlMain
    hlt

我的文件JSinatra.h

#ifndef __SINATRA_H__
#define __SINATRA_H__

#define JWhiteText 0x07
void JlMain();
void JlClearScreen();
unsigned int JlPrintF(char * message, unsigned int line);

#endif

我的文件JSinatra.c

#include "JSinatra.h"

void JlClearScreen() // clear entire screen
{
    char * vidmem = (char * ) 0xb8000;
    unsigned int i = 0;
    while (i < (80 * 25 * 2)) {
        vidmem[i] = ' ';
        i += 1;
        vidmem[i] = JWhiteText;
        i += 1;
    }
}
unsigned int JlPrintF(char * message, unsigned int line) {
    char * vidmem = (char * ) 0xb8000;
    unsigned int i = 0;
    i = line * 80 * 2;
    while ( * message != 0) {
        if ( * message == '\n') {
            line += 1;
            i = (line * 80 * 2); * message += 1;
        } else {
            vidmem[i] = * message; * message += 1;
            i += 1;
            vidmem[i] = JWhiteText;
            i += 1;
        }
    }
    return (1);
}
void JlMain() {
    JlClearScreen();
    JlPrintF("Sinatra v0 Virgin/Kernel Mode\n", 0);
}

我需要从绝对地址开始加载我的操作系统0x100000。如何正确编译和链接我的代码以创建二进制图像?

4

2 回答 2

2

首先,如果您要编译为 ELF,则不得在汇编中的函数之前添加初始下划线。

现在,为了将不同的源文件链接在一起,您显然必须让它们有共同点,在这种情况下,就是目标代码。

所以,你要做的是:

  1. 将汇编源文件汇编成目标代码。
  2. 编译但不将 C 源文件链接到目标代码。在 gcc 中:gcc -c file.c -o file.o
  3. 将它们联系在一起。在 gcc 中:gcc cfile.o asfile.o -o app
于 2015-08-28T21:13:17.767 回答
1

在 Windows 上使用 GCC-TDM 和 NASM

因为您的目标是在没有 C 运行时的绝对地址加载操作系统,所以您需要确保编译为独立代码;您的asmC文件以相同类型的对象为目标(win32/PECOFF);最后一步是将 PECOFF 文件转换为二进制图像。

要编译C文件,您将使用如下内容:

gcc -m32 -ffreestanding -c JSinatra.c -o JSinatra.o

要组装asm文件,您将使用以下内容:

nasm -f win32 boot.asm -o boot.o

要将它们链接在一起,您必须分两步完成:

ld -m i386pe -T NUL -o sinatra.tmp -Ttext 0x100000 boot.o JSinatra.o

上面的ld命令将创建一个临时文件sinatra.tmp,它是一个 32 位 PECOFF 可执行文件。然后,您需要sinatra.tmp使用以下命令转换为二进制图像:

objcopy -O binary sinatra.tmp sinatra.img

然后你应该在文件中有一个二进制图像sinatra.img

于 2015-08-28T22:49:49.493 回答