diff options
author | Evgenii Stepanov <eugenis@google.com> | 2017-01-31 13:19:30 -0800 |
---|---|---|
committer | Evgenii Stepanov <eugenis@google.com> | 2017-02-02 14:44:46 -0800 |
commit | 68ecec1965dcec08c7df3f0224d69604c683cd6c (patch) | |
tree | 13d1842c2a6d22a8818f9d24d4f49273cfda5e3c /libdl | |
parent | 3c838bbb4aca12936aa3d8e96f3b04af3803d0f4 (diff) | |
download | android_bionic-68ecec1965dcec08c7df3f0224d69604c683cd6c.tar.gz android_bionic-68ecec1965dcec08c7df3f0224d69604c683cd6c.tar.bz2 android_bionic-68ecec1965dcec08c7df3f0224d69604c683cd6c.zip |
Fix CFI initialization crash on x86.
Third try.
Bug: 34752378
Test: bionic tests
Change-Id: I247c127489a8ee38404e104f28d916a704e35f36
Diffstat (limited to 'libdl')
-rw-r--r-- | libdl/libdl_cfi.cpp | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/libdl/libdl_cfi.cpp b/libdl/libdl_cfi.cpp index 362b093fa..8458564a8 100644 --- a/libdl/libdl_cfi.cpp +++ b/libdl/libdl_cfi.cpp @@ -29,10 +29,12 @@ static struct { char padding[PAGE_SIZE - sizeof(v)]; } shadow_base_storage alignas(PAGE_SIZE); +// __cfi_init is called by the loader as soon as the shadow is mapped. This may happen very early +// during startup, before libdl.so global constructors, and, on i386, even before __libc_sysinfo is +// initialized. This function should not do any system calls. extern "C" uintptr_t* __cfi_init(uintptr_t shadow_base) { shadow_base_storage.v = shadow_base; static_assert(sizeof(shadow_base_storage) == PAGE_SIZE, ""); - mprotect(&shadow_base_storage, PAGE_SIZE, PROT_READ); return &shadow_base_storage.v; } |