【问题标题】:Add variables in specific section during link time在链接时在特定部分添加变量
【发布时间】:2018-09-05 13:35:02
【问题描述】:

考虑以下情况:

  • 变量 X 和 Y 是库的一部分,我们称之为 lib.o。我们无法对库的相应源代码进行适配(例如添加pragma)
  • X 必须链接到除 Y 之外的另一个部分,两者当前都在同一部分中定义

链接器是否可以(通常)将库中的各个变量链接到特定的(可能是新的)部分?

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

【问题讨论】:

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

标签: linker embedded


【解决方案1】:

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

SECTIONS {
custom_sec : { . = ALIGN(4); //custom_object.o //custom_object.o (.data) //custom_object.o (.bss) } }

请查阅链接器手册。通常这个特性存在于大多数链接器中。

【讨论】:

    猜你喜欢
    • 2017-08-16
    • 2017-11-23
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    相关资源
    最近更新 更多