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

source code of glibc/elf/ifuncmod5.c