Связь статических и динамических библиотек.

Тема в разделе "WASM.BEGINNERS", создана пользователем Antonios, 3 июн 2010.

  1. Antonios

    Antonios New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2010
    Сообщения:
    10
    Всем доброго времени суток! Уже долго мучает вопрос почему компилятору необходимо сначала указать на статическую библиотеку импорта, чтоб она обратилась уже при загрузке программы к динамической? Насколько я понял, получается просто повторение функций? Объясните пожалуйста.
    Кстати, нигде не могу найти подробной литры о DLLках. Может посоветуете что-нибудь?

    Сразу спасибо! :)
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    В каком компиляторе? Статическая подключается на стадии линковки, динамическая в процессе работы проги. Порядок указания не важен.
     
  3. Antonios

    Antonios New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2010
    Сообщения:
    10
    Я извиняюсь, не компилятору, а Линкеру конечно.
    Booster, этот механизм мне понятен. Не совсем корректно я задал вопрос.
    Меня интересует чисто теоретический аспект связи библиотек :). Сейчас поясню:

    В статической библиотеке ведь уже прописаны функции, которые, получается, опять повторяются но уже в динамически подгружаемой? Правильно я понимаю?
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    В статической библиотеке может находится или полностью готовая функция, или только ссылка на неё, указывающая в какой динамической библиотеке её искать. Поэтому никакого "дублирования" там нет.
     
  5. Antonios

    Antonios New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2010
    Сообщения:
    10
    Ясно! Спасибо! А нельзя придумать так, чтобы в коде программы объявить напрямую ссылки на функции DLLки, минуя статическую?
     
  6. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    248
    в FASMе так и делается
     
  7. Antonios

    Antonios New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2010
    Сообщения:
    10
    Для этого какие то дополнительные директивы используются?
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Я думал здесь про статические, а тут про переходники.
     
  9. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Antonios
    Из статической либы в случае импорта берутся только необходимые данные: имя функции и имя длл (одно на все её функции). Это упрощённо.
    На самом деле нужны ещё некоторые элементы – например, переменные, которые будут хранить адреса функций. Но смысл таков, что лишнего кода не включается. Хотя в зависимости от объявления функции, типа и настроек компиляции и линковки для функции могут быть добавлены переходники вида "jmp [address]". И, опять-таки, если уж собирать кусочки, то можно выкинуть определённую включаемую таблицу адресов.

    Подробнее можно почитать в статьях на этом сайте (например, "От Зелёного к Красному") и, конечно, в официальной спецификации ("MS PE COFF Specification", доступна на microsoft.com). После этого откроются способности создавать собственные библиотеки импорта, позволяющие прозрачно вызывать функции из динамических библиотек с включением\невключением любых данных, при этом ограниченным лишь фантазией способом – например, даже без присутствия в конечном бинарнике данных вроде собственно имён функций и их ординалов.