Linker 在链接期间在特定部分添加变量

Linker 在链接期间在特定部分添加变量,linker,embedded,Linker,Embedded,考虑以下情况: 变量X和Y是库的一部分,我们称之为lib.o。我们无法修改库的相应源代码(例如,添加pragmas) X必须链接到Y以外的另一个节,这两个节当前都在同一节中定义 链接器是否可能(通常)将库中的单个变量链接到特定(可能是新的)部分 这个问题背后的原因是库有一个缓冲区溢出错误(memclr with to small buffer(变量X))并覆盖变量Y。临时解决方法(直到库被卖方修复)是将变量X链接到一个部分并留下一些空间,这样memclr就不会伤害重要的变量 如果编译器是GC

考虑以下情况:

  • 变量X和Y是库的一部分,我们称之为lib.o。我们无法修改库的相应源代码(例如,添加pragmas)
  • X必须链接到Y以外的另一个节,这两个节当前都在同一节中定义
链接器是否可能(通常)将库中的单个变量链接到特定(可能是新的)部分


这个问题背后的原因是库有一个缓冲区溢出错误(memclr with to small buffer(变量X))并覆盖变量Y。临时解决方法(直到库被卖方修复)是将变量X链接到一个部分并留下一些空间,这样memclr就不会伤害重要的变量

如果编译器是GCC,并且, 您可以访问链接器脚本,实际上可以将整个对象(或其中的特定部分)强制到特定区域,如下所示:


部分
{
自定义密码: { .=对齐(4); //自定义对象 //自定义_object.o(.data) //自定义_object.o(.bss) } }


请参阅链接器手册。大多数链接器中通常都有此功能。

大多数编译器都有pragma或属性,可以将变量放入不同的段中。(对我们来说)一个更大的问题是你为什么要这么做?你试图通过这样做来解决的实际问题是什么?请阅读。@Someprogrammerdude:谢谢你的评论,我将编辑我的帖子,并在问题背后添加理由。据我所知,pragma(或属性)主要由编译器解释,而不是由链接器解释。这在这里是不可能的,因为库已经编译,因此,不可能添加杂注或类似的内容。编译器设置的部分是它创建的目标文件的一部分,并且根据链接器的不同,它可能会将这些部分接受并传递给最终的可执行文件。否则,节属性/pragma将一文不值。“节”是什么意思?为什么要这样做?编译器正在请求将变量放入指定的节中,但链接器需要创建此节,并且您指示它在链接器脚本中这样做。