【问题标题】:Assembler warning with gcc warning when placing data in .text将数据放入 .text 时带有 gcc 警告的汇编程序警告
【发布时间】:2019-10-18 17:04:22
【问题描述】:

当我编译时

__attribute__((section(".text"))) const int x = 42;
int main(){ return x; }

使用 gcc(与 tinycc 和 clang 一起使用),我得到了

Warning: ignoring changed section attributes for .text.

警告的原因是什么?如何在仍将(始终只读)数据保留在.text 中的同时消除警告?

【问题讨论】:

  • 显然 gcc 发出了一个.section .text,"a",@progbits 指令,而不仅仅是.section .text。我看不出有什么办法可以避免。
  • Google the error message 总是一个好主意
  • 这个问题的一个更好的答案可能是-“然后使用clang”。我可以想到几个不喜欢clang而不是gcc的理由。

标签: c gcc assembly


【解决方案1】:

显然:

__attribute__((section(".text#"))) const int x = 42;

参考:https://gcc.gnu.org/ml/gcc-help/2010-09/msg00088.html 回答者解释的地方:

__attribute__ ((section(".text"))) 将使 gcc 发出 ,"aw",@progbits.text 之后更改部分属性。 如果你使用:__attribute__ ((section(".text#")))(注意额外的 '#') 这个后缀会在汇编和警告中被注释 会消失

在这种情况下,所涉及的变量不是const,因此对同一问题特别不明智(如another responder 所述)。在您的情况下,它是 const,因此访问权限是 "a" 而不是 "aw" - 但是可能仍然不明智。

【讨论】:

  • 不是我的。同一线程中的另一位响应者确实给出了更明智的建议:gcc.gnu.org/ml/gcc-help/2010-09/msg00098.html
  • 是的,这里 OP 已经有 const 了。我会假设意图是数据对代码的局部性(可能与拆分 D/I L1 缓存无关,但会影响 L2、L3 的使用)不仅仅是一个错误的 hack 代替 const 使数据只读.
  • 是的,我不对这些信息的任何使用负责!我只是在谷歌上为他搜索了它-代表我就是一个馅饼!
【解决方案2】:

显然 gcc 发出一个.section .text,"a",@progbits 指令,而不仅仅是.section .text。我看不出有什么办法可以避免。然而,默认链接器脚本通常会合并所有名为 .text.* 的部分,因此您可以执行类似 __attribute__((section(".text.consts"))) 的操作,并且在最终的二进制文件中它将位于 .text 部分中。

@Clifford 找到了a hackish workaround,这涉及在节名后放置#,以便汇编程序将行的其余部分视为注释。

【讨论】:

  • 我认为它会在 单独组装它们之后合并它们,所以这将改变最终输出顺序(将 const 移离它们的功能)
  • 这是真的,但不是问题中的要求:)
  • 对。但是,如果 OP 试图将常量放在 .text 中,最可能的合理原因是代码的局部性。
  • @Clifford:不要!这是一个经典的版本,并且有点幸运,因为 gcc 从未提供过它的首选替代方案。
  • @R.. 文字常量不会这样做吗? #define x 42。不漂亮,也不知道类型,但在 C 中很传统。
猜你喜欢
  • 2015-02-12
  • 2022-06-21
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多