xref: /titanic_51/usr/src/lib/libdll/common/features/dll (revision 5af4ae460e4b20d1119c788db199a9821b2d19b2)
1set	prototyped
2hdr	dl,dlfcn,dll,rld_interface,mach-o/dyld
3sys	ldr
4lib	dlopen -ldl
5lib	dllload,loadbind,shl_load -ldl
6tst	dll_DYNAMIC link{
7	#include <sys/types.h>
8	#include <link.h>
9	extern struct link_dynamic _DYNAMIC;
10	int
11	main()
12	{
13		return _DYNAMIC.ld_version;
14	}
15}end
16tst	run{
17	lib=
18	for d in  /shlib /usr/shlib /lib /usr/lib
19	do	if	test -d $d
20		then	for s in "*.*" "*[!a]*"
21			do	for b in libc
22				do	for i in $d/$b.$s
23					do	if	test -f $i
24						then	lib=$i
25						fi
26					done
27					case $lib in
28					?*)	break 3 ;;
29					esac
30				done
31			done
32		fi
33	done
34	case $lib in
35	*.[0-9]*.[0-9]*)
36		i=`echo $lib | sed 's,\([^0-9]*[0-9]*\).*,\1,'`
37		if	test -f $i
38		then	lib=$i
39		fi
40		;;
41	esac
42	# some run time linkers barf with /lib/xxx if
43	# /usr/lib/xxx is there
44	case $lib in
45	/usr*)	;;
46	*)	if	test -f /usr$lib
47		then	lib=/usr$lib
48		fi
49		;;
50	esac
51	case $lib in
52	"")	lib=/lib/libc.so.1 ;;
53	esac
54	case $lib in
55	/usr/lib/*)
56		case `package` in
57		sgi.mips3)
58			abi=/lib32
59			;;
60		sgi.mips4)
61			abi=/lib64
62			;;
63		*)	abi=
64			;;
65		esac
66		case $abi in
67		?*)	if	test -d $abi
68			then	lib=`echo $lib | sed 's,/usr/lib/,,'`
69				lib=$abi/$lib
70			fi
71			;;
72		esac
73		;;
74	esac
75	echo "#define _DLL_NEXT_PATH	\"$lib\""
76}end
77tst	- output{
78	#if _hdr_dlfcn && _lib_dlopen
79	#include <dlfcn.h>
80	#endif
81	#if _hdr_rld_interface
82	#include <rld_interface.h>
83	#endif
84	int
85	main()
86	{
87		int		i;
88	#if _hdr_rld_interface
89		void*		dll;
90		static char*	local[] = { "__elf_header", "_call_add_gp_range", "_etext" };
91	#endif
92		printf("\n");
93	#if _hdr_dlfcn && _lib_dlopen
94		printf("#include <dlfcn.h>\n");
95	#endif
96	#ifndef RTLD_LAZY
97		i = 0;
98		printf("\n");
99		printf("#define RTLD_LAZY	1\n");
100	#else
101		i = 1;
102	#endif
103	#ifndef RTLD_NOW
104		if (i)
105		{
106			i = 0;
107			printf("\n");
108		}
109		printf("#define RTLD_NOW	2\n");
110	#endif
111	#ifndef RTLD_GLOBAL
112		if (i)
113		{
114			i = 0;
115			printf("\n");
116		}
117		printf("#define RTLD_GLOBAL	0\n");
118	#endif
119	#ifndef RTLD_LOCAL
120		if (i)
121		{
122			i = 0;
123			printf("\n");
124		}
125		printf("#define RTLD_LOCAL	0\n");
126	#endif
127	#ifndef RTLD_PARENT
128		if (i)
129		{
130			i = 0;
131			printf("\n");
132		}
133		printf("#define RTLD_PARENT	0\n");
134	#endif
135	#if defined(_hdr_mach_o_dyld) && !defined(RTLD_NEXT)
136		if (i)
137		{
138			i = 0;
139			printf("\n");
140		}
141		printf("#define RTLD_NEXT	((void*)16)\n");
142	#endif
143	#if _hdr_rld_interface
144		if (!(dll = dlopen(0, RTLD_LAZY)))
145			i = -1;
146		else
147		{
148			for (i = 0; i < sizeof(local) / sizeof(local[0]); i++)
149				if (dlsym(dll, local[i]))
150					break;
151			if (i >= sizeof(local) / sizeof(local[0]))
152				i = -1;
153		}
154		if (i >= 0)
155		{
156			printf("\n");
157			printf("#define _DLL_RLD_SYM		%s\n", local[i]);
158			printf("#define _DLL_RLD_SYM_STR	\"%s\"\n", local[i]);
159			printf("#define _DLL_RLD_SYM_TYPE	void*\n");
160		}
161	#endif
162		printf("\n");
163		printf("#define DLL_INFO_PREVER	0x0001	/* pre-suffix style version */\n");
164		printf("#define DLL_INFO_DOTVER	0x0002	/* post-suffix style version */\n");
165		printf("\n");
166		printf("typedef struct Dllinfo_s\n");
167		printf("{\n");
168		printf("	char**	sibling;	/* sibling dirs on $PATH */\n");
169		printf("	char*	prefix;		/* library name prefix */\n");
170		printf("	char*	suffix;		/* library name suffix */\n");
171		printf("	char*	env;		/* library path env var */\n");
172		printf("	int	flags;		/* DLL_INFO_* flags */\n");
173		printf("#ifdef _DLLINFO_PRIVATE_\n");
174		printf("	_DLLINFO_PRIVATE_\n");
175		printf("#endif\n");
176		printf("} Dllinfo_t;\n");
177		printf("\n");
178		printf("typedef struct Dllent_s\n");
179		printf("{\n");
180		printf("	char*		path;\n");
181		printf("	char*		name;\n");
182		printf("#ifdef _DLLENT_PRIVATE_\n");
183		printf("	_DLLENT_PRIVATE_\n");
184		printf("#endif\n");
185		printf("} Dllent_t;\n");
186		printf("\n");
187		printf("typedef struct Dllscan_s\n");
188		printf("{\n");
189		printf("	void*		pad;\n");
190		printf("#ifdef _DLLSCAN_PRIVATE_\n");
191		printf("	_DLLSCAN_PRIVATE_\n");
192		printf("#endif\n");
193		printf("} Dllscan_t;\n");
194	#if !_hdr_dlfcn || !_lib_dlopen
195		printf("\n");
196		printf("extern void*		dlopen(const char*, int);\n");
197		printf("extern void*		dlsym(void*, const char*);\n");
198		printf("extern int		dlclose(void*);\n");
199		printf("extern char*		dlerror(void);\n");
200	#endif
201		printf("\n");
202		printf("#if _BLD_dll && defined(__EXPORT__)\n");
203		printf("#define extern          __EXPORT__\n");
204		printf("#endif\n");
205		printf("\n");
206		printf("extern Dllinfo_t*	dllinfo(void);\n");
207		printf("extern void*		dllplug(const char*, const char*, const char*, int, char*, size_t);\n");
208		printf("extern void*		dllfind(const char*, const char*, int, char*, size_t);\n");
209		printf("extern void*		dllnext(int);\n");
210		printf("extern void*		dlllook(void*, const char*);\n");
211	#if _hdr_rld_interface
212		if (i >= 0)
213		{
214			printf("\n");
215			printf("extern void*		_dll_next(int, _DLL_RLD_SYM_TYPE*);\n");
216			printf("#define dllnext(f)	_dll_next(f, &_DLL_RLD_SYM)\n");
217		}
218	#endif
219		printf("\n");
220		printf("extern Dllscan_t*	dllsopen(const char*, const char*, const char*);\n");
221		printf("extern Dllent_t*	dllsread(Dllscan_t*);\n");
222		printf("extern int		dllsclose(Dllscan_t*);\n");
223		printf("\n");
224		printf("#undef  extern\n");
225	#if _hdr_rld_interface
226		if (i >= 0)
227		{
228			printf("\n");
229			printf("extern _DLL_RLD_SYM_TYPE _DLL_RLD_SYM;\n");
230		}
231	#endif
232		printf("\n");
233		return 0;
234	}
235}end
236