C 使用ld链接时,未定义对'__主要';
您好,我正在使用C编写内核代码。但我测试了上面的代码,以了解如何构建C内核代码。下面的命令是我给prompt的命令。我正在Windows 8.1上使用MinGWC 使用ld链接时,未定义对'__主要';,c,gcc,compilation,mingw,C,Gcc,Compilation,Mingw,您好,我正在使用C编写内核代码。但我测试了上面的代码,以了解如何构建C内核代码。下面的命令是我给prompt的命令。我正在Windows 8.1上使用MinGW /* test.c */ void func1() { } int main() { func1(); } 但此错误是从ld发生的 gcc -c -m32 test.c ld -o test -Ttext 0x00 -e _main test.o 所以,我尝试了不同的方法。将-nostlib和--freenstandin
/* test.c */
void func1()
{
}
int main()
{
func1();
}
但此错误是从ld发生的
gcc -c -m32 test.c
ld -o test -Ttext 0x00 -e _main test.o
所以,我尝试了不同的方法。将-nostlib和--freenstanding选项添加到gcc。但结果是一样的。CRT0中的主要功能是什么?我应该怎么做才能解决这个问题 您可以使用
gcc
而不是ld
来执行链接:
test.o:test.c:(.text+0x7): undefined reference to `__main'
-lgcc
选项提供了\uu main
功能。如果您真正投入到操作系统开发中,唯一可行的方法是使用一些类似Unix的操作系统,如GNU/Linux或Mac OS X
以下两项是必须的:
gcc -o test test.o -nostdlib -lgcc
然后推荐使用-Wall
、-Wextra
和-Werror
,因为内核代码中的bug极难调试
关于入口点,通常使用通过-T linker.ld
传递到ld
的。例如,我的(不要复制粘贴!)如下所示。它适用于支持虚拟内存的:
-ffreestanding -nostdlib -lgcc
您是否尝试过
-e main
?当然。但是发生了额外的错误。如下所示。ld:警告:找不到输入符号main;默认为00000000 test.o:test.c:(.text+0x7):未定义对“\uu main”的引用如果你不知道a是什么,那么这个答案是不准确的,而且它肯定不是@KemyLand。我对我试图问的问题太模糊了,我会解决这个问题。我的意思是,他指的是哪个内核?如果我知道这一点,我可以尝试确定哪些链接器选项可以用来省略不必要的库。但是给出他的例子,看起来他正试图构建一个应用程序,这与构建C内核代码的说法相反。到处都是果仁的味道!在-nostlib
,-ffrerestanding
,甚至-Ttext 0x00
。我不确定你是否有必要的知识来回答这个问题(不要以任何方式侮辱你,也要避免火焰战争:我这么说是因为你说“我的意思是,他指的是哪个内核?”(当然是他自己的!),因为有太多的理论(和实践)在OSDeving背后,在ld
的手册页中查找选项是不合适的。编辑:但是你确实得到了-lgcc
的正确答案:)@KemyLand你是对的。我完全误解了op的意图。我马上下结论,因为我见过很多次有人试图直接使用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__ = .;
}