Компиляция кода сборки - PullRequest
3 голосов
/ 21 июня 2010

Я пытаюсь скомпилировать программу ASM, которую я написал с NASM и командой "ld" из DJGPP.Вот код командного файла, который я использую для его компиляции:

@echo off
set path=C:\NASM;%PATH%
nasm -f aout -o start.o start.asm
ld -T link.ld -o kernel.bin start.o

Но когда я запускаю файл, я получаю:

start.o: file not recognised: File format not recognized

Что в моем файле сборки,я сделал неправильно, чтобы вызвать это сообщение об ошибке?

РЕДАКТИРОВАТЬ

Это мой файл link.ld:

OUTPUT_FORMAT("binary")
ENTRY(start)
phys = 0x00100000;
SECTIONS
{
  .text phys : AT(phys) {
    code = .;
    *(.text)
    *(.rodata)
    . = ALIGN(4096);
  }
  .data : AT(phys + (data - code))
  {
    data = .;
    *(.data)
    . = ALIGN(4096);
  }
  .bss : AT(phys + (bss - code))
  {
    bss = .;
    *(.bss)
    . = ALIGN(4096);
  }
  end = .;
}

РЕДАКТИРОВАТЬ

Ничего другогоработает, поэтому вот код для моего файла ASM (я создавал ядро ​​для операционной системы, над которой я работал):

[BITS 32]
global start
start:
    mov esp, _sys_stack
    jmp stublet

ALIGN 4
mboot:
    MULTIBOOT_PAGE_ALIGN    equ 1<<0
    MULTIBOOT_MEMORY_INFO   equ 1<<1
    MULTIBOOT_AOUT_KLUDGE   equ 1<<16
    MULTIBOOT_HEADER_MAGIC  equ 0x1BADB002
    MULTIBOOT_HEADER_FLAGS  equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO |         MULTIBOOT_AOUT_KLUDGE
    MULTIBOOT_CHECKSUM  equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
    EXTERN code, bss, end

    dd MULTIBOOT_HEADER_MAGIC
    dd MULTIBOOT_HEADER_FLAGS
    dd MULTIBOOT_CHECKSUM

    dd mboot
    dd code
    dd bss
    dd end
    dd start

stublet:
    jmp $

SECTION .bss
    resb 8192
_sys_stack:

Ответы [ 3 ]

2 голосов
/ 22 июня 2010

Вам не хватает текстового раздела в файле кода:

[BITS 32]
<b>SECTION .text</b>
global start
...

Для формата объекта попробуйте -f coff, так как это кажется правильным форматом для DJCPP (спасибо @ninjalj):

valid output formats for -f are (`*' denotes default):
  * bin       flat-form binary files (e.g. DOS .COM, .SYS)
    ith       Intel hex
    srec      Motorola S-records
    aout      Linux a.out object files
    aoutb     NetBSD/FreeBSD a.out object files
    <b>coff      COFF (i386) object files (e.g. DJGPP for DOS)</b>
    elf32     ELF32 (i386) object files (e.g. Linux)
    elf       ELF (short name for ELF32) 
    elf64     ELF64 (x86_64) object files (e.g. Linux)
    as86      Linux as86 (bin86 version 0.3) object files
    obj       MS-DOS 16-bit/32-bit OMF object files
    win32     Microsoft Win32 (i386) object files
    win64     Microsoft Win64 (x86-64) object files
    rdf       Relocatable Dynamic Object File Format v2.0
    ieee      IEEE-695 (LADsoft variant) object file format
    macho32   NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) object files
    macho     MACHO (short name for MACHO32)
    macho64   NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) object files
    dbg       Trace of all info passed to output stage

У меня нет решения для вас для DJCPP, но я смог скомпилировать и связать это на моем 64-битном Linux (с добавленным разделом .text) следующим образом:

~$ nasm -f elf64 start.asm
~$ ld -T link.ld -o kernel.bin start.o
1 голос
/ 21 июня 2010

Вы пробовали nasm -f coff?

С выходом nasm -hf:

coff      COFF (i386) object files (e.g. DJGPP for DOS)
0 голосов
/ 14 ноября 2012

Судя по информации заголовка мультизагрузки и тому факту, что этот файл связан с выводом двоичного формата (как указано в скрипте компоновщика), говорит мне, что это ядро ​​операционной системы (или, по крайней мере, академический пример 1) и, следовательно, предназначен для компиляции и запуска в автономном режиме, а не в обычном пользовательском пространстве (для управления которым требуется ядро).

ld по умолчанию принимает формат elf (который очень заменяет старый, устаревший формат aout на платформах Unix), вам может потребоваться указать aout в качестве входного формата в сценарии компоновщика (или, в качестве альтернативы, указать nasm для вывода объекта формата elf файлы). multiboot лучше всего работает с elf и не требует всего этого "aout_kludge"

Способ, которым этот код (или любой код ядра) должен был быть выполнен, загружается загрузчиком. Поскольку это ядро ​​совместимо с несколькими загрузками, оно должно было быть загружено загрузчиком, совместимым с несколькими загрузками, таким как grub (см. http://www.gnu.org/software/grub/).

Я понимаю, что вы работаете в Windows, поэтому у вас, вероятно, не установлена ​​система информационной документации на вашем сайте, но вы можете прочитать документацию GNU по адресу http://www.gnu.org/software/grub/manual/multiboot/multiboot.html. Кроме того, похоже, что этот код предназначался для компиляции на Unix-подобной платформе, поэтому, по крайней мере, вы вправе использовать djgpp (gcc перенесен в windows).

Поскольку я работаю над GNU / Linux, мне трудно отлаживать любые проблемы MS windows или djgpp, которые необходимо обойти, возможно, будет полезна информационная документация по GNU ld (часть binutils) - http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_toc.html

...