【发布时间】:2018-09-05 13:35:02
【问题描述】:
考虑以下情况:
- 变量 X 和 Y 是库的一部分,我们称之为 lib.o。我们无法对库的相应源代码进行适配(例如添加pragma)
- X 必须链接到除 Y 之外的另一个部分,两者当前都在同一部分中定义
链接器是否可以(通常)将库中的各个变量链接到特定的(可能是新的)部分?
这个问题背后的原因是库有一个缓冲区溢出错误(memclr 带有小缓冲区(变量 X))并覆盖变量 Y。临时解决方法(直到库由卖方修复)是将变量 X 链接到一个部分并留下一些空间,因此 memclr 不会损害重要的变量。
【问题讨论】:
-
大多数编译器都有 pragmas 或 attributes 可以将变量放在不同的段中。一个更大的问题(对我们来说)是为什么你想这样做?您尝试通过这样做来解决的实际问题是什么?请阅读about the XY problem。
-
@Someprogrammerdude:感谢您的评论,我将编辑我的帖子并添加问题背后的原因。据我所知,编译指示(或属性)主要由编译器解释,而不是由链接器解释。这是不可能的,因为库已经编译,因此无法添加编译指示或类似的东西
-
编译器设置的部分是它创建的目标文件的一部分,并且取决于链接器,它可能会尊重这些并将它们传递给最终的可执行文件。否则,部分属性/编译指示将一文不值。
-
“部分”是什么意思,为什么要这样做?
-
编译器请求将变量放入指定节,但链接器需要创建此节,您在链接器脚本中指示它这样做。