xref: /freebsd/share/man/man5/link.5 (revision fa9896e082a1046ff4fbc75fcba4d18d1f2efc19)
1b35481d4SNate Williams.\" Copyright (c) 1993 Paul Kranenburg
2b35481d4SNate Williams.\" All rights reserved.
3b35481d4SNate Williams.\"
4b35481d4SNate Williams.\" Redistribution and use in source and binary forms, with or without
5b35481d4SNate Williams.\" modification, are permitted provided that the following conditions
6b35481d4SNate Williams.\" are met:
7b35481d4SNate Williams.\" 1. Redistributions of source code must retain the above copyright
8b35481d4SNate Williams.\"    notice, this list of conditions and the following disclaimer.
9b35481d4SNate Williams.\" 2. Redistributions in binary form must reproduce the above copyright
10b35481d4SNate Williams.\"    notice, this list of conditions and the following disclaimer in the
11b35481d4SNate Williams.\"    documentation and/or other materials provided with the distribution.
12b35481d4SNate Williams.\" 3. All advertising materials mentioning features or use of this software
13b35481d4SNate Williams.\"    must display the following acknowledgement:
14b35481d4SNate Williams.\"      This product includes software developed by Paul Kranenburg.
15b35481d4SNate Williams.\" 3. The name of the author may not be used to endorse or promote products
16b35481d4SNate Williams.\"    derived from this software without specific prior written permission
17b35481d4SNate Williams.\"
18b35481d4SNate Williams.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19b35481d4SNate Williams.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20b35481d4SNate Williams.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21b35481d4SNate Williams.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22b35481d4SNate Williams.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23b35481d4SNate Williams.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24b35481d4SNate Williams.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25b35481d4SNate Williams.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26b35481d4SNate Williams.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27b35481d4SNate Williams.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28b35481d4SNate Williams.\"
29b35481d4SNate Williams.Dd October 23, 1993
30b35481d4SNate Williams.Dt LINK 5
31b35481d4SNate Williams.Os
32b35481d4SNate Williams.Sh NAME
33b35481d4SNate Williams.Nm link
34b35481d4SNate Williams.Nd dynamic loader and link editor interface
35b35481d4SNate Williams.Sh SYNOPSIS
3632eef9aeSRuslan Ermilov.In sys/types.h
3732eef9aeSRuslan Ermilov.In nlist.h
3832eef9aeSRuslan Ermilov.In link.h
39b35481d4SNate Williams.Sh DESCRIPTION
40b35481d4SNate WilliamsThe include file
41fe08efe6SRuslan Ermilov.In link.h
42b35481d4SNate Williamsdeclares several structures that are present in dynamically linked
43b35481d4SNate Williamsprograms and libraries.
44b35481d4SNate WilliamsThe structures define the interface between several components of the
454e86fcacSSheldon Hearnlink-editor and loader mechanism.
464e86fcacSSheldon HearnThe layout of a number of these
47b35481d4SNate Williamsstructures within the binaries resembles the a.out format in many places
48b35481d4SNate Williamsas it serves such similar functions as symbol definitions (including the
49b35481d4SNate Williamsaccompanying string table) and relocation records needed to resolve
504e86fcacSSheldon Hearnreferences to external entities.
514e86fcacSSheldon HearnIt also records a number of data structures
524e86fcacSSheldon Hearnunique to the dynamic loading and linking process.
534e86fcacSSheldon HearnThese include references
54b35481d4SNate Williamsto other objects that are required to complete the link-editing process and
55b35481d4SNate Williamsindirection tables to facilitate
56b35481d4SNate Williams.Em Position Independent Code
57b35481d4SNate Williams(PIC for short) to improve sharing of code pages among different processes.
584a8d0283SMike PritchardThe collection of data structures described here will be referred to as the
59b35481d4SNate Williams.Em Run-time Relocation Section (RRS)
60b35481d4SNate Williamsand is embedded in the standard text and data segments of the dynamically
61b35481d4SNate Williamslinked program or shared object image as the existing
62edf0e5b3SMike Pritchard.Xr a.out 5
63b35481d4SNate Williamsformat offers no room for it elsewhere.
64b35481d4SNate Williams.Pp
65b35481d4SNate WilliamsSeveral utilities cooperate to ensure that the task of getting a program
66b35481d4SNate Williamsready to run can complete successfully in a way that optimizes the use
674e86fcacSSheldon Hearnof system resources.
684e86fcacSSheldon HearnThe compiler emits PIC code from which shared libraries
69270d3d75SMike Pritchardcan be built by
70b35481d4SNate Williams.Xr ld 1 .
71b35481d4SNate WilliamsThe compiler also includes size information of any initialized data items
724e86fcacSSheldon Hearnthrough the .size assembler directive.
734e86fcacSSheldon HearnPIC code differs from conventional code
74b35481d4SNate Williamsin that it accesses data variables through an indirection table, the
754a8d0283SMike PritchardGlobal Offset Table, by convention accessible by the reserved name
76d0353b83SRuslan Ermilov.Dv _GLOBAL_OFFSET_TABLE_ .
77b35481d4SNate WilliamsThe exact mechanism used for this is machine dependent, usually a machine
784e86fcacSSheldon Hearnregister is reserved for the purpose.
794e86fcacSSheldon HearnThe rational behind this construct
804e86fcacSSheldon Hearnis to generate code that is independent of the actual load address.
814e86fcacSSheldon HearnOnly
82b35481d4SNate Williamsthe values contained in the Global Offset Table may need updating at run-time
83b35481d4SNate Williamsdepending on the load addresses of the various shared objects in the address
84b35481d4SNate Williamsspace.
85b35481d4SNate Williams.Pp
86b35481d4SNate WilliamsLikewise, procedure calls to globally defined functions are redirected through
87b35481d4SNate Williamsthe Procedure Linkage Table (PLT) residing in the data segment of the core
884e86fcacSSheldon Hearnimage.
894e86fcacSSheldon HearnAgain, this is done to avoid run-time modifications to the text segment.
90b35481d4SNate Williams.Pp
91b35481d4SNate WilliamsThe linker-editor allocates the Global Offset Table and Procedure Linkage Table
92b35481d4SNate Williamswhen combining PIC object files into an image suitable for mapping into the
934e86fcacSSheldon Hearnprocess address space.
944e86fcacSSheldon HearnIt also collects all symbols that may be needed by the
95b35481d4SNate Williamsrun-time link-editor and stores these along with the image's text and data bits.
96b35481d4SNate WilliamsAnother reserved symbol,
97b35481d4SNate Williams.Em _DYNAMIC
984e86fcacSSheldon Hearnis used to indicate the presence of the run-time linker structures.
994e86fcacSSheldon HearnWhenever
100b35481d4SNate Williams_DYNAMIC is relocated to 0, there is no need to invoke the run-time
1014e86fcacSSheldon Hearnlink-editor.
1024e86fcacSSheldon HearnIf this symbol is non-zero, it points at a data structure from
103b35481d4SNate Williamswhich the location of the necessary relocation- and symbol information can
1044e86fcacSSheldon Hearnbe derived.
1054e86fcacSSheldon HearnThis is most notably used by the start-up module,
106b35481d4SNate Williams.Em crt0 .
107b35481d4SNate WilliamsThe _DYNAMIC structure is conventionally located at the start of the data
108b35481d4SNate Williamssegment of the image to which it pertains.
109b35481d4SNate Williams.Sh DATA STRUCTURES
110b35481d4SNate WilliamsThe data structures supporting dynamic linking and run-time relocation
111b35481d4SNate Williamsreside both in the text and data segments of the image they apply to.
112b35481d4SNate WilliamsThe text segments contain read-only data such as symbols descriptions and
113b35481d4SNate Williamsnames, while the data segments contain the tables that need to be modified by
114b35481d4SNate Williamsduring the relocation process.
115b35481d4SNate Williams.Pp
116b35481d4SNate WilliamsThe _DYNAMIC symbol references a
117b35481d4SNate Williams.Fa _dynamic
118b35481d4SNate Williamsstructure:
119b35481d4SNate Williams.Bd -literal -offset indent
120b35481d4SNate Williamsstruct	_dynamic {
121b35481d4SNate Williams	int	d_version;
122b35481d4SNate Williams	struct 	so_debug *d_debug;
123b35481d4SNate Williams	union {
124b35481d4SNate Williams		struct section_dispatch_table *d_sdt;
125b35481d4SNate Williams	} d_un;
126b35481d4SNate Williams	struct  ld_entry *d_entry;
127b35481d4SNate Williams};
128b35481d4SNate Williams.Ed
129b35481d4SNate Williams.Bl -tag -width d_version
130b35481d4SNate Williams.It Fa d_version
131b35481d4SNate WilliamsThis field provides for different versions of the dynamic linking
1324e86fcacSSheldon Hearnimplementation.
1334e86fcacSSheldon HearnThe current version numbers understood by
134edf0e5b3SMike Pritchard.Xr ld 1
135edf0e5b3SMike Pritchardand
136edf0e5b3SMike Pritchard.Xr ld.so 1
137edf0e5b3SMike Pritchardare
138b35481d4SNate Williams.Em LD_VERSION_SUN (3) ,
139dd5527c6SMike Pritchardwhich is used by the
140dd5527c6SMike Pritchard.Tn SunOS
141dd5527c6SMike Pritchard4.x releases, and
142b35481d4SNate Williams.Em LD_VERSION_BSD (8) ,
143dd5527c6SMike Pritchardwhich has been in use since
144dd5527c6SMike Pritchard.Fx 1.1 .
145b35481d4SNate Williams.It Fa d_un
146b35481d4SNate WilliamsRefers to a
147b35481d4SNate Williams.Em d_version
148b35481d4SNate Williamsdependent data structure.
149b35481d4SNate Williams.It Fa so_debug
150b35481d4SNate Williamsthis field provides debuggers with a hook to access symbol tables of shared
151b35481d4SNate Williamsobjects loaded as a result of the actions of the run-time link-editor.
152b35481d4SNate Williams.El
153b35481d4SNate Williams.Pp
154b35481d4SNate WilliamsThe
155b35481d4SNate Williams.Fa section_dispatch_table
156b35481d4SNate Williamsstructure is the main
157b35481d4SNate Williams.Dq dispatcher
158b35481d4SNate Williamstable, containing offsets into the image's segments where various symbol
159b35481d4SNate Williamsand relocation information is located.
160b35481d4SNate Williams.Bd -literal -offset indent
161b35481d4SNate Williamsstruct section_dispatch_table {
162b35481d4SNate Williams	struct	so_map *sdt_loaded;
163b35481d4SNate Williams	long	sdt_sods;
164b35481d4SNate Williams	long	sdt_filler1;
165b35481d4SNate Williams	long	sdt_got;
166b35481d4SNate Williams	long	sdt_plt;
167b35481d4SNate Williams	long	sdt_rel;
168b35481d4SNate Williams	long	sdt_hash;
169b35481d4SNate Williams	long	sdt_nzlist;
170b35481d4SNate Williams	long	sdt_filler2;
171b35481d4SNate Williams	long	sdt_buckets;
172b35481d4SNate Williams	long	sdt_strings;
173b35481d4SNate Williams	long	sdt_str_sz;
174b35481d4SNate Williams	long	sdt_text_sz;
175b35481d4SNate Williams	long	sdt_plt_sz;
176b35481d4SNate Williams};
177b35481d4SNate Williams.Ed
178b35481d4SNate Williams.Bl -tag -width sdt_filler1
179b35481d4SNate Williams.It Fa sdt_loaded
1805203edcdSRuslan ErmilovA pointer to the first link map loaded (see below).
1815203edcdSRuslan ErmilovThis field is set by
182edf0e5b3SMike Pritchard.Nm ld.so
183b35481d4SNate Williams.It Fa sdt_sods
184b35481d4SNate WilliamsThe start of a (linked) list of shared object descriptors needed by
185b35481d4SNate Williams.Em this
186b35481d4SNate Williamsobject.
187b35481d4SNate Williams.It Fa sdt_filler1
1884a8d0283SMike PritchardDeprecated (used by SunOS to specify library search rules).
189b35481d4SNate Williams.It Fa sdt_got
190b35481d4SNate WilliamsThe location of the Global Offset Table within this image.
191b35481d4SNate Williams.It Fa sdt_plt
192b35481d4SNate WilliamsThe location of the Procedure Linkage Table within this image.
193b35481d4SNate Williams.It Fa sdt_rel
194b35481d4SNate WilliamsThe location of an array of
195b35481d4SNate Williams.Fa relocation_info
196b35481d4SNate Williamsstructures
197c4d9468eSRuslan Ermilov(see
198c4d9468eSRuslan Ermilov.Xr a.out 5 )
199b35481d4SNate Williamsspecifying run-time relocations.
200b35481d4SNate Williams.It Fa sdt_hash
201b35481d4SNate WilliamsThe location of the hash table for fast symbol lookup in this object's
202b35481d4SNate Williamssymbol table.
203b35481d4SNate Williams.It Fa sdt_nzlist
204b35481d4SNate WilliamsThe location of the symbol table.
205b35481d4SNate Williams.It Fa sdt_filler2
206b35481d4SNate WilliamsCurrently unused.
207b35481d4SNate Williams.It Fa sdt_buckets
208b35481d4SNate WilliamsThe number of buckets in
209b35481d4SNate Williams.Fa sdt_hash
210b35481d4SNate Williams.It Fa sdt_strings
211b35481d4SNate WilliamsThe location of the symbol string table that goes with
212b35481d4SNate Williams.Fa sdt_nzlist .
213b35481d4SNate Williams.It Fa sdt_str_sz
214b35481d4SNate WilliamsThe size of the string table.
215b35481d4SNate Williams.It Fa sdt_text_sz
216b35481d4SNate WilliamsThe size of the object's text segment.
217b35481d4SNate Williams.It Fa sdt_plt_sz
218b35481d4SNate WilliamsThe size of the Procedure Linkage Table.
219b35481d4SNate Williams.El
220b35481d4SNate Williams.Pp
221b35481d4SNate WilliamsA
222b35481d4SNate Williams.Fa sod
2234a8d0283SMike Pritchardstructure describes a shared object that is needed
224b35481d4SNate Williamsto complete the link edit process of the object containing it.
225b35481d4SNate WilliamsA list of such objects
226c4d9468eSRuslan Ermilov(chained through
227c4d9468eSRuslan Ermilov.Fa sod_next )
228b35481d4SNate Williamsis pointed at
229b35481d4SNate Williamsby the
230b35481d4SNate Williams.Fa sdt_sods
231b35481d4SNate Williamsin the section_dispatch_table structure.
232b35481d4SNate Williams.Bd -literal -offset indent
233b35481d4SNate Williamsstruct sod {
234b35481d4SNate Williams	long	sod_name;
235b35481d4SNate Williams	u_int	sod_library : 1,
23697021799SAndreas Schulz		sod_reserved : 31;
237b35481d4SNate Williams	short	sod_major;
238b35481d4SNate Williams	short	sod_minor;
239b35481d4SNate Williams	long	sod_next;
240b35481d4SNate Williams};
241b35481d4SNate Williams.Ed
242b35481d4SNate Williams.Bl -tag -width sod_library
243b35481d4SNate Williams.It Fa sod_name
244b35481d4SNate WilliamsThe offset in the text segment of a string describing this link object.
245b35481d4SNate Williams.It Fa sod_library
246b35481d4SNate WilliamsIf set,
247b35481d4SNate Williams.Fa sod_name
248edf0e5b3SMike Pritchardspecifies a library that is to be searched for by
249edf0e5b3SMike Pritchard.Nm ld.so .
250edf0e5b3SMike PritchardThe path name
251b35481d4SNate Williamsis obtained by searching a set of directories
252c4d9468eSRuslan Ermilov(see also
253c4d9468eSRuslan Ermilov.Xr ldconfig 8 )
254b35481d4SNate Williamsfor a shared object matching
255b35481d4SNate Williams.Em lib\&<sod_name>\&.so.n.m .
256b35481d4SNate WilliamsIf not set,
257b35481d4SNate Williams.Fa sod_name
258b35481d4SNate Williamsshould point at a full path name for the desired shared object.
259b35481d4SNate Williams.It Fa sod_major
260b35481d4SNate WilliamsSpecifies the major version number of the shared object to load.
261b35481d4SNate Williams.It Fa sod_minor
262dd76c703SKris KennawaySpecifies the preferred minor version number of the shared object to load.
263b35481d4SNate Williams.El
264b35481d4SNate Williams.Pp
265b35481d4SNate WilliamsThe run-time link-editor maintains a list of structures called
266b35481d4SNate Williams.Em link maps
267b35481d4SNate Williamsto keep track of all shared objects loaded into a process' address space.
268b35481d4SNate WilliamsThese structures are only used at run-time and do not occur within
269b35481d4SNate Williamsthe text or data segment of an executable or shared library.
270b35481d4SNate Williams.Bd -literal -offset indent
271b35481d4SNate Williamsstruct so_map {
272b35481d4SNate Williams	caddr_t	som_addr;
273b35481d4SNate Williams	char 	*som_path;
274b35481d4SNate Williams	struct	so_map *som_next;
275b35481d4SNate Williams	struct	sod *som_sod;
276b35481d4SNate Williams	caddr_t som_sodbase;
277b35481d4SNate Williams	u_int	som_write : 1;
278b35481d4SNate Williams	struct	_dynamic *som_dynamic;
279b35481d4SNate Williams	caddr_t	som_spd;
280b35481d4SNate Williams};
281b35481d4SNate Williams.Ed
282b35481d4SNate Williams.Bl -tag -width som_dynamic
283b35481d4SNate Williams.It Fa som_addr
284b35481d4SNate WilliamsThe address at which the shared object associated with this link map has
285b35481d4SNate Williamsbeen loaded.
286b35481d4SNate Williams.It Fa som_path
287b35481d4SNate WilliamsThe full path name of the loaded object.
288b35481d4SNate Williams.It Fa som_next
289b35481d4SNate WilliamsPointer to the next link map.
290b35481d4SNate Williams.It Fa som_sod
291b35481d4SNate WilliamsThe
292b35481d4SNate Williams.Fa sod
293b35481d4SNate Williamsstructure that was responsible for loading this shared object.
294b35481d4SNate Williams.It Fa som_sodbase
295912467dcSChristian BruefferTossed out in later versions of the run-time linker.
296b35481d4SNate Williams.It Fa som_write
297b35481d4SNate WilliamsSet if (some portion of) this object's text segment is currently writable.
298b35481d4SNate Williams.It Fa som_dynamic
299b35481d4SNate WilliamsPointer to this object's
300b35481d4SNate Williams.Fa _dynamic
301b35481d4SNate Williamsstructure.
302b35481d4SNate Williams.It Fa som_spd
303b35481d4SNate WilliamsHook for attaching private data maintained by the run-time link-editor.
304b35481d4SNate Williams.El
305b35481d4SNate Williams.Pp
3064e86fcacSSheldon HearnSymbol description with size.
3074e86fcacSSheldon HearnThis is simply an
308b35481d4SNate Williams.Fa nlist
309b35481d4SNate Williamsstructure with one field
310b35481d4SNate Williams.Pq Fa nz_size
3114e86fcacSSheldon Hearnadded.
3124e86fcacSSheldon HearnUsed to convey size information on items in the data segment
3134e86fcacSSheldon Hearnof shared objects.
3144e86fcacSSheldon HearnAn array of these lives in the shared object's
315b35481d4SNate Williamstext segment and is addressed by the
316b35481d4SNate Williams.Fa sdt_nzlist
317b35481d4SNate Williamsfield of
318b35481d4SNate Williams.Fa section_dispatch_table .
319b35481d4SNate Williams.Bd -literal -offset indent
320b35481d4SNate Williamsstruct nzlist {
321b35481d4SNate Williams	struct nlist	nlist;
322b35481d4SNate Williams	u_long		nz_size;
323b35481d4SNate Williams#define nz_un		nlist.n_un
324b35481d4SNate Williams#define nz_strx		nlist.n_un.n_strx
325b35481d4SNate Williams#define nz_name		nlist.n_un.n_name
326b35481d4SNate Williams#define nz_type		nlist.n_type
327b35481d4SNate Williams#define nz_value	nlist.n_value
328b35481d4SNate Williams#define nz_desc		nlist.n_desc
329b35481d4SNate Williams#define nz_other	nlist.n_other
330b35481d4SNate Williams};
331b35481d4SNate Williams.Ed
332b35481d4SNate Williams.Bl -tag -width nz_size
333b35481d4SNate Williams.It Fa nlist
334c4d9468eSRuslan Ermilov(see
335c4d9468eSRuslan Ermilov.Xr nlist 3 ) .
336b35481d4SNate Williams.It Fa nz_size
337b35481d4SNate WilliamsThe size of the data represented by this symbol.
338b35481d4SNate Williams.El
339b35481d4SNate Williams.Pp
340d1ed27b6SJens SchweikhardtA hash table is included within the text segment of shared object
341b35481d4SNate Williamsto facilitate quick lookup of symbols during run-time link-editing.
342b35481d4SNate WilliamsThe
343b35481d4SNate Williams.Fa sdt_hash
344b35481d4SNate Williamsfield of the
345b35481d4SNate Williams.Fa section_dispatch_table
346b35481d4SNate Williamsstructure points at an array of
347b35481d4SNate Williams.Fa rrs_hash
348b35481d4SNate Williamsstructures:
349b35481d4SNate Williams.Bd -literal -offset indent
350b35481d4SNate Williamsstruct rrs_hash {
351b35481d4SNate Williams	int	rh_symbolnum;		/* symbol number */
352b35481d4SNate Williams	int	rh_next;		/* next hash entry */
353b35481d4SNate Williams};
354b35481d4SNate Williams.Ed
355b35481d4SNate Williams.Bl -tag -width rh_symbolnum
356b35481d4SNate Williams.It Fa rh_symbolnum
357b35481d4SNate WilliamsThe index of the symbol in the shared object's symbol table (as given by the
358b35481d4SNate Williams.Fa ld_symbols
359b35481d4SNate Williamsfield).
360b35481d4SNate Williams.It Fa rh_next
361b35481d4SNate WilliamsIn case of collisions, this field is the offset of the next entry in this
3624e86fcacSSheldon Hearnhash table bucket.
3634e86fcacSSheldon HearnIt is zero for the last bucket element.
364b35481d4SNate Williams.El
365b35481d4SNate WilliamsThe
366b35481d4SNate Williams.Fa rt_symbol
367b35481d4SNate Williamsstructure is used to keep track of run-time allocated commons
3684e86fcacSSheldon Hearnand data items copied from shared objects.
3694e86fcacSSheldon HearnThese items are kept on linked list
370b35481d4SNate Williamsand is exported through the
371b35481d4SNate Williams.Fa dd_cc
372b35481d4SNate Williamsfield in the
373b35481d4SNate Williams.Fa so_debug
374b35481d4SNate Williamsstructure (see below) for use by debuggers.
375b35481d4SNate Williams.Bd -literal -offset indent
376b35481d4SNate Williamsstruct rt_symbol {
377b35481d4SNate Williams	struct nzlist		*rt_sp;
378b35481d4SNate Williams	struct rt_symbol	*rt_next;
379b35481d4SNate Williams	struct rt_symbol	*rt_link;
380b35481d4SNate Williams	caddr_t			rt_srcaddr;
381b35481d4SNate Williams	struct so_map		*rt_smp;
382b35481d4SNate Williams};
383b35481d4SNate Williams.Ed
384b35481d4SNate Williams.Bl -tag -width rt_scraddr
385b35481d4SNate Williams.It Fa rt_sp
386b35481d4SNate WilliamsThe symbol description.
387b35481d4SNate Williams.It Fa rt_next
388b35481d4SNate WilliamsVirtual address of next rt_symbol.
389b35481d4SNate Williams.It Fa rt_link
3904e86fcacSSheldon HearnNext in hash bucket.
391912467dcSChristian BruefferUsed internally by
392edf0e5b3SMike Pritchard.Nm ld.so .
393b35481d4SNate Williams.It Fa rt_srcaddr
394b35481d4SNate WilliamsLocation of the source of initialized data within a shared object.
395b35481d4SNate Williams.It Fa rt_smp
396b35481d4SNate WilliamsThe shared object which is the original source of the data that this
397b35481d4SNate Williamsrun-time symbol describes.
398b35481d4SNate Williams.El
399b35481d4SNate Williams.Pp
400b35481d4SNate WilliamsThe
401b35481d4SNate Williams.Fa so_debug
402b35481d4SNate Williamsstructure is used by debuggers to gain knowledge of any shared objects
403b35481d4SNate Williamsthat have been loaded in the process's address space as a result of run-time
4044e86fcacSSheldon Hearnlink-editing.
4054e86fcacSSheldon HearnSince the run-time link-editor runs as a part of process
406b35481d4SNate Williamsinitialization, a debugger that wishes to access symbols from shared objects
407b35481d4SNate Williamscan only do so after the link-editor has been called from crt0.
408b35481d4SNate WilliamsA dynamically linked binary contains a
409b35481d4SNate Williams.Fa so_debug
410b35481d4SNate Williamsstructure which can be located by means of the
411b35481d4SNate Williams.Fa d_debug
412b35481d4SNate Williamsfield in
413b35481d4SNate Williams.Fa _dynamic .
414b35481d4SNate Williams.Bd -literal -offset indent
415b35481d4SNate Williamsstruct 	so_debug {
416b35481d4SNate Williams	int	dd_version;
417b35481d4SNate Williams	int	dd_in_debugger;
418b35481d4SNate Williams	int	dd_sym_loaded;
419b35481d4SNate Williams	char    *dd_bpt_addr;
420b35481d4SNate Williams	int	dd_bpt_shadow;
421b35481d4SNate Williams	struct rt_symbol *dd_cc;
422b35481d4SNate Williams};
423b35481d4SNate Williams.Ed
424b35481d4SNate Williams.Bl -tag -width dd_in_debugger
425b35481d4SNate Williams.It Fa dd_version
426b35481d4SNate WilliamsVersion number of this interface.
427b35481d4SNate Williams.It Fa dd_in_debugger
428b35481d4SNate WilliamsSet by the debugger to indicate to the run-time linker that the program is
429b35481d4SNate Williamsrun under control of a debugger.
430b35481d4SNate Williams.It Fa dd_sym_loaded
431b35481d4SNate WilliamsSet by the run-time linker whenever it adds symbols by loading shared objects.
432b35481d4SNate Williams.It Fa dd_bpt_addr
433912467dcSChristian BruefferThe address where a breakpoint will be set by the run-time linker to
4344e86fcacSSheldon Hearndivert control to the debugger.
4354e86fcacSSheldon HearnThis address is determined by the start-up
436b35481d4SNate Williamsmodule,
437d0353b83SRuslan Ermilov.Pa crt0.o ,
438019f1378SMike Pritchardto be some convenient place before the call to _main.
439019f1378SMike Pritchard.It Fa dd_bpt_shadow
440b35481d4SNate WilliamsContains the original instruction that was at
441b35481d4SNate Williams.Fa dd_bpt_addr .
442b35481d4SNate WilliamsThe debugger is expected to put this instruction back before continuing the
443b35481d4SNate Williamsprogram.
444b35481d4SNate Williams.It Fa dd_cc
445b35481d4SNate WilliamsA pointer to the linked list of run-time allocated symbols that the debugger
446b35481d4SNate Williamsmay be interested in.
447b35481d4SNate Williams.El
448b35481d4SNate Williams.Pp
449b35481d4SNate WilliamsThe
450b35481d4SNate Williams.Em ld_entry
451edf0e5b3SMike Pritchardstructure defines a set of service routines within
452edf0e5b3SMike Pritchard.Nm ld.so .
453edf0e5b3SMike Pritchard.\" See
454edf0e5b3SMike Pritchard.\" .Xr libdl.a
455edf0e5b3SMike Pritchard.\" for more information.
456b35481d4SNate Williams.Bd -literal -offset indent
457b35481d4SNate Williamsstruct ld_entry {
458b35481d4SNate Williams	void	*(*dlopen)(char *, int);
459b35481d4SNate Williams	int	(*dlclose)(void *);
460b35481d4SNate Williams	void	*(*dlsym)(void *, char *);
46197021799SAndreas Schulz	char	*(*dlerror)(void);
462b35481d4SNate Williams};
463b35481d4SNate Williams.Ed
4643136363fSRuslan Ermilov.Pp
465b35481d4SNate WilliamsThe
466b35481d4SNate Williams.Fa crt_ldso
467edf0e5b3SMike Pritchardstructure defines the interface between the start-up code in crt0 and
468edf0e5b3SMike Pritchard.Nm ld.so .
469b35481d4SNate Williams.Bd -literal -offset indent
470b35481d4SNate Williamsstruct crt_ldso {
471b35481d4SNate Williams	int		crt_ba;
472b35481d4SNate Williams	int		crt_dzfd;
473b35481d4SNate Williams	int		crt_ldfd;
474b35481d4SNate Williams	struct _dynamic	*crt_dp;
475b35481d4SNate Williams	char		**crt_ep;
476b35481d4SNate Williams	caddr_t		crt_bp;
477b35481d4SNate Williams	char		*crt_prog;
478b35481d4SNate Williams	char		*crt_ldso;
47997021799SAndreas Schulz	struct ld_entry	*crt_ldentry;
480b35481d4SNate Williams};
481b35481d4SNate Williams#define CRT_VERSION_SUN		1
48297021799SAndreas Schulz#define CRT_VERSION_BSD_2	2
48397021799SAndreas Schulz#define CRT_VERSION_BSD_3	3
48497021799SAndreas Schulz#define	CRT_VERSION_BSD_4	4
485b35481d4SNate Williams.Ed
486b35481d4SNate Williams.Bl -tag -width crt_dzfd
487b35481d4SNate Williams.It Fa crt_ba
488edf0e5b3SMike PritchardThe virtual address at which
489edf0e5b3SMike Pritchard.Nm ld.so
490edf0e5b3SMike Pritchardwas loaded by crt0.
491b35481d4SNate Williams.It Fa crt_dzfd
492b35481d4SNate WilliamsOn SunOS systems, this field contains an open file descriptor to
493edf0e5b3SMike Pritchard.Dq Pa /dev/zero
4944e86fcacSSheldon Hearnused to get demand paged zeroed pages.
4954e86fcacSSheldon HearnOn
496b5c508fbSRuslan Ermilov.Fx
497dd5527c6SMike Pritchardsystems it contains -1.
498b35481d4SNate Williams.It Fa crt_ldfd
499edf0e5b3SMike PritchardContains an open file descriptor that was used by crt0 to load
500edf0e5b3SMike Pritchard.Nm ld.so .
501b35481d4SNate Williams.It Fa crt_dp
502b35481d4SNate WilliamsA pointer to main's
503b35481d4SNate Williams.Fa _dynamic
504b35481d4SNate Williamsstructure.
505b35481d4SNate Williams.It Fa crt_ep
506b35481d4SNate WilliamsA pointer to the environment strings.
507b35481d4SNate Williams.It Fa crt_bp
508b35481d4SNate WilliamsThe address at which a breakpoint will be placed by the run-time linker
509b35481d4SNate Williamsif the main program is run by a debugger.
510b35481d4SNate WilliamsSee
511b35481d4SNate Williams.Fa so_debug
512b35481d4SNate Williams.It Fa crt_prog
513b35481d4SNate WilliamsThe name of the main program as determined by crt0 (CRT_VERSION_BSD3 only).
514b35481d4SNate Williams.It Fa crt_ldso
515b35481d4SNate WilliamsThe path of the run-time linker as mapped by crt0 (CRT_VERSION_BSD4 only).
516b35481d4SNate Williams.El
517b35481d4SNate Williams.Pp
518b35481d4SNate WilliamsThe
519b35481d4SNate Williams.Fa hints_header
520b35481d4SNate Williamsand
521b35481d4SNate Williams.Fa hints_bucket
522b35481d4SNate Williamsstructures define the layout of the library hints, normally found in
523edf0e5b3SMike Pritchard.Dq Pa /var/run/ld.so.hints ,
524edf0e5b3SMike Pritchardwhich is used by
525edf0e5b3SMike Pritchard.Nm ld.so
526edf0e5b3SMike Pritchardto quickly locate the shared object images in the
527b35481d4SNate Williamsfile system.
528b35481d4SNate WilliamsThe organization of the hints file is not unlike that of an
529b35481d4SNate Williams.Dq a.out
530b35481d4SNate Williamsobject file, in that it contains a header determining the offset and size
531b35481d4SNate Williamsof a table of fixed sized hash buckets and a common string pool.
532b35481d4SNate Williams.Bd -literal -offset indent
533b35481d4SNate Williamsstruct hints_header {
534b35481d4SNate Williams	long		hh_magic;
535b35481d4SNate Williams#define HH_MAGIC	011421044151
536b35481d4SNate Williams	long		hh_version;
537b35481d4SNate Williams#define LD_HINTS_VERSION_1	1
538b35481d4SNate Williams	long		hh_hashtab;
539b35481d4SNate Williams	long		hh_nbucket;
540b35481d4SNate Williams	long		hh_strtab;
541b35481d4SNate Williams	long		hh_strtab_sz;
542b35481d4SNate Williams	long		hh_ehints;
543b35481d4SNate Williams};
544b35481d4SNate Williams.Ed
545b35481d4SNate Williams.Bl -tag -width hh_strtab_sz
546b35481d4SNate Williams.It Fa hh_magic
547b35481d4SNate WilliamsHints file magic number.
548b35481d4SNate Williams.It Fa hh_version
549b35481d4SNate WilliamsInterface version number.
550b35481d4SNate Williams.It Fa hh_hashtab
551b35481d4SNate WilliamsOffset of hash table.
552b35481d4SNate Williams.It Fa hh_strtab
553b35481d4SNate WilliamsOffset of string table.
554b35481d4SNate Williams.It Fa hh_strtab_sz
555b35481d4SNate WilliamsSize of strings.
556b35481d4SNate Williams.It Fa hh_ehints
557b35481d4SNate WilliamsMaximum usable offset in hints file.
558b35481d4SNate Williams.El
559b35481d4SNate Williams.Bd -literal -offset indent
560b35481d4SNate Williams/*
561b35481d4SNate Williams * Hash table element in hints file.
562b35481d4SNate Williams */
563b35481d4SNate Williamsstruct hints_bucket {
564b35481d4SNate Williams	int		hi_namex;
565b35481d4SNate Williams	int		hi_pathx;
566b35481d4SNate Williams	int		hi_dewey[MAXDEWEY];
567b35481d4SNate Williams	int		hi_ndewey;
568b35481d4SNate Williams#define hi_major hi_dewey[0]
569b35481d4SNate Williams#define hi_minor hi_dewey[1]
570b35481d4SNate Williams	int		hi_next;
571b35481d4SNate Williams};
572b35481d4SNate Williams.Ed
573b35481d4SNate Williams.Bl -tag -width hi_ndewey
574b35481d4SNate Williams.It Fa hi_namex
575b35481d4SNate WilliamsIndex of the string identifying the library.
576b35481d4SNate Williams.It Fa hi_pathx
577b35481d4SNate WilliamsIndex of the string representing the full path name of the library.
578b35481d4SNate Williams.It Fa hi_dewey
579b35481d4SNate WilliamsThe version numbers of the shared library.
580b35481d4SNate Williams.It Fa hi_ndewey
581b35481d4SNate WilliamsThe number of valid entries in
582b35481d4SNate Williams.Fa hi_dewey .
583b35481d4SNate Williams.It Fa hi_next
584b35481d4SNate WilliamsNext bucket in case of hashing collisions.
585b35481d4SNate Williams.El
586b35481d4SNate Williams.Sh CAVEATS
587b35481d4SNate WilliamsOnly the (GNU) C compiler currently supports the creation of shared libraries.
588b35481d4SNate WilliamsOther programming languages cannot be used.
589