sanitizer_linux.h revision 06cbed8b8ae64b7ace50c1b4e4eed97a2a8b9965
1//===-- sanitizer_linux.h ---------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// Linux-specific syscall wrappers and classes. 11// 12//===----------------------------------------------------------------------===// 13#ifndef SANITIZER_LINUX_H 14#define SANITIZER_LINUX_H 15 16#include "sanitizer_platform.h" 17#if SANITIZER_LINUX 18#include "sanitizer_common.h" 19#include "sanitizer_internal_defs.h" 20#include "sanitizer_platform_limits_posix.h" 21 22struct link_map; // Opaque type returned by dlopen(). 23struct sigaltstack; 24 25namespace __sanitizer { 26// Dirent structure for getdents(). Note that this structure is different from 27// the one in <dirent.h>, which is used by readdir(). 28struct linux_dirent; 29 30// Syscall wrappers. 31uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count); 32uptr internal_prctl(int option, uptr arg2, uptr arg3, uptr arg4, uptr arg5); 33uptr internal_sigaltstack(const struct sigaltstack* ss, 34 struct sigaltstack* oss); 35uptr internal_sigaction(int signum, const __sanitizer_kernel_sigaction_t *act, 36 __sanitizer_kernel_sigaction_t *oldact); 37uptr internal_sigprocmask(int how, __sanitizer_kernel_sigset_t *set, 38 __sanitizer_kernel_sigset_t *oldset); 39void internal_sigfillset(__sanitizer_kernel_sigset_t *set); 40void internal_sigdelset(__sanitizer_kernel_sigset_t *set, int signum); 41 42#ifdef __x86_64__ 43uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg, 44 int *parent_tidptr, void *newtls, int *child_tidptr); 45#endif 46 47// This class reads thread IDs from /proc/<pid>/task using only syscalls. 48class ThreadLister { 49 public: 50 explicit ThreadLister(int pid); 51 ~ThreadLister(); 52 // GetNextTID returns -1 if the list of threads is exhausted, or if there has 53 // been an error. 54 int GetNextTID(); 55 void Reset(); 56 bool error(); 57 58 private: 59 bool GetDirectoryEntries(); 60 61 int pid_; 62 int descriptor_; 63 InternalScopedBuffer<char> buffer_; 64 bool error_; 65 struct linux_dirent* entry_; 66 int bytes_read_; 67}; 68 69void AdjustStackSizeLinux(void *attr); 70 71// Exposed for testing. 72uptr ThreadDescriptorSize(); 73uptr ThreadSelf(); 74uptr ThreadSelfOffset(); 75 76// Matches a library's file name against a base name (stripping path and version 77// information). 78bool LibraryNameIs(const char *full_name, const char *base_name); 79 80// Read the name of the current binary from /proc/self/exe. 81uptr ReadBinaryName(/*out*/char *buf, uptr buf_len); 82// Cache the value of /proc/self/exe. 83void CacheBinaryName(); 84 85// Call cb for each region mapped by map. 86void ForEachMappedRegion(link_map *map, void (*cb)(const void *, uptr)); 87} // namespace __sanitizer 88 89#endif // SANITIZER_LINUX 90#endif // SANITIZER_LINUX_H 91