Статические библиотеки - PullRequest
3 голосов
/ 09 октября 2011

Когда я хочу вызвать какую-то функцию Windows, например MessageBox, я могу импортировать ее из user32.dll и вызвать (с помощью LoadLibrary и GetProcAddress). Но есть и статическая библиотека, которую использует Visual C ++, поэтому мне не нужно вручную загружать библиотеки DLL и функции. Как они работают? Содержат ли они оболочки, вызывающие LoadLibrary / GetProcAddress каждый раз, когда я вызываю функцию?

Ответы [ 2 ]

6 голосов
/ 09 октября 2011

"Статическая библиотека", на которую вы ссылаетесь, на самом деле библиотека импорта .Этот тип библиотеки содержит записи, которые сообщают компоновщику, в какой библиотеке фактически существует каждая функция, и не содержат никакого кода.Компоновщик создает записи импорта в исполняемом файле, которые загрузчик разрешает во время загрузки.Это исправляет адреса, используемые во время выполнения, поэтому вашему коду не нужно явно вызывать LoadLibrary и GetProcAddress.

1 голос
/ 09 октября 2011

Нет, они просто позволяют вам использовать статическое связывание с DLL. Исполняемый файл содержит список функций, которые ему нужны из других DLL-файлов, поэтому при загрузке исполняемого файла загрузчик анализирует этот список и разрешает каждую функцию с помощью LoadLibrary и GetProcAddress, сохраняя результат в статической таблице (IAT, Импортированная таблица адресов). Это делается только один раз. Существует также понятие «отложенная загрузка» DLL, которая разрешает адрес только при первом вызове функции, но редко используется.

Таким образом, файл lib для DLL содержит только информацию, необходимую для построения этого списка (имена экспортируемых функций).

...