aboutsummaryrefslogtreecommitdiffstats
path: root/libdl
diff options
context:
space:
mode:
authorEvgenii Stepanov <eugenis@google.com>2017-01-27 13:42:03 -0800
committerEvgenii Stepanov <eugenis@google.com>2017-01-30 14:29:48 -0800
commitbe46d3871c91902504e5ec4c7f575c86f647aafc (patch)
treed202c0a4817459b1f6d5b971284b9afa2a9f795d /libdl
parent6a9e0c8f15dee1b1b7c5cd7f8e058c2b18683bbc (diff)
downloadandroid_bionic-be46d3871c91902504e5ec4c7f575c86f647aafc.tar.gz
android_bionic-be46d3871c91902504e5ec4c7f575c86f647aafc.tar.bz2
android_bionic-be46d3871c91902504e5ec4c7f575c86f647aafc.zip
Fix CFI initialization crash on x86.
Bug: 34752378 Test: bionic tests Change-Id: If8e33f76a1a2d83356d818fed506ea624f579860
Diffstat (limited to 'libdl')
-rw-r--r--libdl/libdl_cfi.cpp4
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;
}