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