将二进制文件与内存中特定位置的函数/数据相关联

时间:2015-07-28 12:51:49

标签: gcc linker embedded ld avr-gcc

我目前正在为ATMega编写中间内存引导加载程序。

我想将一部分常用功能和数据放在内存中的特定位置,以便:

  • 无法克服引导加载程序部分的有限大小
  • 库函数,驱动程序等不会被应用程序部分复制,从而浪费空间

为了便于说明,所需内存布局的映射如下: Memory layout

this thread关于avrfreaks的一些帮助之后,我已经能够移动所有代码了(在我的bootloader +库开发环境中 - 应用程序将在单独开发项目)未通过自定义链接描述文件成功标记__attribute__ ((section(".boot")))到共享库部分。

在avrfreaks线程中建议我可以使用avr-objcopy --strip-all --keep-symbol=fred --keep-symbol=greg ... boot.elf dummy.elf链接我的应用程序来创建我在共享库中的符号引用,然后将我的应用程序与此内存布局链接{{1 }}

我在这里遇到的问题是我需要指定我想留在我的dumy.elf中的每个符号。我可以使用avr-gcc -o app.elf -Wl,--just-symbols=dummy.elf app1.o app2.o ...指令来指定要保留的符号的文本文件列表,但我仍然必须生成此列表。

我注意到有很多符号我想要包含(像C环境设置代码这样的东西在名称上很常见,但不同在功能上,对于引导加载程序和应用程序而言,似乎以前缀' _'开头。 (但是,当然,有一些有用的大型库函数具有相同的前缀,例如* printf和math例程)。如果我将应用程序与应用程序/引导程序中的现有运行时代码链接,可能会出现冲突?

如何为我的库部分生成一个符号列表,其中包含我编写的代码(可能是一些sed magic和扫描头文件)/排除了在链接应用程序时可能会发生冲突的符号?

可以在this github repository的当前状态查看项目。

编辑:我想明确表示我可以使用keep-symbols=<file>标记我想要在共享库部分中的所有内容,但是我还想分享一些相当大的libc内容引导程序和应用程序之间的(vsprintf等),这很快就变得很麻烦。因此,我选择通过链接描述文件将未标记为引导的所有内容放入库内存区域

也许我只需要my linker script的一些建议,因为我不能确定我在那里做什么。

1 个答案:

答案 0 :(得分:0)

考虑使用-R <file>作为链接器选项(gcc -Wl,-R -Wl,<file>)。

这将在<file>中生成对(全局)符号的引用,就像它们正常链接一样,但不包括引用的代码。