Главная » Личность » Разделяемая библиотека. Сравнение статической и динамической компоновки

Разделяемая библиотека. Сравнение статической и динамической компоновки

Разделяемая библиотека позволяет использовать содержащиеся в ней символы в нескольких фильмах без копирования этих символов в библиотеки фильмов. Из-за этого объекты разделяемой библиотеки называются ресурсами (Assets). При этом разделяемая библиотека используется как внешний файл и не добавляется к создаваемому (или редактируемому) фильму.

Применение разделяемых библиотек целесообразно, например, в следующих случаях:

  • при использовании одного и того же звукового сопровождения на нескольких страницах сайта;
  • при совместном использовании текстовых символов шрифта на нескольких страницах сайта;
  • когда требуется обеспечить единый источник для элементов анимации, используемой в нескольких сценах фильма или в нескольких фильмах;
  • когда требуется иметь центральную библиотеку ресурсов, чтобы упростить контроль за вносимыми изменениями.

Flash MX поддерживает два типа разделяемых библиотек:

  • Run-time - разделяемая библиотека времени выполнения; символы, входящие в такую библиотеку, доступны для совместного использования несколькими фильмами, однако редактироваться такие символы могут только непосредственно в фильме-источнике;
  • Author-time - библиотека, разделяемая на время разработки; символы, входящие в такую библиотеку, доступны для совместного использования несколькими фильмами, причем разрешается редактировать содержимое библиотеки в любом фильме-совладельце.

Чтобы ресурсы разделяемой библиотеки могли быть доступны в фильмах, размещенных на удаленном сайте, Flash-файл с этой библиотекой должен быть экспортирован в формат SWF и загружен на Web-сайт.

Замечание

В предыдущей версии Flash поддерживается только разделяемая библиотека времени выполнения.

Чтобы создать разделяемую библиотеку типа Run-time, необходимо:

  1. Определить ее ресурсы (входящие в нее символы) в отдельном фильме.
  2. Разрешить экспорт разделяемых символов.
  3. Указать URL сайта, на котором будет размещена библиотека.
  4. Экспортировать Flash-файл с этой библиотекой в формат SWF и выгрузить на Web-сайт.

Чтобы получить возможность использовать символы разделяемой библиотеки Run-time в других фильмах («совладельцах»), необходимо в каждом из них создать ссылку на разделяемые символы.

Теперь рассмотрим перечисленные выше шаги более подробно.

После создании разделяемой библиотеки необходимо указать, какие включенные в нее символы могут быть экспортированы в другие фильмы. Для этого требуется выполнить следующие действия:

  1. Выберите в списке символ, который вы хотите сделать «разделяемым».
  2. В контекстном меню символа выберите команду Linking (Связывание).
  3. В открывшемся диалоговом окне Symbol Linkage Properties (Параметры связывания символа), рис. 10.12, установите флажок Export for runtime sharing (Разрешить экспорт на время выполнения).
  4. В текстовом поле Identifier введите имя (идентификатор) символа, под которым он будет экспортирован в фильм-совладелец; хотя по умолчанию в поле заносится библиотечное имя символа, если оно содержит пробелы, удалите их.
  5. В текстовом поле URL введите интернет-адрес фильма-источника (то есть SWF-файла с разделяемой библиотекой).
  6. Если экспортируемый символ следует использовать непосредственно с первого кадра фильма-совладельца, установите флажок Export in first frame.
  7. Если экспортируемый символ следует сделать доступным в сценарии на ActionScript, установите флажок Export for ActionScript.

Рис. 10.12. Диалоговое окно установки параметров символов разделяемой библиотеки

Чтобы использовать ресурсы разделяемой библиотеки Run-time в фильме-совладельце, требуется выполнить следующие действия:

  1. Откройте библиотеку этого фильма, выбрав в меню Window команду Library.
  2. В раскрывающемся меню библиотеки выберите команду New Symbol; в результате на экране появится диалоговое окно Create New Symbol (Создание нового символа), центральная часть которого аналогична по формату диалоговому окну Symbol Linkage Properties (рис. 10.13).
  3. В текстовом поле Identifier введите имя символа, который следует импортировать в фильм-совладелец.
  4. В текстовом поле URL введите интернет-адрес фильма-источника.

Рис. 10.13. Диалоговое окно для установки параметров разделяемого символа

