【问题标题】:GCC no reorder stack variablesGCC 没有重新排序堆栈变量
【发布时间】:2018-09-01 02:46:19
【问题描述】:

您好,我正在尝试编译 C 代码而不重新排序堆栈中的变量,但无法做到。

我尝试过使用:

__attribute__((no_reorder))

但是不行,还尝试用flag编译:

-fno-toplevel-reorder

但是没有用...所以我被卡住了。

实际代码:

uint8_t __attribute__((no_reorder)) first_buf[64];
uint8_t second_buf[32];

这是我的编译器版本:

gcc (Debian 7.2.0-19) 7.2.0

感谢您的阅读!

【问题讨论】:

  • 一种解决方法是将这些变量放在一个结构中。结构字段顺序被保留。
  • 我从来没有使用过这个属性,但是你怎么能告诉一个变量不要重新排序呢?似乎您必须将该属性应用于一组变量,甚至可能是一个函数.. ?
  • @Jean-FrançoisFabre 是的,这将是我最后的机会!
  • @yano 基本上 gcc 在 second_buf 之后移动了 first_buf 所以是的,应该可以说只是不要移动我这个变量另一个选项就像你说的那样只是在函数声明中将属性添加到整个过程,但也没有用

标签: c gcc stack


【解决方案1】:

来自此处的 gcc 文档:

https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html

no_reorder

不要对标记为 no_reorder 彼此之间 的函数或变量或顶级汇编器语句重新排序可执行文件。这 程序中的实际顺序将取决于链接器命令行。 像这样标记的静态变量也不会被删除。这有一个 与 -fno-toplevel-reorder 选项类似的效果,但仅适用 到标记的符号。

(强调我的)

因此,您似乎需要将该属性应用于您希望保留的相应顺序的变量。仅将属性应用于单个变量将仅保留该变量与其ef的顺序,这没有任何效果。

【讨论】:

    【解决方案2】:

    -fno-stack-protector 会做到的。它将取消堆栈金丝雀和堆栈上缓冲区的重新排序。

    在编译时添加该标志。即

    gcc myprogram.c -fno-stack-protector
    

    【讨论】:

      猜你喜欢
      • 2016-01-06
      • 2011-02-15
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      相关资源
      最近更新 更多