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