标签:
malloc_readonly.h
#ifndef _MALLOC_READONLY_H_ #define _MALLOC_READONLY_H_ const void * malloc_readonly(const void * copy_from, unsigned size); #endif
malloc_readonly.c
#include "malloc_readonly.h"
#include <unistd.h>
#include <malloc.h>
#include <string.h>
#include <sys/mman.h>
const void * malloc_readonly(const void * copy_from, unsigned size)
{
if(size == 0) {
return NULL;
}
int page_size = sysconf(_SC_PAGE_SIZE);
if(page_size == -1) {
return NULL;
}
unsigned new_size = (size + (page_size - 1)) / page_size * page_size;
void * buf = memalign(page_size, new_size);
if(buf == NULL) {
return NULL;
}
(void)memcpy(buf, copy_from, size);
(void)mprotect(buf, new_size, PROT_READ);
return buf;
}
demo.c
#include "malloc_readonly.h"
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
static void catch_sig(int sig, siginfo_t * si, void * unused)
{
printf("Got SIG%d @ %p\n", sig, si->si_addr);
exit(1);
}
int main(void)
{
struct sigaction sa;
sa.sa_flags = SA_SIGINFO;
sigemptyset(&sa.sa_mask);
sa.sa_sigaction = catch_sig;
sigaction(SIGSEGV, &sa, NULL);
char * c = (char *)malloc_readonly("123456", 6);
c[0] = 0;
free(c);
return 0;
}
标签:
原文地址:http://my.oschina.net/2bit/blog/389016