C 使用ld链接时,未定义对'__主要';

C 使用ld链接时,未定义对'__主要';,c,gcc,compilation,mingw,C,Gcc,Compilation,Mingw,您好,我正在使用C编写内核代码。但我测试了上面的代码,以了解如何构建C内核代码。下面的命令是我给prompt的命令。我正在Windows 8.1上使用MinGW /* test.c */ void func1() { } int main() { func1(); } 但此错误是从ld发生的 gcc -c -m32 test.c ld -o test -Ttext 0x00 -e _main test.o 所以,我尝试了不同的方法。将-nostlib和--freenstandin

您好,我正在使用C编写内核代码。但我测试了上面的代码,以了解如何构建C内核代码。下面的命令是我给prompt的命令。我正在Windows 8.1上使用MinGW

/* test.c */

void func1()
{

}

int main()
{
   func1();
}
但此错误是从ld发生的

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

所以,我尝试了不同的方法。将-nostlib和--freenstanding选项添加到gcc。但结果是一样的。CRT0中的主要功能是什么?我应该怎么做才能解决这个问题

您可以使用
gcc
而不是
ld
来执行链接:

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

-lgcc
选项提供了
\uu main
功能。

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

以下两项是必须的:

gcc -o test test.o -nostdlib -lgcc
然后推荐使用
-Wall
-Wextra
-Werror
,因为内核代码中的bug极难调试

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

-ffreestanding -nostdlib -lgcc

您是否尝试过
-e main
?当然。但是发生了额外的错误。如下所示。ld:警告:找不到输入符号main;默认为00000000 test.o:test.c:(.text+0x7):未定义对“\uu main”的引用如果你不知道a是什么,那么这个答案是不准确的,而且它肯定不是@KemyLand。我对我试图问的问题太模糊了,我会解决这个问题。我的意思是,他指的是哪个内核?如果我知道这一点,我可以尝试确定哪些链接器选项可以用来省略不必要的库。但是给出他的例子,看起来他正试图构建一个应用程序,这与构建C内核代码的说法相反。到处都是果仁的味道!在
-nostlib
-ffrerestanding
,甚至
-Ttext 0x00
。我不确定你是否有必要的知识来回答这个问题(不要以任何方式侮辱你,也要避免火焰战争:我这么说是因为你说“我的意思是,他指的是哪个内核?”(当然是他自己的!),因为有太多的理论(和实践)在OSDeving背后,在
ld
的手册页中查找选项是不合适的。编辑:但是你确实得到了
-lgcc
的正确答案:)@KemyLand你是对的。我完全误解了op的意图。我马上下结论,因为我见过很多次有人试图直接使用
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__ = .;
}