1/* Test 3 STT_GNU_IFUNC symbols. */
2
3#include "ifunc-sel.h"
4
5int 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. */
11asm (".protected global");
12
13static int
14one (void)
15{
16 return 1;
17}
18
19static int
20minus_one (void)
21{
22 return -1;
23}
24
25static int
26zero (void)
27{
28 return 0;
29}
30
31void * foo1_ifunc (void) __asm__ ("foo1");
32__asm__(".type foo1, %gnu_indirect_function");
33
34void *
35inhibit_stack_protector
36foo1_ifunc (void)
37{
38 return ifunc_sel (f1: one, f2: minus_one, f3: zero);
39}
40
41void * foo2_ifunc (void) __asm__ ("foo2");
42__asm__(".type foo2, %gnu_indirect_function");
43
44void *
45inhibit_stack_protector
46foo2_ifunc (void)
47{
48 return ifunc_sel (f1: minus_one, f2: one, f3: zero);
49}
50
51void * foo3_ifunc (void) __asm__ ("foo3");
52__asm__(".type foo3, %gnu_indirect_function");
53
54void *
55inhibit_stack_protector
56foo3_ifunc (void)
57{
58 return ifunc_sel (f1: one, f2: zero, f3: minus_one);
59}
60

source code of glibc/elf/ifuncdep2.c