[sisyphus] Для тех кто интересуется, что такое DSO (выдержка из статьи)

Boronin Sergey =?iso-8859-1?q?analisys_=CE=C1_quality=2Es2=2Eru?=
Вт Фев 24 19:14:24 MSK 2004


DSO-модули Apache

DSO – это Динамический разделяемый объект, выполняющий те же функции,
что и динамическая подключаемая библиотека, DLL, для Windows. DSO
поддерживает динамическое связывание и загрузку общего кода в
исполняемый файл во время его выполнения. В качестве примеров DSO можно
привести .so-файлы в каталоге /lib или /usr/lib. Помните, как правило,
расширение файла .so указывает на то, что данный файл является DSO.
Существует два варианта использования DSO в Linux, как разделяемые
библиотеки и разделяемые файлы.

Разделяемая библиотека представляет DSO, в котором статическое
связывание с исполняемой программой устанавливается во время создания с
помощью компоновщика. Он создает жестко закодированую ссылку на
библиотеку в исполняемой программе, так что позже Linux сможет найти DSO
по жестко закодированному пути или по путям, сконфигурированным с
помощью переменной окружения.

LD_LIBRARY_PATH.

Разделяемый объект является DSO только тогда, если связывание было
установлено во время выполнения. Исполняемая программа просит Linux
загрузить DSO в адресное пространство, разрешая любые символы, так что
DSO выглядит, как статически связанный.

Web-сервер Apache разрабатывался на модульной основе. В ядро встроен API
расширяемого модуля, поддерживающий совместимый интерфейс. Большая часть
операций Apache реализована в наборе DSO-модулей, оставляя ядро в
минимальном составе. Такой подход имеет ряд преимуществ:

Позволяет создать сервер Apache именно с той функциональностью, которая
требуется, удалив все ненужные DSO-модули, повышая, таким образом,
производительность. 
Сторонние разработчики могут легко разрабатывать модули Apache,
используя API расширяемого модуля и расширяя функциональные возможности
ядра; например, mod_perl.so добавляет встроенный Perl-интерпретатор и
Perl-интерфейс в API модуля. Все эти модули могут без труда добавляться
в сервер Apache. 
Разработчики приложений могут использовать модули вместо CGI-системы для
переноса прикладных решений. Использование Apache API вместо
CGI-интерфейса сильно повышает производительность. 
Существует два способа, которыми Apache может загружать модули во время
запуска. В первом случае, модуль компилируется в исполняемый файл
Apache, а во втором, используется команда LoadModule из httpd.conf. 
Если вы хотите посмотреть, какие модули скомпилированы в ваш исполняемый
модуль Apache, введите команду, приведенную на рисунке 29. Обратите
внимание, что ваш исполняемый модуль Apache (httpd) может находиться в
другом каталоге.

/usr/local/apache/bin/httpd –l

Рисунок 29. Команда для просмотра всех модулей, скомпилированных в
Apache.

Конфигурирование Apache для поддержки DSO

Для того, чтобы Apache DSO, написанные в Kylix, могли корректно
работать, Apache должен быть сконфигурирован так, чтобы его ‘ядро’ было
‘разделяемым’. В результате этого, Apache сможет экспортировать символы
своего ядра, необходимые для DSO. Если ‘ядро’ считается ‘разделяемым’,
это означает, что все функциональные возможности ядра Apache сами
устанавливаются в DSO с именем libhttpd.so, а исполняемая программа
httpd становится программой автозагрузки. Так как невозможно связать DSO
со статическими библиотеками, на всех платформах для связывания
libhttpd.so и автоматически загружаемой программы httpd используется
дополнительная исполняемая программа под именем libhttpd.ep.

Вам потребуется исходный код Apache; если у Вас его еще нет на CD-ROMе,
то его можно скачать с http://www.apache.org. Чтобы извлечь исходный
код, скопируйте файл tar.gz в каталоги, типа /usr/src, а затем извлеките
исходный код с помощью данной команды

tar –zxvf apache_1.3.xx.tar.gz

Рисунок 30. Извлечение исходного кода Apache.

Теперь, чтобы можно было сделать версию Apache с разделяемым ядром,
необходимо создать скрипт-файл config.status (или изменить его, если
таковой уже существует). Скрипт-файл config.status следует создавать в
корневом каталоге, из которого был извлечен исходный код Apache. На
рисунке 31 показаны записи, которые должны быть в скрипт-файле
config.status.

#!/bin/sh
CFLAGS="-g" \ (Note: Only for debug intro) CFLAGS_SHLIB="-g" \
LIBS="/usr/lib/libpthread.so" \ ./configure \ "--with-layout=Apache" \ "
--enable-module=so" \ "--enable-rule=SHARED_CORE" \ "$@"

Рисунок 31. Записи в скрипт-файле config.status, необходимые, чтобы
сделать ядро Apache разделяемым.

После создания скрипт-файла config.status необходимо создать и
инсталлировать Apache, используя команду, приведенную на рисунке 32.
Помните, что сначала следует изменить полномочия для скрипт-файла
config.status.

chmod 755 config.status 

./config.status 

make 

make install


Компиляция и установка DSO под Apache

Когда вы компилируете Apache DSO, он создает не исполняемую программу, а
DSO-файл под именем lib<projectname>.so (в соответствии с правилами
задания имен для DSO). Скомпилированный DSO следует скопировать в тот же
каталог, в котором находятся все остальные Apache DSO. Затем нужно
добавить запись в httpd.conf, как показано на рисунке 34; после чего
следует перезапустить сервер.

LoadModule Hello_module libexec/libHelloModule.so
<Location /HelloWorld>
SetHandler hello-handler
</Location>

Надеюсь, что так будет понятнее, что я имел ввиду.

С уважением,
Боронин Сергей

-----Original Message-----
From: Dmitry Alexeyev [mailto:dmi на qnx.org.ru] 
Sent: Tuesday, February 24, 2004 6:39 PM
To: analisys на quality.s2.ru
Subject: Re: [sisyphus] Рацпредложение.

Добрый день! 


> >
> >Кроме уменьшения занимаемой памяти вынесенным ядром, других
> > аргументов за него я не слышал.
>
> Мне это не ради экономии памяти надо, а для того чтобы использовать
> написанные мной на Kylix 2 загружаемые модули под  апач.

Помещаете из в /usr/lib/apache/ и загружаете в конфигурационном файле. 
Вы ведь не готовый  libhttpd.ep патчите же? 
Так все модули и загружаются... 

>
> >То, что имеете в виду Вы - это SHARED_CORE, вынос ЯДРА веб-сервера в
> >динамическу загржаемую библиотеку.
>
> Возможно, но Borland это называет Apache DSO, да и в других
> источниках в сети я встречал именно это название.

Apache DSO - это SHARED_CHAIN, а не SHARED_CORE!!!

WBR,
Dmitry


Подробная информация о списке рассылки Sisyphus