Применение разделяемой библиотеки другого типа - Author-time - позволяет изменять (точнее, заменять) содержимое символов в редактируемом FLA-файле. При этом следует иметь в виду, что имя символа уже «зашито» в редактируемом фильме. Поэтому символ, импортируемый из разделяемой библиотеки, как бы подменяет собой исходный символ, сохраняя его имя. Если импортируемый символ содержит вложенные символы, они также будут импортированы.

Чтобы связать символ, подлежащий «подмене», с соответствующим символом из разделяемой библиотеки, необходимо:

  1. В редактируемом файле откройте окно библиотеки, выбрав в меню Window команду Library.
  2. В списке символов выберите символ, подлежащий «подмене», щелкните на нем правой кнопкой и в контекстном меню выберите команду Properties.
  3. В нижней части открывшегося диалогового окна. (см. рис. 10.13), в группе элементов Source (Источник) щелкните на кнопке Browse (Просмотр), и в окне Window Explorer выберите FLA-файл с нужной библиотекой; в результате на экране появится еще одно окно - Select Source Symbol (Выбор символа-источника), которое содержит список всех символов разделяемой библиотеки (рис. 10.14).


Рис. 10.14. Диалоговое окно Select Source Symbol

  1. Выберите в списке нужный символ и щелкните на кнопке ОК; это приведет к закрытию окна и изменению формата элементов управления в группе Source (рис. 10.15):
    • станет доступен флажок Always update before publishing (Всегда обновлять перед публикацией) - если он установлен, то символ в редактируемом фильме будет автоматически заменяться символом из разделяемой библиотеки при публикации фильма;
    • в текстовом поле File появится путь к файлу с разделяемой библиотекой;
    • в текстовом поле Symbol Name появится имя символа из разделяемой библиотеки;
    • станет доступна кнопка Symbol, щелчок на которой открывает диалоговое окно Select Source Symbol, приведенное на рис. 10.14.


Рис. 10.15. Формат элементов управления в группе Source после связывания символов

Замечание

Фильм может использовать ресурсы нескольких разделяемых библиотек любого типа.

В завершение приведем еще один способ, позволяющий воспользоваться содержимым библиотеки другого фильма. Для этого необходимо:

  1. Выбрать в меню File (Файл) основного окна Flash команду Open As Library (Открыть как библиотеку).
  2. С помощью окна Windows Explorer указать Flash-файл с нужной библиотекой; в результате на столе будет открыто окно этой библиотеки.
  3. Скопировать нужные символы из окна библиотеки в библиотеку фильма (или непосредственно на стол).

Содержимое такой библиотеки, подобно содержимому общей и постоянной библиотек, не может быть изменено из фильма-клиента (то есть из фильма, использующего ее ресурсы).

Разделяемая библиотека или общая библиотека - это файл, который предназначен для совместного использования программами . Модули, используемые программой, загружаются из отдельных общих объектов в память, а не копируется компоновщиком, когда он копирует один исполняемый файл для программы.

Совместно используемые библиотеки могут быть статически связаны, что означает, что ссылки на библиотечные модули разрешаются, и модулям выделяется память при создании исполняемого файла. Но часто связывание разделяемых библиотек откладывается до их загрузки.

Некоторые старые системы, например, Burroughs MCP , Multics , также имеют только один формат для исполняемых файлов, независимо от того, являются ли они общими. Они имеют файлы общей библиотеки того же формата, что и исполняемые файлы. Это дает два основных преимущества: во-первых, для каждого из них требуется только один загрузчик, а не два (наличие отдельного загрузчика приносит дополнительную сложность). Во-вторых, он также позволяет использовать исполняемые файлы в качестве разделяемых библиотек, если у них есть таблица символов . Типичные форматы комбинированных исполняемых и совместно используемых библиотек: ELF и Mach-O (оба в Unix) и (Windows).

В некоторых более старых средах, таких как 16-битная Windows или MPE для HP 3000 , в е с общей библиотекой допускались только данные на основе стека (локальные), или другие существенные ограничения были наложены на разделяемой библиотеки.

Разделяемая память [ | ]

