dlfcn.h revision 6:9049f50e2cc0
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 *
26 *	Copyright (c) 1989 AT&T
27 *	  All Rights Reserved
28 *
29 */
30
31#ifndef _DLFCN_H
32#define	_DLFCN_H
33
34#pragma ident	"%Z%%M%	%I%	%E% SMI"	/* SVr4.0 1.2	*/
35
36#include <sys/feature_tests.h>
37#include <sys/types.h>
38#include <sys/auxv.h>
39
40#ifdef	__cplusplus
41extern "C" {
42#endif
43
44/*
45 * Information structures for various dlinfo() requests.
46 */
47#if !defined(_XOPEN_SOURCE) || defined(__EXTENSIONS__)
48#ifdef __STDC__
49typedef struct	dl_info {
50	const char	*dli_fname;	/* file containing address range */
51	void		*dli_fbase;	/* base address of file image */
52	const char	*dli_sname;	/* symbol name */
53	void		*dli_saddr;	/* symbol address */
54} Dl_info;
55#else
56typedef struct	dl_info {
57	char		*dli_fname;
58	void		*dli_fbase;
59	char		*dli_sname;
60	void		*dli_saddr;
61} Dl_info;
62#endif /* __STDC__ */
63
64typedef struct	dl_serpath {
65	char		*dls_name;	/* library search path name */
66	uint_t		dls_flags;	/* path information */
67} Dl_serpath;
68
69typedef struct	dl_serinfo {
70	size_t		dls_size;	/* total buffer size */
71	uint_t		dls_cnt;	/* number of path entries */
72	Dl_serpath	dls_serpath[1];	/* there may be more than one */
73} Dl_serinfo;
74
75typedef struct {
76	uint_t	    dlui_version;	/* version # */
77	uint_t	    dlui_flags;		/* flags */
78	char	    *dlui_objname;	/* path to object */
79	void	    *dlui_unwindstart;	/* star of unwind hdr */
80	void	    *dlui_unwindend;	/* end of unwind hdr */
81	void	    *dlui_segstart;	/* start of segment described */
82					/*  by unwind block */
83	void	    *dlui_segend;	/* end of segment described */
84					/*  by unwind block */
85} Dl_amd64_unwindinfo;
86
87typedef struct	dl_argsinfo {
88	long		dla_argc;	/* process argument count */
89	char		**dla_argv;	/* process arguments */
90	char		**dla_envp;	/* process environment variables */
91	auxv_t		*dla_auxv;	/* process auxv vectors */
92} Dl_argsinfo;
93#endif /* !defined(_XOPEN_SOURCE) || defined(__EXTENSIONS__) */
94
95
96typedef ulong_t		Lmid_t;
97
98/*
99 * Declarations used for dynamic linking support routines.
100 */
101#ifdef __STDC__
102extern void	*dlopen(const char *, int);
103extern void   	*dlsym(void *_RESTRICT_KYWD, const char *_RESTRICT_KYWD);
104extern int	dlclose(void *);
105extern char	*dlerror(void);
106#if !defined(_XOPEN_SOURCE) || defined(__EXTENSIONS__)
107extern void	*dlmopen(Lmid_t, const char *, int);
108extern int	dladdr(void *, Dl_info *);
109extern int	dladdr1(void *, Dl_info *, void **, int);
110extern int	dldump(const char *, const char *, int);
111extern int	dlinfo(void *, int, void *);
112extern Dl_amd64_unwindinfo  *dlamd64getunwind(void *, Dl_amd64_unwindinfo *);
113#endif /* !defined(_XOPEN_SOURCE) || defined(__EXTENSIONS__) */
114#else
115extern void	*dlopen();
116extern void	*dlsym();
117extern int	dlclose();
118extern char	*dlerror();
119#if !defined(_XOPEN_SOURCE) || defined(__EXTENSIONS__)
120extern void 	*dlmopen();
121extern int	dladdr();
122extern int	dladdr1();
123extern int	dldump();
124extern int	dlinfo();
125extern Dl_amd64_unwindinfo  *dlamd64getunwind();
126#endif /* !defined(_XOPEN_SOURCE) || defined(__EXTENSIONS__) */
127#endif /* __STDC__ */
128
129#pragma unknown_control_flow(dlopen, dlsym, dlclose, dlerror)
130#if !defined(_XOPEN_SOURCE) || defined(__EXTENSIONS__)
131#pragma unknown_control_flow(dlmopen, dladdr, dladdr1, dldump, dlinfo)
132#endif /* !defined(_XOPEN_SOURCE) || defined(__EXTENSIONS__) */
133
134/*
135 * Valid values for handle argument to dlsym(3x).
136 */
137#define	RTLD_NEXT		(void *)-1	/* look in `next' dependency */
138#define	RTLD_DEFAULT		(void *)-2	/* look up symbol from scope */
139						/*	of current object */
140#define	RTLD_SELF		(void *)-3	/* look in `ourself' */
141#define	RTLD_PROBE		(void *)-4	/* look up symbol from scope */
142						/*	of current object, */
143						/*	using currently */
144						/*	loaded objects only. */
145/*
146 * Valid values for mode argument to dlopen.
147 */
148#define	RTLD_LAZY		0x00001		/* deferred function binding */
149#define	RTLD_NOW		0x00002		/* immediate function binding */
150#define	RTLD_NOLOAD		0x00004		/* don't load object */
151
152#define	RTLD_GLOBAL		0x00100		/* export symbols to others */
153#define	RTLD_LOCAL		0x00000		/* symbols are only available */
154						/*	to group members */
155#define	RTLD_PARENT		0x00200		/* add parent (caller) to */
156						/*	a group dependencies */
157#define	RTLD_GROUP		0x00400		/* resolve symbols within */
158						/*	members of the group */
159#define	RTLD_WORLD		0x00800		/* resolve symbols within */
160						/*	global objects */
161#define	RTLD_NODELETE		0x01000		/* do not remove members */
162#define	RTLD_FIRST		0x02000		/* only first object is */
163						/*	available for dlsym */
164#define	RTLD_CONFGEN		0x10000		/* crle(1) config generation */
165						/*	internal use only */
166
167/*
168 * Valid values for flag argument to dldump.
169 */
170#define	RTLD_REL_RELATIVE	0x00001		/* apply relative relocs */
171#define	RTLD_REL_EXEC		0x00002		/* apply symbolic relocs that */
172						/*	bind to main */
173#define	RTLD_REL_DEPENDS	0x00004		/* apply symbolic relocs that */
174						/*	bind to dependencies */
175#define	RTLD_REL_PRELOAD	0x00008		/* apply symbolic relocs that */
176						/*	bind to preload objs */
177#define	RTLD_REL_SELF		0x00010		/* apply symbolic relocs that */
178						/*	bind to ourself */
179#define	RTLD_REL_WEAK		0x00020		/* apply symbolic weak relocs */
180						/*	even if unresolved */
181#define	RTLD_REL_ALL		0x00fff 	/* apply all relocs */
182
183#define	RTLD_MEMORY		0x01000		/* use memory sections */
184#define	RTLD_STRIP		0x02000		/* retain allocable sections */
185						/*	only */
186#define	RTLD_NOHEAP		0x04000		/* do no save any heap */
187#define	RTLD_CONFSET		0x10000		/* crle(1) config generation */
188						/*	internal use only */
189
190/*
191 * Valid values for dladdr1() flags.
192 */
193#define	RTLD_DL_SYMENT		1		/* return symbol table entry */
194#define	RTLD_DL_LINKMAP		2		/* return public link-map */
195#define	RTLD_DL_MASK		0xffff
196
197
198/*
199 * Arguments for dlinfo()
200 */
201#define	RTLD_DI_LMID		1		/* obtain link-map id */
202#define	RTLD_DI_LINKMAP		2		/* obtain link-map */
203#define	RTLD_DI_CONFIGADDR	3		/* obtain config addr */
204#define	RTLD_DI_SERINFO		4		/* obtain search path info or */
205#define	RTLD_DI_SERINFOSIZE	5		/*	associated info size */
206#define	RTLD_DI_ORIGIN		6		/* obtain objects origin */
207#define	RTLD_DI_PROFILENAME	7		/* obtain profile object name */
208						/*	internal use only */
209#define	RTLD_DI_PROFILEOUT	8		/* obtain profile output name */
210						/*	internal use only */
211#define	RTLD_DI_GETSIGNAL	9		/* get termination signal */
212#define	RTLD_DI_SETSIGNAL	10		/* set termination signal */
213#define	RTLD_DI_ARGSINFO	11		/* get process arguments */
214						/*	environment and auxv */
215#define	RTLD_DI_MAX		11
216
217#if !defined(_XOPEN_SOURCE) || defined(__EXTENSIONS__)
218/*
219 * Version information for Dl_amd64_unwindinfo.dlui_version
220 */
221#define	DLUI_VERS_1		1
222#define	DLUI_VERS_CURRENT	DLUI_VERS_1
223
224/*
225 * Valid flags for Dl_amd64_unwindinfo.dlfi_flags
226 */
227#define	DLUI_FLG_NOUNWIND	0x0001		/* object has no Unwind info */
228#define	DLUI_FLG_NOOBJ		0x0002		/* no object was found */
229						/*  matching the pc provided */
230#endif /* !defined(_XOPEN_SOURCE) || defined(__EXTENSIONS__) */
231
232#ifdef	__cplusplus
233}
234#endif
235
236#endif	/* _DLFCN_H */
237