When using ld to link, undefined reference to '__main'

房东的猫 提交于 2019-12-31 01:53:05

问题


/* test.c */

void func1()
{

}

int main()
{
   func1();
}

Hello, I am making kernel code using C. But I tested above code to know how to build C kernel code. Below command is what I gave to prompt. I am using MinGW on Windows 8.1.

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

But this error was occurred from ld.

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

So, I tried different way. add -nostdlib and --freestanding option to gcc. But the result was same. Is __main function in CRT0 ? What should I do to solve this problem.. ?


回答1:


The only viable way if you're really into operating system development is by using some Unix-like OS like GNU/Linux or Mac OS X.

The following two are a must:

-ffreestanding -nostdlib -lgcc

Then things like -Wall, -Wextra, and -Werror are recommended because bugs in kernel code are extremely hard to debug.

With respect to the entry point, you usually use a linker script that you pass to ld via -T linker.ld. For example, mine (don't copy paste it!) looks as follows. It's for a higher-half kernel with support for virtual memory:

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:


You could use gcc instead of ld to perform the linking:

gcc -o test test.o -nostdlib -lgcc

The -lgcc option provides the __main function.



来源:https://stackoverflow.com/questions/32164478/when-using-ld-to-link-undefined-reference-to-main

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!