linux - 裸机交叉编译器输入

标签 linux compiler-construction mips

裸机交叉编译器的输入限制是什么……比如它不编译带有指针或 mallocs 的程序……或任何需要比底层硬件更多的东西……还有如何1 可以找到这些限制..

我还想问...我为目标 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 库,它提供了一组 系统调用 stub ,您必须自己将其映射到您的目标。这些 stub 包括实现流 I/O 和堆管理所需的低级调用。根据您的需要,它们可以非常简单或非常复杂。如果唯一的 I/O 支持是 UART 到 stdin/stdout/stderr,那么它很简单。您不必实现所有内容,但如果您不实现 I/O stub ,您将无法使用 printf() 等。您必须实现 sbrk()/sbrk_r() 系统调用才能使 malloc() 工作。

GNU C++ 库将与 Newlib 作为其基础库一起正常工作。如果您使用 C++,C 运行时启动(通常是 crt0.s)必须包含静态初始化程序循环以调用您的代码可能包含的任何静态对象的构造函数。运行时启动当然还必须初始化处理器、时钟、SDRAM Controller 、定时器、MMU 等;这是你的责任,而不是编译器的责任。

我没有 MIPS 目标的经验,但所有处理器的原理都是相同的,有一篇非常有用的文章叫做 "Building Bare Metal ARM with GNU"您可能会发现它有帮助,其中大部分都是相关的 - 特别是移植有关实现 Newlib stub 的部分。

关于您的其他问题,如果您的编译器名为 mipsel-linux-cpp,则它不是“裸机”构建,而是 Linux 构建。而且这个可执行文件并不是真正的“编译、汇编和链接”,而是一个分别调用预处理器、编译器、汇编器和链接器的驱动程序。它必须正确配置才能调用交叉工具而不是主机工具。我通常单独调用链接器,以强制决定链接哪个标准库 (-nostdlib),还因为当应用程序由多个执行单元组成时它更有意义。除了这里,我不能提供太多帮助,因为我一直使用由明显比我更有耐心的人构建的 GNU-ARM 工具,而且托管在 Windows 上,在 Windows 上调用主机工具链的可能性较小(一个我也避免使用那些依赖 Cygwin 的工具链的原因)

关于linux - 裸机交叉编译器输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1417025/

相关文章:

MySQL 服务器无法在 Raspberry Pi 上启动

linux - 配置:DX_INIT_DOXYGEN 检查状态

parsing - 通过语法解析为 AST(或 .y+.lang => xml)的工具

assembly - MIPS:lw(加载字)指令

linux - Linux 中的 TCP 套接字数据不一致

linux - 如何通过管道查找结果来解压缩?

javascript - 如何使用无上下文语法从标记列表构造抽象语法树?

c++ - 编译器如何评估 c 中的 sizeof 运算符

arrays - MIPS中的冒泡排序算法

c - 如何计算MIPS中两个值之间的偶数之和?