Ich kann die Adresse des Endes des Heap mit sbrk(0)
erhalten, aber gibt es eine Möglichkeit, programmgesteuert die Adresse des Beginns des Heap zu erhalten, außer durch das Parsen der Inhalt von /proc/self/maps
?Wie programmgesteuert die Adresse des Heap unter Linux
Antwort
Ich glaube, Parsing /proc/self/maps
ist die einzige zuverlässige Möglichkeit auf dem Linux, das Heap-Segment zu finden. Und vergessen Sie nicht, dass einige Zuweiser (einschließlich einer in meinem SLES) für große Blöcke mmap()
verwenden, so dass der Speicher nicht mehr Teil des Heaps ist und an jedem zufälligen Ort sein kann.
Sonst fügt ld
normalerweise ein Symbol hinzu, das das Ende aller Segmente in elf kennzeichnet, und das Symbol heißt _end
. Z.B .:
extern void *_end;
printf("%p\n", &_end);
Es stimmt mit dem Ende des .bss
, traditionell das letzte Segment der Elf. Nach der Adresse folgt normalerweise mit einiger Ausrichtung der Heap. Stack (s) und mmap() s (einschließlich der gemeinsam genutzten Bibliotheken) befinden sich an den höheren Adressen des Adressraums.
Ich bin mir nicht sicher, wie tragbar es ist, aber anscheinend funktioniert es genauso auf Solaris 10. Unter HP-UX 11 sieht die Karte anders aus und der Heap scheint mit dem Datensegment zusammengeführt zu werden _end
. Unter AIX zeigt procmap
kein Heap/Datensegment, aber auch Zuweisungen erhalten die Adressen nach dem _end
Symbol. So scheint es im Moment ziemlich tragbar zu sein.
Obwohl alle in Betracht gezogen, ich bin mir nicht sicher, wie nützlich das ist.
P.S. Das Testprogramm:
#include <stdio.h>
#include <stdlib.h>
char *ppp1 = "hello world";
char ppp0[] = "hello world";
extern void *_end; /* any type would do, only its address is important */
int main()
{
void *p = calloc(10000,1);
printf("end:%p heap:%p rodata:%p data:%p\n", &_end, p, ppp1, ppp0);
sleep(10000); /* sleep to give chance to look at the process memory map */
return 0;
}
Nun, wenn keine Möglichkeit gefunden wird, die Startadresse des Heaps zu finden, wie wird malloc implementiert, das versucht, den Heap in kleinere Speicherblöcke aufzuteilen? – Jun
Beachten Sie, dass dies in einem System mit randomisierten Offsets fehlschlagen kann. Es kann aktiviert werden, aber linux fuzzes standardmäßig, wo der Heap "startet", so dass es schwieriger ist, es von außerhalb des Rechners zu finden (verhindert Pufferüberlauf-Angriffe). – jwarner112
@Jun, libc ruft 'sbrk (0)' auf, um die Adresse des Beginns des Heaps zu finden. Aber das funktioniert nur für die libc: Es wird sehr früh beim Start der Anwendung aufgerufen, vor dem 'main()', und somit ist das Ende des Heapspeichers gleich dem Anfang des Heapspeichers. Innerhalb der 'main()' ist es nicht mehr wahr. – Dummy00001
- 1. Bildschirmhintergrund unter Linux programmgesteuert ändern
- 2. Wie bekomme ich die IPv6-Adresse einer Schnittstelle unter linux
- 3. Wie die Größe des Heap zu begrenzen?
- 4. Get IP-Adresse einer Schnittstelle unter Linux
- 5. bekomme die physikalische Adresse eines Puffers unter Linux
- 6. Position des Standardmenüeintrags unter Linux
- 7. Wie kann ich PowerPoint-Präsentationen programmgesteuert erstellen? Unter Linux. Kostenlos.
- 8. Wie öffnet man die bevorzugte Mailanwendung des Benutzers unter Linux?
- 9. Wie Java-Heap-Größe programmgesteuert zu erhöhen
- 10. C - Ändern der Basisadresse des Stacks Adresse
- 11. Fehlerprotokoll des Befehls make unter Linux
- 12. Wie programmgesteuert die Auflösung eines Fensters und das des Systems in Linux erhalten?
- 13. Wie kann ich Heap-Korruptionsfehler unter Windows diagnostizieren?
- 14. Verzeichnis des laufenden Programms unter Linux?
- 15. IP-Adresse des PC von Android-Gerät programmgesteuert
- 16. CellStyle teilen die gleiche Heap-Adresse Apache POI
- 17. ARM-Entwicklung unter Linux
- 18. Buddy Allocation Algorithm - Beginn Heap Adresse
- 19. Adresse Stack und Heap in C++
- 20. Ungültige Heap-Adresse und fatales Signal 11
- 21. Pseudozufälliger Stapelzeiger unter Linux?
- 22. Wie erhalte ich die IP-Adresse des lokalen Netzwerks eines Computers programmgesteuert? (C#)
- 23. Wie Hardware-MAC-Adresse unter Windows
- 24. Beeinträchtigt ACL unter Linux die Leistung
- 25. Facebook API - Wie bekomme ich die Adresse des Benutzers, Telefonnummer?
- 26. wie aktiv sudo unter Linux
- 27. arpalert unter Linux
- 28. Monitor Batteriestatus unter Linux
- 29. Wie ist die Beziehung zwischen "einem" Heap und "dem" Heap?
- 30. wie man Seitencache in Linux programmgesteuert reinigen
Es macht mich verwirrt ... wenn ich einen Haufen mit p = (int *) malloc (sizeof (int)); , warum kann ich dann die Startadresse des Heapspeichers nicht p abrufen? – bazysong