簡體   English   中英

使用ld鏈接時,未定義引用'__main'

[英]When using ld to link, undefined reference to '__main'

/* test.c */

void func1()
{

}

int main()
{
   func1();
}

您好,我正在使用C編寫內核代碼。但是我測試了上面的代碼以了解如何構建C內核代碼。 下面的命令是我給出的提示。 我在Windows 8.1上使用MinGW。

gcc -c -m32 test.c
ld -o test -Ttext 0x00 -e _main test.o

但這個錯誤是從ld發生的。

test.o:test.c:(.text+0x7): undefined reference to `__main'

所以,我嘗試了不同的方式。 為gcc添加-nostdlib和--freestanding選項。 但結果是一樣的。 CRT0中的__main功能是什么? 我該怎么做才能解決這個問題..?

您可以使用gcc而不是ld來執行鏈接:

gcc -o test test.o -nostdlib -lgcc

-lgcc選項提供__main函數。

如果您真正進入操作系統開發,唯一可行的方法是使用類似Unix的操作系統,如GNU / Linux或Mac OS X.

以下兩個是必須的:

-ffreestanding -nostdlib -lgcc

然后建議使用-Wall-Wextra-Werror類的東西,因為內核代碼中的錯誤非常難以調試。

關於入口點,通常使用通過-T linker.ld傳遞給ld鏈接 -T linker.ld 例如,我的(不要復制粘貼它!)如下所示。 它適用於支持虛擬內存的上半部分內核

ENTRY(__start__)
OUTPUT_FORMAT(elf32-i386)

SECTIONS {
    . = 0xC0100000;

    .text BLOCK(4K) : AT(ADDR(.text) - 0xC0000000) {
        KEEP(*(.multiboot))
        KEEP(*(.boot))
        *(.text)
    }

    .rodata ALIGN(0x1000) : AT(ADDR(.rodata) - 0xC0000000) {
        *(.rodata*)
    }

    .data ALIGN(0x1000) : AT(ADDR(.data) - 0xC0000000) {
        *(.data)
    }

    .bss : AT(ADDR(.bss) - 0xC0000000) {
        *(COMMON)
        *(.bss)
        *(.stack)
    }

    __kend__ = .;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM