代码之家  ›  专栏  ›  技术社区  ›  David X

如何使gcc只生成可以直接加载到内存并执行的机器代码?

  •  16
  • David X  · 技术社区  · 15 年前

    我想生成一个可以加载到内存中的文件(例如 mmap )然后跳转到内存的开头来运行代码。

    理想情况下,我希望可以选择使代码可重定位(这可能是低效的),或者指定一个代码希望加载的显式地址(这是一个难题),但这两种方法都可以自己正常工作。

    2 回复  |  直到 11 年前
        1
  •  16
  •   Greg Hewgill    15 年前

    您可以这样做,但您需要检查对象文件格式。特别是 objcopy 命令可以将可执行文件转换为“平面”二进制文件(取决于目标平台)。也许是这样的:

    gcc -o test test.c
    objcopy -O binary test test.bin
    

    看到了吗 man objcopy 在你的平台上了解更多细节。

        2
  •  8
  •   RBerteig Keith Adler    15 年前

    你想知道公用事业吗 objcopy ,通常与GCC一起提供。它是 binutils 工具包,其中最明显的成员是链接器, ld .

    这个过程就是编译源文件并像往常一样链接它们。这将为您提供一个elf(或另一个可重定位的平台相关二进制文件)格式的完成的可执行文件。然后使用objcopy将可执行文件转换为平面二进制图像。

    这对于准备从ROM运行的代码非常有用,在ROM中,您需要确保为目标平台使用合适的C运行时库,并且可能需要自定义链接器脚本文件以及提供自己的C运行时启动代码。

    不管您的目标是什么,您都需要控制链接器,以便将二进制文件定位到一个已知的地址。为此,您需要创建一个链接器脚本。脚本语言的文档位于 the binutils manual . 您将主要对“.text*”部分感兴趣,如果您计划初始化任何全局变量,则可能对“.rodata*”部分感兴趣。实际上,安排初始化是留给读者的一个练习。

    总的来说,这只是冰山一角。我建议花点时间研究交叉编译器构建,看看这些东西在实践中是如何使用的。AVR和MSP430社区使用GCC,有积极的参与,廉价的(甚至常常是开源的)硬件开始。