forked from OSchip/llvm-project
64 lines
2.0 KiB
C++
64 lines
2.0 KiB
C++
//===-- 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
|