2012-09-12 57 views
0

我一直在试图将我当前的OS项目的大部分从x86汇编转换为C,并与NASM汇编并使用MinGW进行编译。 链接时,我得到这些错误:另一个'未定义的_main参考'

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

这里是我compilng,组装和与链接脚本:

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 $ 

我怀疑我有这个问题,是因为微软是他们一贯的,愚蠢的自我,需要某种形式的下划线前缀或东西的。 任何人都可以请提供解决这个问题的方法吗? 干杯。

+0

向我们展示'boot.asm'。 – oldrinb

+0

当然,只是编辑我的问题,并添加它 – phillid

+0

嗯,我敢打赌微软已经做得很好:D。如果您不使用-fno-leading-underscore,那么'main'符号是什么样子的? – Pyjong

回答

1

我怀疑问题是你没有链接到标准C库,它实现了_main作为程序的主要入口点。 _main调用main,然后进行一些初始化和之后的清理。尝试使用void _main()exit()而不是返回。

+0

也许他应该尝试' - nostdlib -nostdinc -fno-builtin -fno-stack-protector' – oldrinb

+1

^^我试过了,没有成功。我从头开始编写自己的操作系统,IIRC,我不能使用标准的C库? – phillid