2012-09-12 104 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