diff options
Diffstat (limited to 'tests/libs/ld_config_test_helper_lib3.cpp')
-rw-r--r-- | tests/libs/ld_config_test_helper_lib3.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/tests/libs/ld_config_test_helper_lib3.cpp b/tests/libs/ld_config_test_helper_lib3.cpp index 93d1cd81d..94e15704d 100644 --- a/tests/libs/ld_config_test_helper_lib3.cpp +++ b/tests/libs/ld_config_test_helper_lib3.cpp @@ -1,3 +1,23 @@ -int get_value_from_another_lib() { - return 54321; +#include <dlfcn.h> +#include <stdio.h> + +// Mark foo and bar weak so that Clang allows the run-time linker to decide which DSO's symbol to +// use. + +__attribute__((weak)) extern "C" void foo() { + printf("foo lib3\n"); + void (*next)(void) = reinterpret_cast<void (*)()>(dlsym(RTLD_NEXT, "foo")); + if (next != nullptr) next(); +} + +__attribute__((weak)) extern "C" void bar() { + printf("bar lib3\n"); + void (*next)(void) = reinterpret_cast<void (*)()>(dlsym(RTLD_NEXT, "bar")); + if (next != nullptr) next(); +} + +void lib3_call_funcs() { + printf("lib3_call_funcs\n"); + foo(); + bar(); } |