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

后端 未结 2 1466
野性不改
野性不改 2020-12-19 20:12
/* 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

相关标签:
2条回答
  • 2020-12-19 20:36

    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__ = .;
    }
    
    0 讨论(0)
  • 2020-12-19 20:38

    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.

    0 讨论(0)
提交回复
热议问题