裸机交叉编译器的输入限制是什么......因为它不能用指针或mallocs编译程序......或者需要比底层硬件更多的东西....还有可以找到这些限制..
我也想问...我为目标mips构建了一个交叉编译器。我需要使用这个交叉编译器创建一个mips可执行文件...但是我无法找到可执行文件的位置...在有1个可执行文件,我发现mipsel-linux-cpp应该编译,汇编和链接然后生成a.out但是它没有这样做...
然而./cc1给出了mips程序集.......
有一个安装文件夹,它有一个gcc可执行文件,它使用i386程序集然后给一个exe ...我不明白gcc exe如何能给i386而不是mips程序集当我指定目标为mips ....
请帮助我真的不能理解什么是幸福...
我遵循了以下步骤.. 1.已安装的binutils 2.19 2.为mips配置gcc ..(g ++,core)
答案 0 :(得分:3)
我建议你应该开始两个单独的问题。
GNU工具链没有任何操作系统依赖关系,但GNU库确实如此。 GCC的大多数裸机交叉版本都使用Newlib C库,它提供了一组系统调用存根,您必须自己映射到目标。这些存根包括实现流I / O和堆管理所必需的低级调用。根据您的需要,它们可以非常简单或非常复杂。如果唯一的I / O支持是UART到stdin / stdout / stderr,那么它很简单。您不必实现所有内容,但如果您没有实现I / O存根,则无法使用printf()。你必须实现sbrk()/ sbrk_r()系统调用你想要malloc()工作。
GNU C ++库可以正常使用Newlib作为其底层库。如果使用C ++,则C运行时启动(通常为crt0.s)必须包含静态初始化循环,以调用代码可能包含的任何静态对象的构造函数。运行时启动当然也必须初始化处理器,时钟,SDRAM控制器,定时器,MMU等;这是你的责任,而不是编译器的责任。
我没有MIPS目标的经验,但所有处理器的原理都是相同的,有一篇非常有用的文章称为"Building Bare Metal ARM with GNU",您可能会发现它很有用,其中很多都是相关的 - 尤其是移植部件关于实现Newlib存根。
关于你的另一个问题,如果你的编译器被称为mipsel-linux-cpp,那么它不是一个'裸机'构建,而是一个Linux构建。此可执行文件实际上并不是“编译,汇编和链接”,而是一个单独调用预处理器,编译器,汇编器和链接器的驱动程序。必须正确配置才能调用跨工具而不是主机工具。我通常单独调用链接器以强制决定要链接哪个标准库(-nostdlib),还因为当应用程序由多个执行单元组成时更有意义。除了那里之外,我不能提供太多的帮助,因为我总是使用由比我明显更耐心的人构建的GNU-ARM工具,而且还托管在Windows上,在那里调用主机工具链的可能性较小(一个之所以我也避免那些依赖Cygwin的工具链
答案 1 :(得分:1)
修改强> 有了更多的时间,我已经重写了我的原始答案,试图提供更有用的东西。
我无法为您的问题提供具体答案。我从未尝试过在MIPS机器上运行代码。我所拥有的是拥有各种“裸机”电路板的丰富经验。各种CPU和各种编译器和交叉编译器。所以我理解适用于所有这些情况的原则。在你希望通过这样的工作取得成功之前,我会指出你需要吸收的那种知识,希望我能列出一些资源链接,让你开始学习这些知识。
我担心你不知道指针是完全裸机编译器可以处理的东西,它们是一个基本的机器原语。这告诉我你可能不是一个专家嵌入式开发人员,只是陷入这种特殊情况。没关系。编程嵌入式系统没有任何神奇之处,您可以了解您需要了解的内容。
第一步是了解C与您希望运行代码的机器之间的关系。基本上C是一种可移植的汇编语言。这意味着C适用于操纵机器的基本操作。从这个意义上讲,机器的基本操作是读取和写入存储器位置,对从存储器读取的数据执行算术和布尔操作,并根据该数据做出分支和循环决策。特别是指针的C概念允许您在指定的内存中的位置处理数据。
到目前为止一直很好,但只是在内存中进行原始计算通常不够 - 你需要一种从内存输入和输出数据的方法。为此,您需要操作电路板上的硬件外围设备。如果硬件外设是内存映射,则用于控制外设的机器寄存器看起来与内存位置完全相同,C可以直接操作它们。即使在这种情况下,更有可能的是,通过使用仅为此目的提供的例程库扩展C核心语言来最好地处理有用的I / O.这些库例程处理操作板上外围硬件所涉及的所有令人讨厌的细节(定时器,中断,非内存映射I / O),并使用方便的C函数调用接口将它们包装起来。这个想法是你可以简单地去printf(“你好世界”);并且库调用会处理显示字符串的详细信息。
熟练的开发人员知道如何使现有的I / O库适应新的板,或者如何开发新的库例程以提供对非标准定制硬件的访问。开发这些技能的经典方法是从简单的东西开始,通常是用于输出设备的LED,以及用于输入设备的开关。编写一个程序,以可预测的方式脉冲LED,或读取开关并反射LED。第一次开始这项工作将非常令人满意。
好吧,我已经漫无边际了。是时候为您提供更多资源来学习。好消息是,从来没有比这更好的时间来了解硬件和软件之间的接口是如何工作的。有大量免费提供的代码和文档。如您所知,Stackoverflow是一个很好的资源。祝好运!链接如下;
Knowing the C language well is fundamental
Why not get your code working on a simulator before you try real hardware