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    printf ("shlib_mainvar () == %d\n", shlib_mainvar ());
     240  #ifndef XCOFF_TEST
     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  #endif
     249    printf ("shlib_maincall () == %d\n", shlib_maincall ());
     250    printf ("main_called () == %d\n", main_called ());
     251    printf ("shlib_checkfunptr1 (shlib_shlibvar1) == %d\n",
     252  	  shlib_checkfunptr1 (shlib_shlibvar1));
     253    printf ("shlib_checkfunptr2 (main_called) == %d\n",
     254  	  shlib_checkfunptr2 (main_called));
     255    p = shlib_getfunptr1 ();
     256    printf ("shlib_getfunptr1 () ");
     257    if (p == shlib_shlibvar1)
     258      printf ("==");
     259    else
     260      printf ("!=");
     261    printf (" shlib_shlibvar1\n");
     262    p = shlib_getfunptr2 ();
     263    printf ("shlib_getfunptr2 () ");
     264    if (p == main_called)
     265      printf ("==");
     266    else
     267      printf ("!=");
     268    printf (" main_called\n");
     269    printf ("shlib_check () == %d\n", shlib_check ());
     270    printf ("visibility_check () == %d\n", visibility_check ());
     271    printf ("visibility_checkfunptr () == %d\n",
     272  	  visibility_checkfunptr ());
     273    printf ("main_visibility_check () == %d\n", main_visibility_check ());
     274    printf ("visibility_checkvar () == %d\n", visibility_checkvar ());
     275    printf ("visibility_checkvarptr () == %d\n",
     276  	  visibility_checkvarptr ());
     277    printf ("main_visibility_checkvar () == %d\n",
     278  	  main_visibility_checkvar ());
     279    printf ("main_visibility_checkcom () == %d\n",
     280  	  main_visibility_checkcom ());
     281    printf ("shlib_visibility_checkcom () == %d\n",
     282  	  shlib_visibility_checkcom ());
     283    printf ("main_visibility_checkweak () == %d\n",
     284  	  main_visibility_checkweak ());
     285    printf ("shlib_visibility_checkweak () == %d\n",
     286  	  shlib_visibility_checkweak ());
     287  
     288  #if !defined (PROTECTED_UNDEF_TEST) && defined (PROTECTED_TEST)
     289    if (&shared_data != shared_data_p ())
     290      ret = 1;
     291    p = shared_func_p ();
     292    if (shared_func != p)
     293      ret = 1;
     294    if (shared_data != *shared_data_p ())
     295      ret = 1;
     296    if (shared_func () != (*p) () )
     297      ret = 1;
     298  #endif
     299  
     300    return ret;
     301  }
     302  #endif