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 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. 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