2011-04-06 74 views
0

我做了兩個目標文件。一個是由具有NASM -f的Win32:鏈接pe-i386引導區

C:\home\os> objdump -d boot.obj 

boot.obj:  file format pe-i386 

Disassembly of section .text: 

00000000 <.text>: 
    0: 02 d0     add %al,%dl 
    2: ba 01 03 00 00   mov $0x301,%edx 
    7: 00 fb     add %bh,%bl 
    9: 2f      das 
    a: 45      inc %ebp 
    b: fe 00     incb (%eax) 
     ... 
    19: 00 00     add %al,(%eax) 
    1b: 00 20     add %ah,(%eax) 
    1d: 00 00     add %al,(%eax) 
    1f: 00 53 fa    add %dl,-0x6(%ebx) 
    22: e8 00 00 00 00   call 27 <.text+0x27> 
    27: fa      cli 
    28: f4      hlt 

,另一種是用由GCC -c main.c中-nostdlib -nostdinc -fno-內置-o main.o

C:\home\os>objdump -d main.o 

main.o:  file format pe-i386 


Disassembly of section .text: 

00000000 <_main>: 
    0: 55      push %ebp 
    1: 89 e5     mov %esp,%ebp 
    3: 83 ec 08    sub $0x8,%esp 
    6: 83 e4 f0    and $0xfffffff0,%esp 
    9: b8 00 00 00 00   mov $0x0,%eax 
    e: 83 c0 0f    add $0xf,%eax 
    11: 83 c0 0f    add $0xf,%eax 
    14: c1 e8 04    shr $0x4,%eax 
    17: c1 e0 04    shl $0x4,%eax 
    1a: 89 45 fc    mov %eax,-0x4(%ebp) 
    1d: 8b 45 fc    mov -0x4(%ebp),%eax 
    20: e8 00 00 00 00   call 25 <_main+0x25> 
    25: e8 00 00 00 00   call 2a <_main+0x2a> 
    2a: b8 ef be ad de   mov $0xdeadbeef,%eax 
    2f: c9      leave 
    30: c3      ret 
    31: 90      nop 
    32: 90      nop 
    33: 90      nop 

現在,我嘗試使用這些.. LD 它使用這個模板鏈接:

OUTPUT_FORMAT("pe-i386") 
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 = .; 
} 

但它不工作:

ld -Tlink.ld -o kernel boot.obj main.o 
ld: warning: cannot find entry symbol start; defaulting to 00100000 
boot.obj:boot.s:(.text+0x23): undefined reference to `main' 
main.o:main.c:(.text+0x21): undefined reference to `_alloca' 
main.o:main.c:(.text+0x26): undefined reference to `__main' 
make: *** [link] Fout 1 

我錯過了什麼?我不習慣使用Windows,ELF文件我沒有遇到問題。我應該使用不同的鏈接器?我想它調用alloca,因爲我錯過了一個-fno-stack-protector,但是我的gcc沒有注意到那個標誌..

回答

0

好吧,我設法通過向main添加一個dummy __main函數來「修復」它。 c,並在boot.s中調用_main而不是「main」。 任何人都可以解釋這一點,或提供更優雅的解決方案?