【问题标题】:When using ld to link, undefined reference to '__main'使用 ld 链接时,未定义对 '__main' 的引用
【发布时间】:2015-08-23 08:01:06
【问题描述】:
/* 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'

所以,我尝试了不同的方法。将 -nostdlib 和 --freestanding 选项添加到 gcc。但结果是一样的。 __main 函数在 CRT0 中吗?我应该怎么做才能解决这个问题..?

【问题讨论】:

  • 你试过-e main吗?
  • 当然。但是发生了额外的错误。如下所示。
  • ld:警告:找不到入口符号 main;默认为 00000000 test.o:test.c:(.text+0x7): undefined reference to `__main'

标签: c gcc compilation mingw


【解决方案1】:

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

以下两个是必须的:

-ffreestanding -nostdlib -lgcc

然后推荐使用-Wall-Wextra-Werror 之类的东西,因为内核代码中的错误非常难以调试。

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

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

【讨论】:

    【解决方案2】:

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

    gcc -o test test.o -nostdlib -lgcc
    

    -lgcc 选项提供了__main 函数。

    【讨论】:

    • 如果您不知道 kernel 是什么,这个答案是不准确的,而且它绝对不是 application
    • @KemyLand 我对我想问的内容太模糊了,我会解决这个问题。我的意思是,他指的是哪个内核?如果我知道这一点,我可以尝试使用哪些链接器选项来省略不必要的库。但从他的例子来看,他似乎正在尝试构建一个应用程序,这与构建 C 内核代码的说法相反。
    • 操作正在构建内核代码。内核气味无处不在!在-nostdlib-ffreestanding,甚至-Ttext 0x00。我不确定你是否具备回答这个问题所需的知识(不要以任何方式侮辱你,并避免激战:我这么说是因为你说“我的意思是,他指的是哪个内核?”(当然是他自己的!)),因为 OSDeving 背后有太多的理论(和实践),因此在 ld 的手册页中查找选项根本不合适。 编辑:您确实得到了-lgcc 正确的:)。
    • @KemyLand 你是对的。我完全误解了 op 想要做什么。我突然得出结论,因为我已经看到很多次有人尝试直接使用ld 构建应用程序和链接,最终得到未定义的引用,然后抛出其他选项来解决它。这绝对不是这里发生的事情。
    猜你喜欢
    • 2011-10-03
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    相关资源
    最近更新 更多