summaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-vsb/main.c
blob: b0359c0d815f6fb3aa9c199e444ac35e637c1ca2 (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
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
#ifdef PROTECTED_CHECK
#include <features.h>
#include <stdio.h>

int
main (void)
{
#if defined (__GLIBC__) && (__GLIBC__ > 2 \
			    || (__GLIBC__ == 2 \
				&&  __GLIBC_MINOR__ >= 2))
  puts ("yes");
#else
  puts ("no");
#endif
  return 0;
}
#else
/* This is the main program for the shared library test.  */

#include <stdio.h>

int mainvar = 1;
int overriddenvar = 2;
extern int shlibvar1;

extern int shlib_mainvar ();
extern int shlib_overriddenvar ();
extern int shlib_shlibvar1 ();
extern int shlib_shlibvar2 ();
extern int shlib_shlibcall ();
extern int shlib_maincall ();
extern int shlib_checkfunptr1 ();
extern int shlib_checkfunptr2 ();
extern int (*shlib_getfunptr1 ()) ();
extern int (*shlib_getfunptr2 ()) ();
extern int shlib_check ();
extern int shlib_shlibcall2 ();
extern int visibility_check ();
extern int visibility_checkfunptr ();
extern void *visibility_funptr ();
extern int visibility_checkvar ();
extern int visibility_checkvarptr ();
extern int visibility_varval ();
extern void *visibility_varptr ();
extern int shlib_visibility_checkcom ();
extern int shlib_visibility_checkweak ();

int shlib_visibility_com = 1;

int shlib_visibility_var_weak = 1;

int
shlib_visibility_func_weak ()
{
  return 1;
}

#ifdef HIDDEN_WEAK_TEST
#define WEAK_TEST
#endif

#ifdef PROTECTED_WEAK_TEST
#define WEAK_TEST
#endif

#ifdef PROTECTED_UNDEF_TEST
#define PROTECTED_TEST
#endif

#ifndef WEAK_TEST
extern int visibility ();
extern int visibility_var;
#endif

#if !defined (HIDDEN_TEST) && defined (PROTECTED_TEST)
int
visibility (void)
{
  return 1;
}

static int
main_visibility_check (void)
{
  return ((int (*) (void)) visibility_funptr ()) != visibility;
}

int visibility_var = 1;

static int
main_visibility_checkvar (void)
{
  return visibility_varval () != visibility_var
	 && visibility_varptr () != &visibility_var;
}

#ifndef PROTECTED_UNDEF_TEST
int shared_data = 1;
__asm__ (".protected shared_data");

int
shared_func (void)
{
  return 1;
}

__asm__ (".protected shared_func");

extern int * shared_data_p ();
typedef int (*func) ();
extern func shared_func_p ();
#endif
#else
static int
main_visibility_check (void)
{
#ifdef WEAK_TEST
  return visibility_funptr () == NULL;
#else
  return ((int (*) (void)) visibility_funptr ()) == visibility;
#endif
}

static int
main_visibility_checkvar (void)
{
#ifdef WEAK_TEST
  return visibility_varval () == 0
	 && visibility_varptr () == NULL;
#else
  return visibility_varval () == visibility_var
	 && visibility_varptr () == &visibility_var;
#endif
}
#endif

/* This function is called by the shared library.  */

int
main_called (void)
{
  return 6;
}

/* This function overrides a function in the shared library.  */

int
shlib_overriddencall2 (void)
{
  return 8;
}

#ifdef HIDDEN_NORMAL_TEST
int visibility_com;
__asm__ (".hidden visibility_com");

int
main_visibility_checkcom (void)
{
  return visibility_com == 0;
}

int
main_visibility_checkweak (void)
{
  return 1;
}
#elif defined (HIDDEN_WEAK_TEST)
int
main_visibility_checkcom (void)
{
  return 1;
}

#pragma weak visibility_undef_var_weak
extern int visibility_undef_var_weak;
__asm__ (".hidden visibility_undef_var_weak");

#pragma weak visibility_undef_func_weak
extern int visibility_undef_func_weak ();
__asm__ (".hidden visibility_undef_func_weak");

