2017-02-16 27 views
1

可以使用mmap讀取/ proc/self/exe進程嗎?此程序無法的mmap文件:can/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

您在這裏做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 –