[英]How to compile and link C and ASM together on Windows for my OS
我的 32 位保護模式操作系統項目Sinatra 有問題。 我可以將源代碼編譯為目標文件,但我不知道如何將它們鏈接在一起。 我在 Windows 上使用NASM和TDM-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
開始加載我的操作系統。 如何正確編譯和鏈接我的代碼以創建二進制圖像?
首先,如果您要編譯為 ELF,則不得在匯編函數前添加初始下划線。
現在,為了將不同的源文件鏈接在一起,您顯然必須使它們具有共同點,在這種情況下,就是目標代碼。
所以,你要做的是:
gcc -c file.c -o file.o
gcc cfile.o asfile.o -o app
因為您的目標是在沒有 C 運行時的絕對地址處加載操作系統,所以您需要確保編譯為獨立代碼; 你的asm和C文件針對相同類型的對象(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
有一個二進制圖像
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.