如何将GCC中的程序链接到预链接库?

时间:2018-11-25 19:51:32

标签: gcc linker cross-platform static-libraries

好的,我有问题,我不知道确切的术语才能在Google上找到所需的内容。所以我希望这里有人可以帮助我。

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

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

经典共享对象不起作用,因为在我的环境中没有什么比动态链接器更好。没有任何操作系统。

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

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

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

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

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

您有一个好主意如何实现目标吗?

1 个答案:

答案 0 :(得分:0)

您正在解决一个非问题。嵌入式闪存的最小写入周期通常为10,000。因此,即使您每天将其闪烁20次,也可以持续一年半。 St-Nucleo是$ 13。每天不到3便士:-)。典型的写周期甚至更长,大约为100,000。要花很长时间才能使它们磨损。

现在,如果您将它们用于动态存储,则可能要担心,这取决于使用模式。

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