GCC没有重新排序堆栈变量

时间:2018-03-22 15:23:29

标签: c gcc stack

您好我试图编译C代码而不在堆栈中重新排序我的变量但是不能这样做。

我尝试过使用:

  

__attribute__((no_reorder))

但是没有工作,也尝试使用标志进行编译:

  

-fno-顶层-重排序

但是没有工作......所以我被困了。

实际代码:

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

这是我的编译器版本:

gcc (Debian 7.2.0-19) 7.2.0

感谢您阅读!

2 个答案:

答案 0 :(得分:1)

来自gcc文档:

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

  

no_reorder

     

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

(强调我的)

因此,您似乎需要将该属性应用于您想要保留的相应顺序的变量。仅将属性应用于单个变量只会使用itsef保留该变量的顺序,这无效。

答案 1 :(得分:0)

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

在编译时添加该标志。即

gcc myprogram.c -fno-stack-protector