裸机交叉编译器的输入限制是什么...比如它不编译带有指针或 malloc 的程序...或者任何需要比底层硬件更多的东西...以及如何才能找到这些限制..
我还想问...我为目标 mips 构建了一个交叉编译器...我需要使用这个交叉编译器创建一个 mips 可执行文件...但我无法找到可执行文件在哪里...因为那里是1 个可执行文件,我发现 mipsel-linux-cpp 应该编译、汇编和链接,然后生成 a.out 但它没有这样做......
然而 ./cc1 给出了 mips 组件.......
有一个安装文件夹,其中有一个 gcc 可执行文件,它使用 i386 程序集,然后给出一个 exe...我不明白当我将目标指定为 mips 时,gcc exe 如何给出 i386 而不是 mips 程序集...
请帮助我真的无法理解什么是快乐......
我按照以下步骤操作..
1.安装binutils 2.19
2.为mips配置gcc..(g++,core)
我建议您应该开始两个单独的问题。
GNU 工具链没有任何操作系统依赖性,但 GNU 库有。大多数 GCC 裸机交叉构建都使用 Newlib C 库,它提供了一组syscall您必须自己将其映射到目标的存根。这些存根包括实现流 I/O 和堆管理所需的低级调用。根据您的需要,它们可以非常简单或非常复杂。如果唯一的 I/O 支持是 UART 到 stdin/stdout/stderr,那么这很简单。您不必实现所有内容,但如果您不实现 I/O 存根,则您将无法使用 printf() 等。如果您希望 malloc() 工作,则必须实现 sbrk()/sbrk_r() 系统调用。
GNU C++ 库将与 Newlib 作为其底层库一起正常工作。如果您使用 C++,C 运行时启动(通常是 crt0.s)必须包含静态初始化程序循环,以调用代码可能包含的任何静态对象的构造函数。运行时启动当然还必须初始化处理器、时钟、SDRAM控制器、定时器、MMU等;这是你的责任,而不是编译器的责任。
我没有MIPS目标的经验,但是所有处理器的原理都是相同的,有一篇非常有用的文章叫做“使用 GNU 构建裸机 ARM” http://www.state-machine.com/arm/Building_bare-metal_ARM_with_GNU.pdf您可能会发现它很有帮助,其中大部分内容都是相关的 - 特别是移植有关实现 Newlib 存根的部分。
关于您的另一个问题,如果您的编译器名为 mipsel-linux-cpp,那么它不是“裸机”构建,而是 Linux 构建。此外,这个可执行文件并不是真正的“编译、汇编和链接”,而是一个分别调用预处理器、编译器、汇编器和链接器的驱动程序。必须正确配置它才能调用交叉工具而不是主机工具。我通常单独调用链接器,以便强制执行有关链接哪个标准库 (-nostdlib) 的决策,而且还因为当应用程序由多个执行单元组成时它更有意义。除此之外,我无法提供太多帮助,因为我一直使用由比我更有耐心的人构建的 GNU-ARM 工具,而且托管在 Windows 上,在 Windows 上,调用主机工具链的可能性较小(一个我也避免使用那些依赖 Cygwin 的工具链的原因)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)