2011-11-02 10 views

Odpowiedz

8

Pytanie dotyczy języka C, więc odpowiedź brzmi: no - w samym języku nie ma nic, co definiowałoby coś takiego jak przechowywanie funkcji na stercie.

Jednakże, jeśli dodamy wiedzę o szczegółach wdrożenia i systemie operacyjnym (tabele relokacji, ochrona stron itp.), To tak, jest to możliwe. Na przykład, niestandardowe dynamiczne kreatory kodu (które nie korzystają z ładowania DLL/SO dostarczanego przez system operacyjny) działają w ten sposób.

0

W sensie ogólnym odpowiedź brzmi: nr; ponieważ instrukcje kodu muszą być znane podczas kompilacji.

dynamicznie połączone biblioteki może być bliżej do siebie, być liberalnym.

1

Kiedy program jest ładowany do pamięci, to przede wszystkim zorganizowane w trzech obszarach pamięci, zwane segmenty:

  • segment tekstu
  • segmentu stosu
  • segmentu sterty

Segment tekstowy (zwany również segmentem kodu) jest miejscem, w którym znajduje się skompilowany kod samego programu. Ponieważ "NOWE INSTRUKCJE" lub "NOWE FUNKCJE" mają być znane w czasie kompilacji, więc nie możemy ich zapisać w Heap.

Mamy nadzieję, że pomoże to w rozwiązaniu Twojego zapytania.

8

Tak, oczywiście. Jak myślisz, co to jest just-in-time compiler? Część stack smashing attacks działa na podobnej zasadzie (kod wykonywany na stosie zamiast na stercie). Jest to jeden z powodów, dla których nowoczesne systemy operacyjne mają ochronę przed wykonaniem stron "danych". (Uprawnieni programiści generujący dynamiczne kody musieliby wyłączyć taką ochronę.) Zobacz także artykuł w Wikipedii pod adresem self-modifying code.

+4

+1 za jedyną odpowiedź w morzu "Nie, źle, trzymaj się z daleka", która mówi: "Tak, tak, faktycznie". –

+1

Zgadzam się. JVM zapewnia mechanizm ładowania .class w czasie wykonywania w stosie i dynamicznego wywoływania jego funkcji. Ale Aditya prosi o dodanie funkcji w stercie, szczególnie w języku C. – Alam

1

Z pewnością można przechowywać wszystko, co dane, instrukcje zawarte, ale to, czy będziesz w stanie faktycznie wykonać te instrukcje i jak wiele zależy od kompilatora i platformy. Będziesz musiał zagłębić się w szczegóły niskiego poziomu obu, aby zrobić to poprawnie bez awarii lub zawieszenia programu lub środowiska (na przykład prymitywnego systemu operacyjnego, który nie jest chroniony przed aplikacjami).

Here to przykład przechowywania instrukcji BSWAP x86 jako danych w tablicy (nie przydzielane dynamicznie, ale generalnie nie powinno to mieć znaczenia) i wykonywania jej. Przykład faktycznie zapisuje jako dane, a nie pojedynczą instrukcję BSWAP, ale pełną procedurę C-Call, która jest zgodna z konwencją wywołującą mandat kompilatora, regulującą sposób przekazywania parametrów do niej i zwracania z niej wartości zwracanych.

Przykładem jest 32-bitowa aplikacja Windows, a ponieważ ma działać w systemie Windows, musi również zapewnić, że region zawierający instrukcje jest oznaczony jako czytelny i wykonywalny (pierwszy z nich jest przyznawany przez fakt, że są w tablicy, która może być odczytywana i zapisywana, a druga jest zapewniona przez wywołanie funkcji VirtualProtect() w celu poinformowania systemu operacyjnego o oznaczeniu regionu jako wykonywalny, co jest potrzebne, ponieważ system operacyjny próbuje chronić nas przed przypadkowym wykonaniem kodu, który może być złośliwe (np. niezaufane dane pochodzące z Internetu)).

+0

Wielkie dzięki! Doceń wszelką pomoc. – Aditya369