diff options
author | H.J. Lu <hongjiu.lu@intel.com> | 2009-06-22 15:07:40 -0700 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2009-06-22 15:07:40 -0700 |
commit | 3c30afc8625c680257b91638c3d9bee01e1fe778 (patch) | |
tree | 46b73bd4a4ca129ce8818c14c83657a9d3018f02 /elf/ifuncmain6pie.c | |
parent | ccab6d8f73a17346862b681250de6f73a6940144 (diff) | |
download | glibc-3c30afc8625c680257b91638c3d9bee01e1fe778.tar.gz |
Add more IFUNC tests.
Mostly tests around not-exported IFUNC functions, IFUNC in statically
linked binaries and PIEs, etc.
Diffstat (limited to 'elf/ifuncmain6pie.c')
-rw-r--r-- | elf/ifuncmain6pie.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/elf/ifuncmain6pie.c b/elf/ifuncmain6pie.c new file mode 100644 index 0000000000..7e757e335f --- /dev/null +++ b/elf/ifuncmain6pie.c @@ -0,0 +1,63 @@ +/* Test STT_GNU_IFUNC symbols in PIE: + + 1. Direct function call. + 2. Function pointer. + 3. Reference from a shared library. + */ + +#include <stdlib.h> + +typedef int (*foo_p) (void); +extern foo_p foo_ptr; + +static int +one (void) +{ + return -30; +} + +void * foo_ifunc (void) __asm__ ("foo"); +__asm__(".type foo, %gnu_indirect_function"); + +void * +foo_ifunc (void) +{ + return one; +} + +extern int foo (void); +extern foo_p get_foo (void); +extern foo_p get_foo_p (void); + +foo_p my_foo_ptr = 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 (my_foo_ptr != foo) + abort (); + if ((*foo_ptr) () != -30) + abort (); + if ((*my_foo_ptr) () != -30) + abort (); + if (foo () != -30) + abort (); + + return 0; +} |