Building the same manner (tools etc) for RH7 and BSD10
* Works fine on linux
* BSD10.3 crashes first time something tries to access what looks like
the ShadowMemory
* g++ is a cross build (target bsd10, host rh7)
o I had to specifically configure -enable-libsanitizer (so maybe its
generally not supported?)
o currently have to keep using g++ not clang/llvm here for a variety of
reasons
BSD10 - Looks like the initialization is done before the access in question
==75072==AddressSanitizer: failed to intercept 'fgetpwent_r'
==75072==AddressSanitizer: failed to intercept 'fgetgrent_r'
==75072==AddressSanitizer: failed to intercept 'backtrace'
==75072==AddressSanitizer: failed to intercept 'backtrace_symbols'
==75072==AddressSanitizer: failed to intercept '__getdelim'
==75072==AddressSanitizer: libc interceptors initialized
|| `[0x500000000000, 0x7fffffffffff]` || HighMem ||
|| `[0x4a0000000000, 0x4fffffffffff]` || HighShadow ||
|| `[0x480000000000, 0x49ffffffffff]` || ShadowGap ||
|| `[0x400000000000, 0x47ffffffffff]` || LowShadow ||
|| `[0x000000000000, 0x3fffffffffff]` || LowMem ||
MemToShadow(shadow): 0x480000000000 0x48ffffffffff 0x494000000000 0x49ffffffffff
redzone=16
max_redzone=2048
quarantine_size_mb=256M
malloc_context_size=30
SHADOW_SCALE: 3
SHADOW_GRANULARITY: 8
SHADOW_OFFSET: 0x400000000000
==75072==Installed the sigaction for signal 11
==75072==Installed the sigaction for signal 10
==75072==Installed the sigaction for signal 8
==75072==T0: stack [0x7fffdffff000,0x7ffffffff000) size 0x20000000;
local=0x7fffffffd9fc
==75072==AddressSanitizer Init done
But the code to access the shadow memory all looks like
0x0000000000449412 <+98>: movl $0xf1f1f1f1,0x7fff8000(%r12)
0x000000000044941e <+110>: movl $0xf4f40000,0x7fff8004(%r12)
0x000000000044942a <+122>: movl $0xf2f2f2f2,0x7fff8008(%r12)
0x0000000000449436 <+134>: movl $0xf4f40000,0x7fff800c(%r12)
(of course in linux the Shadow memory is located @ 0x7fff8000)
* And I can see that from its initialization verbosity (SHADOW_OFFSET:
0x7fff8000)
I would think the code above would have been (for BSD)
0x0000000000449412 <+98>: movl $0xf1f1f1f1, 0x400000000000 (%r12)
So trying to understand a bit as to how the shadow memory is used (seems fixed
in asan_mapping.h)
And gcc for i386.c has this (which does see it would always pick 0x7fff8000)
static unsigned HOST_WIDE_INT
ix86_asan_shadow_offset (void)
{
return TARGET_LP64 ? (TARGET_MACHO ? (HOST_WIDE_INT_1 << 44)
: HOST_WIDE_INT_C (0x7fff8000))
: (HOST_WIDE_INT_1 << 29);
}
So how for bsd would it pick up the shadow offset of 0x400000000000 when
compiling the code?
I'm missing something.
But of course it's crashing on any access slightly above 0x7fff8000(%reg) since
its not the right region ...
Seems like somewhere there needs to be a freebsd_asan_shadow_offset()??
Disclaimer:
This communication (including any attachments) is intended for the use of the
intended recipient(s) only and may contain information that is considered
confidential, proprietary, sensitive and/or otherwise legally protected. Any
unauthorized use or dissemination of this communication is strictly prohibited.
If you have received this communication in error, please immediately notify the
sender by return e-mail message and delete all copies of the original
communication. Thank you for your cooperation.