библиотеки может совместно быть в памяти вместе c процессами , а также на диске. Если используется виртуальная память, процессы будут выполнятся в физической странице ОЗУ, которая отображается в разные адресные пространства процессов. Это имеет свои преимущества. Например, в системе OpenStep приложения часто имеют размер всего несколько сотен килобайт и быстро загружаются; большая часть их а находилась в библиотеках, которые уже были загружены операционной системой для других целей.

Программы могут осуществлять совместное использование ОЗУ с помощью независимого а , как в Unix , что приводит к сложной, но гибкой архитектуре. Это гарантирует, что с помощью различных приемов, таких как предварительное отображение адресного пространства и резервирование страниц для каждой разделяемой библиотеки, имеет большую вероятность совместного использования. Третьим вариантом является одноуровневое хранилище , используемое IBM System/38 и его преемниками.

В некоторых случаях разные версии разделяемых библиотек могут вызывать проблемы, особенно когда библиотеки разных версий имеют одинаковые имена файлов, и используется для разных приложений, установленных в системе, для каждой требуется определённая версия. Такой сценарий известен как DLL hell , названный в честь Windows и OS/2 DLL . Большинство современных операционных систем после 2001 года имеют методы очистки для устранения таких ситуаций или использования «частных» библиотек для конкретных приложений.

Gcc -fPIC -c helloworld.c -o helloworld.o gcc -shared -Wl,-soname,libhelloworld.so.1 -o libhelloworld.so.1.0.1 helloworld.o

Первая команда компилирует исходник helloworld.c в объектный файл helloworld.o, вторая - создает из объектного файла разделяемую библиотеку helloworld.so.1.0.1. Следует обратить внимание на следующие вещи.

  • Объектники нужно компилировать с опцией -fPIC (position-independent code).
  • Линковать разделяемую библиотеку нужно, соответственно, с опцией -shared.
  • Опция -Wl позволяет задать опции для линковщика, в данном случае, soname.
  • soname - имя, которое известно программе, которая будет использовать библиотеку. Оно должно предваряться префиксом "lib", а заканчиваться ".so.X", где Х - номер версии, который изменяется когда изменяется интерфейс библиотеки.
  • Опция -o задает имя выходного файла, которое должно представлять собой soname дополненное через точку минорным номером версии (minor number) и номером релиза.
  • У всех разделяемых библиотек в Linux есть еще третье имя - имя, которое использует компилятор. Это soname без номера версии.

Как установить созданную библиотеку в Linux

Lib_name = libhelloworld.so.1 lib_full_name = libhelloworld.so.1.0.1 lib_short_name = libhelloworld.so lib_install_path = /usr/lib lib_include_path = /usr/local/include install: so sudo install -m 0644 $(lib_full_name) $(lib_install_path) sudo ln -sf $(lib_install_path)/$(lib_full_name) $(lib_install_path)/$(lib_short_name) sudo ldconfig -n $(lib_install_path) sudo cp helloworld.h $(lib_include_path) .PHONY: install

Этот фрагмент makefile добавляет цель install, то есть теперь можно выполнить команду make install и библиотека будет установлена в /usr/lib.

  • Команда "install" копирует заданный файл библиотеки по заданному пути и создает символьную ссылку на него с именем, заданным в soname. Опция -m позволяет задать также права доступа для файла (644 - разрешение на запись и чтение для владельца файла, чтение для пользователей той же группы, чтение для остальных пользователей).
  • Команда "sudo ln -sf" создает символьную ссылку с перезаписью существующей (если такая уже есть) на файл только что установлненой библиотеки с именем для компилятора (soname без версии). После этой команды в заданном каталоге присутствуют файлы библиотеки со всеми тремя ранее перечисленными именами.
  • Команда "sudo ldconfig -n" перечитывает заданный каталог (опция -n) и обновляет кэш. После этого линкер и другие программы могут запрашивать библиотеку по имени (например, по soname). Можно вывести список всехъ загруженных библиотек с помощью команды "ldconfig -p".
  • Далее в случае необходимости можно скопировать заголовочные файлы библиотеки.
  • Цель "install" должна создаваться как

Разделяемая библиотека или общая библиотека - это файл, который предназначен для совместного использования программами . Модули, используемые программой, загружаются из отдельных общих объектов в память, а не копируется компоновщиком, когда он копирует один исполняемый файл для программы.

