假设我有一个const全局变量,因此它是只读的,将放在.rodata部分中.我正在使用-o3优化来编译代码.这将使编译器(即GCC)在读取变量时根据变量本身的值生成不同的代码.例如,如果变量被定义为适合ISA指令立即字段的零或足够小的值,则它将使用单个指令.如果它很大,它可能会使用几条指令.我希望生成的代码是相同的,独立于值.我try 将其声明为volatile const
,这似乎很有效,因为它总是生成读取该值的加载指令,但GCC似乎忽略了const字段,并将其放在.Data部分中.另外,我试着申报了__attribute__((section(".rodata")) volatile
.这导致了警告"警告:为.rodata设置不正确的节属性".
为了不陷入"XY问题",我还想说,我的主要目标是让这段代码生成一个尽可能相同的最终二进制文件(即,相同地址、相同大小的节),独立于这些常量变量的值,这些常量变量来自编译时生成的宏.另外,我希望这些常量值位于只读数据部分,以便它们在页表中被标记为RO,并且在运行时不会被 destruct .
对如何实现我的目标有什么建议吗?