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)15 get_foo (void)
16 {
17   return foo;
18 }
19 
20 foo_p
21 __attribute__ ((noinline))
get_foo_protected(void)22 get_foo_protected (void)
23 {
24   return foo_protected;
25 }
26 
27 int
main(void)28 main (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