| lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 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 | } |