Всем доброго времени суток! Уже долго мучает вопрос почему компилятору необходимо сначала указать на статическую библиотеку импорта, чтоб она обратилась уже при загрузке программы к динамической? Насколько я понял, получается просто повторение функций? Объясните пожалуйста. Кстати, нигде не могу найти подробной литры о DLLках. Может посоветуете что-нибудь? Сразу спасибо!
В каком компиляторе? Статическая подключается на стадии линковки, динамическая в процессе работы проги. Порядок указания не важен.
Я извиняюсь, не компилятору, а Линкеру конечно. Booster, этот механизм мне понятен. Не совсем корректно я задал вопрос. Меня интересует чисто теоретический аспект связи библиотек . Сейчас поясню: В статической библиотеке ведь уже прописаны функции, которые, получается, опять повторяются но уже в динамически подгружаемой? Правильно я понимаю?
В статической библиотеке может находится или полностью готовая функция, или только ссылка на неё, указывающая в какой динамической библиотеке её искать. Поэтому никакого "дублирования" там нет.
Ясно! Спасибо! А нельзя придумать так, чтобы в коде программы объявить напрямую ссылки на функции DLLки, минуя статическую?
Antonios Из статической либы в случае импорта берутся только необходимые данные: имя функции и имя длл (одно на все её функции). Это упрощённо. На самом деле нужны ещё некоторые элементы – например, переменные, которые будут хранить адреса функций. Но смысл таков, что лишнего кода не включается. Хотя в зависимости от объявления функции, типа и настроек компиляции и линковки для функции могут быть добавлены переходники вида "jmp [address]". И, опять-таки, если уж собирать кусочки, то можно выкинуть определённую включаемую таблицу адресов. Подробнее можно почитать в статьях на этом сайте (например, "От Зелёного к Красному") и, конечно, в официальной спецификации ("MS PE COFF Specification", доступна на microsoft.com). После этого откроются способности создавать собственные библиотеки импорта, позволяющие прозрачно вызывать функции из динамических библиотек с включением\невключением любых данных, при этом ограниченным лишь фантазией способом – например, даже без присутствия в конечном бинарнике данных вроде собственно имён функций и их ординалов.