diff options
| author | Peter Collingbourne <peter@pcc.me.uk> | 2013-05-29 12:11:43 +0000 |
|---|---|---|
| committer | Peter Collingbourne <peter@pcc.me.uk> | 2013-05-29 12:11:43 +0000 |
| commit | 112e5ba281a082147470355b9e47a978aabb19c2 (patch) | |
| tree | e77a69b0dd026fbc89d0dd283369a613421a0c69 | |
| parent | dbd3bbe126c791a59c6f86b471871add324e604d (diff) | |
| download | bcm5719-llvm-112e5ba281a082147470355b9e47a978aabb19c2.tar.gz bcm5719-llvm-112e5ba281a082147470355b9e47a978aabb19c2.zip | |
[nolibc] Unweak SymbolizerPrepareForSandboxing and move it to libc-independent part.
Fixes the Go build.
Differential Revision: http://llvm-reviews.chandlerc.com/D877
llvm-svn: 182851
6 files changed, 72 insertions, 42 deletions
diff --git a/compiler-rt/lib/sanitizer_common/CMakeLists.txt b/compiler-rt/lib/sanitizer_common/CMakeLists.txt index b8f8742f45d..ab7932da18d 100644 --- a/compiler-rt/lib/sanitizer_common/CMakeLists.txt +++ b/compiler-rt/lib/sanitizer_common/CMakeLists.txt @@ -14,6 +14,7 @@ set(SANITIZER_SOURCES sanitizer_stackdepot.cc sanitizer_stacktrace.cc sanitizer_symbolizer_itanium.cc + sanitizer_symbolizer_linux.cc sanitizer_symbolizer_mac.cc sanitizer_symbolizer_win.cc sanitizer_thread_registry.cc diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc index bcf6ad13806..6e234e5f1e1 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc @@ -307,8 +307,7 @@ void PrepareForSandboxing() { // cached mappings. MemoryMappingLayout::CacheMemoryMappings(); // Same for /proc/self/exe in the symbolizer. - if (&SymbolizerPrepareForSandboxing) - SymbolizerPrepareForSandboxing(); + SymbolizerPrepareForSandboxing(); } // ----------------- sanitizer_procmaps.h diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.h b/compiler-rt/lib/sanitizer_common/sanitizer_linux.h index ba68e6c2dd5..b879083ae68 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.h @@ -60,6 +60,11 @@ uptr ThreadDescriptorSize(); // information). bool LibraryNameIs(const char *full_name, const char *base_name); +static const uptr kMaxPathLength = 512; + +// Read the name of the current binary from /proc/self/exe. +uptr ReadBinaryName(/*out*/char *buf, uptr buf_len); + } // namespace __sanitizer #endif // SANITIZER_LINUX_H diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h index 20bc775ff19..b6471db6a68 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h @@ -114,7 +114,7 @@ typedef bool (*string_predicate_t)(const char *); uptr GetListOfModules(LoadedModule *modules, uptr max_modules, string_predicate_t filter); -void SymbolizerPrepareForSandboxing() SANITIZER_WEAK_ATTRIBUTE; +void SymbolizerPrepareForSandboxing(); } // namespace __sanitizer diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_linux.cc b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_linux.cc new file mode 100644 index 00000000000..50f6da755e1 --- /dev/null +++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_linux.cc @@ -0,0 +1,63 @@ +//===-- sanitizer_symbolizer_linux.cc -------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file is shared between AddressSanitizer and ThreadSanitizer +// run-time libraries. +// Linux-specific implementation of symbolizer parts. +//===----------------------------------------------------------------------===// + +#include "sanitizer_platform.h" +#if SANITIZER_LINUX +#include "sanitizer_common.h" +#include "sanitizer_linux.h" + +namespace __sanitizer { + +#if SANITIZER_ANDROID +void SymbolizerPrepareForSandboxing() { + // Do nothing on Android. +} +#else +static char proc_self_exe_cache_str[kMaxPathLength]; +static uptr proc_self_exe_cache_len = 0; + +uptr ReadBinaryName(/*out*/char *buf, uptr buf_len) { + uptr module_name_len = internal_readlink( + "/proc/self/exe", buf, buf_len); + int readlink_error; + if (internal_iserror(buf_len, &readlink_error)) { + if (proc_self_exe_cache_len) { + // If available, use the cached module name. + CHECK_LE(proc_self_exe_cache_len, buf_len); + internal_strncpy(buf, proc_self_exe_cache_str, buf_len); + module_name_len = internal_strlen(proc_self_exe_cache_str); + } else { + // We can't read /proc/self/exe for some reason, assume the name of the + // binary is unknown. + Report("WARNING: readlink(\"/proc/self/exe\") failed with errno %d, " + "some stack frames may not be symbolized\n", readlink_error); + module_name_len = internal_snprintf(buf, buf_len, "/proc/self/exe"); + } + CHECK_LT(module_name_len, buf_len); + buf[module_name_len] = '\0'; + } + return module_name_len; +} + +void SymbolizerPrepareForSandboxing() { + if (!proc_self_exe_cache_len) { + proc_self_exe_cache_len = + ReadBinaryName(proc_self_exe_cache_str, kMaxPathLength); + } +} +#endif // SANITIZER_ANDROID + +} // namespace __sanitizer + +#endif // SANITIZER_LINUX diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_linux_libcdep.cc b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_linux_libcdep.cc index 82ce50e0aac..60937cd1272 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_linux_libcdep.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_linux_libcdep.cc @@ -17,6 +17,7 @@ #include "sanitizer_common.h" #include "sanitizer_internal_defs.h" #include "sanitizer_libc.h" +#include "sanitizer_linux.h" #include "sanitizer_placement_new.h" #include "sanitizer_symbolizer.h" @@ -131,10 +132,6 @@ uptr GetListOfModules(LoadedModule *modules, uptr max_modules, string_predicate_t filter) { return 0; } - -void SymbolizerPrepareForSandboxing() { - // Do nothing on Android. -} #else // SANITIZER_ANDROID typedef ElfW(Phdr) Elf_Phdr; @@ -146,34 +143,6 @@ struct DlIteratePhdrData { string_predicate_t filter; }; -static const uptr kMaxPathLength = 512; - -static char proc_self_exe_cache_str[kMaxPathLength]; -static uptr proc_self_exe_cache_len = 0; - -static uptr ReadBinaryName(/*out*/char *buf, uptr buf_len) { - uptr module_name_len = internal_readlink( - "/proc/self/exe", buf, buf_len); - int readlink_error; - if (internal_iserror(buf_len, &readlink_error)) { - if (proc_self_exe_cache_len) { - // If available, use the cached module name. - CHECK_LE(proc_self_exe_cache_len, buf_len); - internal_strncpy(buf, proc_self_exe_cache_str, buf_len); - module_name_len = internal_strlen(proc_self_exe_cache_str); - } else { - // We can't read /proc/self/exe for some reason, assume the name of the - // binary is unknown. - Report("WARNING: readlink(\"/proc/self/exe\") failed with errno %d, " - "some stack frames may not be symbolized\n", readlink_error); - module_name_len = internal_snprintf(buf, buf_len, "/proc/self/exe"); - } - CHECK_LT(module_name_len, buf_len); - buf[module_name_len] = '\0'; - } - return module_name_len; -} - static int dl_iterate_phdr_cb(dl_phdr_info *info, size_t size, void *arg) { DlIteratePhdrData *data = (DlIteratePhdrData*)arg; if (data->current_n == data->max_n) @@ -213,13 +182,6 @@ uptr GetListOfModules(LoadedModule *modules, uptr max_modules, dl_iterate_phdr(dl_iterate_phdr_cb, &data); return data.current_n; } - -void SymbolizerPrepareForSandboxing() { - if (!proc_self_exe_cache_len) { - proc_self_exe_cache_len = - ReadBinaryName(proc_self_exe_cache_str, kMaxPathLength); - } -} #endif // SANITIZER_ANDROID } // namespace __sanitizer |

