2017-02-16 2 views
1

프로세스가 mmap을 사용하여/proc/self/exe를 읽을 수 있습니까? 현재이 실수를하고 있습니다/proc/self/exe는 mmap 될 수 있습니까?

$ 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

:

  • 매핑 크기는> 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로 읽는 데 충분하다 ... 파일을 stat로 가져 와서 길이를 얻고 mmap에 전달한다. –