1*d89ec533Spatrick //===-- memprof_linux.cpp ------------------------------------------------===// 2*d89ec533Spatrick // 3*d89ec533Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*d89ec533Spatrick // See https://llvm.org/LICENSE.txt for license information. 5*d89ec533Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*d89ec533Spatrick // 7*d89ec533Spatrick //===----------------------------------------------------------------------===// 8*d89ec533Spatrick // 9*d89ec533Spatrick // This file is a part of MemProfiler, a memory profiler. 10*d89ec533Spatrick // 11*d89ec533Spatrick // Linux-specific details. 12*d89ec533Spatrick //===----------------------------------------------------------------------===// 13*d89ec533Spatrick 14*d89ec533Spatrick #include "sanitizer_common/sanitizer_platform.h" 15*d89ec533Spatrick #if !SANITIZER_LINUX 16*d89ec533Spatrick #error Unsupported OS 17*d89ec533Spatrick #endif 18*d89ec533Spatrick 19*d89ec533Spatrick #include "memprof_interceptors.h" 20*d89ec533Spatrick #include "memprof_internal.h" 21*d89ec533Spatrick #include "memprof_thread.h" 22*d89ec533Spatrick #include "sanitizer_common/sanitizer_flags.h" 23*d89ec533Spatrick #include "sanitizer_common/sanitizer_freebsd.h" 24*d89ec533Spatrick #include "sanitizer_common/sanitizer_libc.h" 25*d89ec533Spatrick #include "sanitizer_common/sanitizer_procmaps.h" 26*d89ec533Spatrick 27*d89ec533Spatrick #include <dlfcn.h> 28*d89ec533Spatrick #include <fcntl.h> 29*d89ec533Spatrick #include <limits.h> 30*d89ec533Spatrick #include <link.h> 31*d89ec533Spatrick #include <pthread.h> 32*d89ec533Spatrick #include <stdio.h> 33*d89ec533Spatrick #include <sys/mman.h> 34*d89ec533Spatrick #include <sys/resource.h> 35*d89ec533Spatrick #include <sys/syscall.h> 36*d89ec533Spatrick #include <sys/time.h> 37*d89ec533Spatrick #include <sys/types.h> 38*d89ec533Spatrick #include <sys/ucontext.h> 39*d89ec533Spatrick #include <unistd.h> 40*d89ec533Spatrick #include <unwind.h> 41*d89ec533Spatrick 42*d89ec533Spatrick extern ElfW(Dyn) _DYNAMIC[]; 43*d89ec533Spatrick 44*d89ec533Spatrick typedef enum { 45*d89ec533Spatrick MEMPROF_RT_VERSION_UNDEFINED = 0, 46*d89ec533Spatrick MEMPROF_RT_VERSION_DYNAMIC, 47*d89ec533Spatrick MEMPROF_RT_VERSION_STATIC, 48*d89ec533Spatrick } memprof_rt_version_t; 49*d89ec533Spatrick 50*d89ec533Spatrick // FIXME: perhaps also store abi version here? 51*d89ec533Spatrick extern "C" { 52*d89ec533Spatrick SANITIZER_INTERFACE_ATTRIBUTE 53*d89ec533Spatrick memprof_rt_version_t __memprof_rt_version; 54*d89ec533Spatrick } 55*d89ec533Spatrick 56*d89ec533Spatrick namespace __memprof { 57*d89ec533Spatrick InitializePlatformInterceptors()58*d89ec533Spatrickvoid InitializePlatformInterceptors() {} InitializePlatformExceptionHandlers()59*d89ec533Spatrickvoid InitializePlatformExceptionHandlers() {} 60*d89ec533Spatrick MemprofDoesNotSupportStaticLinkage()61*d89ec533Spatrickvoid *MemprofDoesNotSupportStaticLinkage() { 62*d89ec533Spatrick // This will fail to link with -static. 63*d89ec533Spatrick return &_DYNAMIC; 64*d89ec533Spatrick } 65*d89ec533Spatrick FindDynamicShadowStart()66*d89ec533Spatrickuptr FindDynamicShadowStart() { 67*d89ec533Spatrick uptr shadow_size_bytes = MemToShadowSize(kHighMemEnd); 68*d89ec533Spatrick return MapDynamicShadow(shadow_size_bytes, SHADOW_SCALE, 69*d89ec533Spatrick /*min_shadow_base_alignment*/ 0, kHighMemEnd); 70*d89ec533Spatrick } 71*d89ec533Spatrick MemprofDlSymNext(const char * sym)72*d89ec533Spatrickvoid *MemprofDlSymNext(const char *sym) { return dlsym(RTLD_NEXT, sym); } 73*d89ec533Spatrick 74*d89ec533Spatrick } // namespace __memprof 75