0

現在の OS プロジェクトの大部分を x86 アセンブリから C に変換し、NASM でアセンブルし、MinGW でコンパイルしようとしています。リンクすると、次のエラーが発生します。

ld: warning: cannot find entry symbol start; defaulting to 00100000
o\main.o:main.c:(.text+0x7): undefined reference to `_main'

コンパイル、アセンブル、およびリンクしているスクリプトは次のとおりです。

gcc -c main.c -o o\main.o -fno-leading-underscore
nasm boot.asm -o o\boot.o -fcoff
ld -o bin\kernel.bin o\boot.o o\main.o -Tlink.ld

...そして私のリンカースクリプトは次のとおりです:

ENTRY(start)
SECTIONS
{
    .text 0x100000 :
    {
        code = .;
        _code = .;
        __code = .;
        *(.text)
        . = ALIGN(4096);
    }

    .data :
    {
        data = .;
        _data = .;
        __data = .;
        *(.data)
        *(.rodata)
        . = ALIGN(4096);
    }

    .bss :
    {
        bss = .;
        _bss = .;
        __bss = .;
        *(.bss)
        . = ALIGN(4096);
    }

    end = .;
    _end = .;
    __end = .;
}

main.o で nm を使用すると、シンボル '__main' を持つものがあると表示されますが、次のように宣言しました。

int main()
{
    return 0xDEADBABA;
}

boot.asm は次のとおりです。

MBOOT_PAGE_ALIGN    equ 1<<0    ; Load kernel and modules on a page boundary
MBOOT_MEM_INFO      equ 1<<1    ; Provide your kernel with memory info
MBOOT_HEADER_MAGIC  equ 0x1BADB002 ; Multiboot Magic value
MBOOT_HEADER_FLAGS  equ MBOOT_PAGE_ALIGN | MBOOT_MEM_INFO
MBOOT_CHECKSUM      equ -(MBOOT_HEADER_MAGIC + MBOOT_HEADER_FLAGS)
[bits 32]
[global mboot]
[extern code]
[extern bss]
[extern end]

mboot:
    dd  MBOOT_HEADER_MAGIC
    dd  MBOOT_HEADER_FLAGS
    dd  MBOOT_CHECKSUM
    dd  mboot
    dd  code
    dd  bss
    dd  end
    dd  start

[extern main]
[global start]

start:
    push ebx
    cli
    call main
    jmp $

私が抱えているこの問題は、マイクロソフトがいつもの愚かな自己であり、ある種のアンダースコアプレフィックスまたは何かを必要とするためだと思います。誰でもこの問題の解決策を提供してもらえますか? 乾杯。

4

1 に答える 1

1

_main問題は、プログラムのメイン エントリ ポイントとして実装されている標準 C ライブラリにリンクしていないことだと思われます。_mainを呼び出しmainて、前にいくつかの初期化を行い、後でクリーンアップを行います。return の代わりにvoid _main()andを使用してみてください。exit()

于 2012-09-12T05:09:14.773 に答える