2009-07-31 4 views
6

Ciekawe, co się stało przed wywołaniem metody main(), np. Załadowanie pliku wykonywalnego do pamięci, dynamiczne ładowanie udostępnianej biblioteki. Czy masz jakieś sugestie, jak zrozumieć te rzeczy przez ćwiczenia ręczne?Każde ćwiczenie praktyczne, aby zrozumieć, w jaki sposób program jest ładowany do pamięci i wykonywane.

Narzędzia amd rzeczy znam, a przy użyciu obecnie obejmuje:

  • strace
  • demontować
  • readelf
  • /proc/pid/mapa

UWAGI: Znam wspaniałą książkę linkers and loaders, ale praktyczne ćwiczenia mogą mnie nauczyć lepiej niż czytanie książki.

Odpowiedz

3
  • Dokument ld.so man page zawiera kilka zmiennych środowiskowych, które można skonfigurować w celu dostosowania procesu dynamicznego łączenia lub podania dodatkowych szczegółów.

np.

LD_DEBUG=all cat </dev/null 
  • Można łatwo uzyskać kod źródłowy dla każdego i każdy kawałek zaangażowanych - jądro, dynamiczny linker, biblioteki C, kod startowy (crt0.o lub podobny). Możesz zacząć od studiowania kodu i dokonywania eksperymentalnych modyfikacji.
3

Jeśli chcesz sprawdzić, w jaki sposób jest pakowany plik binarny, i różne sekcje, uważam, że najlepszym programem jest objdump.

wybrać niezależnie wykonywalny i zrobić:


objdump -S <executable> > myfile.S 

Innym dobrym ćwiczeniem będą:

  • Tworzy program użyć zewnętrznej biblioteki
  • kompilacji programu za pomocą statycznego łączącego
  • Uruchom program
  • Zmień nazwę pliku biblioteki i sprawdź, czy program działa
  • kompilacji programu przy użyciu biblioteki współdzielonej
  • Zmień nazwę biblioteki i sprawdzić, czy program działa

To będzie odpowiedzieć na kilka pytań o to, co dzieje się pod zasłonami i jak.

1

Kiedy wziąłem klasę OS na studia, użyliśmy Nachos. Nie jest to system operacyjny per se, ale rodzaj "symulacji" systemu operacyjnego, który działa w przestrzeni użytkownika. Został napisany w C++ i można przekompilować pliki wykonywalne, które Nachos może następnie załadować i uruchomić. Możesz grać za pomocą interfejsu wywołań systemowych i, w ogólnym eksperymencie, jak chcesz, twiddling z kodem.

Uruchomiliśmy go w laboratorium Solaris i miałem problem z uruchomieniem go na Linuksie na mojej osobistej maszynie, ale może to być zabawna zabawka, jeśli chcesz zagłębić się w jakiś kod.

1

Zdaję sobie sprawę, że to prawdopodobnie dużo dla tego, czego szukasz, ale pisanie własnego asemblera i linkera byłoby bardzo pouczające. Zrobiłem to, kiedy byłem w college'u i pokochałem to. Potrzeba było chyba 120 godzin pracy, o ile pamiętam, żeby działało na podstawowe rzeczy, które chciałem. Myślę, że ten projekt bardziej niż cokolwiek innego uczynił mnie pewnym, że kariera w programowaniu była dla mnie.

Powiązane problemy