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