首页 > 解决方案 > 如何将 GCC 中的程序链接到预链接库?

问题描述

好的,我有问题,我不知道确切的术语,以便在谷歌上找到我要查找的内容。所以我希望这里有人可以帮助我。

在嵌入式设备上开发实时程序时,您可能需要迭代数百或数千次,直到获得所需的结果。当使用例如 ARM 设备时,您会很快耗尽内部闪存。因此,通常您开发程序以驻留在设备的 RAM 中,一切正常。这是使用 GCC 的功能将代码拆分为各个部分来完成的。

不幸的是,大多数设备的 RAM 比闪存小得多。因此,在某个时间点,您的程序变得太大而无法容纳所有变量等的 RAM。(您选择设备的大小,以便假设它稍后会适合闪存中的整个代码。)

经典共享对象不起作用,因为在我的环境中没有动态链接器。没有操作系统之类的。

我的想法如下:对于控制器来说,从 RAM 和闪存执行代码是没有问题的。当使用函数的正确属性进行编译时,编译器将部分程序放入 RAM 部分放入闪存也不是什么大问题。当我成功运行某些功能时,我会创建一个库并将其放入闪存中。主要开发是在 RAM 开发的“易失性”部分完成的。所以闪存被保留了。

这里的问题是:我需要确保,只要我不重新刷新,库总是链接到完全相同的位置。因此,对于每个编译周期,单个函数必须始终位于闪存中的相同地址。当闪存中的某些内容丢失时,必须将其放入 RAM 中,否则必须抛出一个衬里错误。

我考虑过建立一个真正的图书馆并与之链接。在这里我有点迷路了。我需要告诉 GCC/LD 链接到预链接文件(并创建这样的预链接文件)。

应该可以将所有库对象放在一起并在闪存中将它们链接在一起。然后可以提取地址,并且主程序(用于 RAM)可以链接到它。但是:如何执行这些步骤?

在互联网上有prelinklinux 的术语以及匹配的程序。这是为了加快加载时间。我不知道这个程序是否会作为副作用帮助我。我对此表示怀疑,但我不了解其工作的内部结构。

你知道如何达到目标吗?

标签: gcclinkercross-platformstatic-libraries

解决方案


你正在解决一个非问题。嵌入式闪存的最小写入周期通常为 10,000。所以即使你一天刷20次,也能用一年半。一个 St-Nucleo 是 13 美元。所以每天不到3便士:-)。典型的写入周期甚至更长,约为 100,000。你需要很长时间才能把它们穿出来。

现在,如果您将它们用于动态存储,这可能是一个问题,具体取决于使用模式。

但是要回答您的问题,您可以轻松地将代码构建到库 .a 文件中。但是,GCC 不保证它以任何顺序链接目标代码,因为它取决于优化级别。此外,仅拉入库文件中引用的函数,因此如果您的函数调用发生变化,它可能会拉入更多或更少的库函数。


推荐阅读