summaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-elfvsb/main.c
blob: a00b70feddb1505d08e5318e5052f101e0414700 (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
#ifdef PROTECTED_CHECK
#include <features.h>

int
main (argc, argv)
  int argc;
  char *argv[];
{
#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 ();

#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 ()
{
  return 1;
}

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

int visibility_var = 1;

static int
main_visibility_checkvar ()
{
  return visibility_varval () != visibility_var
	 && visibility_varptr () != &visibility_var;
}
#else
static int
main_visibility_check ()
{
#ifdef WEAK_TEST
  return visibility_funptr () == NULL;
#else
  return visibility_funptr () == visibility;
#endif
}

static int
main_visibility_checkvar ()
{
#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 ()
{
  return 6;
}

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

int
shlib_overriddencall2 ()
{
  return 8;
}

int
main ()
{
  int (*p) ();

  printf ("mainvar == %d\n", mainvar);
  printf ("overriddenvar == %d\n", overriddenvar);
  printf ("shlibvar1 == %d\n", shlibvar1);
#ifndef XCOFF_TEST
  printf ("shlib_mainvar () == %d\n", shlib_mainvar ());
  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 ());
  printf ("shlib_maincall () == %d\n", shlib_maincall ());
#endif
  printf ("main_called () == %d\n", main_called ());
  printf ("shlib_checkfunptr1 (shlib_shlibvar1) == %d\n",
	  shlib_checkfunptr1 (shlib_shlibvar1));
#ifndef XCOFF_TEST
  printf ("shlib_checkfunptr2 (main_called) == %d\n",
	  shlib_checkfunptr2 (main_called));
#endif
  p = shlib_getfunptr1 ();
  printf ("shlib_getfunptr1 () ");
  if (p == shlib_shlibvar1)
    printf ("==");
  else
    printf ("!=");
  printf (" shlib_shlibvar1\n");
#ifndef XCOFF_TEST
  p = shlib_getfunptr2 ();
  printf ("shlib_getfunptr2 () ");
  if (p == main_called)
    printf ("==");
  else
    printf ("!=");
  printf (" main_called\n");
#endif
  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 ());
  return 0;
}
#endif