From 3c30afc8625c680257b91638c3d9bee01e1fe778 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 22 Jun 2009 15:07:40 -0700 Subject: Add more IFUNC tests. Mostly tests around not-exported IFUNC functions, IFUNC in statically linked binaries and PIEs, etc. --- elf/ifuncmain7.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 elf/ifuncmain7.c (limited to 'elf/ifuncmain7.c') diff --git a/elf/ifuncmain7.c b/elf/ifuncmain7.c new file mode 100644 index 0000000000..8832c7fa1c --- /dev/null +++ b/elf/ifuncmain7.c @@ -0,0 +1,70 @@ +/* Test local STT_GNU_IFUNC symbols: + + 1. Direct function call. + 2. Function pointer. + */ + +#include + +extern int foo (void); + +static int +one (void) +{ + return -30; +} + +static void * foo_ifunc (void) __asm__ ("foo"); +__asm__(".type foo, %gnu_indirect_function"); + +static void * +__attribute__ ((used)) +foo_ifunc (void) +{ + return one; +} + +typedef int (*foo_p) (void); + +foo_p foo_ptr = foo; + +foo_p +__attribute__ ((noinline)) +get_foo_p (void) +{ + return foo_ptr; +} + +foo_p +__attribute__ ((noinline)) +get_foo (void) +{ + return foo; +} + +int +main (void) +{ + foo_p p; + + p = get_foo (); + if (p != foo) + abort (); + if ((*p) () != -30) + abort (); + + p = get_foo_p (); + if (p != foo) + abort (); + if ((*p) () != -30) + abort (); + + if (foo_ptr != foo) + abort (); + if ((*foo_ptr) () != -30) + abort (); + if (foo () != -30) + abort (); + + return 0; +} -- cgit 1.4.1