13d4bba30STeresa Johnson //===-- memprof_linux.cpp ------------------------------------------------===// 23d4bba30STeresa Johnson // 33d4bba30STeresa Johnson // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43d4bba30STeresa Johnson // See https://llvm.org/LICENSE.txt for license information. 53d4bba30STeresa Johnson // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63d4bba30STeresa Johnson // 73d4bba30STeresa Johnson //===----------------------------------------------------------------------===// 83d4bba30STeresa Johnson // 93d4bba30STeresa Johnson // This file is a part of MemProfiler, a memory profiler. 103d4bba30STeresa Johnson // 113d4bba30STeresa Johnson // Linux-specific details. 123d4bba30STeresa Johnson //===----------------------------------------------------------------------===// 133d4bba30STeresa Johnson 143d4bba30STeresa Johnson #include "sanitizer_common/sanitizer_platform.h" 153d4bba30STeresa Johnson #if !SANITIZER_LINUX 163d4bba30STeresa Johnson #error Unsupported OS 173d4bba30STeresa Johnson #endif 183d4bba30STeresa Johnson 193d4bba30STeresa Johnson #include "memprof_interceptors.h" 203d4bba30STeresa Johnson #include "memprof_internal.h" 213d4bba30STeresa Johnson #include "memprof_thread.h" 223d4bba30STeresa Johnson #include "sanitizer_common/sanitizer_flags.h" 233d4bba30STeresa Johnson #include "sanitizer_common/sanitizer_freebsd.h" 243d4bba30STeresa Johnson #include "sanitizer_common/sanitizer_libc.h" 253d4bba30STeresa Johnson #include "sanitizer_common/sanitizer_procmaps.h" 263d4bba30STeresa Johnson 273d4bba30STeresa Johnson #include <dlfcn.h> 283d4bba30STeresa Johnson #include <fcntl.h> 293d4bba30STeresa Johnson #include <limits.h> 303d4bba30STeresa Johnson #include <link.h> 313d4bba30STeresa Johnson #include <pthread.h> 323d4bba30STeresa Johnson #include <stdio.h> 333d4bba30STeresa Johnson #include <sys/mman.h> 343d4bba30STeresa Johnson #include <sys/resource.h> 353d4bba30STeresa Johnson #include <sys/syscall.h> 363d4bba30STeresa Johnson #include <sys/time.h> 373d4bba30STeresa Johnson #include <sys/types.h> 383d4bba30STeresa Johnson #include <sys/ucontext.h> 393d4bba30STeresa Johnson #include <unistd.h> 403d4bba30STeresa Johnson #include <unwind.h> 413d4bba30STeresa Johnson 42*fde3ae88SFangrui Song extern ElfW(Dyn) _DYNAMIC[]; 43*fde3ae88SFangrui Song 443d4bba30STeresa Johnson typedef enum { 453d4bba30STeresa Johnson MEMPROF_RT_VERSION_UNDEFINED = 0, 463d4bba30STeresa Johnson MEMPROF_RT_VERSION_DYNAMIC, 473d4bba30STeresa Johnson MEMPROF_RT_VERSION_STATIC, 483d4bba30STeresa Johnson } memprof_rt_version_t; 493d4bba30STeresa Johnson 503d4bba30STeresa Johnson // FIXME: perhaps also store abi version here? 513d4bba30STeresa Johnson extern "C" { 523d4bba30STeresa Johnson SANITIZER_INTERFACE_ATTRIBUTE 533d4bba30STeresa Johnson memprof_rt_version_t __memprof_rt_version; 543d4bba30STeresa Johnson } 553d4bba30STeresa Johnson 563d4bba30STeresa Johnson namespace __memprof { 573d4bba30STeresa Johnson InitializePlatformInterceptors()583d4bba30STeresa Johnsonvoid InitializePlatformInterceptors() {} InitializePlatformExceptionHandlers()593d4bba30STeresa Johnsonvoid InitializePlatformExceptionHandlers() {} 603d4bba30STeresa Johnson MemprofDoesNotSupportStaticLinkage()613d4bba30STeresa Johnsonvoid *MemprofDoesNotSupportStaticLinkage() { 623d4bba30STeresa Johnson // This will fail to link with -static. 63*fde3ae88SFangrui Song return &_DYNAMIC; 643d4bba30STeresa Johnson } 653d4bba30STeresa Johnson FindDynamicShadowStart()663d4bba30STeresa Johnsonuptr FindDynamicShadowStart() { 673d4bba30STeresa Johnson uptr shadow_size_bytes = MemToShadowSize(kHighMemEnd); 683d4bba30STeresa Johnson return MapDynamicShadow(shadow_size_bytes, SHADOW_SCALE, 693d4bba30STeresa Johnson /*min_shadow_base_alignment*/ 0, kHighMemEnd); 703d4bba30STeresa Johnson } 713d4bba30STeresa Johnson MemprofDlSymNext(const char * sym)723d4bba30STeresa Johnsonvoid *MemprofDlSymNext(const char *sym) { return dlsym(RTLD_NEXT, sym); } 733d4bba30STeresa Johnson 743d4bba30STeresa Johnson } // namespace __memprof 75