Skip to content
Advertisement

can /proc/self/exe be mmap’ed?

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().

User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement