当我想在没有底层操作系统的情况下编译二进制文件时,为什么需要裸机工具链?编译器有什么限制,除了缺少功能/功能,因为没有OS / stdlibrary。任何clang / gcc都可以用作裸机编译器吗?我的目标是树莓2。
答案 0 :(得分:5)
首先,您需要一个可以为目标处理器生成代码的编译器。使用clang,通常需要提供适当的命令行参数来选择目标处理器,浮点支持(或缺少支持)等。对于gcc,您需要一个版本来支持特定目标。
其次,想一个像这样的简单程序:
int main()
{
}
您可以使用交叉编译器对其进行编译,并获取目标的目标文件。现在的问题是如何在裸机环境中执行main()。至少你需要一些代码,通常是程序集,在处理器复位时运行,设置堆栈指针,并调用main()。没有其他图书馆支持,其他一切都取决于您。您必须编写代码来执行特定于您的硬件的I / O等。
我正在开发一个针对Linux的工具链,但也支持裸机开发。目前,该工具链针对C / C ++开发的ARM,Mips,PowerPC和x86目标。完全支持Linux目标,并且ARM裸机目标支持即将推出。 "金属裸"在这个上下文中,从上面描述的简单main()到支持许多POSIX函数(如pthread_create(),互斥支持等),它可以在任何地方运行。它也可以在MMU和非MMU环境中运行。您可能希望查看http://ellcc.org处的代码,了解裸金属的处理方式。如果您想尝试一下,也可以下载适用于Windows和Linux的预构建二进制文件。
答案 1 :(得分:3)
用独立式替换裸机,不要用裸机编译器。
你不需要一个独立的编译器来进行裸机工作。但是,您需要使用完全正确的选项组合,使普通(交叉)编译器作为独立编译器工作。用gcc / clang肯定是可能的。如果你知道自己在做什么,那就不难了。
另一方面,大多数人在开始裸机工作时都不知道自己在做什么,而且人们总是会犯错,然后编译器的部分操作系统会陷入你的裸机工作中。搞砸了。独立编译器无法做到这一点,因为它没有依赖的OS部分。因此,不是在内核中遇到奇怪的行为或崩溃,而是会出现编译器错误。
总体而言,为裸机工作构建一个独立(交叉)编译器有三件事要说: