2013-05-05 14 views
9

Jestem nowy w zespole i dlatego chcę lepiej zrozumieć pojęcie przeniesienia.Co oznacza pojęcie przeniesienia?

  1. Dlaczego dokładnie musimy przenieść programy, dane?
  2. Jak dokładnie to robi?

Byłoby wspaniale, gdyby ktoś mógł wyjaśnić na przykładzie poziomu dla początkujących.

+0

http://stackoverflow.com/questions/6002359/so-most-of-the-binary-is-composed-of-reloc-table/6092773#6092773 – JosephH

+0

Jaki jest twój praktyczny problem z programowaniem? Czy Twój program nie działa z powodu problemu z przeprowadzkami? –

+0

Szczegółowy minimalny przykład: http://stackoverflow.com/a/30507725/895245 –

Odpowiedz

12

Asembler ma jeden plik źródłowy do obejrzenia. Musi zbudować obraz pamięci oparty na tym jednym pliku źródłowym. Więc zaczyna się od 0 dla kodu, a także dla 0 z danymi. Wyniki przechodzą do pliku obiektowego.

Teraz linker przychodzi i musi łączyć wiele plików obiektów w plik wykonywalny (lub obraz jądra lub cokolwiek innego). Nie może zostawić wszystkich na 0, będą się nakładać. Musi więc przenieść adresy w celu przypisania każdemu plikowi obiektu wartości do unikalnego zakresu.

Następnie obraz jest ładowany do pamięci wirtualnej, system operacyjny może mieć dobre powody, aby chcieć użyć adresu innego niż "0" jako podstawowego adresu wirtualnego. Tak więc, w czasie wykonywania, chce ponownie przenieść wszystko.

Wreszcie, jeśli są zaangażowane biblioteki współdzielone, ani asembler, ani linker nie wiedzą, gdzie będą w uruchomionym środowisku, więc odniesienia do nich muszą zostać przeniesione.