Статические и динамические библиотеки - PullRequest
2 голосов
/ 27 августа 2011

Я читал о статических и динамических библиотеках. Мой вопрос немного конкретизировать

dlopen dlclose:

Benifit of dlopen is  we can start the EXE with out
loading the necessary libraries at the begining. Only when we
need we will load the libratries and unload it from the memory.

Это поведение динамически подключаемых библиотек.

У меня вопрос, могу ли я связать библиотеку libUtlities

ld -o EXE main.o -lUtilities 

Когда я запускаю EXE, libUtlities будет загружен в память до Я сначала использую там функциональные возможности

which i observed in dbx (Solaris debugger)
But will not contribute to the size of the EXE.

1.Так что это статическая или динамическая связь.

Ответы [ 2 ]

9 голосов
/ 27 августа 2011

К сожалению, слова "static" и "dynamic" слишком часто используются way , особенно в C и C ++. Итак, я предпочитаю следующую терминологию:

  • Связывание во время соединения, a.k.a «статическое связывание»: все символы разрешаются во время соединения из статических библиотек. В результате получается монолитный статически связанный исполняемый файл без зависимостей времени загрузки.

  • Связывание во время загрузки: это стандартная практика на современных платформах, неразрешенные символы ищутся в общих библиотеках (Unix) или, к сожалению, именуемых динамически подключаемых библиотеках (DLLS) в Windows, и только ссылки записываются во время соединения, фактическое разрешение символов и загрузка кода происходит во время загрузки.

    В результате получается «динамически связанный» исполняемый файл, который должен быть загружен с загрузчиком (например, ld.so в Linux). Загрузка является частью ОС и обычно прозрачна для пользователя, хотя она открыта для проверки (например, с ldd в Linux). Все общие библиотеки должны быть доступны во время загрузки, иначе программа не запустится.

  • Связывание во время выполнения, a.k.a. «динамическое связывание»: нет неразрешенных символов; скорее среда выполнения динамически решает искать символы в разделяемой / динамической библиотеке, используя dlopen() или LoadLibrary(). Невозможность найти символы является условием времени выполнения, которое не является ошибкой. Этот метод обычно используется для архитектуры подключаемых модулей и в Windows для внедрения кода.

Обратите внимание, что существует принципиальная техническая разница между общими объектами Linux и библиотеками Windows, они не просто одно и то же с другим именем. Однако и то, и другое можно использовать как для связи во время загрузки, так и во время выполнения.

3 голосов
/ 27 августа 2011

Это динамическое связывание.Это не имеет ничего общего с dlopen dlclose.По dlopen вы вручную открываете динамическую библиотеку и вызываете функции, экспортированные из нее.Благодаря динамической компоновке вся эта работа выполняется компоновщиком.Статическое связывание - это соединение со статической библиотекой (файл .a).Путем статического связывания код из библиотеки связывается с вашим файлом exe, увеличивая его размер.

...