C/C++

Ошибка компиляции ядра

Всем привет! Пытаюсь сделать лабараторную, нужно скомпилировать ядро на Microsoft C Compiler с помощью команы:
cl.exe /GS- /c kernel.cpp link.exe /OUT:kernel.bin /BASE:0x10000 /FIXED /FILEALIGN:512 /MERGE:.rdata=.data /IGNORE:4254 /NODEFAULTLIB /ENTRY:kmain /SUBSYSTEM:NATIVE kernel.obj

Но возникает ошибка:

cl : Command line warning D9002 : ignoring unknown option '/OU'
cl : Command line warning D9002 : ignoring unknown option '/OT'
cl : Command line warning D9002 : ignoring unknown option '/O:'
cl : Command line warning D9002 : ignoring unknown option '/Ok'
cl : Command line warning D9002 : ignoring unknown option '/Oe'
cl : Command line warning D9002 : ignoring unknown option '/Or'
cl : Command line warning D9002 : ignoring unknown option '/On'
cl : Command line warning D9002 : ignoring unknown option '/Oe'
cl : Command line warning D9002 : ignoring unknown option '/Ol'
cl : Command line warning D9002 : ignoring unknown option '/O.'
cl : Command line warning D9002 : ignoring unknown option '/Ob'
cl : Command line warning D9002 : ignoring unknown option '/On'
cl : Command line warning D9002 : ignoring unknown option '/BASE:0x10000'
cl : Command line warning D9002 : ignoring unknown option '/MERGE:.rdata=.data'
cl : Command line warning D9002 : ignoring unknown option '/NODEFAULTLIB'
cl : Command line warning D9002 : ignoring unknown option '/ENTRY:kmain'
cl : Command line warning D9002 : ignoring unknown option '/SUBSYSTEM:NATIVE'
cl : Command line warning D9024 : unrecognized source file type 'link.exe', object file assumed
cl : Command line warning D9027 : source file 'link.exe' ignored
cl : Command line warning D9027 : source file 'kernel.obj' ignored
kernel.cpp
kernel.cpp: fatal error C1083: Cannot open include file: 'XED': No such file or directory


Код ядра:
extern "C" int kmain();
__declspec(naked) void startup()
{
__asm {
call kmain;
}
}
#define VIDEO_BUF_PTR (0xb8000)
void out_str(int color, const char* ptr, unsigned int strnum)
{
unsigned char* video_buf = (unsigned char*)VIDEO_BUF_PTR;
video_buf += 80 * 2 * strnum;
while (*ptr)
{
video_buf[0] = (unsigned char)*ptr; // Символ (код)
video_buf[1] = color; // Цвет символа и фона
video_buf += 2;
ptr++;
}
}
const char* g_test = "This is test string.";
extern "C" int kmain()
{
const char* hello = "Welcome to HelloWorldOS (gcc edition)!";
// Вывод строки
out_str(0x07, hello, 0);
out_str(0x07, g_test, 1);
// Бесконечный цикл
while (1)
{
__asm hlt;
}
return 0;
}

В чем ошибка? Как исправить?
Опции, такие как /OUT:kernel.bin, /BASE:0x10000, /FIXED, /FILEALIGN:512, /MERGE:.rdata=.data, /IGNORE:4254, /NODEFAULTLIB, /ENTRY:kmain и /SUBSYSTEM:NATIVE являются опциями компоновщика, а не компилятора. Они должны быть указаны в команде link.exe, а не cl.exe.

Вот как выглядит правильная команда для компиляции и компоновки вашего кода:
 cl.exe /GS- /c kernel.cpp 
