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
|