]>
Commit | Line | Data |
---|---|---|
1 | .TH DYLD 1 "December 14, 2009" "Apple Inc." | |
2 | .SH NAME | |
3 | dyld \- the dynamic link editor | |
4 | .SH SYNOPSIS | |
5 | DYLD_FRAMEWORK_PATH | |
6 | .br | |
7 | DYLD_FALLBACK_FRAMEWORK_PATH | |
8 | .br | |
9 | DYLD_VERSIONED_FRAMEWORK_PATH | |
10 | .br | |
11 | DYLD_LIBRARY_PATH | |
12 | .br | |
13 | DYLD_FALLBACK_LIBRARY_PATH | |
14 | .br | |
15 | DYLD_VERSIONED_LIBRARY_PATH | |
16 | .br | |
17 | DYLD_ROOT_PATH | |
18 | .br | |
19 | DYLD_SHARED_REGION | |
20 | .br | |
21 | DYLD_INSERT_LIBRARIES | |
22 | .br | |
23 | DYLD_FORCE_FLAT_NAMESPACE | |
24 | .br | |
25 | DYLD_IMAGE_SUFFIX | |
26 | .br | |
27 | DYLD_PRINT_OPTS | |
28 | .br | |
29 | DYLD_PRINT_ENV | |
30 | .br | |
31 | DYLD_PRINT_LIBRARIES | |
32 | .br | |
33 | DYLD_PRINT_LIBRARIES_POST_LAUNCH | |
34 | .br | |
35 | DYLD_BIND_AT_LAUNCH | |
36 | .br | |
37 | DYLD_NO_FIX_PREBINDING | |
38 | .br | |
39 | DYLD_DISABLE_DOFS | |
40 | .br | |
41 | DYLD_PRINT_APIS | |
42 | .br | |
43 | DYLD_PRINT_BINDINGS | |
44 | .br | |
45 | DYLD_PRINT_INITIALIZERS | |
46 | .br | |
47 | DYLD_PRINT_REBASINGS | |
48 | .br | |
49 | DYLD_PRINT_SEGMENTS | |
50 | .br | |
51 | DYLD_PRINT_STATISTICS | |
52 | .br | |
53 | DYLD_PRINT_DOFS | |
54 | .br | |
55 | DYLD_PRINT_RPATHS | |
56 | .br | |
57 | DYLD_SHARED_CACHE_DIR | |
58 | .br | |
59 | DYLD_SHARED_CACHE_DONT_VALIDATE | |
60 | .SH DESCRIPTION | |
61 | The dynamic linker uses the following environment variables. | |
62 | They affect any program that uses the dynamic linker. | |
63 | .TP | |
64 | .B DYLD_FRAMEWORK_PATH | |
65 | This is a colon separated list of directories that contain frameworks. | |
66 | The dynamic linker searches these directories before it searches for the | |
67 | framework by its install name. | |
68 | It allows you to test new versions of existing | |
69 | frameworks. (A framework is a library install name that ends in the form | |
70 | XXX.framework/Versions/YYY/XXX or XXX.framework/XXX, where XXX and YYY are any | |
71 | name.) | |
72 | .IP | |
73 | For each framework that a program uses, the dynamic linker looks for the | |
74 | framework in each directory in | |
75 | .SM DYLD_FRAMEWORK_PATH | |
76 | in turn. If it looks in all the directories and can't find the framework, it | |
77 | searches the directories in | |
78 | .SM DYLD_LIBRARY_PATH | |
79 | in turn. If it still can't find the framework, it then searches | |
80 | .SM DYLD_FALLBACK_FRAMEWORK_PATH | |
81 | and | |
82 | .SM DYLD_FALLBACK_LIBRARY_PATH | |
83 | in turn. | |
84 | .IP | |
85 | Use the | |
86 | .B \-L | |
87 | option to | |
88 | .IR otool (1). | |
89 | to discover the frameworks and shared libraries that the executable | |
90 | is linked against. | |
91 | .TP | |
92 | .B DYLD_FALLBACK_FRAMEWORK_PATH | |
93 | This is a colon separated list of directories that contain frameworks. | |
94 | It is used as the default location for frameworks not found in their install | |
95 | path. | |
96 | ||
97 | By default, it is set to | |
98 | /Library/Frameworks:/Network/Library/Frameworks:/System/Library/Frameworks | |
99 | .TP | |
100 | .B DYLD_VERSIONED_FRAMEWORK_PATH | |
101 | This is a colon separated list of directories that contain potential override frameworks. | |
102 | The dynamic linker searches these directories for frameworks. For | |
103 | each framework found dyld looks at its LC_ID_DYLIB and gets the current_version | |
104 | and install name. Dyld then looks for the framework at the install name path. | |
105 | Whichever has the larger current_version value will be used in the process whenever | |
106 | a framework with that install name is required. This is similar to DYLD_FRAMEWORK_PATH | |
107 | except instead of always overriding, it only overrides is the supplied framework is newer. | |
108 | Note: dyld does not check the framework's Info.plist to find its version. Dyld only | |
109 | checks the -currrent_version number supplied when the framework was created. | |
110 | .TP | |
111 | .B DYLD_LIBRARY_PATH | |
112 | This is a colon separated list of directories that contain libraries. The | |
113 | dynamic linker searches these directories before it searches the default | |
114 | locations for libraries. It allows you to test new versions of existing | |
115 | libraries. | |
116 | .IP | |
117 | For each library that a program uses, the dynamic linker looks for it in each | |
118 | directory in | |
119 | .SM DYLD_LIBRARY_PATH | |
120 | in turn. If it still can't find the library, it then searches | |
121 | .SM DYLD_FALLBACK_FRAMEWORK_PATH | |
122 | and | |
123 | .SM DYLD_FALLBACK_LIBRARY_PATH | |
124 | in turn. | |
125 | .IP | |
126 | Use the | |
127 | .B \-L | |
128 | option to | |
129 | .IR otool (1). | |
130 | to discover the frameworks and shared libraries that the executable | |
131 | is linked against. | |
132 | .TP | |
133 | .B DYLD_FALLBACK_LIBRARY_PATH | |
134 | This is a colon separated list of directories that contain libraries. | |
135 | It is used as the default location for libraries not found in their install | |
136 | path. | |
137 | By default, it is set | |
138 | to $(HOME)/lib:/usr/local/lib:/lib:/usr/lib. | |
139 | .TP | |
140 | .B DYLD_VERSIONED_LIBRARY_PATH | |
141 | This is a colon separated list of directories that contain potential override libraries. | |
142 | The dynamic linker searches these directories for dynamic libraries. For | |
143 | each library found dyld looks at its LC_ID_DYLIB and gets the current_version | |
144 | and install name. Dyld then looks for the library at the install name path. | |
145 | Whichever has the larger current_version value will be used in the process whenever | |
146 | a dylib with that install name is required. This is similar to DYLD_LIBRARY_PATH | |
147 | except instead of always overriding, it only overrides is the supplied library is newer. | |
148 | .TP | |
149 | .B DYLD_ROOT_PATH | |
150 | This is a colon separated list of directories. The dynamic linker will prepend each of | |
151 | this directory paths to every image access until a file is found. | |
152 | .TP | |
153 | .B DYLD_SHARED_REGION | |
154 | This can be "use" (the default), "avoid", or "private". Setting it to | |
155 | "avoid" tells dyld to not use the shared cache. All OS dylibs are loaded | |
156 | dynamically just like every other dylib. Setting it to "private" tells | |
157 | dyld to remove the shared region from the process address space and mmap() | |
158 | back in a private copy of the dyld shared cache in the shared region address | |
159 | range. This is only useful if the shared cache on disk has been updated | |
160 | and is different than the shared cache in use. | |
161 | .TP | |
162 | .B DYLD_INSERT_LIBRARIES | |
163 | This is a colon separated list of dynamic libraries to load before the ones | |
164 | specified in the program. This lets you test new modules of existing dynamic | |
165 | shared libraries that are used in flat-namespace images by loading a temporary | |
166 | dynamic shared library with just the new modules. Note that this has no | |
167 | effect on images built a two-level namespace images using a dynamic shared | |
168 | library unless | |
169 | .SM DYLD_FORCE_FLAT_NAMESPACE | |
170 | is also used. | |
171 | .TP | |
172 | .B DYLD_FORCE_FLAT_NAMESPACE | |
173 | Force all images in the program to be linked as flat-namespace images and ignore | |
174 | any two-level namespace bindings. This may cause programs to fail to execute | |
175 | with a multiply defined symbol error if two-level namespace images are used to | |
176 | allow the images to have multiply defined symbols. | |
177 | .TP | |
178 | .B DYLD_IMAGE_SUFFIX | |
179 | This is set to a string of a suffix to try to be used for all shared libraries | |
180 | used by the program. For libraries ending in ".dylib" the suffix is applied | |
181 | just before the ".dylib". For all other libraries the suffix is appended to the | |
182 | library name. This is useful for using conventional "_profile" and "_debug" | |
183 | libraries and frameworks. | |
184 | .TP | |
185 | .B DYLD_PRINT_OPTS | |
186 | When this is set, the dynamic linker writes to file descriptor 2 (normally | |
187 | standard error) the command line options. | |
188 | .TP | |
189 | .B DYLD_PRINT_ENV | |
190 | When this is set, the dynamic linker writes to file descriptor 2 (normally | |
191 | standard error) the environment variables. | |
192 | .TP | |
193 | .B DYLD_PRINT_LIBRARIES | |
194 | When this is set, the dynamic linker writes to file descriptor 2 (normally | |
195 | standard error) the filenames of the libraries the program is using. | |
196 | This is useful to make sure that the use of | |
197 | .SM DYLD_LIBRARY_PATH | |
198 | is getting what you want. | |
199 | .TP | |
200 | .B DYLD_PRINT_LIBRARIES_POST_LAUNCH | |
201 | This does the same as | |
202 | .SM DYLD_PRINT_LIBRARIES | |
203 | but the printing starts after the program gets to its entry point. | |
204 | .TP | |
205 | .B DYLD_BIND_AT_LAUNCH | |
206 | When this is set, the dynamic linker binds all undefined symbols | |
207 | the program needs at launch time. This includes function symbols that can are normally | |
208 | lazily bound at the time of their first call. | |
209 | .TP | |
210 | .B DYLD_PRINT_STATISTICS | |
211 | Right before the process's main() is called, dyld prints out information about how | |
212 | dyld spent its time. Useful for analyzing launch performance. | |
213 | .TP | |
214 | .B DYLD_NO_FIX_PREBINDING | |
215 | Normally, dyld will trigger the dyld shared cache to be regenerated if it notices | |
216 | the cache is out of date while launching a process. If this environment variable | |
217 | is set, dyld will not trigger a cache rebuild. This is useful to set while installing | |
218 | a large set of OS dylibs, to ensure the cache is not regenerated until the install | |
219 | is complete. | |
220 | .TP | |
221 | .B DYLD_DISABLE_DOFS | |
222 | Causes dyld not register dtrace static probes with the kernel. | |
223 | .TP | |
224 | .B DYLD_PRINT_INITIALIZERS | |
225 | Causes dyld to print out a line when running each initializers in every image. Initializers | |
226 | run by dyld included constructors for C++ statically allocated objects, functions marked with | |
227 | __attribute__((constructor)), and -init functions. | |
228 | .TP | |
229 | .B DYLD_PRINT_APIS | |
230 | Causes dyld to print a line whenever a dyld API is called (e.g. NSAddImage()). | |
231 | .TP | |
232 | .B DYLD_PRINT_SEGMENTS | |
233 | Causes dyld to print out a line containing the name and address range of each mach-o segment | |
234 | that dyld maps. In addition it prints information about if the image was from the dyld | |
235 | shared cache. | |
236 | .TP | |
237 | .B DYLD_PRINT_BINDINGS | |
238 | Causes dyld to print a line each time a symbolic name is bound. | |
239 | .TP | |
240 | .B DYLD_PRINT_DOFS | |
241 | Causes dyld to print out information about dtrace static probes registered with the kernel. | |
242 | .TP | |
243 | .B DYLD_PRINT_RPATHS | |
244 | Cause dyld to print a line each time it expands an @rpath variable and whether | |
245 | that expansion was successful or not. | |
246 | .TP | |
247 | .B DYLD_SHARED_CACHE_DIR | |
248 | This is a directory containing dyld shared cache files. This variable can be used in | |
249 | conjunction with DYLD_SHARED_REGION=private and DYLD_SHARED_CACHE_DONT_VALIDATE | |
250 | to run a process with an alternate shared cache. | |
251 | .TP | |
252 | .B DYLD_SHARED_CACHE_DONT_VALIDATE | |
253 | Causes dyld to not check that the inode and mod-time of files in the shared cache match | |
254 | the requested dylib on disk. Thus a program can be made to run with the dylib in the | |
255 | shared cache even though the real dylib has been updated on disk. | |
256 | .TP | |
257 | .SH DYNAMIC LIBRARY LOADING | |
258 | Unlike many other operating systems, Darwin does not locate dependent dynamic libraries | |
259 | via their leaf file name. Instead the full path to each dylib is used (e.g. /usr/lib/libSystem.B.dylib). | |
260 | But there are times when a full path is not appropriate; for instance, may want your | |
261 | binaries to be installable in anywhere on the disk. | |
262 | To support that, there are three @xxx/ variables that can be used as a path prefix. At runtime dyld | |
263 | substitutes a dynamically generated path for the @xxx/ prefix. | |
264 | .TP | |
265 | .B @executable_path/ | |
266 | This variable is replaced with the path to the directory containing the main executable for | |
267 | the process. This is useful for loading dylibs/frameworks embedded in a .app directory. | |
268 | If the main executable file is at /some/path/My.app/Contents/MacOS/My and a framework dylib | |
269 | file is at /some/path/My.app/Contents/Frameworks/Foo.framework/Versions/A/Foo, then | |
270 | the framework load path could be encoded as | |
271 | @executable_path/../Frameworks/Foo.framework/Versions/A/Foo and the .app directory could be | |
272 | moved around in the file system and dyld will still be able to load the embedded framework. | |
273 | .TP | |
274 | .B @loader_path/ | |
275 | This variable is replaced with the path to the directory containing the mach-o binary which | |
276 | contains the load command using @loader_path. Thus, in every binary, @loader_path resolves to | |
277 | a different path, whereas @executable_path always resolves to the same path. @loader_path is | |
278 | useful as the load path for a framework/dylib embedded in a plug-in, if the final file | |
279 | system location of the plugin-in unknown (so absolute paths cannot be used) or if the plug-in | |
280 | is used by multiple applications (so @executable_path cannot be used). If the plug-in mach-o | |
281 | file is at /some/path/Myfilter.plugin/Contents/MacOS/Myfilter and a framework dylib | |
282 | file is at /some/path/Myfilter.plugin/Contents/Frameworks/Foo.framework/Versions/A/Foo, then | |
283 | the framework load path could be encoded as | |
284 | @loader_path/../Frameworks/Foo.framework/Versions/A/Foo and the Myfilter.plugin directory could | |
285 | be moved around in the file system and dyld will still be able to load the embedded framework. | |
286 | .TP | |
287 | .B @rpath/ | |
288 | Dyld maintains a current stack of paths called the run path list. When @rpath is encountered | |
289 | it is substituted with each path in the run path list until a loadable dylib if found. | |
290 | The run path stack is built from the LC_RPATH load commands in the depencency chain | |
291 | that lead to the current dylib load. | |
292 | You can add an LC_RPATH load command to an image with the -rpath option to ld(1). You can | |
293 | even add a LC_RPATH load command path that starts with @loader_path/, and it will push a path | |
294 | on the run path stack that relative to the image containing the LC_RPATH. | |
295 | The use of @rpath is most useful when you have a complex directory structure of programs and | |
296 | dylibs which can be installed anywhere, but keep their relative positions. This scenario | |
297 | could be implemented using @loader_path, but every client of a dylib could need a different | |
298 | load path because its relative position in the file system is different. The use of @rpath | |
299 | introduces a level of indirection that simplies things. You pick a location in your directory | |
300 | structure as an anchor point. Each dylib then gets an install path that starts with @rpath | |
301 | and is the path to the dylib relative to the anchor point. Each main executable is linked | |
302 | with -rpath @loader_path/zzz, where zzz is the path from the executable to the anchor point. | |
303 | At runtime dyld sets it run path to be the anchor point, then each dylib is found relative | |
304 | to the anchor point. | |
305 | .SH "SEE ALSO" | |
306 | libtool(1), ld(1), otool(1) |