2017-02-16 3 views
1

Kann ein Prozess lesen/proc/self/exe mit mmap? Dieses Programm schlägt fehl, die Datei mmap:kann/proc/self/exe mmap'ed sein?

$ 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

Mögliche Duplikate von [Ungültiges Argument für Lese-Schreib-mmap?] (Http://stackoverflow.com/questions/18420473/invalid-argument-for-read-write-mmap) – usr

+0

Sie können die gleiche Datei zuordnen, wenn Sie Mach es beim Programmstart, indem du 'main()' s 'argv [0]' mappst, was der Programmdateiname ist. –

+0

@LuisColorado, argv [0] ist manchmal der Name der Programmdatei, es sei denn, es wurde in $ PATH –

Antwort

1

Sie machen zwei Fehler hier:

  • Mapped Größe> sein muss 0. Null-size-Zuordnungen sind ungültig.
  • Sie müssen angeben, ob Sie ein gemeinsames (MAP_SHARED) oder ein privates (MAP_PRIVATE) Mapping erstellen möchten.

Die folgende Beschreibung ist beispielsweise arbeiten:

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

Wenn Sie das vollständige ausführbare abzubilden möchten, müssen Sie zunächst ein stat() auf es zu tun haben, die richtige Dateigröße abrufen und verwenden Sie dann, dass als zweiter Parameter zu mmap().

+0

, die es behoben: char * p = mmap (NULL, 1, PROT_READ, MAP_PRIVATE, f, 0); –

+0

@JackAndrews Ja, aber dies wird nur die allererste Seite (normalerweise 4096 Bytes) der ausführbaren Datei zuordnen. Ist das genug für Ihre Bedürfnisse? – Ctx

+0

genug, um mich mit dem Lesen von ELF zu beginnen ... wird die Datei stattieren, um die Länge zu erhalten und an mmap zu übergeben –