Как работают библиотеки импорта и почему они не нужны 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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