On Wed, Feb 13, 2013 at 3:59 PM, Jakub Jelinek <ja...@redhat.com> wrote:
> On Wed, Feb 13, 2013 at 11:32:00AM +0100, Jakub Jelinek wrote:
>> On Wed, Feb 13, 2013 at 02:28:25PM +0400, Konstantin Serebryany wrote:
>> > Right. In LLVM we test only with ASAN_FLEXIBLE_MAPPING_AND_OFFSET==1,
>> > so this came unnoticed.
>> > Fixed in r175049.
>> ...
>>
>> This is ok, thanks.
>
> Unfortunately, it seems everything fails with that change :( on Linux.
> The problem is that the default prelink library range for x86_64 is
> 0x3000000000LL to 0x4000000000LL, and that unfortunately overlaps

Forgive my ignorance, what is the  default prelink library range?

> with the 0x7fff8000LL to 0x10007fff8000LL range that asan wants to use
> for the shadow mapping.  And the reason for that prelink default range is
> that earlier (see e.g.
> http://lwn.net/Articles/106177/
> ) Linux on x86_64 used much smaller virtual address space than it does now.
> Not sure if there are still systems running pre-2.6.9 kernels or whenever the 
> PML4
> change made it into Linux kernel on x86-64 and whether people use prelink on
> them.  But in any case, even if I change the prelink range now (perhaps
> conditionally on the size of address space detected by prelink), it will
> still cause issues.
>
> So, either we need to revert that i386.c and asan_mapping.h (SHADOW_OFFSET)
> change, or support non-contiguous shadow memory for the Linux x86-64 case.

I suggest to either revert or (better) to support flexible mapping and
revert the offset only in the gcc compiler module
(leaving asan-rt unchanged).

non-contiguous shadow memory sounds too scary and costly to support,
not worth the benefit.

> What could work is if we had:
>
> 0x000000000000  -       0x00007fff8000  low memory
> 0x00007fff8000  -       0x00008fff7000  shadow mem for low memory
> 0x00008fff7000  -       0x00067fff8000  protected
> 0x00067fff8000  -       0x00087fff8000  shadow mem for mid memory
> 0x00087fff8000  -       0x003000000000  protected
> 0x003000000000  -       0x004000000000  mid memory
> 0x004000000000  -       0x02008fff7000  protected
> 0x02008fff7000  -       0x10007fff8000  shadow mem for high memory
> 0x10007fff8000  -       0x7fffffffffff  high memory
>
> asan_mapping.h then would need to introduce AddrIsInMidMem and
> AddrIsInMidShadow inlines (perhaps defined to false for configurations
> that don't need 3 part memory), use those in AddrIsInMem
> and AddrIsInShadow, tweak AddrIsInShadowGap (as it has now more gaps)
> for this configuration and tweak the mapping code.
>
>         Jakub

Reply via email to