ARM Cortex-M 上的 Linux 内核:如何构建合适的可执行文件

con*_*roy 6 linux embedded gcc toolchain cortex-m

我需要为 Cortex-M MCU 构建一个完整的 linux 开发框架,特别是 STM32F7 Cortex-M7。首先,我必须解释一些背景信息,所以请耐心等待。

我已经下载并构建了一个带有 croostool-ng 1.24 的 gcc 工具链,指定了一个 armv7e-m 架构,其中包含仅拇指指令和 linux 4.20 作为操作系统,并且我希望输出是 FLAT 可执行文件(我认为这意味着 bFLT)。

然后我继续使用 编译 linux 内核(版本 4.20)configs/stm32_defconf,然后静态编译的 busybox rootfs,全部使用我的新工具链。

内核启动得很好,但给我一个错误和内核痛苦,并显示以下消息:

启动 init: /sbin/init 存在但无法执行(错误 -8)

request_module:无法处理 modprobe binfmt-464c,kmod 忙于 50 个线程

有趣的部分是最后一条消息。我的busybox可执行文件竟然是一个.ELFCortex-M没有 MMU,所以不可能在.ELF支持MMU 的架构上构建 linux 内核,这就是为什么找不到 (464c)"LF" 二进制加载器,没有。

所以最后,我的问题是:

我如何构建 bFLT 可执行文件以在无 MMU 的 Linux 架构上运行?我的工具链有 elf2flt,但在 crosstool-ng 中,我已经指定了无 MMU 架构和 FLAT 二进制文件,我期待直接 bFLT 输出,而不是“无用”的可执行文件。这甚至可能吗?

或者更好:是否有记录的标准程序来构建基于 Cortex-M 的完整、有效的 Linux 系统?

跟进:

我放弃了构建 FLAT 二进制文件并尝试了 FDPIC 可执行文件。另一个死胡同。AFAIK:

  1. Linux 长期以来一直支持 ELF FDPIC,但 ARM 的 ABI 是相当新的。
  2. 似乎在这个时代,GCC 还没有启用 FDPIC 的标准方法。在某些架构上,您可以使用 -mfdpic。没有手臂,不知道为什么。我什至不知道主线 GCC 是否完全支持 ARM FDPIC。如果不存在,信息将极其稀缺。
  3. 似乎 crosstool-ng 1.24 在构建 ARM ELF FDPIC 支持时被破坏了。结果 gcc 没有 -mfdpic,并且 -fPIC 生成 ARM 可执行文件,而不是 ARM FDPIC。

任何见解将不胜感激。

小智 0

我们已成功在 Cortex-M3/4/7 机器上运行 Linux。我们正在使用 2 种工具链:

希望这可以帮助。