将 ld 用于 link 时,未定义对“__main”的引用
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 选项。但结果是一样的。 __main 在 CRT0 中有功能吗?我应该怎么做才能解决这个问题..?
您可以使用 gcc
而不是 ld
来执行链接:
gcc -o test test.o -nostdlib -lgcc
-lgcc
选项提供__main
功能。
如果您真的热衷于操作系统开发,唯一可行的方法是使用一些类似 Unix 的 OS,例如 GNU/Linux 或 Mac OS X。
下面两个是必须的:
-ffreestanding -nostdlib -lgcc
那么推荐 -Wall
、-Wextra
和 -Werror
之类的东西,因为内核代码中的错误极难 调试。
关于入口点,您通常使用支持虚拟内存的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:
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__ = .;
}
/* test.c */
void func1()
{
}
int main()
{
func1();
}
您好,我正在使用 C 编写内核代码。但是我测试了上面的代码以了解如何构建 C 内核代码。下面的命令是我给出的提示。我在 Windows 8.1.
上使用 MinGWgcc -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 选项。但结果是一样的。 __main 在 CRT0 中有功能吗?我应该怎么做才能解决这个问题..?
您可以使用 gcc
而不是 ld
来执行链接:
gcc -o test test.o -nostdlib -lgcc
-lgcc
选项提供__main
功能。
如果您真的热衷于操作系统开发,唯一可行的方法是使用一些类似 Unix 的 OS,例如 GNU/Linux 或 Mac OS X。
下面两个是必须的:
-ffreestanding -nostdlib -lgcc
那么推荐 -Wall
、-Wextra
和 -Werror
之类的东西,因为内核代码中的错误极难 调试。
关于入口点,您通常使用支持虚拟内存的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:
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__ = .;
}