微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将两个 C 程序编译为一个二进制文件,第二个应该从特定的偏移量开始

如何解决将两个 C 程序编译为一个二进制文件,第二个应该从特定的偏移量开始

我正在尝试编译两个不同的 C 程序以在我的嵌入式设备上闪烁。 第一个程序必须检查一个条件,如果它有效,它必须跳转到第二个程序,如果条件无效,它必须继续执行。 我想将两个程序一起编译成一个二进制文件,第二个程序应该在二进制文件中的特定位置。我知道编译的第一个程序大小是 3251B,因此我希望将第二个程序放在二进制文件开头 4KB 的地址处。

你知道我是怎么做到的吗?我正在使用 makefile 在 Linux 上工作。

解决方法

如果这些是真正独立的程序——即两者都有一个 main() 入口点,那么它们显然不能在链接器生成的单个二进制文件中。但是,您可以使用诸如 srec_cat 之类的工具将不同地址空间中的两个单独链接的程序合并为一个图像文件。这最好使用包含地址信息的格式,例如 Intel Hex(否则对于原始二进制文件,您需要在两个图像之间进行填充,并告诉程序员起始地址):

srec_cat -Output combined.hex -Intel program1.hex -Intel program2.hex -Intel

srec_cat 能够组合多种格式,并且可以为不包含位置信息的输入指定地址偏移量。

如果您的工具链未生成可重定位的可执行文件,则您无法在任何特定偏移量处任意定位程序。通常,您会指定链接器的内存映射,并在不同的内存空间中构建两个单独的程序。这样您就可以简单地将它们与 srec_cat 结合起来,如所述。

您应该知道,单独链接的每个可执行文件都有自己的运行时启动代码、向量表和硬件初始化。任意切换程序并不总是那么简单。例如,硬件初始化可以假设硬件处于复位状态,但前面的程序使之不真实。在启动第二个程序之前,你至少需要关闭中断,否则如果在第二个应用程序建立向量表之前发生中断,第一个程序的中断处理程序将错误运行。

一个更简单的解决方案是不要有两个单独的程序,而是在一个程序中包含两个功能。但是,如果第一个程序是引导加载程序,然后第二个程序可以单独分发,那么您可能确实希望这样做只是为了有一个用于生产的加载文件(尽管这绝不是必要的 - 例如,您可以分别编写两个十六进制文件).

你仍然会遇到program1知道program2的起始地址的问题。这很少与图像的起始地址相同。那是向量表所在的架构。对于 ARM-Cortex-M,向量表的开头包括初始堆栈指针地址和该起始地址,因此相对容易,例如:How to jump between programs in Stellaris

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。