C 还有一个';未定义对_main'的引用;

C 还有一个';未定义对_main'的引用;,c,gcc,ld,C,Gcc,Ld,我一直在尝试将当前操作系统项目的大部分内容从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-l

我一直在尝试将当前操作系统项目的大部分内容从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时,它说有一些东西带有符号“uu 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 $

MBOOT\u PAGE\u ALIGN eq 1我怀疑问题在于您没有链接到标准C库,该库将
\u main
作为程序的主要入口点
\u main
调用
main
并在之前和之后执行一些初始化。尝试使用
void\u main()
exit()
而不是return。

也许他应该尝试
-nostlib-nostdinc-fno builtin-fno stack protector
^^^我尝试过,但没有成功。我在这里从头开始写我自己的操作系统,IIRC,我不能使用标准的C库?当然,只是编辑了我的问题并添加了它,我打赌微软做得很好:D.如果你不使用-fno引导下划线,“main”符号看起来像什么?它看起来像“\uuuuuu main”,是的,这是3个下划线。你在这里没有使用任何微软工具,所以,你在责怪微软干什么?我听说他们让某些符号需要下划线前缀,这样它们就不会与其他符号或类似符号发生冲突。其他操作系统则采用了不同的方式,但微软太懒了。你有解决方案吗?或者这是离题的?