summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2013-05-29 12:11:43 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2013-05-29 12:11:43 +0000
commit112e5ba281a082147470355b9e47a978aabb19c2 (patch)
treee77a69b0dd026fbc89d0dd283369a613421a0c69
parentdbd3bbe126c791a59c6f86b471871add324e604d (diff)
downloadbcm5719-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
-rw-r--r--compiler-rt/lib/sanitizer_common/CMakeLists.txt1
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_linux.cc3
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_linux.h5
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h2
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_linux.cc63
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_linux_libcdep.cc40
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
OpenPOWER on IntegriCloud