xref: /freebsd/share/man/man5/link.5 (revision 4a8d02835c2544e65713d27352cb3be0bd5d1c84)
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.\"
294a8d0283SMike Pritchard.\"	$Id: link.5,v 1.3 1996/01/20 07:29:06 mpp Exp $
30b35481d4SNate Williams.\"
31b35481d4SNate Williams.Dd October 23, 1993
32b35481d4SNate Williams.Dt LINK 5
33b35481d4SNate Williams.Os
34b35481d4SNate Williams.Sh NAME
35b35481d4SNate Williams.Nm link
36b35481d4SNate Williams.Nd dynamic loader and link editor interface
37b35481d4SNate Williams.Sh SYNOPSIS
38b35481d4SNate Williams.Fd #include <link.h>
39b35481d4SNate Williams.Sh DESCRIPTION
40b35481d4SNate WilliamsThe include file
41b35481d4SNate Williams.Aq Pa 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
45b35481d4SNate Williamslink-editor and loader mechanism. The layout of a number of these
46b35481d4SNate Williamsstructures within the binaries resembles the a.out format in many places
47b35481d4SNate Williamsas it serves such similar functions as symbol definitions (including the
48b35481d4SNate Williamsaccompanying string table) and relocation records needed to resolve
49b35481d4SNate Williamsreferences to external entities. It also records a number of data structures
50b35481d4SNate Williamsunique to the dynamic loading and linking process. These include references
51b35481d4SNate Williamsto other objects that are required to complete the link-editing process and
52b35481d4SNate Williamsindirection tables to facilitate
53b35481d4SNate Williams.Em Position Independent Code
54b35481d4SNate Williams(PIC for short) to improve sharing of code pages among different processes.
554a8d0283SMike PritchardThe collection of data structures described here will be referred to as the
56b35481d4SNate Williams.Em Run-time Relocation Section (RRS)
57b35481d4SNate Williamsand is embedded in the standard text and data segments of the dynamically
58b35481d4SNate Williamslinked program or shared object image as the existing
59b35481d4SNate Williams.Xr a.out
60b35481d4SNate Williamsformat offers no room for it elsewhere.
61b35481d4SNate Williams.Pp
62b35481d4SNate WilliamsSeveral utilities cooperate to ensure that the task of getting a program
63b35481d4SNate Williamsready to run can complete successfully in a way that optimizes the use
64b35481d4SNate Williamsof system resources. The compiler emits PIC code from which shared libraries
65270d3d75SMike Pritchardcan be built by
66b35481d4SNate Williams.Xr ld 1 .
67b35481d4SNate WilliamsThe compiler also includes size information of any initialized data items
68b35481d4SNate Williamsthrough the .size assembler directive. PIC code differs from conventional code
69b35481d4SNate Williamsin that it accesses data variables through an indirection table, the
704a8d0283SMike PritchardGlobal Offset Table, by convention accessible by the reserved name
71b35481d4SNate Williams.Em _GLOBAL_OFFSET_TABLE_.
72b35481d4SNate WilliamsThe exact mechanism used for this is machine dependent, usually a machine
73b35481d4SNate Williamsregister is reserved for the purpose. The rational behind this construct
74b35481d4SNate Williamsis to generate code that is independent of the actual load address. Only
75b35481d4SNate Williamsthe values contained in the Global Offset Table may need updating at run-time
76b35481d4SNate Williamsdepending on the load addresses of the various shared objects in the address
77b35481d4SNate Williamsspace.
78b35481d4SNate Williams.Pp
79b35481d4SNate WilliamsLikewise, procedure calls to globally defined functions are redirected through
80b35481d4SNate Williamsthe Procedure Linkage Table (PLT) residing in the data segment of the core
81b35481d4SNate Williamsimage. Again, this is done to avoid run-time modifications to the text segment.
82b35481d4SNate Williams.Pp
83b35481d4SNate WilliamsThe linker-editor allocates the Global Offset Table and Procedure Linkage Table
84b35481d4SNate Williamswhen combining PIC object files into an image suitable for mapping into the
85b35481d4SNate Williamsprocess address space. It also collects all symbols that may be needed by the
86b35481d4SNate Williamsrun-time link-editor and stores these along with the image's text and data bits.
87b35481d4SNate WilliamsAnother reserved symbol,
88b35481d4SNate Williams.Em _DYNAMIC
89b35481d4SNate Williamsis used to indicate the presence of the run-time linker structures. Whenever
90b35481d4SNate Williams_DYNAMIC is relocated to 0, there is no need to invoke the run-time
91b35481d4SNate Williamslink-editor. If this symbol is non-zero, it points at a data structure from
92b35481d4SNate Williamswhich the location of the necessary relocation- and symbol information can
93b35481d4SNate Williamsbe derived. This is most notably used by the start-up module,
94b35481d4SNate Williams.Em crt0.
95b35481d4SNate WilliamsThe _DYNAMIC structure is conventionally located at the start of the data
96b35481d4SNate Williamssegment of the image to which it pertains.
97b35481d4SNate Williams.Pp
98b35481d4SNate Williams.Sh DATA STRUCTURES
99b35481d4SNate WilliamsThe data structures supporting dynamic linking and run-time relocation
100b35481d4SNate Williamsreside both in the text and data segments of the image they apply to.
101b35481d4SNate WilliamsThe text segments contain read-only data such as symbols descriptions and
102b35481d4SNate Williamsnames, while the data segments contain the tables that need to be modified by
103b35481d4SNate Williamsduring the relocation process.
104b35481d4SNate Williams.Pp
105b35481d4SNate WilliamsThe _DYNAMIC symbol references a
106b35481d4SNate Williams.Fa _dynamic
107b35481d4SNate Williamsstructure:
108b35481d4SNate Williams.Bd -literal -offset indent
109b35481d4SNate Williamsstruct	_dynamic {
110b35481d4SNate Williams	int	d_version;
111b35481d4SNate Williams	struct 	so_debug *d_debug;
112b35481d4SNate Williams	union {
113b35481d4SNate Williams		struct section_dispatch_table *d_sdt;
114b35481d4SNate Williams	} d_un;
115b35481d4SNate Williams	struct  ld_entry *d_entry;
116b35481d4SNate Williams};
117b35481d4SNate Williams.Ed
118b35481d4SNate Williams.Bl -tag -width d_version
119b35481d4SNate Williams.It Fa d_version
120b35481d4SNate WilliamsThis field provides for different versions of the dynamic linking
121b35481d4SNate Williamsimplementation. The current version numbers understood by ld and ld.so are
122b35481d4SNate Williams.Em LD_VERSION_SUN (3),
123b35481d4SNate Williamswhich is used by the SunOS 4.x releases, and
124b35481d4SNate Williams.Em LD_VERSION_BSD (8),
125b35481d4SNate Williamswhich is currently in use by FreeBSD since release 1.1.
126b35481d4SNate Williams.It Fa d_un
127b35481d4SNate WilliamsRefers to a
128b35481d4SNate Williams.Em d_version
129b35481d4SNate Williamsdependent data structure.
130b35481d4SNate Williams.It Fa so_debug
131b35481d4SNate Williamsthis field provides debuggers with a hook to access symbol tables of shared
132b35481d4SNate Williamsobjects loaded as a result of the actions of the run-time link-editor.
133b35481d4SNate Williams.El
134b35481d4SNate Williams.Pp
135b35481d4SNate WilliamsThe
136b35481d4SNate Williams.Fa section_dispatch_table
137b35481d4SNate Williamsstructure is the main
138b35481d4SNate Williams.Dq dispatcher
139b35481d4SNate Williamstable, containing offsets into the image's segments where various symbol
140b35481d4SNate Williamsand relocation information is located.
141b35481d4SNate Williams.Bd -literal -offset indent
142b35481d4SNate Williamsstruct section_dispatch_table {
143b35481d4SNate Williams	struct	so_map *sdt_loaded;
144b35481d4SNate Williams	long	sdt_sods;
145b35481d4SNate Williams	long	sdt_filler1;
146b35481d4SNate Williams	long	sdt_got;
147b35481d4SNate Williams	long	sdt_plt;
148b35481d4SNate Williams	long	sdt_rel;
149b35481d4SNate Williams	long	sdt_hash;
150b35481d4SNate Williams	long	sdt_nzlist;
151b35481d4SNate Williams	long	sdt_filler2;
152b35481d4SNate Williams	long	sdt_buckets;
153b35481d4SNate Williams	long	sdt_strings;
154b35481d4SNate Williams	long	sdt_str_sz;
155b35481d4SNate Williams	long	sdt_text_sz;
156b35481d4SNate Williams	long	sdt_plt_sz;
157b35481d4SNate Williams};
158b35481d4SNate Williams.Ed
159b35481d4SNate Williams.Pp
160b35481d4SNate Williams.Bl -tag -width sdt_filler1
161b35481d4SNate Williams.It Fa sdt_loaded
162b35481d4SNate WilliamsA pointer to the first link map loaded (see below). This field is set by
163b35481d4SNate Williams.Xr ld.so.
164b35481d4SNate Williams.It Fa sdt_sods
165b35481d4SNate WilliamsThe start of a (linked) list of shared object descriptors needed by
166b35481d4SNate Williams.Em this
167b35481d4SNate Williamsobject.
168b35481d4SNate Williams.It Fa sdt_filler1
1694a8d0283SMike PritchardDeprecated (used by SunOS to specify library search rules).
170b35481d4SNate Williams.It Fa sdt_got
171b35481d4SNate WilliamsThe location of the Global Offset Table within this image.
172b35481d4SNate Williams.It Fa sdt_plt
173b35481d4SNate WilliamsThe location of the Procedure Linkage Table within this image.
174b35481d4SNate Williams.It Fa sdt_rel
175b35481d4SNate WilliamsThe location of an array of
176b35481d4SNate Williams.Fa relocation_info
177b35481d4SNate Williamsstructures
178b35481d4SNate Williams.Po
179b35481d4SNate Williamssee
180b35481d4SNate Williams.Xr a.out 5
181b35481d4SNate Williams.Pc
182b35481d4SNate Williamsspecifying run-time relocations.
183b35481d4SNate Williams.It Fa sdt_hash
184b35481d4SNate WilliamsThe location of the hash table for fast symbol lookup in this object's
185b35481d4SNate Williamssymbol table.
186b35481d4SNate Williams.It Fa sdt_nzlist
187b35481d4SNate WilliamsThe location of the symbol table.
188b35481d4SNate Williams.It Fa sdt_filler2
189b35481d4SNate WilliamsCurrently unused.
190b35481d4SNate Williams.It Fa sdt_buckets
191b35481d4SNate WilliamsThe number of buckets in
192b35481d4SNate Williams.Fa sdt_hash
193b35481d4SNate Williams.It Fa sdt_strings
194b35481d4SNate WilliamsThe location of the symbol string table that goes with
195b35481d4SNate Williams.Fa sdt_nzlist.
196b35481d4SNate Williams.It Fa sdt_str_sz
197b35481d4SNate WilliamsThe size of the string table.
198b35481d4SNate Williams.It Fa sdt_text_sz
199b35481d4SNate WilliamsThe size of the object's text segment.
200b35481d4SNate Williams.It Fa sdt_plt_sz
201b35481d4SNate WilliamsThe size of the Procedure Linkage Table.
202b35481d4SNate Williams.El
203b35481d4SNate Williams.Pp
204b35481d4SNate WilliamsA
205b35481d4SNate Williams.Fa sod
2064a8d0283SMike Pritchardstructure describes a shared object that is needed
207b35481d4SNate Williamsto complete the link edit process of the object containing it.
208b35481d4SNate WilliamsA list of such objects
209b35481d4SNate Williams.Po
210b35481d4SNate Williamschained through
211b35481d4SNate Williams.Fa sod_next
212b35481d4SNate Williams.Pc
213b35481d4SNate Williamsis pointed at
214b35481d4SNate Williamsby the
215b35481d4SNate Williams.Fa sdt_sods
216b35481d4SNate Williamsin the section_dispatch_table structure.
217b35481d4SNate Williams.Bd -literal -offset indent
218b35481d4SNate Williamsstruct sod {
219b35481d4SNate Williams	long	sod_name;
220b35481d4SNate Williams	u_int	sod_library : 1,
22197021799SAndreas Schulz		sod_reserved : 31;
222b35481d4SNate Williams	short	sod_major;
223b35481d4SNate Williams	short	sod_minor;
224b35481d4SNate Williams	long	sod_next;
225b35481d4SNate Williams};
226b35481d4SNate Williams.Ed
227b35481d4SNate Williams.Pp
228b35481d4SNate Williams.Bl -tag -width sod_library
229b35481d4SNate Williams.It Fa sod_name
230b35481d4SNate WilliamsThe offset in the text segment of a string describing this link object.
231b35481d4SNate Williams.It Fa sod_library
232b35481d4SNate WilliamsIf set,
233b35481d4SNate Williams.Fa sod_name
234b35481d4SNate Williamsspecifies a library that is to be searched for by ld.so. The path name
235b35481d4SNate Williamsis obtained by searching a set of directories
236b35481d4SNate Williams.Po
237b35481d4SNate Williamssee also
238b35481d4SNate Williams.Xr ldconfig 8
239b35481d4SNate Williams.Pc
240b35481d4SNate Williamsfor a shared object matching
241b35481d4SNate Williams.Em lib\&<sod_name>\&.so.n.m.
242b35481d4SNate WilliamsIf not set,
243b35481d4SNate Williams.Fa sod_name
244b35481d4SNate Williamsshould point at a full path name for the desired shared object.
245b35481d4SNate Williams.It Fa sod_major
246b35481d4SNate WilliamsSpecifies the major version number of the shared object to load.
247b35481d4SNate Williams.It Fa sod_minor
248b35481d4SNate WilliamsSpecifies the prefered minor version number of the shared object to load.
249b35481d4SNate Williams.El
250b35481d4SNate Williams.Pp
251b35481d4SNate WilliamsThe run-time link-editor maintains a list of structures called
252b35481d4SNate Williams.Em link maps
253b35481d4SNate Williamsto keep track of all shared objects loaded into a process' address space.
254b35481d4SNate WilliamsThese structures are only used at run-time and do not occur within
255b35481d4SNate Williamsthe text or data segment of an executable or shared library.
256b35481d4SNate Williams.Bd -literal -offset indent
257b35481d4SNate Williamsstruct so_map {
258b35481d4SNate Williams	caddr_t	som_addr;
259b35481d4SNate Williams	char 	*som_path;
260b35481d4SNate Williams	struct	so_map *som_next;
261b35481d4SNate Williams	struct	sod *som_sod;
262b35481d4SNate Williams	caddr_t som_sodbase;
263b35481d4SNate Williams	u_int	som_write : 1;
264b35481d4SNate Williams	struct	_dynamic *som_dynamic;
265b35481d4SNate Williams	caddr_t	som_spd;
266b35481d4SNate Williams};
267b35481d4SNate Williams.Ed
268b35481d4SNate Williams.Bl -tag -width som_dynamic
269b35481d4SNate Williams.It Fa som_addr
270b35481d4SNate WilliamsThe address at which the shared object associated with this link map has
271b35481d4SNate Williamsbeen loaded.
272b35481d4SNate Williams.It Fa som_path
273b35481d4SNate WilliamsThe full path name of the loaded object.
274b35481d4SNate Williams.It Fa som_next
275b35481d4SNate WilliamsPointer to the next link map.
276b35481d4SNate Williams.It Fa som_sod
277b35481d4SNate WilliamsThe
278b35481d4SNate Williams.Fa sod
279b35481d4SNate Williamsstructure that was responsible for loading this shared object.
280b35481d4SNate Williams.It Fa som_sodbase
281b35481d4SNate WilliamsTossed in later versions the run-time linker.
282b35481d4SNate Williams.It Fa som_write
283b35481d4SNate WilliamsSet if (some portion of) this object's text segment is currently writable.
284b35481d4SNate Williams.It Fa som_dynamic
285b35481d4SNate WilliamsPointer to this object's
286b35481d4SNate Williams.Fa _dynamic
287b35481d4SNate Williamsstructure.
288b35481d4SNate Williams.It Fa som_spd
289b35481d4SNate WilliamsHook for attaching private data maintained by the run-time link-editor.
290b35481d4SNate Williams.El
291b35481d4SNate Williams.Pp
292b35481d4SNate WilliamsSymbol description with size. This is simply an
293b35481d4SNate Williams.Fa nlist
294b35481d4SNate Williamsstructure with one field
295b35481d4SNate Williams.Pq Fa nz_size
296b35481d4SNate Williamsadded. Used to convey size information on items in the data segment
297b35481d4SNate Williamsof shared objects. An array of these lives in the shared object's
298b35481d4SNate Williamstext segment and is addressed by the
299b35481d4SNate Williams.Fa sdt_nzlist
300b35481d4SNate Williamsfield of
301b35481d4SNate Williams.Fa section_dispatch_table.
302b35481d4SNate Williams.Bd -literal -offset indent
303b35481d4SNate Williamsstruct nzlist {
304b35481d4SNate Williams	struct nlist	nlist;
305b35481d4SNate Williams	u_long		nz_size;
306b35481d4SNate Williams#define nz_un		nlist.n_un
307b35481d4SNate Williams#define nz_strx		nlist.n_un.n_strx
308b35481d4SNate Williams#define nz_name		nlist.n_un.n_name
309b35481d4SNate Williams#define nz_type		nlist.n_type
310b35481d4SNate Williams#define nz_value	nlist.n_value
311b35481d4SNate Williams#define nz_desc		nlist.n_desc
312b35481d4SNate Williams#define nz_other	nlist.n_other
313b35481d4SNate Williams};
314b35481d4SNate Williams.Ed
315b35481d4SNate Williams.Bl -tag -width nz_size
316b35481d4SNate Williams.It Fa nlist
317b35481d4SNate Williams.Po
318b35481d4SNate Williamssee
319b35481d4SNate Williams.Xr nlist 5
320b35481d4SNate Williams.Pc .
321b35481d4SNate Williams.It Fa nz_size
322b35481d4SNate WilliamsThe size of the data represented by this symbol.
323b35481d4SNate Williams.El
324b35481d4SNate Williams.Pp
325b35481d4SNate WilliamsA hash table is included within the text segment of shared object to
326b35481d4SNate Williamsto facilitate quick lookup of symbols during run-time link-editing.
327b35481d4SNate WilliamsThe
328b35481d4SNate Williams.Fa sdt_hash
329b35481d4SNate Williamsfield of the
330b35481d4SNate Williams.Fa section_dispatch_table
331b35481d4SNate Williamsstructure points at an array of
332b35481d4SNate Williams.Fa rrs_hash
333b35481d4SNate Williamsstructures:
334b35481d4SNate Williams.Bd -literal -offset indent
335b35481d4SNate Williamsstruct rrs_hash {
336b35481d4SNate Williams	int	rh_symbolnum;		/* symbol number */
337b35481d4SNate Williams	int	rh_next;		/* next hash entry */
338b35481d4SNate Williams};
339b35481d4SNate Williams.Ed
340b35481d4SNate Williams.Pp
341b35481d4SNate Williams.Bl -tag -width rh_symbolnum
342b35481d4SNate Williams.It Fa rh_symbolnum
343b35481d4SNate WilliamsThe index of the symbol in the shared object's symbol table (as given by the
344b35481d4SNate Williams.Fa ld_symbols
345b35481d4SNate Williamsfield).
346b35481d4SNate Williams.It Fa rh_next
347b35481d4SNate WilliamsIn case of collisions, this field is the offset of the next entry in this
348b35481d4SNate Williamshash table bucket. It is zero for the last bucket element.
349b35481d4SNate Williams.El
350b35481d4SNate WilliamsThe
351b35481d4SNate Williams.Fa rt_symbol
352b35481d4SNate Williamsstructure is used to keep track of run-time allocated commons
353b35481d4SNate Williamsand data items copied from shared objects. These items are kept on linked list
354b35481d4SNate Williamsand is exported through the
355b35481d4SNate Williams.Fa dd_cc
356b35481d4SNate Williamsfield in the
357b35481d4SNate Williams.Fa so_debug
358b35481d4SNate Williamsstructure (see below) for use by debuggers.
359b35481d4SNate Williams.Bd -literal -offset indent
360b35481d4SNate Williamsstruct rt_symbol {
361b35481d4SNate Williams	struct nzlist		*rt_sp;
362b35481d4SNate Williams	struct rt_symbol	*rt_next;
363b35481d4SNate Williams	struct rt_symbol	*rt_link;
364b35481d4SNate Williams	caddr_t			rt_srcaddr;
365b35481d4SNate Williams	struct so_map		*rt_smp;
366b35481d4SNate Williams};
367b35481d4SNate Williams.Ed
368b35481d4SNate Williams.Pp
369b35481d4SNate Williams.Bl -tag -width rt_scraddr
370b35481d4SNate Williams.It Fa rt_sp
371b35481d4SNate WilliamsThe symbol description.
372b35481d4SNate Williams.It Fa rt_next
373b35481d4SNate WilliamsVirtual address of next rt_symbol.
374b35481d4SNate Williams.It Fa rt_link
375b35481d4SNate WilliamsNext in hash bucket. Used by internally by ld.so.
376b35481d4SNate Williams.It Fa rt_srcaddr
377b35481d4SNate WilliamsLocation of the source of initialized data within a shared object.
378b35481d4SNate Williams.It Fa rt_smp
379b35481d4SNate WilliamsThe shared object which is the original source of the data that this
380b35481d4SNate Williamsrun-time symbol describes.
381b35481d4SNate Williams.El
382b35481d4SNate Williams.Pp
383b35481d4SNate WilliamsThe
384b35481d4SNate Williams.Fa so_debug
385b35481d4SNate Williamsstructure is used by debuggers to gain knowledge of any shared objects
386b35481d4SNate Williamsthat have been loaded in the process's address space as a result of run-time
387b35481d4SNate Williamslink-editing. Since the run-time link-editor runs as a part of process
388b35481d4SNate Williamsinitialization, a debugger that wishes to access symbols from shared objects
389b35481d4SNate Williamscan only do so after the link-editor has been called from crt0.
390b35481d4SNate WilliamsA dynamically linked binary contains a
391b35481d4SNate Williams.Fa so_debug
392b35481d4SNate Williamsstructure which can be located by means of the
393b35481d4SNate Williams.Fa d_debug
394b35481d4SNate Williamsfield in
395b35481d4SNate Williams.Fa _dynamic.
396b35481d4SNate Williams.Bd -literal -offset indent
397b35481d4SNate Williamsstruct 	so_debug {
398b35481d4SNate Williams	int	dd_version;
399b35481d4SNate Williams	int	dd_in_debugger;
400b35481d4SNate Williams	int	dd_sym_loaded;
401b35481d4SNate Williams	char    *dd_bpt_addr;
402b35481d4SNate Williams	int	dd_bpt_shadow;
403b35481d4SNate Williams	struct rt_symbol *dd_cc;
404b35481d4SNate Williams};
405b35481d4SNate Williams.Ed
406b35481d4SNate Williams.Pp
407b35481d4SNate Williams.Bl -tag -width dd_in_debugger
408b35481d4SNate Williams.It Fa dd_version
409b35481d4SNate WilliamsVersion number of this interface.
410b35481d4SNate Williams.It Fa dd_in_debugger
411b35481d4SNate WilliamsSet by the debugger to indicate to the run-time linker that the program is
412b35481d4SNate Williamsrun under control of a debugger.
413b35481d4SNate Williams.It Fa dd_sym_loaded
414b35481d4SNate WilliamsSet by the run-time linker whenever it adds symbols by loading shared objects.
415b35481d4SNate Williams.It Fa dd_bpt_addr
416b35481d4SNate WilliamsThe address were a breakpoint will be set by the the run-time linker to
417b35481d4SNate Williamsdivert control to the debugger. This address is determined by the start-up
418b35481d4SNate Williamsmodule,
419b35481d4SNate Williams.Em crt0.o,
420b35481d4SNate Williamsto be some convenient place before the call to _main.<.It Fa dd_bpt_shadow
421b35481d4SNate WilliamsContains the original instruction that was at
422b35481d4SNate Williams.Fa dd_bpt_addr.
423b35481d4SNate WilliamsThe debugger is expected to put this instruction back before continuing the
424b35481d4SNate Williamsprogram.
425b35481d4SNate Williams.It Fa dd_cc
426b35481d4SNate WilliamsA pointer to the linked list of run-time allocated symbols that the debugger
427b35481d4SNate Williamsmay be interested in.
428b35481d4SNate Williams.El
429b35481d4SNate Williams.Pp
430b35481d4SNate WilliamsThe
431b35481d4SNate Williams.Em ld_entry
432b35481d4SNate Williamsstructure defines a set of service routines within ld.so. See
433b35481d4SNate Williams.Xr libdl.a
434b35481d4SNate Williamsfor more information.
435b35481d4SNate Williams.Bd -literal -offset indent
436b35481d4SNate Williamsstruct ld_entry {
437b35481d4SNate Williams	void	*(*dlopen)(char *, int);
438b35481d4SNate Williams	int	(*dlclose)(void *);
439b35481d4SNate Williams	void	*(*dlsym)(void *, char *);
44097021799SAndreas Schulz	char	*(*dlerror)(void);
441b35481d4SNate Williams};
442b35481d4SNate Williams.Ed
443b35481d4SNate Williams
444b35481d4SNate WilliamsThe
445b35481d4SNate Williams.Fa crt_ldso
446b35481d4SNate Williamsstructure defines the interface between the start-up code in crt0 and ld.so.
447b35481d4SNate Williams.Bd -literal -offset indent
448b35481d4SNate Williamsstruct crt_ldso {
449b35481d4SNate Williams	int		crt_ba;
450b35481d4SNate Williams	int		crt_dzfd;
451b35481d4SNate Williams	int		crt_ldfd;
452b35481d4SNate Williams	struct _dynamic	*crt_dp;
453b35481d4SNate Williams	char		**crt_ep;
454b35481d4SNate Williams	caddr_t		crt_bp;
455b35481d4SNate Williams	char		*crt_prog;
456b35481d4SNate Williams	char		*crt_ldso;
45797021799SAndreas Schulz	struct ld_entry	*crt_ldentry;
458b35481d4SNate Williams};
459b35481d4SNate Williams#define CRT_VERSION_SUN		1
46097021799SAndreas Schulz#define CRT_VERSION_BSD_2	2
46197021799SAndreas Schulz#define CRT_VERSION_BSD_3	3
46297021799SAndreas Schulz#define	CRT_VERSION_BSD_4	4
463b35481d4SNate Williams.Ed
464b35481d4SNate Williams.Bl -tag -width crt_dzfd
465b35481d4SNate Williams.It Fa crt_ba
466b35481d4SNate WilliamsThe virtual address at which ld.so was loaded by crt0.
467b35481d4SNate Williams.It Fa crt_dzfd
468b35481d4SNate WilliamsOn SunOS systems, this field contains an open file descriptor to
469b35481d4SNate Williams.Dq /dev/zero
470b35481d4SNate Williamsused to get demand paged zeroed pages. On FreeBSD systems it contains -1.
471b35481d4SNate Williams.It Fa crt_ldfd
472b35481d4SNate WilliamsContains an open file descriptor that was used by crt0 to load ld.so.
473b35481d4SNate Williams.It Fa crt_dp
474b35481d4SNate WilliamsA pointer to main's
475b35481d4SNate Williams.Fa _dynamic
476b35481d4SNate Williamsstructure.
477b35481d4SNate Williams.It Fa crt_ep
478b35481d4SNate WilliamsA pointer to the environment strings.
479b35481d4SNate Williams.It Fa crt_bp
480b35481d4SNate WilliamsThe address at which a breakpoint will be placed by the run-time linker
481b35481d4SNate Williamsif the main program is run by a debugger.
482b35481d4SNate WilliamsSee
483b35481d4SNate Williams.Fa so_debug
484b35481d4SNate Williams.It Fa crt_prog
485b35481d4SNate WilliamsThe name of the main program as determined by crt0 (CRT_VERSION_BSD3 only).
486b35481d4SNate Williams.It Fa crt_ldso
487b35481d4SNate WilliamsThe path of the run-time linker as mapped by crt0 (CRT_VERSION_BSD4 only).
488b35481d4SNate Williams.El
489b35481d4SNate Williams.Pp
490b35481d4SNate WilliamsThe
491b35481d4SNate Williams.Fa hints_header
492b35481d4SNate Williamsand
493b35481d4SNate Williams.Fa hints_bucket
494b35481d4SNate Williamsstructures define the layout of the library hints, normally found in
495b35481d4SNate Williams.Dq /var/run/ld.so.hints,
496b35481d4SNate Williamswhich is used by ld.so to quickly locate the shared object images in the
497b35481d4SNate Williamsfilesystem.
498b35481d4SNate WilliamsThe organization of the hints file is not unlike that of an
499b35481d4SNate Williams.Dq a.out
500b35481d4SNate Williamsobject file, in that it contains a header determining the offset and size
501b35481d4SNate Williamsof a table of fixed sized hash buckets and a common string pool.
502b35481d4SNate Williams.Bd -literal -offset indent
503b35481d4SNate Williamsstruct hints_header {
504b35481d4SNate Williams	long		hh_magic;
505b35481d4SNate Williams#define HH_MAGIC	011421044151
506b35481d4SNate Williams	long		hh_version;
507b35481d4SNate Williams#define LD_HINTS_VERSION_1	1
508b35481d4SNate Williams	long		hh_hashtab;
509b35481d4SNate Williams	long		hh_nbucket;
510b35481d4SNate Williams	long		hh_strtab;
511b35481d4SNate Williams	long		hh_strtab_sz;
512b35481d4SNate Williams	long		hh_ehints;
513b35481d4SNate Williams};
514b35481d4SNate Williams.Ed
515b35481d4SNate Williams.Bl -tag -width hh_strtab_sz
516b35481d4SNate Williams.It Fa hh_magic
517b35481d4SNate WilliamsHints file magic number.
518b35481d4SNate Williams.It Fa hh_version
519b35481d4SNate WilliamsInterface version number.
520b35481d4SNate Williams.It Fa hh_hashtab
521b35481d4SNate WilliamsOffset of hash table.
522b35481d4SNate Williams.It Fa hh_strtab
523b35481d4SNate WilliamsOffset of string table.
524b35481d4SNate Williams.It Fa hh_strtab_sz
525b35481d4SNate WilliamsSize of strings.
526b35481d4SNate Williams.It Fa hh_ehints
527b35481d4SNate WilliamsMaximum usable offset in hints file.
528b35481d4SNate Williams.El
529b35481d4SNate Williams.Pp
530b35481d4SNate Williams.Bd -literal -offset indent
531b35481d4SNate Williams/*
532b35481d4SNate Williams * Hash table element in hints file.
533b35481d4SNate Williams */
534b35481d4SNate Williamsstruct hints_bucket {
535b35481d4SNate Williams	int		hi_namex;
536b35481d4SNate Williams	int		hi_pathx;
537b35481d4SNate Williams	int		hi_dewey[MAXDEWEY];
538b35481d4SNate Williams	int		hi_ndewey;
539b35481d4SNate Williams#define hi_major hi_dewey[0]
540b35481d4SNate Williams#define hi_minor hi_dewey[1]
541b35481d4SNate Williams	int		hi_next;
542b35481d4SNate Williams};
543b35481d4SNate Williams.Ed
544b35481d4SNate Williams.Bl -tag -width hi_ndewey
545b35481d4SNate Williams.It Fa hi_namex
546b35481d4SNate WilliamsIndex of the string identifying the library.
547b35481d4SNate Williams.It Fa hi_pathx
548b35481d4SNate WilliamsIndex of the string representing the full path name of the library.
549b35481d4SNate Williams.It Fa hi_dewey
550b35481d4SNate WilliamsThe version numbers of the shared library.
551b35481d4SNate Williams.It Fa hi_ndewey
552b35481d4SNate WilliamsThe number of valid entries in
553b35481d4SNate Williams.Fa hi_dewey.
554b35481d4SNate Williams.It Fa hi_next
555b35481d4SNate WilliamsNext bucket in case of hashing collisions.
556b35481d4SNate Williams.El
557b35481d4SNate Williams
558b35481d4SNate Williams.Sh CAVEATS
559b35481d4SNate WilliamsOnly the (GNU) C compiler currently supports the creation of shared libraries.
560b35481d4SNate WilliamsOther programming languages can not be used.
561b35481d4SNate Williams
562