[英]When using ld to link, undefined reference to '__main'
/* 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功能是什么? 我該怎么做才能解決這個問題..?
您可以使用gcc
而不是ld
來執行鏈接:
gcc -o test test.o -nostdlib -lgcc
-lgcc
選項提供__main
函數。
如果您真正進入操作系統開發,唯一可行的方法是使用類似Unix的操作系統,如GNU / Linux或Mac OS X.
以下兩個是必須的:
-ffreestanding -nostdlib -lgcc
然后建議使用-Wall
, -Wextra
和-Werror
類的東西,因為內核代碼中的錯誤非常難以調試。
關於入口點,通常使用通過-T linker.ld
傳遞給ld
的鏈接 -T linker.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__ = .;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.