【发布时间】:2018-11-25 19:51:32
【问题描述】:
好的,我有问题,我不知道准确的术语,以便在 google 上找到我要查找的内容。所以我希望这里有人可以帮助我。
在嵌入式设备上开发实时程序时,您可能需要迭代数百或数千次,直到获得所需的结果。当使用例如ARM 设备会很快耗尽内部闪存。因此,通常您开发程序以驻留在设备的 RAM 中,一切正常。这是使用 GCC 的功能将代码拆分为各个部分来完成的。
不幸的是,大多数设备的 RAM 都比闪存小得多。因此,在某个时间点,您的程序变得太大而无法容纳所有变量等的 RAM。(您选择设备的大小,以便假设它稍后会适合闪存中的整个代码。)
经典共享对象不起作用,因为在我的环境中没有动态链接器。没有操作系统之类的。
我的想法如下:对于控制器来说,从 RAM 和闪存执行代码是没有问题的。当使用函数的正确属性进行编译时,编译器将部分程序放入 RAM 部分放入闪存也不是什么大问题。 当我成功运行某些功能时,我会创建一个库并将其放入闪存中。主要开发是在 RAM 开发的“易失性”部分完成的。所以闪存被保留了。
这里的问题是:我需要确保,只要我不重新刷新,库总是链接到完全相同的位置。因此,对于每个编译周期,单个函数必须始终位于闪存中的相同地址。当闪存中的某些内容丢失时,必须将其放入 RAM 中,否则必须引发衬里错误。
我考虑过建立一个真正的库并与之链接。在这里我有点迷路了。我需要告诉 GCC/LD 链接到预链接文件(并创建这样的预链接文件)。
应该可以将所有库对象放在一起并在闪存中将它们链接在一起。然后可以提取地址,并且主程序(用于 RAM)可以链接到它。但是:如何执行这些步骤?
在互联网上有术语prelink 以及适用于linux 的匹配程序。这是为了加快加载时间。我不知道这个程序是否会作为副作用帮助我。我对此表示怀疑,但我不了解其工作的内部原理。
你知道如何实现目标吗?
【问题讨论】:
标签: gcc linker cross-platform static-libraries