link.exe /OUT:kernel.bin /BASE:0x10000 /FIXED /FILEALIGN:512 /MERGE:.rdata=.data /IGNORE:4254 /NODEFAULTLIB /ENTRY:kmain /SUBSYSTEM:NATIVE kernel.obj
Также обратите внимание, что в вашем коде есть ошибка компиляции: fatal error C1083: Cannot open include file: 'XED': No such file or directory. Это означает, что компилятор не может найти файл заголовка с именем XED. Проверьте, правильно ли указано имя файла и находится ли он в пути поиска заголовочных файлов.
Аманжол Рахимгалиев
Аманжол Рахимгалиев
25 860
Лучший ответ
 cl.exe /c /GS- /TC /O2 /nologo kernel.cpp 
Полатбай Ибрагимов kernel.cpp: fatal error C1083: Cannot open include file: 'XED': No such file or directory
link.exe
c1: fatal error C1083: Cannot open source file: 'link.exe': No such file or directory
kernel.obj
c1: fatal error C1083: Cannot open source file: 'kernel.obj': No such file or directory
Generating Code...
>Как исправить?
Вы это не исправите. Здесь возникает очень много вопросов к тому, кто эту лабу составлял и проверял на компиляцию/запуск.

Если вкратце - эта программа собирается через mingw, а не через микрософтовский компилятор, заставить cl собрать требуемый бинарник скорее всего невозможно, впрочем с учетом параметра

SUBSYSTEM:NATIVE - эта команда собирает native api приложение, запуск такой программы требует как минимум урезанного ядра винды, которое осуществляет первоначальный запуск boot loader'a для загрузки драйверов файловых систем/дисковых устройств (до момента загрузки полноценного), в то время как представленный код должен работать независимо после загрузчика. Можно предположить, что человек, полезший править оригинальный исходник, не понимал принципов отличия NTApi приложения от ядра ОС, ну то есть повозившись, этот исходник можно запустить в консольном режиме, например сервера винды без GUI, но ядром/заготовкой ОС он при этом не будет, в то время как оригинальный проект им являлся: https://github.com/brainstormerjr/HelloWorldOS/tree/main/src

>cl.exe /GS- /c kernel.cpp link.exe /OUT:kernel.bin
Начнём с того, что эта программа состоит не из одного файла, а из проекта, где как минимум содержатся настройки загрузчика и ассемблерного файла старта

далее - здесь две команды, а не одна и вы должны заранее понимать где заканчивается первая и начинается вторая, также знать, как собираются проекты студии из консоли, подсказка - для этого нужно не просто открыть какую-то консоль, а вполне конкретную с конкретными настройками.

и так далее, тысячи их...
Ошибка в том, что вы пытаетесь включить файл XED в свой код, но этот файл не существует. Заголовочный файл XED используется для программирования на ассемблере x86, но он не является частью стандартной библиотеки C++.

Чтобы исправить эту ошибку, вам нужно удалить строку #include <XED> из вашего кода. Вы также можете попробовать использовать ассемблер NASM вместо ассемблера MASM. Ассемблер NASM не требует файла заголовка XED.

Вот исправленный код:
 extern "C" int kmain(); 
__declspec(naked) void startup()
{
__asm {
call kmain;
}
}
#define VIDEO_BUF_PTR (0xb8000)
void out_str(int color, const char* ptr, unsigned int strnum)
{
unsigned char* video_buf = (unsigned char*)VIDEO_BUF_PTR;
video_buf += 80 * 2 * strnum;
while (*ptr)
{
video_buf[0] = (unsigned char)*ptr; // Символ (код)
video_buf[1] = color; // Цвет символа и фона
video_buf += 2;
ptr++;
}
}
const char* g_test = "This is test string.";
extern "C" int kmain()
{
const char* hello = "Welcome to HelloWorldOS (gcc edition)!";
// Вывод строки
out_str(0x07, hello, 0);
out_str(0x07, g_test, 1);
// Бесконечный цикл
while (1)
{
__asm hlt;
}
return 0;
}
После внесения этих изменений вы сможете скомпилировать свой код без каких-либо ошибок.
Полатбай Ибрагимов все равно пишет эту же ошибку
Полатбай Ибрагимов #include <XED>, а у меня нет такой строки в коде....