Program Library HOWTO David A. Wheeler ú{êó / ìèMF takahiko@hakubi.co.jp version 0.75, 31 October 2000 Revision History Revision 0.75-J1 4 Dec 2000 vO}pÌ±Ì HOWTO ÅÍALinux ãÅvOCuðì¬Ag p·éû@ð_¶Ü·B±±ÉÍAÃICuA¤LCuA®IÉ [h³êéCuAªÜÜêÜ·B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª Table of Contents 1. ͶßÉ 2. ÃICu 3. ¤LCu 3.1. ñ©²Æ 3.1.1. ¤LCu¼ 3.1.2. t@CVXezu 3.2. CuÍÇÌæ¤Égíêé© 3.3. Â«Ï 3.4. ¤LCuÌì¬ 3.5. ¤LCuÌCXg[Ægp 3.6. ñÝ·Cu 4. ®IÉ[h³êé (Dynamically Loaded; DL) Cu 4.1. dlopen() 4.2. dlerror() 4.3. dlsym() 4.4. dlclose() 4.5. DL CuÌá 5. G^ 5.1. nm R}h 5.2. ÁÊÈÖ _init Æ _fini 5.3. ¤LCuÍXNvg»Å«é 5.4. GNU libtool 5.5. É[ɬ³ÈÀsÂ\t@C 6. ³çɽÌá 6.1. t@C libhello.c 6.2. t@C libhello.h 6.3. t@C demo_use.c 6.4. t@C script_static 6.5. t@C script_shared 6.6. t@C demo_dynamic.c 6.7. t@C script_dynamic 7. »Ì¼Ìîñ¹ 8. ì ÆCZX 1. ͶßÉ vO}̽ßÌ±Ì HOWTO ÍAGNU c[ZbgðgpµÄ¢é Linux ãÅvOCuðì¬Agp·éû@ð_¶Ü·B ``vO Cu'' ÆÍAPÉA ÆÅvOÉgÝÜêé±ÆÉÈéRpC ÏÝÌR[h (yÑf[^) ðÜÞt@C̱ÆÅ·BvOCu ÍAvOðAæèW [»µAæè¬ÄRpCÅ«Aæ èÈPÉXVÅ«éàÌɵܷBvOCuÍAOÂÌ^Cv\ \ÃICuA¤LCuA®IÉ[h³êé (dynamically loaded; DL) Cu\\ɪ޷é±ÆªÅ«Ü·B ±Ì¶ÍAÅÉAÃICu\\vOªÀs³êéOÉ»ÌÀ sÂ\vOÉgÝÜêéCu\\É¢Ä_¶Ü·B»ê©ç A¤LCu\\vOÀsÉ[h³êA©Â¡ÌvO ÔŤL³êéCu\\É¢Ä_¶Ü·BÅãÉA®IÉ[h³ê é (dynamically loaded; DL) Cu\\vOÀsÌCÓÌ_ Å[hµÄgp·é±ÆªÂ\ÈCu\\É¢Ä_¶Ü·B DL CuÍAÀÛÉÍÙÈéCu`®Æ¢¤í¯ÅÍ èܹñ (ÃI Cuà¤LCuà DL CuƵÄgp·é±ÆªÂ\Å·) B»ÌãíèÉAvO}ª DL CuðÇÌæ¤Égp·é©Æ¢¤ _ɨ¢ÄAᢪ èÜ·BHOWTO ÍA³çɽÌáð°Ä¢éÍA» ̼Ìîñ¹ÖÌQÆð°Ä¢éÍAðàÁÄI¹µÜ·B ±Ì HOWTO ÍÀsÂ\t@CÆCu̽ßÌ Executable and Linking Format (ELF) `®\\ð¡ÌÙÆñÇSÄÌ Linux fBXgr [VÅgp³êÄ¢é`®\\É¢ÄÌÝ_¶Ü·B GNU gcc c[Z bgÍAÀÛÉÍ ELF ÈOÌCu`®ðµ¤±ÆªÅ«Ü·BÁÉAÙ ÆñÇÌ Linux fBXgr [VÅÍA®Ì a.out `®ð¡È¨g p·é±ÆªÂ\Å·Bµ©µÈªçA±êçÌ`®Í±Ì¶ÌÎÛOÅ· B ¤LCuðwµÄ dynamically linked libraries (DLL) Æ¢¤pêð g¤lª¢é±ÆA»Ì DLL Æ¢¤pêð DL CuƵÄgp³êéC ÓÌCuðÓ¡·é½ßÉg¤lª¢é±ÆAܽAÇ¿ç©Ìðð ½·CuðÓ¡·é½ßÉ DLL Æ¢¤pêðg¤lª¢é±ÆAÉÍ Óµ½Ù¤ªæ¢Å·B¢¸êÌÓ¡ðæèã°éɵÄàA±Ì HOWTO Í Linux ãÅ̱êçSÄÌ DLL É¢ÄJo[µÜ·B ½ÌVXeÉÚA³êéAvP[Vð쬵ĢéÈçÎACu ð\zµCXg[·éÌÉALinux c[ð¼Úgp·éãíèÉ GNU libtool <http://www.gnu.org/software/libtool/libtool.html> ðgp· é±Æðl¶µ½Ù¤ªæ¢©àµêܹñBGNU libtool ÍA¤LCu gpÌ¡G³ (á¦ÎA»êçð쬵CXg[·éÈÇ) ðêÑ«Ì é|[^uÈC^[tF[XÅB·AÄpIÈCuT|[gXN vgÅ·BLinux ãÅÍAGNU libtool Í±Ì HOWTO ÉLq³êÄ¢éc[ ƵKÌãÉ\z³êĢܷB®IÉ[h³êéCuÖÌ|[^ uÈC^[tF[XpÉAlXÈ|[^reBbp[ðgp·é±Æ ªÅ«Ü·BGNU libtool ÍA ``libltdl'' ÆÄÎêé»ÌíÌbp[ðÜ ñŢܷB¼ÌIðƵÄÍAÂÀ«Ì éû@Å®I[fBOðT |[g·é glib Cu (glibc Ƭ¯µÈ¢Å¾³¢) ðgp·é± ÆàÅ«Ü·Bglib É¢ÄÍA http://developer.gnome.org/doc/API/glib /glib-dynamic-loading-of-modules.html ųçÉmé±ÆªÅ«Ü·BÄx q×Ü·ªALinux ãÅÍA±Ì@\ÍA±Ì HOWTO àÉLq³êÄ¢é\¬ ¨ðgp·é±ÆÉæÁÄÀ³êĢܷBàµà ȽªÀÛÉ Linux ã ÅR[hðJAàµÍfobOµÄ¢éÈçÎA¨»çȨ³çÌ±Æ A±Ì HOWTO àÌîñð~³êé±Æŵå¤B ±Ì HOWTO ÌêzzêÍ http://www.dwheeler.com/program-library Å èALinux Documentation Project (http://www.linuxdoc.org) Éñ¡³ê ĢܷBì Í David A. Wheeler É è (Copyright (C) 2000)A General Public License (GPL) ÅCZX³êĢܷB³çÈéîñÉ ¢ÄÍÅãÌÍðÇñž³¢B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 2. ÃICu ÃICuÍAÊíÌIuWFNgt@CÌPÈéWÌÅ·BµKI ÉAÃICuÍ ``.a'' Æ¢¤g£qð¿Ü·B±ÌWÌÍAar (archiver) vOðgpµÄ쬳êÜ·BÃICuÍÈOÙÇÉ ÍgíêÈÈÁĢܷªA»êÍA¤LCuÌÙ¤ªDêÄ¢é± ÆÉæèÜ· ( ÆÅq×Ü·)B»êÅàܾAÃICuÍX쬳 ê\\ͶßÍðjIÈRŶݵĢ½ÌÅ·ª\\AྷéÌàæè ÈPÅ·B [UÍAR[hðÄRpC·éKvàÈÃICuðvO ÉN·é±ÆªÅ«AÄRpCÉ©©éÔðßñÅ«Ü·B\\ ð¡Ìæè¬ÈRpC̱Æðl¦êÎAÄRpCÔÍdvÅÍ ÈÈÁīĢܷ\\»Ì½ßɱÌRt¯ÍÈOÙÇLÍÅÍ èÜ ¹ñBÃICuÍA»ÌJÒªACuÖN·é±Æðv O}ÉÂ͵½¢ªCu\[XR[hÍnµ½ÍÈ¢AÆ¢¤ê ɵεÎðɧ¿Ü· (±êÍCux_[ÉÆÁÄÍDsÅ· ªA»ÌCuðg¨¤ÆµÄ¢évO}ÉÆÁÄ;ç©ÉDs Æ;¦Ü¹ñ)B_IÉÍAÀsÂ\t@CÉN³êéÃI ELF CuàÌR[hÍᱬ (1-5%) ®ì·é͸ŷªAÀÛÉÍA¼Ì ²¿á²¿áµ½vö̽ßA»ÌÊèÉÈé±ÆÍHÌæ¤Å·B ÃICuð쬷éAàµÍùɶݷéÃICuɳçÉI uWFNgt@CðÇÁ·éÉÍAÌæ¤ÈR}hðgpµÄ¾³¢ \\ ar rcs my_library.a file1.o file2.o ±ÌR}háÅÍAÃICu my_library.a ÉIuWFNgt@C file1.o Æ file2.o ðt¯Á¦Ä¢Ü·Bܾ my_library.a ª¶ÝµÄ¢È ¯êÎA쬵ܷBÃICuì¬ÉֵijçÉîñð¾éÉÍAar (1) ðQƵľ³¢B êxÃICuð쬵ĵܤÆA»êðg¢½Èé±Æŵå¤B ÀsÂ\vOð쬷éÆ«ÉRpCÆNÌêƵÄÄ ÑÞ±ÆÅA¤LCuðgpÅ«Ü·BÀsÂ\t@Cð쬷é ÌÉ gcc(1) ðgÁÄ¢éÈçÎACuðwè·éÌÉ -l IvV ðgpÅ«Ü·BæèÚµ¢îñÉ¢ÄÍ info:gcc ðQƵľ³¢B -l Æ -L IvVðgÁÄAJ ld(1) ð¼Úgp·é±ÆàÅ«Ü· Bµ©µÈªçAld(1) ÌC^[tF[XÍ gcc(1) æèàÏX³êâ·¢ ÌÅAÙÆñÇÌêÍ gcc(1) ðg¤Ù¤ªæ¢Å·B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 3. ¤LCu ¤LCuÍAvOªN®·éÆ«É[h³êéCuÅ· B¤LCuªKØÉCXg[³êéÆA»ÌãÉN®³êéSÄÌ vOÍA©®IÉ»ÌVµ¢¤LCuðg¤±ÆÉÈèÜ·BÀ ÛÉÍA±êÈãÉÍé©É_îÅôû³êĢܷBÆ¢¤ÌÍA Linux É æéAv[`Í̱ÆðÂ\É·é©çÅ·\\ E CuðXVµÈªçàA»ÌCuÌÃÄãûÝ·«ÌÈ¢ o[Wðg¢½¢Æ¢¤vOðAËRƵÄT|[gÅ«é E ÁÊÈvOðÀs·éÆ«AÁèÌCuAàµÍCu àÌÁèÌÖų¦I[o[ChÅ«é E ùɶݵĢéCuðgpµÄvOª®¢Ä¢éÔÉàA ±ÌSÄð¨±È¤±ÆªÅ«é ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 3.1. ñ©²Æ ±êçÌ]ܵ¢Á«·×Äð¤LCuªT|[g·é½ßÉÍA½ ̵KÆwjÉ]íȯêÎÈèܹñBCu̼OAÁÉ ``soname'' Æ ``real name'' Ìá¢É墀 (yÑ»êçªÇÌæ¤ÉÝìp·é©É ¢Ä) ð·éKvª èÜ·BܽA»êçªt@CVXeàÌÇÌ êÉu©êé׫Šé©É¢ÄàAð·éKvª èÜ·B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 3.1.1. ¤LCu¼ SÄ̤LCuÍA``soname'' ÆÄÎêéÁÊȼOðÁĢܷB soname Í ``lib'' Æ¢¤vtBbNXACu̼OA``.so'' Æ¢ ¤åð¿AsIhÆAC^[tF[XªÏX³êéÆ«ÉÍK¸â³ êéo[WÔªãɱ«Ü· (ÁÊÈáOƵÄAÅáxÌ C C uÍ ``lib'' ÅÍnÜèܹñ) B®SÉLq³ê½ soname ÍA»Ì Cu©gªÜÜêéfBNgðvtBbNXƵÄÜñŢܷB ÀÛÌVXeÅÍA®SÉLq³ê½ soname ÍA¤LCuÌ ``real name'' ÖÌPÈéV{bNNÉÈÁĢܷB SÄ̤LCuÍA``real name'' \\ÀÛÌCuR[hðÜÞ t@C¼\\àÁĢܷBreal name ÍA soname ÉAsIhA}C i[ÔAà¤êÂsIhA[XÔAðÁ¦½àÌÅ·BÅãÌs IhÆ[XÔÍÈÄà©Ü¢Ü¹ñB}Ci[ÔÆ[XÔÍ AÇÌo[WÌCuªCXg[³êÄ¢é©ð³mɦµAÝ èÇ̯ÆÈèÜ·B±êçÌÔÍA\\»Ìæ¤É·êΨðæè P»Å«éÉà©©íç¸\\hL gÌÅCuðྷéÌ Ép¢çêÄ¢éÔƯ¶ÅÍÈ¢©àµêÈ¢AÆ¢¤±ÆÉ ¾³¢B Á¦ÄACuvÉRpCªgp·é¼OÆ¢¤àÌà èÜ· (``linker name'' ÆÄÚ¤Æv¢Ü·) B»êÍAPÉAêØÌo[WÔ ðæ袽 soname Å·B ¤LCuðÇ·é®ÆÈéÌÍA±êç̼OÌg¢ª¯Å·BKv ÆÈé¤LCuÌê\ðàÉ쬷éÆ«ÉÍAvOÍAK vÆÈé soname ðXgAbv·éÌÝƵܷBtÉA¤LCuð 쬷éÆ«ÉÍA(æèÚ×Èo[WîñðÂ) ÁèÌt@C¼Å Cuð쬷éÌÝƵܷBVµ¢o[WÌCuðCXg [·éÆ«ÉÍAñAOÌÁÊÈfBNg̤¿ÌêÂÉ»êðCX g[µA»ê©ç ldconfig(8) vOðÀsµÜ·Bldconfig ÍAù ɶݷét@Cð²×Areal name ÖÌV{bNNƵÄA soname ð쬵ܷB¯lɵÄALbV t@C /etc/ld.so.cache à ÝèµÜ· (·®Éྵܷ)B ldconfig Í linker name ðÝèµÜ¹ñBT^IÉÍA±ÌÝèÍCu CXg[ɨ±ÈíêA``ÅVÌ'' soname àµÍÅVÌ realname ÖÌPÈéV{bNNƵÄAlinker name ªì¬³êÜ·BÙÆñ ÇÌêɨ¢ÄACuðXVµ½çANÉ»êð©®IÉgp µ½¢Æv¤Åµå¤©çAsoname ÖÌV{bNNÆµÄ linker name ðìÁĨ±Æð¨©ßµÜ·BÍAȺ ldconfig Í©®IÉ linker name ðÝèµÈ¢Ì©ðAH. J. Lu ÉqËܵ½BÞÌà¾ÍAî{ IÉÍAuCuÌÅVo[WðgÁÄR[hðÀsµ½¢Ævíê é©àmêܹñªA»¤ÅÍÈA(¨»çÝ·«ÌÈ¢) âCu ÉN·éJð]ñÅ¢éÆ¢¤±Æà è¤éÌÅ·vAÆ¢¤àÌÅ µ½B»Ì½ßAldconfig ÍA ȽªÇÌCuÉvOðN ³¹½¢Ì©Æ¢¤±ÆÉ¢ÄÍA½Ì¼è਱ȢܹñBÅ·ÌÅA JªCuÉg¤àÌðXV·é½ßÉÍACXg[ªV{ bNNð¾mÉÏXµÈ¯êÎÈçÈ¢ÌÅ·B á¦ÎA/usr/lib/libreadline.so.3 Í®SÉLq³ê½ soname Å èA ldconfig ª /usr/lib/libreadline.so.3.0 Æ¢¤æ¤È½ç©Ì real name ÉηéV{bNNƵÄÝè·éàÌÅ·B /usr/lib/ libreadline.so Æ¢¤ linker name à¶Ý·é׫ÅA»êÍA /usr/lib/ libreadline.so.3 ðQÆ·éV{bNNÉÈé±Æŵå¤B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 3.1.2. t@CVXezu ¤LCuÍt@CVXeÌDZ©Ézu³êȯêÎÈèܹñB ÙÆñÇÌI[v\[X\tgEFAÍAGNU KÉ]¤Xüª èÜ·\ \Ú×Í info:standards#Directory_Variables É é info t@ChL gð©Ä¾³¢B GNU KÍA\[XR[hðzz·éÆ«AftH gÅÍSÄÌCuð /usr/local/lib ÉCXg[·é±Æ𧵠Ģܷ (SÄÌR}hª /usr/local/bin Éüé׫¾Æà©ßĢܷ) BܽA±êçÌftHgðI[o[Chµ½èACXg[[` ðÄÑoµ½è·é½ß̵KðÍÁ«èq×ĢܷB t@CVXeKwK (Filesystem Hierarchy Starndard; FHS) ÍAfB Xgr [Vɨ¢Ä½ªÇ±ÉCXg[³êé׫©ð_¶Ä¢ Ü· (http://www.pathname.com/fhs ð©Ä¾³¢) B FHS É]¦ÎAÙÆ ñÇÌCuÍ /usr/lib ÉCXg[³êé׫ŷªAN®ÉKv ƳêéCuÍ /lib ÉA»µÄVXeÌêÉÈÁÄ͢ȢC uÍ /usr/local/lib ÉCXg[³êé׫ŷB ÀÛÉÍA±êçñÂ̶ÔÉµÍ èܹñBGNU KÍA\[XR[ hJÒ̽ßÌftHgð§µÄ¢éÌÅ èAêûÅ FHS ÍAfBX gr [^ (ÊíAVXepbP[WÇVXeðʵÄ\[XR[h ÌftHgðIðIÉI[o[Ch·élX) ̽ßÌftHg𧠵ĢéÌÅ·BÀÛɱêͤÜ@\µÄ¢Ü·B Ƚª_E[h µ½ ``ÅVÌ'' (¨»çoO¾ç¯Ì!) \[XR[hÍA©®IÉ©ª© gð ``[JÈ'' fBNg (/usr/local/) ÉCXg[µÜ·B» µÄR[hª¬nµÄ«½çApbP[WÇc[ÍAfBXgr [V pÌWIÈÊuÉR[hðzu·é½ßÉftHgðPÉI[o[ ChÅ«Ü·B ȽÌCuªACuoRŵ©ÄÑo³êé± ÆÌÈ¢vOðÄÑoµÄ¢éÌÈçÎA»êçÌvOð /usr/ local/libexec ( éfBXgr [VÅÍ /usr/libexec ÉÈèÜ·) Ézu·é׫ŷBêÂÔð¡GɵĢé±Æª ÁÄA»êÍA Red Hat ©çh¶µ½VXeªftHgÅÍ /usr/local/lib ðCu õÎÛÉÜßĢȢƢ¤±ÆÅ·B /etc/ld.so.conf ÉÖ·éºLÌc_ ð©Ä¾³¢B¼ÌWIÈCuP[VƵÄÍAX Window System pÌ /usr/X11R6/lib ªÜÜêÜ·B /lib/security Í PAM W [ pÉgíêÜ·ªA»êçÍÊí DL Cu (±êà ÆÅྵܷ) ƵÄ[h³êéAÆ¢¤±ÆÉӵľ³¢B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 3.2. CuÍÇÌæ¤Égíêé© GNU glibc x[XÌVXe\\SÄÌ Linux VXeðÜÝÜ·\\ÅÍA ELF oCiÀst@CðN®³¹éÆA©®IÉvO[_ª[ h³êAÀs³êÜ·B Linux VXeãÅÍA±Ì[_Í /lib/ ld-linux.so.X (X ÉÍo[WÔªüèÜ·) Æ¢¤¼OÅ·B±Ì[ _ÍAvOÉæÁÄgp³êé»Ì¼ÌSÄ̤LCuðT µoµA[hµÜ·B õÎÛÆÈéfBNgÌXgÍA/etc/ld.so.conf t@CàÉ© êĢܷBRed Hat ©çh¶µÄ¢éfBXgr [V̽ÍAÊ í /etc/ld.so.conf t@CàÉ /usr/local/lib ðÜßĢܹñBͱ êðoO¾Æl¦Ä¨èAܽA/usr/local/lib ð /etc/ld.so.conf ÉÇÁ ·é±ÆÍA Red Hat ©çh¶µÄ¢éVXeãŽÌvOðç ¹é½ßÉKvƳêéA¤ÊÌ ``C³'' ¾ÆvÁĢܷB CuàÌô©ÌÖðI[o[Chµ½¢¾¯ÅAcèÍ»ÌÜÜ ÉµÄ¨«½¢ÈçÎAI[o[Ch·éCu (.o t@C) ̼O ð /etc/ld.so.preload Éüêé±ÆªÅ«Ü·B±êçÌ ``æsµÄ[h ·é'' CuÍAWZbgÉæsµÜ·B±ÌæsµÄ[h·ét@ CÍAT^IÉÍÙ}pÌpb`ƵÄgíêÜ·BfBXgr [V ÍAÊíAzz³êéÛɱÌæ¤Èt@CðÜÞ±ÆÍȢŵå¤B vON®É±êçSÄÌfBNgðõ·éÌÍAÆÄàñø¦ IÈÌÅAÀÛÉÍLbV zuªgíêÜ·B ldconfig(8) vOÍ ftHgÅ /etc/ld.so.conf t@CðÇÝÝAKØÈV{bN Nð®INfBNgàÉÝèµÜ· (»Ì½ßAW̵Kɤ± ÆÉÈèÜ·) B»ê©çALbV ð /etc/ld.so.cache \\ ÆÅ¼Ì vOÉgíêÜ·\\É«ÝÜ·B±êÍACuÖÌANZ XðñíɬµÜ·BÃÙIɾ¦é±ÆÍADLL ªÇÁ³ê½Æ«ÍK¸ AàµÍADLL ªí³ê½èA DLL fBNgÌZbgªÏ»µ½Æ« ÉÍAldconfig ªÀs³êȯêÎÈçÈ¢AÆ¢¤±ÆÅ·Bldconfig Ì ÀsÍACuCXg[ÉpbP[WÇc[ÉæÁĨ±Èí êéXebvÌêÂÅ é±Æª½¢Å·B»êÈ~AN®ÉÍA®I[ _ÍÀÛÉ /etc/ld.so.cache t@Cðg¢AKvÆ·éCuð[ hµÜ·B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 3.3. Â«Ï lXÈ«Ϫ±Ìèð§äÅ«Ü·BÀA±ÌèðI[o [Ch·éÌÉg¦é«Ϫ¶ÝµÜ·Bá¦ÎA±ÌÁêÈÀsðA êIɼÌCuÅãÖ·é±ÆªÅ«Ü·B Linux ÅÍAÂ«Ï LD_LIBRARY_PATH ÍAWIÈfBNgQÉæ§ÁÄCuªõ³ êé׫fBNgQðARÅæØÁÄÀ×½àÌÅ·B±êÍAVµ ¢CuðfobOµÄ¢éÆ«âAÁÊÈÚI̽ßÉñWIÈC uðgpµÄ¢éÆ«ÉÖÅ·BÂ«Ï LD_PRELOAD ÍAWZbg ðI[o[Ch·éIuWFNgt@CðÖƤÉA¿å¤Ç /etc/ ld.so.preload Ũ±ÈíêÄ¢éæ¤ÉAñµÜ·B±êçÌ@\ÍA/ lib/ld-linux.so [_ÉæèÀ³êĢܷB LD_LIBRARY_PATH Í½Ì Unix CNÈVXeãÅ@\µÜ·ªASÄÌVXeãÅ®í¯ÅÍÈ ¢±ÆÉӵܵå¤Bá¦ÎAHP-UX Å௶@\ªpÅ«Ü·ªA» êÍ SHLIB_PATH ƵÄÅ·µAAIX ÅÍ LIBPATH ðʶÄÆ¢¤±ÆÉÈè Ü·BܽALD_LIBRARY_PATH ÍJâeXgÉÍÖÅÍ èÜ·ªAÊí gp̽ßÉCXg[ÉC³³êé׫ÅÍ èܹñB±ÌRÌà ¾É¢ÄÍA http://www.visi.com/~barr/ldpath.html Ì ``Ⱥ LD_LIBRARY_PATH Í¢¯È¢Ì©'' ðQƵľ³¢B ÀÛÉÍA[fBOèð§ä·é«ÏÍÙ©Éཱིñ¶Ý µÜ·B»êç̼OÍALD_ â RTLD_ ÅͶÜèÜ·B»êçÌÙÆñÇÍ A[_ÌáxÈfobOâAÁ껳ê½PCpreBðÀ· é½ßÌàÌÅ·BÙÆñÇÍA\ªÉhL g»³êĢܹñB»ê çÉ¢ÄméKvª éÈçÎAwK·éàÁÆàæ¢û@ÍA\[XR[ hðÇÞ±ÆÅ·B ÁÊÈΪȳêÈ¢ÈçÎA®IÉN³êéCuÉηé§ä ð[UÉFßéÆ¢¤±ÆÍAsetuid/setgid vOÉÆÁÄÍßSÈ àÌÉÈéŵå¤B»Ì½ßAGNU [_ÅÍAvOª setuid àµ Í setgid ³êÄ¢éêA±êçÌÏ (yÑÞÌÏ) ͳ³êé ©AàµÍA»êçªÅ«é±ÆÍåɧÀ³êÜ·B[_ÍAvO ÌMCØ (credential) ð²×é±ÆÉæÁÄA»ÌvOª setuid àµÍ setgid ³êÄ¢é©Ç¤©ðmFµÜ·Bàµà uid Æ euid ªÙ Èé©AàµÍ gid Æ egid ªÙÈéÈçA[_Í»ÌvOª setuid/setgid ³êÄ¢é (àµÍ»Ìæ¤ÈvO©çÀs³ê½) ÆèµANðRg[·é\ÍðåɧÀµÜ·B GNU glibc CuÌ\[XR[hðÇßÎA±êÉ¢ĩé±ÆªÅ«éÅ µå¤BÁÉAelf/rtld.c t@CÆ sysdeps/generic/dl-sysdep.c t@C ð©Ä¾³¢B±êÍAuid Æ gid ð euid Æ egid ɵµÄ©çv OðÄ×αêçÌϪ®SÉ@\·éAÆ¢¤±ÆðÓ¡µÄ¢Ü ·B»Ì¼Ì Unix CNÈVXeÍA±ÌóµðÙÈéû@ŵ¢Ü·ª A¯¶R\\setuid/setgid vOÍ«ÏQÉæÁÄßxÉe¿ð ó¯é׫ÅÍȢƢ¤R\\ÉæèÜ·B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 3.4. ¤LCuÌì¬ ¤LCuÌì¬ÍÈPÅ·BܸͶßÉAgcc Ì -fPIC tO (±ê ÍA¤LCuÉKvƳêé ``ÊuƧR[h (position independent code)'' ̶¬ðÂ\ɵܷ) ðgÁÄA¤LCuÉgÝÜêé± ÆÉÈéIuWFNgt@Cð쬵ܷB»ê©çAÌ`®ðgÁĤ LCuð쬵ľ³¢\\ gcc -shared -Wl,-soname,your_soname \ -o library_name file_list library_list ñÂÌIuWFNgt@C (a.o Æ b.o) ð쬵A±êç¼ûðÜÞ¤L Cuð쬷éáð±±É°Ü·BRpCªAfobOîñ (-g) ðÜÝAxbZ[W𶬷é (-Wall) Æ¢¤±Æ\\±êçͤ LCuÉKvÆͳêܹñª§³êÜ·\\ÉÍӵľ³¢ BRpCÍ (-c ðgÁÄ) IuWFNgt@C𶬵A»µÄA v³êé -fPIC IvVðÍÁ«èÆÜÞ±ÆÉÈèÜ·B gcc -fPIC -g -c -Wall a.c gcc -fPIC -g -c -Wall b.c gcc -shared -Wl,-soname,libmystuff.so.1 \ -o libmystuff.so.1.0.1 a.o b.o -lc ӷ׫±Æªô© èÜ·\\ E ¶¬³ê½Cuð strip µÈ¢Å¾³¢Bܽ{ÉKvÅÈ¢ ÀèRpCIvV -fomit-frame-pointer ðgíȢž³¢ B¶¬³ê½CuÍ@\·éŵ太A±êçÌìÆÍAfob KðÙÆñÇg¢¨ÉÈçȵĵܢܷB E R[h𶬷éÉÍA-fpic ÅÍÈA-fPIC ðgÁľ³¢ (OÒ Í@\µÈ¢±Æà èÜ·BÆ¢¤ÌÍAªòªåKÍÈzu]·ðK vÆ·éêA-fpic Í®SÈÊuƧR[h𶬵Ȣ©àµêÈ¢ ©çÅ·)B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 3.5. ¤LCuÌCXg[Ægp êx¤LCuð쬵ĵܤÆA»êðCXg[µ½Èé±Æ ŵå¤BÈPÈû@ÍAWIÈfBNg (á¦Î /usr/lib ÈÇ) Ì êÂÉA»ÌCuðRs[µAldconfig(8) ðÀs·é±ÆÅ·B àµà±êªÅ«È¢ÈçÎ (á¦ÎA Ƚª /usr/lib ðÏX·é ð ÁĢȢÈÇ)AÔð§ä·é½ßÉ«Ïðgp·é±ÆªÅ«Ü· BܸͶßÉADZ©É¤LCuð쬷éKvª éŵå¤B» ê©çAKvÈV{bNNAÁÉ soname ©ç real name ÖÌV{ bNN (¯lÉAo[WÔðÜÁ½wèµÈ¢[U̽ßÉ Ao[WÔÌÈ¢ soname AÂÜèA``.so'' ÅIíé soname ©çÌ V{bNNà) Ýè·éKvª éŵå¤BàÁÆàÈPÈû@Í AÌR}hCðÀs·é±ÆÅ·\\ ldconfig -n directory_with_shared_libraries »ê©çALD_LIBRARY_PATH \\¢ÂàÌêæèàæɤLCuÌ õÎÛÆÈéfBNgÌXgðRÅæØÁ½àÌ\\ðÝèµÜ· Bbash ð¨g¢Åµ½çAÌû@Å my_program ðÀsÅ«Ü·B LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH my_program ô©ÌIð³ê½ÖðI[o[Chµ½¢¾¯ÈçÎAI[o[Ch ·éIuWFNgt@Cðì¬µÄ LD_PRELOAD ðÝè·é¾¯ÅÂ\Å· B±ÌIuWFNgt@CàÌÖÍAÎÛÆÈÁÄ¢éÖ¾¯ðI[o [ChµÜ·B iÍASz·éKvàÈCuðXVÅ«Ü·Bàµà API ÌÏXª éÈçÎACuì¬ÒÍ soname ðÏX·éŵå¤Bµ©µÈªç Aàµà¯¶ soname ÌÜÜÌCuÉηéXVÂɨ¢ÄA év OªfµÄµÜ¤æ¤ÈçAâCuðDZ©ÉRs[µA» ÌvO̼OðÏX·é±ÆÉæÁÄ (â¼OÉ ``.orig'' ðt¯« ·ÈÇ) A§IÉâCuo[Wðg¤±ÆªÅ«Ü·Bgp· éCuðÄÝèµAÀÛÉÀs·é (¼OðÏX³ê½) vOð ÄÑo·½ß̬³È ``bp['' XNvgà쬵ľ³¢BÔt ¯ÌµKÍA¯êfBNgàÉ¡Ìo[Wª¶Ý·é±ÆðÂ\É µÄ¢Ü·ªA¨]ÝÈçAâCuð»êÆ©ÌÁÊÈêÉu± ÆàÅ«Ü·Bbp[XNvgÍAÌæ¤ÈàÌÉÈéŵå¤\\ #!/bin/sh export LD_LIBRARY_PATH=/usr/local/my_lib:$LD_LIBRARY_PATH exec /usr/bin/my_program.orig $* ldd(1) ðg¦ÎA évOÉæÁÄgp³êÄ¢é¤LCuÌ Xgð²×é±ÆªÅ«Ü·Bá¦ÎAÌæ¤É^Cv·êÎA ls ÉæÁ Ägp³êÄ¢é¤LCuðmF·é±ÆªÅ«Ü·\\ ldd /bin/ls êÊIÉÍAvOÌ˶·é soname ÌXgªA¼OðãÌfB Ng¼Æ¤É¾çêÜ·BÀÛÉÍSÄÌêɨ¢ÄAÈÆàñÂÌ Ë¶vfð©é±ÆÉÈéŵå¤\\ E /lib/ld-linux.so.N (N ÍA1 ©»êÈãB½¢Ä¢ÍÈÆà 2) B ±êÍA¼ÌSÄÌCuð[h·é½ßÌCuÅ·B E libc.so.N (N ÍA6 ©»êÈã) B±êÍ C CuÅ·B¼Ì¾ê ų¦AC Cuðgp·éXüª èÜ· (ÈÆà»êç©g ÌCuðÀ·é½ßÉ) B»Ì½ßAÙÆñÇÌvOÍ ÈÆà±ÌCuÍÜñŢܷB Ó\\MpÅ«È¢vOÉ뵀 ldd ðÀsµÄÍ¢¯Ü¹ñB±ê É¢ÄÍA ldd(1) Ì}j AžmÉq×çêĢܷB ldd ÍAY vOð¼ÚÄÑo·±ÆÅ@\µÄ¢Ü·BMpÅ«È¢vOª \úµÄ¢È¢R[hðÀsµÄµÜ¤±Æª è¦Ü·B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 3.6. ñÝ·Cu Vµ¢o[WÌCuªÃ¢àÌÆoCiñÝ·Å éÆ«ÍA soname ðÏX·éKvª èÜ·BC ɨ¢ÄÍACuªoCiÝ· ÅÍÈÈÁĵܤlÂÌî{IÈRª èÜ·B 1. ³ÌdlÉKµÈ¢æ¤ÉÖÌ®ìªÏX³êĵܤ 2. GNX|[g³êéf[^ÚªÏX³êĵܤ (áO\\\¢Ìª CuàÅÌÝAP[g³êéêÉÀèA\¢ÌÌöÉCÓÌ ÚðÇÁ·éÌÍâèÈ¢) 3. GNX|[g³êÄ¢éÖªí³êĵܤ 4. GNX|[g³êÄ¢éÖÌC^[tF[XªÏX³êĵܤ ±êçÌRðñðÅ«éÈçÎACuðoCiÝ·ÉÛ±ƪŠ«Ü·BÊ̾¢ûð·éÆA±êçÌÏXðð¯êÎAApplication Binary Interface (ABI) Ý·ðÛ±ƪūéAÆ¢¤±ÆÅ·Bá¦ÎAVµ¢ ÖðÇÁµ½¢¯êÇàâÖðíµ½ÍÈ¢©àµêܹñB\¢ ÌÌöÉÌÝACeðÇÁµACuɾ¯»Ì\¢ÌðAP[g ·é±Æðµ (AvP[VÉ͵Ȣ)A»ÌÇÁÌACeð IvVµ¢É·é (àµÍCuª»êçð½·æ¤É·é)AÈ ÇÌìð¨±ÈÁĶ¶½ÏXªAâvOÉεÄe¿ð^¦È¢ ±ÆðmFÅ«éêÉÌÝAACeðÇÁ·é±ÆªÅ«Ü·BCðt¯ ľ³¢Bàµà[Uª\¢ÌðzñÅgÁÄ¢éÈçÎA»Ì\¢ÌÍ g£Å«Ü¹ñB C++ (¨æÑARpCÏÝgÝev[gÂ^ÍRpCÏÝÌ fBXpb`³êé\bhðT|[g·é»Ì¼Ì¾ê) ÅÍAóµÍæè ¡GÉÈèÜ·BãLÌâè_SĪKp³êéãA³çɽÌâèª è Ü·BRÍAô©ÌîñªRpC³ê½R[hàÉ ``B³ê½óÔÅ '' À³êÄ¢éÆ¢¤±ÆÉ éÌÅ·ªA±Ì±ÆªA C++ ªêÊIÉ ÇÌæ¤ÉÀ³êÄ¢é©ðmçÈ¢lÉÍ檩çÈ¢æ¤È˶âè ðø«N±µÄµÜ¤ÌÅ·B³mɾ¦ÎA»êçÍ ``Vµ¢'' âèÅÍ èܹñBPÉARpCÏÝÌ C++ ÌR[hªA ȽðÁ©¹é±Æ ÉÈé©àµêÈ¢û@Å»êçÌâèðø«N±·Æ¢¤±ÆÈÌÅ·B ÌàÌÍAoCiÝ·ðÛ·é½ßÉ C++ àÅâÁÄÍ¢¯È¢ÚÌ Xg (¨»çs®SÅ·ª) Å èA Troll Tech eNjJ FAQ <http:// www.trolltech.com/developer/faq/tech.html#bincomp> Éæèñ³êÄ¢é àÌÅ·B 1. oÖðÄÀµ½àÌðÇÁ·é (âoCiª³ÌÀðÄÑ o·ÌªÀSÅÍÈ¢ê)BÆ¢¤ÌÍARpCÍ SuperClass:: virtualFunction() ÄoµðRpCÉ]¿·é©çÅ· (N ÅÍ èܹñ)B 2. ¼zoÖðÇÁܽÍí·éBÆ¢¤ÌÍA±ÌìÆÍSTuN X̼zÖe[uÌTCYÆzuðÏX·é¾ë¤©çÅ·B 3. CCoÖoRÅANZX³ê¤éf[^oÌ^CvðÏ Xµ½èAܽͻêçðÚ®³¹½è·éB 4. NXKwðÏX·éB½¾µA[t (óFºÊNXð½È¢N X) ÌVKÇÁðB 5. private f[^oðÇÁܽÍí·éBÆ¢¤ÌÍA±ÌìÆÍS TuNXÌTCYÆzuðÏX·é¾ë¤©çÅ·B 6. public àµÍ protected oÖªCCÖÅÈ¢êÉA »êçðí·éB 7. public àµÍ protected oÖðCC»·éB 8. CCÖª¨±ÈÁÄ¢½±ÆðÏX·éB½¾µAâo[W ª®ìµ±¯Ä¢éêðB 9. |[^uÈvOÌoÖÌANZX (·Èí¿A public, protected Ü½Í private) ðÏX·éBÆ¢¤ÌÍAANZX ðÖ ¼ÉµñŵܤRpCà¶Ý·é©çÅ·B C++ CuÌJÒÍA±Ì·Á½çµ¢XgðèɵÄAoCiÝ ·«ðÈ·±ÆÉÈÁĵܤÜÌXVìÆÈã̱ÆðÁÉl¶µÈ¯ êÎÈèܹñBK¢ÉµÄAUnix CNÈVXe (Linux ðÜÝÜ·) Å ÍêÂÌCuÌ¡Ìo[Wð¯É[h·é±ÆªÅ«éÌÅ AfBXNXy[X𸤱ÆÉÍÈèÜ·ªA[UÍâCuðK vÆ·é ``â'' vOð»ÌãàÀs·é±ÆªÂ\ÅÍ èÜ·B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 4. ®IÉ[h³êé (Dynamically Loaded; DL) Cu ®IÉ[h³êé (dynamically loaded; DL) CuÍAvOÌ N®ÈOÌÆ«É[h³êéCuÅ·B±êÍvOCâW [ðÀ·éÌÉÁÉðɧ¿Ü·BÆ¢¤ÌÍAvOCªKvÉÈé ÜÅA»êð[h·éÌðÒ±ƪūé©çÅ·Bá¦ÎA Pluggable Authentication Modules (PAM) VXeÍAÇÒªFØÌÝèâÄÝè𨠱Ȧéæ¤É·é½ßA DL CuðgpµÄ¢Ü·BܽASÌð~ ßé±ÆÈAø¦ðã°éÚIÅA»ÌXÅR[hð}VR[hÉR pCµA»ÌRpCãÌàÌðgp·éÆ¢¤C^v^ðÀ·é ÌÉàðɧ¿Ü·B±Ìû@ÍAWXgC^CRpCâA}` [U_W (multi-user dungeon; MUD) ÌÀÉàðɧ¿Ü·B Linux ÅÍAÀÛÌƱëADL CuÍ`®Æ¢¤_ɨ¢ÄÍÁÊÅÍ èܹñB»êçÍAWIÈIuWFNgt@CAàµÍ¡ÜÅÉq ×½æ¤ÈWIȤLCuƵÄ\z³êĢܷBåÈá¢ÍA CuªAvOÌNâN®É©®IÉÍ[h³êÈ¢AÆ ¢¤_Å·B»ÌãíèACuðI[vµAV{ðõµAG [ðµACuð¶éAÆ¢¤ API ͶݵܷB±Ì API ðg ¤½ßÉÍA C [UÍwb_t@C <dlfcn.h> ðCN[h·éKv ª èÜ·B Linux ÉæÁÄgp³êéC^[tF[XÍ{¿IÉ Solaris ãÌàÌƯ ¶ÅAª ``dlopen()'' API ÆÄڤƵĢéàÌÅ·Bµ©µÈªçA ±Ì¯¶C^[tF[XÍSÄÌvbgtH[ÅT|[g³êÄ¢éí ¯ÅÍ èܹñBHP-UX Í shl_load() Æ¢¤ÙÈé@\ðp¢Ü·µA Windows vbgtH[Í®SÉÙÈéC^[tF[XÌ DLL ðgpµÜ ·B ȽÌÅIÚWªLÍÈ|[^reBÈçÎA¨»çAvbgt H[ÔÌ·áðB·bsOCuÌgpðl¦½Ù¤ªæ¢Åµå ¤BêÂÌAv[`ÍAW [Ì®I[fBOðT|[g·é glib CuÅ·B±êÍAvbgtH[ÅyäÆÈÁÄ¢é®I[fB Op[`ðg¢A»êçÌ@\ÖÌ|[^uÈC^[tF[XðÀ µÜ·Bglib É¢ÄÍA http://developer.gnome.org/doc/API/glib/ glib-dynamic-loading-of-modules.html ðQƵľ³¢B glib ÌC^ [tF[XÍ»ÌhL gÌÅ\ªÉླêÄ¢éÌÅA±±Åͱ êÈãÍq×ܹñBà¤êÂÌAv[`ÍAlibltdl ðg¤±ÆÅ·B± êÍA GNU libtool <http://www.gnu.org/software/libtool/libtool.html> ÌêÅ·BàÁƽÌ@\ð]ÞÈçÎA CORBA Object Request Broker (ORB) ð²×ÄÝéÌàæ¢Åµå¤B Linux Æ Solaris ÅT|[g³êé C^[tF[Xð¼Úg¤±ÆÉËRƵĻ¡ð¨¿ÈçÎAÇÝiñ ž³¢B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 4.1. dlopen() dlopen(3) ÖÍACuðI[vµAgp·é½ßÌõðµÜ·B C ÅÍA»Ìvg^CvÍÌæ¤ÉÈèÜ·\\ void * dlopen(const char *filename, int flag); t@C¼ª ``/'' ÅͶÜéÈçÎ (ÂÜèâÎpXÈçÎ) A dlopen() ÍCuðõµÜ¹ñB»¤ÅÈ¢ÈçÎAdlopen() ÍÌÅC uðõµÜ·\\ 1. [UÌ LD_LIBRARY_PATH «ÏàÌRÅæØçê½fBNg Xg 2. /etc/ld.so.cache Éwè³ê½CuXg 3. /usr/lib, ª /lib dlopen() ÅÍAflag ÌlÍARTLD_LAZY \\``®ICuÌR[hªÀ s³êéÆ«ÉA¢è`V{ðð¹æ'' Æ¢¤Ó¡Å·\\AàµÍ ARTLD_NOW \\``dlopen() ª^[·éOÉSÄÌ¢è`V{ðð ¹æA»êªÅ«È¢æ¤Èçθs¹æ'' Æ¢¤Ó¡Å·\\AÌÇ¿ç© Åȯê΢¯Ü¹ñBRTLD_GLOBAL ÍA flag ÌÇ¿ç©ÌlÆCÓÉ_ a³êéàÌÅA±¯ÄCuð[h·é±ÆÉæèCuà Åè`³êÄ¢éOV{ð¾çêéAÆ¢¤±ÆðÓ¡µÄ¢Ü·Bf obOÍA¨»ç RTLD_NOW ðg¢½Èéŵå¤BRTLD_LAZY ðg¤ ÆAð³êÈ¢Qƪ Á½Æ«ÉsÂðÈG[ª¶¬³êÜ·B RTLD_NOW ðg¤ÆACuÌI[vÉÍá±Ôª½©©éæ¤ÉÈ èÜ· (µ©µAÌ¿Ì¿ÌõXs[hͬÈèÜ·) B±Ì±Æª[ UC^[tF[XÌâèÉÈéæ¤Åµ½çA ÆÅ RTLD_LAZY É©¦é± ƪūܷB Cuª¨Ý¢É˶µÄ¢éæ¤Èç (á¦ÎAX ª Y É˶µÄ¢ é) A˶³êÄ¢éÙ¤ðæÉ[hµÄ¾³¢ (±ÌឦÎAY ð æÉ[hµA»ê©ç X ð[hµÜ·) B dlopen() ÌßèlÍA¼Ì DL Cu[`Ågp³êé ``nh '' \\»ÌÀÌÍBÁ³êéØ«àÌÆl¦çêÄ¢é\\Å·B[hÌ Ýª¬÷µÈ¢êAdlopen() Í NULL ðԵܷÌÅA±Ìlð`FbN· éKvª èÜ·B¯¶Cuª dlopen() ÅññÈã[h³êéÆA ¯¶t@CnhªÔ³êÜ·B àµàCuª _init Æ¢¤¼OÌ[`ðGNX|[gµÄ¢êÎA »ÌR[hÍ dlopen() ªßéOÉÀs³êÜ·B ȽÌCuÅàA ú»[`ðÀ·é½ßɱêðg¤±ÆªÅ«Ü·BÚ×Í Section 5.2 ðQƵľ³¢B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 4.2. dlerror() dlerror() ðÄ×ÎAG[ðñÅ«Ü·Bdlerror() ÍA dlopen(), dlsym() àµÍ dlclose() ÌÅãÌÄoµÉæéG[É¢ÄLqµÄ é¶ñðԵܷBêÂÏíÁÄ¢éÌÍAdlerror() ðÄÑo·ÆAÈ~ Ì dlerror() ÌÄoµÍAÙ©ÌG[ª¶·éÜÅ NULL ðÔ·Æ¢¤_ Å·B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 4.3. dlsym() DL Cuªg¦È¯êÎA»êð[hµÄàÓ¡ª èܹñB DL Cuðg¤½ßÌåÆÈé[`ÍAdlsym(3) Å·B±êÍA^¦çê ½ (I[vÏÝÌ) CuàÉ éV{Ìlðõ·éàÌÅ·B ±ÌÖÍÌæ¤Éè`³êÜ·\\ void * dlsym(void *handle, char *symbol); handle Í dlopen ÅÔ³ê½lÅAsymbol Ík¶ÅI[³ê½¶ñÅ ·BñðÂ\ÈçÎAdlsym() ÌÊð void* |C^Éi[µÈ¢Å¾³ ¢BÆ¢¤ÌÍA»êðp·é½ÑÉLXgµÈ¯ê΢¯ÈÈé©ç Å· (vOðeiXµæ¤ÆµÄ¢él½¿ÉAæèÈ¢îñ µ©^¦È¢±ÆÉàÈèÜ·) B dlsym() ÍAV{ª©Â©çȯêÎ NULL Æ¢¤ÊðԵܷBV {ª NULL àµÍ[Æ¢¤lðÆé±ÆÍ è¦È¢Æª©ÁÄ¢êÎ A»êÅ\¢Ü¹ñBµ©µA»¤ÅÈ¢êÍöÝIÉB³ªcèÜ·B àµà NULL ðó¯æÁ½êA»êÍA»ñÈV{ͶݵȢƢ¤ ±ÆðÓ¡·éÌŵ天AàµÍ»ÌV{Ìlª NULL Å é±Æ ðÓ¡·éÌŵ天? WIÈðÍAdlerror() ðͶßÉÄÑ (¶Ý µÄ¢é©àµêÈ¢G[ððNA·é½ßÅ·)A»ê©çV{ð v·é½ßÉ dlsym() ðÄÑAG[ª¶µÄ¢é©Ç¤©ð²×é½ß ÉÄx dlerror() ðÄÑo·±ÆÅ·BR[hÌfÐÍÌæ¤ÉÈéÅµå ¤\\ dlerror(); /* G[ðNA·é */ s = (actual_type) dlsym(handle, symbol_being_searched_for); if ((err = dlerror()) != NULL) { /* nhG[BV{ð©Â¯çêÈ©Á½ */ } else { /* V{ª©Â©Á½B»ÌlÍ s Éi[³êÄ¢é */ } ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 4.4. dlclose() dlopen() Ìtª dlclose() ÅA±êÍ DL CuðN[YµÜ·B dl CuÍ®IÈt@CnhÖÌNðǵĢéÌÅA¯ê ®ICuÉεÄAdlopen ª¬÷µ½ñƯ¶Ì dlclose ªÄÎ êÈ¢ÀèAYCuÍÀÛÉÍã©çí³êܹñB»Ì½ ßA¯¶vOª¯¶Cuð½ñ[hµÄàAâèÉÍÈèܹ ñBCuÌĪð³êéêÍA(àµà¶Ý·éÈçÎ) _fini ÖªÄÎêÜ·BÚ×Í Section 5.2 ðQƵľ³¢B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 4.5. DL CuÌá dlopen(3) Ì man y[W©çÌáð±±ÉڹܷB±ÌáÍAwCu ð[hµA2.0 ÌRTCðo͵AܽASÄÌXebvÅG[ð` FbNµÄ¢Ü· (§³êĢܷ) \\ #include #include int main(int argc, char **argv) { void *handle; double (*cosine)(double); char *error; handle = dlopen ("/lib/libm.so", RTLD_LAZY); if (!handle) { fputs (dlerror(), stderr); exit(1); } cosine = dlsym(handle, "cos"); if ((error = dlerror()) != NULL) { fputs(error, stderr); exit(1); } printf ("%f\n", (*cosine)(2.0)); dlclose(handle); } ±ÌvOª "foo.c" Æ¢¤¼OÌt@C¾Æ·éÆAÌR}hÅ vOð쬷é±ÆªÅ«Ü·B gcc -Wl,export-dynamic -o foo foo.c -ldl ``-Wl,export-dynamic'' IvVÍÀÛÉÍKv èܹñªAXðɧ ±ƪ èÜ·Bld(1) ÅÌæ¤É¾L³êĢܷ\\``ELF t@C ð쬵ĢéÆ«A±ÌIvVªASÄÌV{ð®IV{e[ uÉÁ¦Ü·BÊíA®IV{e[uÍ®IIuWFNgÉæÁÄg íêéV{¾¯ðÜñŢܷB±ÌIvVÍ dlopen ÌgpÌ½ß ÉKvÆÈèÜ·'' Linux VXe¾¯ÅìÆðµÄ¢éÈçÎA ``-Wl,export-dynamic'' Ì©íèÉ ``-rdynamic'' ðg¦é¯êÇàAELF hL gÉæêÎAñ Linux VXeãÌ gcc ÅÍ ``-rdynamic'' t OÍK¸µà@\µÈ¢AÆ¢¤±ÆÉÍӵĨ¢Ä¾³¢B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 5. G^ 5.1. nm R}h nm(1) R}hÍA^¦çê½CuàÌV{ÌXgðñµÜ· BÃICuA¤LCuÌÇ¿çÉεÄà@\µÜ·B nm(1) Í ^¦çê½CuÅè`³êÄ¢éV{¼AV{ÌlAV{ Ì^Cvð\¦µÜ·BܽA»ÌCuàÉîñª¶Ý·éÈçÎ (-l IvVð©Ä¾³¢) AV{ª\[XR[hàÌDZŠ(t@C ¼ÆsÔ) è`³êÄ¢é©Æ¢¤±ÆàÁèÅ«Ü·B V{^CvÉ¢ÄÍवྪKvÅ·B^CvÍê¶Å\¦³ êÜ·B¬¶Í»ÌV{ª[JÅ é±ÆðÓ¡µAå¶Í»Ì V{ªO[o (O) Å é±ÆðÓ¡µÜ·BT^IÈV{Ì ^CvÍÌàÌðÜÝÜ·\\ T (R[hZNVàÌÊÌè`) D ( ú»³ê½f[^ZNV) B (ú»³êĢȢf[^ZNV) U (¢è`BV{ÍCuÉæÁÄgíêÄ¢éªACuàÅÍè `³êĢȢ) W (weak. àµà¼ÌCuà±ÌV{ðè`µÄ¢ ½êA»Ìè`ªI[o[Ch·é) Ö̼OÍo¦Ä¢é¯êÇàA»êªÇÌCuÅè`³êÄ¢é© ³mÉÍv¢o¹È¢êACu¼ð©Â¯é½ßAnm Ì ``-o'' Iv V (eCÌt@C¼ÌOÉu«Ü·) É grep ð±¯Äg¤±Æª Å«Ü·B Bourne VFÅ êÎA/lib, /usr/lib, /usr/lib ̼ºÌTu fBNgA¨æÑ /usr/local/lib àÌSCuðÎÛÉµÄ ``cos'' ðõ·éÉÍAÌæ¤ÉµÜ·\\ nm -o /lib/* /usr/lib/* /usr/lib/*/* \ /usr/local/lib/* 2> /dev/null | grep 'cos$' nm ÉÖ·éàÁƽÌîñÍA info:binutils#nm É[JÉCXg[ ³êÄ¢é nm Ì ``info'' hL gžçêÜ·B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 5.2. ÁÊÈÖ _init Æ _fini ñÂÌÁÊÈÖ _init Æ _fini ÍAW [ÌúÆI¹ðx µÜ·BàµàCuàÅÖ ``_init'' ªGNX|[g³êÄ¢éÆ A»ÌCuÌI[vÉ dlopen() ªÄÎêé½ÑA»ÌÖªÄÑ o³êÜ·B C ÌvOÅÍA_init Æ¢¤¼OÌÖðè`·é±Æð Ó¡µÜ·B±êÉηé _fini ÆÄÎêéÖà¶ÝµA±êÍANC AgªCuÌðúÉ dlclose() ðÄÔ½ÑÉAÄÑo³êÜ· (» µÄðú³êÜ·) B±êçÌÖÌ C vg^CvÍÌæ¤ÉÈÁÄ¢Ü ·B void _init(void); void _fini(void); Gcc Åt@Cð ``.o'' t@CÖÆRpC·éÆ«ÍAYê¸É ``-nostartfiles'' IvVðt¯Ä¾³¢B±ÌIvVÍAC R pCª .so t@CÉεÄVXeX^[gAbvCuðNµ È¢æ¤ÉµÜ·B±ÌIvVðt¯È¢ÆA``multiple-definition'' (d¡è`) G[ÉÈÁĵܢܷB _init Æ _fini ÉÖ·éc_ðÁ¦ é±ÆðñĵÄê½±ÆA¨æÑ»Ìì¬ðè`ÁÄê½±ÆÉ뵀 A Jim Mischel Æ Tim Gentry ɴӵܷB ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 5.3. ¤LCuÍXNvg»Å«é ÊíÌCu`®ÌãíèÉAÁêÈXNvg¾êðgÁÄ¢éeLX gt@Cð¤LCuÆµÄ GNU [_ªFßé±ÆÍAÚÉlµÜ ·B±êÍA¼ÌCuðÔÚIɳ¹éÌÉð§¿Ü·Bá¦ÎA Ì éêÂÌVXeãÌ /usr/lib/libc.so ðXeBOµ½àÌ ÍÌæ¤ÉÈèÜ·B /* GNU ld XNvg ¤LCuðg¤ªAô©ÌÖÍÃICuàɵ© ¶ÝµÈ¢B»Ì½ßAñÔÚÉÝéB */ GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a ) ±êÉÖ·éæèÚµ¢îñÍAld JXNvg (ld R}h¾ê) É Â¢ÄÌ texinfo hL gðQƵľ³¢BêÊIÈîñÍAinfo: ld#Options Æ info:ld#Commands É èAæg¤R}hÍ info:ld# Option Commands ÅླêĢܷB ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 5.4. GNU libtool ½ÌVXeÉÚA³êéAvP[Vð쬵ĢéÈçÎACu ð\zµCXg[·éÌÉA GNU libtool <http://www.gnu.org/ software/libtool/libtool.html> ðgp·é±Æðl¶µ½Ù¤ªæ¢©àµ êܹñB GNU libtool ÍAÄpIÈCuT|[gXNvgÅ·B Libtool ÍA¤LCugpÌ¡G³ðêÑ«Ì é|[^uÈC^ [tF[XÅBµÜ·BLibtool ÍAIuWFNgì¬ACuÌN (ÃI¨æѤL) AÀsÂ\t@CÌNAÀsÂ\t@CÌfobO ACuÌCXg[AÀsÂ\t@CÌCXg[AÉ¢Ä| [^uÈC^[tF[XðñµÜ·BܽAvOð®IÉ[h ·é½ßÌ|[^reBbp[Å é libltdl àÜñŢܷBæèÚ× ÈîñÍA http://www.gnu.org/software/libtool/manual.html ðQÆµÄ ¾³¢B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 5.5. É[ɬ³ÈÀsÂ\t@C u{ɬ³È Linux p ELF ÀsÂ\t@Cì¬ÉÖ·éQ½¾µ¢` [gAv <http://www.muppetlabs.com/~breadbox/software/tiny/ teensy.html> Æ¢¤¶ªAæ¢QlÆÈéŵå¤B±êÍA{ɬ³È ÀsÂ\vOð쬷éû@É¢Ä_¶Ä¢Ü·B¦¼É¾¦ÎAê ÊIÈ«ÅÍA±êçÌgbNÌÙÆñÇÍg¤×«ÅÍ èܹñªA »êçÍAELF ªÀÛÉÇÌæ¤É@\·é©ð¦µÄ¢éÆ¢¤_ɨ¢Ä AÉßÄLvÅ·B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 6. ³çɽÌá ºLÉASOÂÌAv[` (ÃIA¤LA¨æÑ®IÉ[h³êéCu ) Ìáð³çÉ°Ü·Bt@C libhello.c ͽ}ÈCuÅA wb_t@CÆµÄ libhello.h ð¿Ü·Bt@C demo_use.c ÍA» ÌCu̽}ÈÄoµÅ·BÃICuâ®ICuÆµÄ YCuðg¤û@𦷽ßARgt«ÌXNvg (script_static Æ script_dynamic) ª Æɱ«Ü·B³çÉ demo_dynamic.c Æ script_dynamic ª Æɱ«Ü·B±êçͤLCu ð®IÉ[h³êéCuƵÄg¤û@ð¦µÜ·B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 6.1. t@C libhello.c /* libhello.c - CugpÌÀá */ #include void hello(void) { printf("Hello, library world.\n"); } ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 6.2. t@C libhello.h /* libhello.h - CugpÌÀá */ void hello(void); ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 6.3. t@C demo_use.c /* demo_use.c -- "hello" [`ð¼Úgp·éÀá */ #include "libhello.h" int main(void) { hello(); return 0; } ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 6.4. t@C script_static #!/bin/sh # ÃICuÌÀá # ÃICuÌIuWFNg libhello-static.o ð쬵ܷB # ÃICuÆ®ICuÌáð¾mÉæÊ·é½ßA # libhello-static Æ¢¤¼OðgpµÄ¢Ü·Bµ©µA È½Ì # IuWFNgt@CâÃICu̼OÉ "-static" ðg¤ # KvÍ èܹñB gcc -Wall -g -c -o libhello-static.o libhello.c # ÃICuð쬵ܷB ar rcs libhello-static.a libhello-static.o # ±±ÅAlibhello-static.a ðg¤½ßÉ»êðDZ©¼ÌêÖ # PÉRs[·é±ÆàÅ«Ü·BfªÚIÈÌÅACuÍ # JgfBNgàÉÆÇßĨ«Ü·B # demo_use vOðRpCµÜ·B gcc -Wall -g -c demo_use.c -o demo_use.o # demo_use vOð쬵ܷB-L. ÉæèAvOì¬É # "." ªõ³êé±ÆÉÈèÜ·B±ÌR}hÍAlibhello-static.a # àÌÖW·éIuWFNgð demo_use_static ÉgÝÞÆ¢¤±Æ # Éӵľ³¢B gcc -g -o demo_use_static demo_use.o -L. -lhello-static # vOðÀsµÜ·B ./demo_use_static ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 6.5. t@C script_shared #!/bin/sh # ¤LCuÌÀá # ¤LCuÌIuWFNgt@C libhello.o ð쬵ܷB gcc -fPIC -Wall -g -c libhello.c # ¤LCuð쬵ܷB # libhello Í C CuÉ˶µÄ¢éÌÅAC CuÆ # N³¹é½ßÉ -lc IvVðg¢Ü·B gcc -g -shared -Wl,-soname,libhello.so.0 \ -o libhello.so.0.0 libhello.o -lc # ±±ÅAlibhello.so.0.0 ðDZ©ÌfBNgA/usr/local/lib # ÈÇAÉPÉRs[Å«Ü·B # V{bNNðC³·é½ßAldconfig ðÄÑo·Kvª èÜ·B # soname ðÝèµÜ·BPÉA # # ln -sf libhello.so.0.0 libhello.so.0 # # ðÀs·é¾¯Åàæ¢Å·ªAldconfig ÉâÁÄàç¢Üµå¤B /sbin/ldconfig -n . # linker name ðÝèµÜ·B # æèôû³ê½Ýèð¨±È¤ÈçAùÉ linker name ª¶Ý·é©ð # mFµA൶ݷêÎA»êðcµÄ¨×«©Û©ð²×Ü·B ln -sf libhello.so.0 libhello.so # demo_use vOðRpCµÜ·B gcc -Wall -g -c demo_use.c -o demo_use.o # demo_use vOð쬵ܷB-L. ÉæèAvOì¬É # "." ªõ³êé±ÆÉÈèÜ·B±êÍAvOÀsÉ "." # ªõ³êé±ÆðÓ¡ 'µÈ¢' Æ¢¤±ÆÉӵľ³¢B gcc -g -o demo_use demo_use.o -L. -lhello # vOðÀsµÜ·BLD_LIBRARY_PATH ðgÁÄADZɤL # Cuª¶Ý·é©ðvOɳ¦éKvª é±ÆÉ # ӵľ³¢B LD_LIBRARY_PATH="." ./demo_use ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 6.6. t@C demo_dynamic.c /* demo_dynamic.c -- ®I[fBOÆ "hello" [`gpÌÀá */ /* ®IÉCuð[h·é[`pÉ dlfcn.h ªKv */ #include #include /* "libhello.h" ðCN[h·éKvªÈ¢±ÆÉ ÓµÄ¾³¢Bµ©µÈªçAÖA·éàÌð wè·éKvÍ èÜ·Bdlsym() ©ç¾æ¤ÆµÄ ¢élðÛ·é^Cvðwè·éKvª èÜ·B*/ /* "simple_demo_function" ^CvÍAøðÆç¸A ½àlðԳȢÖð¦µÄ¢Ü·B */ typedef void (*simple_demo_function)(void); int main(void) { const char *error; void *module; simple_demo_function demo_function; /* ®IÉ[h³êéCuð[h·é */ module = dlopen("libhello.so", RTLD_LAZY); if (!module) { fprintf(stderr, "Couldn't open libhello.so: %s\n", dlerror()); exit(1); } /* V{ð¾é */ dlerror(); demo_function = dlsym(module, "hello"); if ((error = dlerror())) { fprintf(stderr, "Couldn't find hello: %s\n", error); exit(1); } /* DL CuàÌÖðÄÑo· */ (*demo_function)(); /* SĪI¹µ½ÌÅA¨ð«ê¢ÉÐt¯é */ dlclose(module); return 0; } ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 6.7. t@C script_dynamic #!/bin/sh # ®IÉ[h³êéCuÌÀá # libhello.so Æ»ÌÔªùÉ쬳êÄ¢éàÌƵܷ # (¤LCuÌáð©Ä¾³¢)B # demo_dynamic vOt@CðIuWFNgt@CÖ # RpCµÜ·B gcc -Wall -g -c demo_dynamic.c # demo_use vOð쬵ܷB # ±ÌvOªgp·éBêÌÁÊÈCuÍAvO # N®ãÜÅ[h³êÈ¢ÌÅADL CuðDZÉTµÉ¢ # ¯Î梩ð³¦éKvªÈ¢±ÆÉڵľ³¢Bµ©µÈ # ªçADL Cuð[h·éCuðÜßé½ßA-ldl # IvVÍ 'Kv' ÆÈèÜ·B gcc -g -o demo_dynamic demo_dynamic.o -ldl # vOðÀsµÜ·BLD_LIBRARY_PATH ðg¢A®IÉ[h # ³êéCuðDZžçêé©ð³¦éKvª èÜ·B LD_LIBRARY_PATH="." ./demo_dynamic ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 7. »Ì¼Ìîñ¹ ºLÌàÌÍACuÉÖµÄÁÉðɧÂîñðÜñŢܷB E Daniel Barlow Éæé ``The GCC HOWTO''. ÁÉ±Ì HOWTO ÍACu ì¬pÌIvVÆAÇÌæ¤ÉCuÉâ¢í¹ð·é©É ¢Ä_¶Ä¢Ü·B±±ÅÍæèã°Ä¢È¢îñðµÁĢܷªA ṯÆྦܷB±Ì HOWTO ÍA http://www.linuxdoc.org Ì Linux Documentation Project ©çüèÅ«Ü· (óF``The GCC HOWTO'' Ìú{êóÍ http://www.linux.or.jp/JF/JFdocs/ GCC-HOWTO.html Å·)B E The Tool Interface Standards (TIS) ÏõïÉæé ``Executable and Linkable Format (ELF)'' (ÀÛÉͱêÍA¯ÏõïÉæé the Portable Formats Specification Version 1.1 àÌêÂÌÍÅ·). ±ê ÍAELF `® (Linux â GNU gcc ÉÁ»µ½àÌÅÍ èܹñ) yÑA »Ì`®ÉÖ·éåÊÌÚ×îñðñ·éàÌÅ·B ftp:// tsx-11.mit.edu/pub/linux/packages/GCC/ELF.doc.tar.gz ð©Ä¾³¢ B MIT ©çt@Cðæ¾·éÈçA»ÌtH[}bgªêÊIÅÍÈ¢ ±ÆÉӵľ³¢B gunzip Æ untar ðÀs·éÆA``hps'' t@ CªÅ«Ü·Bt@CÌÅÆÅãÌsðíµA``ps'' t@CÉ ¼OðÏX·êÎAÊÌt@C¼ðÂóÂ\È Postscript t@ Cð¾çêÜ·B E Hongjui Lu Éæé ``ELF: From the Programmer's Perspective''. ±ê ÍAELF ÉÖ·é Linux Æ GNU gcc ÉÁ»µ½îñðñµÜ·B ftp: //tsx-11.mit.edu/pub/linux/packages/GCC/elf.ps.gz Åæ¾Å«Ü·B E (óÒÉæéÇÁ) ²ìr³ñÉæé ``Linux C Library (libc) É¢ Ä''. Linux C Library (libc) ÌTvÉ¢ÄA»ÌðÆðjÈÇðÈ PÉÜÆß½àÌÅ·B http://www.linux.or.jp/JF/JFdocs/ libc-intro.html ÅQÆÅ«Ü·B ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª 8. ì ÆCZX ±Ì¶Ìì Í David A. Wheeler É è (Copyright (C) 2000)A GNU êÊöLgpø (GPL) ÉæèÛì³êÜ·Bã¿ÈµÅÄzzµÄà\¢Ü ¹ñB¶Ì´¶ð ``vO'' ÆðßµAÌðàçÁľ³¢B This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. {vOÍt[E\tgEFAÅ·B ȽÍAFree Software Foundation ªö\µ½ GNU êÊöLgpøÌuo[W 2v½¢Í »êÈ~Ìeo[W̩碸ê©ðIðµA»Ìo[Wªè ßéðÉ]ÁÄ{vOðÄÐzܽÍÏX·é±ÆªÅ«Ü·B This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. {vOÍLpÆÍv¢Ü·ªAÐzÉ ½ÁÄÍAsê«yÑÁè ÚIK«É¢ÄÌÃÙÌÛØðÜßÄA¢©ÈéÛØàsȢܹñ BÚ×É¢ÄÍ GNU êÊöLgpøð¨Çݾ³¢B You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ȽÍA{vOÆêÉ GNU êÊöLgpøÌʵðó¯æÁ Ä¢é͸ŷB»¤ÅÈ¢êÍAFree Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 0211-1307, USA Öèð¢ ľ³¢B ±êçÌðÍA¼ÌEFuTCgª~[Oð·é±Æð·éàÌ Å·ªA E ȽÌ~[TCgª}X^[TCg©çÅVîñð©®IÉæ¾·é æ¤ÉµA E }X^[TCgÖÌnCp[NƤÉ}X^[TCgÌP[V http://www.dwheeler.com/program-library 𾦵A»µÄ E ÒƵÄA (David A. Wheeler) ÉÓ«ð¨è¢µÜ·B ͶßÌñÂÍAæêÉAªßÌoOÉ¢ÄJèÔµbð·©³êé± Æðh¬Ü·BPÉ È½ª¶ðKØÉ~[OµÄ¢È¢Æ¢¤´ö ̽ßÉAÍêNOɼµ½oOÉÖ·ébð·«½Í èܹñB}X ^[TCgÖNð£é±ÆÉæèA[UÍ È½ÌTCgªÅVÌàÌ Å é©Ç¤©ðmFÅ«Ü·Bñíɵµ¢ZL eBvª èA»Ì ½ßÉC^[lbgÖÊíÉÚ±·éXNðæé±ÆªÅ«È¢TCgÌ âèÉεÄAÍq´Å·B±Ì±Æª ȽÌóµÉ ÄÍÜéÈçÎA ÈÆàA¼Ì|CgÖÌÚ±ðݽèAÜ È½Ì«ÖÌXj[ J[lbgEAbvf[g (óFXj[J[lbg (sneakernet) \\ FD ð¿^Ñ·é±ÆÉæèîñð¤L·élbg[N) ðÝéÈÇµÄ ¾³¢B ±ÌCZXÉæêÎA ȽÍhL gðÏXµÄà\¢Ü¹ñªA Ƚª¢½àÌÅÍÈ¢àÌð ȽÌàÌÅ éÆ壵½è (ÂÜè pÅ·) AÏX³ê½o[Wª´ìÅ é©Ìæ¤ÈÓèð·é±ÆÍ Å«Ü¹ñBì¨ÌÏXÍAì¨SÌÌì ð ȽÉ÷n·éàÌÅ Í èܹñB±êÍAì @ÌpêÅ¢¤Æ±ëÌ ``public domain'' Ì ì¨ÅÍ èܹñBCZXðÚ×ɩľ³¢BÁÉA ``You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.'' \\``t@CðÏXµ ½|Æ»ÌÏXúÆðAÏXµ½t@CãɾmÉ\¦·é±Æ'' Æ¢¤± ÆÉÍӵľ³¢BCZXªÇÌæ¤È±ÆðµĢé©É ¢Ä¿âª éêÍAÉAðæÁľ³¢B½¢Ä¢ÌêÉÍA ȽÌÏXª¼ÌÝȳñÌÏXƤÉ}X^[Rs[Ö³êéæ¤A ȽÌÏXðÒ (»ÝÍ David A. Wheeler) Öé̪æ¢Åµå¤B