您好我试图编译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
感谢您阅读!
答案 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