Frage

Um zu sehen, welche Speicherkartenregionen ein ausgeführtes Programm enthält, schreibe ich ein einfaches C-Programm zum Lesen von Daten aus / proc / self / Karten:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

int main() {
    char buf[1024];
    int fd;
    ssize_t n;

    fd = open("/proc/self/maps", O_RDONLY);
    if (fd < 0) {
        perror("");
    }
    while ((n = read(fd, buf, 1000)) > 0) {
        buf[n] = 0;
        printf("%s", buf);
    }
    close(fd);

    return 0;
}

Die Ausgabe des Programms sieht wie folgt aus (gekennzeichnet):

1. 08048000-08049000 r-xp 00000000 08:01 2323014    /tmp/a.out
2. 08049000-0804a000 rw-p 00000000 08:01 2323014    /tmp/a.out
3. b7f69000-b7f6a000 rw-p b7f69000 00:00 0
4. b7f6a000-b80c6000 r-xp 00000000 08:01 1826975    /lib/tls/i686/cmov/libc-2.9.so
5. b80c6000-b80c7000 ---p 0015c000 08:01 1826975    /lib/tls/i686/cmov/libc-2.9.so
6. b80c7000-b80c9000 r--p 0015c000 08:01 1826975    /lib/tls/i686/cmov/libc-2.9.so
7. b80c9000-b80ca000 rw-p 0015e000 08:01 1826975    /lib/tls/i686/cmov/libc-2.9.so
8. b80ca000-b80cd000 rw-p b80ca000 00:00 0
9. b80dd000-b80df000 rw-p b80dd000 00:00 0
10.b80df000-b80e0000 r-xp b80df000 00:00 0          [vdso]
11.b80e0000-b80fc000 r-xp 00000000 08:01 1826830    /lib/ld-2.9.so
12.b80fc000-b80fd000 r--p 0001b000 08:01 1826830    /lib/ld-2.9.so
13.b80fd000-b80fe000 rw-p 0001c000 08:01 1826830    /lib/ld-2.9.so
14.bfee9000-bfefe000 rw-p bffeb000 00:00 0          [stack]

Da wir jeweils den Ausführungs Bit und beschreibbare Bit, wobei die ersten zwei Zeilen sind, die mit den Code- und Datensegmenten des Programms ableiten können.

Aber was mich verwirrt ist, dass der libc.so, gibt es für die Regionen, die von libc.so. abgebildet werden Einer von ihnen hat sogar nur private Bit, kann sie nicht geschrieben, gelesen oder ausgeführt werden. Und noch eine interessante Sache ist, dass ld.so nur drei Segmente hat. Im Vergleich zu libc.so Der Segmenten, die mit nur privaten Bit auf fehlt.

Also Ich mag würde wissen, was die vier Segmente sind eigentlich? Ich verwende Ubuntu SMP mit Kernel 2.6.28, gcc 3.4.6 und binutils 2.19.

War es hilfreich?

Lösung

Die r-xp, r--p und rw-p Zuordnungen sind nur Regionen, die unterschiedlichen Berechtigungen benötigen.

Das Geheimnis ---p Mapping ist eine Folge der virtuellen Speicher Offsets von Abschnitten von der ELF-Datei beschrieben nicht notwendigerweise die physikalischen Offsets innerhalb der Datei Matching (padding es sein kann, zur Ausrichtung Gründen).

d. die ELF-Datei selbst wie folgt aussehen könnte:

| .... sections .... | .... more sections .... |

... aber beschreiben ein Speicher-Layout, das aussieht wie folgt:

| .... sections .... |     gap     | .... more sections .... |

(Sie können dies mit objdump -h oder readelf -e sehen.)

Also, das allgemeine Prinzip ist, dass ld.so Bedürfnisse für alles genügend Speicher zuweisen:

|                                                            |

... dann macht eine Zuordnung für den ersten Teil:

| .... sections .... |                                       |

... und dann eine zweite Abbildung macht den zweiten Teil an der richtigen Stelle zu bekommen:

| .... sections .... |             | .... more sections .... |

Es schützt dann das „Loch“, die in der virtuellen Adressraum gelassen wird. Das ist das Geheimnis Mapping, dass Sie sehen:

| .... sections .... |XXXXXXXXXXXXX| .... more sections .... |

ich glaube, das Loch geschützt ist - und nicht für den Wiedereinsatz befreit - um die Dinge einfach hält: es wird sichergestellt, dass jede Bibliothek hat nur einen einzigen virtuellen Adressbereich, was zu ihr gehört und sonst niemand.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top