【问题标题】:Splitting an ELF executable into two files in an embedded system在嵌入式系统中将 ELF 可执行文件拆分为两个文件
【发布时间】:2010-08-03 08:50:38
【问题描述】:

我在 Virtex4 FPGA 中使用 Xilinx Microblaze CPU 内核。我想在我当前的代码中添加一个新的代码部分,但是我的代码将超过它被烧到的闪存的大小。因此我想将添加的代码烧录到另一个闪存。

我的代码由引导加载程序复制到 RAM,然后跳转到 RAM 并开始定期执行。我打算以相同的方式从第二个闪存复制新代码,与从已使用的闪存复制的代码相邻(在 RAM 中)。

为此,我实际上需要两个单独的 elf 可执行文件,一个用于每个烧录的闪存,并在它们之间精确分离,定义每个文件中驻留的例程。应该启用跨文件的例行调用。

我的问题:如何生成这些单独的 elf 文件,每个文件中都有精确的例程规范?有没有办法将一个可执行文件拆分为两个单独的文件?或者是否有另一种解决方案可以生成单独的可执行/库文件作为嵌入式系统中单个链接的输出?

谢谢, 伊夏

【问题讨论】:

  • 你的内存比你的闪存大吗?

标签: embedded linker fpga


【解决方案1】:

如果您可以在 RAM 中重新组合二进制文件,那么链接到单个二进制文件然后拆分生成的文件应该是非常好的。您必须保证引导加载程序函数包含在主半部分中。最简单的方法是创建一个独立的引导加载程序二进制文件。

您可以使用splitdd 之类的实用程序在将二进制文件复制到闪存之前对其进行分割。

【讨论】:

    【解决方案2】:
    1. 假设您已经完成了显而易见的操作并运行“strip”以生成没有调试符号的二进制副本。调试信息对实际目标没有用。

    2. 如果您剥离的二进制文件仍然比您的闪存大,您可以使用S-RECORD tools 来拆分该二进制文件。除了分割文件之外,它还有更多的选项,比如添加校验和、CRC,以及支持很多文件格式。

    如果您的 RAM 大到足以容纳所有程序,则没有特别需要制作单独的 ELF 文件/DLL。只需将您的程序构建为一个在 RAM 地址空间中运行的大型单体程序,然后让您的引导加载程序将部分程序从 Flash 加载到 RAM。

    【讨论】:

      【解决方案3】:

      如果您可以使用动态库,您可以将可执行文件中的一些代码分解为一个,然后在每个闪存区域中简单地放置一个文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-24
        • 2017-03-25
        • 1970-01-01
        • 2011-02-23
        • 2014-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多