2 .\" Copyright 1995 Yggdrasil Computing, Incorporated.
3 .\" written by Adam J. Richter (adam@yggdrasil.com),
4 .\" with typesetting help from Daniel Quinlan (quinlan@yggdrasil.com).
5 .\" and Copyright 2003 Michael Kerrisk (mtk.manpages@gmail.com).
7 .\" This is free documentation; you can redistribute it and/or
8 .\" modify it under the terms of the GNU General Public License as
9 .\" published by the Free Software Foundation; either version 2 of
10 .\" the License, or (at your option) any later version.
12 .\" The GNU General Public License's references to "object code"
13 .\" and "executables" are to be interpreted as the output of any
14 .\" document formatting or typesetting system, including
15 .\" intermediate and printed output.
17 .\" This manual is distributed in the hope that it will be useful,
18 .\" but WITHOUT ANY WARRANTY; without even the implied warranty of
19 .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 .\" GNU General Public License for more details.
22 .\" You should have received a copy of the GNU General Public
23 .\" License along with this manual; if not, write to the Free
24 .\" Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
27 .\" Modified by David A. Wheeler <dwheeler@dwheeler.com> 2000-11-28.
28 .\" Applied patch by Terran Melconian, aeb, 2001-12-14.
29 .\" Modified by Hacksaw <hacksaw@hacksaw.org> 2003-03-13.
30 .\" Modified by Matt Domsch, 2003-04-09: _init and _fini obsolete
31 .\" Modified by Michael Kerrisk <mtk.manpages@gmail.com> 2003-05-16.
32 .\" Modified by Walter Harms: dladdr, dlvsym
33 .\" Modified by Petr Baudis <pasky@suse.cz>, 2008-12-04: dladdr caveat
35 .\" Japanese Version Copyright (c) 1998 NAKANO Takeo all rights reserved.
36 .\" Translated Sat May 23 1998 by NAKANO Takeo <nakano@apm.seikei.ac.jp>
37 .\" Updated & Modified 1999-09-14, NAKANO Takeo
38 .\" Modified 2000-03-19, HANATAKA Shinya <hanataka@abyss.rim.or.jp>
39 .\" Updated 2001-02-16, Kentaro Shirakata <argrath@ub32.org>
40 .\" Updated 2001-12-21, Kentaro Shirakata <argrath@ub32.org>
41 .\" Updated 2002-10-21, Kentaro Shirakata <argrath@ub32.org>
42 .\" Updated 2003-09-01, Kentaro Shirakata <argrath@ub32.org>
43 .\" Updated 2005-03-15, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
44 .\" Updated 2006-01-20, Akihiro MOTOKI
45 .\" Updated 2009-03-02, Akihiro MOTOKI, LDP v3.19
47 .\"WORD: linker ¥ê¥ó¥«
48 .\"WORD: dynamic linking ưŪ¥ê¥ó¥¯
49 .\"WORD: dynamic library ưŪ¥é¥¤¥Ö¥é¥ê
51 .TH DLOPEN 3 2008-12-06 "Linux" "Linux Programmer's Manual"
53 dlclose, dlerror, dlopen, dlsym \- ưŪ¥ê¥ó¥¯¤ò¹Ô¤¦¥í¡¼¥À¤Ø¤Î
54 ¥×¥í¥°¥é¥ß¥ó¥°¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹
58 .BI "void *dlopen(const char *" filename ", int " flag );
60 .B "char *dlerror(void);"
62 .BI "void *dlsym(void *" handle ", const char *" symbol );
64 .BI "int dlclose(void *" handle );
66 \fI\-ldl\fP ¤Ç¥ê¥ó¥¯¤¹¤ë¡£
72 ¤Î 4¤Ä¤Î´Ø¿ô¤Ï¡¢Æ°Åª¥ê¥ó¥¯ (dynamic linking) ¤ò¹Ô¤¦¥í¡¼¥À¤Ø¤Î
73 ¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤·¤¿¤â¤Î¤Ç¤¢¤ë¡£
83 ¤Î¤¤¤º¤ì¤«¤ÇºÇ¸å¤ËȯÀ¸¤·¤¿¥¨¥é¡¼¤Ë¤Ä¤¤¤Æ¤ÎÀâÌÀ¥á¥Ã¥»¡¼¥¸¤òÊÖ¤¹¡£
84 ½é´ü²½¸å¤Þ¤¿¤ÏÁ°²ó¸Æ¤Ó½Ð¤µ¤ì¤¿¸å¤Ç¡¢¥¨¥é¡¼¤¬È¯À¸¤·¤Æ¤¤¤Ê¤±¤ì¤Ð NULL ¤òÊÖ¤¹¡£
88 ¤Ï¡¢NULL ½ªÃ¼¤µ¤ì¤¿Ê¸»úÎó
90 ¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë̾¤ÎưŪ¥é¥¤¥Ö¥é¥ê (dynamic library) ¤ò¥í¡¼¥É¤·¡¢
91 ¤½¤ÎưŪ¥é¥¤¥Ö¥é¥ê¤Ø¤ÎÆâÉô¡Ö¥Ï¥ó¥É¥ë¡×¤òÊÖ¤¹¡£
93 ¤¬ NULL ¤Î¾ì¹ç¡¢¥á¥¤¥ó¡¦¥×¥í¥°¥é¥à¤Ø¤Î¥Ï¥ó¥É¥ë¤¬ÊÖ¤µ¤ì¤ë¡£
95 ¤¬¥¹¥é¥Ã¥·¥å ("/") ¤ò´Þ¤à¾ì¹ç¡¢(ÁêÂФ«ÀäÂФ«¤Î)¥Ñ¥¹Ì¾¤È¤·¤Æ²ò¼á¤µ¤ì¤ë¡£
96 ¤½¤ì°Ê³°¤Î¾ì¹ç¡¢Æ°Åª¥ê¥ó¥«¤Ï°Ê²¼¤Î¼ê½ç¤Ç¥é¥¤¥Ö¥é¥ê¤ò¸¡º÷¤¹¤ë
101 (ELF ¤Î¤ß) ¸Æ¤Ó½Ð¤·¸µ¥×¥í¥°¥é¥à¤Î¼Â¹Ô¥Õ¥¡¥¤¥ë¤Ë DT_RPATH ¥¿¥°¤¬´Þ¤Þ¤ì¤Æ¤ª¤ê¡¢
102 DT_RUNPATH ¥¿¥°¤¬´Þ¤Þ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢DT_RPATH ¥¿¥°¤Ë½ñ¤«¤ì¤Æ¤¤¤ë
103 ¥Ç¥£¥ì¥¯¥È¥ê¡¦¥ê¥¹¥È¤ò¸¡º÷¤¹¤ë¡£
105 ¥×¥í¥°¥é¥à¤Î³«»Ï»þ¤Ë´Ä¶ÊÑ¿ô
107 ¤Ë¥³¥í¥ó¶èÀÚ¤ê¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ì¤Ð¡¢
108 ¤³¤Î´Ä¶ÊÑ¿ô¤ËÄêµÁ¤µ¤ì¤¿¥Ç¥£¥ì¥¯¥È¥ê¤¬¸¡º÷¤µ¤ì¤ë
109 (¥»¥¥å¥ê¥Æ¥£¾å¤ÎÍýͳ¤Ç¡¢¤³¤ÎÊÑ¿ô¤Ï set-UID ¤ä set-GID ¤µ¤ì¤¿
110 ¥×¥í¥°¥é¥à¤Î¾ì¹ç¤Ï̵»ë¤µ¤ì¤ë)¡£
112 (ELF ¤Î¤ß) ¸Æ¤Ó½Ð¤·¸µ¥×¥í¥°¥é¥à¤Î¼Â¹Ô¥Õ¥¡¥¤¥ë¤Ë DT_RUNPATH ¥¿¥°¤¬´Þ¤Þ¤ì¤Æ
113 ¤¤¤ë¾ì¹ç¡¢¤½¤Î¥¿¥°¤Ë½ñ¤«¤ì¤Æ¤¤¤ë¥Ç¥£¥ì¥¯¥È¥ê¡¦¥ê¥¹¥È¤ò¸¡º÷¤¹¤ë¡£
119 ¤Î¥¨¥ó¥È¥ê¤¬Æþ¤Ã¤Æ¤¤¤ë¤«¤ò¥Á¥§¥Ã¥¯¤¹¤ë
120 .RB ( /etc/ld.so.cache
123 ¤Ë¤è¤Ã¤Æ´ÉÍý¤µ¤ì¤Æ¤¤¤ë)¡£
129 ¤ò¤³¤Î½çÈ֤Ǹ¡º÷¤¹¤ë¡£
131 ¤½¤Î¥é¥¤¥Ö¥é¥ê¤¬Â¾¤Î¶¦Í¥é¥¤¥Ö¥é¥ê¤Ë°Í¸¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢
132 °Í¸¤·¤Æ¤¤¤ë¥é¥¤¥Ö¥é¥ê¤âưŪ¥ê¥ó¥«¤¬Æ±¤¸¸¡º÷¥ë¡¼¥ë¤Ë´ð¤Å¤¤¤Æ
133 ¼«Æ°Åª¤Ë¥í¡¼¥É¤¹¤ë (¤½¤ì¤é¤Î¥é¥¤¥Ö¥é¥ê¤Ë¤µ¤é¤Ë°Í¸´Ø·¸¤¬¤¢¤ë¾ì¹ç¤Ê¤É¤Ï
134 ¤³¤Î½èÍý¤ÏºÆµ¢Åª¤Ë¹Ô¤ï¤ì¤ë)¡£
137 ¤Ë¤Ï°Ê²¼¤Î 2 ¤Ä¤ÎÃͤΤ¤¤º¤ì¤«¤ò´Þ¤á¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤:
140 lazy binding (¼êÈ´¤¤Ê¥·¥ó¥Ü¥ë¤Î·ë¤ÓÉÕ¤±) ¤¬¹Ô¤¦¡£
141 ¥·¥ó¥Ü¥ë¤Î²ò·è¤Ï¤½¤Î¥·¥ó¥Ü¥ë¤ò»²¾È¤¹¤ë¥³¡¼¥É¤¬¼Â¹Ô¤µ¤ì¤ë¤È¤¤Ë¤Î¤ß
142 ¹Ô¤ï¤ì¤ë¡£¥·¥ó¥Ü¥ë¤¬°ìÅ٤⻲¾È¤µ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë¤Ï¡¢¤½¤Î¥·¥ó¥Ü¥ë¤Ï
143 ²ò·è¤µ¤ì¤Ê¤¤¤Þ¤Þ¤È¤Ê¤ë¡£
144 (lazy binding ¤Ï´Ø¿ô»²¾È¤Ë¤Ä¤¤¤Æ¤Î¤ß¼Â»Ü¤µ¤ì¤ë; ÊÑ¿ô¤Ø¤Î»²¾È¤Ï¾ï¤Ë
145 ¥é¥¤¥Ö¥é¥ê¤¬¥í¡¼¥É¤µ¤ì¤¿»þÅÀ¤Çľ¤Á¤Ë²ò·è¤µ¤ì¤ë¡£)
148 ¤³¤ÎÃͤ¬»ØÄꤵ¤ì¤ë¤«¡¢´Ä¶ÊÑ¿ô
150 ¤Ë¶õ¤Ç¤Ê¤¤Ê¸»úÎó¤¬ÀßÄꤵ¤ì¤¿¾ì¹ç¡¢
151 ¥é¥¤¥Ö¥é¥êÃæ¤Î̤ÄêµÁ¤Î¥·¥ó¥Ü¥ë¤òÁ´¤Æ²ò·è¤·¤Æ¤«¤é
153 ¤ÏÉüµ¢¤¹¤ë¡£²ò·è¤Ç¤¤Ê¤«¤Ã¤¿¤È¤¤Ë¤Ï¥¨¥é¡¼¤¬ÊÖ¤µ¤ì¤ë¡£
155 °Ê²¼¤ÎÃͤΤ¦¤Á 0 ¸Ä°Ê¾å¤òÏÀÍýÏ (OR) ¤Î·Á¤Ç
157 ¤ËÄɲ乤뤳¤È¤â¤Ç¤¤ë:
160 ¤³¤Î¥é¥¤¥Ö¥é¥ê¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥·¥ó¥Ü¥ë¤¬¡¢¤³¤ì¤è¤ê¸å¤Ç¥í¡¼¥É¤µ¤ì¤ë
161 ¥é¥¤¥Ö¥é¥ê¤Î¥·¥ó¥Ü¥ë²ò·è¤ÇÍøÍѤǤ¤ë¤è¤¦¤Ë¤Ê¤ë¡£
166 ¤ÎÈ¿ÂФΰÕÌ£¤Ç¤¢¤ê¡¢¤É¤Á¤é¤Î¥Õ¥é¥°¤â»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï
167 ¤³¤Á¤é¤¬¥Ç¥Õ¥©¥ë¥È¤È¤Ê¤ë¡£
168 ¤³¤Î¥é¥¤¥Ö¥é¥ê¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥·¥ó¥Ü¥ë¤Ï¡¢¤³¤ì¤è¤ê¸å¤Ç¥í¡¼¥É¤µ¤ì¤ë
169 ¥é¥¤¥Ö¥é¥ê¤Ç¤Î¥·¥ó¥Ü¥ë»²¾È¤ÇÍøÍѤǤ¤Ê¤¤¡£
171 .BR RTLD_NODELETE " (glibc 2.2 °Ê¹ß)"
173 Ãæ¤Ë¤½¤Î¥é¥¤¥Ö¥é¥ê¤ò¥¢¥ó¥í¡¼¥É¤·¤Ê¤¤¡£
174 ¤½¤Î¤¿¤á¡¢Æ±¤¸¥é¥¤¥Ö¥é¥ê¤ò¤³¤ì°Ê¹ß¤Ë
176 ¤ÇºÆÅÙ¥í¡¼¥É¤·¤¿¾ì¹ç¤Ë¡¢¥é¥¤¥Ö¥é¥êÆâ¤ÎÀÅŪÊÑ¿ô¤ÏºÆ½é´ü²½¤µ¤ì¤Ê¤¤¡£
177 ¤³¤Î¥Õ¥é¥°¤Ï POSIX.1-2001 ¤Ç¤Ïµ¬Äꤵ¤ì¤Æ¤¤¤Ê¤¤¡£
178 .\" (¤·¤«¤· Solaris ¤Ë¸ºß¤¹¤ë)
180 .BR RTLD_NOLOAD " (glibc 2.2 °Ê¹ß)"
181 ¤½¤Î¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤Ê¤¤¡£
182 ¤³¤Î¥Õ¥é¥°¤Ï¤½¤Î¥é¥¤¥Ö¥é¥ê¤¬¤¹¤Ç¤ËÁȤ߹þ¤Þ¤ì¤Æ¤¤¤ë¤«¤ò¸¡ºº¤¹¤ë¤Î¤Ë
185 ¤Ï¡¢¥é¥¤¥Ö¥é¥ê¤¬ÁȤ߹þ¤Þ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð NULL ¤òÊÖ¤·¡¢
186 ¤¹¤Ç¤ËÁȤ߹þ¤Þ¤ì¤Æ¤¤¤ì¤Ð¤½¤Î¥é¥¤¥Ö¥é¥ê¤Î¥Ï¥ó¥É¥ë¤òÊÖ¤¹)¡£
187 ¤Þ¤¿¡¢¤¹¤Ç¤Ë¥í¡¼¥É¤µ¤ì¤Æ¤¤¤ë¥é¥¤¥Ö¥é¥ê¤Î¥Õ¥é¥°¤ò¾º³Ê¤µ¤»¤ë¤Î¤Ë¤â
188 ÍøÍѤǤ¤ë¡£Î㤨¤Ð¡¢²áµî¤Ë
190 ¤Ç¥í¡¼¥É¤·¤¿¥é¥¤¥Ö¥é¥ê¤ò
191 .BR RTLD_NOLOAD\ |\ RTLD_GLOBAL
192 ¤ÇºÆ¥ª¡¼¥×¥ó¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£
193 ¤³¤Î¥Õ¥é¥°¤Ï POSIX.1-2001 ¤Ç¤Ïµ¬Äꤵ¤ì¤Æ¤¤¤Ê¤¤¡£
194 .\" (¤·¤«¤· Solaris ¤Ë¸ºß¤¹¤ë)
196 .BR RTLD_DEEPBIND " (glibc 2.3.4 °Ê¹ß)"
197 .\" Inimitably described by UD in
198 .\" http://sources.redhat.com/ml/libc-hacker/2004-09/msg00083.html.
199 ¤³¤Î¥é¥¤¥Ö¥é¥êÆâ¤Î¥·¥ó¥Ü¥ë¤Î»²¾ÈÎΰè¤ò¥°¥í¡¼¥Ð¥ëÎΰè¤è¤ê¤âÁ°¤ËÇÛÃÖ¤¹¤ë¡£
200 ¤Ä¤Þ¤ê¡¢Æ⢷¿¤Î¥é¥¤¥Ö¥é¥ê¤Ç¤Ï¡¢¤¹¤Ç¤Ë¥í¡¼¥É¤µ¤ì¤¿¥é¥¤¥Ö¥é¥ê¤Ë´Þ¤Þ¤ì¤ë
201 Ʊ¤¸Ì¾Á°¤Î¥°¥í¡¼¥Ð¥ë¤Ê¥·¥ó¥Ü¥ë¤è¤ê¤â¼«¥é¥¤¥Ö¥é¥êÆâ¤Î¥·¥ó¥Ü¥ë¤¬Í¥À褷¤Æ
203 ¤³¤Î¥Õ¥é¥°¤Ï POSIX.1-2001 ¤Ç¤Ïµ¬Äꤵ¤ì¤Æ¤¤¤Ê¤¤¡£
206 ¤¬ NULL ¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢
207 ÊÖ¤µ¤ì¤ë¥Ï¥ó¥É¥ë¤Ï¥á¥¤¥ó¡¦¥×¥í¥°¥é¥à¤Î¤â¤Î¤Ë¤Ê¤ë¡£
210 ¤ËÅϤµ¤ì¤ë¤È¡¢¥·¥ó¥Ü¥ë¤Î¸¡º÷¤Ï¡¢¥á¥¤¥ó¡¦¥×¥í¥°¥é¥àÆâ¡¢
211 ¥×¥í¥°¥é¥à¤Îµ¯Æ°»þ¤Ë¥í¡¼¥É¤µ¤ì¤ëÁ´¤Æ¤Î¶¦Í¥é¥¤¥Ö¥é¥ê¡¢
215 ¥Õ¥é¥°ÉÕ¤¤Ç¥í¡¼¥É¤µ¤ì¤¿Á´¤Æ¤Î¶¦Í¥é¥¤¥Ö¥é¥ê¡¢¤Î½ç½ø¤Ç¹Ô¤ï¤ì¤ë¡£
217 ¥ª¡¼¥×¥ó¤µ¤ì¤¿¥é¥¤¥Ö¥é¥êÃæ¤Ç¤Î³°Éô»²¾È¤Ï¡¢
218 ¤½¤Î¥é¥¤¥Ö¥é¥ê¤Î°Í¸¥ê¥¹¥È¤Ë¤¢¤ë¥é¥¤¥Ö¥é¥ê¤«¡¢
220 ¥Õ¥é¥°ÉÕ¤¤Ç´û¤Ë¥ª¡¼¥×¥ó¤µ¤ì¤Æ¤¤¤ë¥é¥¤¥Ö¥é¥ê¤ò»È¤Ã¤Æ²ò·è¤µ¤ì¤ë¡£
221 ¼Â¹Ô¥Õ¥¡¥¤¥ë¤¬ "\-rdynamic" ¥Õ¥é¥° ("\-\-export\-dynamic" ¤âƱµÁ)
222 ÉÕ¤¤Ç¥ê¥ó¥¯¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¼Â¹Ô¥Õ¥¡¥¤¥ëÃæ¤Î¥°¥í¡¼¥Ð¥ë¥·¥ó¥Ü¥ë¤â¡¢
223 ưŪ¤Ë¥í¡¼¥É¤µ¤ì¤ë¥é¥¤¥Ö¥é¥êÆâ¤Î»²¾È²ò·è¤ËÍѤ¤¤é¤ì¤ë¡£
227 ¤Ë¤è¤Ã¤ÆºÆÅÙ¥í¡¼¥É¤µ¤ì¤¿¾ì¹ç¤Ë¤Ï¡¢Æ±¤¸¥Õ¥¡¥¤¥ë¥Ï¥ó¥É¥ë¤¬ÊÖ¤µ¤ì¤ë¡£
228 dl ¥é¥¤¥Ö¥é¥ê¤Ï¥é¥¤¥Ö¥é¥ê¥Ï¥ó¥É¥ë¤Î¥ê¥ó¥¯¿ô¤ò´ÉÍý¤·¤Æ¤¤¤ë¡£
229 ¤·¤¿¤¬¤Ã¤ÆưŪ¥é¥¤¥Ö¥é¥ê¤Ï
233 ¤ÈƱ¤¸²ó¿ô¤À¤±¸Æ¤Ó½Ð¤µ¤ì¤Ê¤¤¸Â¤ê¥¢¥ó¥í¡¼¥É¤µ¤ì¤Ê¤¤¡£
235 ¥ë¡¼¥Á¥ó¤Ï°ìÅÙ¤À¤±¸Æ¤Ó½Ð¤µ¤ì¤ë
237 ¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Î¤ß)¡£
243 ¤Ç°ÊÁ°¤Ë¥í¡¼¥É¤µ¤ì¤¿¥é¥¤¥Ö¥é¥ê¤Î¥·¥ó¥Ü¥ë²ò·è¤¬¼Â¹Ô¤µ¤ì¤ë¤³¤È¤¬¤¢¤ë¡£
246 ¤Ï¡¢²¿¤é¤«¤ÎÍýͳ¤Ç¼ºÇÔ¤¹¤ë¤È NULL ¤òÊÖ¤¹¡£
253 ¤¬ÊÖ¤·¤¿Æ°Åª¥é¥¤¥Ö¥é¥ê¤Î¡Ö¥Ï¥ó¥É¥ë¡×¤È¡¢
254 NULL ½ªÃ¼¤µ¤ì¤¿¥·¥ó¥Ü¥ë̾¤Îʸ»úÎó¤ò°ú¤¿ô¤Ë¼è¤ê¡¢
255 ¤½¤Î¥·¥ó¥Ü¥ë¤¬¥í¡¼¥É¤µ¤ì¤¿¥á¥â¥ê¤Î¥¢¥É¥ì¥¹¤òÊÖ¤¹¡£
256 ¥·¥ó¥Ü¥ë¤¬¡¢»ØÄꤵ¤ì¤¿¥é¥¤¥Ö¥é¥ê¤È¡¢»ØÄꤵ¤ì¤¿¥é¥¤¥Ö¥é¥ê¤¬¥í¡¼¥É¤µ¤ì¤ëºÝ¤Ë
258 ¤¬¼«Æ°Åª¤Ë¥í¡¼¥É¤·¤Æ¥é¥¤¥Ö¥é¥ê¤Î¤¤¤º¤ì¤Ë¤â¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢
262 ¤Ë¤è¤ë¸¡º÷¤Ï¡¢¤³¤ì¤é¤Î¥é¥¤¥Ö¥é¥ê¤Î°Í¸´Ø·¸¤Î¥Ä¥ê¡¼¤òÀèƬ¤«¤é
264 ¼ÂºÝ¤Ë¤Ï¥·¥ó¥Ü¥ë¤ÎÃͼ«ÂΤ¬ NULL ¤Ë¤Ê¤ë¤³¤È¤â¤¢¤ë (¤½¤Î¤¿¤á¡¢
266 ¤ÎÊÖ¤êÃͤ¬ NULL ¤Ç¤¢¤Ã¤¿¤È¤·¤Æ¤âɬ¤º¤·¤â¥¨¥é¡¼¤È¤¤¤¦Ìõ¤Ç¤Ï¤Ê¤¤)¡£
267 ¥¨¥é¡¼¤«¤É¤¦¤«¤ò³Îǧ¤¹¤ëÀµ¤·¤¤ÊýË¡¤Ï°Ê²¼¤ÎÄ̤ê¤Ç¤¢¤ë:
269 ¤ò¸Æ¤Ó½Ð¤·¤Æ°ÊÁ°¤Î¥¨¥é¡¼¾õÂÖ¤ò¥¯¥ê¥¢¤·¤Æ¤«¤é¡¢
271 ¤ò¸Æ¤Ó½Ð¤¹¡£¤½¤Î¸å¤Ç¤â¤¦°ìÅÙ
275 ¤ÎÊÖ¤êÃͤòÊÑ¿ô¤ËÊݸ¤·¡¢Êݸ¤·¤¿Ãͤ¬ NULL ¤Ç¤¢¤ë¤«È½Äꤹ¤ë¡£
280 ¤È¤¤¤¦Æó¤Ä¤ÎÆÃÊ̤ʵ¼»÷¥Ï¥ó¥É¥ë¤¬¤¢¤ë¡£
282 ¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥é¥¤¥Ö¥é¥ê¸¡º÷½ç½ø¤Ë¤·¤¿¤¬¤Ã¤Æ¡¢
283 ¸¡º÷ÂоݤΥ·¥ó¥Ü¥ë¤¬ºÇ½é¤Ë¸½¤ì¤ë¤È¤³¤í¤òõ¤¹¡£
285 ¤Ï¡¢¥é¥¤¥Ö¥é¥ê¸¡º÷½ç½ø¤ÎÃæ¤Ç¸½ºß¤Î¥é¥¤¥Ö¥é¥ê°Ê¹ß¤ÇºÇ½é¤Ë
286 ´Ø¿ô¤¬¸½¤ì¤ë¤È¤³¤í¤òõ¤¹¡£¤³¤Îµ¡Ç½¤ò»È¤¦¤³¤È¤Ç¡¢Ê̤ζ¦Í¥é¥¤¥Ö¥é¥ê¤Î
287 ´Ø¿ô¤Ø¤Î¥é¥Ã¥Ñ¡¼¤òÄ󶡤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£
291 ¤ÏưŪ¥é¥¤¥Ö¥é¥ê¤Î¥Ï¥ó¥É¥ë
293 ¤Î»²¾È¥«¥¦¥ó¥È¤ò 1 ¸º¤é¤¹¡£»²¾È¥«¥¦¥ó¥È¤¬ 0 ¤Ë¤Ê¤ê¡¢¥í¡¼¥É¤µ¤ì¤Æ¤¤¤ë
294 ¾¤Î¥é¥¤¥Ö¥é¥ê¤«¤é¤½¤Î¥é¥¤¥Ö¥é¥êÆâ¤Î¥·¥ó¥Ü¥ë¤¬»È¤ï¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢
295 ¤½¤ÎưŪ¥é¥¤¥Ö¥é¥ê¤ò¥¢¥ó¥í¡¼¥É¤¹¤ë¡£
299 ¤Ï¡¢À®¸ù¤·¤¿¾ì¹ç¤Ï 0 ¤òÊÖ¤·¡¢¥¨¥é¡¼¤Î¾ì¹ç 0 °Ê³°¤òÊÖ¤¹¡£
300 .SS "Çѻߤµ¤ì¤¿¥·¥ó¥Ü¥ë _init() ¤È _fini()"
305 ¤òÆÃÊ̤ʥ·¥ó¥Ü¥ë¤È²ò¼á¤¹¤ë¡£
308 ¤È¤¤¤¦Ì¾Á°¤Î¥ë¡¼¥Á¥ó¤¬¥¨¥¯¥¹¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ì¤Ð¡¢
309 ¤½¤Î¥³¡¼¥É¤Ï¡¢¥é¥¤¥Ö¥é¥ê¤Î¥í¡¼¥É¸å¡¢¤«¤Ä
311 ¤¬Éüµ¢¤¹¤ëÁ°¤Ë¼Â¹Ô¤µ¤ì¤ë¡£
314 ¤È¤¤¤¦Ì¾Á°¤Î¥ë¡¼¥Á¥ó¤¬¥¨¥¯¥¹¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ì¤Ð¡¢
315 ¥é¥¤¥Ö¥é¥ê¤¬¥¢¥ó¥í¡¼¥É¤µ¤ì¤ëľÁ°¤Ë¤½¤Î¥ë¡¼¥Á¥ó¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¡£
316 ¥·¥¹¥Æ¥à¤Îµ¯Æ°¥Õ¥¡¥¤¥ë¤ËÂФ¹¤ë¥ê¥ó¥¯¤òÈò¤±¤ëɬÍפ¬¤¢¤ë¾ì¹ç¡¢
320 ¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ì¤Ð¤è¤¤¡£
322 ¤³¤Î¥ë¡¼¥Á¥ó¤ä¡¢gcc ¤Î¥ª¥×¥·¥ç¥ó
326 ¤Ï»ÈÍѤ·¤Ê¤¤¤³¤È¤ò¿ä¾©¤¹¤ë¡£
327 ¤³¤ì¤é¤ò»È¤¦¤È¡¢Ë¾¤Þ¤·¤¯¤Ê¤¤Æ°ºî¤ò¤¹¤ë¤³¤È¤¬¤¢¤ë¡£
328 ¤Ê¤¼¤Ê¤é¡¢(ÆÃÊ̤ÊÁ¼ÃÖ¤¬¹Ô¤ï¤ì¤Ê¤¤¸Â¤ê) ¤³¤ì¤é¤Î constructor/destructor
329 ¥ë¡¼¥Á¥ó¤Ï¼Â¹Ô¤µ¤ì¤Ê¤¤¤«¤é¤Ç¤¢¤ë¡£
330 .\" void _init(void) __attribute__((constructor));
331 .\" void _fini(void) __attribute__((destructor));
333 Âå¤ï¤ê¤Ë¡¢¥é¥¤¥Ö¥é¥ê¤Ï
334 .B __attribute__((constructor))
336 .B __attribute__((destructor))
337 ¤Î´Ø¿ô°À¤ò»È¤Ã¤ÆɬÍפʥ롼¥Á¥ó¤ò¥¨¥¯¥¹¥Ý¡¼¥È¤¹¤ë¤Î¤¬¤è¤¤¡£
338 ¤³¤ì¤é¤Ë¤Ä¤¤¤Æ¤Ï gcc ¤Î info ¥Ú¡¼¥¸¤ò»²¾È¤Î¤³¤È¡£
339 constructor ¥ë¡¼¥Á¥ó¤Ï
341 ¤¬Éüµ¢¤¹¤ëÁ°¤Ë¼Â¹Ô¤µ¤ì¡¢
342 destructor ¥ë¡¼¥Á¥ó¤Ï
344 ¤¬Éüµ¢¤¹¤ëÁ°¤Ë¼Â¹Ô¤µ¤ì¤ë¡£
345 .SS GNU ¤Ç¤Î³ÈÄ¥: dladdr() ¤È dlvsym()
346 glibc ¤Ç¤Ï POSIX ¤Ë¤ÏµºÜ¤µ¤ì¤Æ¤¤¤Ê¤¤´Ø¿ô¤¬ 2¤ÄÄɲ䵤ì¤Æ¤¤¤ë¡£
347 ¥×¥í¥È¥¿¥¤¥×¤Ï°Ê²¼¤ÎÄ̤ê¤Ç¤¢¤ë¡£
350 .B #define _GNU_SOURCE
351 .B #include <dlfcn.h>
353 .BI "int dladdr(void *" addr ", Dl_info *" info );
355 .BI "void *dlvsym(void *" handle ", char *" symbol ", char *" version );
360 ¤Ï¡¢´Ø¿ô¤Î¥Ý¥¤¥ó¥¿¤ò°ú¤¿ô¤Ë¤È¤ê¡¢´Ø¿ô¤Î̾Á°¤È´Ø¿ô¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë
361 ¥Õ¥¡¥¤¥ë¤Î²ò·è¤ò»î¤ß¤ë¡£¾ðÊó¤Ï
368 const char *dli_fname; /* Pathname of shared object that
370 void *dli_fbase; /* Address at which shared object
372 const char *dli_sname; /* Name of nearest symbol with address
373 lower than \fIaddr\fP */
374 void *dli_saddr; /* Exact address of symbol named
375 in \fIdli_sname\fP */
381 ¤Ë¥Þ¥Ã¥Á¤¹¤ë¥·¥ó¥Ü¥ë¤¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¡¢
385 ¤Ï NULL ¤Ë¥»¥Ã¥È¤µ¤ì¤ë¡£
388 ¤Ï¡¢¥¨¥é¡¼»þ¤Ë¤Ï 0 ¤òÊÖ¤·¡¢À®¸ù¤·¤¿¾ì¹ç¤Ï 0 °Ê³°¤òÊÖ¤¹¡£
394 ¤ÈƱ¤¸Æ°ºî¤ò¤¹¤ë¤¬¡¢¥Ð¡¼¥¸¥ç¥ó¤Îʸ»úÎó¤òÅϤ¹°ú¤¿ô¤¬
395 Äɲ䵤ì¤Æ¤¤¤ëÅÀ¤¬°Û¤Ê¤ë
397 ¤Ï¥Ð¡¼¥¸¥ç¥ó 2.1 °Ê¹ß¤Î glibc ¤ÇÄ󶡤µ¤ì¤Æ¤¤¤ë)¡£
416 ¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Î¤ß͸ú¤È¤Ê¤ë¡£
419 .\" ¤¬ÊÖ¤¹Ê¸»úÎó¤ÏÊѹ¹¤¹¤Ù¤¤Ç¤Ï¤Ê¤¤¡£¥·¥¹¥Æ¥à¤Ë¤è¤Ã¤Æ¤Ï¡¢
420 .\" °Ê²¼¤Î¤è¤¦¤Ê¥×¥í¥È¥¿¥¤¥×¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡£
423 .\" .B "const char *dlerror(void);"
426 glibc 2.2.3 °Ê¹ß¤Ç¤Ï¡¢
428 ¤ò»È¤Ã¤Æ¡¢¥é¥¤¥Ö¥é¥ê¤¬¥¢¥ó¥í¡¼¥É¤µ¤ì¤ëºÝ¤Ë¼«Æ°Åª¤Ë¸Æ¤Ó½Ð¤µ¤ì¤ë
429 ½ªÎ»¥Ï¥ó¥É¥é (exit handler) ¤òÅÐÏ¿¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£
431 dlopen ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Îɸ½à¤Ï SunOS ¤ò¤â¤È¤Ë¤·¤Æ¤¤¤ë¡£
440 ¤ËÅϤ·¤¿´Ø¿ô¥Ý¥¤¥ó¥¿¤Ï¶Ã¤¯¤è¤¦¤ÊÃͤˤʤ뤳¤È¤¬¤¢¤ë¡£
441 ¤¤¤¯¤Ä¤«¤Î¥¢¡¼¥¥Æ¥¯¥Á¥ã (ÆÃ¤Ë i386 ¤È x86_64) ¤Ç¤Ï¡¢
442 °ú¤¿ô¤È¤·¤Æ»ÈÍѤ·¤¿´Ø¿ô¤¬Æ°Åª¥ê¥ó¥¯¥é¥¤¥Ö¥é¥ê¤ÇÄêµÁ¤µ¤ì¤ë¤â¤Î¤Ç
449 ¤ò¸Æ¤Ó½Ð¤·¤¿¥ª¥Ö¥¸¥§¥¯¥È¤ò»²¾È¤·¤¿¾õÂ֤ǽª¤ï¤Ã¤Æ¤¤¤ë¤³¤È¤¬¤¢¤ë¡£
451 ÌäÂê¤Ï¡¢´Ø¿ô¥Ý¥¤¥ó¥¿¤Î²ò·è¤Ïº£¤Ê¤ª¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¹Ô¤ï¤ì¤ë¤¬¡¢
452 ¤½¤Î¥Ý¥¤¥ó¥¿¤Ï¸µ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î
454 (Procedure Linkage Table) ¥»¥¯¥·¥ç¥ó¤ò»Ø¤·¤Æ¤¤¤ë¤À¤±¤À¤È¤¤¤¦ÅÀ¤Ë¤¢¤ë
455 (¥ª¥Ö¥¸¥§¥¯¥È¼«ÂΤϡ¢¥À¥¤¥Ê¥ß¥Ã¥¯¥ê¥ó¥«¤Ë¤è¤Ã¤Æ¥·¥ó¥Ü¥ë¤Î²ò·è¤¬¹Ô¤ï¤ì¤¿¸å¤Ë¡¢
456 ´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¤ò¹Ô¤¦)¡£
457 ¤³¤ì¤ËÂн褹¤ëÊýË¡¤È¤·¤Æ¤Ï¡¢
458 ¥³¡¼¥É¤ò position-independent ¤Ç¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤È¤¤¤¦ÊýË¡¤¬¤¢¤ë¡£
459 ¤½¤¦¤¹¤ë¤È¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¥Ý¥¤¥ó¥¿¤òÍÑ°Õ¤¹¤ë¤³¤È¤¬¤Ç¤¤º¡¢
464 ¤Ë´Ø¿ô¥Ý¥¤¥ó¥¿¤òÅϤ¹Á°¤Ë¡¢
466 (Global Offset Table) ¤«¤éºÇ½ªÅª¤Ê¥·¥ó¥Ü¥ë¤Î¥¢¥É¥ì¥¹¤ò¥í¡¼¥É¤¹¤ë¤À¤±¤Î
469 math ¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¡¢2.0 ¤Î;¸¹¤òɽ¼¨¤¹¤ë
477 main(int argc, char **argv)
480 double (*cosine)(double);
483 handle = dlopen("libm.so", RTLD_LAZY);
485 fprintf(stderr, "%s\en", dlerror());
489 dlerror(); /* Clear any existing error */
491 /* Writing: cosine = (double (*)(double)) dlsym(handle, "cos");
492 would seem more natural, but the C99 standard leaves
493 casting from "void *" to a function pointer undefined.
494 The assignment used below is the POSIX.1\-2003 (Technical
495 Corrigendum 1) workaround; see the Rationale for the
496 POSIX specification of dlsym(). */
498 *(void **) (&cosine) = dlsym(handle, "cos");
499 .\" But in fact "gcc -O2 -Wall" will complain about the preceding cast.
501 if ((error = dlerror()) != NULL) {
502 fprintf(stderr, "%s\en", error);
506 printf("%f\en", (*cosine)(2.0));
512 ¤³¤Î¥×¥í¥°¥é¥à¤ò "foo.c" ¤Ë½ñ¤¤¤¿¤È¤¹¤ë¤È¡¢°Ê²¼¤Î¥³¥Þ¥ó¥É¤Ç¥×¥í¥°¥é¥à¤ò
516 gcc \-rdynamic \-o foo foo.c \-ldl
522 ¤ò¥¨¥¯¥¹¥Ý¡¼¥È¤¹¤ë¥é¥¤¥Ö¥é¥ê¤Î¾ì¹ç¤Ï
523 °Ê²¼¤Î¤è¤¦¤Ë¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤¹¤ëɬÍפ¬¤¢¤ë¡£
524 Îã¤È¤·¤Æ \fIbar.c\fP ¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¾ì¹ç:
527 gcc \-shared \-nostartfiles \-o bar bar.c
532 .BR dl_iterate_phdr (3),
533 .BR feature_test_macros (7),
537 ld.so info pages, gcc info pages, ld info pages