diff options
author | Thurston Dang <thurston@google.com> | 2025-03-20 08:02:48 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-20 08:02:48 -0700 |
commit | 3b3f8c50b646600dc1846c7d3d018fdb39fbfe0b (patch) | |
tree | 898909f8a864b10a4b0c984d83d88028df94af82 /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | fdeb2ff30407afbfc3596aaf417a2a91cdff20c9 (diff) | |
download | llvm-3b3f8c50b646600dc1846c7d3d018fdb39fbfe0b.zip llvm-3b3f8c50b646600dc1846c7d3d018fdb39fbfe0b.tar.gz llvm-3b3f8c50b646600dc1846c7d3d018fdb39fbfe0b.tar.bz2 |
[asan] Re-exec without ASLR if needed on 32-bit Linux (#131975)
High-entropy ASLR allows up to 16-bits of entropy (2**16 4KB pages ==
256MB; a bit more in practice because of implementation details), which
is a significant chunk of the user address space on 32-bit systems (4GB
or less). This, combined with ASan's shadow (512MB) and ASan's fixed
shadow offset (512MB), makes it possible for large binaries to fail to
map the shadow.
This patch changes ASan to do a one-time re-exec without ASLR if it
cannot map the shadow, thus reclaiming the ~256MB of address space.
Alternatives considered:
1) We don't lower ASan's fixed shadow offset, because that would limit
non-PIE binaries.
2) We don't switch to a dynamic shadow offset, because ASan for 32-bit
Linux relies on the compile-time constant offset to optimize its
instrumentation and compiler-rt.
This is loosely inspired by
https://github.com/llvm/llvm-project/pull/78351,
https://github.com/llvm/llvm-project/pull/85142, and
https://github.com/llvm/llvm-project/pull/85674, though those were
required because there were no static shadow mappings that could fully
shadow the range of user mappings; this is not the case for ASan.
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
0 files changed, 0 insertions, 0 deletions