lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 1 | #include <dlfcn.h> |
| 2 | |
| 3 | extern int successful_rtld_next_test (void); |
| 4 | extern void *failing_rtld_next_use (void); |
| 5 | |
| 6 | int nextmod1_dummy_var; |
| 7 | |
| 8 | int |
| 9 | successful_rtld_next_test (void) |
| 10 | { |
| 11 | int (*fp) (void); |
| 12 | |
| 13 | /* Get the next function... */ |
| 14 | fp = (int (*) (void)) dlsym (RTLD_NEXT, __FUNCTION__); |
| 15 | |
| 16 | /* ...and simply call it. */ |
| 17 | return fp (); |
| 18 | } |
| 19 | |
| 20 | |
| 21 | void * |
| 22 | failing_rtld_next_use (void) |
| 23 | { |
| 24 | void *ret = dlsym (RTLD_NEXT, __FUNCTION__); |
| 25 | |
| 26 | /* Ensure we are not tail call optimized, because then RTLD_NEXT |
| 27 | might return this function. */ |
| 28 | ++nextmod1_dummy_var; |
| 29 | return ret; |
| 30 | } |