From 3e7074781d3cc41eaa20a137185018c1d9608203 Mon Sep 17 00:00:00 2001 From: Sol Boucher Date: Wed, 23 Feb 2022 18:56:56 -0500 Subject: [PATCH] testsuite: Have libtestinger run main() from the non-shared copy of the executable This reenables selective relinking when preloaded, despite the libgotcha exit analysis optimization. It is useful for assessing the performance effects of timer signals *and* selective relinking on compatible applications without modifying them. Note that it causes more Gnulib tests to fail. --- testsuite/build | 2 +- testsuite/testinger.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/testsuite/build b/testsuite/build index a2ecdb6..cf760c0 100755 --- a/testsuite/build +++ b/testsuite/build @@ -41,7 +41,7 @@ cp external/libgotcha/libgotcha_repl.h "target/$buildtype" objcopy -Wsignal --globalize-symbol libgotcha_dlsym --globalize-symbol libgotcha_signal "target/$buildtype/deps/libgotcha-"*.rlib 2>/dev/null rm "target/$buildtype/deps/libinger.so" cd - -c99 $cflags -Wall -Wextra -Wpedantic -Werror "$@" -c -fpic -fno-optimize-sibling-calls -D_DEFAULT_SOURCE -D_XOPEN_SOURCE -Wno-missing-attributes -I"$OLDPWD/target/$buildtype" testinger.c +c99 $cflags -Wall -Wextra -Wpedantic -Werror "$@" -c -fpic -fno-optimize-sibling-calls -D_GNU_SOURCE -Wno-missing-attributes -I"$OLDPWD/target/$buildtype" testinger.c cd - cargo rustc $cargoflags --lib -- -Clink-arg="$OLDPWD/testinger.o" cd - diff --git a/testsuite/testinger.c b/testsuite/testinger.c index 75fa633..289a1bd 100644 --- a/testsuite/testinger.c +++ b/testsuite/testinger.c @@ -5,9 +5,9 @@ #include #include #include -#include #include #include +#include #include #include #include @@ -38,12 +38,18 @@ static int testinger(int argc, char **argv, char **envp) { } #pragma weak libtestinger_libc_start_main = __libc_start_main -int __libc_start_main(int (*main)(int, char **, char **), int argc, char**argv, int (*init)(int, char **, char **), void (*fini)(void), void (*rtld_fini)(void), void *stack_end) { +int __libc_start_main(int (*main)(int, char **, char **), int argc, char **argv, int (*init)(int, char **, char **), void (*fini)(void), void (*rtld_fini)(void), void *stack_end) { const char *skiplist = getenv("LIBGOTCHA_SKIP"); if(skiplist && strstr(skiplist, *argv)) return __libc_start_main(main, argc, argv, init, fini, rtld_fini, stack_end); - mainfunc = main; + struct link_map *lm = dlmopen(1, *argv, RTLD_LAZY); + dlclose(lm); + + const struct link_map *l = dlopen(NULL, RTLD_LAZY); + uintptr_t offset = (uintptr_t) main - l->l_addr; + mainfunc = (int (*)(int, char **, char **)) (lm->l_addr + offset); + return __libc_start_main(testinger, argc, argv, init, fini, rtld_fini, stack_end); }