4

裸机交叉编译器的输入限制是什么......就像它不编译带有指针或malloc的程序......或者任何需要比底层硬件更多的东西......还有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)

4

2 回答 2

4

我建议你应该开始两个单独的问题。

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 目标的经验,但所有处理器的原理都是相同的,有一篇非常有用的文章,名为“使用 GNU 构建裸机 ARM”,您可能会发现它很有帮助,其中大部分都是相关的——尤其是移植部件关于实现 Newlib 存根。

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

于 2009-09-14T09:25:52.087 回答
1

编辑 有了更多的时间,我重写了我原来的答案,试图提供一些更有用的东西。

我无法为您的问题提供具体答案。我从未尝试让代码在 MIPS 机器上运行。我所拥有的是让各种“裸机”板启动和运行的丰富经验。各种CPU和各种编译器和交叉编译器。因此,我了解适用于所有此类情况的原则。我会指出你需要吸收的知识,然后你才能希望在这样的工作中取得成功,希望我可以列出一些资源链接,让你开始学习这些知识。

我担心你不知道指针正是裸机编译器可以处理的那种东西,它们是基本的机器原语。这告诉我,您可能不是陷入这种特殊情况的专家嵌入式开发人员。没关系。对嵌入式系统进行编程没有什么神奇之处,您可以学习您需要了解的内容。

第一步是了解 C 语言与您希望在其上运行代码的机器之间的关系。基本上 C 是一种可移植的汇编语言。这意味着 C 语言有利于操纵机器的基本操作。从这个意义上说,机器的基本操作是读取和写入内存位置,对从内存读取的数据执行算术和布尔运算,并根据该数据做出分支和循环决策。特别是指针的 C 概念允许您在内存中指定的位置操作数据。

到目前为止一切都很好,但是仅仅在内存中进行原始计算通常是不够的——您需要一种从内存输入和输出数据的方法。为此,您需要操作板上的硬件外围设备。如果硬件外围设备是内存映射的那么用于控制外围设备的机器寄存器看起来与内存位置完全相同,C 可以直接操作它们。即使在这种情况下,通过使用专门为此目的提供的例程库扩展 C 核心语言,更有可能最好地处理有用的 I/O。这些库例程处理与操作板上外围硬件有关的所有令人讨厌的细节(定时器、中断、非内存映射 I/O),并使用方便的 C 函数调用接口将它们包装起来。这个想法是你可以简单地使用 printf("hello world"); 库调用负责显示字符串的细节。

熟练的开发人员知道如何使现有的 I/O 库适应新板,或者如何开发新的库例程以提供对非标准定制硬件的访问。培养这些技能的经典方法是从简单的东西开始,通常是输出设备的 LED 和输入设备的开关。编写一个程序,以可预测的方式使 LED 产生脉冲,或者读取开关并反映在 LED 上。你第一次得到这个工作将是非常令人满意的。

好吧,我已经逛够了。是时候为你提供更多的学习资源了。好消息是,现在正是了解硬件和软件之间的接口如何工作的最佳时机。有大量免费可用的代码和文档。如您所知,Stackoverflow 是一个很好的资源。祝你好运!链接如下;

嵌入式系统概述

精通C语言是基础

为什么不在你尝试真正的硬件之前让你的代码在模拟器上运行

另一个模拟环境

Linux 设备驱动程序 - 一个重叠的主题

另一本关于裸机编程的书

于 2009-09-13T07:01:38.183 回答