1 #ifdef PROTECTED_CHECK
2 #include <features.h>
3 #include <stdio.h>
4
5 int
main(void)6 main (void)
7 {
8 #if defined (__GLIBC__) && (__GLIBC__ > 2 \
9 || (__GLIBC__ == 2 \
10 && __GLIBC_MINOR__ >= 2))
11 puts ("yes");
12 #else
13 puts ("no");
14 #endif
15 return 0;
16 }
17 #else
18 /* This is the main program for the shared library test. */
19
20 #include <stdio.h>
21
22 int mainvar = 1;
23 int overriddenvar = 2;
24 extern int shlibvar1;
25
26 extern int shlib_mainvar ();
27 extern int shlib_overriddenvar ();
28 extern int shlib_shlibvar1 ();
29 extern int shlib_shlibvar2 ();
30 extern int shlib_shlibcall ();
31 extern int shlib_maincall ();
32 extern int shlib_checkfunptr1 ();
33 extern int shlib_checkfunptr2 ();
34 extern int (*shlib_getfunptr1 ()) ();
35 extern int (*shlib_getfunptr2 ()) ();
36 extern int shlib_check ();
37 extern int shlib_shlibcall2 ();
38 extern int visibility_check ();
39 extern int visibility_checkfunptr ();
40 extern void *visibility_funptr ();
41 extern int visibility_checkvar ();
42 extern int visibility_checkvarptr ();
43 extern int visibility_varval ();
44 extern void *visibility_varptr ();
45 extern int shlib_visibility_checkcom ();
46 extern int shlib_visibility_checkweak ();
47
48 int shlib_visibility_com = 1;
49
50 int shlib_visibility_var_weak = 1;
51
52 int
shlib_visibility_func_weak()53 shlib_visibility_func_weak ()
54 {
55 return 1;
56 }
57
58 #ifdef HIDDEN_WEAK_TEST
59 #define WEAK_TEST
60 #endif
61
62 #ifdef PROTECTED_WEAK_TEST
63 #define WEAK_TEST
64 #endif
65
66 #ifdef PROTECTED_UNDEF_TEST
67 #define PROTECTED_TEST
68 #endif
69
70 #ifndef WEAK_TEST
71 extern int visibility ();
72 extern int visibility_var;
73 #endif
74
75 #if !defined (HIDDEN_TEST) && defined (PROTECTED_TEST)
76 int
visibility(void)77 visibility (void)
78 {
79 return 1;
80 }
81
82 static int
main_visibility_check(void)83 main_visibility_check (void)
84 {
85 return ((int (*) (void)) visibility_funptr ()) != visibility;
86 }
87
88 int visibility_var = 1;
89
90 static int
main_visibility_checkvar(void)91 main_visibility_checkvar (void)
92 {
93 return visibility_varval () != visibility_var
94 && visibility_varptr () != &visibility_var;
95 }
96
97 #ifndef PROTECTED_UNDEF_TEST
98 int shared_data = 1;
99 asm (".protected shared_data");
100
101 int
shared_func(void)102 shared_func (void)
103 {
104 return 1;
105 }
106
107 asm (".protected shared_func");
108
109 extern int * shared_data_p ();
110 typedef int (*func) ();
111 extern func shared_func_p ();
112 #endif
113 #else
114 static int
main_visibility_check(void)115 main_visibility_check (void)
116 {
117 #ifdef WEAK_TEST
118 return visibility_funptr () == NULL;
119 #else
120 return ((int (*) (void)) visibility_funptr ()) == visibility;
121 #endif
122 }
123
124 static int
main_visibility_checkvar(void)125 main_visibility_checkvar (void)
126 {
127 #ifdef WEAK_TEST
128 return visibility_varval () == 0
129 && visibility_varptr () == NULL;
130 #else
131 return visibility_varval () == visibility_var
132 && visibility_varptr () == &visibility_var;
133 #endif
134 }
135 #endif
136
137 /* This function is called by the shared library. */
138
139 int
main_called(void)140 main_called (void)
141 {
142 return 6;
143 }
144
145 /* This function overrides a function in the shared library. */
146
147 int
shlib_overriddencall2(void)148 shlib_overriddencall2 (void)
149 {
150 return 8;
151 }
152
153 #ifdef HIDDEN_NORMAL_TEST
154 int visibility_com;
155 asm (".hidden visibility_com");
156
157 int
main_visibility_checkcom(void)158 main_visibility_checkcom (void)
159 {
160 return visibility_com == 0;
161 }
162
163 int
main_visibility_checkweak(void)164 main_visibility_checkweak (void)
165 {
166 return 1;
167 }
168 #elif defined (HIDDEN_WEAK_TEST)
169 int
main_visibility_checkcom(void)170 main_visibility_checkcom (void)
171 {
172 return 1;
173 }
174
175 #pragma weak visibility_undef_var_weak
176 extern int visibility_undef_var_weak;
177 asm (".hidden visibility_undef_var_weak");
178
179 #pragma weak visibility_undef_func_weak
180 extern int visibility_undef_func_weak ();
181 asm (".hidden visibility_undef_func_weak");
182
183 #pragma weak visibility_var_weak
184 extern int visibility_var_weak;
185 asm (".hidden visibility_var_weak");
186
187 #pragma weak visibility_func_weak
188 extern int visibility_func_weak ();
189 asm (".hidden visibility_func_weak");
190
191 int
main_visibility_checkweak()192 main_visibility_checkweak ()
193 {
194 return &visibility_undef_var_weak == NULL
195 && &visibility_undef_func_weak == NULL
196 && &visibility_func_weak == NULL
197 && &visibility_var_weak == NULL;
198 }
199 #elif defined (HIDDEN_UNDEF_TEST)
200 extern int visibility_def;
201 asm (".hidden visibility_def");
202 extern int visibility_func ();
203 asm (".hidden visibility_func");
204
205 int
main_visibility_checkcom(void)206 main_visibility_checkcom (void)
207 {
208 return visibility_def == 2;
209 }
210
211 int
main_visibility_checkweak(void)212 main_visibility_checkweak (void)
213 {
214 return visibility_func () == 2;
215 }
216 #else
217 int
main_visibility_checkcom(void)218 main_visibility_checkcom (void)
219 {
220 return 1;
221 }
222
223 int
main_visibility_checkweak(void)224 main_visibility_checkweak (void)
225 {
226 return 1;
227 }
228 #endif
229
230 int
main(void)231 main (void)
232 {
233 int (*p) ();
234 int ret = 0;
235
236 printf ("mainvar == %d\n", mainvar);
237 printf ("overriddenvar == %d\n", overriddenvar);
238 printf ("shlibvar1 == %d\n", shlibvar1);
239 #ifndef XCOFF_TEST
240 printf ("shlib_mainvar () == %d\n", shlib_mainvar ());
241 printf ("shlib_overriddenvar () == %d\n", shlib_overriddenvar ());
242 #endif
243 printf ("shlib_shlibvar1 () == %d\n", shlib_shlibvar1 ());
244 printf ("shlib_shlibvar2 () == %d\n", shlib_shlibvar2 ());
245 printf ("shlib_shlibcall () == %d\n", shlib_shlibcall ());
246 #ifndef XCOFF_TEST
247 printf ("shlib_shlibcall2 () == %d\n", shlib_shlibcall2 ());
248 printf ("shlib_maincall () == %d\n", shlib_maincall ());
249 #endif
250 printf ("main_called () == %d\n", main_called ());
251 printf ("shlib_checkfunptr1 (shlib_shlibvar1) == %d\n",
252 shlib_checkfunptr1 (shlib_shlibvar1));
253 #ifndef XCOFF_TEST
254 printf ("shlib_checkfunptr2 (main_called) == %d\n",
255 shlib_checkfunptr2 (main_called));
256 #endif
257 p = shlib_getfunptr1 ();
258 printf ("shlib_getfunptr1 () ");
259 if (p == shlib_shlibvar1)
260 printf ("==");
261 else
262 printf ("!=");
263 printf (" shlib_shlibvar1\n");
264 #ifndef XCOFF_TEST
265 p = shlib_getfunptr2 ();
266 printf ("shlib_getfunptr2 () ");
267 if (p == main_called)
268 printf ("==");
269 else
270 printf ("!=");
271 printf (" main_called\n");
272 #endif
273 printf ("shlib_check () == %d\n", shlib_check ());
274 printf ("visibility_check () == %d\n", visibility_check ());
275 printf ("visibility_checkfunptr () == %d\n",
276 visibility_checkfunptr ());
277 printf ("main_visibility_check () == %d\n", main_visibility_check ());
278 printf ("visibility_checkvar () == %d\n", visibility_checkvar ());
279 printf ("visibility_checkvarptr () == %d\n",
280 visibility_checkvarptr ());
281 printf ("main_visibility_checkvar () == %d\n",
282 main_visibility_checkvar ());
283 printf ("main_visibility_checkcom () == %d\n",
284 main_visibility_checkcom ());
285 printf ("shlib_visibility_checkcom () == %d\n",
286 shlib_visibility_checkcom ());
287 printf ("main_visibility_checkweak () == %d\n",
288 main_visibility_checkweak ());
289 printf ("shlib_visibility_checkweak () == %d\n",
290 shlib_visibility_checkweak ());
291
292 #if !defined (PROTECTED_UNDEF_TEST) && defined (PROTECTED_TEST)
293 if (&shared_data != shared_data_p ())
294 ret = 1;
295 p = shared_func_p ();
296 if (shared_func != p)
297 ret = 1;
298 if (shared_data != *shared_data_p ())
299 ret = 1;
300 if (shared_func () != (*p) () )
301 ret = 1;
302 #endif
303
304 return ret;
305 }
306 #endif
307