我想构建一个可重定位的库(即除了局部变量之外的任何东西。我还想强制库的位置在内存中的固定位置。我认为这必须在makefile中完成,但我很困惑,我必须做什么来强制在一个固定的位置加载库。这是使用mb-gcc。
我需要这个的原因是我想写一个加载器,我不想破坏实际上正在执行其他程序副本的代码。所以我希望正在进行复制的程序位于其他位置未使用的位置(即ddr)。
如果我拥有编译到库中的所有函数,那么我需要使用哪些特殊的makefile参数来强制将其加载到0x80000000位置。
非常感谢任何帮助。提前谢谢。
答案 0 :(得分:0)
您编写linker script,并使用-T script.ld
选项(gcc
和/或ld
告诉编译器/链接器使用它,具体取决于您的方式构建固件文件。)
在您的库C源文件中,您可以使用__attribute__((section ("name")))
语法将functions和variables放入特定的部分。然后,链接描述文件可以决定将每个部分放在何处 - 通常位于这些类型设备的固定地址。 (您经常会看到像#define FIRMWARE __attribute__((section(".text.firmware")))
或类似的宏声明,以使代码更易于阅读和理解。)
如果您只为库创建单独的固件文件,则无需将属性添加到代码中,只需编写链接描述文件以放置.text
(可执行代码),{{1 (适用的常量)和.rodata
(未初始化的变量)部分在适当的地址。
.bss
的网络搜索会找到一些有用的示例,甚至还有更多指南。其中一些必须适合您的工具。