Can a process read /proc/self/exe using mmap? This program fails to mmap the file:
$ cat e.c #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> int main() { int f=open("/proc/self/exe",O_RDONLY); char*p=mmap(NULL,0,PROT_READ,0,f,0); return 0; } $ cc e.c -o e $ strace ./e [snip] open("/proc/self/exe", O_RDONLY) = 3 mmap(NULL, 0, PROT_READ, MAP_FILE, 3, 0) = -1 EINVAL (Invalid argument) exit_group(0) = ? +++ exited with 0 +++
Advertisement
Answer
You are making 2 mistakes here:
- Mapped size must be > 0. Zero-size mappings are invalid.
- You have to specify, if you want to create a shared (
MAP_SHARED
) or a private (MAP_PRIVATE
) mapping.
The following should work for example:
char *p = mmap(NULL, 4096, PROT_READ, MAP_SHARED, f, 0);
If you wish to map the full executable, you will have to do a stat()
on it first, to retrieve the correct file size and then use that as the second parameter to mmap()
.