1 | /* Test 3 STT_GNU_IFUNC symbols. */ |
---|---|
2 | |
3 | #include "ifunc-sel.h" |
4 | |
5 | int global = -1; |
6 | /* Can't use __attribute__((visibility("protected"))) until the GCC bug: |
7 | |
8 | https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65248 |
9 | |
10 | is fixed. */ |
11 | asm (".protected global"); |
12 | |
13 | static int |
14 | one (void) |
15 | { |
16 | return 1; |
17 | } |
18 | |
19 | static int |
20 | minus_one (void) |
21 | { |
22 | return -1; |
23 | } |
24 | |
25 | static int |
26 | zero (void) |
27 | { |
28 | return 0; |
29 | } |
30 | |
31 | void * foo1_ifunc (void) __asm__ ("foo1"); |
32 | __asm__(".type foo1, %gnu_indirect_function"); |
33 | |
34 | void * |
35 | inhibit_stack_protector |
36 | foo1_ifunc (void) |
37 | { |
38 | return ifunc_sel (f1: one, f2: minus_one, f3: zero); |
39 | } |
40 | |
41 | void * foo2_ifunc (void) __asm__ ("foo2"); |
42 | __asm__(".type foo2, %gnu_indirect_function"); |
43 | |
44 | void * |
45 | inhibit_stack_protector |
46 | foo2_ifunc (void) |
47 | { |
48 | return ifunc_sel (f1: minus_one, f2: one, f3: zero); |
49 | } |
50 | |
51 | void * foo3_ifunc (void) __asm__ ("foo3"); |
52 | __asm__(".type foo3, %gnu_indirect_function"); |
53 | |
54 | void * |
55 | inhibit_stack_protector |
56 | foo3_ifunc (void) |
57 | { |
58 | return ifunc_sel (f1: one, f2: zero, f3: minus_one); |
59 | } |
60 |