1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
3 <?xml-stylesheet type="text/xsl" href="./style/manual.tr.xsl"?>
4 <!-- English Revision: 1199481 -->
5 <!-- =====================================================
6 Translated by: Nilgün Belma Bugüner <nilgun belgeler.org>
7 Reviewed by: Yücel Haluk Bugüner <haluk belgeler.org>
8 ========================================================== -->
11 Licensed to the Apache Software Foundation (ASF) under one or more
12 contributor license agreements. See the NOTICE file distributed with
13 this work for additional information regarding copyright ownership.
14 The ASF licenses this file to You under the Apache License, Version 2.0
15 (the "License"); you may not use this file except in compliance with
16 the License. You may obtain a copy of the License at
18 http://www.apache.org/licenses/LICENSE-2.0
20 Unless required by applicable law or agreed to in writing, software
21 distributed under the License is distributed on an "AS IS" BASIS,
22 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23 See the License for the specific language governing permissions and
24 limitations under the License.
27 <manualpage metafile="dso.xml.meta">
29 <title>Devingen Paylaşımlı Nesne Desteği</title>
32 <p>Apache HTTP Sunucusu modüler bir program olup, yönetici sadece bir
33 grup modül seçerek sunucuya işlevsellik ekleyebilir. Modüller, Devingen
34 Paylaşımlı Nesneler (DSO - Dynamic Shared Object) halinde
35 <program>httpd</program> programından ayrı olarak derlenir. DSO modülleri
36 sunucunun derlenmesi sırasında derlenebileceği gibi ayrı olarak derlenip
37 daha sonra Apache Eklenti Aracı (Apache Extension Tool)
38 <program>apxs</program> programı kullanılarak da sunucuya eklenebilir.</p>
40 <p>Bu belgede DSO modüllerinin kullanımının yanında teorisine de
45 <section id="implementation"><title>Gerçeklenim</title>
49 <module>mod_so</module>
52 <directive module="mod_so">LoadModule</directive>
56 <p>Apache httpd modüllerini yüklemek için DSO desteği, Apache httpd
57 çekirdeğine durağan olarak ilintilenerek derlenmiş olan
58 <module>mod_so</module> adında bir modül tarafından sağlanır.
59 <module>core</module> modülünden başka, bir DSO modülü olamayan tek modül
60 <module>mod_so</module> modülüdür. Apache ile dağıtılan hemen hemen tüm
61 diğer Apache modülleri bir DSO modülüne yerleştirilebilir. Derlenmiş
62 modüller <code>mod_filanca.so</code> biçeminde birer DSO ismi alırlar ve
63 her biri istenirse <code>httpd.conf</code> dosyasında
64 <module>mod_so</module> modülünün <directive module="mod_so"
65 >LoadModule</directive> yönergesiyle belirtilerek sunucu başlatılırken
66 veya yeniden başlatılırken sunucuya yüklenebilir.</p>
68 <p><a href="install.html">Kurulum belgesinde</a> açıklandığı gibi, her DSO
69 modülü <program>configure</program> programının
70 <code>--enable-mods-static</code> seçeneği ile devredışı bırakılabilir.</p>
72 <p>Apache httpd modülleri için (özellikle üçüncü parti modüller için) DSO
73 dosyası üretimini kolaylaştırmak amacıyla <program>apxs</program>
74 (<dfn>APache eXtenSion</dfn>) adında yeni bir destek programı
75 kullanılmaktadır. Bu program Apache httpd modüllerini Apache httpd kaynak
76 ağacından ayrı olarak derlemek için kullanılabilir. Fikir basittir: Apache
77 HTTP Sunucusu derlenirken DSO dosyalarını derlemek için platforma bağımlı
78 derleyici ve ilintileyici seçenekleri <program>apxs</program>
79 programının içine konur ve <code>make install</code> ile kurulum sırasında
80 Apache httpd C başlık dosyaları da kurulur. Böylece
81 kullanıcı Apache httpd dağıtımının kaynak ağacına ihtiyaç duymadan ve
82 platforma bağımlı derleyici ve ilintileyici seçeneklerini bilmek zorunda
83 kalmadan istediği Apache httpd modülünü <program>apxs</program>
84 programını kullanarak derleyebilir.</p>
87 <section id="usage"><title>Kullanım Özeti</title>
89 <p>Apache HTTP Sunucusu 2.x’in DSO özelliklerine bir giriş olarak burada
90 kısaca bir bilgi vermekle yetinilecektir:</p>
93 <li><p>Kaynak dosyası <code>mod_filanca.c</code> dosyasında dağıtılan bir
94 <em>özgün</em> Apache htpd modülünü <code>mod_filanca.so</code> isminde
95 bir DSO modülü olarak derlemek ve kurmak için şöyle yapılır:</p>
98 $ ./configure --prefix=/kurulum/yeri --enable-filanca<br />
103 <li><p>Apache HTTP Sunucusunu tüm modüller etkin olarak
104 derleyebilirsiniz. Fakat sunucunun başlatılması sırasında sadece temel
105 modüller yüklenir. Daha sonra <code>httpd.conf</code> içindeki
106 <directive module="mod_so">LoadModule</directive> yönergelerini etkin
107 veya etkisiz hale getirerek yüklenecek modülleri
108 değiştirebilirsiniz.</p>
111 $ ./configure --enable-mods-shared=all<br />
116 <li><p>Bazı modüller sadece geliştiriciler içindir ve bunlar tüm
117 modüllerin derlenmesini (<em>all</em>) seçseniz bile derlenmeyecektir.
118 Geliştirici modülleri dehil tüm modülleri derlemek isterseniz
119 <em>reallyall</em> kullanınız. Ek olarak, derlenmiş modüller için
120 kullanılan <directive module="mod_so">LoadModule</directive>
121 yönergelerinin tamamını <code>--enable-load-all-modules</code> derleme
122 seçeneği ile etkin kılabilirsiniz.</p>
125 $ ./configure --enable-mods-shared=reallyall --enable-load-all-modules<br />
130 <li><p>Kaynak dosyası <code>mod_filanca.c</code> dosyasında dağıtılan bir
131 <em>üçüncü parti</em> Apache httpd modülü <code>mod_filanca.so</code>
132 isminde bir DSO modülü olarak Apache httpd kaynak ağacının dışında
133 <program>apxs</program> kullanarak derlemek ve kurmak için şöyle
137 $ cd /bir/kurulum/yeri<br />
138 $ apxs -c mod_filanca.c<br />
139 $ apxs -aci filanca mod_filanca.la
144 <p>Tüm durumlarda derlenen paylaşımlı modülü Apache httpd’nin etkin
145 kılabilmesi için <code>httpd.conf</code> dosyasında o modül için bir
146 <directive module="mod_so">LoadModule</directive> yönergesi
149 <p>Ayrıntılı bilgi için <a href="programs/apxs.html">apxs belgelerine</a>
153 <section id="background"><title>Artalan Bilgisi</title>
155 <p>Günümüzün Unix türevlerinde var olan bir mekanizma sayesinde
156 çalıştırılabilir bir programın adres uzayına çalışma anında yüklenmek
157 veya ilintilenmek üzere <em>Devingen Paylaşımlı Nesneler</em> (DSO -
158 Dynamic Shared Object) adı verilen, özel bir biçem kullanarak kodlanmış
159 program parçaları oluşturulabilir.</p>
161 <p>Bu yükleme normalde iki yolla yapılabilir: Ya çalıştırılabilir
162 programın başlatılması sırasında yüklenen <code>ld.so</code> adlı bir
163 sistem programınının devingen olarak yüklenmesi ile ya da
164 çalıştırılabilir programın içinden Unix yükleyicisine programsal sistem
165 arayüzü sağlayan <code>dlopen()/dlsym()</code> sistem çağrılarının elle
166 yapılması suretiyle.</p>
168 <p>İlk yöntemde kullanılan DSO’lara genelde <em>paylaşımlı
169 kütüphaneler</em> veya <em>DSO kütüphaneleri</em> adı verilir ve
170 bunların dosyaları <code>libfilanca.so</code> veya
171 <code>libfilanca.so.1.2</code> biçiminde isimlendirilir. Belli bir
172 sistem dizininde (normalde <code>/usr/lib</code>) bulunurlar ve derleme
173 sırasında ilintileyici komutuna <code>-lfilanca</code> şeklinde
174 belirtilerek çalıştırılabilir programla ilintilenirler. Doğrudan
175 çalıştırılabilir koda eklenen bu kodlar Unix yükleyicisinin programın
176 başlatılması sırasında kütüphaneyi <code>/usr/lib</code> altında
177 <code>libfilanca.so</code> adıyla bulabilmesini sağlar. Kütüphanelerin
178 aranacağı yerler ya <code>-R</code> gibi bir ilintileyici seçeneği ile
179 koda eklenir ya da arama yolları <code>LD_LIBRARY_PATH</code> ortam
180 değişkeni aracılığıyla yapılandırılır. Böylece çalıştırılabilir
181 programda henüz çözümlenmemiş simgeler DSO içinde bulunarak
184 <p>Çalıştırılabilir program içindeki simgelere normalde DSO içinden
185 atıfta bulunulmaz (genel kod kütüphanesinin başka programlarca da
186 kullanılması nedeniyle). Bu bakımdan DSO tarafında böyle bir çözümleme
187 yapılmaz. Çalıştırılabilir program da DSO’daki simgeleri kendisi
188 çözümlemeye uğraşmaz, bu işlemlerden tamamen Unix yükleyicisi
189 (<code>ld.so</code>) sorumludur. (Aslında, <code>ld.so</code>’yu
190 çağıracak kod, her çalıştırılabilir programın içine ilintilenmiş
191 (durağan değil) başlatma kodunun bir parçasıdır.) Programlar tarafından
192 ortaklaşa kullanılan kütüphanelerin devingen olarak yüklenmesinin sebebi
193 basittir: Kütüphane kodu <code>libc.so</code> gibi bir sistem
194 kütüphanesine bir kere kaydedilip disk alanından yer kazanılmış
197 <p>İkinci yöntemde kullanılan DSO’lara yine <em>paylaşımlı
198 kütüphaneler</em> veya <em>DSO kütüphaneleri</em> adı verilir fakat
199 bunların dosyaları geçerli kabule göre <code>filanca.so</code> gibi
200 isimlendirilse de genelde keyfi olarak seçilen bir dosya uzantısı
201 kullanılarak isimlendirilirler. Bu dosyalar genellikle programa özel bir
202 dizinde dururlar ve bu dosyaları kullanacak olan çalıştırılabilir
203 programla aralarında özdevimli olarak bağ kurulmamıştır. Bunun yerine,
204 çalıştırılabilir program DSO’yu çalışma anında <code>dlopen()</code>
205 sayesinde kendi adres uzayına ekler. Çalıştırılabilir program için
206 DSO’daki simgeler bu sırada çözümlenmez. Özdevimli olarak devreye
207 giren Unix yükleyicisi, (varsa) artakalan simgeleri, çalıştırılabilir
208 ihraç edilen simge kümelerini (ve özellikle her yerde hazır ve nazır
209 <code>libc.so</code> içindeki tüm simgeleri) kullanarak çözümler. Bu
210 yolla DSO, çalıştırılabilir programın simge kümesi bilgilerini sanki
211 kendisine baştan durağan olarak ilintilenmiş gibi ulaşabilir.</p>
213 <p>Son olarak, DSO’nun programlama arayüzünün getirilerinden yararlanmak
214 amacıyla çalıştırılabilir program, daha sonra dağıtım tabloları vb.
215 yerlerde kullanmak üzere <code>dlsym()</code> üzerinden DSO’daki belli
216 simgeleri çözümlemek zorundadır. Başka bir deyişle: Çalıştırılabilir
217 program ihtiyaç duyduğu her simgeyi kullanmak için kendisi çözümleme
218 yapmak zorundadır. Böyle bir mekanizmanın getirisi, programın isteğe
219 bağlı parçalarının gerekli olana kadar yüklenmemesidir (böylece daha az
220 bellek alanı kullanılır). Gerektiği zaman programın işlevselliğini
221 arttırmak amacıyla bu parçalar devingen olarak programa
224 <p>DSO mekanizmasının bu basit gibi görünen işleyişinde zorluk içeren bir
225 adım şudur (başkaları da olabilir): Bir programın işlevselliğini
226 genişletmek için DSO kullanılırken (ikinci yöntem) çalıştırılabilir
227 programdan DSO için simgelerin çözümlenmesi. Zorluğun sebebi,
228 "tersine çözümleme" yapılmasıdır; çalıştırılabilir programın simge
229 kümesindeki DSO simgeleri kütüphane tasarımına aykırı bir şekilde
230 çözümlenir ve bu uygulama tüm platformlarda hazır olarak
231 desteklenmediği gibi standartlaşmış da değildir. Geçer uygulamada
232 çalıştırılabilir programın evrensel simgeleri çoğunlukla yeniden dışa
233 verilmez ve bu bakımdan bir DSO içinde kullanılmaları uygun değildir.
234 Esas sorun, çalıştırılabilir bir programın işlevselliğini çalışma
235 anında genişletmek için DSO kullanımı sırasında ilintileyicinin tüm
236 evrensel simgeleri dışa vermesini zorlamanın bir yolunu bulmaktır.</p>
238 <p>Paylaşımlı kütüphane yaklaşımı bu bakımdan türünün tek örneğidir,
239 çünkü DSO mekanizması özellikle bunun için tasarlanmıştır, dolayısıyla
240 işletim sisteminin sağladığı hemen hemen tüm kütüphaneler için
244 <section id="advantages"><title>Getiriler ve Götürüler</title>
246 <p>Yukarıda bahsedilen DSO’ya dayalı özelliklerin getirileri
250 <li>Sunucu paketi çalışma anında daha esnektir çünkü, sunucuyu
251 oluşturan parçalar derleme sırasında <program>configure</program>
252 seçenekleriyle birleştirilmek yerine <code>httpd.conf</code> içinde
253 <directive module="mod_so">LoadModule</directive> yönergeleri
254 sayesinde çalışma anında birleştirilebilmektedir. Bu yolla, örneğin
255 tek bir Apache kurulumuyla birbirinden farklı yapılandırmalara sahip
256 çok sayıda sunucu çalıştırmak mümkündür. (standart veya SSL sürümü;
257 basitleştirilmiş veya devingen sürümü [mod_perl, PHP3], vs.)</li>
259 <li>Sunucu paketi kurulumdan sonra bile üçüncü parti modüllerle kolayca
260 genişletilebilir. Bu özellikle, bir Apache temel paketinin yanında
261 PHP, mod_perl, mod_security gibi ek paketler oluşturan paket
262 dağıtıcılarına büyük yarar sağlar.</li>
264 <li>Yeni Apache httpd modülleri için daha kolay prototip
265 geliştirilebilir: Modül kaynak kodunu DSO/<program>apxs</program> çifti
266 sayesinde Apache httpd kaynak ağacının dışında derleyip modülün yeni
267 bir sürümünü bir <code>apxs -i</code> komutunun ardından
268 <code>apachectl restart</code> yaparak çalışan bir Apache HTTP
269 Sunucusunda denemek daha kolay hale getirilmiştir.</li>
272 <p>DSO kullanımının götürüleri ise şunlardır:</p>
275 <li>İlk yüklemede %20 yavaşlama: Unix yükleyicisi simgeleri çözümlemek
276 zorunda olduğundan sunucu ilk başlatılırken yaklaşık %20 daha yavaş
277 faaliyete geçer.</li>
279 <li>Çalışma sırasında % 5 yavaşlama: Konumdan bağımsız kodun (PIC -
280 Position Independent Code) göreli adresleme için karmaşık oyunlara
281 girmesi ve bunun mutlak adresleme kadar hızlı olmaması nedeniyle
282 sunucu bazı platformlarda çalışma anında yaklaşık %5 daha yavaş
285 <li>DSO'nun tüm modüller için uygun olmaması: DSO modülleri bazı
286 platformlarda diğer DSO temelli kütüphanelerle ilintilenemediğinden
287 (<code>ld -lfilanca</code>) DSO mekanizmasını tüm modül türleri için
288 kullanamazsınız (örneğin a.out temelli platformlar bu işlevselliği
289 ELF temelli platformlar kadar iyi sağlamaz). Başka bir deyişle, DSO
290 dosyaları olarak derlenmiş modüllerin kullanabileceği simgeler ya
291 Apache httpd temel kodunda vardır ya Apache httpd temel kodunun
292 kullandığı C kütüphanesinde (<code>libc</code>) ve diğer durağan ve
293 devingen kütüphanelerde vardır ya da konumdan bağımsız kodu içeren
294 durağan kütüphane arşivlerinde (<code>libfilanca.a</code>)
295 vardır. Diğer modülleri kullanmak için tek şansınız ya Apache httpd
296 çekirdeğinin modüle bir atıf içermesini sağlamak ya da modül kodunu
297 <code>dlopen()</code> vasıtasıyla yüklemektir.</li>