使用ld链接时,未定义引用' __ main'

时间:2015-08-23 08:01:07

标签: c gcc compilation mingw

/* 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功能是什么?我该怎么做才能解决这个问题..?

2 个答案:

答案 0 :(得分:0)

您可以使用ArrayList<String>代替gcc来执行链接:

ld

gcc -o test test.o -nostdlib -lgcc 选项提供-lgcc功能。

答案 1 :(得分:-1)

如果您真正参与操作系统开发,唯一可行的方法是使用类似Unix的操作系统,如GNU / Linux或Mac OS X.

以下两项是必须的:

Listener

然后建议使用-ffreestanding -nostdlib -lgcc -Wall-Wextra之类的内容,因为内核代码中的错误非常难以进行调试。

关于入口点,您通常使用-Werror通过ld传递给-T linker.ld。例如,我的(不要复制粘贴它!)如下所示。它支持虚拟内存linker script

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__ = .;
}