正常にコンパイルされ、クラッシュしないこのプログラムはどうですか。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/mman.h>
extern char __executable_start;
extern char __etext;
int
main (int argc, char **argv)
{
int pagesize = sysconf (_SC_PAGE_SIZE);
char *start =
(char *) (((uintptr_t) & __executable_start) & ~(pagesize - 1));
char *end =
(char *) (((uintptr_t) & __etext + pagesize - 1) & ~(pagesize - 1));
mprotect (start, end - start, PROT_READ | PROT_WRITE | PROT_EXEC);
printf ("Hello world\n");
void *m = main;
*((char *) m) = 0;
exit (0);
}
私は と を使用__executable_start
しまし__etext
たが、少なくともマニュアルページに記載されているこれらを機能させることができるかどうかを確認する方が良いかもしれません:
名前
`etext`, `edata`, `end` - end of program segments
あらすじ
extern etext;
extern edata;
extern end;
説明
The addresses of these symbols indicate the end of various program segments:
`etext` This is the first address past the end of the text segment (the program
code).
`edata` This is the first address past the end of the initialized data segment.
`end` This is the first address past the end of the uninitialized data
segment (also known as the BSS segment).
準拠
Although these symbols have long been provided on most UNIX systems, they are
not standardized; use with caution.