#ifdef PROTECTED_CHECK #include #include 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 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 () { return 1; } static int main_visibility_check () { return ((int (*) (void)) visibility_funptr ()) != visibility; } int visibility_var = 1; static int main_visibility_checkvar () { return visibility_varval () != visibility_var && visibility_varptr () != &visibility_var; } #ifndef PROTECTED_UNDEF_TEST int shared_data = 1; asm (".protected shared_data"); int shared_func () { 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 () { #ifdef WEAK_TEST return visibility_funptr () == NULL; #else return ((int (*) (void)) 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; } #ifdef HIDDEN_NORMAL_TEST int visibility_com; asm (".hidden visibility_com"); int main_visibility_checkcom () { return visibility_com == 0; } int main_visibility_checkweak () { return 1; } #elif defined (HIDDEN_WEAK_TEST) int main_visibility_checkcom () { 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 () { return &visibility_def != NULL; } int main_visibility_checkweak () { return &visibility_func != NULL; } #else int main_visibility_checkcom () { return 1; } int main_visibility_checkweak () { return 1; } #endif int main () { int (*p) (); int ret = 0; 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 ()); 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