Ошибка при связывании файлов в ядре - PullRequest
2 голосов
/ 28 июля 2011

У меня проблема. Я скомпилировал файл boot.o:

[BITS 16]   
[ORG 0x7C00]
[global start]
[extern _main]
start:
call _main
cli 
hlt

и скомпилированный файл C ++ main.o:

 int main(){
//processes
}

Я использую этот файл LD linker.ld для компоновки:

OUTPUT_FORMAT("binary")
ENTRY(start)
SECTIONS
{
. = 0x100000;

.text ALIGN(4096) :
{
    *(.text*)
    *(.gnu.linkonce.t*)
}

.rodata ALIGN(4096) :
{
    start_ctors = .;
    *(.ctor*)
    end_ctors = .;

    start_dtors = .;
    *(.dtor*)
    end_dtors = .;

    *(.rodata*)
    *(.gnu.linkonce.r*)
}

.data ALIGN(4096) :
{
    *(.data*)
    *(.gnu.linkonce.d*)
}

.bss ALIGN(4096) :
{
    *(.COMMON*)
    *(.bss*)
    *(.gnu.linkonce.b*)
}

} Поэтому я хочу начать компоновку, и я использую g ++ для Windows, и я использую эти команды в cmd: ld -T linker.ld -o kernle.bin main.o boot.o. И отклоняет мне ошибку: ld: cannot preform PE operations on non PE output file kernel.bin. Кто-нибудь знает, как я могу его починить? Пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 30 октября 2014

Вы используете компилятор и набор инструментов, созданный для создания исполняемых файлов Windows, а не плоских двоичных файлов. Вам нужен кросс-компилятор для разработки ядра. Кроме того, вам понадобится загрузчик, ядро, даже минимальное, не может вписаться в 512-байтовый загрузочный сектор. Поправьте меня, если я ошибаюсь, но вы, кажется, совсем не понимаете процесс загрузки компьютера. Я предлагаю для начала прочитать http://wiki.osdev.org/.

0 голосов
/ 28 июля 2011

Может быть, -формат формат?

И я сомневаюсь, что вы все равно сможете его загрузить ... Перейдите к некоторым учебникам по загрузчику (на osdev.org и brokenthorn.com), и вы получите ответ, почему.

...