Home | History | Annotate | Download | only in ld-elfvsb
      1 #ifdef PROTECTED_CHECK
      2 #include <features.h>
      3 #include <stdio.h>
      4 
      5 int
      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
     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
     77 visibility (void)
     78 {
     79   return 1;
     80 }
     81 
     82 static int
     83 main_visibility_check (void)
     84 {
     85   return ((int (*) (void)) visibility_funptr ()) != visibility;
     86 }
     87 
     88 int visibility_var = 1;
     89 
     90 static int
     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
    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
    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
    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
    140 main_called (void)
    141 {
    142   return 6;
    143 }
    144 
    145 /* This function overrides a function in the shared library.  */
    146 
    147 int
    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
    158 main_visibility_checkcom (void)
    159 {
    160   return visibility_com == 0;
    161 }
    162 
    163 int
    164 main_visibility_checkweak (void)
    165 {
    166   return 1;
    167 }
    168 #elif defined (HIDDEN_WEAK_TEST)
    169 int
    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
    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
    206 main_visibility_checkcom (void)
    207 {
    208   return visibility_def == 2;
    209 }
    210 
    211 int
    212 main_visibility_checkweak (void)
    213 {
    214   return visibility_func () == 2;
    215 }
    216 #else
    217 int
    218 main_visibility_checkcom (void)
    219 {
    220   return 1;
    221 }
    222 
    223 int
    224 main_visibility_checkweak (void)
    225 {
    226   return 1;
    227 }
    228 #endif
    229 
    230 int
    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