1
我有一个初始化两个全局静态变量代码示例(此问题被调查的早期question启发):一个是指向外部变量,另一
#include <stdint.h>
#define UNCACHE_MASK 0xABCDEF12UL // Value of the mask to apply
extern int memory_area;
const void * virtual_address = &memory_area;
const uintptr_t int_address = ((uintptr_t)&memory_area) | UNCACHE_MASK;
我编译时得到如下:
$ gcc -c test.c
test.c:6:1: error: initializer element is not computable at load time
const uintptr_t int_address = ((uintptr_t)&memory_area) | UNCACHE_MASK;
^
我没有太多的专家是一个expressioon从该指针计算在C中,但似乎如果&memory area
有利于初始化virtual_address
,它应该也适合于初始化int_address
。
我错过了什么?
(gcc版本4.8.2,Cygwin的在Win 7)
如果ASLR处于活动状态,则需要动态初始化,可能这就是原因。 – Deduplicator 2014-10-02 13:38:57
@Deduplicator我能理解你吗? ASLR可以更新存储在静态存储器中的地址的确切值,但不能更新从这些值派生的常量? – Arkadiy 2014-10-02 14:19:32
@Arkadiy:派生常量,当然,但是在需要全面运行时初始化之前有多复杂? – Deduplicator 2014-10-02 14:21:29