2013-07-24 8 views
8

W środowisku Windows,Dlaczego funkcja Implicit DLL Linking wymaga odpowiedniego pliku Lib, ale nie ma linku do funkcji Explicit Linking?

Kiedy próbowałem połączyć DLL do mojego programu Jawnie (przy użyciu LoadLibrary)

  • Najpierw trzeba określić wskaźników funkcji zgodnie z każdego podpisu funkcji wewnątrz biblioteka DLL.
  • Następnie uzyskaj adresy funkcji za pomocą "GetProcAddress" i przypisz je do tych wskaźników.

Kiedy próbowałem połączyć DLL do mojego programu Pośrednio (za pomocą pliku nagłówka)

  • Najpierw trzeba odpowiedni plik nagłówka, aby uzyskać podpisy funkcyjnych.
  • Następnie potrzebny jest odpowiedni plik Lib wygenerowany przy użyciu biblioteki DLL.

    Moje pytania są

    1. Dlaczego implicite łącząc potrzebny plik Lib jak również?
    2. Jakie informacje są potrzebne do pobrania z pliku "Lib", którego nie można uzyskać z poziomu DLL lub Header file?
    3. Jeśli jest coś na pytanie 2, w jaki sposób informacje są pobierane podczas jawnego wczytywania?

Już poszedł koryta this pytanie. Ale nie potrafię zrozumieć żadnego godnego powodu. Czy ktoś mógłby pomóc ci to wyjaśnić w prosty sposób? Dziękuję Ci.

+0

Nie chodzi o pobieranie danych, które * nie mogły * pochodzić z biblioteki DLL. To bardziej optymalizacja - formatowanie danych tak, aby życie było jak najprostsze dla linkera, aby zminimalizować specjalną obudowę między łączeniem z bibliotekami statycznymi a dynamicznymi. –

+0

@Jerry: Jakie informacje przekazuje Lib w celu optymalizacji. Czy pomaga zmniejszyć czas łączenia? Dlaczego te informacje nie mogą osadzić biblioteki DLL? Dlaczego więc wywołać 'DLL' niż wywołanie' DLL & LIB'. Dziękuję Ci! –

+0

To głównie kwestia optymalizacji formatu danych - to jest przekształcanie danych dla biblioteki w plik obiektowy formatu COFF, tak jak linker spodziewa się, że zajmie się czymś innym. Ale - możesz stworzyć .lib z biblioteki DLL (lub nawet pliku definicji modułu), więc wynik nie zawiera żadnych informacji, które są nieobecne w bibliotece DLL. –

Odpowiedz

3

Dlaczego również niejawne łączenie wymaga pliku Lib.

W .libs mieć informacje importu dll, można sprawdzić informacje używając polecenia dumpbin który jest zawarty w Windows/Visual Studio SDK.

to informacje ogniwem recv wewnątrz ws2_32.lib na przykład:

Version  : 0 
Machine  : 14C (x86) 
TimeDateStamp: 4907F6ED Wed Oct 29 01:38:53 2008 
SizeOfData : 00000014 
DLL name  : WS2_32.dll 
Symbol name : [email protected] 
Type   : code 
Name type : ordinal 
Ordinal  : 16 

Można sprawdzić jest numerem porządkowym i nazwą wewnątrz ws2_32.dll (sprawdź, czy teraz ona mówi do importowania DLL) .

Jakie informacje to trzeba pobrać z pliku „lib”, które nie mogą dostać od DLL lub nagłówku pliku

w pliku nagłówkowym, nie ma informacji skąd wyodrębnić importu, więc oni są oznaczane jako importowane (__imp__name) podczas kompilacji i gdy jest połączone z plikiem .lib, rozwiązuje nazwę:

  • Jeśli znajduje się wewnątrz pliku .lib, po prostu łączy się z nim.
  • Ale jeśli istnieją informacje na temat zewnętrznego odnośnika (DLL), skonstruuje on import wewnątrz tabeli importu, więc jest ładowany w sposób dinamiczny.

Jeśli jest coś na pytanie 2, w jaki sposób informacje te są pobierane w przypadku jawnego wczytywania.

Jeśli dla jawnego wczytywania masz na myśli LoadLibrary, mówisz to w czasie wykonywania, a nie w czasie połączenia. Zatem moduł ładujący PE przeszuka bibliotekę DLL wewnątrz zmiennej PATH i załaduje ją dynamicznie. Następnie masz inne funkcje, aby uzyskać adresy wyeksportowanych funkcji.

Jeśli czegoś nie rozumiesz, po prostu zapytaj mnie, spróbuj grać z dumpbin i czytaj o PE, jeśli chcesz lepiej to zrozumieć.

+0

+1 za strukturę odpowiedzi, dziękuję za dobrze wyjaśnioną odpowiedź. Potrzebuję trochę czasu, aby przejść przez to, co proponujesz. Potrzebuję twojej pomocy po tym. proszę, pozostań z tym w kontakcie. jeszcze raz dziękuję –

+0

Oczywiście, nie ma za co. – snf

+1

To tylko uzupełnienie tej miłej odpowiedzi. Zakładając, że korzystasz z narzędzi Microsoft, możesz utworzyć bibliotekę importu dla biblioteki DLL za pomocą narzędzia LIB - z dokumentacji Microsoft: * LIB może być również używany do tworzenia plików eksportu i importowania bibliotek w celu odniesienia się do eksportowanych definicji * –

1

Podczas niejawnego łączenia deklaracja funkcji określa nazwę, która ma być używana w programie oraz prototyp i konwencję wywołującą. Ale potrzeba więcej informacji. W szczególności:

  1. Fakt, że funkcja jest zaimplementowana zewnętrznie w bibliotece DLL.
  2. Nazwa tej biblioteki DLL.
  3. Wyeksportowana nazwa funkcji. Jest to nazwa używana do eksportowania funkcji z biblioteki DLL, która może nie być taka sama, jak ta używana podczas importowania.

Niektórzy projektanci języka zdecydowali się udostępnić te informacje za pomocą rozszerzeń językowych. Na przykład Delphi wybrał tę trasę. Łączenie niejawne jest określane wyłącznie w kodzie bez plików .lib. Z drugiej strony konwencja C i C++ polega na użyciu plików .lib w celu określenia brakujących informacji.

Powiązane problemy