From be46d3871c91902504e5ec4c7f575c86f647aafc Mon Sep 17 00:00:00 2001 From: Evgenii Stepanov Date: Fri, 27 Jan 2017 13:42:03 -0800 Subject: Fix CFI initialization crash on x86. Bug: 34752378 Test: bionic tests Change-Id: If8e33f76a1a2d83356d818fed506ea624f579860 --- libdl/libdl_cfi.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'libdl') 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; } -- cgit v1.2.3