#pragma weak visibility_var_weak
extern int visibility_var_weak;
__asm__ (".hidden visibility_var_weak");

#pragma weak visibility_func_weak
extern int visibility_func_weak ();
__asm__ (".hidden visibility_func_weak");

int
main_visibility_checkweak ()
{
  return &visibility_undef_var_weak == NULL
	 && &visibility_undef_func_weak == NULL
	 && &visibility_func_weak == NULL
	 && &visibility_var_weak == NULL;
}
#elif defined (HIDDEN_UNDEF_TEST)
extern int visibility_def;
__asm__ (".hidden visibility_def");
extern int visibility_func ();
__asm__ (".hidden visibility_func");

int
main_visibility_checkcom (void)
{
  return visibility_def == 2;
}

int
main_visibility_checkweak (void)
{
  return visibility_func () == 2;
}
#else
int
main_visibility_checkcom (void)
{
  return 1;
}

int
main_visibility_checkweak (void)
{
  return 1;
}
#endif

int
main (void)
{
  int (*p) ();
  int ret = 0;

  printf ("mainvar == %d\n", mainvar);
  printf ("overriddenvar == %d\n", overriddenvar);
  printf ("shlibvar1 == %d\n", shlibvar1);
  printf ("shlib_mainvar () == %d\n", shlib_mainvar ());
#ifndef XCOFF_TEST
  printf ("shlib_overriddenvar () == %d\n", shlib_overriddenvar ());
#endif
  printf ("shlib_shlibvar1 () == %d\n", shlib_shlibvar1 ());
  printf ("shlib_shlibvar2 () == %d\n", shlib_shlibvar2 ());
  printf ("shlib_shlibcall () == %d\n", shlib_shlibcall ());
#ifndef XCOFF_TEST
  printf ("shlib_shlibcall2 () == %d\n", shlib_shlibcall2 ());
#endif
  printf ("shlib_maincall () == %d\n", shlib_maincall ());
  printf ("main_called () == %d\n", main_called ());
  printf ("shlib_checkfunptr1 (shlib_shlibvar1) == %d\n",
	  shlib_checkfunptr1 (shlib_shlibvar1));
  printf ("shlib_checkfunptr2 (main_called) == %d\n",
	  shlib_checkfunptr2 (main_called));
  p = shlib_getfunptr1 ();
  printf ("shlib_getfunptr1 () ");
  if (p == shlib_shlibvar1)
    printf ("==");
  else
    printf ("!=");
  printf (" shlib_shlibvar1\n");
  p = shlib_getfunptr2 ();
  printf ("shlib_getfunptr2 () ");
  if (p == main_called)
    printf ("==");
  else
    printf ("!=");
  printf (" main_called\n");
  printf ("shlib_check () == %d\n", shlib_check ());
  printf ("visibility_check () == %d\n", visibility_check ());
  printf ("visibility_checkfunptr () == %d\n",
	  visibility_checkfunptr ());
  printf ("main_visibility_check () == %d\n", main_visibility_check ());
  printf ("visibility_checkvar () == %d\n", visibility_checkvar ());
  printf ("visibility_checkvarptr () == %d\n",
	  visibility_checkvarptr ());
  printf ("main_visibility_checkvar () == %d\n",
	  main_visibility_checkvar ());
  printf ("main_visibility_checkcom () == %d\n",
	  main_visibility_checkcom ());
  printf ("shlib_visibility_checkcom () == %d\n",
	  shlib_visibility_checkcom ());
  printf ("main_visibility_checkweak () == %d\n",
	  main_visibility_checkweak ());
  printf ("shlib_visibility_checkweak () == %d\n",
	  shlib_visibility_checkweak ());

#if !defined (PROTECTED_UNDEF_TEST) && defined (PROTECTED_TEST)
  if (&shared_data != shared_data_p ())
    ret = 1;
  p = shared_func_p ();
  if (shared_func != p)
    ret = 1;
  if (shared_data != *shared_data_p ())
    ret = 1;
  if (shared_func () != (*p) () )
    ret = 1;
#endif

  return ret;
}
#endif