Совместно используемые библиотеки могут быть статически связаны, что означает, что ссылки на библиотечные модули разрешаются, и модулям выделяется память при создании исполняемого файла. Но часто связывание разделяемых библиотек откладывается до их загрузки.

Некоторые старые системы, например, Burroughs MCP , Multics , также имеют только один формат для исполняемых файлов, независимо от того, являются ли они общими. Они имеют файлы общей библиотеки того же формата, что и исполняемые файлы. Это дает два основных преимущества: во-первых, для каждого из них требуется только один загрузчик, а не два (наличие отдельного загрузчика приносит дополнительную сложность). Во-вторых, он также позволяет использовать исполняемые файлы в качестве разделяемых библиотек, если у них есть таблица символов . Типичные форматы комбинированных исполняемых и совместно используемых библиотек: ELF и Mach-O (оба в Unix) и (Windows).

В некоторых более старых средах, таких как 16-битная Windows или MPE для HP 3000 , в коде с общей библиотекой допускались только данные на основе стека (локальные), или другие существенные ограничения были наложены на код разделяемой библиотеки.

Разделяемая память

Код библиотеки может совместно быть в памяти вместе c процессами , а также на диске. Если используется виртуальная память, процессы будут выполнятся в физической странице ОЗУ, которая отображается в разные адресные пространства процессов. Это имеет свои преимущества. Например, в системе OpenStep приложения часто имеют размер всего несколько сотен килобайт и быстро загружаются; большая часть их кода находилась в библиотеках, которые уже были загружены операционной системой для других целей.

Программы могут осуществлять совместное использование ОЗУ с помощью независимого кода , как в Unix , что приводит к сложной, но гибкой архитектуре. Это гарантирует, что с помощью различных приемов, таких как предварительное отображение адресного пространства и резервирование страниц для каждой разделяемой библиотеки, имеет большую вероятность совместного использования. Третьим вариантом является одноуровневое хранилище , используемое IBM System/38 и его преемниками.

В некоторых случаях разные версии разделяемых библиотек могут вызывать проблемы, особенно когда библиотеки разных версий имеют одинаковые имена файлов, и используется для разных приложений, установленных в системе, для каждой требуется определённая версия. Такой сценарий известен как

Ранее мы упоминали разделяемые библиотеки как одно из преимуществ страничных и сегментных диспетчеров памяти перед базовыми и банковыми. При базовой адресации образ каждого процесса должен занимать непрерывные области как в физическом, так и в логическом адресном пространстве. В этих условиях реализовать разделяемую библиотеку невозможно. Но и при использовании страничной адресации не все так просто.

Использование разделяемых библиотек и/или DLL (в данном случае разница между ними не принципиальна) предполагает ту или иную форму сборки в момент загрузки: исполняемый модуль имеет неразрешенные адресные ссылки и имена библиотек, которые ему нужны. При загрузке эти библиотеки подгружаются и ссылки разрешаются. Проблема здесь в том, что при Подгрузке библиотеки ее нужно переместить, перенастроив абсолютные адресные ссылки в ее коде и данных (см. Главу 3). Если в разных процессах библиотека будет настроена на разные адреса, она уже не будет разделяемой (рис. 5.14)! Если разделяемые библиотеки могут иметь неразрешенные ссылки на другие библиотеки, проблема только усугубляется - к перемещаемым ссылкам добавляются еще и внешние.

Рис. 5.14 . Конфликтующие адреса отображения DLL

В старых системах семейства Unix, использовавших абсолютные загружаемые модули формата a.out , разделяемые библиотеки также поставлялись в формате абсолютных модулей, настроенных на фиксированные адреса. Каждая библиотека была настроена на СВОЙ адрес. Поставщик новых библиотек должен был согласовать этот адрес с разработчиками системы. Это было весьма непрактично, поэтому разделяемых библиотек было очень мало (особенно если не считать те, которые входили в поставку ОС).

Более приемлемое решение этой проблемы реализовано в OS/2 2.x и Win32 (обе эти архитектуры являются развитием систем с единым адресным пространством). Идея состоит в том, чтобы выделить область адресов под загрузку DLL и отображать эту область в адресные пространства всех процессов. Таким образом, все DLL, загруженные в системе, видны всем (рис. 5.15).



Предыдущая статья: Следующая статья:

© 2015 .
О сайте | Контакты
| Карта сайта