2017-02-17 3 views
-1

Я слышал, что библиотеки импорта имеют «заглушки», поэтому исполняемый файл знает, какую DLL и функцию мы хотим. Теперь мой вопрос: что это за заглушки? На что они похожи? Как исполняемый файл устанавливает указатели в нужные места в DLL? И как это известно, если мы говорим о нормальной библиотеке или библиотеке импорта, поскольку оба они являются .lib-файлами?Как работают библиотеки импорта?

+0

См. Также https://msdn.microsoft.com/en-us/magazine/bb985992.aspx –

+0

Исполняемый файл не знает об этом. Это компоновщик, который делает, и он испускает соответствующий код. – IInspectable

ответ

1

Средство MSVC не ссылается непосредственно на DLL, оно может ссылаться только на статическую библиотеку (.lib).

Очень грубо говоря, библиотека импорта является обычной статической библиотекой, которая имеет функцию заглушки для каждой экспортированной DLL функции.

Например, если DLL имеет функцию void func1() и экспорт func1, соответствующая библиотека импорта будет содержать функцию заглушки void __imp__func1() { __asm { jmp dword ptr func1; } }

Во время выполнения «скачок» будет принимать адрес func1 из таблицы импорта , Вот почему необходим заглушка.

В заявлении void __declspec(dllimport) func1(); в вашем заявлении будет фактически ссылаться на __imp__func1().

Вы можете обойти весь этот механизм вообще и позвонить LoadLibrary и GetProcAddress, чтобы получить адрес func1 во время выполнения. Это будет иметь тот же эффект.

1

Это зависит от компилятора (компоновщика) и платформы, которую вы используете.

I.e. в ОС Windows общая библиотека обычно является файлом .DLL,
, если вы хотите установить ссылку на него (кроме динамической загрузки и разрешения его символов во время выполнения), вам нужен соответствующий .LIB-файл, то есть заглушка ,

В основном библиотека заглушки статическая библиотека, которая повторно отображает все символы, экспортируемые DLL (с ​​__declspec(dllexport)) до символов, присутствующих в заглушке и которые могут быть найдены и статически скомпонованных в вашей программе с помощью __declspec(dllimport).

+0

Так __declspec (dllexport) функция из Windows API или это инструкция, которая находится в Visual Studio? –

+0

@ Daniel Nyman: «__declspec» - это ключевое слово (насколько я знаю, для Visual Studio), «dllexport» и «dllimport» являются атрибутами этого ключевого слова. См. Больше: https://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx – roalz

+0

[__declspec] (https://msdn.microsoft.com/en-us/library/dabb5z75.aspx) - это ключевое слово, которое назначает атрибут класса хранения для Microsoft. – IInspectable

Смежные вопросы