sanitizer_linux.h revision 5f4984db88b7b67539f62d7653b928aeadf91b16
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, int verbosity);
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