Linker 如何使用clang将crtbegin.o和crtend.o链接到我的32位操作系统

Linker 如何使用clang将crtbegin.o和crtend.o链接到我的32位操作系统,linker,operating-system,crt,Linker,Operating System,Crt,最近,我一直在玩弄x86操作系统,并决定将其从使用GCC交叉编译器转换为使用clang。具体地说,我让Makefile使用clang-targeti386pcnone和-m32。经过一番斗争,我终于成功地通过了编译阶段,进入了链接阶段,但我遇到了以下错误: /usr/bin/ld: i386:x86-64 architecture of input file `arch/i386/crtbegin.o' is incompatible with i386 output /usr/bin/ld:

最近,我一直在玩弄x86操作系统,并决定将其从使用GCC交叉编译器转换为使用
clang
。具体地说,我让Makefile使用
clang-targeti386pcnone
-m32
。经过一番斗争,我终于成功地通过了编译阶段,进入了链接阶段,但我遇到了以下错误:

/usr/bin/ld: i386:x86-64 architecture of input file `arch/i386/crtbegin.o' is incompatible with i386 output
/usr/bin/ld: i386:x86-64 architecture of input file `arch/i386/crtend.o' is incompatible with i386 output
请注意,这两个文件实际上在我的操作系统上都不存在,只是编译器在构建过程中的某个时刻放在那里(我特别告诉它在Makefile中这样做)。然而,即使我有
-m32
-target
标志,并且安装了32位libc(尽管我的操作系统是64位的),它也不会尝试链接32位版本。我怎样才能解决这个问题

是否应该使用系统crtbegin和crtend?已经很晚了,我根本无法思考


所有的帮助是感激的,我可以提供更多的信息和来源,如果需要的话,谢谢

我不明白这个问题。你为什么要尝试与crt链接?如果你正在制作一个操作系统,你不需要链接到crt。实际上你可以告诉链接器你的入口点是什么。我不知道叮当声。对于ld,只需使用
-entry main
指定入口点即可。这将告诉ld将可执行文件的入口点设为
main
函数。@user123操作系统在某个点跳到C代码。我现在的问题是,在i686 elf gcc中,它曾经创建一些兼容的crtbegin和crtend文件,这些文件与它配合得非常好,但是现在使用
clang
它们不兼容,我不知道为什么。我想也许它的目标架构有问题,但我相信
i386 pc none
是正确的。但也许它试图生成一个64位crt,尽管
-m32
。我真的不知道发生了什么,为什么仅仅一个编译器的更改就破坏了这么多东西。@user123再看一看,它似乎确实试图得到一个64位的crtbegin和crtend,而i686 elf gcc有正确的32位版本老实说,我不太了解c运行时之类的东西。我认为在一个独立的实现中没有这些。crtbegin和crtend不是用来调用对象的构造函数和析构函数的吗。在一个独立的静态操作系统中,没有必要这样做。有什么东西可以建造和摧毁?您是否已将
-nostlibs
标志传递给了clang和
-ffreserving
标志?