Pytanie:
Funkcja porcjowana (nieciągłe fragmenty kodu zawierające funkcję)
CarstenC4
2014-02-13 13:20:18 UTC
view on stackexchange narkive permalink

Poniższy wykres przepływu sterowania pochodzi z pojedynczej funkcji w Notatniku (64-bitowy system Windows 7). Dlaczego konsolidator (lub kompilator) rozdziela podstawowe bloki pojedynczej funkcji na wiele nieciągłych (nie ciągłych) fragmentów?

Function CFG

Zajrzyj do Working-Set Tuning i [ta częściowo związana z moją odpowiedzią] (http://reverseengineering.stackexchange.com/questions/3167/grouping-functions-based-on-their-placement-order-in-the- binarny / 3169 # 3169).
@CarstenC4:, dlaczego rozważasz te oddzielne zakresy adresów? Czy możesz rozwinąć? Z twojego pytania wynika, że ​​wszyscy używają dokładnie tego samego zakresu adresów, co sprawia, że ​​twoje pytanie jest nieco niejasne.
@CarstenC4: masz na myśli, dlaczego funkcja nie jest ciągła w pamięci? To znaczy. dlaczego jest podzielony?
@0xC..22L: „nie są ciągłe” to lepsze sformułowanie, dzięki
Odbywa się to dla lokalizacji pamięci podręcznej. Starają się trzymać „gorące ścieżki” funkcji w jednej linii pamięci podręcznej, podczas gdy „zimne ścieżki” znajdują się w drugiej linii pamięci podręcznej.
@CarstenC4, czy możesz wspomnieć, dlaczego przerwałeś produkcję c4decompiler? czy inne alternatywy obejmują wszystko, co robi c4?
Jeden odpowiedź:
0xC0000022L
2014-02-14 05:33:58 UTC
view on stackexchange narkive permalink

DCoder już odniósł się do własnej odpowiedzi w komentarzu.

Fragmenty wykresu przepływu sterowania są zwykle określane jako bloki podstawowe lub rozszerzone bloki podstawowe. Powód, dla którego są zmieniane, musi być związany z optymalizacjami wykonanymi przez kompilator.

Jest kilka terminów, o które pytasz:

  • fragmentacja funkcji
  • podstawowa zmiana kolejności bloków
  • przeplatanie partycji

Zdecydowanie sugeruję, aby zainteresowani tym tematem przeczytali o kompilatorze projekt. W szczególności zasugerowałbym przeczytanie „Smoczej księgi” („Kompilatory - zasady, techniki, narzędzia &” autorstwa Aho, Lama, Sethi i Ullmana) i tam części o optymalizacji. Tutaj odnoszę się do drugiego wydania z 2007 roku (ISBN: 0-321-48681-1).

Zapoznaj się z sekcjami 8.4 („Podstawowe bloki i wykresy przepływu”) i 8.5 („Optymalizacja podstawowych bloków ”), aw drugim 8.5.7 („ Ponowne składanie podstawowych bloków z DAG ”). Ale to dopiero początek. Rozdział 9 jest równie ważny jako całość, podobnie jak sekcja 11.10 („Optymalizacje lokalizacji”). Cytując jeden z powodów tego rodzaju optymalizacji, o który pytasz ze wstępnego akapitu podsekcji poświęconej przeplataniu partycji:

11.10.3 Przeplatanie partycji

Różne partycje w pętli często czyta te same dane lub czyta i zapisuje te same wiersze pamięci podręcznej. [...]

cytat z „Compilers - Principles, Techniques, & Tools” autorstwa Aho, Lam, Sethi i Ullman.

Sprowadza się to do tego, o czym DCoder już wspomniał w komentarzu do twojego pytania.

Aha, a książka „Reversing: Secrets of Reverse Engineering” jest również dobrą lekturą która omawia to częściowo. Jednak bardziej skupia się na tym, „jak to wygląda” niż „dlaczego to się robi”.



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...