#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/mman.h>
#define _GNU_SOURCE
#include <dlfcn.h>
typedef void* (*hook_mmap)(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
typedef void* (*hook_munmap)(void *addr, size_t length);
void* fun(void *ptr){
while(1){
}
}
void *__GI___mmap64(void *addr, size_t length, int prot, int flags,
int fd, off_t offset){
static hook_mmap pmmap = NULL;
if(pmmap == NULL){
pmmap = (hook_mmap)dlsym(RTLD_NEXT, "__GI___mmap64");
}
static char buffer[128] = {0};
void *caller_addr = __builtin_return_address(0);
void *ptr = pmmap(addr, length, prot, flags, fd, offset);
int ret = sprintf(buffer, "%p: __mmap:%p,%ld\n", caller_addr, ptr, length);
write(1, buffer, ret);
write(fd, buffer, ret);
fsync(fd);
return ptr;
}
void* __wrap___mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) {
printf("拦截__mmap调用! size=%zu\n", length);
// 调用原始__mmap函数
static hook_mmap pmmap = NULL;
if(pmmap == NULL){
pmmap = (hook_mmap)dlsym(RTLD_NEXT, "mmap64");
}
static char buffer[128] = {0};
void *caller_addr = __builtin_return_address(0);
void *ptr = pmmap(addr, length, prot, flags, fd, offset);
int ret = sprintf(buffer, "%p: __mmap:%p,%ld\n", caller_addr, ptr, length);
write(1, buffer, ret);
write(fd, buffer, ret);
fsync(fd);
printf("分配地址: %p\n", ptr);
return ptr;
}
int main(){
void *paddr = malloc(10);
printf("Allocated memory at %p\n", paddr);
pthread_t tid = 0;
pthread_create(&tid, NULL, fun, NULL);
void *ptr = mmap(NULL, 1024, 0, 0, -1, 0);
while(1){
}
free(paddr);
return 0;
}
gcc memtest.c -o memtest -Wl,--wrap=__mmap