0

我想构建一个可重定位的库(即,除了局部变量之外什么都没有。我还想强制库的位置位于内存中的固定位置。我认为这必须在 makefile 中完成,但我我很困惑我必须做什么才能强制将库加载到固定位置。这是使用 mb-gcc。

我需要这个的原因是我想编写一个加载程序,我不想破坏实际上正在复制另一个程序的代码。因此,我希望正在执行复制的程序位于未使用的位置(即 ddr)的其他位置。

如果我将所有的函数都编译到库中,我需要什么特殊的 makefile 参数来强制将其加载到例如位置 0x80000000。

任何帮助将不胜感激。提前致谢。

4

1 回答 1

0

您编写一个链接器脚本-T script.ld,并通过使用选项(togcc和/或ld,取决于您构建固件文件的方式)告诉编译器/链接器使用它。

在您的库 C 源文件中,您可以使用__attribute__((section ("name")))语法将您的函数变量放入特定的部分。然后,链接描述文件可以决定将每个部分放在哪里——对于这些类型的设备,通常放在一个固定地址。(您会经常看到类似#define FIRMWARE __attribute__((section(".text.firmware")))或类似的宏声明,以使代码更易于阅读和理解。)

如果您仅为您的库创建一个单独的固件文件,那么您不需要将属性添加到您的代码中,只需编写链接描述文件来放置.text(可执行代码)、.rodata(只读常量)和.bss(未初始化的变量) ) 部分在合适的地址。

网络搜索可以microblaze "linker script"找到一些有用的示例,甚至更多指南。其中一些必须适合您的工具。

于 2016-11-24T19:32:49.207 回答