2017-02-16 16 views
1

Может ли процесс читать/proc/self/exe с помощью mmap? Эта программа не MMAP файла:can/proc/self/exe be mmap'ed?

$ 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 +++ 
+1

Возможный дубликат [Недопустимый аргумент для чтения-записи mmap?] (Http://stackoverflow.com/questions/18420473/invalid-argument-for-read-write-mmap) – usr

+0

Вы можете отобразить тот же файл, если вы сделайте это при запуске программы, указав 'main()' '' 'argv [0]', что является именем файла программы. –

+0

@LuisColorado, argv [0] иногда является именем файла программы, если он не найден в $ PATH –

ответ

1

Вы делаете 2 ошибки здесь:

  • Подключенные размер должен быть> 0 отображения нулевого размера является недействительным.
  • Вы должны указать, если вы хотите создать общий (MAP_SHARED) или приватный (MAP_PRIVATE).

Следующие должны работать, например:

char *p = mmap(NULL, 4096, PROT_READ, MAP_SHARED, f, 0); 

Если вы хотите, чтобы отобразить полный исполняемый файл, вы должны будете сделать stat() на него первым, чтобы получить правильный размер файла, а затем использовать это как второй параметр - mmap().

+0

, который исправил его: char * p = mmap (NULL, 1, PROT_READ, MAP_PRIVATE, f, 0); –

+0

@JackAndrews Да, но это будет отображать только самую первую страницу (обычно 4096 байт) исполняемого файла. Этого достаточно для ваших нужд? – Ctx

+0

достаточно, чтобы я начал читать ELF ... будет ставить файл, чтобы получить длину и перейти к mmap –