1 /* Test STT_GNU_IFUNC symbols with dynamic function pointer only. */ 2 3 #include <stdlib.h> 4 5 extern int foo (void); 6 extern int foo_protected (void); 7 8 typedef int (*foo_p) (void); 9 10 extern foo_p __attribute__ ((noinline)) get_foo (void); 11 extern foo_p __attribute__ ((noinline)) get_foo_protected (void); 12 13 foo_p 14 __attribute__ ((noinline)) get_foo(void)15get_foo (void) 16 { 17 return foo; 18 } 19 20 foo_p 21 __attribute__ ((noinline)) get_foo_protected(void)22get_foo_protected (void) 23 { 24 return foo_protected; 25 } 26 27 int main(void)28main (void) 29 { 30 foo_p p; 31 32 p = get_foo (); 33 if ((*p) () != -1) 34 abort (); 35 36 p = get_foo_protected (); 37 if ((*p) () != 0) 38 abort (); 39 40 return 0; 41 } 42