Ich mache einige Reverse Engineering-Aufgaben in Richtung Binärdateien auf 32-bit x86
Architektur.Speicherzuordnungsoptimierung: von Heap zu Stack
Vor kurzem fand ich einige interessante Optimierungen von C
Quellcode Assemblerprogramm.
Zum Beispiel des Original-Quellcode ist wie (dieser Quellcode von openssl library
ist):
powerbufFree = (unsigned char *)malloc(powerbufLen);
Und nach der Kompilierung (gcc version 4.8.4 -O3
), der Assembler-Code ist wie folgt:
807eaa0: cmp eax, 0xbff # eax holds the length of the buf.
807eaa5: mov dword ptr [ebp-0x68], eax # store the length of powerbuf on the stack
807eaa8: jnle 0x807ec60 # 0x807ec60 refers to the malloc
807eaae: mov edx, eax
807eab0: add eax, 0x5e
807eab3: and eax, 0xfffffff0
807eab6: sub esp, eax
807eab8: lea eax, ptr [esp+0x23]
807eabc: and eax, 0xffffffc0
807eabf: add eax, 0x40
807ead3: mov dword ptr [ebp-0x60], eax # store the base addr of the buf on the stack.
Zu meiner Überraschung ist der Buf tatsächlich auf dem Stapel verteilt !!! Es scheint wie eine Optimierung für Heap-Allokator für mich, aber ich bin mir nicht sicher.
So, hier ist meine Frage, hat die obige Optimierung (malloc -> Stack Allocation) für jeden familar scheint? Macht das Sinn? Könnte jemand eine Anleitung/Spezifikation für eine solche Optimierung bereitstellen?
wo ist der malloc Anruf \ –
Das erinnert mich sehr an Escape-Analyse in neueren JVMs?. https://en.wikipedia.org/wiki/Escape_analysis Wenn der Speicher nie außerhalb des Funktionsaufrufs leben wird, kann er sicher vom Stapel zugewiesen werden. Wenn Sie Platz in Ihrem Stapel haben, wird dies ein viel schnelleres Allok/Frei-Paar von Operationen sein. – Sam
Ich denke, Heap ist eine allgemeine Baumstruktur. Beim Durchlaufen des Heapspeichers mit der Suchmethode Depth FIrst werden die Elemente nacheinander in der Reihenfolge eines Stapels aufgerufen. –