Bezpośrednie wiązanie

Bezpośrednie wiązanie jest cechą linkera i dynamicznego linkera w systemach Solaris i OpenSolaris . Zapewnia metodę umożliwiającą bibliotekom bezpośrednie wiązanie symboli z innymi bibliotekami, zamiast słabego wiązania z nimi i pozostawienia dynamicznego linkera do ustalenia, która biblioteka zawiera symbol.

Teoria

Podczas łączenia biblioteki współużytkowanej lub pliku wykonywalnego dołączanego dynamicznie linker zwykle zapełnia tablicę symboli dla tej biblioteki wszystkimi wymaganymi symbolami. Dodaje symbole w bieżącym obiekcie wraz z ich przesunięciem i pozostawia niezdefiniowane symbole w obiekcie bez rozwiązania. Nierozwiązane symbole muszą być nadal znane w czasie łączenia, ale linkerowi przekazywane są biblioteki współdzielone do łączenia, a gdy znajdzie symbol w innej bibliotece, umieszcza notatkę w bibliotece wyjściowej wskazującą, że zależy od tych innych bibliotek współdzielonych.

Ten rodzaj słabego łączenia zmusza dynamiczny linker do ustalenia, która biblioteka zawiera który symbol, gdy plik wykonywalny jest uruchamiany. Na przykład dynamiczny linker w Linuksie czyta sekcję DT_NEEDED obiektu ELF i ładuje potrzebne biblioteki; ale nie powiedziano mu, gdzie znajdują się wymagane symbole. W tym celu musi przejrzeć każdy nierozwiązany symbol w obiekcie, a dla każdego z nich przejrzeć każdą załadowaną bibliotekę, sprawdzając, aż znajdzie pasujący symbol. Może to być czasochłonne.

Bezpośrednie łączenie rozwiązuje ten problem, przechowując równoważną listę wskaźników do wpisów DT_NEEDED w oddzielnej sekcji ELF. Każdy wskaźnik odpowiada symbolowi w obiekcie; w ten sposób wskaźniki te tworzą relację między symbolem a wpisem DT_NEEDED. Pozwala to konsolidatorowi zlokalizować bibliotekę określoną przez określony wpis DT_NEEDED i sprawdzić tylko jej tablicę symboli dla każdego symbolu, zamiast iterować przez potencjalnie każdą bibliotekę dla każdego symbolu.

Linki zewnętrzne