3

NASM と DJGPP の「ld」コマンドで作成した ASM プログラムをコンパイルしようとしています。これは、コンパイルに使用しているバッチ ファイルのコードです。

@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:
4

3 に答える 3

2

コード ファイルにテキスト セクションがありません:

[BITS 32]
SECTION .text
global start
...

オブジェクト形式については、-f coffDJCPP の正しい形式と思われるため、試してみてください (@ninjalj に感謝):

-f の有効な出力形式は次のとおりです (`*' はデフォルトを示します):
  * bin フラットフォーム バイナリ ファイル (DOS .COM、.SYS など)
    i 番目の Intel hex
    srec モトローラ S レコード
    aout Linux a.out オブジェクト ファイル
    aoutb NetBSD/FreeBSD a.out オブジェクトファイル
    coff COFF (i386) オブジェクトファイル (DOS 用の DJGPP など)
    elf32 ELF32 (i386) オブジェクト ファイル (Linux など)
    elf ELF (ELF32 の短縮名)
    elf64 ELF64 (x86_64) オブジェクト ファイル (Linux など)
    as86 Linux as86 (bin86 バージョン 0.3) オブジェクト ファイル
    obj MS-​​DOS 16 ビット/32 ビット OMF オブジェクト ファイル
    win32 Microsoft Win32 (i386) オブジェクト ファイル
    win64 Microsoft Win64 (x86-64) オブジェクト ファイル
    rdf 再配置可能な動的オブジェクト ファイル形式 v2.0
    ieee IEEE-695 (LADsoft バリアント) オブジェクト ファイル形式
    macho32 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) オブジェクト ファイル
    マッチョマッチョ(MACHO32の略称)
    macho64 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) オブジェクト ファイル
    dbg 出力ステージに渡されるすべての情報のトレース

DJCPP の解決策はありませんが、次のように 64 ビット Linux でこれをコンパイルしてリンクすることができました (.textセクションが追加されています)。

~$ nasm -f elf64 start.asm
~$ ld -T link.ld -o kernel.bin start.o
于 2010-06-22T03:59:07.080 に答える
1

nasm -f coff を試しましたか?

nasm -hf 出力から:

coff      COFF (i386) object files (e.g. DJGPP for DOS)
于 2010-06-21T19:42:50.513 に答える
0

マルチブート ヘッダー情報と、このファイルが (リンカー スクリプトで指定されているように) バイナリ形式の出力にリンクされているという事実から判断すると、これはオペレーティング システムのカーネル (または少なくとも 1 つのアカデミックな例) であることがわかります。したがって、通常のユーザー空間プロセス (管理にカーネルが必要) ではなく、フリースタンディング モードでコンパイルおよび実行することを意図しています。

ld はデフォルトで elf 形式を受け入れます (UNIX プラットフォームの古い古い aout 形式を大幅に置き換えます)。リンカー スクリプトで入力形式として aout を指定する必要がある場合があります (または、nasm に elf 形式のオブジェクト ファイルを出力するように指示する必要があります)。multiboot は elf で最適に動作し、「aout_kludge」をすべて必要としません。

このコード (または任意のカーネル コード) が実行される方法は、ブート ローダーによって読み込まれることです。これはマルチブート対応のカーネルであるため、grub などのマルチブート対応のブートローダーによってロードされることを意図していました ( http://www.gnu.org/software/grub/を参照)。

あなたが Windows を使用していることはわかっています。そのため、サイトに情報ドキュメント システムが適切にインストールされていない可能性がありますが、 http: //www.gnu.org/software/grub/manual/multiboot で GNU ドキュメントを読むことができます。 /multiboot.html . また、このコードは unix のようなプラットフォームでコンパイルされることを意図していたように見えるので、少なくとも djgpp (Windows に移植された gcc) を使用するのは正しいことです。

私は GNU/Linux に取り組んでいるので、回避する必要がある MS Windows や djgpp の問題をデバッグするのは難しいです。おそらく GNU ld (binutils の一部) 情報ドキュメントが役立つでしょう - http://ftp.gnu .org/old-gnu/Manuals/ld-2.9.1/html_node/ld_toc.html

于 2012-11-14T17:43:53.227 に答える