00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <google/malloc_hook.h>
00034 #include "base/basictypes.h"
00035
00036 MallocHook::NewHook MallocHook::new_hook_ = NULL;
00037 MallocHook::DeleteHook MallocHook::delete_hook_ = NULL;
00038 MallocHook::MmapHook MallocHook::mmap_hook_ = NULL;
00039 MallocHook::MunmapHook MallocHook::munmap_hook_ = NULL;
00040
00041 #if 0
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 #if defined(__linux) && (defined(__i386__) || defined(__x86_64__))
00052 #include <unistd.h>
00053 #include <syscall.h>
00054 #include <sys/mman.h>
00055 #include <errno.h>
00056
00057
00058
00059
00060 # if defined(__i386__)
00061
00062 extern "C" void* mmap64(void *start, size_t length,
00063 int prot, int flags,
00064 int fd, __off64_t offset) __THROW {
00065
00066 void *result;
00067
00068
00069 static bool have_mmap2 = true;
00070 if (have_mmap2) {
00071 static int pagesize = 0;
00072 if (!pagesize) pagesize = getpagesize();
00073
00074
00075 if (offset & (pagesize - 1)) {
00076 result = MAP_FAILED;
00077 errno = EINVAL;
00078 goto out;
00079 }
00080
00081 result = (void *)syscall(SYS_mmap2,
00082 start, length, prot, flags, fd, offset / pagesize);
00083 if (result != MAP_FAILED || errno != ENOSYS) goto out;
00084
00085
00086 have_mmap2 = false;
00087 }
00088
00089 if (((off_t)offset) != offset) {
00090
00091
00092 result = MAP_FAILED;
00093 errno = EINVAL;
00094 goto out;
00095 }
00096
00097 {
00098
00099
00100 int32 args[6] = { (int32) start, length, prot, flags, fd, (off_t) offset };
00101 result = (void *)syscall(SYS_mmap, args);
00102 }
00103 out:
00104 MallocHook::InvokeMmapHook(result, start, length, prot, flags, fd, offset);
00105 return result;
00106
00107 }
00108
00109
00110
00111 # elif defined(__x86_64__)
00112
00113 extern "C" void* mmap64(void *start, size_t length,
00114 int prot, int flags,
00115 int fd, __off64_t offset) __THROW {
00116
00117 void *result;
00118 result = (void *)syscall(SYS_mmap, start, length, prot, flags, fd, offset);
00119 MallocHook::InvokeMmapHook(result, start, length, prot, flags, fd, offset);
00120 return result;
00121 }
00122
00123 # endif
00124
00125 extern "C" void* mmap(void *start, size_t length,
00126 int prot, int flags,
00127 int fd, off_t offset) __THROW {
00128 return mmap64(start, length, prot, flags, fd,
00129 static_cast<size_t>(offset));
00130 }
00131
00132 extern "C" int munmap(void* start, size_t length) __THROW {
00133 MallocHook::InvokeMunmapHook(start, length);
00134 return syscall(SYS_munmap, start, length);
00135 }
00136
00137 #endif
00138 #endif