2009-07-24 21 views

Odpowiedz

5

Cóż, teraz, kiedy wspominasz o Uniksie, mogę dokładnie określić rozdzielczość symbolu.

Pliki wykonywalne mogą odwoływać się do jednostek, które nie są zdefiniowane w nich samych. Na przykład zmienne lub procedury w bibliotekach współdzielonych. Podmioty te są identyfikowane za pomocą zewnętrznych symboli. Plik wykonywalny może również posiadać wewnętrzne symbole, do których można odwoływać się z plików zewnętrznych - tak jak w przypadku bibliotek.

Rozdzielczość symboli w tym kontekście polega na tym, że po wczytaniu programu do pamięci, przypisanie odpowiednich adresów do wszystkich encji zewnętrznych, do których się odnosi. Oznacza to zmianę każdej pozycji w załadowanym programie, w której dokonano odniesienia do zewnętrznego symbolu.

Adresy te będą zależeć od tego, gdzie w pamięci został załadowany kod z symbolami zewnętrznymi.

W systemie Unix domyślnym trybem kompilacji programów jest używanie współdzielonej biblioteki systemów zamiast wstępnego łączenia wszystkich elementów niezbędnych w pliku wykonywalnym. Podczas kompilowania programu z gcc, na przykład, przekazujesz flagę -static, jeśli chcesz, aby została skompilowana statycznie, zamiast nierozwiązanych referencji symbolicznych.

Sprawdź "udostępnione biblioteki", aby uzyskać więcej informacji.

+0

sens, dziękuję bardzo. Sprawdzę też "biblioteki współdzielone". Czy masz jakieś książki, które możesz polecić, aby dowiedzieć się więcej na ten temat? –

+1

Najlepszą książką jaką znam na temat jest [_Linkers and Loaders_ przez John R. Levine] (http://rads.stackoverflow.com/amzn/click/1558604960). – alanc

1

Nie jestem pewien, w jakim kontekście rozumiesz rozdzielczość symbolu. Przypomina mi to dlopena (3) i dlsym (3) do rozwiązywania symboli w czasie rzeczywistym w bibliotekach współdzielonych.

+0

Mam na myśli to w kontekście używania go z poleceniem nm na unixie. To pomaga? Nie jestem pewien, co to jest dlopen, więc nie mogę powiedzieć, czy jesteś blisko. –

1

Jak wspomniano, może odnosić się do rozdzielczości czasu działania lub czasu łącza. Jednak nie powinieneś zapominać o kompilacji rozdzielczości symbolu.

To zasady używane przez język do odwzorowywania symboli na "rzeczy". Symbole przedstawiające wszystko, co wygląda jak nazwa (lokalna, członkowie i zmienne globalne, funkcje, metody, typy itp.) Oraz "rzeczy" będące kompilatorami rozumiejącymi, do czego odnosi się nazwa.

Zasady tego działania mogą być dość proste (na przykład IIRC w C to niewiele więcej niż uporządkowana lista miejsc do oglądania) lub złożone (C++ ma wszystkie rodzaje spraw z przeciążeniem, szablony i inne). Ogólnie rzecz biorąc, te zasady interakcji z semantyki programu, a czasami mogą nawet doprowadzić do (potencjalnie) dwuznaczności:

C++

int First(int i) { return i; } 
float First(float f) { return f; } 

void Second(int (*fn)(int)) { printf("int"); } 
void Second(float (*fn)(float); { printf("float"); } 

... 

Second(&First); // What will be printed?