Как работают библиотеки импорта и почему они не нужны MinGW?C++

Программы на C++. Форум разработчиков
Anonymous
Как работают библиотеки импорта и почему они не нужны MinGW?

Сообщение Anonymous »

Я просмотрел эту страницу: Углубленный анализ формата переносимого исполняемого файла Win32
В ней объясняется, что компоновщику нужна библиотека импорта, поскольку компилятор не может отличить обычные вызовы функций от вызовов функций API. Но они также говорят, что __declspec(dllimport) определяет вызов функции как вызов API, поэтому компоновщик связывается с _imp[имя-функции]. Но с этим ключевым словом компилятор должен знать, что это вызов API-функции.
Почему компоновщику все еще нужна библиотека импорта? Компилятор может пометить этот символ как импортированный, добавив _imp к имени функции, и может выполнить вызов указателя функции (который пока является неразрешенным символом), а компоновщик может заменить этот символ (поскольку он видит, что это вызов API) адресом записи IAT.
И почему MinGW-компоновщик может использовать «MinGW-DLL» напрямую, а не Visual-Studio компоновщику нужна библиотека импорта?
Когда я прочитал пост, возникли и другие вопросы. Как «dlltool (или компоновщик)» (в зависимости от того, кто создает библиотеку импорта) узнает расположение записи IAT до того, как будет выполнено связывание с окончательным исполняемым файлом? Я думал, что записи IAT будут создаваться во время компоновки с окончательным исполняемым файлом. В сообщении говорилось, что каждый API-вызов имеет фиксированную позицию в таблице IAT, неважно, сколько DLL будет связано. Я не могу себе представить, как этого можно достичь.

Подробнее здесь: https://stackoverflow.com/questions/278 ... -need-them

Вернуться в «C++»