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 | foo_p |
11 | __attribute__ ((noinline)) |
12 | get_foo (void) |
13 | { |
14 | return foo; |
15 | } |
16 | |
17 | foo_p |
18 | __attribute__ ((noinline)) |
19 | get_foo_protected (void) |
20 | { |
21 | return foo_protected; |
22 | } |
23 | |
24 | int |
25 | main (void) |
26 | { |
27 | foo_p p; |
28 | |
29 | p = get_foo (); |
30 | if ((*p) () != -1) |
31 | abort (); |
32 | |
33 | p = get_foo_protected (); |
34 | if ((*p) () != 0) |
35 | abort (); |
36 | |
37 | return 0; |
38 | } |
39 | |