Hi,

On Wed, 17 Aug 2011, Jed Davis wrote:

> One thing I'm not so sure about is accepting any SYMBOLIC_CONST as a
> legitimate address.  That allows, for example, a symbol address cast
> to uintptr_t and added to (6ULL << 32), which will never fit.  On the
> other hand, -fPIC allows offsets of up to +/- 16Mib for some unexplained
> reason,

The x86-64 ABI specifies this.  All symbols have to be located between 0x0 
and 2^31-2^24-1, and that is so that everything in memory objects of 
length less than 2^24 can be addressed directly.  Otherwise only the base 
address of symbols would be addressable directly and any offsetted variant 
would have to be calculated explicitely.  If it weren't for this 
provision, given this code:

global char arr[4096];
char f () { return arr[2]; }

the load couldn't use arr+2 directly as that possibly might not fit into 
32 bit anymore.  Similar things are true for the small PIC models 
including your new one.  That is, as long as symbols are always at most 
2^31-2^24-1 away from all ends of referring instructions you can happily 
accept offsets between +-2^24.


Ciao,
Michael.

Reply via email to